SonoffをHomekit(homebridge)に対応させる。

Homekit用にHomebridgeのインストールまでしましたが、今度は本物のリレーを動かします。

おあつらえ向きに、Sonoffという製品が安く売っています。

 

 

こいつを購入して使います。

しかし、そのままだと中国のクラウドからコントロールすることになり、せっかくのHomekitは生かせません。

なので、まずはファームウェアをESP easyに入れ替えます。

ファームを入れ替えるためにはシリアル通信を出来るようにしなければならないため、次の2つも併せて購入しました。

 

使うのはこのうち5Pinだけなんですけどね。

 

 これでSonoffのシリアルとPCのUSBを変換します。ピンヘッダー用のケーブルもついてきます。

 

で、届いたら早速コジ開けて基板にピンヘッダーを半田付けします。

f:id:naoyukinagano:20170618225947j:plain

スルーホールが1カ所しかないのでわかりやすいです。

5ピンを半田付けしますが、使わないピンもあるようです。

 

で、接続します。

f:id:naoyukinagano:20170618230009j:plain

ボタンがある方から3.3V,RX,TX,GNDで、最後の1ピンは使いません。

 

で、USB-UARTコンバーター側は、

f:id:naoyukinagano:20170618230025j:plain

とまぁ、対向側とTX-RXが接続されるようにクロスさせます。

 

で、ファームウェア書き換えモードにするために、Sonoffのボタンを押しながらPCのUSBに刺します。

(後述しますが、そのまま刺すと書き換えできません。)

COMポートとして認識されますので、何番なのかをデバイスマネージャで調べます。

f:id:naoyukinagano:20170618233655p:plain

COM3ですね。

 

で、次の場所からESP easyというファームウェアをダウンロードします。

ESPEasy - Let's Control It

バージョンはR120です。

"Current stable: ESPEasy R120"

と書いてある場所から、"ESPEasy_R120.zip"をダウンロードして解凍します。

 

コマンドプロンプトを出して、解凍したフォルダに移動し、flash.cmdを実行します。

3つの質問をされますので、環境に合わせて適切に答えましょう。

COMポートは上記で調べましたのでその番号(ここでは3)、フラッシュメモリのサイズはSonoffの場合1024です。ダウンロードしたESP Easyのバージョンは120です。

 

C:\ >flash.cmd

Comport (example 3, 4, ..)           :3
Flash Size (example 512, 1024, 4096) :1024
Build (example 71, 72, ..)           :120

 

そうすると、たくさんの・・・が出て、

starting app without reboot
        espcomm_send_command: sending command header
        espcomm_send_command: sending command payload
        espcomm_send_command: receiving 2 bytes of data
closing bootloader
        flush start
        setting serial port timeouts to 1 ms
        setting serial port timeouts to 1000 ms
        flush complete
続行するには何かキーを押してください . . .

 となって終了します。

 

もしも、

warning: espcomm_sync failed
error: espcomm_open failed
続行するには何かキーを押してください . . .

 で終わっていたら、書き換えに失敗しているので、ピンとの結線が間違っているか、Sonoffのボタンを押しながらUSBを刺さなかったのかのどちらかです。

(私はボタンを押さずにUSBに接続したので、書き換えられない!!と思って焦りました。)

 

 書き換えが終了したら、USBを抜き刺します。

 今度はボタンを押さずに。

 そうすると、"ESP_0"というWiFiSSIDが飛んでいますので、パスワード"configesp"で接続します。

 そして、ブラウザで"http://192.168.4.1"にアクセスすると、ESP easyがSSIDの候補を表示するので、お家のWiFiSSIDを選択し、パスワードを入れてSubmitします。

 

 これで、ESP easyに書き換わったSonoffがお家のWiFiに接続されます。

 でも、ESP easyはDHCPIPアドレスを受け取るため、最初は何らかの方法でどのIPアドレスになったかを調べます。

(私はいつもiOSのFingというアプリを使って検出しています。)

 

 で、ブラウザでそのIPアドレスにアクセスし、Configを見ます。

f:id:naoyukinagano:20170619001327p:plain

 ここで、固定IPにするために、"Optonal Settings"に希望する固定IPアドレスを入れます。

 ついでに、Controller IPにHomebridgeを入れたサーバーのIPアドレス、Portに80を入れておきます。(必要ないかも?)

 

 続いて、ボタン類の登録です。

Devicesの1にあるEditボタンを押して、次のように登録します。

 

f:id:naoyukinagano:20170619002521p:plain

GPIOはリレーが接続されているピンになります。

これをSwitchと解釈させるようです。

 

SubmitしてCloseしたら、つぎは2をEditして次のように入力します。

f:id:naoyukinagano:20170619002740p:plain

GPIO0は基盤についているボタンそのものです。

Submitしてください。

それぞれ役割が与えられました。

 

ちなみに、GPIO13がLEDだそうなので、"Hardware"にある"Wifi Status Led:"をGPIO-13にしてSubmitしておけば、WiFiが生きるとLEDが光るようになります。

 

