Setting up an RF bridge for a Könighaus LED ceiling heating

I am starting with my first ESPHome project. I just bought a Könighaus LED ceiling heating and I would like to replace the remote control with an integration with Home Assistant. Since there is no IR LED on that remote, I can only suppose it is an RF one. I sent a mail to the manufacturer, just in case they would reply.

The features of the remote are:

  • toggle the heating,
  • decrease/increase the temperature,
  • set a timer value from a list of options,
  • toggle the light (which cycles through different modes).

I understand it is recommended to:

Am I missing something? Thanks in advance.

It’s anything between easy and impossible.
Instead of blindly buying some RF bridge, spend some time to find out what approach they use. Could be 433MHz or 2.4GHz…Or something else.
You can open remote controller or receiver to get some evidence if google search doesn’t give anything.

1 Like

Thanks for the suggestion! I opened the receiver. I don’t think I can open the remote without damaging it.

I think it seriously resembles a 433 MHz receiver like this one: Google Image Result for https://www.robozar.com/wp-content/uploads/2024/05/cha.jpg.

Could it still be something else?

Is there a FCC id sticker somewhere that could lead to clues?

The clue is the antenna. Looks like one for 433Mhz.

433Mhz - you still have to decode the protocols used. A matching dedicated encoder/decoder IC pair is often used. You may even encounter rolling code protocols.

Have a look at what that 4 pin transmitter/receiver board is connected to nearby. A closeup photo of the circuit board (including IC part numbers clearly identifiable) would be of great assistance.

Can you check the part number of the IC on that 4 pin daughter board and advise. Cannot see it in your photo.

Have a look at what rabbit hole you may wander down looking to reverse engineer raw transmitted data here:

Hint: easier to check the data sheet on the ICs on the board. Take the photos. Post them here.

1 Like

No.
It’s 433MHz ASK receiver, Qiachip RX500.
You can’t find approach easier than this …

1 Like

In case it is relevant for other purposes than identifying the daughter board, here are the requested photos. Consider a vertical flip between the pictures.


Thank you all for your time!

You can go with the original plan with rf-bridge.
Or get cheap 433 modules and esp dev board.

Or if you like soldering and tinkering plus saving few dollars, remove the receiver from motherboard and connect it to esp dev board. Record the signals you need and solder esp in the place of that receiver.

Interesting! I don’t find those modules listed in the documentation. Do I just need to find ESP32 compatibility? If you have known working examples, I welcome them.

433MHz superheterodyne receiver and transmitter combo. Like this:

Receiver to copy the signals from your original remote and transmitter to send them from esphome to your heater.

1 Like

I have the same panel and got it to work with a XD-FST and XD-RF-5V Super Regenerative Wireless Receiver Module from the parts bin and some frustrating ChatGPT sessions.

One thing though: currently it changes color temperature when switching on, so the color temperature is always different than set previously. I can’t remember if this was default behavior or it changed after me trying to emulate the remote?

Behavior is the same now for the original remote and the ESP so there is that. No change after re-pair either.

I’m using a Lolin D1 mini ESP8266 and the following code:


esphome:
  name: konighaus-remote

esp8266:
  board: d1_mini

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  power_save_mode: none  

# Enable logging
logger:
  baud_rate: 0
  level: VERBOSE

# Enable Home Assistant API
api:
  encryption:
    key: !secret api_encryption_key

ota:
  - platform: esphome
    password: !secret ota_password
    id: my_ota
# Optimized receiver configuration for better capture
remote_receiver:
  pin: 
    number: D1
    mode:
      input: true
      pullup: false
  dump: raw
  tolerance: 25%
  filter: 80us
  idle: 8ms
  buffer_size: 2kb
  

remote_transmitter:
  pin: D2
  carrier_duty_percent: 100% # ASK modulation typically uses 100%

These are captures from my remote re-played (may differ between panel instances?):

