赤外線(IR)リモコン制御をESPHomeを使ったデバイスで行う際に、IRrecvDemoV3 で解析したデータをどのように記述すべきかで手間取ったので、記録を残しておく。
IRrecvDemoV3
手元にあるリモコンの電源をM5Stack Atom Lite で制御しようとして、まず、リモコンの赤外線の信号を解析した。解析には、よく使われているような IRremoteESP8266 ( https://github.com/crankyoldgit/IRremoteESP8266 ) ライブラリを使うことにした。
IRremoteESP8266に含まれる IRrecvDumpV3 を使って赤外線信号を解析した。
電源ボタンの解析結果
解析をしたところ次の結果が得られた。NECフォーマットであることが解析からわかった。
1 2 3 4 5 6 7 8 9 |
Timestamp : 000287.662 Library : v2.8.6 Protocol : NEC Code : 0x1FE817E (32 Bits) uint16_t rawData[71] = {9050, 4502, 588, 580, 560, 578, 560, 578, 562, 576, 562, 576, 562, 576, 562, 576, 562, 1690, 562, 1688, 562, 1692, 560, 1690, 564, 1690, 560, 1692, 560, 1668, 584, 1692, 560, 576, 560, 1668, 586, 578, 562, 578, 558, 580, 560, 578, 560, 580, 560, 578, 562, 1668, 582, 578, 560, 1692, 560, 1696, 556, 1688, 564, 1690, 560, 1692, 560, 1692, 560, 578, 560, 39982, 9056, 2274, 562}; // NEC 1FE817E uint32_t address = 0x80; uint32_t command = 0x81; uint64_t data = 0x1FE817E; |
ESPhome の transmit_necのパラメータ
NECフォーマットであることが解析からわかったので、ESPHome では、remote_transmitter.transmit_nec を利用すればよいことがわかった。
しかし、ここからaddress:、 command: にどのように指定すべきかに試行錯誤と時間を要した。
結果的には次のように指定すればよかった。
1 2 3 |
- remote_transmitter.transmit_nec: address: 0x7F80 # デバイス (~0x80<<8 | 0x80) command: 0x7E81 # 電源ボタン (~0x81<<8 | 0x81) |
アドレス、コマンドをそれぞれ1バイトの a, c とすると address: には ((~a<<8) | a)、command: には ((~c<<8)|c)を指定すればよいことがわかった。
上記の電源ボタンの場合には、uint32_t address = 0x80; uint32_t command = 0x81; であることから a=0x80、c=0x81 として上記のように指定すればよいことになる。