Skip to content

Architecture

pickaxe edited this page Jul 22, 2026 · 4 revisions

Architecture

Version 3.0 runs entirely inside Home Assistant Core as a custom integration.

Home Assistant config entry
          │
          ▼
  transport coordinator
          │
          ├── Phone + Home Assistant: persistent companion WebSocket
          │
          └── Home Assistant only: persistent GATT session
                                      │
                            Home Assistant Bluetooth manager
                                      │
                             local adapter or active proxy

coordinator ──► four permanent native probe-temperature sensors
            ├─► one connection binary sensor
            └─► one last-successful-update timestamp sensor

There is no add-on runtime, ingress panel, MQTT broker, copied proxy secret, or general-purpose remote GATT service.

Setup lifecycle

  1. Home Assistant discovers the hub through a connectable local scanner or active ESPHome proxy.
  2. The integration generates and registers a private Weber companion before Bluetooth pairing.
  3. Home Assistant resolves the best Bluetooth route with its standard manager and bleak-retry-connector.
  4. The hub requires physical approval of the Home Assistant companion.
  5. Setup requires the exact hub to appear in that companion's Weber Cloud association list before saving the config entry.
  6. The transient pairing value is discarded; only the approved companion and hub configuration are retained by Home Assistant.

Runtime lifecycle

Each config entry owns exactly one transport. The default cloud mode retains one WebSocket; local mode retains one subscribed GATT connection and one proxy slot when a proxy is selected. A link failure, mode change, reload, or shutdown closes the owned connection. Both paths publish the same normalized four-slot probe state plus connection and last-update context on a 10-second cadence.

Protocol and security boundaries

Home Assistant owns adapters, proxy credentials, connection-slot allocation, config-entry storage, and entity authorization. The integration never contacts an ESPHome proxy directly or reads Home Assistant .storage.

Local frames must pass declared-length, CRC, terminal-marker, and routing checks. Cloud status is accepted only from the configured appliance for the generated companion. Diagnostics redact credentials and device identifiers and exclude raw frames and recipe metadata.

Weber's Bluetooth and cloud protocols are private and can change without notice. The 3.0 runtime implements only the minimum read-only pairing and probe status surface.

Clone this wiki locally