AWS IoT Core と Raspberry Pi を連携させて、Alexa を搭載した Amazon Echo 等を使って Raspberry Pi につないだ LED を制御します。ついでに、Tp-Link のスマートプラグ『Tapo P105』も操作させてみます。
目次
以前、ESP8266 を AWS IoT Core で制御する方法を複数紹介しました。
今回は、AWS IoT Python SDK を使って Raspberry Pi と AWS IoT への接続を試みます。
AWS IoT で設定を済ませる
↓の記事を参考に、
- AWS アカウントを作成する
- IoT Core で“モノ”を用意する
- IAM でユーザーを作成しポリシーを付与する
の作業を済ませておいてください。
Raspberry Pi のプログラム
GPIO 17 に LED を接続する
プログラムと書いておいていきなりハードウェアの話で申し訳ないですが、GPIO 17(ピン11) に LED を 1kΩ 程の抵抗と直列に接続します。
必要なライブラリをインストールする
Python で AWS IoT との接続をするために、次の Python ライブラリをインストールします。Python は 3系を使います。
pip3 install AWSIoTPythonSDK
また、今回は Raspberry Pi で GPIO を扱うのに便利な pigpio ライブラリをインストールします。
sudo apt install pigpio
pip3 install pigpio
pigpio をインストールしたら、pigpiod サービスを起動・有効にします。
sudo systemctl start pigpiod
sudo systemctl enable pigpiod
Amazon Root CA をダウンロード
Amazon Root CA を、Python プログラムと同じディレクトリにダウンロードします。
wget https://www.amazontrust.com/repository/AmazonRootCA1.pem
Python プログラム
以下が Python プログラムです。
# -*- coding: utf-8 -*-
import time
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient
import pigpio
import json
# AWS IoT Core config
aws_iam_key = "XXXXXXXXXXXXXXXXXXXX"
aws_iam_secret_key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
aws_endpoint = "xxxxxxxxxxxxxxxxxx.iot.us-west-2.amazonaws.com"
aws_region = "us-west-2"
aws_port = 443
aws_root_ca_path = "AmazonRootCA1.pem"
aws_topic_shadow = "$aws/things/RaspberryPiZero/shadow/update"
aws_topic_shadow_delta = "$aws/things/RaspberryPiZero/shadow/update/delta"
# Callback Function
def callback (_, userdata, message):
print( "Topic:{}, Payload:{}".format(message.topic, message.payload) )
obj = json.loads( message.payload )
state = obj["state"]
if "led" in state :
led = state["led"]
pig.write(17, led)
print( "LED : {}".format(led) )
report_led_state(led)
# Change Repoted Value
def report_led_state(led) :
obj = { "state" :
{ "reported" :
{ "led" : led }
}
}
client.publish(aws_topic_shadow, json.dumps(obj), 0)
# GPIO Initialization
pig = pigpio.pi()
pig.set_mode(17, pigpio.OUTPUT)
# Connect AWS IoT Core
client = AWSIoTMQTTClient("", useWebsocket=True)
client.configureIAMCredentials(aws_iam_key, aws_iam_secret_key)
client.configureCredentials(aws_root_ca_path)
client.configureEndpoint(aws_endpoint, aws_port)
client.connect()
client.subscribe(aws_topic_shadow_delta, 1, callback)
report_led_state(False)
try :
while True :
time.sleep(5)
except KeyboardInterrupt:
pig.stop()
コピペが済んだら、何箇所か修正を加える必要があります。
まずは、IAM でユーザーを作った際にメモっておいた『アクセスキー』と『シークレットアクセスキー』を記述します。
# AWS IoT Core config
aws_iam_key = "XXXXXXXXXXXXXXXXXXXX"
aws_iam_secret_key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
IoT Core でモノを作った際にメモっておいたエンドポイントを記述します。
リージョンも記述します。オレゴンの場合は us-west-2
です。
aws_endpoint = "xxxxxxxxxxxxxxxxxx.iot.us-west-2.amazonaws.com"
aws_region = "us-west-2"
IoT Core のモノの名前に合わせて、トピック名を変更します。『RaspberryPiZero』というデバイス名なら "$aws/things/RaspberryPiZero/shadow/..."
となります。
Topic Shadow の詳細についてはあとで説明します。
aws_topic_shadow = "$aws/things/RaspberryPiZero/shadow/update"
aws_topic_shadow_delta = "$aws/things/RaspberryPiZero/shadow/update/delta"
以上でプログラムの修正箇所は以上です。
一応、プログラムは GitHub にもあります。
IoT Core のテスト画面から Raspberry Pi の LED を操作する
以前の記事を参考に、IoT Core のテスト画面から Publish して LED を ON/OFF して動作確認をします。
Alexa Smart Home Skill を実装する
↓の記事を参考に、Alexa Smart Home Skill を実装します。IoT デバイス名だけが↓の記事と異なる(この記事では RaspberryPiZero
)ので注意してください。
一応、GitHub にもプログラムを置きます。
以上で、Alexa から Raspberry Pi に接続した LED を制御できるようになりました。
Tp-Link のスマートプラグ『Tapo P105』を Alexa で操作する
そして、以前 Tp-Link のスマートプラグ『Tapo P105』を Raspberry Pi から操作する方法を紹介しました。これと今回紹介した方法を組み合わせれば、『Tapo P105』を Amazon 以外のクラウドサービスを介さずに Alexa で操作できるようになります。
このように、Alexa で スマートプラグ『Tapo P105』を操作できるようになります。まぁ普通の人は Tapo スキルを Alexa にインストールして Tapo デバイスを操作すると思いますが……