自宅IoT Raspberry PiとNode REDでエアコンのスイッチをON/OFFにする

少し前に試したものになりますが、備忘録的に載せておきました。

今回はスマートフォン(Alexaアプリ)を使って、エアコンのON/OFFをRapsberry Piで動いているNode-REDを使って制御してみようと思います。

Raspberry PiからNode-REDを動かすと、クラウドサービスのような外部のサイトと連携してRaspberry Piに繋がっている機器を操作することができるため、遠隔から操作指示を行うことができます。今回のようにエアコンの操作可能な赤外線リモコンの役割をする機器を繋げておくことで、例えば、外出先からエアコンの冷房スイッチをONにできるため、帰宅した時には快適な状態で家の中に入ることができます。

参考サイトについて

材料、回路設計、実装についてはこちらのサイトが非常に参考になりました(ありがとうございました)。詳細についてはぜひこちらのサイトをご参考いただければと思います。

本ページでは、上記サイトを参考させていただいておりますので、若干割愛している部分がありますのでご了承ください。リモコンの作動についてはAlexaアプリを使って制御できるよう、Raspberry Pi上でNode REDを動かすことで実現しました。

準備したもの

今回準備したものは次の通りです。

  • Raspberry Pi Zero W
  • Raspberry Pi Zero用ユニバーサル基板
  • ピンソケット(2 × 20 P)
  • 赤外線リモコン受信モジュール OSRB38C9AA
  • 5mm 赤外線LED OSI5LA5113A
  • MOSFET 2N7000
  • MOSFET IRFU9024NPBF
  • 抵抗 4.7kΩ 1/2W
  • 抵抗 27Ω 1W

以下はRaspberry Piを設置するために今回向けに用意したもので、必須ではありません。

  • USB変換コネクタ[L字形]

L字になっており、Raspberry Piが上向きに刺さるようにちょうど良いものがありました。

ちょうどよく小さく、上のUSBコネクタの向きに合いそうなアダプタがありましたので、これを購入しました。

  • アクリル板(保護用)・・・ホームセンターで売っているナイロン板を今回の大きさに合わせて切り取り
  • ナイロンねじ(3mm)・・・Raspberry Piの機器の両サイドにアクリル板を挟み、Raspberry Piの基板とを固定するために使用。

連携のイメージ

連携イメージとしては次の通りです。やりたいことは、Alexaアプリがインストールされているスマートフォン(またはAmazon Echo等)からエアコンのスイッチをONにするトリガーイベントにより、Raspberry Piで実行しているNode-REDがそのイベントを検知して赤外線LEDからエアコンのスイッチONを発光して動かすことです。

以降は、右から順番に、Raspberry Piからの設定からやったことを記載していこうかと思います。

Raspberry Piでの配線

「参考サイト」での内容を参考にさせていただき、次のように配線を組みました。モジュールやセンサーが立体的なものが多くてfritzingでの配線図だと少々見づらいと思い、実際に組んだものをベースに配線を明示してみました。配線自体は拡張ボード上で行なっています。

左が表、右が裏。配線が綺麗ではないですが、配線のご参考になれば。

同一ボード上に赤外線受信モジュールと赤外線LEDを乗せています。ただし、電源供給ピン含め、配線自体は互いに独立させています。

どのモジュールのピンがどのGPIOピンと接続しているかどうかは上の図を参照してください。

モジュールを配置した基板はRaspberry Piに接続し、エアコンの赤外線センサーに当たりやすくするよう、赤外線LEDが上向きになるようにUSB変換コネクタ、電源アダプタを組み立てました。最終的に作ったものがこちらです。

両サイドのアクリル板は基板保護用ですが、上下からの保護ができていないので、なくてもよかったかも

赤外線LEDが上向きになるように設置します

Raspberry Piの赤外線LEDから発光された赤外線はこんな感じでうちのエアコン(霧ヶ峰)のセンサーで受信することによりエアコンのON、OFFが動きます。

赤外線受信・送信の実装とテスト

赤外線受信、送信ともに、GPIO制御ライブラリpigpioで行います。今回は実行・テストともにroot権限で実施しています。

