スマートホーム(Home Assistant)を運用してると、ある日突然デバイスが動かなくなることってあるよね。 原因を調べてみると、大体はルーターの気分でデバイスのIPアドレスが変わっちゃったことだったりする。
もちろん、「ルーター側でDHCP固定(静的割当)設定をする」のが一番の正攻法でベターなのは間違いない。 でも、ルーターの仕様で登録数に制限があったり、諸事情でルーターの設定をいじりたくない(あるいはできない)環境だってある。
今回は、そんな「正攻法が使えない状況」で、迷子になったデバイスを自動で見つけて再起動なしで復旧させるシステムを構築したよ。
* 抱えていた課題
- AQUOSレコーダーやヤマハのサウンドバーが、IP変動のたびに見失われる。
- ルーター側の固定設定に頼らず、システム側でなんとか自動追従させたい。
- IPが変わるたびに設定ファイルを書き換えて再起動するのはもう疲れた!
* 解決策:動的IP更新システム
「固定IPにできないなら、変わった先を自動で追いかければいいじゃない」という発想で、以下の3段構えの仕組みを作ったよ。
1. IPを保存する「器」を用意する Home Assistantの「Helper (input_text)」を使って、デバイスごとの最新IPを保存する場所を作ったよ。
2. 自動スキャンスクリプトを定期実行 Pythonスクリプトでネットワーク内を定期的にスキャン。特定のポート(レコーダーなら10002番など)が開いているIPを探し出し、見つけたらHome AssistantのAPIを叩いてHelperの値を書き換える。
|python| import socket import requests
特定のポートが開いているIPを探す
def scan_network(port): for i in range(1, 255): ip = f"192.168.0.{i}" with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.settimeout(0.1) if s.connect_ex*1 == 0: return ip return None ||<
3. Node-RED側でHelperを動的に参照 Node-REDのフロー内でIPをハードコードするのをやめて、実行時にHelperからIPを読み込むように変更。これで、IPが変わってもシステム全体を止めることなく、次のコマンド送出時には新しい居場所へ繋いでくれるんだ。
* まとめ
「ルーターで固定できない」という制約があっても、諦めずに自動化でカバーするのがスマートホームの醍醐味だよね。 この仕組みを導入してから、デバイスが迷子になっても最大6時間以内には勝手に復旧するようになって、ストレスが激減したよ。
*1:ip, port