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

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

関連記事

プロキシ設定が必要な学内LANに接続するときに役に立つスクリプト

プロキシ設定が必要な学内 or 社内LANに接続する際のプロキシ設定の切り替えをしやすくするスクリプトを用意します。

Atmel SAM D21 を使ってみる(1)

秋月で売っているAtmelのARMマイコンATSAMD21G18AをWindows環境で使いたいと思います。

Raspberry Pi をスマートリモコン化! Alexa で部屋の照明を操作する【Alexa×Raspberry Pi その2】

Raspberry Pi に赤外線LED・赤外線受光モジュールを付けて、Raspberry Pi を学習リモコン・スマートリモコン化します。そして、Raspberry Pi を AWS IoT 連携させて Alexa で部屋の照明を操作します。

Windows 10 で OpenSSH サーバーを使う

Windows 10 で OpenSSH サーバーを立ち上げて、外部から SSH ログインできるようにします。

Alexa で ESP8266 を操作する方法【Alexa×Arduino 検討】

Alexa を搭載した Amazon Echo 等を使って ESP8266(Arduino)を操作する方法を検討します。