[EN] DIY ESP32 IR Receiver using recycled Dymond RGB hardware from action with esphome yaml

[EN] Reusing old RGB strip remotes with ESP32, ESPHome & HA Blueprint

Also there is a german version of the blueprint and esphome config that you can find at github Link at the bottom of this posting.

Instead of throwing old cheap hardware away, I decided to give this little Dymond branded RGB strip remote from the shop called Action a second life :grinning_face_with_smiling_eyes:

I simply cut off the original IR receiver from the LED strip controller and connected it directly to an ESP32.

Now the remote can trigger anything inside Home Assistant: lights, scenes, scripts, automations, coffee machine apocalypse mode… whatever you want.

The original hardware is surprisingly usable and perfect for small DIY smart home projects.


Wiring

The IR receiver has 3 cables:

  • VCC → 3.3V on ESP32
  • GND → GND on ESP32
  • Signal → any GPIO pin (in my case GPIO23)

That’s basically all you need.

Buttons were pressed and numbered from top left to bottom right (see photo):

1 , 2 , 3 , 4
5 , 6 , 7 , ...

How it works

Currently I use this together with Home Assistant and ESPHome.

The ESP32 device itself only uses:

  • the recycled IR receiver
  • an MQ135 sensor (completely unrelated to this project and can simply be ignored)

There are basically two ways to handle this setup:

1. Home Assistant handles the automation

The button press triggers an event and Home Assistant does the logic.

2. ESP32 handles everything locally

All logic runs directly on the device itself without Home Assistant automations.

Personally I prefer option 1 because I don’t need to constantly recompile and reflash the firmware every time I want to change a button action.

For this project I only share option 1 because this is what I currently use.


Included

  • IR signal dumps
  • ESPHome configuration
  • Home Assistant Blueprint
  • English + German versions (on Github)
    note: blueprint and esphome config need to be same language to work!

here you can find relevant photos, german version etc.

English Blueprint and config:

Open your Home Assistant instance and show the blueprint import dialog with a specific blueprint pre-filled.

esphome:
  name: esphome_web_ir
  friendly_name: IR Receiver
  name_add_mac_suffix: false

esp32:
  board: esp32dev
  framework:
    type: arduino

logger:
  level: DEBUG

api:
  encryption:
    key: "redacted"

ota:
  - platform: esphome

improv_serial:

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  min_auth_mode: "WPA2"

remote_receiver:
  pin:
    number: GPIO32
    inverted: true
    mode:
      input: true
      pullup: true
  dump: all

