ラズパイと赤外線でエアコンの自動ON、消し忘れ機能を実現

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

更新日 : 2024年2月21日

概要

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

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

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

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

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

Raspberry Pi 5について

Raspberry Pi 5では赤外線通信ツール「cgir」が信号制御に利用しているpigpioが動作しないため、本ページの方法では動作しません。 対応は検討中です。

Raspberry Pi 4以前のモデルを使用してください。

拡張基板の準備

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

RPZ-PIRS
RPi TPH Monitor



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

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

$ sudo python3 -m pip install -U cgir --break-system-packages
$ sudo python3 -m pip install -U cgsensor --break-system-packages

エラーが出る場合は最後のオプションを指定せずにお試しください。

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

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/SPIの有効化方法と仕組み

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

こちらからダウンロードしたファイルを解凍し、「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」拡張基板を使うと、指定した時刻だけ起動するような使い方も可能になります。

BME280センサーとラズパイで気温、湿度、気圧を測定する

Indoor Corgiのセンサー制御ソフトウェア「cgsensor」を利用して、BME280センサーで気温、湿度、気圧を測定する方法を解説します。コマンドラインツールを使って1行もコードを書かずに測定や記録ができるほか、Pythonパッケージを使えばご自身のプログラムから簡単にセンサーを制御できます。

静音モードでステッピングモーターの動作音を抑える (Raspberry Pi + RPZ-Stepper)

ステップ角単位で回転するという仕組み上、ステッピングモーターは振動や音が大きくなりやすい特徴があります。RPZ-Stepperは静音モードを搭載しており、特に低速回転時において振動と音を低減できます。静かな環境で動作させるアプリケーションに最適です。

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

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