button:
  - platform: template
    name: "Light ON (exact remote)"
    on_press:
      - remote_transmitter.transmit_raw:
          repeat:
            times: 1
          code: [
            705,-96,302,-501,295,-506,684,-119,290,-511,281,-520,690,-111,671,-131,269,-534,666,-136,663,-138,672,-130,
            258,-548,651,-146,654,-148,652,-150,249,-552,249,-553,248,-554,257,-544,247,-555,247,-554,646,-155,245,-554,
            251,-6162,645,-157,244,-557,251,-551,644,-158,242,-559,241,-560,641,-160,640,-162,239,-564,644,-156,636,-166,
            635,-167,241,-562,632,-168,640,-161,631,-173,228,-572,236,-565,229,-576,226,-572,230,-571,229,-572,630,-172,
            227,-571,227,-6186,630,-171,230,-576,224,-574,627,-173,228,-575,235,-567,626,-175,633,-168,229,-573,627,-175,
            624,-178,623,-178,223,-579,622,-179,622,-180,620,-182,220,-582,219,-582,219,-583,218,-583,223,-579,219,-582,
            626,-175,219,-580,217,-6197,627,-173,221,-581,222,-580,620,-181,220,-582,220,-581,620,-181,620,-182,225,-587,
            609,-183,627,-174,617,-185,215,-587,615,-187,615,-187,620,-181,213,-589,212,-590,215,-587,211,-589,213,-589,
            213,-588,613,-187,220,-580,211,-6202,616,-184,223,-580,215,-587,626,-174,216,-586,214,-587,615,-187,614,-189,
            211,-590,613,-188,612,-189,612,-191,209,-593,616,-184,610,-192,609,-193,217,-586,205,-596,205,-596,207,-594,
            208,-593,211,-591,608,-193,206,-592,207,-6206,612,-189,210,-591,212,-590,611,-190,213,-590,208,-594,614,-185,
            611,-190,210,-593,608,-196,606,-193,616,-185,206,-598,605,-195,605,-196,605,-197,203,-603,200,-602,198,-604,
            201,-599,198,-603,199,-601,603,-195,205,-598,205,-6206,611,-187,212,-592,213,-590,606,-194,205,-597,205,-597,
            610,-188,608,-195,205,-602,606,-190,607,-194,606,-196,206,-604,595,-199,611,-190,603,-199,201,-611,195,-607,
            189,-612,190,-610,191,-610,192,-609,593,-201,199,-609,188,-6235,585,-196,203,-604,197,-603,602,-194,205,-604,
            200,-601,599,-196,614,-187,204,-606,598,-195,604,-199,602,-201,199,-613,591,-198,602,-200,601,-202,197,-621,
            180,-617,185,-617,186,-614,193,-609,186,-615,594,-194,200
          ]

  - platform: template
    name: "Light OFF (exact remote)"
    on_press:
      - remote_transmitter.transmit_raw:
          repeat:
            times: 1
          code: [
            121,-3281,141,-1640,679,-123,273,-529,275,-526,673,-128,271,-532,265,-537,675,-125,663,-140,258,-544,655,
            -147,651,-151,655,-146,248,-555,646,-154,644,-159,641,-161,239,-563,238,-565,236,-564,245,-557,236,-567,234,
            -565,238,-563,637,-162,235,-6180,638,-163,235,-567,237,-566,634,-167,231,-570,232,-570,632,-169,632,-171,
            226,-576,633,-169,626,-175,626,-175,230,-573,623,-179,629,-172,622,-183,219,-581,218,-584,214,-588,214,-586,
            218,-583,217,-584,220,-583,617,-180,214,-6200,619,-182,217,-585,216,-585,618,-183,217,-585,221,-582,615,-185,
            623,-178,214,-589,615,-186,613,-191,609,-192,207,-595,609,-192,610,-191,608,-195,205,-597,204,-596,210,-592,
            206,-595,208,-595,203,-599,202,-598,605,-192,175,-6239,613,-187,209,-594,206,-594,608,-195,204,-598,204,-600,
            603,-194,607,-194,209,-595,603,-198,612,-188,604,-199,201,-601,600,-202,599,-204,605,-195,198,-605,197,-603,
            200,-603,196,-606,196,-603,199,-602,199,-603,599,-198,198,-6214,607,-194,204,-599,199,-603,609,-190,202,-601,
            200,-601,600,-201,600,-206,193,-604,600,-201,599,-202,598,-205,195,-607,601,-199,597,-205,596,-206,199,-605,
            189,-611,191,-610,192,-608,194,-608,195,-608,190,-611,600,-195,195,-6219,597,-204,196,-605,197,-604,598,-203,
            199,-605,194,-607,603,-196,598,-204,196,-605,596,-207,595,-207,599,-202,193,-609,596,-205,591,-212,589,-213,
            188,-612,190,-612,189,-613,192,-610,187,-614,187,-612,190,-610,593,-205,194,-6218,597,-204,197,-605,200,-603,
            595,-206,193,-609,193,-606,596,-205,595,-213,187,-613,596,-202,594,-208,593,-209,192,-611,590,-211,600,-201,
            591,-211,188,-614,189,-614,185,-616,186,-616,187,-612,189,-612,190,-618,583,-209,186,-6225,594,-208,191,-612,
            194,-605,596,-204,195,-609,194,-609,591,-209,603,-197,192,-612,591,-208,592,-212,589,-214,185,-615,590,-211,
            589,-213,587,-216,184,-617,185,-615,188,-614,186,-615,193,-610,184,-617,185,-613,591
          ]