pigpioのインストール:
$ sudo apt install pigpio python3-pigpio
$ systemctl enable pigpiod.service
$ sudo systemctl start pigpiod
GPIOの設定:
$ sudo echo 'm 17 w   w 17 0   m 12 r   pud 12 u' > /dev/pigpio

送信で使用するoutput(w)とlow(0) はGPIO17、受信で使用するinput(r)とpull up(u)はGPIO12を設定しました。

pigpioによる送信プログラムのダウンロード:
$ curl http://abyz.me.uk/rpi/pigpio/code/irrp_py.zip | zcat > irrp.py

IR Record and Playbackをダウンロードします。

赤外線受信テストと受信コードの取り込み:

python3(バージョンは「Python 3.7.3」で実施)でこのプログラム「irrp.py」を動かします。受信の場合は次のようなコマンド(インプットモードでGPIO12を指定します)を実行することで、受信待ちモードになります。

「Press key for …」が表示されたら、エアコンのリモコンのスイッチをONにしてそのコードを記録します。

記録が完了すると、「-f」で指定したファイル名でファイルが作成され、かつ「turn:on」のタグで記録されたコードが書き込まれます。

$ sudo python3 irrp.py -r -g12 -f actest turn:on --post 130
Recording
Press key for 'turn:on'
Okay
Press key for 'turn:on' to confirm
No match
Press key for 'turn:on' to confirm
Okay
$ ls actest
actest
$ head -10 actest
{"turn:on": [3456, 1665, 483, 1223, 483, 1223, 483, 367, 483, 367, 483, 367,
483, 1223, 483, 367, 483, 367, 483, 1223, 483, 1223, 483, 367, 483, 1223, ...

上記のコマンドでは、試行で受信したコードを2回一致する必要があります。3回試行し、1回目と3回目は「Okay」、2回目は「No match」になっています。これはリモコンにもよりますが、自分が試したリモコンはONとOFFが一つのボタンになっており、ON→OFF→ONの順番で動くため、ON操作に該当する1回目と3回目での発光が同じだったということです。

1回で登録できる「–no-confirm」オプションもありますが、確実な発光を行うのであれば通常コマンドで記録したほうが良いと思います。

今回はONとOFFの2つが必要になるため、ONを記録する「turn:on」とOFFを記録する「turn:off」を登録しました。

赤外線送信のテスト:

赤外線送信は次のコマンドを実行することで赤外線LEDから登録されたコードをもとに発光してエアコンを動かします。

$ sudo python3 irrp.py -p -g17 -f actest turn:on
$

上記コマンドを実行して、エアコンが反応すればテスト完了です。

Node-REDのインストール

Node-REDはNode.jsで動作しますので、Node.jsとnpmをインストールします。インストール方法は様々ですが、ここではNode.jsのバージョン管理できる「nvm」を使ってセットアップしました。Node.jsは「v11.15.0」で動かしました。

$ sudo apt install -y nodejs npm
$ sudo npm install n -g
$ sudo n install 11.15.0
$ node -v
v11.15.0
$

続けて、Node-REDのインストールとセットアップです。Raspberry Pi起動後に自動起動できるよう、nodered.serviceを設定しました。

$ sudo npm install -g --unsafe-perm node-red
$ sudo wget https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/nodered.service -O /lib/systemd/system/nodered.service
$ sudo wget https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/node-red-start -O /usr/bin/node-red-start
$ sudo wget https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/node-red-stop -O /usr/bin/node-red-stop
$ sudo chmod +x /usr/bin/node-red-st*
$ sudo systemctl daemon-reload
$ sudo systemctl enable nodered.service
$ sudo systemctl restart nodered.service

この実行により、ブラウザで「http://<raspberry pi ホスト>:1880」を開くと、Node-REDのエディタにアクセスできます。

AlexaとNode-REDとの連携

連携には「Node-RED Alexa Home Skill Bridge」を使います。 これを使うことで、Alexaアプリから指示した内容が本連携を通じて、Raspberry PiでポーリングしているNode-RED上でその内容を受け取ることができます。

まだ登録していない場合は画面上にある「Register」で登録します。ユーザー名、メールアドレス、パスワードを登録する非常にシンプルな方法です。

登録後、そのままログインできますので、画面上のメニューバーにある「Devices」をクリックします。

まだ何も登録されていないので、「Add Device」で「エアコン」を登録してみます。「Actions」はOnとOffのみですので、2つにチェックします。

Descriptionは説明を入れます(入れないと登録できないようです)

次のように登録されればこの設定としては完了です。

「node-red-contrib-alexa-home-skill」のインストールと設定

「Node-RED Alexa Home Skill Bridge」とNode-REDを連携するために、Node-RED側の追加ノードである「node-red-contrib-alexa-home-skill」をインストールします。

Node-REDエディタの画面右から「パレットの管理」をクリックして、ノードの追加タブより「node-red-contrib-alexa-home-skill」で検索してヒットしたノードをインストールします。

インストールに成功すると、画面左のノードで「alexa」で検索すると、2つの追加ノードを確認できます。

これらのノードを使って、設定した例がこちらです。Node-REDでのフロー実装方法については割愛しますが、今回追加した2つのノード(インプットである「alexa – home」とアウトプットである「alexa – home – resp」)を使用しています。

msg.payloadノードはデバッグ用です

「switch」ノードにて、連携されるmsg.payloadが「true」か「false」のどちらとなります。ONの場合は「true」ですので、1番(「turn:on」のexecノード)へ、OFFの場合は「false」ですので、2番(「turn:off」のexecノード)へルーティングします。

execノードではRaspberry Piで実行するスクリプトを設定します。例では、2つの引数(記録先のファイル名とタグ)を指定する「launcher.sh」のシェルを介して実行するようにしています。

このシェルの中で、先ほどの「赤外線受信・送信の実装とテスト」での赤外線受信時のテストで記録した時のファイル名とタグ(turn:onとturn:off)を使用します。

上記スクリーンショットでは、「turn:on」のexecノードの例となりますので、もう1つの「turn:off」のノードも同じように設定します。

設定が完了したら、「デプロイ」をして有効にします。

AlexaアプリのインストールとNode-REDスキルの有効化

Alexaのアプリをお持ちのスマートフォンのOSに合わせてApple StoreやGoole Playなどからインストールします。

インストール後、Alexaアプリを起動し、「スキルとゲーム」から「node-red」を検索して有効にするか、次のリンク先のスキル詳細から有効にします。

スキルを有効化する際に、「Node-RED Alexa Home Skill Bridge」へのログインが求められますので、設定を行なったユーザーで接続します。

デバイスの登録

接続し、有効化するとデバイスの自動検出(接続したユーザーの設定を参照し、検出)を行い、設定したデバイス、今回の例では「エアコン」が検出され、デバイス登録されます。

「端末の検出」をタップ

デバイス自動検出によって、登録した設定をデバイスとして検出できます

登録されたので、「1台のその他を検出しました」の「表示」をタップします

デバイスの一覧から設定したもの(例では「エアコン」)をタップします

登録されたデバイス(例では「エアコン」)をタップすると、「オン」と「オフ」の2つのボタンがあります。「オン」と「オフ」をそれぞれタップし、Raspberry Piからの赤外線発光が動いてエアコンが制御できれば完了です。

実際の動き

エアコンのON、OFFの動きはこちらの動画を見てください。動画での説明通りですが、タップのタイミングによってはNode-RED側での受信検知タイミングによってはうまく検知できない場合があるようです。

振り返り

今回は単純なオン/オフの操作でしたが、これを応用すると、例えば温度調整を指示したり、赤外線リモコンで動作するシーリングライトでも同じような設定を行うことで、点灯/消灯もできるようになります。この場合は調光の設定もあるようですので、より多彩な操作も「Node-RED Alexa Home Skill Bridge」を使ってできると思います。

一方で課題なのは、動画でもあったように受信タイミングによっては1回で検知してくれない点、あとは最近は赤外線を使う機器が少なくなってきているので、そもそも自宅でこれを使う機器がエアコンとシーリングライトぐらいしかない、というところでしょうか。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です