Raspberry Piと赤外線でエアコンの自動ON、消し忘れ機能を実現

普段、エアコンを消し忘れてしまい夜間つけっぱなしにしてしまったり、冬場に朝エアコンを入れても暖かくなるのに時間がかかったことは無いでしょうか?本記事では、Raspberry Piと拡張基板を利用して、毎晩のエアコン消し忘れ機能、および朝に温度が低い場合に自動で暖房を入れる機能を実現します。

Raspberry Pi OS Version 2021-10-30対応

更新日 : 2022年7月19日

概要

普段生活していて、エアコンを消し忘れてしまい夜間つけっぱなしにしてしまった冬場に朝エアコンを入れても暖かくなるのに時間がかかったことは無いでしょうか?

Raspberry Piと、赤外線通信/温度測定ができる拡張基板「RPZ-IR-Sensor」と「RPi TPH Monitor」を組み合わせると、こうした問題を解決できます。本記事では具体的に以下の2つの機能を実現します。(時刻などはカスタマイズ可能です)

  • 朝7時に温度を測定し、10℃未満なら暖房をONする
  • 夜23時に自動的にエアコンOFFする

これらの機能を実現するには、以下の3種類の機能を組み合わせることで可能になります。

  • 指定時刻にコマンドを実行する機能 (cronを利用)
  • 赤外線を送信する (拡張基板とPythonを利用)
  • 気温を測定する (拡張基板とPythonを利用)
それぞれの機能を色付けしたフローチャート

拡張基板の準備

赤外線送受信機能、および温度測定機能が搭載されている拡張基板「RPZ-IR-Sensor」もしくは「RPi TPH Monitor」を装着します。

RPZ-IR-Sensor
RPi TPH Monitor

赤外線制御プログラムの準備

赤外線制御ソフトウェア「cgir」と、BME280センサーを制御するためのソフトウェア「cgsensor」をインストールします。ターミナルを開き、以下の$に続くコマンドを実行して下さい。

$ sudo python3 -m pip install -U cgir
$ sudo python3 -m pip install -U cgsensor

これまではプログラムファイルをダウンロードする形でしたが、2022年1月よりcgirをコマンドでインストールできるようになりました

cgirとcgsensorの使い方は以下の記事で解説しています。


pigpioの準備

pigpioを使うには、Pythonプログラムを実行する前に、サービスを実行しておく必要があります。以下のコマンドを実行します。

sudo systemctl start pigpiod

Raspberry Pi起動時にpigpiodを自動で立ち上げたい場合は以下を実行します。

sudo systemctl enable pigpiod

リモコンから送信されるデータ

ほとんどのエアコンは、リモコン側が現在の状態を記憶しています。そのため、リモコンが電源ONの状態で「電源」のボタンを押すと、本体の状態に関わらず電源OFFになります。このため、消し忘れ機能が簡単に実現できます。

また、「暖房」ボタンを押した場合でも設定温度や風速などのデータも送られます。次項で赤外線コードを登録する際は、温度などを希望の値に合わせておいて下さい。

一方、テレビでは本体側が現在の状態を記憶しています。「電源」のボタンを押した場合、「電源ボタンが押された」という情報のみが送られます。本体が電源ONであればOFFになり、逆に本体が電源OFFであればONになります。このため、TVで消し忘れ機能を実現するには、別途TVがついているかを判定する機能が必要になりますので、ご注意下さい。

赤外線コードを登録する

まずはエアコンを制御する赤外線をRaspberry Piに登録します。ターミナルを開き、/home/piディレクトリで以下のコマンドを実行します。「heater_on」は自分で付けることができる登録名です。

$ cgir rec heater_on

以下のように受信中のメッセージが表示されるので、リモコンの暖房ボタンを押して拡張基板の受信機に向けて送信して下さい。温度や風速などは希望の値に合わせておいた上で送信するようにします。

------------------------------------
赤外線コード"heater_on"を受信中...  受信機に向けて赤外線を送信して下さい.

以下のように受信コードが表示されれば成功です。受信コードは「codes.json」というファイルに、先ほど指定した名前「heater_on」で保存されます。

------------------------------------
赤外線コード"heater_on"を受信中...  受信機に向けて赤外線を送信して下さい.

