A radio remote that refuses to be copied
The usual trick for a cheap radio remote is to record a press and play it back. These remotes ignore that. Each press differs a little from the last, so a recording does nothing, and the fans just sit there.
So we decoded the protocol from captures. Each frame holds a remote ID, a button code, a rolling counter, and a check nibble, and the check turned out to be an XOR of the nibbles before it. With that worked out, the firmware builds every press fresh and keeps its own counter per fan. An ESP32 sends the frames through a cheap 433 MHz transmitter on one pin, and HomeSpan makes the board a native HomeKit accessory over Wi-Fi. A matching receiver on another pin hears the handheld remotes, so when someone presses one the bridge resyncs its counter and updates the tile.
The light is the crude part. The remote has one toggle button and sends nothing back, so the bridge tracks state to know which way to switch, and brightness means driving the light to full and stepping down by a counted number of presses, 500 ms apart. After a power cut a tile can drift from the real light. The README says so and gives the reset step.