diff --git a/.github/workflows/auto-label-pr.yml b/.github/workflows/auto-label-pr.yml index 5b3e46976b..0a756fb23a 100644 --- a/.github/workflows/auto-label-pr.yml +++ b/.github/workflows/auto-label-pr.yml @@ -26,7 +26,7 @@ jobs: if: github.event.action != 'labeled' || github.event.sender.type != 'Bot' steps: - name: Checkout - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Generate a token id: generate-token diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 112d1dea4b..723cfa6c09 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,7 +22,7 @@ jobs: repo: cloudcannon/pagefind - name: Checkout - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Set up Hugo uses: peaceiris/actions-hugo@75d2e84710de30f6ff7268e08f310b60ef14033f # v3.0.0 @@ -31,7 +31,7 @@ jobs: extended: true - name: Set up Python 3.12 - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: python-version: 3.12 @@ -45,10 +45,10 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Set up Python 3.12 - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: python-version: 3.12 diff --git a/.github/workflows/component-image.yml b/.github/workflows/component-image.yml index cf0efb0a8b..9952510713 100644 --- a/.github/workflows/component-image.yml +++ b/.github/workflows/component-image.yml @@ -59,7 +59,7 @@ jobs: component: ${{ needs.prepare.outputs.name }} - name: Upload - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 + uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 id: upload-artifact with: name: ${{ needs.prepare.outputs.name }} diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 77d81edbd9..5eec0a9e50 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -28,13 +28,13 @@ jobs: repo: cloudcannon/pagefind - name: Checkout source code - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Set up QEMU uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3 + uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3 - name: Login to DockerHub if: github.event_name != 'pull_request' diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml index b2288871d7..263b04d7e5 100644 --- a/.github/workflows/lock.yml +++ b/.github/workflows/lock.yml @@ -16,7 +16,7 @@ jobs: lock: runs-on: ubuntu-latest steps: - - uses: dessant/lock-threads@1bf7ec25051fe7c00bdd17e6a7cf3d7bfb7dc771 # v4 + - uses: dessant/lock-threads@7266a7ce5c1df01b1c6db85bf8cd86c737dadbe7 # v4 with: pr-inactive-days: "1" pr-lock-reason: "" diff --git a/content/changelog/2026.1.0.md b/content/changelog/2026.1.0.md index ef2c4a220c..5b1f183434 100644 --- a/content/changelog/2026.1.0.md +++ b/content/changelog/2026.1.0.md @@ -139,6 +139,8 @@ The web server now uses entity names directly in URLs instead of sanitized `obje Old URLs using `object_id` format (e.g., `/sensor/temperature_sensor`) continue to work during a deprecation period until 2026.7.0. +**SSE Entity IDs:** A deprecation path was added for SSE event entity IDs. The payload now includes a temporary `name_id` field (new format like `sensor/Temperature`) alongside `id` (legacy format like `sensor-temperature`). **Timeline:** In 2026.8.0, `name_id` will be removed and `id` will switch to the new format. Third-party integrations should prefer `name_id` now, falling back to `id` for compatibility with older firmware. Integrations requiring the legacy format after 2026.8.0 must implement their own conversion logic. + **Important restrictions:** - Names may not include `/` because it is reserved as a URL path separator diff --git a/content/components/_index.md b/content/components/_index.md index e7f9033de3..3536cfce4b 100644 --- a/content/components/_index.md +++ b/content/components/_index.md @@ -1084,6 +1084,7 @@ ESPHome to cellular networks. **Does not encompass Wi-Fi.** {{< imgtable >}} "Camera Encoder","components/camera/camera_encoder","camera.svg","dark-invert" +"Key Collector","components/key_collector","matrix_keypad.jpg","" "ESP32 Camera","components/esp32_camera","camera.svg","dark-invert" "Exposure Notifications","components/exposure_notifications","exposure_notifications.png","" "GPS","components/gps","crosshairs-gps.svg","dark-invert" diff --git a/content/components/display/tm1637.md b/content/components/display/tm1637.md index 6452d93ed0..6ddfe7d487 100644 --- a/content/components/display/tm1637.md +++ b/content/components/display/tm1637.md @@ -122,6 +122,8 @@ display: Please see [Formatted Text](/components/display#display-printf) for a quick introduction into the `printf` formatting rules and [Displaying Time](/components/display#display-strftime) for an introduction into the `strftime` time formatting. + + ### Creating a digital clock The following example creates a typical digital clock with the `:` colon flashing every second. @@ -179,6 +181,22 @@ The last displays Dio pin shares the Clk pin of the first display. {{< img src="tm1637_3plus_devices.png" alt="Image" caption="Three TM1637 displays on 3 control lines" width="50.0%" class="align-center" >}} +### Raw segment buffer + +If you already have segment bitmasks, you can write raw bytes to the display buffer using `set_buffer`. This bypasses +character conversion and is useful for custom glyphs or animations. + +The TM1637 uses a single byte per digit; the decimal point is bit 7 (0x80). + +```yaml +display: + - platform: tm1637 + # ... + lambda: |- + // Raw segment values for "0123" with the dot on the last digit + it.set_buffer(0x3f, 0x06, 0x5b, 0x4f | 0x80, 0x00, 0x00); +``` + ## See Also - {{< docref "index/" >}} diff --git a/content/components/key_collector.md b/content/components/key_collector.md index 69c98d0634..77d779abc7 100644 --- a/content/components/key_collector.md +++ b/content/components/key_collector.md @@ -24,6 +24,7 @@ key_collector: source_id: mykeypad min_length: 4 max_length: 4 + start_keys: "A" end_keys: "#" end_key_required: true back_keys: "*" @@ -54,6 +55,10 @@ key_collector: - **max_length** (*Optional*, integer): The maximum length of the desired key sequence, after which the sequence will trigger the `on_result` automation witout having to press any of the `end_keys` +- **start_keys** (*Optional*, string): Keys used to start the sequence. If specified, no keys + will be collected until one of the start keys is pressed. The start key that was pressed is + available in the `start` variable in automations. + - **end_keys** (*Optional*, string): Keys used to *enter* the sequence. - **end_key_required** (*Optional*, boolean): Only trigger `on_result` automation when one of the `end_keys` was pressed. Defaults to `false`. diff --git a/content/components/water_heater/_index.md b/content/components/water_heater/_index.md index 05facf53b4..23e5a44a62 100644 --- a/content/components/water_heater/_index.md +++ b/content/components/water_heater/_index.md @@ -6,7 +6,7 @@ title: "Water Heater Component" The `water_heater` component is a generic representation of water heaters (boilers) in ESPHome. A water heater handles a target temperature setpoint and an operation mode (like *Eco*, *Electric*, or *Performance*). > [!NOTE] -> Home Assistant integration for water heater entities is not yet available. See [home-assistant/core#159201](https://github.com/home-assistant/core/pull/159201) for progress. +> The water heater integration is available for Home Assistant 2026.2 and later. {{< anchor "config-water-heater" >}} diff --git a/content/guides/getting_started_command_line.md b/content/guides/getting_started_command_line.md index fd2ea3d2af..2a183e5470 100644 --- a/content/guides/getting_started_command_line.md +++ b/content/guides/getting_started_command_line.md @@ -29,7 +29,6 @@ docker pull ghcr.io/esphome/esphome If you want to use `docker-compose` instead, here's a sample file: ```yaml -version: '3' services: esphome: container_name: esphome diff --git a/content/web-api/_index.md b/content/web-api/_index.md index 0837af4eb2..18308f1d6e 100644 --- a/content/web-api/_index.md +++ b/content/web-api/_index.md @@ -42,20 +42,35 @@ Currently, there are three types of events sent: `ping`, `state` and `log`. The is repeatedly sent out to keep the connection alive. `log` events are sent every time a log message is triggered and is used to show the debug log on the index page. `state` is where the real magic happens. All events with this type have a JSON payload that describes the state -of a component. Each of these JSON payloads have two mandatory fields: `id` and `state`. ID -is the unique identifier of the component using the format `domain/entity_name` (for example -`sensor/Temperature`) or `domain/device_name/entity_name` for sub-device entities. `state` -contains a simple text-based representation of the state of the underlying component, for -example ON/OFF or 21.4 °C. Several components also have additional fields in this payload, -for example lights have a `brightness` attribute. +of a component. Each of these JSON payloads has the following identifier fields: + +- `name_id`: **Temporary field (removed in 2026.8.0)** providing the new identifier format + `domain/entity_name` (for example `sensor/Temperature`) or `domain/device_name/entity_name` + for sub-device entities. +- `id`: Legacy identifier using the format `domain-object_id` (for example `sensor-temperature`). + Provided for backward compatibility. In 2026.8.0, this field switches to the new format + (matching `name_id`) and `name_id` is removed. + +Third-party integrations **MUST** prefer `name_id` over `id` to get the new ID format, +falling back to `id` for compatibility with older firmware and for when `name_id` is +removed. The `id` field will switch to the new format (matching `name_id`) in ESPHome +2026.8.0, at which point `name_id` will be removed. Third-party integrations that require +the legacy format after 2026.8.0 must implement their own conversion logic (similar to +`aioesphomeapi`). + +The `state` field contains a simple text-based representation of the state of the underlying +component, for example ON/OFF or 21.4 °C. Several components also have additional fields in +this payload, for example lights have a `brightness` attribute. {{< img src="event-source.png" alt="Image" caption="Example payload of the event source API." class="align-center" >}} Additionally, each time a client connects to the event source the server sends out all current states so that the client can catch up with reality. -The payloads of these state events are also the same as the payloads of the REST API GET calls. -I would recommend just opening the network debug panel of your web browser to see what's sent. +The payloads of these state events are similar to the REST API GET calls, except SSE includes +both `name_id` and `id` fields during the deprecation period (until 2026.8.0), while REST +responses only include `id` in the new format. I would recommend just opening the network +debug panel of your web browser to see what's sent. {{< anchor "api-rest" >}} diff --git a/static/projects/bluetooth-proxy/seeed-esp32-poe.png b/static/projects/bluetooth-proxy/seeed-esp32-poe.png index 345bbdf9e2..f525f98d01 100644 Binary files a/static/projects/bluetooth-proxy/seeed-esp32-poe.png and b/static/projects/bluetooth-proxy/seeed-esp32-poe.png differ diff --git a/static/projects/irrf-proxy/xiao-ir-mate.png b/static/projects/irrf-proxy/xiao-ir-mate.png new file mode 100644 index 0000000000..b8798f6b8b Binary files /dev/null and b/static/projects/irrf-proxy/xiao-ir-mate.png differ diff --git a/themes/esphome-theme/layouts/_default/projects.html b/themes/esphome-theme/layouts/_default/projects.html index 05bb795efa..d215a0ec39 100644 --- a/themes/esphome-theme/layouts/_default/projects.html +++ b/themes/esphome-theme/layouts/_default/projects.html @@ -150,6 +150,15 @@

{{ .Title }}

+