ラズパイ+赤外線モジュールで帰宅前に暖房ONする
概要
<<外出先からヒーターをオンにしたい!!!>>
エアコンの暖房が苦手な私は、この冬、我が家に新しい暖房器具を迎えました。デロンギのマルチダイナミックヒーターです。
このヒーターの特徴は、「輻射熱と自然対流を利用して、空気だけでなく壁や天井も暖めることができる」ことです(公式HPより引用)。その結果、お部屋全体がムラなく暖まり、エアコン特有のモワッとした感じなしに快適な温度を実現します。ただし、暖まるまでに時間がかかるため、帰宅してすぐに使うと少し寒さを感じることがあります。
アプリ操作が可能なモデルもありますが、そのユーザーインターフェースの評判が良くなく、価格も高めです。そこで、私はリモコン操作のモデルを選び、自宅でホストしているWebサービス(ラズベリーパイを使用)から赤外線信号を送ることで、外出先からヒーターをオンにする方法を取ることにしました。
完成品披露
このような形でWeb上からヒーターの電源をつけることができました!!
web上で温度を設定し turn on を押下すると、赤外線モジュールが信号を発信しヒーターがつきます。
ラズパイサーバーの説明
ラズパイサーバーのネットワーク構成の簡易図です。ここについては別で記事を書きたいと思います。
赤外線モジュールの動作確認
今回使用するのは、BitTradeOneの赤外線リモコンアドバンスです。
こちらを選んだ理由は赤外線が強力そう、スタイリッシュ、楽そうだからです!!USBで接続するだけで赤外線の受発信ができます。
(実際、完成するまで1hもかからず逆にちょっと寂しかったです)
モジュールの操作は、公式が紹介している非公式のコマンドラインツールがあり、そちらを使わせて頂きます。
wget https://bit-trade-one.co.jp/wp/wp-content/uploads/mydownloads/bto_advanced_USBIR_cmd.zip
unzip bto_advanced_USBIR_cmd101.zip
cat README.txt
README.txt
bto_advanced_USBIR_cmd
ビット・トレード・ワン社提供の、C#言語で記述された
USB赤外線リモコンアドバンス用ライブラリ(USB_IR_Remote_Controller_Advance_Library_v4.1.0.0) を
C言語ソースに移植し、コマンドラインインターフェースを付けたもの。
著作権者:(C) 2015 ビット・トレード・ワン社
ライセンス: ADL(Assembly Desk License)
usage: bto_advanced_USBIR_cmd <option>
-f <freq> -dオプションまたは -rオプションを指定した場合のみ使用できます。
指定しない場合は38000になります。
-t {AEHA,NEC,SONY,MITSUBISHI}
-c <code> 家電協(AEHA)フォーマット、NECフォーマット、SONYフォーマット、三菱フォーマットの
コードデータをこの -cオプション引数として指定します。
書式は-dオプションと同じ 0xFF,0xFF,... です。必ず-tオプションとセットで指定します。
-C <Code> 家電協(AEHA)フォーマット、NECフォーマット、SONYフォーマット、三菱フォーマットの
コードデータをこの -Cオプション引数として指定します。
書式は0xの付かない16進文字列 FFFF... です。必ず-tオプションとセットで指定します。
-d <data> 受信設定または送信設定コンフィグレーションツールで、クリップボードに
コピーボタンでコピーしたデータ、または、-gオプションで取得したデータが、
この -dオプション引数として使用可能です。
-fオプションのみ追加で指定可能です。
-r 受信開始を指令します。
-fオプションのみ追加で指定可能です。
受信設定または送信設定コンフィグレーションツールで取得できるデータが、
本コマンドでも取得できます。
-s 受信停止を指令します。
-g 直前に受信を終えたデータが所得できます。
--Plarail_StopA このオプションは必ず単独で指定します。
--Plarail_StopB このオプションは必ず単独で指定します。
--Plarail_Speed_UpAF このオプションは必ず単独で指定します。
--Plarail_Speed_UpAB このオプションは必ず単独で指定します。
--Plarail_Speed_UpBF このオプションは必ず単独で指定します。
--Plarail_Speed_UpBB このオプションは必ず単独で指定します。
--Plarail_Speed_DownA このオプションは必ず単独で指定します。
--Plarail_Speed_DownB このオプションは必ず単独で指定します。
--version
--firmversion
※ getopt_longモジュールの制限を回避する為、プラレール用のオプションは末尾まで正確に指定して下さい。
使い方の例
受信系
$ bto_advanced_USBIR_cmd -r # (生データ)受信開始
$ bto_advanced_USBIR_cmd -s # (生データ)受信停止
$ bto_advanced_USBIR_cmd -g | tee data.txt # 生データ所得
送信系
$ bto_advanced_USBIR_cmd -d cat data.txt
$ bto_advanced_USBIR_cmd -t AEHA -C 123456789ABC
$ bto_advanced_USBIR_cmd -t NEC -C 08F6817E
$ bto_advanced_USBIR_cmd -t SONY -C 08F6817E
$ bto_advanced_USBIR_cmd -t MITSUBISHI -C 08F6817E
$ bto_advanced_USBIR_cmd --Plarail_Speed_UpAF
※open_device関数とclose_device関数はkjmkznr 氏作の bto_ir_cmdからコピー
bto_ir_cmdはMITライセンス。ちなみにもちろんプログラム名:bto_advanced_USBIR.cmdもbto_ir_cmdに由来
しています。advancedと付けていますが、それは半ばジョークであって、別にbto_ir_cmdと比べてadvancedな
わけではありません。
※今のところ--Plarail_StopAオプションで出力される赤外線命令と、--Plarail_StopBオプションで出力される
赤外線命令は同じです。プラレール用の赤外線命令はUSB_IR_Plarail.exeから実際に出力される赤外線命令を
コピーしたものなので、USB_IR_Plarail.exeの状態(問題)をそのまま引き継いでいます。
※今のところ本プログラムには、USB_IR_Remote_Controller_Advance_Library_v4.1.0.0に実装されている、
命令をリピートする機能を実装していません。リピート命令は主に赤外線リモコンをマウスの代わりに使う
際に必要なものだと思われるので、主に送信系を中心に使われると思われる非Windows環境では必要性が
低いと思われる為です。
ビルド&インストール(必要ライブラリ libusb-1.0)
$ make; sudo make install
アンインストール
$ sudo make uninstall
使い方の例
受信系
$ bto_advanced_USBIR_cmd -r # (生データ)受信開始
$ bto_advanced_USBIR_cmd -s # (生データ)受信停止
$ bto_advanced_USBIR_cmd -g | tee data.txt # 生データ所得
送信系
$ bto_advanced_USBIR_cmd -d cat data.txt
$ bto_advanced_USBIR_cmd -t AEHA -C 123456789ABC
$ bto_advanced_USBIR_cmd -t NEC -C 08F6817E
$ bto_advanced_USBIR_cmd -t SONY -C 08F6817E
$ bto_advanced_USBIR_cmd -t MITSUBISHI -C 08F6817E
$ bto_advanced_USBIR_cmd --Plarail_Speed_UpAF
移植作業者: disklessfun@gmail.com
sudo apt update
sudo apt install -y libusb-1.0-0-dev
make; sudo make install
これでモジュールを操作する環境は整いました。readmeに従って、信号の受信テストをしてみます。
使い方の例
受信系
$ bto_advanced_USBIR_cmd -r # (生データ)受信開始
$ bto_advanced_USBIR_cmd -s # (生データ)受信停止
$ bto_advanced_USBIR_cmd -g | tee data.txt # 生データ所得
bto_advanced_USBIR_cmd -r
実行後、モジュールに向けてリモコンを押すと緑色にひかります。正常に受信ができていそうです。
bto_advanced_USBIR_cmd -s
で受信を停止後、bto_advanced_USBIR_cmd -g
を実行すると、信号のコードが取得できていそうです。
次に信号の発信テストををしてみます。先ほど取得したコードを`delonghi_on.txtに保存しておきます。
bto_advanced_USBIR_cmd -d `cat delonghi_on.txt`
実行後、ヒーターが起動することを確認しました。想定よりすんなりいきましたね。
さて、電源、温度上げる、温度下げるの3つのコードを取得して、X度で起動する、のようなコードを作成してWebアプリケーションに組み込んでいきたいと思います。
完成
実装はシンプルで以下のスクリプトを実行するだけです。
温度指定をするために、上限の28度まで上げた後、目標の温度まで下げるようにしています。
#!/bin/bash
# コマンドライン引数に応じて異なる操作を実行する
case "$1" in
-[0-9]*)
# 数値が指定された場合の処理
number=${1#-}
# bto_advanced_USBIR_cmd -d "$(cat delonghi_up.txt)" を1秒おきに19回実行
for i in $(seq 1 19); do
bto_advanced_USBIR_cmd -d "$(cat app/scripts/delonghi_up.txt)"
sleep 1
done
# bto_advanced_USBIR_cmd -d "$(cat delonghi_down.txt)" を1秒おきに 28-{数値} 回実行
end=$((28 - number))
for i in $(seq 1 $end); do
bto_advanced_USBIR_cmd -d "$(cat app/scripts/delonghi_down.txt)"
sleep 1
done
;;
-power)
# -power が指定された場合の処理
bto_advanced_USBIR_cmd -d "$(cat app/scripts/delonghi_on.txt)"
;;
*)
echo "Usage: $0 {-power|-[number]}"
exit 1
;;
esac
WebUIの方は完成品披露で貼っているものです。
ちなみにどちらもchatGPTに書いてもらいました。ありがとう。
おわり
想定よりすごく簡単に実現できてしまいました。
課題としては、web上で現状付いているのか消えているのかがわからない点ですw
リモコンは2パターンあって、リモコン側が状態をもつ(エアコンなど)ものと本体側が状態を保つもの(テレビなど)があり、後者の場合リモコンで状態管理ができません。
今振り返ると、アプリ対応モデルであればAPIで操作して状態管理もできるし、赤外線モジュールもいらないのでそっちにすればよかったと思ってますw
また、今年の冬は暖冬&僕が暑がりなのでまだヒーターを使う機会が訪れていません。
でもリモコンの勉強になったのと advent calendar の記事にできたのでヨシとします!!
Discussion