{"id":21084112,"url":"https://github.com/smashedr/esphome-configs","last_synced_at":"2026-05-20T06:32:06.218Z","repository":{"id":263520859,"uuid":"888098860","full_name":"smashedr/esphome-configs","owner":"smashedr","description":"ESPHome Configs","archived":false,"fork":false,"pushed_at":"2025-01-06T08:22:58.000Z","size":1951,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-20T23:49:10.116Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Jupyter Notebook","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/smashedr.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2024-11-13T20:13:42.000Z","updated_at":"2025-01-06T08:23:01.000Z","dependencies_parsed_at":"2024-12-03T05:27:57.737Z","dependency_job_id":"400ab539-bb6f-419b-b3f4-e33fdae2dd3d","html_url":"https://github.com/smashedr/esphome-configs","commit_stats":null,"previous_names":["smashedr/esphome-configs"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smashedr%2Fesphome-configs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smashedr%2Fesphome-configs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smashedr%2Fesphome-configs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smashedr%2Fesphome-configs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/smashedr","download_url":"https://codeload.github.com/smashedr/esphome-configs/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243526953,"owners_count":20305115,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":[],"created_at":"2024-11-19T20:22:24.418Z","updated_at":"2026-05-20T06:32:06.164Z","avatar_url":"https://github.com/smashedr.png","language":"Jupyter Notebook","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![GitHub Last Commit](https://img.shields.io/github/last-commit/smashedr/esphome-configs?logo=github\u0026logoColor=white\u0026label=updated)](https://github.com/smashedr/esphome-configs/graphs/commit-activity)\n[![GitHub Org Stars](https://img.shields.io/github/stars/cssnr?style=flat\u0026logo=github\u0026logoColor=white)](https://cssnr.github.io/)\n[![Discord](https://img.shields.io/discord/899171661457293343?logo=discord\u0026logoColor=white\u0026label=discord\u0026color=7289da)](https://discord.gg/wXy6m2X8wY)\n\n# ESPHome Configs\n\n- [Substitutions](#substitutions)\n- [Voice Assistant](#voice-assistant)\n- [Micro Wake Word](#micro-wake-word)\n- [LVGL](#lvgl)\n- [Packages](#packages) \u003c-- this is a **MUST SEE!**\n\nESPHome: https://esphome.io/\n\n## Substitutions\n\n- https://esphome.io/components/substitutions\n\nThis is now a WIP with Packages coming soon, but seems stable...\n\nTo see how these substitutions are used, see: [include/common.yaml](include/common.yaml)\n\n```yaml\nsubstitutions:\n  # required for most of package: common\n  friendly_name: \"Kitchen Box\" # Friendly name for display in Home Assistant.\n  box_num: \"01\" # Unique box number appended to box_name used for hostname and IP address.\n  box_name: \"espbox\" # Non-unique box name prepended to box_num used for hostname.\n  type: \"esp32\" # Platform, see: https://esphome.io/#supported-microcontrollers\n  board: \"esp32dev\" # Board, see: https://esphome.io/#supported-microcontrollers\n  comment: \"38-pin\" # Just a comment to show in ESPHome.\n  # provided by package: common\n  update_interval: \"1min\" # Used to define update_interval for many of the included sensors.\n  force_update: \"true\" # Used to define force_update for many of the included sensors.\n```\n\n## Voice Assistant\n\n- https://esphome.io/components/voice_assistant\n\n**See Packages for more info: [voice_assistant](#voice_assistant)**\n\nCurrent Progress:\n\n- Configs: [esptest48.yaml](esptest48.yaml) /[esptest51.yaml](esptest51.yaml) / [esptest52.yaml](esptest52.yaml)\n- Package: [include/va/voice_assistant.yaml](include/va/voice_assistant.yaml)\n\n## Micro Wake Word\n\n- https://esphome.io/components/micro_wake_word\n- https://github.com/kahrendt/microWakeWord\n\n**See Packages for more info: [micro_wake_word](#micro_wake_word)**\n\nFor training documentation, see: [basic_training_notebook.ipynb](models/basic_training_notebook.ipynb)\n\n**These models are a WIP** and will either be deprecated or improved based on popularity.\n\n| Wake Word     | File                                              | URL for Model                                                 |\n| ------------- | ------------------------------------------------- | ------------------------------------------------------------- |\n| Computer      | [models/computer.json](models/computer.json)      | `github://smashedr/esphome-configs/models/computer.json`      |\n| Jarvis        | [models/jarvis.json](models/jarvis.json)          | `github://smashedr/esphome-configs/models/jarvis.json`        |\n| Jenkins       | [models/jenkins.json](models/jenkins.json)        | `github://smashedr/esphome-configs/models/jenkins.json`       |\n| Wakeup Jarvis | [models/computer.json](models/wakeup_jarvis.json) | `github://smashedr/esphome-configs/models/wakeup_jarvis.json` |\n\nNote: training wake words that work with background noise takes lots of trial and error and playing with the settings.  \nSome notes on the models I have trained.\n\n- **Computer**: This is \"actually\" the first version of computer.\n- **Jarvis**: Quite a few false positives, same issue with background noise.\n- **Jenkins**: Works well, except with background noise.\n- **Wakeup Jarvis**: This is just for testing to enable micro wake word and activate for \"muted\" boxes.\n- **Frasier**: This was only trained with my voice. **DO NOT USE!**\n\nExample Configuration (official, local, and remote):\n\n```yaml\nmicro_wake_word:\n  vad:\n  models:\n    - model: hey_jarvis\n    - model: models/computer.json\n    - model: github://smashedr/esphome-configs/models/jarvis.json@master\n    - model: github://smashedr/esphome-configs/models/jenkins.json@master\n  on_wake_word_detected:\n    then:\n      - voice_assistant.start:\n```\n\n**Note: Using only use 1 model seems to improve performance.**\n\nTip: Micro Wake Word will respond slightly faster with increased CPU frequency on ESP32:\n\n```yaml\nesp32:\n  board: \"${board}\"\n  framework:\n    type: esp-idf\n    version: recommended\n    sdkconfig_options:\n      CONFIG_ESP32_DEFAULT_CPU_FREQ_240: \"y\"\n```\n\nNote: This may differ for variants...\n\n_Reference: https://esphome.io/components/esp32_  \n_Reference: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/kconfig-reference.html_\n\n## LVGL\n\nComing Soon...\n\nCurrent Project: https://www.waveshare.com/wiki/ESP32-S3-Touch-LCD-4.3\n\nProgress: [waveshare01.yaml](waveshare01.yaml)\n\n## Packages\n\n- https://esphome.io/components/packages.html\n\nThis is still a **WIP** but **very powerful** in its current state...\n\n_Click on the package name for info on using the package and the file name for full details._\n\n| Package                             | File                                                               | URL                                                                      |\n| ----------------------------------- | ------------------------------------------------------------------ | ------------------------------------------------------------------------ |\n| [common](#common)                   | [include/common.yaml](include/common.yaml)                         | github://smashedr/esphome-configs/include/common.yaml@master             |\n| [debug](#debug)                     | [include/debug.yaml](include/debug.yaml)                           | github://smashedr/esphome-configs/include/debug.yaml@master              |\n| [status_led](#status_led)           | [include/status_led.yaml](include/status_led.yaml)                 | github://smashedr/esphome-configs/include/status_led.yaml@master         |\n| [voice_assistant](#voice_assistant) | [include/va/voice_assistant.yaml](include/va/voice_assistant.yaml) | github://smashedr/esphome-configs/include/va/voice_assistant.yaml@master |\n| [micro_wake_word](#micro_wake_word) | [include/va/micro_wake_word.yaml](include/va/micro_wake_word.yaml) | github://smashedr/esphome-configs/include/va/micro_wake_word.yaml@master |\n| [pmsx003](#pmsx003)                 | [include/pmsx003/pmsx003.yaml](include/pmsx003/pmsx003.yaml)       | github://smashedr/esphome-configs/include/pmsx003/pmsx003.yaml@master    |\n| [apds9960](#apds9960)               | [include/apds9960/apds9960.yaml](include/apds9960/apds9960.yaml)   | github://smashedr/esphome-configs/include/apds9960/apds9960.yaml@master  |\n| [ld2420](#ld2420)                   | [include/ld2420/ld2420.yaml](include/ld2420/ld2420.yaml)           | github://smashedr/esphome-configs/include/ld2420/ld2420.yaml@master      |\n| [ld2450](#ld2450)                   | [include/ld2450/ld2450.yaml](include/ld2450/ld2450.yaml)           | github://smashedr/esphome-configs/include/ld2450/ld2450.yaml@master      |\n\n**Note:** All components included in a package can be `removed` or `extended` as desired...\n\n### common\n\nThese are my common configurations shared with all boxes. You probably don't want to use these without modification.\n\nThis package requires most of the required variables from: [Substitutions](#substitutions)\n\n### debug\n\n- https://esphome.io/components/debug\n\n| Variable | Default | Description                       |\n| -------- | ------- | --------------------------------- |\n| box_num  | `01`    | Number/Name Appended to `name`(s) |\n\n```yaml\npackages:\n  debug: github://smashedr/esphome-configs/include/debug.yaml@master\nsubstitutions:\n  box_num: \"01\"\n```\n\nUse this to easily enable the `debug` platform on ESPHome.\n\n### status_led\n\n- https://esphome.io/components/status_led\n\n| Variable   | Default    | Description               |\n| ---------- | ---------- | ------------------------- |\n| pin        | -          | PIN for LED Binary Output |\n| status_led | `main_led` | ID of the `status_led`    |\n\nThis combines the `status_led` platform with an `identify` button.\n\n```yaml\npackages:\n  status_led: github://smashedr/esphome-configs/include/status_led.yaml@master\nsubstitutions:\n  pin: \"GPIO18\" # required\n  status_led: \"name_for_id\"\n```\n\n### counters\n\n| Variable | Default | Description                          |\n| -------- | ------- | ------------------------------------ |\n| box_num  | `01`    | Number/Name Appended to `name`(s)    |\n| level    | `ERROR` | Log Level to trigger error messages. |\n\nSends all logs at `level` or higher to a discord `channel_id` via the discord integration `notify_id`.\n\n```yaml\npackages:\n  counters: github://smashedr/esphome-configs/include/counters.yaml@master\nsubstitutions:\n  box_num: \"01\"\n  level: \"ERROR\"\n```\n\n### discord_logs\n\n- https://www.home-assistant.io/integrations/discord/\n\n| Variable      | Default      | Description                                   |\n| ------------- | ------------ | --------------------------------------------- |\n| channel_id    | -            | PIN for LED Binary Output                     |\n| box_num       | `01`         | Combined with box_name for name. Vanity Only. |\n| box_name      | `esp`        | Combined with box_num for name. Vanity Only.  |\n| friendly_name | `ESP Box`    | Box Name. Vanity Only.                        |\n| notify_id     | `ha_discord` | ID of the `notify.discord` integration.       |\n| level         | `ERROR`      | Log Level to trigger error messages.          |\n\nSends all logs at `level` or higher to a discord `channel_id` via the discord integration `notify_id`.\n\n```yaml\npackages:\n  discord_logs: github://smashedr/esphome-configs/include/discord_logs.yaml@master\nsubstitutions:\n  channel_id: \"0123456789\" # REQUIRED\n  box_num: \"01\"\n  box_name: \"esp\"\n  friendly_name: \"ESP Box\"\n  notify_id: \"ha_discord\"\n  level: \"ERROR\"\n```\n\n### voice_assistant\n\n- https://esphome.io/components/voice_assistant\n\n| Variable        | Default    | Description                  |\n| --------------- | ---------- | ---------------------------- |\n| microphone      | `va_mic`   | ID of `microphone`           |\n| script_va_start | `va_start` | ID of script to `start` va   |\n| sorting_weight  | `-30`      | `sorting_weight` of VA group |\n\n```yaml\npackages:\n  voice_assistant: github://smashedr/esphome-configs/include/va/voice_assistant.yaml@master\nsubstitutions:\n  microphone: \"va_mic\"\n  script_va_start: \"va_start\"\n  sorting_weight: \"-30\"\n```\n\nThis package provides the voice_assistant, a button to activate and a web_server sorting_group.\n\nThis requires the a `va_start` script provided by `micro_wake_word` package. If only using `voice_assistant`, add:\n\n```yaml\nscript:\n  - id: va_start\n    mode: restart\n    then:\n      - logger.log: \"Running script: va_start\"\n      - if:\n          condition:\n            - voice_assistant.is_running:\n          then:\n            - logger.log: \"va_start: voice_assistant.stop\"\n            - voice_assistant.stop:\n          else:\n            - wait_until:\n                condition:\n                  not:\n                    microphone.is_capturing:\n            - logger.log: \"va_start: voice_assistant.start\"\n            - voice_assistant.start:\n```\n\nThis will stop the VA if it is running, otherwise start the VA; making it a toggle.  \nAt minimum the script should attempt to: `- voice_assistant.start:`.\n\n### micro_wake_word\n\n- https://esphome.io/components/micro_wake_word\n\n| Variable         | Default      | Description                   |\n| ---------------- | ------------ | ----------------------------- |\n| model            | `hey_jarvis` | Number/Name or URL of `model` |\n| sorting_group_id | `sg_va`      | ID of VA `sorting_group`      |\n\n```yaml\npackages:\n  micro_wake_word: github://smashedr/esphome-configs/include/va/micro_wake_word.yaml@master\nsubstitutions:\n  model: \"hey_jarvis\"\n  sorting_group_id: \"sg_va\"\n```\n\nThis package provides the micro_wake_word, a switch to enable/disable it and save state, an on_boot to ensure state; plus scripts:\n\n- micro_wake_enable\n- va_start\n- va_end\n\nYou will want to !extend these, and use them in your workflow for those actions.\n\nExample extending the `va_end` script to turn off a light:\n\n```yaml\nscript:\n  - id: !extend va_end\n    then:\n      - light.turn_off: main_led\n```\n\n### pmsx003\n\n- https://esphome.io/components/sensor/pmsx003\n\n| Variable     | Default  | Description                       |\n| ------------ | -------- | --------------------------------- |\n| pms_num      | `01`     | Number/Name Appended to `name`(s) |\n| rx_pin       | `GPIO16` | PIN for `rx_pin`                  |\n| tx_pin       | `GPIO17` | PIN for `tx_pin`                  |\n| force_update | `true`   | Set `force_update` for sensor     |\n\n```yaml\npackages:\n  pmsx003: github://smashedr/esphome-configs/include/pmsx003/pmsx003.yaml@master\nsubstitutions:\n  pms_num: \"01\"\n  rx_pin: \"GPIO16\"\n  tx_pin: \"GPIO17\"\n  force_update: \"true\"\n```\n\nYou may want to !extend the sensor for `on_value` automations:\n\n```yaml\nsensor:\n  - id: !extend pm_sensor\n    pm_2_5:\n      on_value_range:\n```\n\n### apds9960\n\n- https://esphome.io/components/sensor/apds9960\n\n| Variable            | Default | Description                                 |\n| ------------------- | ------- | ------------------------------------------- |\n| box_num             | `01`    | Number/Name Appended to `name`(s)           |\n| sorting_weight      | `50`    | web_server: sorting_group: `sorting_weight` |\n| disabled_by_default | `true`  | Binary sensors `disabled_by_default`        |\n\n```yaml\npackages:\n  apds9960: github://smashedr/esphome-configs/include/apds9960/apds9960.yaml@master\nsubstitutions:\n  box_num: \"01\"\n  sorting_weight: \"50\"\n  disabled_by_default: \"true\"\n```\n\nThis package captures each gesture and publishes them to a text sensor with the last value, UP, DOWN, RIGHT, or LEFT.\n\nYou will probably want to !extend the `last_gesture` sensor to add automation for the `on_value`:\n\n```yaml\ntext_sensor:\n  - platform: template\n    id: !extend last_gesture\n    on_value:\n      then:\n        - logger.log:\n            format: \"Direction: %s\"\n            args: [\"x.c_str()\"]\n```\n\nThis also adds a `sorting_group` to the `web_server`. If you don't use `web_server` 3 this can be disabled:\n\n```yaml\nweb_server: !remove\n```\n\n### ld2420\n\n- https://esphome.io/components/sensor/ld2420\n\n| Variable | Default  | Description                       |\n| -------- | -------- | --------------------------------- |\n| box_num  | `01`     | Number/Name Appended to `name`(s) |\n| rx_pin   | `GPIO16` | PIN for `rx_pin`                  |\n| tx_pin   | `GPIO17` | PIN for `tx_pin`                  |\n\n```yaml\npackages:\n  ld2420: github://smashedr/esphome-configs/include/ld2420/ld2420.yaml@master\nsubstitutions:\n  rx_pin: \"GPIO16\"\n  tx_pin: \"GPIO17\"\n```\n\nYou may want to !extend the presence sensor for `on_press` automations:\n\n```yaml\nbinary_sensor:\n  - id: !extend presence_sensor\n    has_target:\n      on_press:\n        then:\n          - logger.log: \"Presence Detected\"\n      on_release:\n        then:\n          - logger.log: \"No Presence\"\n```\n\nAttempting to include this in the package then overriding it throws a duplicate ID error on `presence`.\n\n_Note: If you plan to !extend the `uart:` definition, the `ld2420:` definition must come before it!_\n\n### ld2450\n\n- https://github.com/uncle-yura/esphome-ld2450\n\n| Variable | Default  | Description                       |\n| -------- | -------- | --------------------------------- |\n| box_num  | `01`     | Number/Name Appended to `name`(s) |\n| rx_pin   | `GPIO16` | PIN for `rx_pin`                  |\n| tx_pin   | `GPIO17` | PIN for `tx_pin`                  |\n\n```yaml\npackages:\n  ld2450: github://smashedr/esphome-configs/include/ld2450/ld2450.yaml@master\nsubstitutions:\n  rx_pin: \"GPIO16\"\n  tx_pin: \"GPIO17\"\n```\n\nThe `presence` binary_sensor needs to be added manually and optionally moving/still:\n\n```yaml\nbinary_sensor:\n  - platform: ld2450\n    has_target:\n      name: \"Presence ${box_num}\"\n      id: presence\n      on_press:\n        then:\n          - logger.log: \"Presence Detected\"\n      on_release:\n        then:\n          - logger.log: \"No Presence\"\n    has_moving_target:\n      name: \"Moving Target ${box_num}\"\n    has_still_target:\n      name: \"Still Target ${box_num}\"\n```\n\n_Note: This custom package can not be extended because it does not allow an ID..._\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsmashedr%2Fesphome-configs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsmashedr%2Fesphome-configs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsmashedr%2Fesphome-configs/lists"}