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

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

Raspberry Pi OS Version 2021-01-11対応

更新日 : 2021年1月18日

概要

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

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.pyとcgirtool.pyを /home/pi/cgir ディレクトリに配置してください。

ツールの詳細は以下の記事で解説しています。

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

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

cgirtoo.pyでは、docoptモジュールを利用しています。以下のコマンドを実行してインストールします。

sudo pip3 install docopt

pigpioを使うので、以下のコマンドで立ち上げておきます。2行目はRaspberry Pi起動時にpigpioを自動で立ち上げるためのものです。

sudo service pigpiod start
sudo systemctl enable pigpiod.service

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

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

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

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

赤外線コードを登録する

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

./cgirtool.py 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です。

./cgirtool.py send heater_on

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

./cgirtool.py rec aircond_off

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

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

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

0  23   * * *   pi cd /home/pi/cgir; ./cgirtool.py send aircond_off

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

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

その後に、実行するコマンドを指定します。今回はcgirディレクトリに移動するcdコマンドと、「;」で区切ることでもう一つの赤外線送信コマンドを記述しています。cdコマンドがないと、ホームディレクトリ/home/piで実行されるのですが、赤外線コードを登録した「codes.json」が見つからないのでうまくいきません。

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

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

Raspberry PiでI2Cの設定と使い方

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

こちらからダウンロードしたファイルを解凍し、「bme280i2c.py」と「temp_check.py」を/home/pi/cgirディレクトリにコピーします。

bme280i2c.pyがBME280センサーから気温を取得するライブラリです。

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

#!/usr/bin/env python3

import subprocess
from bme280i2c import BME280I2C

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

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

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

# 測定失敗
else:
  print('No Sensor Available')

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ファイルをスーパーユーザーで開いて、以下を追記します。今回もcdコマンドを入れることで、赤外線コードを記録した「codes.json」が参照できるようにしています。

0  7    * * *   pi cd /home/pi/cgir; ./temp_check.py

まとめ

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にステータスを表示することもできます。