Listening for Garage Door Remotes with ESPHome
We are renting a house that has two old garage door openers. We have a switch by our front door that controls the garage doors. I think the landlords or the previous tenants lost the garage door remotes. We received two remotes when we moved in, but I couldn't get them to work, so I think they bought the wrong replacement remote for one of our doors.
We have a Merlin M230T garage door opener, which is an older model sold between 1996 and 2001. This one uses DIN switches to configure the security code:


It looks like the landlord or a previous tenant bought a newer M842R remote that uses "rolling codes" for security. This remote is for garage door openers made between 2001-2007.
We needed an M802 remote for our old garage door, but a replacement remote costs $100.
We moved into this house over a year ago, and the missing garage door remotes haven't been too much of a problem. That's because I set up some Zigbee garage door opener modules:

So we can control the garage doors using Alexa, Siri, and the Home Assistant app on our phones. I've even set up Home Assistant to open and close the garage doors automatically based on our phones' locations.
But I'd still like to have a remote in our cars as a backup option.
I have these IR/RF transmitter/receiver boxes in most of the rooms of our house:

They run ESPHome so I can configure the firmware and program them to do whatever I like. I mostly use them to control our air conditioners, and I have one in my workshop that controls an old CRT TV using TV remote codes. I also use them as a Bluetooth Proxy for Home Assistant, which means that I can send and receive bluetooth signals across my entire house without worrying about range. I use bluetooth temperature and humidity sensors, a Switchbot to turn on our coffee machine in the morning, and a bluetooth LPG gas sensor on our gas tank.
They're quite expensive devices, but I'm very happy with them. They work flawlessly and I can run my own custom ESPHome firmware without calling out to any cloud services. I was thinking about designing my own PCBs and 3D printing cases, but my electrical engineering skills aren't quite there yet.
These little boxes can also send and receive radio signals on the 433 MHz band. Fortunately, that's the same radio band that this garage door opener uses.
So I was wondering if there's a way I could use these IR/RF boxes as a bridge for the newer incompatible garage door remotes. I could listen for the button presses and then relay that signal to the Zigbee garage door module.

I pulled up the ESPHome logs and started looking for "RCSwitch Raw" codes:

This is when I pressed the main button:
[14:32:06][I][remote.rc_switch:261]: Received RCSwitch Raw: protocol=6 data='1001001010'
[14:37:36][I][remote.rc_switch:261]: Received RCSwitch Raw: protocol=6 data='001011010'
[14:37:36][I][remote.rc_switch:261]: Received RCSwitch Raw: protocol=6 data='10001111111'
[14:37:38][I][remote.rc_switch:261]: Received RCSwitch Raw: protocol=6 data='10100001'
[14:37:42][I][remote.rc_switch:261]: Received RCSwitch Raw: protocol=6 data='010010001'
[14:37:43][I][remote.rc_switch:261]: Received RCSwitch Raw: protocol=6 data='11100011011'This is when I pressed the smaller button:
[14:40:32][I][remote.rc_switch:261]: Received RCSwitch Raw: protocol=6 data='101101000'
[14:40:33][I][remote.rc_switch:261]: Received RCSwitch Raw: protocol=6 data='010010001'
[14:40:34][I][remote.rc_switch:261]: Received RCSwitch Raw: protocol=6 data='01001000111'
[14:40:34][I][remote.rc_switch:261]: Received RCSwitch Raw: protocol=6 data='100001110'
[14:40:35][I][remote.rc_switch:261]: Received RCSwitch Raw: protocol=6 data='00001100111'
[14:40:36][I][remote.rc_switch:261]: Received RCSwitch Raw: protocol=6 data='1111100000'
[14:40:37][I][remote.rc_switch:261]: Received RCSwitch Raw: protocol=6 data='11100001'
[14:40:39][I][remote.rc_switch:261]: Received RCSwitch Raw: protocol=6 data='10111000100001'
[14:40:42][I][remote.rc_switch:261]: Received RCSwitch Raw: protocol=6 data='11101001101'
[14:40:42][I][remote.rc_switch:261]: Received RCSwitch Raw: protocol=6 data='110111101'
[14:40:43][I][remote.rc_switch:261]: Received RCSwitch Raw: protocol=6 data='1011000000001'
[14:40:43][I][remote.rc_switch:261]: Received RCSwitch Raw: protocol=6 data='1100100110'I gave up at this point since I couldn't figure out the protocol or how to keep it secure. Unfortunately, I'm not good enough at reverse engineering or electronics to figure out how to pair a garage door remote and verify the radio signal.
I don't live in that house anymore, but I thought I would publish this blog post anyway since it had been sitting in my drafts for a few years. But it's 2026 now, and AI is getting very smart, so here are a few paragraphs about how ChatGPT would have approached this problem.
What ChatGPT Would Try Next
The key thing to understand is that pairing a rolling-code garage remote is not the same as recording and replaying a fixed 433 MHz signal. When a compatible opener is put into learn mode, it does not simply save the exact RF packet that was transmitted. Instead, it learns the remote’s identity and current synchronization state. Future button presses produce different codes, usually based on a counter and a cryptographic algorithm. The opener can accept the next valid codes because it already understands the manufacturer’s rolling-code scheme and has the secret material needed to verify them.
That means a custom ESPHome or Home Assistant receiver could not reliably “pair” with the newer Merlin remote just by seeing one button press. It would need to decode the remote’s actual protocol, identify which parts of the packet are stable, track the rolling counter, and validate the changing encrypted portion. If the remote used something KeeLoq-like, then reimplementing the receiver would also require the relevant manufacturer key or key-derivation scheme. Without that, the software could perhaps recognize superficial patterns from the remote, but it could not authenticate future button presses in the same way a real Merlin opener would.
A practical next experiment would have been to capture several raw transmissions from the same button using an RTL-SDR, Flipper Zero, Yard Stick One, or similar RF tool, then compare them bit by bit. If part of the packet stayed constant while another part changed on every press, that would strongly suggest a remote identifier plus rolling-code payload. The project would then become less about “replaying” a garage remote and more about writing a custom rolling-code receiver. That may be possible if the protocol is known or reverse-engineered, but it is not something ESPHome’s generic rc-switch decoder can infer from noisy short RCSwitch Raw logs.