AlexaとRaspberryPiで電気付けて
今までsiriを使った音声操作をしていたのでHomePodを待っていた。2月になってようやく海外で発売されたが349ドル(執筆時の為替で約38,700円)とかなり高価なので諦めてEcho Dot(セールで4,980円)を買った。
Alexaで家電操作する方法は大きく2つで自前のスキル(アプリ)を作るかIFTTTを使うかになりますが今回はIFTTTを使う事にしました。
IFTTTは様々なサービスを連携させるサービスでスキルを作るよりは簡単だが「電気付けてをトリガー」と最後にトリガーと言う必要があります。
■siriの流れ
siri → homebridge → irMagician
■IFTTT経由(Alexa)の流れ
Alexa → IFTTT → Beebotte → 常駐させたスクリプト → irMagician
homebridgeの時は操作される家電の振りをするのでsiriからの情報が直接取得出来てシンプルな構造ですがAlexaにはそういうのはまだ開発されてないので複雑になります。
まずIFTTTにイベントの発火(トリガー)の指示をして指示内容をBeebotteに送ります。
BeebotteはMQTTを使ったIoT向けの軽量メッセージブローカーサービスで1日50000メッセージまでなら無料で使えます。
IFTTTの指示が来るとウチのraspberryPiに通知が届けてもらいます。今回はraspberryPiが非公開なのでMQTTを使いましたが公開してたらHTTP経由でもいいかもしれません。
通知の受け口はpaho-mqttというライブラリを使ってPythonで書き、それを常駐させます。
最終的には前回siri用に作ったスクリプトを実行させて家電を操作します。
それではレシピです。
まずはBeebotteに入会(Sighn up)します。
「Channels」の右上の「Create new」をクリックします。
Channel Nameに適当な名前を入れ
Channel Discriptionに適当な説明を入れ
Resource Nameに適当な名前を入れ
Resource Discriptionに適当な説明を入れ「Create Channel」を押します。
Channel NameとResource Nameは受け取る際に使います。
出来たChannelの名前をクリックすると「Channel Token」というのがあります。「Channel Name」「Resource Name」と併せて後で使うのでメモしておいてください。
次にIFTTTに入会(Sighn up)します。
ログインしたら右上のユーザー名をクリックして「NewApplet」を選びます。
「this」(トリガー)に「AmazonAlexa」の「Say a pecific phrase」を設定(初回はAmazonにサインインさせられる)
「What phrase?」に台詞を入れる。今回は「電気をつけて」と入力
「that」(アクション)に「Webhook」の「Make a web request」を設定
URLをhttps://api.beebotte.com/v1/data/write/<Channel Name>/<Resource Name>?token=<Channel Token>
MethodをPOST
ContentTypeをapplication/json
Bodyを{“data”:[{“action”:”ON”,”device”:”Light”}]}
としておく
そしてRaspberryPI。ウチはPython3のpip3が入って無かったのでインストールする。
# sudo apt install python3-pip
MQTTを受けるライブラリをインストール
# pip3 install paho-mqtt
前回のsiri用(homebridge)に作ったフォルダに設置していく事にする。
$ cd .homebridge
Beebotteの証明書を落としておく
$ wget https://beebotte.com/certs/mqtt.beebotte.com.pem
$ vi mqtt_beebotte.py
# -*- coding: utf-8 -*-
import paho.mqtt.client as mqtt
import json
import subprocess
import os
HOST = 'mqtt.beebotte.com'
PORT = 8883
CA_CERTS = '/home/hogehoge/.homebridge/mqtt.beebotte.com.pem'
_TOKEN = '<Channel Token>'
TOPIC = '<Channel Name>/<Resource Name>'
def on_connect(client, userdata, flags, respons_code):
print('status {0}'.format(respons_code))
def on_message(client, userdata, msg):
print(msg.topic + ' ' + str(msg.payload))
data = json.loads(msg.payload.decode("utf-8"))["data"][0]
print(msg.payload.decode("utf-8"))
if data["device"] == 'Light':
if data["action"] == 'ON':
subprocess.call('python /home/hogehoge/.homebridge/data/irm.py -p -f /home/hogehoge/.homebridge/data/DLC303V-ON.json', shell=True)
elif data["action"] == 'OFF':
subprocess.call('python /home/hogehoge/.homebridge/data/irm.py -p -f /home/hogehoge/.homebridge/data/DLC303V-OFF.json', shell=True)
if __name__ == '__main__':
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.username_pw_set('token:%s' %_TOKEN)
client.tls_set(CA_CERTS)
client.connect(HOST, PORT)
client.subscribe(TOPIC)
client.loop_forever()
※パスはサービス化を見越してフルパスにしてますので設置場所に合わせて変更して下さい。
DLC303V-ON.jsonやDLC303V-ON.jsonのファイルは以前Raspberry Piで先取りHomekitで作ったものを使ってます。もちろんirm.pyも引き続きnetbuffaloさんのものを使わしてもらってます。
python3にpaho-mqttを入れてpythonにpyserialを入れてる都合上python3(3.5)のスクリプトからpython(2.7)のスクリプトを呼ぶという不思議な形になってしまいましたがpythonに詳しくないのでスルーします。
実行して、実際にalexaに「アレクサ、電気付けてをトリガー」と言ってみる。
$ python3 mqtt_beebotte.py
(止め方分からないのでターミナルを終了しました。)
正しく動作したら常駐させます。
# vi /lib/systemd/system/alexa.service
[Unit]
Description=Alexa Service
After=multi-user.target
[Service]
Type=idle
ExecStart=/usr/bin/python3 /home/hogehoge/.homebridge/mqtt_beebotte.py
[Install]
WantedBy=multi-user.target
# chmod 644 /lib/systemd/system/alexa.service
# systemctl daemon-reload
# systemctl enable alexa.service
常駐されてるか再起動して確認する。
# reboot
# systemctl status alexa.service
これでiphoneからもalexaからも操作できるようになったが「~をトリガー」が面倒です。
alexaの定形アクション(siriだとシーン)にiftttも登録出来るようになることを祈ります。
参考サイト
Amazon Echoで「○○をつけて」と言って家電を操作する
Amazon EchoとRaspberry Piで部屋の照明を制御する #おうちハック – ちぎっては投げるブログ
IFTTT, Beebotte, Mosquitto, SSL/TLS を使って, なるべく安全に Google Home から Raspberry Pi や ESP8266 を操作する – Qiita
Tags: Alexa, Beebotte, IFTTT, Raspberry Pi