🐱

ラズパイ+赤外線モジュールで帰宅前に暖房ONする

2023/12/17に公開

概要

<<外出先からヒーターをオンにしたい!!!>>

エアコンの暖房が苦手な私は、この冬、我が家に新しい暖房器具を迎えました。デロンギのマルチダイナミックヒーターです。

このヒーターの特徴は、「輻射熱と自然対流を利用して、空気だけでなく壁や天井も暖めることができる」ことです(公式HPより引用)。その結果、お部屋全体がムラなく暖まり、エアコン特有のモワッとした感じなしに快適な温度を実現します。ただし、暖まるまでに時間がかかるため、帰宅してすぐに使うと少し寒さを感じることがあります。

アプリ操作が可能なモデルもありますが、そのユーザーインターフェースの評判が良くなく、価格も高めです。そこで、私はリモコン操作のモデルを選び、自宅でホストしているWebサービス(ラズベリーパイを使用)から赤外線信号を送ることで、外出先からヒーターをオンにする方法を取ることにしました。

完成品披露

このような形でWeb上からヒーターの電源をつけることができました!!
web上で温度を設定し turn on を押下すると、赤外線モジュールが信号を発信しヒーターがつきます。

ラズパイサーバーの説明

ラズパイサーバーのネットワーク構成の簡易図です。ここについては別で記事を書きたいと思います。

ネットワーク

赤外線モジュールの動作確認

今回使用するのは、BitTradeOneの赤外線リモコンアドバンスです。

こちらを選んだ理由は赤外線が強力そう、スタイリッシュ、楽そうだからです!!USBで接続するだけで赤外線の受発信ができます。
(実際、完成するまで1hもかからず逆にちょっと寂しかったです)

モジュールの操作は、公式が紹介している非公式のコマンドラインツールがあり、そちらを使わせて頂きます。
https://bit-trade-one.co.jp/assemblydeskfiles/hobby/

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