茱萸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

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

関連記事

Visual Studio 2019でC言語のお勉強を始める

Visual Studio 2019 で C言語 のお勉強をする人に向けて書きます。

TeXの多書体化

TeXを多書体化して、文書中で自由にフォントを変えられるようにします。

記事の先頭に目次を置く

Blogの記事の先頭に自動的に目次を生成するにはどうすれば良いか?

【上級者向け】Ubuntuをデュアルブートする《その1:既にWindowsが入っているSSD・HDDにUbuntuを入れる》

既にWindowsがインストールされているSSD・HDDに追加でUbuntuをインストールする方法です。上級者向け。

WSLでGUIアプリを起動させる

WSLでGUIアプリを動かすためにVcXsrvというX Window サーバーをインストールします。