And the captures for the heater button


  - platform: template
    name: "Heater On"
    on_press:
      - remote_transmitter.transmit_raw:
          code: [-96, 303, -503, 296, -502, 692, -109, 296, -507, 287, -515, 684, -119, 684, -116, 271, -531, 672, -130, 668, -134, 663, -141, 256, -544, 656, -145, 655, -150, 649, -151, 247, -555, 246, -556, 244, -558, 247, -554, 246, -556, 643, -157, 643, -159, 644, -154, 238, -6178, 644, -157, 238, -564, 238, -564, 640, -160, 238, -565, 236, -566, 634, -166, 635, -167, 233, -570, 638, -163, 631, -170, 631, -172, 226, -576, 626, -174, 628, -175, 624, -177, 223, -583, 217, -581, 222, -579, 224, -578, 222, -579, 622, -179, 621, -183, 618, -178, 218, -6199, 620, -180, 220, -582, 219, -583, 621, -180, 219, -584, 216, -585, 620, -181, 619, -183, 216, -587, 616, -185, 614, -188, 616, -186, 211, -590, 614, -191, 608, -191, 610, -191, 213, -590, 208, -593, 209, -592, 208, -594, 210, -592, 611, -189, 610, -192, 609, -189, 207, -6209, 611, -190, 209, -594, 207, -595, 609, -191, 208, -595, 208, -593, 611, -191, 607, -195, 206, -596, 606, -195, 606, -197, 605, -196, 203, -599, 606, -195, 604, -198, 603, -199, 202, -600, 200, -602, 200, -601, 201, -601, 200, -600, 602, -202, 600, -200, 599, -199, 198, -6216, 603, -199, 201, -601, 201, -598, 606, -196, 202, -602, 200, -603, 599, -201, 601, -200, 200, -602, 602, -199, 600, -202, 601, -201, 197, -605, 598, -206, 595, -203, 597, -206, 195, -606, 195, -610, 193, -605, 196, -606, 195, -606, 597, -204, 597, -204, 598, -200, 195, -6220, 599, -202, 198, -604, 202, -605, 595, -200, 197, -607, 197, -603, 598, -204, 598, -204, 194, -612, 591, -205, 598, -205, 596, -205, 194, -611, 591, -208, 594, -207, 594, -208, 196, -606, 191, -611, 190, -611, 192, -609, 192, -609, 595, -206, 593, -210, 592, -205, 191, -6221, 597, -205, 194, -609, 193, -606, 600, -202, 196, -606, 195, -607, 597, -204, 595]

  - platform: template
    name: "Heater Off"
    on_press:
      - remote_transmitter.transmit_raw:
          code: [-92, 298, -505, 298, -504, 691, -110, 286, -517, 285, -516, 675, -127, 670, -131, 270, -533, 666, -136, 665, -137, 660, -142, 255, -548, 656, -144, 654, -149, 652, -149, 248, -555, 244, -558, 245, -557, 244, -557, 246, -556, 644, -156, 644, -159, 241, -557, 239, -6177, 644, -157, 240, -563, 238, -563, 641, -165, 232, -566, 238, -564, 636, -164, 637, -165, 233, -570, 632, -169, 631, -171, 630, -172, 228, -574, 628, -174, 626, -175, 631, -174, 221, -579, 221, -580, 222, -579, 221, -582, 221, -580, 626, -175, 622, -180, 220, -579, 217, -6198, 623, -179, 219, -582, 223, -579, 620, -182, 218, -585, 217, -584, 620, -181, 619, -182, 217, -586, 617, -184, 618, -184, 616, -187, 212, -590, 613, -188, 613, -188, 614, -188, 211, -592, 209, -593, 210, -592, 208, -592, 210, -597, 605, -191, 610, -193, 207, -591, 210, -6205, 611, -190, 211, -592, 209, -593, 611, -190, 209, -594, 207, -593, 610, -192, 609, -192, 210, -593, 608, -193, 608, -194, 607, -198, 201, -602, 601, -196, 605, -198, 602, -199, 201, -602, 200, -601, 202, -601, 200, -599, 201, -600, 604, -198, 602, -200, 201, -597, 202, -6212, 606, -195, 206, -597, 204, -597, 605, -200, 199, -601, 201, -599, 604, -197, 604, -203, 197, -600, 603, -199, 602, -201, 601, -200, 199, -603, 600, -202, 598, -203, 599, -206, 194, -605, 197, -604, 197, -605, 196, -606, 197, -604, 599, -202, 599, -202, 196, -603, 197, -6217, 602, -200, 199, -603, 200, -602, 603, -197, 200, -605, 197, -601, 601, -201, 601, -202, 197, -605, 600, -201, 599, -203, 598, -203, 196, -607, 596, -205, 596, -206, 596, -206, 193, -614, 189, -607, 193, -608, 195, -607, 198, -605, 594, -206, 594, -208, 192, -606, 194, -6219, 600, -201, 198, -605, 199, -604, 597, -202, 198, -604, 198, -604, 598, -203, 599]

