プロローグ
タイトルが語彙力なく長ったらしいですが、クラウド(OCI)のArmインスタンスにDockerをインストールして、その上にデプロイしたHome Assistant(HA)コンテナ上でZigbee Home Automation(ZHA)を使用するために自宅で稼働しているRaspberry Pi 3 Model B+(OpenWRT)に接続したZBDongle-Eを使えるようにした備忘録です。
構成のポンチ絵は下図の通り。
OCIと自宅間はIPSecで接続しています(既設)。
自宅側はRaspberry Pi 3 Model B+にOpenWRTをインストールし、LibreswanでIPSecを張っています。
自宅のルーターでOCIで使用しているサブネットのルーティングをOpenWRTに向けており、OCI側も自宅で使用しているサブネットは全てDRGに向けることで自宅内とOCIサブネット間はシームレスに通信できるようになっています。
簡易的ですが、OCI→自宅間の通信はOpenWRTのファイアウォール設定で必要最低限に絞っています。
そしてOCIで一番大変なARMインスタンスを「ぐるぐるTerraform」で入手し、DockerをインストールしHAコンテナをホストしています。
内容
Zigbeeドングルの接続
まずZigbeeドングルはSonoffのZBDongle-Eを使用しています。
適当に買ったので本来は「ZBDongle-P」にすべきだったかもしれませんが、Eを購入してしまいました。
ドングルはOpenWRTがインストールされているRPi3B+のUSBポートに物理接続しました。
OpenWRTでドライバと「Ser2Net」をインストールして設定する(キモな部分)
ドライバーのインストール
正直ここの情報がなく苦戦しました。OpenWRTのコミュニティに先人の投稿があったので参考にしたところ使えるようになりました。
片っ端から必要そうなパッケージを入れ込みましたが、おそらく肝となるのは「kmod-usb-acm」かと思います。
後に出てきますがZigbeeドングルは「/dev/ttyACM0」で認識していますので、ひたすら必要そうなパッケージを入れて再起動かけたら「ls -al /dev/tty*」などでデバイスが認識しているか確認を行いました。
「ser2net」でZigbeeドングルをtelnet/TCP公開する
更にOpenWRTで「ser2net」パッケージをインストールします。
インストールして再起動するとサービスタブに「ser2net」が出てきますので設定します。
下図は当環境の設定ですが、必要に応じて値を変更してください。
[設定]タブ
[Proxies]タブ
OpenWRTのFirewall設定
環境によって設定が異なるので詳細は割愛しますが、必要に応じて任意の接続元(今回はOCI上のARMインスタンス)からser2netで設定したサービスポートにアクセス出来るように通信許可設定(トラフィックルール)を追加します。
この段階でOCIのARMインスタンスからZigbeeドングルが使用出来るようになっているはずです。
Home AssistantのZHA統合からser2netで公開したZigbeeドングルへ接続する
Home AssistantでZHA統合をインストール
ZHA統合インストール自体の手順は割愛しますが、インストール時にZigbeeデバイスを選択する際の設定値は以下の通りです。
無線タイプについて「ZBDongle-E」の場合は[EZSP]を指定する。
シリアルポートの設定でパスについては「socket://[OpenWRTのIPアドレス]:[ser2netで指定したポート番号]」を入力します。
ポート速度についても、ser2netで指定したボーレートの値を入力します。
データフローコントロールも「ZBDongle-E」の場合は[software]を指定します。
設定がうまくいっていればこの時点でZHAの設定を完了してZigbeeデバイスの検出オペレーションが可能になります。
HAからシリアルデバイスに接続できない場合は、OpenWRTのser2net設定がちゃんとされているか・Firewallでブロックされていないか・ルーティングがちゃんとされているかなどネットワークとして疎通が出来ているかなどの切り分けスキルが必要になります。
エピローグ
おそらくHAをこんな使い方している方はいないと思いますが、OCI上にタダで確保できたリソースが潤沢なARMインスタンスを活用したかったためこのような構成になりました。
最近HAを弄り始めたので、備忘録を増やしていこうかと考えています。
記事は以上