ESPHome boards can already share sensor readings through packet_transport, over UDP or a UART. A new component, packet_interface, adds a level underneath: a common way to send packets over a link, with optional layers that resend lost packets, check whether the other side is still there and encrypt the traffic. The author, clydebarrow, split the work into a stack of pull requests. The component itself, with a UART link, was merged on 23 October 2026. The UDP link and three layers followed on 24 October. All of it is in the development branch for ESPHome 2026.11.

Links

The uart link frames packets with the same byte stuffing that the UART platform of packet_transport already uses. The udp link sends each packet as one UDP datagram to every address configured in the udp component.

A new packet_interface platform for packet_transport connects the two, so existing sensor sharing can run over any link. This is the example from the encryption pull request:

uart:
  tx_pin: GPIO17
  rx_pin: GPIO16
  baud_rate: 115200

packet_interface:
  - platform: uart
    id: serial_link
    encryption:
      key: Johnny Cash
      rolling_code_enable: true
    session:
      keep_alive: 10s
      binary_sensor:
        name: Link connected

packet_transport:
  - platform: packet_interface
    packet_interface: serial_link
    sensors:
      - temperature

Three layers

Layers are configured on the link's entry and are always stacked in a fixed order, whatever order you write them in.

  • Reliability (reliability:) follows HDLC and delivers packets between two devices in order, without loss or duplicates. It adds 3 bytes per packet: a control byte and a CRC-16. Sequence numbers run modulo 8, and a gap is answered with a REJ frame, so the peer resends at once. The timeout is at least 50 ms (200 ms by default) and gets up to a quarter added at random, so two devices whose frames collided do not resend at the same moment. ack_delay lets one acknowledgement cover several frames, which the author says matters on half-duplex radios.
  • Session (session:) sends keep-alives and reports whether the peer is reachable, optionally to a binary sensor. Each keep-alive carries a random number chosen at boot, so a restart of the peer is noticed even when it is quicker than the timeout. keep_alive can be set from 1 s to 1 h, and the timeout defaults to three keep-alive intervals.
  • Encryption (encryption:) encrypts and authenticates every packet with XXTEA and a 256-bit key, the SHA-256 of the configured key text. A modified packet, or one encrypted with another key, is dropped. With rolling_code_enable, a boot number saved in flash and a packet counter also reject replayed packets. The layer adds 4 to 8 bytes per packet, or 16 to 19 with the rolling code.

Before you use it on a network

In the merged code the UDP link accepts datagrams from any sender. A later pull request should make it accept only the peer when udp sends to a single unicast address. Until then, the author says a shared network needs an encryption or addressing layer on top. The test environment lists only ESP32 with ESP-IDF, and the documentation is still an open pull request (esphome.io #7783).

Next in the stack: addressing and fragmentation layers, an entity_transport component, and TCP, ESP-NOW and LoRa links.