binary_sensor:
  - platform: remote_receiver
    name: "Remote Button 1"
    nec:
      address: 0xEF00
      command: 0xFF00
    filters:
      - delayed_off: 500ms
    on_press:
      then:
        - homeassistant.event:
            event: esphome.ir_remote
            data:
              button: "1"

  - platform: remote_receiver
    name: "Remote Button 2"
    nec:
      address: 0xEF00
      command: 0xFE01
    filters:
      - delayed_off: 500ms
    on_press:
      then:
        - homeassistant.event:
            event: esphome.ir_remote
            data:
              button: "2"

  - platform: remote_receiver
    name: "Remote Button 3"
    nec:
      address: 0xEF00
      command: 0xFD02
    filters:
      - delayed_off: 500ms
    on_press:
      then:
        - homeassistant.event:
            event: esphome.ir_remote
            data:
              button: "3"

  - platform: remote_receiver
    name: "Remote Button 4"
    nec:
      address: 0xEF00
      command: 0xFC03
    filters:
      - delayed_off: 500ms
    on_press:
      then:
        - homeassistant.event:
            event: esphome.ir_remote
            data:
              button: "4"

  - platform: remote_receiver
    name: "Remote Button 5"
    nec:
      address: 0xEF00
      command: 0xFB04
    filters:
      - delayed_off: 500ms
    on_press:
      then:
        - homeassistant.event:
            event: esphome.ir_remote
            data:
              button: "5"

  - platform: remote_receiver
    name: "Remote Button 6"
    nec:
      address: 0xEF00
      command: 0xFA05
    filters:
      - delayed_off: 500ms
    on_press:
      then:
        - homeassistant.event:
            event: esphome.ir_remote
            data:
              button: "6"

  - platform: remote_receiver
    name: "Remote Button 7"
    nec:
      address: 0xEF00
      command: 0xF906
    filters:
      - delayed_off: 500ms
    on_press:
      then:
        - homeassistant.event:
            event: esphome.ir_remote
            data:
              button: "7"

  - platform: remote_receiver
    name: "Remote Button 8"
    nec:
      address: 0xEF00
      command: 0xF807
    filters:
      - delayed_off: 500ms
    on_press:
      then:
        - homeassistant.event:
            event: esphome.ir_remote
            data:
              button: "8"

  - platform: remote_receiver
    name: "Remote Button 9"
    nec:
      address: 0xEF00
      command: 0xF708
    filters:
      - delayed_off: 500ms
    on_press:
      then:
        - homeassistant.event:
            event: esphome.ir_remote
            data:
              button: "9"

  - platform: remote_receiver
    name: "Remote Button 10"
    nec:
      address: 0xEF00
      command: 0xF609
    filters:
      - delayed_off: 500ms
    on_press:
      then:
        - homeassistant.event:
            event: esphome.ir_remote
            data:
              button: "10"

  - platform: remote_receiver
    name: "Remote Button 11"
    nec:
      address: 0xEF00
      command: 0xF50A
    filters:
      - delayed_off: 500ms
    on_press:
      then:
        - homeassistant.event:
            event: esphome.ir_remote
            data:
              button: "11"

  - platform: remote_receiver
    name: "Remote Button 12"
    nec:
      address: 0xEF00
      command: 0xF40B
    filters:
      - delayed_off: 500ms
    on_press:
      then:
        - homeassistant.event:
            event: esphome.ir_remote
            data:
              button: "12"

  - platform: remote_receiver
    name: "Remote Button 13"
    nec:
      address: 0xEF00
      command: 0xF30C
    filters:
      - delayed_off: 500ms
    on_press:
      then:
        - homeassistant.event:
            event: esphome.ir_remote
            data:
              button: "13"

  - platform: remote_receiver
    name: "Remote Button 14"
    nec:
      address: 0xEF00
      command: 0xF20D
    filters:
      - delayed_off: 500ms
    on_press:
      then:
        - homeassistant.event:
            event: esphome.ir_remote
            data:
              button: "14"

  - platform: remote_receiver
    name: "Remote Button 15"
    nec:
      address: 0xEF00
      command: 0xF10E
    filters:
      - delayed_off: 500ms
    on_press:
      then:
        - homeassistant.event:
            event: esphome.ir_remote
            data:
              button: "15"

  - platform: remote_receiver
    name: "Remote Button 16"
    nec:
      address: 0xEF00
      command: 0xF00F
    filters:
      - delayed_off: 500ms
    on_press:
      then:
        - homeassistant.event:
            event: esphome.ir_remote
            data:
              button: "16"

  - platform: remote_receiver
    name: "Remote Button 17"
    nec:
      address: 0xEF00
      command: 0xEF10
    filters:
      - delayed_off: 500ms
    on_press:
      then:
        - homeassistant.event:
            event: esphome.ir_remote
            data:
              button: "17"

  - platform: remote_receiver
    name: "Remote Button 18"
    nec:
      address: 0xEF00
      command: 0xEE11
    filters:
      - delayed_off: 500ms
    on_press:
      then:
        - homeassistant.event:
            event: esphome.ir_remote
            data:
              button: "18"

  - platform: remote_receiver
    name: "Remote Button 19"
    nec:
      address: 0xEF00
      command: 0xED12
    filters:
      - delayed_off: 500ms
    on_press:
      then:
        - homeassistant.event:
            event: esphome.ir_remote
            data:
              button: "19"

  - platform: remote_receiver
    name: "Remote Button 20"
    nec:
      address: 0xEF00
      command: 0xEC13
    filters:
      - delayed_off: 500ms
    on_press:
      then:
        - homeassistant.event:
            event: esphome.ir_remote
            data:
              button: "20"

