Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
03113cc
update HA version requirement (#5975)
dhoeben Jan 30, 2026
71099ef
[web-api] Document SSE entity ID deprecation path with name_id field …
bdraco Jan 30, 2026
43ff629
Add ir/rf proxy to ready made projects (#5996)
balloob Jan 30, 2026
ac68a93
Bump docker/setup-buildx-action from 3.11.1 to 3.12.0 (#5810)
dependabot[bot] Jan 31, 2026
25674d3
Bump actions/checkout from 5.0.1 to 6.0.2 (#5970)
dependabot[bot] Jan 31, 2026
5f1d660
Bump dessant/lock-threads from 5.0.1 to 6.0.0 (#5781)
dependabot[bot] Jan 31, 2026
957efe6
Bump actions/upload-artifact from 5.0.0 to 6.0.0 (#5780)
dependabot[bot] Jan 31, 2026
8ff4166
Bump actions/setup-python from 6.0.0 to 6.2.0 (#5969)
dependabot[bot] Jan 31, 2026
9e834d3
Remove `version` from docker compose sample (#5988)
ondrejnedoma Jan 31, 2026
32c8cfc
[key_collector] Add missing start_keys documentation (#5929)
swoboda1337 Jan 31, 2026
d6fafb0
Add raw segment buffer support to TM1637 documentation
tuct Feb 1, 2026
40dbe79
Update TM1637 documentation to include raw segment buffer usage example
tuct Feb 1, 2026
7630248
update HA version requirement (#5975)
dhoeben Jan 30, 2026
2b8f1dc
[web-api] Document SSE entity ID deprecation path with name_id field …
bdraco Jan 30, 2026
e5da904
Add ir/rf proxy to ready made projects (#5996)
balloob Jan 30, 2026
f029cca
Bump docker/setup-buildx-action from 3.11.1 to 3.12.0 (#5810)
dependabot[bot] Jan 31, 2026
c22d14c
Bump actions/checkout from 5.0.1 to 6.0.2 (#5970)
dependabot[bot] Jan 31, 2026
daa0ef2
Bump dessant/lock-threads from 5.0.1 to 6.0.0 (#5781)
dependabot[bot] Jan 31, 2026
15803de
Bump actions/upload-artifact from 5.0.0 to 6.0.0 (#5780)
dependabot[bot] Jan 31, 2026
f2d6ab7
Bump actions/setup-python from 6.0.0 to 6.2.0 (#5969)
dependabot[bot] Jan 31, 2026
df77fb6
Remove `version` from docker compose sample (#5988)
ondrejnedoma Jan 31, 2026
c180fe0
[key_collector] Add missing start_keys documentation (#5929)
swoboda1337 Jan 31, 2026
aecfd56
Add raw segment buffer support to TM1637 documentation
tuct Feb 1, 2026
f6d85eb
Update TM1637 documentation to include raw segment buffer usage example
tuct Feb 1, 2026
7c95e5a
Merge branch 'origin/next' of https://github.com/tuct/esphome-docs in…
tuct Feb 2, 2026
554b872
Add raw segment buffer support to TM1637 documentation
tuct Feb 1, 2026
460d745
Update TM1637 documentation to include raw segment buffer usage example
tuct Feb 1, 2026
4f6998e
Update TM1637 documentation to clarify raw segment buffer usage
tuct Feb 2, 2026
3de0e43
Merge branch 'origin/next' of https://github.com/tuct/esphome-docs in…
tuct Feb 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/auto-label-pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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

Expand All @@ -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

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/component-image.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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 }}
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/lock.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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: ""
Expand Down
2 changes: 2 additions & 0 deletions content/changelog/2026.1.0.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions content/components/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
18 changes: 18 additions & 0 deletions content/components/display/tm1637.md
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,8 @@
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.


Check failure on line 125 in content/components/display/tm1637.md

View workflow job for this annotation

GitHub Actions / Lint

Multiple consecutive blank lines [Expected: 1; Actual: 2]

Check failure on line 126 in content/components/display/tm1637.md

View workflow job for this annotation

GitHub Actions / Lint

Multiple consecutive blank lines [Expected: 1; Actual: 3]
Comment on lines +125 to +126
Copy link

Copilot AI Feb 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are two consecutive empty lines here before the “Creating a digital clock” heading. Please remove the extra blank lines to keep spacing consistent with the rest of the document.

Suggested change

Copilot uses AI. Check for mistakes.
Comment on lines +125 to +126
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Remove extra blank lines to satisfy lint.

Lint reports multiple consecutive blank lines here. Collapse to a single blank line.

🔧 Proposed fix
-
-
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
🧰 Tools
🪛 GitHub Check: Lint

[failure] 126-126:
Multiple consecutive blank lines [Expected: 1; Actual: 3]


[failure] 125-125:
Multiple consecutive blank lines [Expected: 1; Actual: 2]

🤖 Prompt for AI Agents
In `@content/components/display/tm1637.md` around lines 125 - 126, Remove the
multiple consecutive blank lines in the TM1637 display markdown section and
collapse them to a single blank line so the file no longer has consecutive empty
lines; edit the tm1637.md content around the documented display section to leave
only one blank line between paragraphs/headings.

### Creating a digital clock

The following example creates a typical digital clock with the `:` colon flashing every second.
Expand Down Expand Up @@ -179,6 +181,22 @@

{{< 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);
```
Comment on lines +191 to +198
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

# Find tm1637-related source files
find . -type f \( -name "*tm1637*" -o -name "*TM1637*" \) | head -20

Repository: esphome/esphome-docs

Length of output: 361


🏁 Script executed:

# Search for set_buffer method definition in cpp/h files
rg -l 'set_buffer' --type=cpp

Repository: esphome/esphome-docs

Length of output: 212


🏁 Script executed:

# Look for TM1637 class/component definition
rg 'class.*TM1637' --type=cpp -A 10

Repository: esphome/esphome-docs

Length of output: 212


🏁 Script executed:

# Read the tm1637.md file to see the full context
wc -l ./content/components/display/tm1637.md

Repository: esphome/esphome-docs

Length of output: 106


🏁 Script executed:

# Read the section around lines 191-198 to get more context
sed -n '170,220p' ./content/components/display/tm1637.md

Repository: esphome/esphome-docs

Length of output: 1227


🏁 Script executed:

# Search for "set_buffer" in the documentation
rg -n 'set_buffer' ./content/components/display/tm1637.md -B5 -A5

Repository: esphome/esphome-docs

Length of output: 825


🏁 Script executed:

# Search for "buffer" references to understand sizing
rg -n -i 'buffer' ./content/components/display/tm1637.md

Repository: esphome/esphome-docs

Length of output: 280


🏁 Script executed:

# Check what's in the See Also section and look for API references
sed -n '200,204p' ./content/components/display/tm1637.md

Repository: esphome/esphome-docs

Length of output: 252


🏁 Script executed:

# Search for any other mentions of buffer or configuration examples
rg -n 'lambda' ./content/components/display/tm1637.md

Repository: esphome/esphome-docs

Length of output: 504


🏁 Script executed:

# Look for configuration documentation that might mention display dimensions
rg -n -i 'digit\|config\|buffer' ./content/components/display/tm1637.md | head -20

Repository: esphome/esphome-docs

Length of output: 46


🏁 Script executed:

# Read the first part of the file to understand configuration structure
sed -n '1,100p' ./content/components/display/tm1637.md

Repository: esphome/esphome-docs

Length of output: 4765


🏁 Script executed:

# Look for all lambda examples to see if there's a pattern
rg -n 'it\.' ./content/components/display/tm1637.md

Repository: esphome/esphome-docs

Length of output: 596


Clarify set_buffer byte count to match TM1637 buffer capacity.

The example passes 6 bytes (the TM1637 hardware buffer size supporting up to 6 digits), but this isn't explained. Readers seeing a 4-digit length: 4 config may expect only 4 bytes. Add a note that set_buffer always requires 6 bytes representing the full buffer capacity, with unused positions padded as needed (e.g., 0x00).

🤖 Prompt for AI Agents
In `@content/components/display/tm1637.md` around lines 191 - 198, Clarify that
the TM1637::set_buffer call always expects six bytes corresponding to the
hardware's full 6-digit buffer (even if your config uses length: 4), and update
the example/description around the lambda and set_buffer usage to state that
unused digit positions must be padded (e.g., with 0x00) so callers know to
always supply six values to set_buffer.


## See Also

- {{< docref "index/" >}}
Expand Down
5 changes: 5 additions & 0 deletions content/components/key_collector.md
Original file line number Diff line number Diff line change
Expand Up @@ -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: "*"
Expand Down Expand Up @@ -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`.
Expand Down
2 changes: 1 addition & 1 deletion content/components/water_heater/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -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" >}}

Expand Down
1 change: 0 additions & 1 deletion content/guides/getting_started_command_line.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
31 changes: 23 additions & 8 deletions content/web-api/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -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" >}}

Expand Down
Binary file modified static/projects/bluetooth-proxy/seeed-esp32-poe.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added static/projects/irrf-proxy/xiao-ir-mate.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
63 changes: 63 additions & 0 deletions themes/esphome-theme/layouts/_default/projects.html
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,15 @@ <h1>{{ .Title }}</h1>
</div>
</div>
</label>
<label>
<input type="radio" name="type" value="irrf" />
<div class="text">
<div class="name">Infrared Proxy</div>
<div class="description">
Create a device to allow Home Assistant to control infrared devices.
</div>
</div>
</label>
<label>
<input type="radio" name="type" value="empty" />
<div class="name">Empty ESPHome device</div>
Expand Down Expand Up @@ -651,6 +660,60 @@ <h3>For advanced users</h3>
</ul>
</div>

<div
class="type type-irrf hidden"
data-manifest-root="https://firmware.esphome.io/infrared-proxy"
>
<div class="question-prompt">
Pick the device you want to turn into an infrared proxy:
</div>
<div class="radios">
<label>
<input
type="radio"
name="irrf-device"
class="device-option"
value="xiao-ir-mate"
data-manifest-root="https://firmware.esphome.io/xiao-ir-mate"
checked
/>
<img
src="/projects/irrf-proxy/xiao-ir-mate.png"
alt="XIAO IR Mate"
/>
</label>
</div>

<div class="question-prompt">Start the installation:</div>
<esp-web-install-button></esp-web-install-button>

<div class="hidden info xiao-ir-mate">
<h3>Xiao IR Mate</h3>
<p>Small but powerful infrared emitter.</p>
<p>Learn more & buy</p>
<ul>
<li>
<a href="https://www.seeedstudio.com/XIAO-Smart-IR-Mate-p-6492.html">Seeed Studio</a>
</li>
</ul>
</div>

<h3>For advanced users</h3>
<ul>
<li>
The device is adoptable in
<a
href="https://my.home-assistant.io/redirect/supervisor_addon/?addon=5c53de3b_esphome&amp;repository_url=https%3A%2F%2Fgithub.com%2Fesphome%2Fhome-assistant-addon"
>the ESPHome dashboard</a
>
</li>
<li>
The YAML configuration is on
<a href="https://github.com/esphome/infrared-proxies">GitHub</a>
</li>
</ul>
</div>

<div class="type type-empty">
<div class="question-prompt">
Pick the manufacturer of the device you want to set up:
Expand Down