Sonoff MICRO USBスマートアダプタをMQTT経由で操作できるように

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"}

Sonoff Micro USBスマートアダプタ

SONOFF Micro USB Smart Adaptor – remotely control USB DevicesItead社のサイトで; マニュアル)を送料込みで$7 USD弱で購入。Type AのUSBプラグとソケットの双方を持ち,USBで給電を受ける機器とUSB ACアダプタとの間に入って,給電をコントロールする。本体にトグルスイッチがあるのでそれで給電状態のトグルができるのと,スマホアプリで遠隔操作もできる。Sinilink Wifi USBリモートコントローラーと同じようなところを狙った製品と言える。

基本的特徴

  • ESP32やらESP8266は採用されてないのでTasmota等の代替ファームウェアをフラッシュすることはできない。
  • 充電専用でデータ線はサポートされてないため,QualcommのQuick Charge急速充電規格のようにデータ通信線を使ってネゴシエーションをした上で可能なときには高電圧での給電をするようなことはできない。ここがSinilink Wifi USBリモートコントローラーを利用した場合との決定的違い。ただし,Sonoff Microも5Vだが2.5Aまでには対応している。なお,中身を見るとデータ通信線もサポートしようとした形跡は見られるらしい。 “Sonoff Micro has a secret! – YouTube” 参照。

なお,スマホで専用アプリを使ってペアリングする際,用意されてるQRコードが必要。またアプリを使ってMicroを登録する際,Microがクイックペアリングモードになっている必要があるのだが,手早くそのモードにしないとアプリの方がタイム・アウトしてしまう。そのときは,筐体のボタンを5秒以上長押しで再度クイックペアリングモードにする。

IFTTTとの連携

How to Use IFTTT to Control eWeLink Devices?-eWeLink“…Sonofffのスマート機器を遠隔で操作するサービスやアプリの名がeWeLink。eWeLinkとIFTTTとの連携は大きなプラスポイントだったが,IFTTTの方が実質有料化したため,メリットが大きく損なわれてしまった。

LANモード=DIYモード?

eWeLinkのサーバーを介してアクセスするにはインターネット接続が必要。ホームオートメーションは,極力WAN接続に依存せずLAN内でローカルに行いたいという欲求は合理的。それを実現するためにeWeLink機器はLANモードを提供している。「DIYモード」という表現もあるようなので,おそらく同じ機能を指しているのだろうと思っているが確証はない。とりあえずLANモードは使わないのでこの辺りきちんと調べていない。

ただし, “EWeLink Introduction – ITEAD Wiki” に以下のような記述があるので,LANモードで使うものも,一旦はeWeLinkサーバでの登録作業が必要,ということなんだろうと思っている。

WiFi Pairing and Device Addition

eWeLink obtains device status and controls devices by sending commands through the cloud server. This means all devices must first connect to the WiFi router and connect to our Amazon AWS server. So every new device must be paired with user’s home WiFi and added to eWeLink account.

GitHub – AlexxIT/SonoffLAN: Control Sonoff Devices with eWeLink (original) firmware over LAN and/or Cloud from Home Assistant ファムウェアをフラッシュせずにHome Assistantに組み込む。Sonoff Microもサポートされている。 “SONOFF 5V USB Smart Adaptor” にも “LAN Control – manage USB devices in no Wi-Fi network condition” という記述がある。

Finally! Sonoffs work with Home Assistant without changing the firmware! | DrZzs” に以下の記述がある:

In 2019 they (= “the Sonoff folks”) included a local area network option for controlling their devices. They didn’t really communicate very well how it worked though so it wasn’t very accessible to most of us.

Sonoff Touch LAN Mode and MQTT – Schinckel.net

[eWeLink3.5.10]LAN feature updated! | Facebook” …FW3.5.10の話

SONOFF API For Developer” DIY mode = LAN mode?

Node-RED

当てにしていたIFTT連携に期待できないので,せっかくNode-REDをインターネット上で使えるようしたことだし,Node-REDでMQTTを介してMicroを操作できるようにした