茱萸note

電子工作の備忘録と旅行の記録

Alexa AWS IoT Raspberry Pi スマートプラグ 電子工作

Raspberry Pi と AWS IoT を連携させて Alexa で LED や スマートプラグを操作する【Alexa×Raspberry Pi その1】

投稿日:2021年1月6日 更新日:

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 デバイスを操作すると思いますが……

-電子工作
-, , , , ,


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

ESP8266 で Tp-Link のスマートプラグ『Tapo P105』を直接操作する

Tp-Link のスマートプラグ『Tapo P105』をアプリや IFTTT といった外部サービスを用いずに、ESP8266 から直接操作してみます。

ESP8266 で RSA PKCS#1 V1.5 暗号の復号

ESP8266 で RSA 暗号化の方式の一つである RSA PKCS#1 V1.5 、別名 RSAES-PKCS1-v1_5 の暗号を復号する方法です。

ESP8266 で AES-CBC PKCS#7 Padding による暗号化・復号

ESP8266 で AES アルゴリズム・CBC モード・PKCS7 パディング の暗号化・復号化をする方法を述べます。

LPC11U35を汎用ARMデバッガとして使う

秋月で売っているLPC11U35を汎用ARMデバッガとして使いたいと思います。

【Ubuntu】【上級者向け】Grubブートローダを削除する

「デュアルブートしてたけどUbuntuを削除することにした。」という人などに向けて、Grubブートローダ(Ubuntuのブートローダ)を削除する方法を説明します。