SwitchBotとESP32と汎用リモコンで作るスマート家電

SwitchBotとESP32と汎用リモコンで、スマート家電システムを作成します。
全体構成は以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/6a9fe029-6981-214b-98dd-aa477d162ad8.png)

いくつか補足します。
SwitchBotハブミニには、任意の赤外線信号を記憶し、送信することができます。また、AlexaやActions on Googleのようなスマートスピーカにも対応しているため、それだけで発話やスマホから連携して家電を制御できます。
汎用赤外線リモコンからも、任意の家電を操作できるようにしました。そのために、ESP32を仲介させています。SwitchBotは、WebAPIも公開しているため、ESP32→Node.jsサーバ→SwitchBotという流れが実現できます。
ちなみに、ESP32にGrove端子で接続できる赤外線送受信ユニットを使う場合は、赤外線信号の送信・受信の範囲が狭いため、赤外線受信リピータをフロントに設けることで、格段に受信範囲が広くなります。
Android上にウィジェットを置いて、タッチすることで家電を操作することもできます。

ソースコードもろもろはGitHubに上げておきました。

poruruba/IrRemoconSystem

https://github.com/poruruba/IrRemoconSystem

# 利用した機材

〇SwitchBotハブミニ

https://www.switchbot.jp/products/switchbot-hub-mini

〇SwitchBotリモートボタン

https://www.switchbot.jp/products/switchbot-remote

〇M5StickC Plus(ESP32での例)

https://www.switch-science.com/products/6470

〇ESPr IR 赤外線リモコン(ESP8266での例)

https://www.switch-science.com/products/2740

〇M5Stack用赤外線送受信ユニット

https://www.switch-science.com/products/5699?_pos=25&_sid=8898eafbf&_ss=r

〇汎用赤外線リモコン例

https://www.amazon.co.jp/ELPA-%E5%A4%A7%E3%81%8D%E3%81%AA%E3%83%9C%E3%82%BF%E3%83%B3%E3%81%A7%E6%8A%BC%E3%81%97%E3%82%84%E3%81%99%E3%81%95%E3%81%A8%E8%A6%8B%E3%82%84%E3%81%99%E3%81%95%E3%82%92%E8%BF%BD%E6%B1%82-%E5%9B%BD%E5%86%85%E4%B8%BB%E8%A6%81%E3%83%A1%E3%83%BC%E3%82%AB%E3%83%BC%E5%AF%BE%E5%BF%9C-IRC-202T-BK/dp/B015DVZH3U/ref=sr_1_8

〇赤外線受信リピータ例

https://www.amazon.co.jp/Alioay-%E8%B5%A4%E5%A4%96%E7%B7%9A%E3%83%AA%E3%83%A2%E3%82%B3%E3%83%B3%E3%83%AA%E3%83%94%E3%83%BC%E3%82%BF%E3%83%BC-%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%86%E3%83%B3%E3%83%80%E3%83%BC%E3%83%AA-%E8%B5%A4%E5%A4%96%E7%B7%9A%E3%83%AA%E3%83%A2%E3%82%B3%E3%83%B3%E6%8E%A5%E5%8F%8E%E5%99%A8-USB%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF%E3%83%BC/dp/B07HMJPGKR/ref=psdc_16462081_t2_B09DSWDFGK

# できること

①	スマートスピーカから家電を操作する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/9ab95420-ba7a-949f-72a8-f74a3a9a2df4.png)

SwitchBot標準の機能ですね。
スマホのSwitchBotアプリケーションからHub Mini B4を選択して、リモコンを追加から家電の赤外線リモコンの信号を学習すればよいです。

②	SwitchBotリモートボタンから家電を操作する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/95118f35-3da9-f0f9-1615-b51e1a8467f4.png)

これもSwitchBot標準の機能です。
スマホのSwitchBotアプリケーションからシーンを作成して、学習したリモコン信号を割り当てたのち、Remote DCを選択して、2つあるボタンのうちいずれかにシーンを割り当てればよいです。

③	汎用赤外線リモコンから家電を操作する（SwitchBot経由）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/ba846b6d-19d0-7915-9cb3-6f7a2c684511.png)

Node.jsサーバは、UDPでパケット受信を待ち受けています。ESP32から、受信した赤外線信号の情報、または、ESP32のモジュールについているボタン押下の情報が送られてきます。それをもとに、対応する処理を実行しています。
一方で、対応する処理は、SPAの管理Webページを用意していてそこから設定します。対応する処理として、SwitchBotのWebAPI呼び出しを実施するようにできます。

SwitchBotのWebAPI呼び出しは以下を参考にしてください。

（参考）
　[市販の汎用赤外線リモコンをスマートリモコンにする](https://qiita.com/poruruba/items/562ba92ada347b826e18)

④	Androidスマホから家電を操作する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/9b3bc38c-8737-ffea-2cfc-e1e4185471e7.png)

Node.jsサーバでは、UDPでの送信パケットと同じように、TCPでのHTTP Post（JSON）呼び出しでも行えるようにWebAPIを提供しています。なので、以下で作成したウィジェットから固定のHTTP Post（JSON）を呼ぶようにして連携させています。

（参考）
　[Androidのホーム画面にウィジェットを配置しよう](https://qiita.com/poruruba/items/bdd65adfde7b11ba47f7)

⑤	汎用赤外線リモコンから直接家電を操作する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/6efc84b8-9910-5493-d9f8-8c129e878d90.png)

Web管理コンソールからの設定により、SwitchBotを介さずに、直接ESP32の赤外線送受信ユニットから、家電のリモコン信号を送出することもできますが、赤外線送受信ユニットの赤外線送信信号はあまり強くなく、範囲は狭いです。

ちょっと補足します。
赤外線信号の識別は、Arduino側のライブラリがやってくれますが、割と意図しない種類に誤検出します。ただ、信号の判別としてはこれで十分です。decode_type、address、commandで判別できます。しかしながら、赤外線信号送信に復元する場合にはダメなので、生の信号(rawbuf)を覚えておき、ESP32からの直接の赤外線送信時にはこっちのrawbufを使います。

上記のために、ESP32側も赤外線送信要求を待ち受けるため、UDPパケットを受信待ちにしています。

# 詳細は、、、

詳細は、GitHubに上げたソースコードを参照してください。
大した処理ではないです。。。

以上