I see patterns here in the raw code, with clusters of nearly same values.
Read the Qiachip RX500 receiver datasheet - will work with either 3.3 or 5volts.
Current draw is 2.1mA, significantly less than an ESP module of around 50-450mA.
The circuit board has the back side already marked VDD. Pity U5 and U6 numbers are not clear in the photo, looking to be driven via a fat transistor adjacent to C26 and C27 whose part number is also not clear. Frustrating as this may offer the vital clue as to what the protocol being used across the radio link actually is.

The power supply will probably not be adequately rated to support an ESP as a direct swap. This may not be needed unless we want to change the protocol being used.

We actually need to focus on the transmitter - the remote control.

Any clues on the sender chip part numbers? Removing the batteries often reveals small screws that allow the outside shells to be split in two.
Clear photos of the circuit board, being very careful not to part the display and keyboard assemblies. Tilt the camera angle so it catches the light to reveal the chip numbers would also be most appreciated.

Unfortunately no: it seems the remote housing has a front panel glued to the housing. I don’t think it will go back together cleanly after disassembly.

What I have now seems to work reliably enough for me.

Pity that the LED doesn’t go on after power on by default: I’m connecting it to a switched outlet together with other lighting.
Even worse that the color temperature is changed every time you switch it on. This thing is not recommended for general lighting…

Your raw data might be missing or have an added preamble that is incorrectly decoded.
U5 and U6 chip numbers on the receiver board for more clues might help.

You’re right: I’m shooting in the dark here. While fooling around I found codes that advances color or rotates color but no reliable ‘turn on with the same color’ yet.

If you observe the signal, you see that the actual code is 24bit PWM repeated several times with 6ms gap between. Pulse pairs either 200,-600 or 600,-200. So binary representation would be 10010011 01110111 00000010
You could save memory by sending it like this:

button:
  - platform: template
    name: "Light ON (exact remote)"
    on_press:
      - remote_transmitter.transmit_raw:
          repeat:
            times: 7
            wait_time: 6ms
          code: [
            612,-189,210,-591,212,-590,611,-190,213,-590,208,-594,614,-185,611,-190,210,-593,608,-196,606,-193,616,-185,206,-598,605,-195,605,-196,605,-197,203,-603,200,-602,198,-604, 201,-599,198,-603,199,-601,603,-195,205,-598,205
]

Ps. I would be surprised if rc_switch doesn’t decode it. That would save memory even more…

Thanks for the photos. That ‘fat transistor’ turns out to be a 78L05, a common 5v regulator, hard up against the receiver module where it will give a consistent voltage.

The other two U5 and U6 are just beyond my screen resolution when zoomed - can somebody with a better monitor assist with what they say?