受信コード
[3600, 1700, ...
(途中省略)
Format AEHA
Frame#1 0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06
Frame#2 0x02, 0x20, 0xE0, 0x04, 0x00, 0x41, 0x34, 0x80, 0x3F, 0x00, 0x00, 0x06, 0x60, 0x20, 0x00, 0x80, 0x00, 0x06, 0x46

赤外線コード "heater_on" を登録しました.

確認のため、Raspberry Piをエアコンの近くに配置して、以下のコマンドを実行します。エアコンが反応すればOKです。うまく反応しない場合は、送信しても機器が反応しない場合の設定をお試しください。

$ cgir send heater_on

同様の手順で、電源OFFの赤外線コードも登録しましょう。今回は「aircond_off」という名前にしました。

$ cgir rec aircond_off

毎日23時にエアコンをOFFする

先に、簡単なエアコン消し忘れ機能を実装してしまいましょう。決まった時間にコマンドを実行してくれる「cron」というソフトウェアがデフォルトで備わっているので、それを使いましょう。

cronの設定は /etc/crontab ファイルに記述します。スーパーユーザーで開いて、以下の内容をファイルに追記します。

0  23   * * *   pi cgir send aircond_off

スペースで区切られた最初の5つのパラメーターは、実行したい時刻を分、時、日、月、曜日の順で指定します。「*」を指定すると全ての値を指定したのと同じ意味になります。例えば全て「* * * * *」とすると毎分実行されます。今回は「0 23 * * *」なので毎日23:00に実行されます。

時刻の後に実行するユーザーを記述します。「pi」としておきます。

その後に、実行するコマンドを指定します。赤外線コードを記録した「codes.json」が/home/piに保存されていることを想定しています。他の場所の場合は前にcdコマンドを追加するなどして「codes.json」が参照できるようにする必要があります。

設定ファイルの編集方法が分からない場合は、以下の記事を参考にして下さい。


気温が一定以下のときに暖房をONするプログラム

次に、気温を測定するプログラムを作成していきます。気温センサーとはI2Cで通信するので、以下の記事を参考にRaspberry PiのI2Cを有効にしてください。

Raspberry PiでI2Cの設定と使い方

I2Cの簡単な仕組み、Raspberry Pi(ラズパイ)で有効化と実際にI2Cデバイスを検出する手順の解説しています。I2C対応のセンサーやディスプレイ、ADコンバーターなどを利用することで、Raspberry Piの可能性がさらに広がります。Raspberry Pi OS (Raspbian)インストール後は無効になっているので、こちらを参考に有効化して下さい。

こちらからダウンロードしたファイルを解凍し、「temp_check.py」を/home/piディレクトリ(赤外線コードを記録した「codes.json」と同じ場所)にコピーします。

temp_check.pyが一定以下なら暖房をONするプログラム例です。以下がそのコードです。

#!/usr/bin/env python3

import subprocess
from cgsensor import BME280

bme280 = BME280(0x76)  # RPZ-IR-Sensorの基板上センサーを使う場合は0x77にする

# 測定成功
if bme280.forced():
  print('気温: {}°C'.format(bme280.temperature))  # 気温を画面に表示

  # 10度未満なら暖房ON
  if (bme280.temperature < 10):
    print('赤外線送信')
    subprocess.run(['cgir', 'send', 'heater_on'])

# 測定失敗
else:
  print('センサーが検出できませんでした')

13行目で測定した気温を判定して、10度未満のときに赤外線を送信する仕組みです。ここの値を変えることでしきい値を変更できます。テストとして、現在の気温より高い値に変更後、以下のコマンドを実行してみましょう。エアコンが反応すればOKです。

./temp_check.py

6行目のI2Cアドレス0x76はケーブルで外付けするセンサーを指定しています。RPZ-IR-Sensorの基板上のセンサーを使う場合は0x77に変更します。ただし、Raspberry Piに直接拡張基板を取り付けた場合、Raspberry Piの発熱により周囲気温より測定値が上昇します。

7時に気温測定を実行する

先ほどの「temp_check.py」を朝7時に実行するように設定します。消し忘れ防止と同様、cronを使います。/etc/crontabファイルをスーパーユーザーで開いて、以下を追記します。

temp_check.pyおよび赤外線コードを記録した「codes.json」が/home/piに保存されていることを想定しています。他の場所の場合は前にcdコマンドを追加するなどして参照できるようにする必要があります。

0  7    * * *   pi ./temp_check.py

うまく動かない場合

赤外線送信がうまく動作しない場合、cgirとpigpioで赤外線送信する記事の「送信しても機器が反応しない場合」及び「赤色LEDが点灯/点滅し続ける場合」の対策をお試しください。

まとめ

Raspberry Piと拡張基板を利用して、毎晩のエアコン消し忘れ機能、および朝に温度が低い場合に自動で暖房を入れる機能を実現する方法は以上です。Raspberry Piと赤外線、気温センサー、定期実行(cron)を組み合わせることで、便利なシステムを簡単に実装することができます。また、プログラムをカスタマイズすれば、温度が高いときに冷房を入れるような動作も可能です。

今回のシステムはRaspberry Piを常時起動しておくことを前提にしていますが、「RPZ-PowerMGR」拡張基板を使うと、指定した時刻だけ起動するような使い方も可能になります。

指定時刻にRaspberry Piの電源をON/OFF (RPZ-PowerMGR)

RPZ-PowerMGRを使って、指定時刻にRaspberry Pi(ラズパイ)の電源ON/OFFする方法の解説です。決まった時間だけ起動して消費電力を抑えることが可能で、モバイルバッテリーやソーラーシステムでの運用に最適です。

PythonとpigpioでRaspberry Piの赤外線制御 (家電、エアコン、照明、テレビなどを制御するホームIoT)

Pythonとpigpioを使ってRaspberry Piで赤外線の送受信を行う方法について解説しています。サンプルプログラムを用意しているので、簡単に受信、登録、送信動作をさせることができるほか、データ解析も可能です。赤外線を使ってエアコン、照明、テレビなどの家電を制御することが可能になります。

RPZ-IR-Sensor (Raspberry Pi用 温度/湿度/気圧/明るさ/赤外線 ホームIoT拡張ボード)

動作をプログラミング可能な、Raspberry Pi/Zero(ラズパイ)用ホームIoT拡張ボードです。温度、湿度、気圧、明るさセンサー、赤外線送受信機能を搭載。温度が上がったらエアコンをオンにする、暗くなったら照明を点灯する、外出先から家電の操作をする、気温や日照時間を記録する、といった使い方が可能です。LEDにステータスを表示したり、スイッチを押したら特定の処理をすることもできます。