"Tools"にある"Advanced"に入り、"Rules"のチェックを入れSubmitすると、"Devices"と"Tools”の間に"Rules"が出てきます。

このRulesをクリックします。

 

私は次のように入れました。

On System#Boot do
    gpio,12,1
EndOn

On PowerOn Do
    gpio,12,1
EndOn

On PowerOff Do
    gpio,12,0
EndOn

On Button#State Do
    If [Button#State] = 0
        gpio,12,0
        gpio,13,1
    Else
        gpio,12,1
        gpio,13,0
    EndIf
EndOn

まず最初の"On System#Boot do"ですが、ブート時に実施することを示します。

gpio,12,1で、GPIO12をHighにします。そうするとリレースイッチがONになります。

これは、照明で使うためで、壁の片切スイッチを入れた際に、照明がつくようにするためです。

ただし、つくまでにはBootを待つ必要があるため10秒ほどかかります。

 

"On PowerOn Do"と"On PowerOff Do"は、それぞれPowerOnコマンド、PowerOffコマンドを受け取ったときに実施する内容です。

PowerOnでGPIO12をHighつまりリレーをONです。

これは、"http:///control?cmd=event,PowerOn"というURLでコマンドが呼び出されます。


"On Button#State Do" は、先ほどのDevicesで2に登録したNameがButtonというスイッチをGPIO0に定義したと思います。

GPIO0はSonoffのスイッチですので、これが押されたときにどういう動作をするのか?ということです。

トグルスイッチになっていますよね?

 

さて、Sonoffはここまでで、次にHomebridgeの設定です。

npmでプラグイン"homebridge-sonoff-basic-espeasy"をインストールします。

gentoo # npm install -g homebridge-sonoff-basic-espeasy request

 

/var/homabridgeにある"config.json"を編集します。

私は「寝室の電気」として使います。

gentoo # nano /var/homabridge/config.json

 {
    "bridge": {
        "name": "Homebridge",
        "username": "44:8A:5B:9F:1D:FF",
        "port": 51826,
        "pin": "031-45-154"
    },

    "description": "dummy",

    "accessories": [
        {
            "accessory": "DummySwitch",
            "name": "ダミースイッチ"
        },
        {
                "accessory": "SonoffBasicESPEasy",
                "name": "寝室の電気",
                "ip": "SonoffのIPアドレス"
    }

    ]
}

 これで、localを再起動すればOK

 

gentoo # /etc/init.d/local restart

 

ちなみに、リレーを動かすにはそこそこの電流が必要なようで、USB-UARTコンバータから送られる3.3V電源では動きませんでした。

AC100Vをインプットにつないで実験すると、しっかり動作しました。

照明に組み込んで終了です。

 

参考にしたサイト

www.npmjs.com

www.rutg3r.nl

Tutorial Rules - Let's Control It

Apple Homekitを利用するためのHomebridgeをGentooにインストール

たぶん、Avahiは既に入っているはずなので、いきなりnodejsをインストールします。

と、その前に、make.confでUSEフラグを追加です。

面倒なのでpackage.keywordだっけ? あれを使わずにグローバル設定です。

プラグインを簡単にインストールできるように、npmを有効にします。

 

gentoo # nano /etc/portage/make.conf

 

USE="-X -gtk -gnome -qt alsa -ipv6 -kerberos ja sse sse2 sse3 sse4a mmxext nptl ... npm"

 

そして、emerge。どうやら4つのパッケージをインストールするそうです。

gentoo # emerge nodejs

・・・

>>> Installing (4 of 4) net-libs/nodejs-6.9.4::gentoo
* The global npm config lives in /etc/npm. This deviates slightly
* from upstream which otherwise would have it live in /usr/etc/.
*
* Protip: When using node-gyp to install native modules, you can
* avoid having to download extras by doing the following:
* $ node-gyp --nodedir /usr/include/node <command>

>>> Recording net-libs/nodejs in "world" favorites file...
>>> Auto-cleaning packages...

>>> No outdated packages were found on your system.

 

インストールされたか確認してみましょう。

gentoo ~ # npm -v
3.10.10
gentoo ~ # node -v
v6.9.4

 

順調です。

では、homebridgeプラグインをインストールします。

ここからはemergeじゃなくて、npmですね。

 

gentoo ~ # npm install -g homebridge

 

お、いろいろコンパイルしてインストールされました。

次に、homebridgeのダミープラグインをインストールします。

gentoo ~ # npm install -g homebridge-dummy

 

では、ダミーアクセサリを作ります。

先に、usernameに設定するためにMac Addressを調べておきます。

(別にサーバーのMACアドレスじゃなくてもいいんですが、usernameは[0-9:A-F]の6つのペアなので、MACアドレスと同じ書式なのです。)

 

gentoo ~ # ifconfig

enp1s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 4074
inet 192.168.0.6 netmask 255.255.255.0 broadcast 192.168.0.255
ether 44:8a:5b:9f:1d:ff txqueuelen 1000 (Ethernet)
RX packets 207485528 bytes 286879248750 (267.1 GiB)
RX errors 0 dropped 27539 overruns 0 frame 0
TX packets 112039002 bytes 138752227480 (129.2 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 0 (Local Loopback)
RX packets 79554 bytes 7667641 (7.3 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 79554 bytes 7667641 (7.3 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

 

この、"ether 44:8a:5b:9f:1d:ff"の部分ですね。

しかし、大文字でなければなりません。

 

で、設定ファイルを作ります。

gentoo ~ # nano .homebridge/config.json

{
   "bridge": {
     "name": "Homebridge",
     "username": "44:8A:5B:9F:1D:FF",
     "port": 51826,
     "pin": "031-45-154"
},"description": "dummy",   "accessories": [
     {
       "accessory": "DummySwitch",
       "name": "ダミースイッチ"
     }
   ]
}

 

いつかポート番号は変えよう・・・。

nameは適当につけてください。

 

で、試験的に立ち上げてみます。

gentoo ~ # homebridge

*** WARNING *** The program 'node' uses the Apple Bonjour compatibility layer of Avahi.
*** WARNING *** Please fix your application to use the native API of Avahi!
*** WARNING *** For more information see <http://0pointer.de/avahi-compat?s=libdns_sd&e=node>
*** WARNING *** The program 'node' called 'DNSServiceRegister()' which is not supported (or only supported partially) in the Apple Bonjour compatibility layer of Avahi.
*** WARNING *** Please fix your application to use the native API of Avahi!
*** WARNING *** For more information see <http://0pointer.de/avahi-compat?s=libdns_sd&e=node&f=DNSServiceRegister>
[2017-06-14 22:18:38] Warning: skipping plugin found at '/usr/lib/node_modules/homebridge-dummy' since we already loaded the same plugin from '/usr/lib64/node_modules/homebridge-dummy'.
[2017-06-14 22:18:38] Loaded plugin: homebridge-dummy
[2017-06-14 22:18:38] Registering accessory 'homebridge-dummy.DummySwitch'
[2017-06-14 22:18:38] ---
[2017-06-14 22:18:38] Loaded config.json with 1 accessories and 0 platforms.
[2017-06-14 22:18:38] ---
[2017-06-14 22:18:38] Loading 1 accessories...
[2017-06-14 22:18:38] [ダミースイッチ] Initializing DummySwitch accessory...
Scan this code with your HomeKit App on your iOS device to pair with Homebridge:

    lqqqqqqqqqqqqk
    x 031-45-154 x
    mqqqqqqqqqqqqj

[2017-06-14 22:18:38] Homebridge is running on port 51826.

 

なにやらAvahiがNativeじゃないと怒られていますが、特に問題ないので放っておきます。

 

Apple Homekitアプリから、アクセサリを追加します。

f:id:naoyukinagano:20170614223939p:plain

 

f:id:naoyukinagano:20170614223943p:plain

ちゃんとHomebridgeが表示されました。これをタップします。

 

f:id:naoyukinagano:20170614223948p:plain

こんなダイアログが出るけど無視して「このまま追加」

 

f:id:naoyukinagano:20170614223953p:plain

と、ここでPINを読むんですが、画面だとうまくいかないようです。結局手入力しました。

 

f:id:naoyukinagano:20170614223959p:plain

とりあえず次へ

 

f:id:naoyukinagano:20170614224003p:plain

タイプはスイッチで。いや、別にトグルになるものだったら何でもいいんでしょうけど。

 

f:id:naoyukinagano:20170614223918p:plain

「マイホーム」の「デフォルトの部屋」にある「ダミースイッチ」というアクセサリがちゃんと追加されています。

 

このボタンを押してもよいのですが、せっかくなのでSiriで認識してもらいましょう。

f:id:naoyukinagano:20170614224033p:plain

何回か、「谷スイッチをオン」って認識されちゃいましたが、ようやくダミースイッチをオンに出来ました。

とはいえ、何も出来ません。

ログは残っているようです。

 

[2017-06-14 22:34:59] [ダミースイッチ] Setting switch to true
[2017-06-14 22:35:00] [ダミースイッチ] Setting switch to false

 

とりあえず、動作確認が出来たので、Ctrl+Cで止めましょう。

 

では、init.dに自動起動させましょう。

設定ファイルを別な場所にコピーします。

gentoo ~ # mkdir /var/homebridge
gentoo ~ # cp -R ~/.homebridge/* /var/homebridge
gentoo ~ # chmod -R 0777 /var/homebridge 

gentooのお作法に則って、/etc/init.d/localに起動してもらいます。

gentoo ~ # cd /etc/local.d
gentoo local.d # nano homebridge.start

#!/bin/sh
/usr/bin/homebridge -U /var/homebridge &

gentoo local.d #chmod +x homebridge.start

で、localを再起動して終了。
gentoo local.d # /etc/init.d/local restart

さあこれで、Homekit対応デバイスが買えるぞ!

参考にさせていただいたサイト
Raspberry Pi以外のサーバーにHomebridgeをインストールしつつ、ダミースイッチまで紹介されています。

senyoltw.hatenablog.jp

init.dでデーモンとしてUbuntuで走らせる方法を記載しています。

私はGentooなのでだいぶ違いますが・・・。

github.com