0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

RaspberryPi+ADRSIRを用いた赤外線機器操作

Posted at

ADRSIRは赤外線リモコンを簡単に作るためのアイテムです。→商品ページ

今回はエアコンと照明のリモコンの赤外線を学習してGoogleHomeから操作できるようにする。

構成図

image.png

1. ADRSIRから家電操作

ADRSIRの構成は以下の通り。

adrsir_struc.jpg

なお、基板上の表記ではスイッチは1〜10であるが、内部的には0〜9に対応するため以降コマンド等でスイッチを指定する際には注意。

学習手順

  1. スイッチをlearnに切り替える。→ 学習モードになると青いランプがつく。
  2. 覚えさせたいボタン(ここでは1番)を押す。
  3. 受光部に向けて学習対象のリモコンのボタン(ここでは照明ON)を押す。→ ランプが一瞬だけ緑に点灯。
  4. スイッチをcontrolに切り替える。

テスト

先ほど覚えさせたボタン(1番)を押す。
対象の家電が操作できていれば成功。(電気ついたー)

※エアコンのリモコンは物によっては学習できないものもある。→参考
明るさ変更可能な照明もリモコンに記憶するから「点灯」ボタンは学習できない気がする。実際数十回試したが操作できなかった。→ここに関しては後述。
※一度不可でも何度かリトライし続けるとたまに学習・操作できる。エアコンに関しては8回くらい試行して動かせた。(リモコンの表示状態に依存すると思うのでOFFからつけた時、すでについてる時の信号をそれぞれとってみるといい。)

2. ラズパイの設定

販売元のサイトから必要なライブラリをPCに落としてくる。
unzipしてからscpでラズパイのホームディレクトリへ追加。

赤外線信号をdatファイルに保存

ADRSIRで読み込んだ赤外線信号を読み込む。ここではTurnOnLight.datファイルとして保存しておく。
基板上の1番は内部では0番に対応していることに注意。

$ python3 I2C0x52-IR/IR-remocon02-commandline.py r 0 > TurnOnLight.dat
$ cat TurnOnLight.dat
86004100130010001200310014000F0013001000120032001300310012001000120011001200320013000F001200320013000F0013003100130010001200100014000F001300310013000F001300310014000F00120011001200100013001000130010001200320013000F00130032001200310013000F001200330012001000120010001300100013001000120011001200310014000F001200320013000F001300100013004205

テスト

このファイルを利用してコマンドから家電を操作しに行く。

$ python3 I2C0x52-IR/IR-remocon02-commandline.py t `cat TurnOnLight.dat`

OK。電気ついた。

3. Beebotteの設定

MQTTブローカー

image.png

(1) 左サイドバーからChannelを選択し、Create New。チャンネル名と、リソース名を指定する。→トークンが発行される。
(2) 左サイドバーからAccountSettingを選択し、シークレットキーをコピーする。
(3) コンソールに戻り、シークレットキーを埋め、サブスクライブしたいチャンネルとリソースを指定し、Subscribeを押す。
(4) メッセージとかかれたコンソール上に以下が青字で表示される。

{ "channel": "xxxxx", "resource": "xxxxx", "data": { "userinfo": { "username": "", "userid": "uid-xxxxxxxxxxxx" }, "id": "xxxxxxxxxxxx", "event": "join" } }

image.png

テスト

curlコマンドからAPIをコールする。

$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":[{"device":"switchbot","action":"TurnOn"}]}' <APIのURL>

zshにエラーzsh: no matchesを返されたら次のコマンドをうってから実行するといける。
参考:https://shirusu-ni-tarazu.hatenablog.jp/entry/2013/01/18/034233

$ setopt nonomatch

4. IFTTTの設定

  • this→google assistantを指定して、トリガーとなる言葉/言語を設定。
  • that→webhooksを指定し、URLはbeebotteのURLを指定(下記参考)。形式はPOST、aplication/jsonを指定。中に送りたいJSONを書く。今回は以下。
//URL
https://api.beebotte.com/v1/data/publish/チャンネル名/トピック名?token=トークン

//メッセージ
{"data":[{"device":"Light","action":"TurnOn"}]}

テスト

googleアシスタントにIFTTTで登録した言葉を話してみる。→beebotteのコンソールのメッセージに設定したJSONが表示されることを確認。

5. Node-REDの設定

ラズパイにNode-REDをいれます。この辺りは他の方の記事を参考に・・(忘れました)。

$ node-redで起動。起動後はブラウザからhttps://raspberrypi.local:1880へアクセス。

たまに

このサイトは安全に接続できません
raspberrypi.local から無効な応答が送信されました。
ERR_SSL_PROTOCOL_ERROR

といわれる。原因と助け方は調査中。

構成

最終的にはこうしたい。
struc2.png

まだmqttブローカーを用意していないのでサブスクライブできない。とりあえず入力は「input」を選んで直接jsonを流し込むことでこのルートのテストまで行う。

各設定は以下の通り。

  • mqtt

mqtt.png

設定対象 内容
トピック Beebotteで設定したChannel/Resource(今回はgoogleHome/voice)
●接続タブ
サーバ mqtt.beebotte.com
ポート番号 8883
●セキュリティタブ
ユーザ名 Beebotteで発行したtoken(今回はtoken_AbcdeFGHijKLmno0)
パスワード 空欄
  • JSON

そのまま繋ぐだけ。

  • Switch

switch.png
設定で、「表示名」、「条件式」が書ける。
今回の判定対象となる'device'のメッセージの取得は、payload.data[0].deviceとする。('action'でも同様に設定)

  • Exec

exec.png

同じく表示名をつけておける。
実行するコマンドは先ほどの

python3 I2C0x52-IR/IR-remocon02-commandline.py t `cat TurnOnLight.dat`

また、引数にデフォルトでmsg.payloadが乗ってしまうようチェックが入ってるので必ず外す。動かないから。

テスト

適度にmsg.payloadノードをつなぎ、右サイドバーからデバッグ画面を開くと流れてくるメッセージたちを見ることができる。googleアシスタントに話しかけた時にここに期待したJSONメッセージが流れてきたら成功。
さらに全てがうまく繋がっていれば、ADRSIRから赤外線が放射され、期待した動作がおこるはず。(赤外線が何かに遮断されないように注意。)

6. 最後に (Optional)

この状態で「クーラーつけて」とかというとGoogleHomeから「デバイスが設定されておりません。云々・・・」といわれることがある。
(エアコンは100%これだがTVは時々言われるくらいの割合でよくわからない・・・)

この場合。スマートフォンのGoogleHomeアプリからショートカットを作成することで回避できる。

「ルーティン」→「ルーティンを管理」と移動して右下のプラスアイコンをタップすれば設定画面が出てくるので「クーラーつけて」と言ったら「〇〇(IFTTTで設定したどれかの音声コマンド)」を実行するという風に登録しておこう。

トラブルシューティング(赤外線が反応しない)

  • 発射時にADRSIRの光は点灯するのに、肝心の対象に赤外線が反応しない!というケース。

うちの電灯のリモコンはDAIKOというメーカー(?)のものなのですが、点灯ボタンの赤外線を読み込んでADRSIRから発射させても反応なし・・・。ただ全灯ボタンは反応するので、全灯の赤外線発射後に数秒間、暗くするの赤外線を連射するシェルを書いて任意の明るさを維持することにしています。点灯の信号はステートフルな何かでその時の明るさに依存していたりするのだろうか??

参考

SwitchBotを繋いだ記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?