{"id":50736897,"url":"https://github.com/bjornverbakel/esphome-wled-controller","last_synced_at":"2026-06-10T14:32:07.080Z","repository":{"id":357675347,"uuid":"1237929684","full_name":"bjornverbakel/esphome-wled-controller","owner":"bjornverbakel","description":"ESPHome-based controller for WLED-powered LED strips, integrated with Home Assistant. Features a 16x2 LCD display, rotary encoder for brightness, and a joystick-driven preset menu.","archived":false,"fork":false,"pushed_at":"2026-05-22T07:51:42.000Z","size":793,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-22T15:35:43.086Z","etag":null,"topics":["esp32","esphome","home-assistant","wled"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bjornverbakel.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-13T16:38:39.000Z","updated_at":"2026-05-22T07:51:46.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/bjornverbakel/esphome-wled-controller","commit_stats":null,"previous_names":["bjornverbakel/esphome-wled-controller"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/bjornverbakel/esphome-wled-controller","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bjornverbakel%2Fesphome-wled-controller","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bjornverbakel%2Fesphome-wled-controller/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bjornverbakel%2Fesphome-wled-controller/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bjornverbakel%2Fesphome-wled-controller/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bjornverbakel","download_url":"https://codeload.github.com/bjornverbakel/esphome-wled-controller/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bjornverbakel%2Fesphome-wled-controller/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34157453,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-10T02:00:07.152Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["esp32","esphome","home-assistant","wled"],"created_at":"2026-06-10T14:32:03.213Z","updated_at":"2026-06-10T14:32:07.059Z","avatar_url":"https://github.com/bjornverbakel.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# ESPHome WLED Controller\n\nAn ESPHome-based controller for WLED-powered LED strips, integrated with Home Assistant. Features a 16x2 LCD display, rotary encoder for brightness, and a joystick-driven preset menu.\n\n## Features\n\n- **Brightness control** — rotary encoder adjusts WLED brightness (0-100%)\n- **Power toggle** — rotary encoder push-button toggles WLED on/off\n- **Preset menu** — joystick opens an on-screen menu to select WLED presets\n- **LCD auto-blank** — display turns off after 10 seconds of inactivity\n- **HA connection status** — LCD shows \"No HA connection\" when offline\n\n## Hardware\n\n| Component         | Details                                                    |\n| ----------------- | ---------------------------------------------------------- |\n| Microcontroller   | [Freenove ESP32 Dev Board (esp32dev, dual-core 240MHz)](https://amzn.eu/d/08tkQERI)      |\n| Display           | [1602A QAPAS — 16x2 character LCD (HD44780, 4-bit parallel)](https://amzn.eu/d/035yjVYl) |\n| Encoder           | [KY-040 rotary encoder with push-button](https://amzn.eu/d/0c5rQTaQ)                |\n| Joystick          | [KY-023 analog joystick with push-button](https://amzn.eu/d/0fTt9PCg)    |\n| Backlight control | 2N2222 NPN transistor + 1kΩ resistor                       |\n| Contrast          | 10kΩ multiturn trimmer potentiometer                       |\n\n## Wiring\n\n![Wiring Schematic](https://github.com/bjornverbakel/esphome-wled-controller/blob/main/img/esphome-wled-controller-schematic.png)\n\n### LCD (16x2, HD44780)\n\n| LCD Pin           | Connection           |\n| ----------------- | -------------------- |\n| 1 VSS             | GND                  |\n| 2 VDD             | 5V                   |\n| 3 V0              | Trimpot wiper        |\n| 4 RS              | GPIO23               |\n| 5 R/W             | GND                  |\n| 6 E               | GPIO22               |\n| 7-10              | Not connected        |\n| 11 DB4            | GPIO21               |\n| 12 DB5            | GPIO19               |\n| 13 DB6            | GPIO18               |\n| 14 DB7            | GPIO4                |\n| 15 A (backlight+) | 5V                   |\n| 16 K (backlight-) | Transistor collector |\n\n### Contrast trimpot\n\n| Leg       | Connection     |\n| --------- | -------------- |\n| 1         | 5V             |\n| 2 (wiper) | LCD pin 3 (V0) |\n| 3         | GND            |\n\n### Backlight transistor (2N2222 NPN)\n\n| Pin       | Connection            |\n| --------- | --------------------- |\n| Base      | 1kΩ resistor → GPIO17 |\n| Collector | LCD pin 16 (K)        |\n| Emitter   | GND                   |\n\n### Rotary encoder\n\n| Pin              | Connection |\n| ---------------- | ---------- |\n| A                | GPIO34     |\n| B                | GPIO35     |\n| SW (push-button) | GPIO32     |\n\n### Joystick\n\n| Pin              | Connection |\n| ---------------- | ---------- |\n| Y axis           | GPIO36     |\n| X axis           | GPIO39     |\n| SW (push-button) | GPIO25     |\n\n## Setup\n\n1. Install [ESPHome](https://esphome.io/)\n2. Copy `secrets.yaml.example` to your `secrets.yaml` and fill in the values\n3. Update the `substitutions` block at the top of `esp32-led-controller.yaml` to match your Home Assistant entity IDs:\n   ```yaml\n   substitutions:\n     light_entity: light.your_wled_light\n     preset_entity: select.your_wled_preset_selector\n   ```\n4. Flash the device\n5. Add the device to Home Assistant via the ESPHome integration\n6. Adjust the contrast trimpot until characters are visible on the LCD\n\n## WLED Presets\n\n### How presets work\n\nThe preset names in the config must **exactly match** the preset names you create in WLED.\n\n### Create presets in WLED\n\n1. Open the WLED web interface\n2. Set up the effect, colours, and speed you want\n3. Go to **Presets** → save the preset with the exact name listed below\n4. Repeat for each preset you want\n\n### Default Presets\n\nThese presets are already in `esphome-wled-controller.yaml` and must exist in WLED with these exact names if you wish to use the same presets as me:\n\n- Candle Multi\n- Colorwaves\n- Fireworks\n- Gradient\n- Lake\n- Noise 3\n- Random Colors\n- Solid\n\nThese are effects simply adjusted in color and speeds to my personal liking. You can add them to WLED manually or upload the `presets.json` file into WLED.\n\n### Adding custom presets\n\nTo add your own presets to the selection menu, create it in WLED first, then add a new entry to the `lcd_menu` section in `esphome-wled-controller.yaml`:\n\n```yaml\n- type: command\n  text: \"Your Preset Name\"\n  on_value:\n    - homeassistant.action:\n        action: select.select_option\n        data:\n          entity_id: ${preset_entity}\n          option: \"Your Preset Name\"\n    - display_menu.hide: preset_menu\n    - script.execute: lcd_wake\n```\n\nAlso update the `preset_count` global at the top of the config to match the new total number of presets:\n\n```yaml\n- id: preset_count\n  type: int\n  initial_value: \"9\" # change this to your new total\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbjornverbakel%2Fesphome-wled-controller","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbjornverbakel%2Fesphome-wled-controller","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbjornverbakel%2Fesphome-wled-controller/lists"}