Sonoff Basic R3でセキュアなスマートホームを構築する
5/23/2020, 2:14:59 PM
我が家でもようやく手元のスマホでベッドサイドのランプを消せるようになりました。
ホモ・サピエンスになりたい
我が家のベッドサイドにはIKEAのKvart(3 heads)というフロアランプを置いているのだが、これが首ごとにスイッチがあってしかも1つ1つが暗いので常に3つつけるせいで、寝る前に手を伸ばして3つのスイッチを切るのがうっとうしくて仕方ない。うっとうしくて仕方ないと言いつつ5年間毎日やっていたので、実はうっとうしくないのかもしれない。
しかし先日Rebuild.fm (ep.246 を聞いていた)ら、手で電気を消すなんて原始人かと(ポッドキャスト越しに)言われたことと、Work from homeで少し時間と体力に余裕があるので、重い腰をあげてスマートホーム()に挑戦することにした。目標は、このフロアランプの3つのスイッチすべてをスマホでOn/Offできるようにすること。当然ながら簡単なのは、適当なスマートプラグを買って壁のアウトレットに刺して、ランプのコードをそのスマートプラグに刺すことだろう。でもなあ。
Arduinoで自作しようかな
ただランプの電源をOn/Offするだけ、ボイスコントロールも不要、IFTTTもAlexaも外出先からの操作も一切不要。むしろ、これらの機能は付いていて欲しくない。プラグとスマホが同じ空間にある前提で、スマホからプラグにコマンドを送る機能だけが欲しい。プラグからインターネットに出て行って欲しくない。代わりに何らかのAPIが欲しい。謎のうんちゃらCloudに登録とかしたくない。うんちゃらCloudから我が家の電気系統にアクセスなんてして欲しくない。
という条件からまず考えたのが、Arduinoを使ってBluetoothでコントロールできるプラグを自作すること。その手の電気工事関連の資格は一切持っていないし、小学生のときに電子工作が流行ってはんだ付けはできないこともない、くらいのスキルセットだが、まあYouTubeでどうにかなるのでは。
調べてみると、電源を入れたり切ったりするにはリレーという部品を使うらしい(その程度の知識もありませんでしたよ)。高ボルテージの電気を扱うのは危険だよねってことで、IoT Relayなる製品もあることを発見。
$30弱か…。これにArduino UnoとBluetoothモジュールをつけて、うーん随分かかるなあ。面白そうではあるけども、この4口もあるタップをただランプのOn/Offのためだけに買うのもバカバカしい。
普通のArduinoで使えるリレーモジュールなら$5くらいで買えるので、それの使い方を調べてみた。見つけたのがArduinoで家電を操作しようというタイトルのこの記事。何と電源タップのコードをちょん切って、電気が通る線をリレーにつないでいる。なるほど、これでリレーについているI/Oピンへ信号を送ることで電気を通したり通さなかったりできるということか。こりゃあ面白そう。
電源コードを切って出てくる3本のワイヤーがそれぞれ何で、どれがどれかをどうやって調べるのか、などなどを調べて机上の空論的な自信をつけたので、パーツをAmazonのカートに入れてみる。うーん、Arduino Unoとブレッドボードとワイヤーと、それに電源コードと交換用アウトレットなどを一通り揃えるとやっぱりそれなりの値段になるよね。あと、Arduino UnoとBluetoothモジュールを買って、それをベッドサイドに固定してランプのOn/Offのためだけに使うのってやっぱり無駄なんじゃないかなあ。
Sonoff Basic R3
Arduino経由じゃなくて、本体にHTTPサーバーか何か入っていてAPIで操作できるスマートプラグはないのか、検索してみた。Belkinの製品にAPIがあるらしいんだけども、やっぱり外部のサイトに登録とかすることになる。それはやりたくない。
もう少し探して、Sonoffに行き着いた。どうも主にEU向けに製品を作っているみたいだが、USで使っている人もいるみたい。OSSのファームウェアを焼けばHTTPで操作できるという情報があってドキュメントを見に行ったら、最新のR3ではDIYモードがあらかじめ入っていて、HTTPで操作できること、DIYモードにすると公式アプリからすら接続できなくなり、APIでしか操作できないらしいことを発見した。これはスマートプラグではないが、求めていたのはこれじゃないか?
Sonoff BasicはどうやらWifiチップとリレーがつながっているだけのボードで、Arduinoとリレーを使うときのような要領で電源コードの中間にこいつを挟むように配線すれば、あとはWifiで電気をOn/Offできるということらしい。GNDを配線する場所がないのもUS向けではないためなのか、ちょっと不安になるんだけども、YouTubeを見ても多分アメリカの人が使っているし、大丈夫だと信じる。こいつにすれば、これ1つ($10)と電源延長コード($5)だけ用意すればおしまいなので、早速Amazonで注文した。Sonoff Basic R3自体は1つ$5くらいだし、延長コードなんて$1くらいで買えるものだけども、送料を入れればこんなもんだろう。
Cut the wire
Sonoff Basic R3につなぐので、あえてアースのない2 prongの延長コードを買った。アースはアースでSonoff Basic R3の外でつないでしまえばいいんだけども、考えたくなかったので。さあぶった切るぞ。
ワイヤーストリッパーもないので、引き続きラジオペンチでガワをむく。
Sonoff Basic R3に接続
切った両端でガワをむいたら、Sonoff Basic R3のターミナルに接続する。ターミナルにはそれぞれNとLがあって、ニュートラルをNに、電線をLにつなぐ。2本の線のどっちがニュートラルかは、byte sizedのYouTube動画で教えてくれた。USでは、極性のあるプラグ(2つのプラグで大きさが異なる)では大きいプラグの方がニュートラル。さらにニュートラルの方には、コードの外側にギザが付けられている、とのこと。見てみると確かにコードにギザが付いている方が大きな方のプラグの側になっている。
Sonoffのホームページにも書いてあるし上の写真では外してあるカバーにも書いてある通り、両端ともターミナルの上の方がNで下がLになっている。コードのギザを確認して、ワイヤーを突っ込みネジを締める。
付属品のコードを押さえるカバーを付けて、化粧カバーをつければ完成。ニュートラルと電線を間違えないようになんども確認した。
ファームウェアを更新
まずはDIYモードの前に最新のファームウェアに更新する。Sonoff BasicはR3が出るまでは公式DIYモードはなくて、内部で使われているWifiチップ用のファームウェアを焼いて遊ぶのが一般的だったらしい。
R3でSonoffが公式DIYモードを用意したんだが、最初のバージョンでは本体の内部カバーも開けて中にあるピンにジャンパーをはめてDIYモードにする方式で、さらにDIYモードになったR3はあらかじめ設定されている名前のSSIDのWifiへ接続しようとするので、こちらでその名前のアクセスポイントを立てて、接続させて、それからいろいろ操作するという手順だったらしく、R3のDIYモードなんか使い物にならん的な投稿が多い。
Sonoffはその辺敏感に反応して、現在のDIYモードはジャンパーもいらないし、R3のハードウェアスイッチを長押しするだけでDIYモードに入って、あとはR3に直接アドホック接続して設定をすれば良くなっているので、簡単になった。ただそのバージョンのファームウェアが入っているかどうかわからないので、とりあえずはファームウェアの更新をするという話。
R3を電源に接続するとQuick Setupモードになるので、あらかじめダウンロードしておいたeWelinkアプリでデバイスを検出して、SSIDやパスワードを設定してR3を自宅の無線ルーターに接続する。ファームウェアの更新もアプリでできる。本稿執筆時点では3.5.0が入った。
Let’s DIYモード
ファームウェアを更新したらいよいよDIYモードである。まずはR3に付いているハードウェアボタンを長押しして、青いランプを点滅させる(5秒くらい)。規則正しい点滅と、短・短・長の点滅の2種類があるので規則正しい方にする。
このときR3はITEAD_xxxxという名前のSSID(xxxx部分はブツによって異なる)でアドホックWifiを作っているので、それに接続して(パスワードはSonoffの開発者向けページに書いてある)、ブラウザーで**http://10.10.7.1**にアクセスする。そこで自宅のWifiのSSIDとパスワードを設定できる(11acとかの5Ghzには対応していない)。設定したらR3は再起動し、うまくいけば自宅のWifiネットワークに接続する。自宅Wifiのルーターの管理画面に行けばIPアドレスはわかるだろう。
WiresharkでmDNSの中身をみる
あとはAPIドキュメントに沿って、curlでIPにむけてPOSTでも送ってやればいいんだろう…と思ったらそうでもなかった。IPとポート(デフォルトのポートもSonoffの開発者向けページに書いてある)が分かっても、R3のデバイスIDがわからないと、POSTするデータを作れない。R3はデバイスIDをmDNSでマルチキャストしていて、Windows用のクライアントアプリもあるのだが、mac OS用のアプリはない。仕方ないので、Wiresharkで通信をのぞき見た。必要なのは、eWeLink_nnnnnnnnのnnnnnnnの部分。
IPアドレス、ポート、デバイスIDの3つがわかれば、curlでHTTP POSTを送るだけで電源On/Offができる。
$ curl -X POST -d '{"deviceid":"100090380b","data":{"switch":"off"}}' http://192.168.mm.nn:8081/zeroconf/switch</a>
{"seq":2,"error":0}
毎晩curlするのもめんどいので、OnとOffのボタンがあるだけのAndroidとiOSのアプリを作った。
スマートでセキュアでプライベートなホーム
こうしてベッドサイドランプを手元のスマホでOn/Offできるようになった。ボイスコントロールとかもやろうと思えばAndroid/iOSそれぞれのアプリ内でできるだろうし、謎のなんちゃらCloudにデバイスやアカウントを登録しない、自宅LAN内で完結したプライベート スマート ホームになった…気がする。R3はhttpしか話さないのだが、自宅の無線ネットワークに入られない限りはまあ大丈夫かなと。
電源On/Offできればそれでよいタイプの家電製品を操作するならSonoff Basicはほんとに簡単だった。何かネタがあれば今後も使いたい。もっとも、Sonoff BasicはただWifiチップのESP8266とリレーを組み合わせただけなので、ESP8266の開発ボードを使えばいろいろ面白いことができるのかもしれない。