GoogleHomeと赤外線学習リモコン基板「ADRSIR」を使ってテレビや照明を操作する
この記事でやること
「【IoT】最近買ったもの」でも紹介したRaspberry Pi用赤外線学習リモコン基板「ADRSIR」が届きました!
GoogleHomeをトリガーとして赤外線を送信する仕組みを作りましたので紹介します!
この記事を書くに至った経緯
他のブログでも「ADRSIR」を使って赤外線送信する方法は紹介されていますが、私が使っているネットワーク環境ではグローバルIP(固定IP)の取得が出来なかったので、動的IPのままでも外部のネットワークから家の「ADRSIR」を操作できるようにしました。(「Beebotte」を使った方法)
いろいろと躓いた点も織り交ぜながら説明していこうと思います。
LAN環境内で赤外線を飛ばすまでの手順
①「IR-remocon01-commandbase.py」の動作確認
動作確認を兼ねて、「ADRSIR」を作っているビット・トレード・ワンさんのTwitterでも紹介されていた、以下のブログを参考に「IR-remocon01-commandbase.py」の修正と動かすところまでやります。丁寧に説明してくださっているので、こちらでの説明は割愛します。
「Raspberry Pi用赤外線学習リモコン基板「ADRSIR」を動かしてみる」
※私が入手した「IR-remocon01-commandbase.py」のバージョン(ファイル内に記載)は「2017/12/13 v1.0」となっていました。上記のブログと全く同じ修正で、動かすところまで進められました。
②「IR-remocon02-commandline.py」の動作確認
続いても以下のブログの通り「IR-remocon02-commandline.py」を動かすところまでやります。
ここまで進めるとコマンドライン上で赤外線を送信することができるようになります。
「ADRSIRのコマンドラインツール IR-remocon02-commandline.pyを使ってみる」
※私が入手した「IR-remocon02-commandline.py」のバージョン(ファイル内に記載)は「2017/12/13 v1.0」となっていました。上記のブログと全く同じ修正で、動かすところまで進められました。
③続いては以下のブログを参考に、躓いた点を織り交ぜながら説明します。
「Google HomeとRaspberry PiのNode-REDで赤外線リモコンのコントロールをする」
躓いた点1:Node-REDがプリンストールされていない
RaspbianにはNode-REDが標準インストールされているよ。っていう記事を沢山見かけたのですがなぜか私のRaspbianではインストールされていませんでしたので、以下の記事を参考にインストール。
「Raspverry Pi にNode-RED をインストールする」
Node-REDが起動できたら、「http://ラズパイのIPアドレス:1880/」でブラウザにNode-REDの編集画面が表示されます。
「Google HomeとRaspberry PiのNode-REDで赤外線リモコンのコントロールをする」を参考に「赤外線コード送信用スクリプト」や「Flow」を作成(コードを載せてくれてるのでNode-REDに”読み込み”)し、「デプロイ」まですると、LAN環境内でpostすることで赤外線を飛ばせるようになります。
postする際はchromeの拡張機能「Advanced REST client」を使うと簡単にできます。
WAN環境内で赤外線を飛ばすまでの手順
躓いた点2:WANへの公開
「Google HomeとRaspberry PiのNode-REDで赤外線リモコンのコントロールをする」を参考に進めていたのですが、我が家のネットワーク環境ではネット会社の制約でグローバルipの取得できなかったり、ポートフォワードできるルーターがなかったり。あまりコストもかけたくないし、といった理由でどうしよいうかと悩んでいました。
いろいろ調べていると「Beebotte」というサービスがあることを知りました。
①BeebotteとIFTTTの登録
まずは「IFTTTとBeebotteを使ってGoogleHomeからRaspberryPiを操作する」を参考に「IFTTTセットアップ」まで設定を進めます。
※一応最下部にも設定内容を載せています。
②赤外線信号送信用のスクリプトを作成
「Google AssistantとRaspberry Piで自宅の家電を操作する」と
「IFTTTとBeebotteを使ってGoogleHomeからRaspberryPiを操作する」を参考に「MQTTライブラリインストール」と「スクリプトの作成」を行います。
MQTTライブラリインストール(BeeBotteを監視するためのライブラリ)
1 |
sudo pip3 install paho-mqtt |
スクリプトの作成(smarthome.py)
※事前にサーバにアクセスするための証明書をダウンロードして「smarthome.py」と同じディレクトリに配置しておく。
https://beebotte.com/certs/mqtt.beebotte.com.pem
少し補足
・「_TOKEN」にはBeebotteで作成したトークンを設定してください
・「# 名詞の変換表」は日本語の揺れを置き換えて処理するためのものです
・「fname」に「room、device、action」とありますが、「room、action」はIFTTT側から固定値でpostされてくる文字列で「device」はIFTTT側から可変でpostされる文字列($に当たる文字)が設定されます
・「if fname == ○○.dat」IFTTTからpostされた文字によって、処理を分けています。この分岐を経て「IR-remocon02-commandline.py」に引数(○○.dat)を与えて実行させています。
・pythonのコーディング規約を知らない場合は、確認しておいた方がいいです。(インデントを揃えないと動かないので)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
import paho.mqtt.client as mqtt import json import subprocess import os _TOKEN = 'XXXXXXXXXX' #IFTTTに設定したものと同じChannel Tokenを設定 HOSTNAME = 'mqtt.beebotte.com' PORT = 8883 #SSLの場合は8883 TOPIC = 'MySmartHome/voice' #トピック名/リソース名 の形で設定 CACERT = "mqtt.beebotte.com.pem" # 名詞の変換表 noun_conv = { "照明": "light", "ライト": "light", "らいと": "light", "しょうめい": "light", "ショウメイ": "light", "証明": "light", "音量": "volume" } # 接続中の処理を記載→subscribeする def on_connect(client, userdata, flags, respons_code): print('status {0}'.format(respons_code)) client.subscribe(TOPIC) # メッセージ受信時の処理を記載 def on_message(client, userdata, msg): print(msg.topic + ' ' + str(msg.payload)) data = json.loads(msg.payload.decode("utf-8"))["data"][0] # Google Assistantの側でTextFiledの前後に半角スペースが入ることがあるのでstripして削除 data = {key:value.strip() for key, value in data.items()} if "room" in data.keys(): # 「証明を」と言ってしまった際に「を」が入ってTextFieldに入ってくることがあるので削除 if data["device"].endswith("を"): data["device"] = data["device"][:-1] # 日本語の表記ゆれに併せて、IFTTTのTextFieldをlightに修正 if not data["device"] in set(noun_conv.values()): try: data["device"] = noun_conv[data["device"]] except: print("unkown device") return fname = "%s_%s_%s.dat"%(data["room"], data["device"], data["action"]) if os.path.exists(fname): # 実在するパスの場合 if fname == "living_light_on.dat": subprocess.call('python IR-remocon02-commandline.py t `cat living_light_on.dat`', shell=True) if fname == "tv_volume_up.dat": subprocess.call('python IR-remocon02-commandline.py t `cat tv_volume_up.dat`', shell=True) if fname == "tv_volume_down.dat": subprocess.call('python IR-remocon02-commandline.py t `cat tv_volume_down.dat`', shell=True) if __name__ == '__main__': client = mqtt.Client() #トークンを使って認証 client.username_pw_set("token:%s"%_TOKEN) client.on_connect = on_connect client.on_message = on_message client.tls_set(CACERT) client.connect(HOSTNAME, port=PORT, keepalive=60) # 待ち受け状態にする client.loop_forever() |
③スクリプトの実行
作成した「smarthome.py」を実行します。
※正常に待機状態になれば、「status 0」が表示されます。
1 |
sudo python3 smarthome.py |
④GoogleHomeで赤外線を送信する
「Ok Google リビングの電気をつけて」と言うと、
「python IR-remocon02-commandline.py」が実行され「living_light_on.dat」に保存されている赤外線コードが「ADRSIR」から送信されます。
※IFTTT設定内容は以下の通り
「Ok Google テレビのボリュームを上げて」と言うと、
「python IR-remocon02-commandline.py」が実行され「tv_volume_up.dat」に保存されている赤外線コードが「ADRSIR」から送信されます。
※IFTTT設定内容は以下の通り
※「What do you want to say?」に「テレテレの $ を上げて」を設定している理由は、「テレビ」という言葉が既に登録済みキーワードのようで、ChromeCastに対する操作が優先されてしまうためです。(TV、テレビ君、テレビちゃん もダメ)
なので、GoogleHomeに「テレテレの音量を上げて」というとテレビの音量を上げるようにIFTTTを設定しているのですが、これはナンセンスです。。
そこでGoogleHomeアプリから以下のショートカットを作成します
・「テレビの音量を上げて」と言った際にGoogleアシスタントが行う操作を「テレテレの音量を上げて」にする
そうすることで、「テレビの音量を上げて」と言っても、ChromeCast側への操作ではなくIFTTT側のプログラムが優先されて動くようになります。(ざっと書いたので、時間ある時に別途詳しく書くかも。。)
ここまで、いろんな記事を紹介しつつ、ざーーーっと書いたので少しずつ精査しながらブログを更新していこうと思います。
概ね参考したブログを紹介する形となりましたが、最後まで読んで頂きありがとうございました^^
この投稿へのトラックバック
トラックバックはありません。
- トラックバック URL
この投稿へのコメント