Peering more closely, U5 is a Holtek HT66F0181 general purpose A/D Flash MCU with EEPROM with direct LED drivers.
Application notes:
https://www.holtek.com/page/contentDetail?cCode=N6017585
https://www.holtek.com/page/applicationNotes/list/general/8bit-flash-mcu
and LED driver application note
https://www.holtek.com/page/applicationNotes/AN0683
UART
https://www.holtek.com/page/applicationNotes/AN0687
and bingo: IR Communications Application note
https://www.holtek.com/page/applicationNotes/AN0445

It discusses commonly used IR protocols with that chip family. What if they were lazy and just used the manufacturer’s suggestion example from their SDK AN with a 433Mhz TX/RX pair rather than roll their own?
I wonder? :wink: :wink: :slight_smile: :partying_face:

Bet Könighaus offers an Infrared controlled model too.

Still not sure what U6 is.

The other IC looks like darlington array.
ULN2001 perhaps.

Yes!!! Would make sense as the traces go towards the relay.

Now back to the protocols used…

How the project pans out, based on what we know so far:
Remove the 433Mhz module from the receiver board and connect it to an adjunct ‘helper’ ESP with code that recognises the ESP power up condition, or remote ‘on’ command, and then injects a modified signal input sequence directly into the Holtek chip input pin from a GPIO pin (via an optocoupler for voltage isolation) to change the LED temperature to your preference and turn the LED on, imitating the remote control. Any other RF commands are to be passed on as received - no need to decode them. Yes, you will have to initiate ones from the ESP for commands received from HomeAssistant, but you are most of the way there already with decoding that.

Parts required:

  • ESP series board. Hey, why not get one of the later ones that supports Thread/Matter/ BLE/ WiFi 7/ CANbus/ 5Ghz too? USB connector for power and initial programming please. Lots of memory as you have a lot of code and raw values to squeeze in there.
  • Optocoupler. Cheap one will do the job - no super high frequencies involved - you just want to avoid ground loops and have AC safety isolation if anything breaks down. Optocoupler input across a GPIO pin. Output across the RX500 output pin and ground where you removed it from the PCB. The PCB solder pads for the RX500 are huge, so no big worries when desoldering and resoldering. May need a small biasing resistor there too for pullup/pulldown.
  • Power supply for your ESP32 and RX500 modules. External USB wall wart type recommended at say 1.5amps or above to plug directly into your ESP board.
  • Perfboard to solder the ESP32 module to, RX500 receiver module, as well as the optocoupler, wires, and mount it in the box safely. Neat, not rats nest point to point wiring. A custom PCB not required for one off, but if you are going to make a few, consider it.
  • Bit of wire to go between your ESP32 and the receiver board. Only needs to pass 5 volts max at signal level so nothing too big or too long.
  • Fine solder with multicore flux and lead free, and a small wattage soldering iron to make good solder joints.
  • A case to mount it in the ceiling next to the LED fitting. Preferably waterproof if you are using it in your bathroom in case of humidity leaks.
  • Power for your USB type power supply to plug into. This can be switched from a physical light switch so you can use the power-up functionality to change your LED color preferences on switch on, automagically, if you like.

The case should only have two cables emerging. One for the USB power supply, and another for the optocoupler pair to your LED control board.

You also add HomeAssistant functionality in the firmware for WiFi control, so you now get smarts and your color prefetences as well as keep your original remote fully operational.

MITM custom firmware? MQTT? ESPHome? OTA updates? Built in webserver? Multilingual? Repurposed remote control buttons for new functionality? You are spoiled for choice.

Late question that I should have clarified long ago: How do you change the color temperature? Turning the power off and on rapidly in a known sequence to cycle through each color temperature? Does it remember the last color and step one up from there, or start from a base one and you have to cycle through the same steps each time? Is it changed by a special command from the remote?
My German is non-existent and I don’t want to pass the manual through Google translate. If the first, you may have to add a one-port relay board also controlled by your ESP to intercept the power to the LED unit and pulse it. If the second method, just squirt the color codes out when the power-on command is intercepted.

I doubt RX500 could drive the opto LED with decent current for reliable operation and even if it could, it doesn’t make sense to me…

If @David26 already has working rf setup, it would be more practical to simply send the “initial sequence” to turn LED on and adjust color via RF when light is switched on.