みなさん、こんにちは。
以前、メーカーサポートが終了してしまった「eRemote」をPythonを使って現役でバリバリ使い倒すという記事を書きました。
この記事では、python-broadlinkという素晴らしいライブラリを使って、古いデバイスをプログラムで操作する方法をご紹介しました。おかげさまで多くの方に読んでいただけたようで、古いデバイスに命を吹き込みたいというニーズの多さを実感しています。
さて、今回はその「続編」です。実際に運用していく中で直面した「あるある」なトラブルと、それをスマートに解決する方法をご紹介します。
突然動かなくなるスマートホームの謎
昨日まで完璧に動いていた自作のスマートホームシステムが、朝起きたら突然反応しなくなっていた……。自作システムを楽しんでいる方なら、一度は経験がある「あるある」な話ですよね?
つい最近も外部サービスの障害でMQTTが動作しなくなり、ブローカーの変更(BeebotteからEMQX Cloudへ)を余儀なくされた、なんてこともありました。
MQTTの件は「家の外」のネットワークトラブルでしたが、自宅内ではもっと基本的で、かつ厄介なネットワークトラブルがよく発生します。それが「DHCPによるIPアドレスの変更」です。
冬場のブレーカーには要注意!
特に冬場、エアコンや電気ヒーターをガンガン使っていると、うっかりブレーカーを落としてしまうこと、ありますよね(私はよくやります……汗)。あるいは、ルーターの再起動や停電。これらが起きると、Wi-Fiに繋がっている機器のIPアドレスが、再起動のタイミングで以前とは違うものに割り振られてしまうことがあるんです。
python-broadlinkのコマンドラインツール(broadlink_cli)は非常に便利で、IPアドレスを含むデバイス情報をファイルに保存しておけば、それを読み込むだけで特定のデバイスをサクッと操作できます。私も各部屋のeRemoteの情報をファイル化して管理していました。
しかし、IPアドレスが変わってしまうと、デバイス情報ファイルには古いIPアドレスが書かれているため、プログラムは「あれ?指定された場所にデバイスがいないぞ?」と迷子になってしまいます。その結果、せっかく構築したスマートホームシステムが簡単に破綻してしまうのです。
「IPを固定すればいいじゃないか」という声も聞こえてきそうですが、デバイスが増えてくるとルーター側での固定設定も面倒ですし、環境によっては設定が反映されにくいこともあります。
そこで、「IPが変わるなら、変わるたびに自動でファイルを書き換えちゃえばいいじゃない!」という逆転の発想で解決を図ることにしました。
救世主 – broadlink_discovery
python-broadlinkには、ネットワーク内のデバイスをスキャンしてくれるbroadlink_discoveryというコマンドが用意されています。
これを実行すると、現在ネットワークに繋がっているデバイスの「タイプ」「IPアドレス」「MACアドレス」がずらっと表示されます。
broadlink_discovery
Discovering...
###########################################
RM
# broadlink_cli --type 0x27XX --host 192.168.*.* --mac ############
Device file data (to be used with --device @filename in broadlink_cli) :
0x27XX 192.168.*.* ############
temperature = 22.7
...
注目すべきは、中段にある「Device file data」の行です。ここにはbroadlink_cliでそのまま使える形式でデバイス情報が表示されています。
この出力結果をうまく料理して、部屋ごとのファイルに自動保存する仕組みを作ればよいわけです。それでは、早速作ってみましょう。
デバイス情報を自動更新するシェルスクリプト
今回作成したのは、特定のデバイスIDをキーにして、最新の情報を抽出・保存するシェルスクリプトです。名前はシンプルにregister.shとしました。
#!/bin/bash
# 各部屋のデバイスタイプ(ID)の備忘録
# ROOM1: RM mini (0x27XX)
# ROOM2: RM PRO (0x27YY)
# ROOM3: RM PRO (0x27ZZ)
# デバイス情報ファイルを保存するディレクトリへ移動
cd /path/to/device_files
# ネットワーク内のデバイスをスキャンして一時ファイルに保存
/usr/local/bin/broadlink_discovery > /tmp/broadlink
# 特定のデバイスID(0x...)で始まる行を抽出して変数に格納
ROOM1=`cat /tmp/broadlink | grep '^0x27XX'`
ROOM2=`cat /tmp/broadlink | grep '^0x27YY'`
ROOM3=`cat /tmp/broadlink | grep '^0x27ZZ'`
# 抽出した情報をファイルに書き出し
# (-n オプションで余計な改行を防いでいます)
echo "Updating ROOM1..."
echo -n $ROOM1 > ./ROOM1
echo "Updating ROOM2..."
echo -n $ROOM2 > ./ROOM2
echo "Updating ROOM3..."
echo -n $ROOM3 > ./ROOM3
# 一時ファイルの削除
rm /tmp/broadlink
echo "Done!"
このスクリプトを実行すると、指定したフォルダ内に「ROOM1」「ROOM2」といったファイルが生成されます。中身は最新のIPアドレスを含んだ1行のテキストです。
家電を操作したいときは、以下のようにオプションで指定してあげればOKです。
# ROOM1のエアコンをつける例
broadlink_cli --device @/path/to/device_files/ROOM1 --send @aircon_on_code
注)aircon_on_codeはIRコードを学習させたファイルです。使い方は前回記事の「IRコマンドの学習」を参考にしてくださいね。
忘れちゃいけない「実行権限」の付与
ここで一つ、非常に重要なステップがあります。作成したスクリプトファイルをシステムが実行できるように、実行権限をつけてあげる必要があります。これを忘れると、いくら中身が正しくても「許可がありません」と言われて動いてくれません。
ターミナルで以下のコマンドを叩いておきましょう。
chmod +x /path/to/register.sh
これで準備万端。スクリプトを直接実行できるようになりました。
メンテナンスフリーへの仕上げ
最後に、実行自体を自動化しましょう。 私はサーバーのcronを設定して、毎日深夜の1時にこのスクリプトが自動で走るようにしています。
# crontab -e で以下を追記
00 01 * * * /path/to/register.sh
これで、たとえ日中にブレーカーが落ちてIPアドレスが変わってしまっても、翌朝には自動的に「新しいアドレス」に修正されており、動作しないという事態を防げます。
もちろん、IPアドレス変更と同時にリアルタイムで修正されるわけではないので、「今すぐ直したい!」という時は手動でサッとこのスクリプトを叩いてください。それだけで復旧完了です。
管理のしやすさがスマートホームの鍵
スマートホーム化を進める上で、最も大切なのは「メンテナンスのしやすさ」だと痛感しています。
デバイスが1台だけなら手動設定でも耐えられますが、3台、5台と増えてくると、どれがどのIPだったか管理するだけで一苦労です。今回のように、ファイル名に「部屋の名前」をつけて管理し、その中身を自動更新させる仕組みを作っておけば、運用のストレスは激減します。
eRemoteをPythonで制御しているという、かなりニッチな環境の方に向けた情報ではありますが、python-boradlinkのREADMEを読む限り、それなりの数の機器に対応しているようです。もし該当の機器を使っていて同じように「IPアドレス変更問題」に悩んでいる方がいたら、ぜひ試してみてください。
古いデバイスでも、工夫次第で最新デバイスに負けない便利さを発揮してくれます。愛着のある機材を長く使い倒す、これぞDIYスマートホームの醍醐味ですね!
本日も最後までお読みいただきありがとうございました。
それでは、よいIoTライフを!




ピンバック: メーカーサポート終了後も現役!eRemote RJ-3をPythonで使い倒す方法 - ビューローみかみ