Have fun turning old e-waste into useful smart home gadgets :grinning_face_with_smiling_eyes:


Care to share a picture or part number? Curious if it needs any supporting parts such as dropping/biasing resistors and signal shaping capacitors, or the generic IR Receiver ESPHome project may not apply.
Looking at a bigger picture, could a recycled 433Mhz receiver be substituted for RF Control and the rest of your code adapted for that too?

1 Like

Sure :grinning_face_with_smiling_eyes:
The GitHub link I posted already contains some additional pictures.

Originally the forum topic was much bigger and also included embedded images aswell as a German section, but I ran into the forum media attachment limits and wasn’t able to publish it like that.

In the end I had to split everything into two separate posts (english and german) and heavily rework the formatting multiple times. But the german one was deleted, because i unintentionally broke a rule and it got deleted.

I honestly spent way more time on this than expected :sweat_smile:
Especially since I’m still pretty new to Markdown/forum formatting and didn’t really read the posting rules beforehand — so that part is completely on me lol.

Do you want me to make a better picture from the black box in the second photo? I’d be happy to help with that if needed.

I can also test it with a capacitor if that would be useful. So far I’ve only run into a single brownout reset, and that was just because I accidentally unplugged a Dupont cable. Other than that, everything has been stable. Also i spammed IR-Remote Button presses on it and its fine.

The IR sensor I cut off originally comes from a USB device, so it’s only running at 5V max. However i tested 3.3v first because i havent opened the black box and dont know if there is a converter to 3.3v.

again i can only post 1 picture and i have to wait 5 min to post another reply :sweat_smile:
so the second photo i talked about will be postet after 5 min :slight_smile:

thats the black box i talked about.

That black box looks suspiciously like a wall wart power supply, probably with enough oomph to drive the LEDs. I wouldn't recommend disassembly.

The keypad looks similar to those found in Arduino kits, and your source of a working kit may make a cheap alternative to sourcing these separately from a suitable power supply.

What to do with the leftover parts?

regarding your question, yes it could be adapted. Haven't tested this personally but ESPHome supports RF via remote_receiver with dump: rc_switch. same component, different protocol. Wiring is identical (VCC, GND, DATA). However, 433MHz receivers are known to be noisy and may need tuning of tolerance, filter and idle settings to get stable results. A ~17cm wire antenna helps with range. Worth trying but results may vary depending on the receiver module quality! But i have no RF Devices at all here unfortunatly.

it is a "UTLS50 RGB LED Controller"

and this is the technical data i found:

TECHNICAL DATA:

Operating voltage: 5V USB ~1000 mA max.
Power supply: USB socket/connector
Power consumption: max 4 watts
Ambient operating temperature: -10 ~40 °C
Humidity: 10% - 85% (none condensing)
Storage temperature: -20 ~55 °C
Storage humidity: 5% - 90% (none condensing)

Protection class:
Strip: IP44 - Controller: IP20 - Remote control: IP20 - only for indoor use

Dimensions (LWH):
Strip: 2x 500x10x3 mm - Controller: 50x35x22 mm

Strip (2x):
LED Flex Strip RGB
DC 5V
16x 5050 3-chip SMD LED
Max. 85 lumen
120° viewing angle
Length: 50cm, cuttable every 3 LED's/10 cm (The correct location for cutting is indicated by
the scissors symbol on the strip)

Controller:
DC 5V ~1000mA
16 color buttons + 4 different color-light programs + DIM/faster/slower function + CR2025
battery