Mimicking an RC-300 with an ESP 360 Remote.
I have a natural gas Heat & Glo fireplace/stove that is responsible for heating the main living areas of my house. That fireplace is operated by an RC300 Radio Frequency(RF) remote that unfortunately does not have a scheduling feature. So in cold months, the morning ritual has been to go downstairs and turn the fireplace on in the morning and patiently wait for the area to warm up.
I’ve always wanted to get this fireplace onto a timer of some sort, but couldn’t figure out how I’d do that until I came across an advertisement for a new device called the ESP360 Remote on CrowdSupply. The ESP360 Remote is an ESP32 dev board with Infrared(IR) and RF modules added on. I excitedly ordered one this summer and waited for the device to show up.
While I did study Amateur Radio years ago (call sign KC8CBY!), I really had no idea how to go about replicating the signals from this RC300 remote. I learned a fair amount in the process, so I thought I’d share what I figured out along the way. While the details of the RC300 are interesting, this is written with hope that it’ll help someone else impersonate a different device.
Similar techniques should work with other microprocessor dev boards that run ESPHome and have RF modules, but the ESP360 Remote is a nice package to start with.
I’ve written this as a serial log, but the actual process of figuring these things out was circuitous. I wandered down a number of wrong paths before figuring this out and hope this article will save someone else some trouble. I did try to leave in the useful messy details, this is just a slightly less messy version of my actual discovery process.
Thanks to the ESP360 Remote Discord Community for helping out along the way.
The RC300 Operating Frequency
The first thing to figure out about a remote like this is what frequency it operates on.
In this case, I was able to look inside the battery compartment of the remote to see an FCC ID of ULE-RC300.
I searched for ULE-RC300 and a website called fccid.io told me that the frequency range is 433.91 MHz.
After the fact, I was able to find the source of that information at https://apps.fcc.gov/oetcf/eas/reports/GenericSearch.cfm by searching for a Grantee Code of ULE
and Product Code of -RC300
.
Since the frequency of the RC300 is in the 433 MHz range, the RF module included with the ESP360 Remote allows me to receive data from the RC300 and hopefully transmit data as if it was the RC300.
ESPHome
ESPHome is an awesome tool to install custom firmware onto mirocontrollers with nice abstractions over the types of IO that microcontrollers are good at. ESPHome is designed to work with Home Assistant, so devices can interoperate with the rest of a smart home.
There are a variety of ways to load custom firmware onto the device. After experimenting with a couple of them, I found that the command line interface worked best for the types of discovery that I needed to do.
ESPHome publishes good instructions on installing ESPHome, but the short version is that it’s a Python egg called esphome
that you can install with pip
.
Running Firmware
Once ESPHome was installed onto my computer, I needed to have it build and install firmware onto my ESP360 Remote.
The ESP-360-REMOTE project conveniently hosts a starting template, so that was a place to start.
At first, the only change I made was to change the WIFI ssid
and password
so that the device would join my network.
After plugging the ESP360 Remote into my computer, I was able to install the ESPHome firmware onto it with the command esphome run esp360-default-1.yaml
.
With that run
command, ESPHome compiled my template into a ESP32 firmware file, uploaded it to the device, reset the device, and started printing the serial output of the device.
The output starts with esphome running and starting to compile my project:
1$ esphome run template.yml
2INFO ESPHome 2023.11.0
3INFO Reading configuration template.yml...
4WARNING GPIO5 is a strapping PIN and should only be used for I/O with care.
5Attaching external pullup/down resistors to strapping pins can cause unexpected failures.
6See https://esphome.io/guides/faq.html#why-am-i-getting-a-warning-about-strapping-pins
7WARNING GPIO12 is a strapping PIN and should only be used for I/O with care.
8Attaching external pullup/down resistors to strapping pins can cause unexpected failures.
9See https://esphome.io/guides/faq.html#why-am-i-getting-a-warning-about-strapping-pins
10INFO Generating C++ source...
11INFO Compiling app...
12Processing esphome-web-73e05c (board: esp32dev; framework: arduino; platform: platformio/[email protected])
13-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
14HARDWARE: ESP32 240MHz, 320KB RAM, 4MB Flash
15 - toolchain-xtensa-esp32 @ 8.4.0+2021r2-patch5
16Dependency Graph
17|-- AsyncTCP-esphome @ 2.0.1
18|-- WiFi @ 2.0.0
19|-- FS @ 2.0.0
20|-- Update @ 2.0.0
21|-- ESPAsyncWebServer-esphome @ 3.1.0
22|-- DNSServer @ 2.0.0
23|-- ESPmDNS @ 2.0.0
24|-- Wire @ 2.0.0
25|-- ArduinoJson @ 6.18.5
26|-- noise-c @ 0.1.4
27Compiling .pioenvs/esphome-web-73e05c/src/main.cpp.o
28Linking .pioenvs/esphome-web-73e05c/firmware.elf
29RAM: [= ] 12.7% (used 41608 bytes from 327680 bytes)
30Flash: [===== ] 54.3% (used 997021 bytes from 1835008 bytes)
31Building .pioenvs/esphome-web-73e05c/firmware.bin
32Creating esp32 image...
33Successfully created esp32 image.
34esp32_create_combined_bin([".pioenvs/esphome-web-73e05c/firmware.bin"], [".pioenvs/esphome-web-73e05c/firmware.elf"])
35Wrote 0x104d30 bytes to file /Users/ryan.fowler/Projects/ESP-360-REMOTE/.esphome/build/esphome-web-73e05c/.pioenvs/esphome-web-73e05c/firmware-factory.bin, ready to flash to offset 0x0
36============================================================================ [SUCCESS] Took 7.38 seconds ============================================================================
37INFO Successfully compiled program.
Then esphome, starts uploading the firmware to the ESP360 Remote device.
1esptool.py v4.6.2
2Serial port /dev//cu.usbserial-10
3Connecting...
4Failed to get PID of a device on /dev//cu.usbserial-10, using standard reset sequence.
5....
6Chip is ESP32-D0WD-V3 (revision v3.1)
7Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
8Crystal is 40MHz
9MAC: 08:b6:1f:73:e0:5c
10Uploading stub...
11Running stub...
12Stub running...
13Changing baud rate to 460800
14Changed.
15Configuring flash size...
16Auto-detected Flash size: 8MB
17Flash will be erased from 0x00010000 to 0x00104fff...
18Flash will be erased from 0x00001000 to 0x00005fff...
19Flash will be erased from 0x00008000 to 0x00008fff...
20Flash will be erased from 0x0000e000 to 0x0000ffff...
21Compressed 1002800 bytes to 659614...
22Wrote 1002800 bytes (659614 compressed) at 0x00010000 in 17.0 seconds (effective 472.2 kbit/s)...
23Hash of data verified.
24Warning: Image file at 0x1000 is protected with a hash checksum, so not changing the flash size setting. Use the --flash_size=keep option instead of --flash_size=8MB in order to remove this warning, or use the --dont-append-digest option for the elf2image command in order to generate an image file without a hash checksum
25Compressed 17440 bytes to 12128...
26Wrote 17440 bytes (12128 compressed) at 0x00001000 in 0.6 seconds (effective 229.1 kbit/s)...
27Hash of data verified.
28Compressed 3072 bytes to 144...
29Wrote 3072 bytes (144 compressed) at 0x00008000 in 0.1 seconds (effective 327.6 kbit/s)...
30Hash of data verified.
31Compressed 8192 bytes to 47...
32Wrote 8192 bytes (47 compressed) at 0x0000e000 in 0.1 seconds (effective 520.4 kbit/s)...
33Hash of data verified.
34
35Leaving...
Finally, it resets the device, and starts printing the device log:
1Hard resetting via RTS pin...
2INFO Successfully uploaded program.
3INFO Starting log output from /dev//cu.usbserial-10 with baud rate 115200
4[08:44:20][I][logger:326]: Log initialized
5[08:44:20][C][ota:473]: There have been 0 suspected unsuccessful boot attempts.
6[08:44:20][D][esp32.preferences:114]: Saving 1 preferences to flash...
7[08:44:20][D][esp32.preferences:143]: Saving 1 preferences to flash: 0 cached, 1 written, 0 failed
8[08:44:20][I][app:029]: Running through setup()...
9[08:44:20][I][i2c.arduino:183]: Performing I2C bus recovery
10[08:44:20][C][switch.gpio:011]: Setting up GPIO Switch 'Status Led'...
11[08:44:20][D][switch:012]: 'Status Led' Turning ON.
12[08:44:20][D][switch:055]: 'Status Led': Sending state ON
13[08:44:20][D][switch:012]: 'Status Led' Turning ON.
14[08:44:20][D][template.switch:046]: Restored state OFF
15[08:44:20][C][shtcx:028]: Setting up SHTCx...
16[08:44:20][C][shtcx:056]: Device identified: SHTC3 (0887)
17[08:44:20][C][bh1750.sensor:041]: Setting up BH1750 'BH1750 Illuminance'...
18[08:44:20][W][remote_base:019]: Not enough RMT memory blocks available, reduced to 1 blocks.
19[08:44:20][C][remote_receiver.esp32:013]: Setting up Remote Receiver...
20[08:44:20][C][remote_receiver.esp32:013]: Setting up Remote Receiver...
21[08:44:20][C][wifi:038]: Setting up WiFi...
22[08:44:20][C][wifi:051]: Starting WiFi...
23[08:44:20][C][wifi:052]: Local MAC: 08:B6:1F:73:E0:5C
24[08:44:21][D][wifi:441]: Starting scan...
25[08:44:21][I][remote.raw:041]: Received Raw: -626, 303, -325, 336, -460, 326
26[08:44:21][I][remote.raw:041]: Received Raw: 2139, -563, 521, -3758, 553
27[08:44:21][I][remote.raw:041]: Received Raw: 357
28[08:44:21][D][shtcx:100]: Got temperature=23.76°C humidity=20.23%
29[08:44:21][D][sensor:094]: 'Temperature': Sending state 20.06259 °C with 1 decimals of accuracy
30[08:44:21][D][sensor:094]: 'Humidity': Sending state 39.33315 % with 1 decimals of accuracy
31[08:44:21][I][remote.raw:041]: Received Raw: 417
32[08:44:21][I][remote.raw:041]: Received Raw: 1945
33[08:44:21][I][remote.raw:041]: Received Raw: -1336
34[08:44:21][I][remote.raw:041]: Received Raw: 3052
35[08:44:21][I][remote.raw:041]: Received Raw: 1282, -1066
36[08:44:21][D][bh1750.sensor:159]: 'BH1750 Illuminance': Got illuminance=57.0lx
37[08:44:21][D][sensor:094]: 'BH1750 Illuminance': Sending state 285.23618 lx with 1 decimals of accuracy
38[08:44:22][I][remote.raw:041]: Received Raw: -451, 557, -614, 1131
39[08:44:22][I][remote.raw:041]: Received Raw: 2239
40[08:44:22][I][remote.raw:041]: Received Raw: 1124
41[08:44:22][I][remote.raw:041]: Received Raw: 558
42[08:44:22][I][remote.raw:041]: Received Raw: 336
43[08:44:22][I][remote.raw:041]: Received Raw: 335
44[08:44:22][D][bh1750.sensor:159]: 'BH1750 Illuminance': Got illuminance=57.2lx
45[08:44:22][D][sensor:094]: 'BH1750 Illuminance': Sending state 285.80212 lx with 1 decimals of accuracy
46[08:44:22][I][remote.raw:041]: Received Raw: 334
47[08:44:23][D][bh1750.sensor:159]: 'BH1750 Illuminance': Got illuminance=57.2lx
48[08:44:23][D][sensor:094]: 'BH1750 Illuminance': Sending state 285.80212 lx with 1 decimals of accuracy
Eventually in the logs, I saw the device join my WIFI network. Once joining WIFI is successful, the device logs its IP address among other network details. Since http server was enabled in the template yaml, I was able to access the ESPHome web interface at that IP address.
1[08:50:45][C][wifi:559]: WiFi:
2[08:50:45][C][wifi:391]: Local MAC: 08:B6:1F:73:E0:5C
3[08:50:45][C][wifi:396]: SSID: 'F'
4[08:50:45][C][wifi:397]: IP Address: 192.168.99.23
5[08:50:45][C][wifi:399]: BSSID: 10:DA:43:6F:EE:E8
6[08:50:45][C][wifi:400]: Hostname: 'esphome-web-73e05c'
7[08:50:45][C][wifi:402]: Signal strength: -63 dB ▂▄▆█
8[08:50:45][C][wifi:406]: Channel: 4
9[08:50:45][C][wifi:407]: Subnet: 255.255.255.0
10[08:50:45][C][wifi:408]: Gateway: 192.168.99.1
11[08:50:45][C][wifi:409]: DNS1: 192.168.99.1
12[08:50:45][C][wifi:410]: DNS2: 0.0.0.0
13[08:50:45][C][logger:416]: Logger:
14[08:50:45][C][logger:417]: Level: DEBUG
15[08:50:45][C][logger:418]: Log Baud Rate: 115200
16[08:50:45][C][logger:420]: Hardware UART: UART0
Control the Status Light!
As you can see in the above web interface, the table on the left has sensor and switch rows. The Humidity and Temperature rows show the values that sensors on the ESP360 are detecting. The Status Led row has a control that lets me toggle the status light on and off. When I toggle the Status Led, the ESPHome logs show as much and a little blue LED turns on and off at my command.
1[09:02:14][D][switch:016]: 'Status Led' Turning OFF.
2[09:02:14][D][switch:055]: 'Status Led': Sending state OFF
Detecting IR Remote Data
While the mimicking the RC300 was my primary goal, I struggled quite a bit with figuring out how to make the ESP360 Remote replicate the RC300. It was much easier to mimic my Panasonic TV IR Remote, so I want to demonstrate that before diving into the nitty gritty of an RF protocol.
While watching the logs of my ESP360 Remote, if I point my Panasonic IR Remote at the ESP 360 Remote and hit the power button, the following content prints out:
1[09:26:31][I][remote.pronto:237]: Received Pronto: data=0000 006D 0032 0000 0086 0042 0012 0010 0012 0032 0012 0010 0011 0010 0012 0010 0011 0010 0011 0010 0011 0010 0011 0010 0011 0010 0012 0010 0012 0010 0011 0010 0011 0032 0012 0010 0011 0010 0011 0010 0012 0010 0012 0010 0011 0010
2[09:26:31][I][remote.pronto:239]: 0011 0010 0011 0010 0012 0010 0011 0032 0011 0010 0012 0010 0012 0010 0012 0010 0012 0010 0011 0010 0011 0010 0012 0010 0011 0032 0012 0010 0012 0032 0012 0032 0012 0032 0011 0032 0012 0010 0012 0010 0012 0032 0012 0010 0011 0032 0012 0032 0012 0032 0012 0032 0012 0010 0011 0032 0012 0181 06C3
3[09:26:31][I][remote.panasonic:070]: Received Panasonic: address=0x4004, command=0x0100BCBD
4[09:26:31][I][remote.aeha:099]: Received AEHA: address=0x4004, data=[0x01,0x00,0xBC,0xBD]
5[09:26:31][I][remote.pronto:237]: Received Pronto: data=0000 006D 0032 0000 0086 0042 0012 0010 0012 0032 0012 0010 0011 0010 0012 0010 0011 0010 0012 0010 0011 0010 0012 0010 0012 0010 0012 0010 0012 0010 0012 0010 0011 0032 0012 0010 0011 0010 0011 0010 0012 0010 0012 0010 0012 0010
6[09:26:31][I][remote.pronto:239]: 0012 0010 0012 0010 0011 0010 0012 0032 0012 0010 0012 0010 0012 0010 0011 0010 0012 0010 0011 0010 0011 0010 0011 0010 0011 0032 0012 0010 0012 0032 0012 0032 0012 0032 0012 0032 0012 0010 0012 0010 0012 0032 0012 0010 0012 0032 0012 0032 0012 0032 0012 0032 0012 0010 0012 0032 0012 0181 06C3
7[09:26:31][I][remote.panasonic:070]: Received Panasonic: address=0x4004, command=0x0100BCBD
8[09:26:31][I][remote.aeha:099]: Received AEHA: address=0x4004, data=[0x01,0x00,0xBC,0xBD]
9[09:26:31][I][remote.pronto:237]: Received Pronto: data=0000 006D 0032 0000 0086 0042 0012 0010 0012 0032 0012 0010 0012 0010 0011 0010 0011 0010 0011 0010 0011 0010 0012 0010 0011 0010 0012 0010 0011 0010 0011 0010 0012 0032 0012 0010 0011 0010 0011 0010 0012 0010 0012 0010 0011 0010
10[09:26:31][I][remote.pronto:239]: 0012 0010 0011 0010 0012 0010 0012 0032 0011 0010 0011 0010 0011 0010 0011 0010 0011 0010 0012 0010 0011 0010 0011 0010 0011 0032 0011 0010 0011 0032 0012 0032 0012 0032 0011 0032 0012 0010 0012 0010 0011 0032 0012 0010 0011 0032 0012 0032 0011 0032 0012 0032 0012 0010 0011 0032 0011 0181 06C3
11[09:26:31][I][remote.panasonic:070]: Received Panasonic: address=0x4004, command=0x0100BCBD
12[09:26:31][I][remote.aeha:099]: Received AEHA: address=0x4004, data=[0x01,0x00,0xBC,0xBD]
13[09:26:31][I][remote.pronto:237]: Received Pronto: data=0000 006D 0032 0000 0086 0042 0012 0010 0011 0032 0011 0010 0012 0010 0011 0010 0011 0010 0011 0010 0011 0010 0011 0010 0011 0010 0010 0011 0011 0010 0011 0010 0011 0032 0012 0010 0011 0010 0011 0010 0011 0010 0011 0010 0011 0010
14[09:26:31][I][remote.pronto:239]: 0011 0010 0011 0010 0011 0010 0011 0032 0011 0010 0011 0010 0011 0010 0012 0010 0011 0010 0011 0010 0011 0010 0011 0010 0011 0032 0012 0010 0011 0032 0012 0032 0012 0032 0012 0032 0012 0010 0011 0010 0011 0032 0011 0010 0011 0032 0012 0032 0012 0032 0011 0032 0011 0010 0012 0032 0011 0181 06C3
15[09:26:31][I][remote.panasonic:070]: Received Panasonic: address=0x4004, command=0x0100BCBD
16[09:26:31][I][remote.aeha:099]: Received AEHA: address=0x4004, data=[0x01,0x00,0xBC,0xBD]
Buried in the above listing, you can see Received Panasonic: address=0x4004, command=0x0100BCBD
repeated four times.
ESPHome also decoded the data as aeha and pronto, but since I knew that I was dealing with a Panasonic device, I bet that address and command are how I’d configure ESPHome to turn my TV on and off.
The details of ESPHome button configuration can be found on the ESPHome webpage.
Configuring my ESP360 Remote to send the power signal to my Panasonic TV was as simple as adding the "TV"
button to my ESPHome template.
Once the yaml is updated, I was able to use esphome run
again to compile the template and then control the TV power with the web interface of the ESP360 Remote.
1button:
2 - platform: template
3 name: "TV"
4 on_press:
5 remote_transmitter.transmit_panasonic:
6 transmitter_id: IR_TX
7 repeat:
8 times: 4
9 address: 0x4004
10 command: 0x100BCBD
Decoding RF Signals
Now things get interesting! The goal of this project has always been to mimic the RC300 remote so I can get the fireplace running before crawling out of bed. The next step in this process was to try to figure out what signal the remote sends when it’s trying to turn the fireplace on.
As with watching for the IR signals above, I watched the ESPHome logs as I pressed buttons on the RC300.
Unfortunately, I didn’t see much of interest in the logs when activating the RC300 remote.
Eventually, I discovered that the RF_RX
remote receiver could be configured to dump raw
messages rather than rc_switch
.
Changing that dump
value, resulted in an RF_RX
section that looks like the following.
1remote_receiver:
2 - id: RF_RX
3 pin:
4 number: GPIO5
5 inverted: true
6 dump: raw
7
8 tolerance: 25%
9 filter: 250us
10 idle: 4ms
11 buffer_size: 20kb
12 on_rc_switch:
13 - homeassistant.event:
14 event: esphome.rf_code_received
15 data:
16 protocol: !lambda 'return x.protocol;'
17 code: !lambda 'return x.code;'
After editing the yaml and using esphome run
with the above remote_receiver
config, I saw output like the following when I activated the remote:
1[15:22:16][I][remote.raw:028]: Received Raw: 440, -393, 407, -867, 436, -401, 1195, -897, 688, -420, 649, -417, 652, -894, 682, -894, 688, -420, 650, -420, 649, -417, 1456, -900, 684, -420, 652, -417, 650, -419, 651, -419, 648, -895, 686, -421, 645, -894, 1495, -421, 650, -421, 648,
2[15:22:16][I][remote.raw:028]: -891, 686, -893, 688, -420, 649, -421, 646, -897, 681, -895, 1493, -424, 648, -421, 650, -416, 654, -420, 649, -420, 650, -415, 654, -421, 645, -893, 1491, -899, 687, -421, 645, -893, 686, -422, 649, -420, 645, -895, 686, -894, 686, -421, 1458, -421,
3[15:22:16][I][remote.raw:041]: 645, -895, 689, -417, 648, -895, 683, -898, 683, -420, 652, -417, 649, -894
4[15:22:16][W][component:214]: Component remote_receiver took a long time for an operation (0.05 s).
5[15:22:16][W][component:215]: Components should block for at most 20-30ms.
6[15:22:16][I][remote.raw:028]: Received Raw: 436, -398, 407, -870, 436, -393, 1202, -895, 691, -421, 646, -419, 648, -891, 685, -895, 687, -421, 650, -419, 651, -415, 1457, -896, 686, -420, 653, -417, 649, -422, 649, -420, 648, -894, 686, -418, 649, -893, 1496, -421, 650, -420, 645,
7[15:22:16][I][remote.raw:028]: -894, 685, -895, 687, -420, 650, -416, 652, -890, 684, -897, 1492, -420, 654, -421, 648, -417, 653, -416, 654, -416, 653, -417, 651, -419, 648, -895, 1490, -895, 688, -421, 645, -893, 686, -420, 654, -416, 649, -891, 686, -893, 688, -420, 1458, -421,
8[15:22:16][I][remote.raw:041]: 646, -897, 686, -417, 649, -894, 682, -899, 686, -418, 652, -417, 648, -894
9[15:22:16][W][component:214]: Component remote_receiver took a long time for an operation (0.05 s).
10[15:22:16][W][component:215]: Components should block for at most 20-30ms.
11[15:22:16][I][remote.raw:028]: Received Raw: 3153, -883, 435, -394, 406, -872, 435, -397, 1200, -897, 686, -418, 653, -417, 648, -894, 686, -894, 687, -421, 648, -422, 648, -418, 1456, -900, 682, -421, 649, -420, 650, -416, 654, -420, 648, -891, 690, -416, 649, -894, 1496, -421, 650,
12[15:22:16][I][remote.raw:028]: -420, 645, -893, 687, -894, 687, -421, 649, -420, 647, -893, 685, -895, 1494, -423, 648, -421, 650, -416, 654, -416, 652, -418, 652, -417, 652, -418, 649, -893, 1491, -899, 687, -421, 644, -894, 686, -422, 648, -418, 648, -898, 682, -894, 687, -417,
13[15:22:16][I][remote.raw:041]: 1462, -421, 645, -898, 686, -417, 648, -891, 685, -900, 686, -417, 653, -416, 649, -891
14[15:22:16][W][component:214]: Component remote_receiver took a long time for an operation (0.05 s).
15[15:22:16][W][component:215]: Components should block for at most 20-30ms.
16[15:22:16][I][remote.raw:028]: Received Raw: 439, -397, 407, -868, 434, -397, 1199, -898, 687, -421, 649, -420, 645, -895, 685, -895, 686, -421, 650, -420, 650, -420, 1453, -895, 688, -419, 651, -418, 654, -416, 653, -417, 648, -895, 686, -421, 649, -891, 1496, -424, 649, -417, 648,
17[15:22:16][I][remote.raw:028]: -894, 683, -893, 689, -419, 653, -417, 648, -895, 682, -894, 1496, -426, 648, -421, 649, -421, 648, -422, 648, -421, 649, -417, 652, -418, 647, -895, 1491, -894, 691, -422, 643, -895, 688, -420, 649, -420, 649, -894, 682, -894, 689, -419, 1458, -426,
18[15:22:16][I][remote.raw:041]: 645, -893, 688, -420, 648, -891, 685, -895, 690, -417, 651, -424, 643, -890
19[15:22:16][W][component:214]: Component remote_receiver took a long time for an operation (0.05 s).
20[15:22:16][W][component:215]: Components should block for at most 20-30ms.
21[15:22:16][I][remote.raw:028]: Received Raw: 435, -398, 403, -871, 436, -396, 1202, -895, 687, -420, 651, -419, 648, -891, 686, -894, 686, -418, 653, -420, 651, -419, 1453, -895, 691, -421, 648, -422, 648, -418, 652, -418, 648, -893, 687, -417, 649, -894, 1496, -420, 653, -417, 649,
22[15:22:16][I][remote.raw:028]: -894, 683, -898, 686, -418, 652, -416, 649, -891, 685, -894, 1496, -422, 652, -417, 653, -417, 650, -419, 654, -416, 651, -419, 651, -418, 649, -894, 1491, -896, 686, -420, 649, -894, 687, -416, 653, -417, 650, -893, 686, -895, 686, -421, 1456, -420,
23[15:22:16][I][remote.raw:041]: 648, -894, 687, -420, 649, -894, 683, -893, 689, -420, 652, -418, 647, -891
24[15:22:16][W][component:214]: Component remote_receiver took a long time for an operation (0.05 s).
25[15:22:16][W][component:215]: Components should block for at most 20-30ms.
26[15:22:16][D][bh1750.sensor:159]: 'BH1750 Illuminance': Got illuminance=7.7lx
27[15:22:16][D][sensor:094]: 'BH1750 Illuminance': Sending state 38.48425 lx with 1 decimals of accuracy
28[15:22:16][I][remote.pronto:237]: Received Pronto: data=0000 006D 0001 0000 0006 0181 06C3
29[15:22:16][I][remote.pronto:237]: Received Pronto: data=0000 006D 0001 0000 0005 0181 06C3
30[15:22:16][I][remote.raw:028]: Received Raw: 432, -396, 407, -871, 436, -394, 1201, -899, 686, -417, 653, -417, 649, -889, 687, -895, 690, -421, 649, -416, 653, -418, 1457, -894, 688, -420, 653, -416, 654, -416, 653, -417, 648, -895, 686, -421, 645, -894, 1495, -422, 649, -420, 649,
31[15:22:16][I][remote.raw:028]: -894, 682, -894, 688, -420, 650, -420, 648, -890, 686, -895, 1495, -422, 648, -421, 650, -415, 655, -416, 653, -421, 649, -420, 650, -420, 645, -893, 1492, -894, 691, -421, 645, -893, 689, -424, 646, -418, 649, -891, 685, -895, 687, -420, 1458, -421,
32[15:22:16][I][remote.raw:041]: 649, -891, 690, -417, 649, -893, 683, -893, 691, -417, 653, -421, 645, -893
33[15:22:16][W][component:214]: Component remote_receiver took a long time for an operation (0.05 s).
34[15:22:16][W][component:215]: Components should block for at most 20-30ms.
35[15:22:16][I][remote.pronto:237]: Received Pronto: data=0000 006D 0002 0000 0005 0098 0004 0181 06C3
36[15:22:16][I][remote.pronto:237]: Received Pronto: data=0000 006D 0003 0000 0006 0019 0004 0074 0004 0181 06C3
37[15:22:16][I][remote.pronto:237]: Received Pronto: data=0000 006D 0002 0000 0005 00B9 0005 0181 06C3
38[15:22:16][I][remote.raw:028]: Received Raw: -890, 431, -399, 403, -874, 433, -396, 1201, -895, 691, -416, 653, -417, 648, -895, 683, -893, 688, -420, 653, -416, 653, -417, 1454, -879, 707, -420, 650, -420, 649, -417, 653, -420, 648, -886, 695, -412, 656, -892, 1496, -416, 653, -421,
39[15:22:17][I][remote.raw:028]: 647, -892, 684, -897, 686, -416, 655, -420, 645, -893, 684, -897, 1496, -416, 653, -418, 652, -417, 653, -416, 653, -417, 653, -417, 653, -416, 649, -894, 1491, -900, 684, -418, 649, -894, 688, -420, 651, -415, 649, -894, 685, -895, 686, -421, 1458,
40[15:22:17][I][remote.raw:041]: -418, 652, -890, 687, -420, 649, -894, 682, -896, 686, -420, 653, -413, 652, -895
41[15:22:17][W][component:214]: Component remote_receiver took a long time for an operation (0.05 s).
42[15:22:17][W][component:215]: Components should block for at most 20-30ms.
43[15:22:17][I][remote.pronto:237]: Received Pronto: data=0000 006D 0002 0000 0005 00EE 0004 0181 06C3
44[15:22:17][I][remote.pronto:237]: Received Pronto: data=0000 006D 0002 0000 0003 007C 0004 0181 06C3
45[15:22:17][I][remote.pronto:237]: Received Pronto: data=0000 006D 0001 0000 0006 0181 06C3
46[15:22:17][I][remote.pronto:237]: Received Pronto: data=0000 006D 0002 0000 0002 009E 0004 0181 06C3
47[15:22:17][I][remote.pronto:237]: Received Pronto: data=0000 006D 0002 0000 0006 00B1 0004 0181 06C3
48[15:22:17][I][remote.raw:028]: Received Raw: -890, 435, -394, 411, -866, 437, -393, 1202, -898, 688, -420, 649, -420, 649, -890, 686, -891, 691, -416, 657, -417, 649, -420, 1453, -900, 683, -421, 657, -411, 653, -417, 651, -419, 648, -899, 682, -417, 649, -894, 1495, -421, 650, -420,
49[15:22:17][I][remote.raw:028]: 645, -893, 687, -894, 687, -421, 649, -421, 643, -895, 683, -899, 1494, -418, 652, -418, 652, -416, 653, -417, 651, -419, 653, -416, 654, -416, 648, -895, 1491, -919, 663, -420, 646, -894, 689, -422, 649, -416, 649, -894, 682, -895, 690, -416, 1459,
50[15:22:17][I][remote.raw:041]: -420, 650, -890, 690, -416, 650, -893, 687, -891, 689, -417, 653, -418, 648, -894
51[15:22:17][W][component:214]: Component remote_receiver took a long time for an operation (0.05 s).
52[15:22:17][W][component:215]: Components should block for at most 20-30ms.
53[15:22:17][I][remote.pronto:237]: Received Pronto: data=0000 006D 0002 0000 0004 009B 0006 0181 06C3
54[15:22:17][I][remote.pronto:237]: Received Pronto: data=0000 006D 0001 0000 0007 0181 06C3
55[15:22:17][I][remote.pronto:237]: Received Pronto: data=0000 006D 0002 0000 0004 0083 0006 0181 06C3
56[15:22:17][I][remote.raw:041]: Received Raw: -284
57[15:22:17][I][remote.pronto:237]: Received Pronto: data=0000 006D 0002 0000 0002 0083 0004 0181 06C3
58[15:22:17][I][remote.raw:028]: Received Raw: -893, 432, -397, 407, -870, 436, -393, 1203, -898, 687, -416, 653, -417, 648, -895, 683, -893, 689, -419, 653, -416, 653, -413, 1457, -896, 690, -416, 653, -417, 653, -416, 654, -416, 649, -894, 688, -420, 648, -891, 1496, -420, 653, -417,
59[15:22:17][I][remote.raw:028]: 648, -890, 687, -894, 687, -420, 650, -420, 648, -895, 682, -894, 1496, -421, 651, -419, 648, -418, 653, -415, 654, -416, 653, -417, 653, -417, 650, -893, 1490, -895, 691, -417, 648, -895, 686, -421, 650, -420, 646, -893, 685, -895, 686, -418, 1461,
60[15:22:17][I][remote.raw:041]: -417, 650, -893, 687, -417, 652, -890, 686, -895, 686, -418, 653, -420, 647, -896
61[15:22:17][W][component:214]: Component remote_receiver took a long time for an operation (0.05 s).
62[15:22:17][W][component:215]: Components should block for at most 20-30ms.
63[15:22:17][I][remote.pronto:237]: Received Pronto: data=0000 006D 0002 0000 0006 00AA 0004 0181 06C3
64[15:22:17][I][remote.raw:041]: Received Raw: -1244, 3124, -464
65[15:22:17][I][remote.raw:041]: Received Raw: -200
66[15:22:17][I][remote.raw:028]: Received Raw: -885, 435, -398, 407, -866, 437, -396, 1200, -897, 687, -420, 650, -420, 646, -892, 684, -897, 687, -421, 649, -421, 648, -417, 1457, -895, 687, -420, 651, -419, 653, -417, 649, -421, 648, -891, 687, -419, 649, -894, 1496, -418, 653, -416,
67[15:22:17][I][remote.raw:028]: 649, -898, 682, -894, 686, -417, 654, -420, 645, -894, 686, -895, 1495, -418, 652, -418, 652, -416, 654, -416, 653, -416, 654, -416, 653, -417, 648, -895, 1491, -900, 685, -417, 648, -895, 686, -417, 654, -415, 650, -893, 687, -894, 687, -416, 1463,
68[15:22:17][I][remote.raw:041]: -417, 649, -893, 688, -420, 648, -890, 686, -895, 687, -417, 653, -415, 654, -889
This seemed promising, but I wasn’t sure what to make of it.
There were number of Received Raw
records, and they appeared to be pretty similar.1
I didn’t really know what I was doing, but ended up guessing at an ESPHome configuration that would repeat what the remote was doing.
My first try was to copy the raw data out of the last line of the above code listing (editing out the [15:22:17][I][remote.raw:028]:
prefixes), and repeating the message 11 times.
It looked like the following:
1button:
2 - platform: template
3 name: Fireplace On
4 on_press:
5 - remote_transmitter.transmit_raw:
6 repeat:
7 times: 11
8 transmitter_id: RF_TX
9 code: [-885, 435, -398, 407, -866, 437, -396, 1200, -897, 687, -420, 650, -420, 646, -892, 684, -897, 687, -421, 649, -421, 648, -417, 1457, -895, 687, -420, 651, -419, 653, -417, 649, -421, 648, -891, 687, -419, 649, -894, 1496, -418, 653, -416, 649, -898, 682, -894, 686, -417, 654, -420, 645, -894, 686, -895, 1495, -418, 652, -418, 652, -416, 654, -416, 653, -416, 654, -416, 653, -417, 648, -895, 1491, -900, 685, -417, 648, -895, 686, -417, 654, -415, 650, -893, 687, -894, 687, -416, 1463, -417, 649, -893, 688, -420, 648, -890, 686, -895, 687, -417, 653, -415, 654, -889]
Using esphome run
with the updated template let me press a button that said Fireplace On
but I unfortunately didn’t hear a beep or see the fire turn on.
A nice thing about the ESP 360 remote being both an RF receiver and transmitter is that I could see in the logs what the RF was receiving when I pressed the ESPHome button.
1[16:09:46][I][remote.pronto:237]: Received Pronto: data=0000 006D 0001 0000 0005 0181 06C3
2[16:09:46][I][remote.raw:028]: Received Raw: 383, -403, 830, -468, 401, -1169, 895, -691, 441, -630, 443, -625, 884, -687, 891, -692, 448, -630, 440, -624, 441, -1430, 894, -692, 444, -629, 440, -631, 440, -624, 445, -626, 884, -692, 444, -624, 887, -1499, 449, -630, 435, -630, 887,
3[16:09:46][I][remote.raw:028]: -689, 890, -691, 440, -631, 444, -621, 888, -691, 890, -1501, 441, -633, 437, -633, 433, -637, 435, -631, 439, -629, 442, -628, 440, -630, 885, -1492, 898, -687, 444, -626, 889, -691, 440, -634, 436, -629, 882, -694, 887, -694, 439, -1437, 445, -628,
4[16:09:46][I][remote.raw:041]: 885, -691, 446, -625, 880, -695, 890, -691, 440, -634, 436, -630
5[16:09:46][W][component:214]: Component remote_receiver took a long time for an operation (0.05 s).
6[16:09:46][W][component:215]: Components should block for at most 20-30ms.
7[16:09:46][I][remote.pronto:237]: Received Pronto: data=0000 006D 0001 0000 0004 0181 06C3
8[16:09:46][I][remote.raw:028]: Received Raw: -463, 402, -402, 834, -468, 399, -1172, 895, -691, 445, -629, 440, -625, 883, -693, 887, -694, 445, -626, 444, -625, 440, -1430, 891, -694, 445, -629, 440, -631, 439, -626, 445, -625, 884, -691, 441, -630, 885, -1499, 446, -630, 440, -628,
9[16:09:46][I][remote.raw:028]: 886, -690, 887, -694, 440, -631, 444, -624, 884, -693, 889, -1496, 446, -630, 440, -633, 435, -631, 440, -629, 436, -633, 441, -630, 439, -626, 888, -1493, 898, -691, 440, -625, 886, -695, 441, -633, 436, -626, 885, -694, 888, -693, 437, -1439, 448,
10[16:09:46][I][remote.raw:041]: -622, 886, -693, 443, -628, 882, -690, 891, -693, 440, -630, 436, -635
11[16:09:46][W][component:214]: Component remote_receiver took a long time for an operation (0.05 s).
12[16:09:46][W][component:215]: Components should block for at most 20-30ms.
13[16:09:46][I][remote.pronto:237]: Received Pronto: data=0000 006D 0001 0000 0003 0181 06C3
14[16:09:46][I][remote.raw:028]: Received Raw: -462, 403, -406, 834, -463, 407, -1166, 894, -695, 441, -629, 443, -626, 882, -690, 891, -694, 442, -629, 439, -630, 435, -1434, 891, -690, 450, -625, 442, -632, 435, -631, 441, -628, 881, -695, 445, -624, 887, -1499, 445, -629, 438, -627,
15[16:09:46][I][remote.raw:028]: 891, -690, 885, -691, 445, -630, 445, -620, 886, -695, 886, -1499, 445, -631, 439, -629, 440, -630, 435, -635, 436, -633, 437, -633, 437, -628, 886, -1495, 895, -695, 437, -628, 886, -690, 445, -630, 440, -625, 885, -692, 890, -690, 444, -1435, 441,
16[16:09:46][I][remote.raw:041]: -628, 885, -691, 447, -628, 881, -690, 890, -696, 437, -633, 440, -629
17[16:09:46][W][component:214]: Component remote_receiver took a long time for an operation (0.05 s).
18[16:09:46][W][component:215]: Components should block for at most 20-30ms.
19[16:09:46][I][remote.pronto:237]: Received Pronto: data=0000 006D 0001 0000 0004 0181 06C3
20[16:09:46][I][remote.raw:028]: Received Raw: -462, 402, -406, 833, -464, 404, -1169, 894, -691, 445, -628, 441, -626, 884, -687, 893, -691, 447, -628, 441, -629, 435, -1434, 891, -691, 444, -629, 442, -633, 437, -628, 440, -626, 884, -691, 446, -628, 885, -1501, 445, -629, 438, -627,
21[16:09:46][I][remote.raw:028]: 890, -691, 886, -690, 440, -635, 440, -625, 885, -691, 890, -1500, 445, -631, 439, -629, 437, -633, 437, -633, 436, -633, 436, -630, 439, -630, 885, -1497, 893, -691, 442, -628, 886, -690, 442, -633, 436, -629, 885, -692, 888, -693, 443, -1435, 440,
22[16:09:46][I][remote.raw:041]: -629, 885, -691, 445, -630, 880, -691, 890, -691, 445, -630, 436, -633
23[16:09:46][W][component:214]: Component remote_receiver took a long time for an operation (0.05 s).
24[16:09:46][W][component:215]: Components should block for at most 20-30ms.
25[16:09:46][I][remote.pronto:237]: Received Pronto: data=0000 006D 0001 0000 0004 0181 06C3
26[16:09:47][I][remote.raw:028]: Received Raw: -460, 406, -404, 834, -466, 402, -1169, 895, -691, 445, -629, 441, -624, 882, -690, 891, -691, 448, -626, 444, -625, 440, -1429, 895, -691, 443, -631, 441, -629, 440, -630, 440, -625, 885, -691, 442, -628, 887, -1498, 446, -633, 438, -627,
27[16:09:47][I][remote.raw:028]: 887, -689, 888, -690, 443, -630, 445, -621, 886, -690, 894, -1495, 446, -629, 440, -631, 439, -630, 439, -630, 440, -634, 432, -633, 440, -625, 886, -1496, 898, -691, 442, -624, 886, -694, 438, -637, 435, -629, 882, -695, 886, -691, 444, -1435, 444,
28[16:09:47][I][remote.raw:041]: -629, 882, -696, 440, -628, 883, -689, 892, -693, 441, -630, 439, -631
29[16:09:47][W][component:214]: Component remote_receiver took a long time for an operation (0.05 s).
30[16:09:47][W][component:215]: Components should block for at most 20-30ms.
31[16:09:47][I][remote.pronto:237]: Received Pronto: data=0000 006D 0001 0000 0004 0181 06C3
32[16:09:47][I][remote.raw:028]: Received Raw: -463, 403, -406, 835, -467, 399, -1172, 891, -691, 447, -627, 440, -629, 881, -691, 890, -692, 445, -628, 445, -626, 439, -1429, 890, -691, 448, -628, 444, -626, 440, -628, 440, -630, 881, -691, 445, -629, 886, -1499, 445, -631, 435, -628,
33[16:09:47][I][remote.raw:028]: 890, -688, 888, -693, 441, -632, 440, -625, 885, -692, 890, -1499, 442, -633, 440, -629, 437, -633, 437, -633, 440, -629, 436, -634, 440, -625, 886, -1491, 898, -692, 440, -629, 886, -690, 445, -631, 439, -626, 884, -691, 891, -691, 444, -1434, 445,
34[16:09:47][I][remote.raw:041]: -624, 886, -695, 442, -628, 882, -689, 890, -696, 440, -630, 436, -633
35[16:09:47][W][component:214]: Component remote_receiver took a long time for an operation (0.05 s).
36[16:09:47][W][component:215]: Components should block for at most 20-30ms.
37[16:09:47][I][remote.pronto:237]: Received Pronto: data=0000 006D 0001 0000 0005 0181 06C3
38[16:09:47][I][remote.raw:028]: Received Raw: -463, 402, -407, 833, -464, 404, -1168, 894, -691, 445, -626, 444, -625, 882, -689, 895, -691, 445, -629, 441, -629, 435, -1431, 893, -691, 445, -630, 440, -631, 440, -624, 445, -629, 880, -691, 445, -626, 889, -1497, 446, -632, 436, -628,
39[16:09:47][I][remote.raw:028]: 890, -688, 888, -688, 445, -633, 440, -625, 885, -691, 890, -1497, 445, -633, 435, -634, 436, -634, 436, -634, 435, -634, 436, -629, 441, -624, 890, -1492, 898, -691, 441, -624, 890, -691, 440, -631, 439, -630, 884, -692, 890, -691, 441, -1434, 445,
40[16:09:47][I][remote.raw:041]: -628, 886, -691, 446, -624, 884, -691, 890, -691, 442, -633, 436, -633
41[16:09:47][W][component:214]: Component remote_receiver took a long time for an operation (0.05 s).
42[16:09:47][W][component:215]: Components should block for at most 20-30ms.
43[16:09:47][I][remote.pronto:237]: Received Pronto: data=0000 006D 0002 0000 0004 0088 0004 0181 06C3
44[16:09:47][I][remote.raw:028]: Received Raw: -460, 402, -411, 830, -464, 403, -1168, 895, -691, 448, -625, 441, -629, 880, -691, 891, -690, 445, -629, 442, -628, 440, -1430, 891, -691, 448, -626, 444, -629, 440, -625, 442, -628, 883, -693, 441, -629, 885, -1500, 445, -634, 436, -625,
45[16:09:47][I][remote.raw:028]: 891, -686, 889, -692, 440, -633, 441, -625, 885, -695, 890, -1497, 441, -632, 441, -629, 436, -633, 438, -632, 440, -630, 437, -634, 435, -630, 885, -1494, 896, -694, 441, -626, 885, -694, 437, -633, 438, -628, 884, -691, 891, -695, 440, -1435, 440,
46[16:09:47][I][remote.raw:041]: -629, 885, -696, 441, -628, 882, -694, 886, -695, 440, -630, 437, -633
47[16:09:47][W][component:214]: Component remote_receiver took a long time for an operation (0.05 s).
48[16:09:47][W][component:215]: Components should block for at most 20-30ms.
49[16:09:47][I][remote.pronto:237]: Received Pronto: data=0000 006D 0002 0000 0007 008D 0006 0181 06C3
50[16:09:47][I][remote.raw:028]: Received Raw: -459, 404, -407, 833, -464, 403, -1167, 894, -696, 440, -630, 445, -620, 886, -686, 894, -692, 444, -629, 442, -629, 439, -1430, 891, -694, 442, -628, 445, -629, 436, -629, 442, -628, 881, -695, 440, -630, 885, -1501, 439, -635, 440, -625,
51[16:09:47][I][remote.raw:028]: 891, -690, 885, -692, 440, -633, 443, -622, 885, -696, 886, -1499, 445, -630, 438, -632, 436, -633, 439, -631, 437, -633, 437, -632, 437, -628, 885, -1496, 896, -691, 440, -628, 885, -692, 440, -634, 440, -625, 885, -692, 890, -691, 440, -1438, 441,
52[16:09:47][I][remote.raw:041]: -629, 885, -692, 448, -625, 881, -695, 885, -696, 437, -633, 440, -630
53[16:09:47][W][component:214]: Component remote_receiver took a long time for an operation (0.05 s).
54[16:09:47][W][component:215]: Components should block for at most 20-30ms.
55[16:09:47][I][remote.pronto:237]: Received Pronto: data=0000 006D 0002 0000 0004 0030 0004 0181 06C3
56[16:09:47][I][remote.raw:028]: Received Raw: -461, 404, -406, 833, -463, 403, -1169, 894, -696, 440, -630, 441, -624, 885, -686, 895, -691, 447, -627, 442, -623, 442, -1433, 889, -691, 445, -630, 441, -633, 437, -628, 443, -627, 880, -696, 440, -630, 885, -1500, 440, -635, 436, -629,
57[16:09:47][I][remote.raw:028]: 889, -688, 889, -692, 441, -632, 441, -624, 885, -691, 891, -1499, 442, -633, 440, -630, 437, -629, 443, -630, 437, -633, 435, -634, 438, -627, 885, -1496, 895, -691, 440, -629, 885, -691, 442, -633, 437, -628, 885, -691, 890, -691, 441, -1438, 441,
58[16:09:47][I][remote.raw:041]: -629, 885, -692, 448, -625, 881, -691, 891, -691, 443, -630, 435, -631
59[16:09:47][W][component:214]: Component remote_receiver took a long time for an operation (0.05 s).
60[16:09:47][W][component:215]: Components should block for at most 20-30ms.
61[16:09:47][I][remote.pronto:237]: Received Pronto: data=0000 006D 0002 0000 0006 0079 0003 0181 06C3
62[16:09:47][I][remote.raw:028]: Received Raw: -459, 409, -402, 833, -467, 401, -1171, 892, -693, 445, -626, 440, -629, 881, -690, 891, -695, 445, -624, 447, -623, 440, -1430, 892, -693, 444, -627, 442, -631, 438, -629, 443, -625, 885, -691, 445, -626, 884, -1502, 445, -628, 440, -626,
63[16:09:47][I][remote.raw:028]: 890, -690, 886, -695, 440, -630, 444, -625, 883, -693, 888, -1498, 445, -630, 439, -630, 440, -634, 436, -629, 437, -638, 431, -634, 437, -628, 886, -1494, 900, -691, 439, -627, 886, -693, 442, -628, 437, -633, 881, -691, 889, -696, 438, -1441, 440,
64[16:09:47][I][remote.raw:041]: -630, 881, -695, 442, -629, 880, -695, 887, -693, 442, -629, 439, -631
It was hard to tell why things weren’t working at this point. Eventually, I found a project called esphome-remote_receiver-oscilloscope at https://dbuezas.github.io/esphome-remote_receiver-oscilloscope/ that lets you visualize ESPHome Raw logs. When I enter the above logs into the oscilloscope, I see a visualization like the following:
Comparing that to the oscilloscope from my original RC300 Recording above, something did not look right. I expected to the transmitted and received signals to look about the same.
Eventually, I hypothesized that the original recording was the inverse of what I actually needed to transmit.
The RF_RX
definition in the ESPHome yaml had an inversed: True
section in there, I changed that to inversed: false
as follows.
1remote_receiver:
2 - id: RF_RX
3 pin:
4 number: GPIO5
5 inverted: false
6 dump: raw
7
8 tolerance: 35%
9 filter: 200us
10 idle: 4ms
11 buffer_size: 10kb
After making that change to the RF_RX remote receiver, and recording the RC-300 again, I got the following output:
1[16:43:48][I][remote.raw:028]: Received Raw: 884, -437, 396, -403, 870, -436, 397, -1199, 898, -687, 417, -652, 418, -647, 895, -685, 896, -686, 416, -654, 416, -653, 417, -1458, 894, -687, 416, -653, 418, -652, 416, -654, 417, -649, 893, -686, 422, -645, 893, -1497, 420, -653, 417,
2[16:43:48][I][remote.raw:028]: -648, 891, -685, 895, -686, 421, -650, 416, -649, 894, -686, 891, -1499, 418, -653, 415, -653, 417, -653, 416, -654, 416, -653, 417, -653, 417, -648, 891, -1494, 895, -686, 422, -646, 893, -690, 416, -654, 416, -649, 894, -682, 894, -687, 421, -1458,
3[16:43:48][I][remote.raw:041]: 417, -650, 893, -690, 417, -648, 891, -686, 894, -689, 418, -654, 411, -654, 894
4[16:43:48][I][remote.raw:028]: Received Raw: -436, 397, -407, 871, -435, 394, -1201, 896, -690, 417, -652, 418, -647, 891, -688, 892, -686, 417, -654, 417, -653, 420, -1450, 894, -691, 420, -655, 420, -649, 420, -651, 419, -645, 893, -691, 422, -643, 895, -1496, 422, -648, 421, -646,
5[16:43:48][I][remote.raw:028]: 892, -684, 893, -690, 418, -653, 420, -646, 892, -683, 895, -1494, 421, -653, 422, -646, 419, -653, 418, -648, 421, -650, 419, -653, 418, -646, 895, -1488, 898, -686, 422, -646, 892, -687, 425, -649, 416, -648, 891, -687, 893, -688, 420, -1458, 421,
6[16:43:48][I][remote.raw:041]: -648, 891, -687, 420, -648, 895, -682, 894, -687, 422, -652, 416, -648, 895
7[16:43:48][I][remote.raw:041]: Received Raw: -1194, 396
8[16:43:48][I][remote.raw:041]: Received Raw: 710, -2557
9[16:43:48][I][remote.raw:028]: Received Raw: -436, 394, -407, 871, -434, 397, -1200, 897, -688, 420, -653, 416, -649, 890, -686, 895, -686, 421, -650, 416, -652, 422, -1453, 894, -690, 414, -657, 416, -651, 416, -653, 420, -648, 890, -691, 418, -647, 895, -1495, 417, -653, 418, -648,
10[16:43:48][I][remote.raw:028]: 894, -686, 890, -691, 421, -648, 418, -649, 893, -684, 893, -1496, 420, -653, 417, -653, 418, -652, 416, -653, 417, -653, 413, -657, 416, -649, 889, -1494, 897, -686, 421, -645, 895, -690, 416, -653, 417, -648, 891, -685, 895, -687, 420, -1458, 418,
11[16:43:48][I][remote.raw:041]: -651, 891, -688, 419, -649, 891, -685, 896, -687, 419, -653, 417, -648, 891
12[16:43:48][I][remote.raw:028]: Received Raw: -436, 397, -403, 870, -436, 397, -1201, 896, -687, 420, -650, 420, -645, 893, -686, 891, -690, 418, -654, 416, -653, 420, -1453, 895, -687, 420, -650, 416, -655, 419, -649, 417, -649, 893, -691, 416, -649, 894, -1496, 416, -653, 422, -645,
13[16:43:48][I][remote.raw:028]: 893, -686, 891, -690, 418, -652, 421, -645, 893, -684, 897, -1494, 420, -652, 417, -652, 418, -652, 417, -653, 417, -652, 417, -653, 417, -648, 891, -1495, 895, -687, 416, -652, 895, -686, 421, -649, 416, -650, 893, -683, 893, -691, 418, -1458, 420,
14[16:43:48][I][remote.raw:041]: -650, 889, -690, 417, -649, 895, -685, 890, -691, 421, -649, 417, -648, 894
15[16:43:49][I][remote.raw:028]: Received Raw: -436, 397, -407, 866, -434, 399, -1198, 899, -686, 418, -652, 418, -648, 893, -684, 894, -686, 420, -653, 417, -653, 417, -1454, 894, -690, 421, -650, 420, -649, 416, -655, 416, -648, 894, -687, 420, -649, 891, -1496, 421, -652, 416, -649,
16[16:43:49][I][remote.raw:028]: 894, -683, 893, -689, 420, -651, 419, -647, 895, -681, 895, -1496, 421, -653, 416, -654, 416, -650, 420, -649, 416, -654, 420, -649, 421, -645, 893, -1491, 896, -686, 421, -648, 894, -688, 416, -653, 416, -649, 894, -686, 895, -686, 417, -1459, 420,
17[16:43:49][I][remote.raw:041]: -648, 895, -686, 421, -645, 893, -683, 898, -687, 417, -653, 421, -644, 894
18[16:43:49][I][remote.raw:028]: Received Raw: -431, 397, -408, 870, -436, 397, -1197, 900, -686, 418, -652, 416, -650, 890, -686, 895, -689, 417, -653, 417, -653, 417, -1454, 894, -690, 418, -652, 417, -652, 418, -652, 417, -649, 894, -686, 421, -645, 895, -1495, 417, -655, 418, -648,
19[16:43:49][I][remote.raw:028]: 891, -686, 894, -686, 422, -649, 417, -652, 894, -682, 895, -1495, 418, -652, 418, -652, 421, -648, 417, -654, 417, -652, 417, -652, 417, -648, 895, -1491, 894, -688, 420, -648, 890, -691, 422, -648, 418, -647, 895, -683, 894, -690, 416, -1459, 420,
20[16:43:49][I][remote.raw:041]: -649, 891, -690, 417, -649, 893, -686, 891, -690, 417, -653, 417, -648, 895
21[16:43:49][D][bh1750.sensor:159]: 'BH1750 Illuminance': Got illuminance=5.9lx
22[16:43:49][D][sensor:094]: 'BH1750 Illuminance': Sending state 29.42913 lx with 1 decimals of accuracy
23[16:43:49][I][remote.raw:028]: Received Raw: -438, 395, -404, 874, -431, 397, -1200, 897, -686, 422, -650, 419, -646, 893, -686, 895, -686, 416, -655, 420, -649, 417, -1454, 897, -686, 417, -655, 416, -653, 420, -650, 420, -645, 893, -690, 418, -648, 891, -1497, 420, -653, 420, -645,
24[16:43:49][I][remote.raw:028]: 893, -683, 895, -690, 416, -653, 417, -648, 891, -687, 893, -1497, 420, -651, 419, -653, 416, -650, 416, -654, 415, -654, 417, -653, 415, -650, 895, -1491, 894, -690, 418, -647, 894, -688, 420, -651, 415, -651, 891, -686, 891, -690, 417, -1462, 421,
25[16:43:49][I][remote.raw:041]: -645, 894, -691, 416, -649, 891, -685, 894, -692, 416, -652, 418, -648, 890
26[16:43:49][I][remote.raw:028]: Received Raw: -435, 398, -406, 870, -434, 395, -1202, 895, -689, 418, -653, 417, -648, 891, -687, 893, -687, 421, -653, 416, -651, 419, -1453, 895, -691, 416, -653, 417, -653, 417, -653, 416, -649, 894, -687, 416, -650, 893, -1496, 417, -654, 420, -645,
27[16:43:49][I][remote.raw:028]: 893, -686, 895, -686, 417, -654, 417, -648, 893, -683, 898, -1494, 418, -654, 416, -653, 417, -649, 420, -651, 414, -656, 419, -650, 420, -646, 893, -1495, 891, -689, 422, -647, 896, -686, 416, -654, 416, -649, 894, -682, 894, -688, 415, -1463, 421,
28[16:43:49][I][remote.raw:041]: -647, 891, -690, 418, -649, 894, -683, 893, -689, 418, -654, 416, -649, 894
29[16:43:49][I][remote.raw:041]: Received Raw: -588
30[16:43:49][I][remote.raw:028]: Received Raw: -438, 395, -408, 870, -432, 397, -1202, 895, -687, 420, -652, 418, -648, 895, -681, 895, -687, 420, -650, 420, -650, 416, -1457, 894, -688, 421, -650, 419, -653, 416, -654, 416, -649, 891, -689, 417, -650, 893, -1496, 421, -650, 420, -644,
31[16:43:49][I][remote.raw:028]: 895, -685, 895, -686, 421, -649, 421, -645, 893, -684, 897, -1496, 421, -650, 415, -653, 418, -652, 418, -652, 421, -648, 417, -653, 416, -649, 895, -1490, 895, -688, 420, -648, 891, -690, 421, -650, 415, -650, 893, -683, 894, -690, 417, -1460, 424,
32[16:43:49][I][remote.raw:041]: -644, 894, -686, 418, -650, 893, -685, 895, -686, 421, -650, 415, -653, 890
33[16:43:49][I][remote.raw:028]: Received Raw: -435, 393, -408, 870, -432, 396, -1203, 895, -690, 418, -652, 418, -648, 893, -683, 895, -686, 420, -653, 417, -651, 419, -1454, 894, -690, 422, -648, 416, -654, 417, -652, 417, -648, 891, -691, 420, -648, 891, -1495, 422, -653, 416, -649,
34[16:43:49][I][remote.raw:028]: 894, -683, 893, -692, 416, -653, 417, -648, 891, -685, 895, -1496, 421, -649, 416, -653, 416, -655, 420, -648, 418, -652, 421, -649, 416, -650, 893, -1492, 894, -688, 419, -649, 894, -687, 417, -653, 421, -644, 894, -686, 890, -691, 417, -1460, 419,
35[16:43:49][I][remote.raw:041]: -649, 894, -686, 421, -649, 891, -685, 894, -687, 421, -648, 422, -644, 895
36[16:43:50][I][remote.raw:028]: Received Raw: -434, 399, -403, 870, -436, 397, -1199, 898, -686, 421, -649, 417, -649, 893, -684, 892, -691, 422, -648, 421, -649, 416, -1458, 895, -686, 421, -651, 415, -654, 416, -654, 416, -648, 894, -687, 420, -649, 894, -1496, 421, -649, 417, -652,
37[16:43:50][I][remote.raw:028]: 890, -686, 895, -686, 418, -653, 420, -645, 893, -687, 894, -1492, 422, -653, 416, -654, 416, -653, 420, -649, 421, -650, 415, -653, 418, -647, 895, -1491, 894, -688, 420, -648, 895, -686, 421, -650, 420, -645, 893, -687, 894, -686, 418, -1458, 420,
38[16:43:50][I][remote.raw:041]: -650, 893, -688, 421, -647, 890, -686, 895, -687, 420, -650, 420, -646, 892
Which resulted in an oscilloscope visualization looking like this:
That visualization looked familiar! It it looks VERY similar to the (inverted) recording of my initial ESP360 Remote transmission. It turns out that if you invert a signal twice, you end up with the original :-).
This recording has several lines that look almost exactly the same. I picked L5 as my representative line and copied that into my button config. IT STILL DID NOT WORK.
I tried editing L5 to remove the short-long-short message from the beginning, that did not help either.
Eventually, I tried the data from L1
of above recording, thinking maybe the long signal at the beginning of the line might help.
The configuration after switching to L1
looked like this.
1button:
2 - platform: template
3 name: Fireplace On
4 on_press:
5 - remote_transmitter.transmit_raw:
6 repeat:
7 times: 11
8 transmitter_id: RF_TX
9 code: [884, -437, 396, -403, 870, -436, 397, -1199, 898, -687, 417, -652, 418, -647, 895, -685, 896, -686, 416, -654, 416, -653, 417, -1458, 894, -687, 416, -653, 418, -652, 416, -654, 417, -649, 893, -686, 422, -645, 893, -1497, 420, -653, 417, -648, 891, -685, 895, -686, 421, -650, 416, -649, 894, -686, 891, -1499, 418, -653, 415, -653, 417, -653, 416, -654, 416, -653, 417, -653, 417, -648, 891, -1494, 895, -686, 422, -646, 893, -690, 416, -654, 416, -649, 894, -682, 894, -687, 421, -1458, 417, -650, 893, -690, 417, -648, 891, -686, 894, -689, 418, -654, 411, -654, 894]
And FINALLY it worked! My Fireplace turned on! I’m not sure why that long-short-long-short pattern only showed up once in my recording, but including it in every repetition didn’t cause other problems.
Conclusion
This article described my process for mimicking a feature of an RC300 Remote. The RC300 has several features, but the process for duplicating those features uses the same techniques. After sharing my initial experiences with this, I’ve heard that using ESPHome raw messages and the oscilloscope web app has worked for mimicking other 433 MHz remotes, so I’m hoping this will be helpful to others.
In general, the following techniques seem to help decode RF signals.
- Configure ESPHome to log received RF messages in
raw
format. - Use a visualization tool such as https://dbuezas.github.io/esphome-remote_receiver-oscilloscope/ to find patterns in the received signals.
- Make sure transmissions look as you’d expect in the visualization tool.
- Reevaluate your assumptions periodically.
-
In those repeating messages, I was able to make out that there are basically two classes of positive numbers 400ish and 900ish. Negative numbers appear to act as wait time between the positive numbers. The big/small positive number bifurcation seems to indicate binary ones and zeros. I’m not sure what the mapping of long/short to zero/one is, but I don’t really care. I imagine that with other remotes, the lengths of the short, long and pauses are different. ↩︎