{"id":50481885,"url":"https://github.com/claudiojara/esp32-esphome-lab","last_synced_at":"2026-06-01T18:01:54.819Z","repository":{"id":352971920,"uuid":"1217440598","full_name":"claudiojara/esp32-esphome-lab","owner":"claudiojara","description":"ESP32-C3 SuperMini + ESPHome + Home Assistant — OLED dashboards and HLK-LD2410C mmWave presence sensor","archived":false,"fork":false,"pushed_at":"2026-04-21T22:28:36.000Z","size":947,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-22T00:29:24.060Z","etag":null,"topics":["esp32","esp32-c3","esphome","home-assistant","ld2410","mmwave-radar","oled","sh1106"],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/claudiojara.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-04-21T22:18:46.000Z","updated_at":"2026-04-21T22:28:39.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/claudiojara/esp32-esphome-lab","commit_stats":null,"previous_names":["claudiojara/esp32-esphome-lab"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/claudiojara/esp32-esphome-lab","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/claudiojara%2Fesp32-esphome-lab","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/claudiojara%2Fesp32-esphome-lab/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/claudiojara%2Fesp32-esphome-lab/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/claudiojara%2Fesp32-esphome-lab/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/claudiojara","download_url":"https://codeload.github.com/claudiojara/esp32-esphome-lab/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/claudiojara%2Fesp32-esphome-lab/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33786914,"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-01T02:00:06.963Z","response_time":115,"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","esp32-c3","esphome","home-assistant","ld2410","mmwave-radar","oled","sh1106"],"created_at":"2026-06-01T18:01:53.855Z","updated_at":"2026-06-01T18:01:54.814Z","avatar_url":"https://github.com/claudiojara.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# esp32-esphome-lab\n\n**ESP32-C3 SuperMini + ESPHome + Home Assistant** — OLED dashboards, mmWave presence, YAML-declarative firmware.\n\n\u003cimg src=\"assets/demo.gif\" alt=\"Avatar page reacting to mmWave presence with live distance\" width=\"480\" /\u003e\n\n[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)\n[![ESPHome](https://img.shields.io/badge/ESPHome-2026.4+-black?logo=esphome\u0026logoColor=white)](https://esphome.io)\n[![Home Assistant](https://img.shields.io/badge/Home_Assistant-compatible-18BCF2?logo=home-assistant\u0026logoColor=white)](https://www.home-assistant.io)\n[![Platform: ESP32-C3](https://img.shields.io/badge/Platform-ESP32--C3-E7352C?logo=espressif\u0026logoColor=white)](https://www.espressif.com/en/products/socs/esp32-c3)\n[![Language: YAML](https://img.shields.io/badge/Config-YAML-CB171E?logo=yaml\u0026logoColor=white)](https://yaml.org)\n\n\u003c/div\u003e\n\n---\n\n## Stack Tecnológico\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\" width=\"180\"\u003e\n      \u003cimg src=\"https://esphome.io/_images/logo-text.svg\" width=\"56\" height=\"56\" alt=\"ESPHome\" /\u003e\u003cbr\u003e\n      \u003cb\u003eESPHome\u003c/b\u003e\u003cbr\u003e\n      \u003csub\u003eFirmware declarativo\u003c/sub\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\" width=\"180\"\u003e\n      \u003cimg src=\"https://cdn.simpleicons.org/homeassistant/18BCF2\" width=\"56\" height=\"56\" alt=\"Home Assistant\" /\u003e\u003cbr\u003e\n      \u003cb\u003eHome Assistant\u003c/b\u003e\u003cbr\u003e\n      \u003csub\u003eAPI nativa + mDNS\u003c/sub\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\" width=\"180\"\u003e\n      \u003cimg src=\"https://cdn.simpleicons.org/espressif/E7352C\" width=\"56\" height=\"56\" alt=\"Espressif\" /\u003e\u003cbr\u003e\n      \u003cb\u003eESP32-C3\u003c/b\u003e\u003cbr\u003e\n      \u003csub\u003eSuperMini RISC-V\u003c/sub\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\" width=\"180\"\u003e\n      \u003cimg src=\"https://cdn.simpleicons.org/python/3776AB\" width=\"56\" height=\"56\" alt=\"Python\" /\u003e\u003cbr\u003e\n      \u003cb\u003ePython + uv\u003c/b\u003e\u003cbr\u003e\n      \u003csub\u003eESPHome CLI toolchain\u003c/sub\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\" width=\"180\"\u003e\n      \u003cimg src=\"https://api.iconify.design/mdi:monitor-screenshot.svg?color=%23ffffff\" width=\"56\" height=\"56\" alt=\"OLED\" /\u003e\u003cbr\u003e\n      \u003cb\u003eOLED SH1106\u003c/b\u003e\u003cbr\u003e\n      \u003csub\u003e1.3\" 128×64 I²C\u003c/sub\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\" width=\"180\"\u003e\n      \u003cimg src=\"https://api.iconify.design/mdi:motion-sensor.svg?color=%23ffffff\" width=\"56\" height=\"56\" alt=\"mmWave\" /\u003e\u003cbr\u003e\n      \u003cb\u003eHLK-LD2410C\u003c/b\u003e\u003cbr\u003e\n      \u003csub\u003e24GHz mmWave UART\u003c/sub\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\" width=\"180\"\u003e\n      \u003cimg src=\"https://api.iconify.design/mdi:home-automation.svg?color=%23ffffff\" width=\"56\" height=\"56\" alt=\"HAOS\" /\u003e\u003cbr\u003e\n      \u003cb\u003eHAOS on Proxmox\u003c/b\u003e\u003cbr\u003e\n      \u003csub\u003eVM sin acceso a USB\u003c/sub\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\" width=\"180\"\u003e\n      \u003cimg src=\"https://cdn.simpleicons.org/github/181717\" width=\"56\" height=\"56\" alt=\"GitHub\" /\u003e\u003cbr\u003e\n      \u003cb\u003eGitHub\u003c/b\u003e\u003cbr\u003e\n      \u003csub\u003eVersioning + issues\u003c/sub\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n---\n\n## Features\n\n- **LED control desde HA** como `light` entity\n- **OLED dashboards**: cortina (`cover.curtain`), clima con ícono dinámico, info de sistema, avatar embebido\n- **Multi-page rotation**: 5 páginas con auto-rotate (switch en HA) + botón físico (GPIO7) + botón virtual (HA)\n- **mmWave presence detection**: LD2410C por UART a 256000 baud, con distancia móvil / quieta / de detección + energía\n- **Reactive UI**: overlay de presencia en todas las páginas, avatar cambia de saludo cuando detecta a alguien\n- **HA online images**: iconos de clima servidos desde `/config/www/weather/\u003cstate\u003e.png`\n- **OTA nativo** post-primer-flash — ya no se vuelve a tocar el USB\n\n---\n\n## Quick Start\n\nPrerequisites: Python 3.10+, [`uv`](https://github.com/astral-sh/uv).\n\n```bash\n# 1. Clonar\ngit clone https://github.com/claudiojara/esp32-esphome-lab.git\ncd esp32-esphome-lab\n\n# 2. Instalar ESPHome\nuv tool install esphome\n\n# 3. Copiar template de secretos y completar con tus credenciales\ncp secrets.yaml.example secrets.yaml\n$EDITOR secrets.yaml\n\n# 4. Generar una API encryption key nueva por device\npython3 -c \"import secrets, base64; print(base64.b64encode(secrets.token_bytes(32)).decode())\"\n# Pégala en el api.encryption.key del YAML que vayas a flashear\n\n# 5. Primer flash por USB (accede a la carpeta del proyecto que quieres flashear)\ncd projects/esp32-test\nls /dev/cu.usbmodem*\nesphome run esp32-test.yaml --device /dev/cu.usbmodem\u003cTAB\u003e\n\n# 6. Adoptar en HA: Settings -\u003e Devices \u0026 Services -\u003e ESPHome -\u003e pegar la encryption key\n\n# 7. A partir de ahora, OTA automático sin cable\nesphome run esp32-test.yaml\n```\n\n\u003e Cada subcarpeta de `projects/` tiene un symlink a `secrets.yaml` del root, así ESPHome encuentra los credenciales sin duplicarlos.\n\n---\n\n## Projects\n\nCada proyecto vive en su propia carpeta bajo [`projects/`](projects/) con su YAML, README y symlink a secrets. Detalle e índice completo en [`projects/README.md`](projects/README.md).\n\n| Proyecto | Qué hace |\n|----------|----------|\n| [`projects/esp32-test`](projects/esp32-test/) | LED built-in como `light` HA vía GPIO8 active-low. Starting point minimal. |\n| [`projects/esp32-test-interval`](projects/esp32-test-interval/) | Parpadeo standalone de 1s, sin `api`. Smoke test de hardware. |\n| [`projects/esp32-test-oled-cover`](projects/esp32-test-oled-cover/) | OLED single-page mostrando `cover.curtain` position. |\n| [`projects/esp32-test-oled-weather`](projects/esp32-test-oled-weather/) | OLED con reloj + ícono de clima dinámico fetchado de HA. |\n| [`projects/esp32-test-oled-pages`](projects/esp32-test-oled-pages/) | **Proyecto principal.** Dashboard de 5 páginas con LD2410C integrado y UI reactiva. |\n| [`projects/esp32-led-ring`](projects/esp32-led-ring/) | Anillo WS2812B 16 LEDs como `light.anillo` con 11 efectos para indicar eventos. |\n| [`projects/mmwavetest`](projects/mmwavetest/) | LD2410C standalone sin display. |\n| [`projects/mmwavetest-debug`](projects/mmwavetest-debug/) | Dump raw de bytes UART para diagnosticar cableado/baud. |\n\n---\n\n## Notas de hardware\n\n### C3 SuperMini LED es active-low\n\n`output.gpio.inverted: true` en GPIO8 o HA muestra el estado al revés.\n\n### SH1106 1.3\" clones necesitan `contrast: 100%` explícito\n\nEl default del driver ESPHome es 0 → pantalla completamente negra aunque I²C scan encuentre el device.\n\n### 1.3\" OLED es SH1106, NO SSD1306\n\nDos controladores distintos. Regla: **0.96\" = SSD1306**, **1.3\" = SH1106**. Driver equivocado = píxeles basura.\n\n### LD2410C quiere 5V en VCC\n\nDatasheet 5-12V. Con 3.3V puede bootear pero stream gibberish.\n\n### First compile es lento\n\n3-5 minutos la primera vez, \u003c30s las siguientes (cache en `.esphome/`).\n\n---\n\n## Agent skill\n\nLa carpeta [`skill/`](skill/) contiene el espejo del agent skill global `esp32-homeassistant`. Cubre discovery → scaffolding → flashing, display integration patterns, mmWave debugging con firmas de bytes UART, y la tabla canónica de boards → LEDs → GPIOs. Ver [`skill/SKILL.md`](skill/SKILL.md).\n\n---\n\n## License\n\n[MIT](LICENSE). Fork, break, learn.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclaudiojara%2Fesp32-esphome-lab","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fclaudiojara%2Fesp32-esphome-lab","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclaudiojara%2Fesp32-esphome-lab/lists"}