Sonoff Micro USBスマートアダプタを買った。もともとは,IFTTTと連携させるつもりをしていたが,IFTTTの方が実質有料化したため,メリットが大きく損なわれてしまった。せっかくNode-REDをインターネット上で使えるようしたことだし,Node-REDでなんとかならないかと考えた。結果としては,MQTT経由で操作できるようになった。
Node-REDのライブラリで “Sonoff” で検索してみるといくつかヒットする。 が,Tasmotaをフラッシュしていることをベースにしているものは使えない。というか,MicroはESP32/ESP8266を採用していないので,それ用Tasmota等用ファームウェアはフラッシュできない。
さらに,node-red-contrib-sonoff-server (node) はベースになっているsimple-sonoff-server.がもう使えなくなっているということで使えない。
結局使えるのはnode-red-contrib-ewelink (node)のみ。node-red-contrib-ewelink – NodeRED nodes for eWeLink smart devicesがホームページ。skydiver/ewelink-api: eWeLink API for JavaScript(ドキュメント)をベースにしているらしい。
ドキュメントは決して親切とは言えないが,いくらかの試行錯誤で以下が実現できた。
- Microの状態(通電状態,非通電状態)が変わるたび,それをMQTTブローカ(具体的にはBeebotte)上の特定トピックの値としてパブリッシュ。
- MQTTブローカ上の特定トピックをコマンドとして捉え,それの値(”turn_on” と “turn_off”)がパブリッシュされるたび,それに応じてMicroの通電状態を変更する。
これにより,Microの操作がMQTTを介してできるようになる。以下はそのフローのNode-RED上での様。
ドキュメント中にこれに関する記述は一切なかったと思うが,フロー中にeWeLinkをアクセスするノードを複数同時には使用できない模様ー普通にやると。「そのようなリージョンが存在しない」とか「認証エラー」とかいうエラーメッセージが出るが,それを真に受けていると多分解決策に到達できない。
eWeLinkをアクセスするノードそれぞれには,予めスマホアプリeWeLinkで作成したアカウントの情報を与えなければならない。アカウントの情報とは,具体的にはユーザ名(メールアドレス),パスワード,使用するeWeLinkサーバの地域,の3種のデータの組。これをセットで扱い,名前も自動的に振られる。どうせ中身は同じなのだから,と全てのノードに同じセットを指定すると先のような問題が起こる。
解決策は,そのセットを,使いたいeWeLinkノードの数だけ用意すれば良い。中身は全く同じで構わないのだが,セットとしては別扱いになっていて,別の名前が振られていればいい。このように設定したeWeLinkノードを運用しているとき,おそらくeWeLinkサーバから見ると,同じアカウント情報を使用してアクセスしてくるクライアントが複数あるように見える状態なのだろう。
また, “Sonoff Micro has a secret! – YouTube” でも言ってたことでもあるが,Event Listnerノードの出力(下のリスト)を見るとチャネルが4本用意されていたようだ。そのうち実際の通電状態に対応しているのは最初のもの。 “0” 番だとされているのだが,このチャネルを操作して通電状態を変更するためのPower State出力ノードでは “1” と設定しなくてはならなかった。
{"action":"update","deviceid":"XXX...","apikey":"XXX...","userAgent":"device","d_seq":1957890180,"ts":0, "params":{ "switches":[{"switch":"on", "outlet":0}, {"switch":"off","outlet":1}, {"switch":"off","outlet":2}, {"switch":"off","outlet":3}]}, "from":"device","seq":"1957890180"}