2017年11月11日土曜日

Sonoff をファームウェアアップデート無しでコントロールする方法

SonOffは中国ITEAD Studioが発売している非常に安価なWifiリレーである。
大体600円で買えるといえばお得感がすごくあることがわかると思う。
主に照明のON/OFFに使っているが、他にも色々と使い方はあるだろう。

さてこのデバイスはESP8266を利用しており、Espuna、ESPEasyなどのカスタムファームウェアが存在してMQTTに対応させてホームコントロールデバイスとしてDIY愛好家に広く愛されている。しかしシリアル接続するための端子を半田付けしたりする必要があり、敷居はそれなりに高かった。

OTAに対応しているため、この方法を用いてファームウェアの改造をする方法も存在する。SonOTAなどがそれである。
しかしこれもBootloaderの変更ができなかったりと一長一短あるようだ。

自分は半田ごてを利用する方法はあまり好きではない。
OTAを検討したが、まだ問題があるため違う方法を探って来たのだが、海外のブログに面白い記事があったのでそちらを検討した。このブログの方法とは、eWelinkというアプリが行うプロトコルを擬似的に行い、サーバーを自分のサーバーに設定して自分のサーバーでコントロールするという方法だ。
この方法だと自分でプログラムが書けるため、様々なプラットフォームに対応可能である反面、eWelinkを利用することはできなくなる。eWelinkというアプリはそこそこ良くできているため使えなくなるのは惜しいが、いろんな会社から出ているデバイスをそれぞれのアプリで利用する方法は正直ユーザーに優しくない。
一つや二つならまだしも大量にあるIoTデバイスをそれぞれのアプリで操作するのはすごく時間がかかるし混乱する。どうせなら一つのアプリで全部動かしたい。できたらHomekitにも対応したい。ということでこの記事の内容に沿って作業しようと思って読み進めた。
しかしここで書かれているnode.js用のコードはそのままでは動かない。./wlan.js というファイルが読み込まれているが、これが公開されていない。他の人もコメントを見ると同様に指摘している。自分でそのコード部分を書くとなると時間もかかるので、コードの内容を理解して自分で一から作るかなと思ったのだが、よくコメントを読むと、最低限動くようにしたとgitで公開している人がいた。それがこちらだ。

https://github.com/mdopp/simple-sonoff-server

ざっと目を通して、さっそく家のraspberry piにクローンしてみた。

git clone https://github.com/mdopp/simple-sonoff-server


実行するにはsonoff.config.jsonを変更する必要がある。これは各環境に合わせるのだが、
routerと書かれている部分はSSIDやパスワード等のWifiの情報で、serverと書かれている部分は自分で設置したサーバー(raspberry pi等)である。

簡単に実行したらまずサーバーを起動しておく。

node.jsをインストールしていない人は

curl -sL https://deb.nodesource.com/setup_7.x | sudo -E bash -
sudo apt-get install -y nodejs

等としてインストールするといい。ここを参考にするといいだろう。

これが終わったら必要なモジュールをインストールする。

nodejsなんて使ったことないので適当にクローンしたディレクトリ内で

npm install

としてみたところ、勝手に色々インストールしてくれた。

次にサーバーの起動だが、起動は結構簡単。

node sonoff.server.js

で起動ができる。しかしこのままだとフォアグラウンドで実行されてしまうので、デーモン化する必要がある。

これはpm2というコマンドでできるようだ。

npm install pm2
としてインストールできる。

pm2 start sonoff.server.js
とするとバックグラウンドで実行される。ログを表示するにはpm2 log sonoff.server とすればよいため簡単である。

再起動時にも勝手に起動して欲しい場合は、
pm2 startup
と実行すれば勝手に起動してくれるようになる。

さてサーバーも起動したのでクライアントの登録に取り掛かる。

クライアントにはnmcliというコマンドを利用してwifiを探すようなので、これをインストールしておく。NetworkManagerになるのだが入っていない可能性があるためapt-getなどでインストールする。
NetworkManagerを利用するには/etc/network/interfacesでwifi関係をコメントアウトして、/etc/NetworkManager/NetworkManager.conf内のmanaged=falseをmanaged=trueに変更して再起動する。
再起動したら
pm2 list
と実行して先ほどのサーバーが起動しているかどうか確認しておくとよい。

準備が整ったので、
node sonoff.setupdevice.js
と実行する。
検索ループに入るので、SonOffのボタン長押しをして高速点滅状態にして待っておく。
1分程度で設定が完了し、以降インターネットに接続することなくこのデバイスはコントロールができるようになった。

コントロールの仕方だが、curlなどでアクセスすることで可能になる。
curl http://server:1081/devices
 とすると登録されているデバイスの一覧が表示される。
curl http://server:1081/devices/deviceID
(デバイス一覧取得時に表示される id: に書かれている数字) とするとそのデバイスの状況だけが表示される。
また、
curl http://server:1081/devices/deviceID/on
 とすると、リレーが切り替わり通電され、最後をoffにすると切電される。

という感じでさくっと動くようになった。

さてこれをどうするかというと、ここまでできれば工夫次第。

Domoticzを利用してバーチャルデバイスにスイッチを作成して、動かすことは可能なのことは試してある。
Homekitで動かすためにHomebridgeを利用したりすることも可能だろう。
Home-AssistantやOpenHABを利用することも可能だろう。

自分の家ではHomebridgeを利用してiPhoneのHOMEを利用していたが、リモコンの
操作などもしたくなってきたのでDomoticzで環境を構築しようかと思っている。