Home Assistant
Rendered from spec at76d46f3 (2026-10-25) · its source · Edit this page
Status: Accepted · Audience: Operator, household member · Area: F — Extensibility
Purpose
Put the stack where many households already watch their homes. Home Assistant gets the stack’s health, its alerts, a short list of controls, and a member’s own library, from the web API, with an integration key (C10) rather than the operator’s password.
The integration lives in
integration-home-assistant and speaks
to the stack only through sdk-python. Home Assistant
installs it as a HACS custom repository. Nothing in Home Assistant itself changes.
Behaviour
Connecting takes what the mint reply gave
Setup asks for the stack’s address, the key and the certificate pin. All three come in the reply that minted the key, so the operator pastes what they were shown. Setup checks all three against the stack before it creates anything, and names whichever one failed.
What appears is what the key can see
| Key scope | Entities |
|---|---|
read |
Stack health, doctor findings by severity, disk free per mount, active streams, the download queue and its speed, whether the VPN is up, and updates available. Alerts arrive as Home Assistant events. |
act |
All of read’s entities, plus buttons to restart a service and to run the doctor, update entities that apply a stack update, and a switch that pauses or resumes downloads. These are exactly the actions the contract lets a key call. |
member:<account> |
That member’s requests by state and what they are playing, in the household’s words. Nothing technical. |
It follows the stream
State comes from the event stream rather than from polling. A value gathered before a gap in the stream is shown as unavailable until the stream says what it is now, never as current.
A revoked key asks to be replaced
When the stack refuses the key, Home Assistant starts its reauthentication flow and asks for a new one. The address and pin can be changed without removing the integration.
States
| State | Meaning |
|---|---|
connected |
The stream is live and entities are current |
stale |
The stream has a gap; entities show unavailable until it resumes |
refused |
The key was refused; reauthentication has been asked for |
unreachable |
The stack did not answer at the address, or the pin did not match |
Edge cases
| Situation | Behaviour |
|---|---|
| The pin does not match the certificate | Refused during the handshake, before any request is written; setup names the pin. |
| The web surface is loopback-bound and Home Assistant runs elsewhere | Setup says the stack is unreachable from here and points at C6’s binding, rather than reporting a wrong key. |
| A control is pressed whose action becomes uncallable by a key | The stack’s refusal is shown as the control’s outcome; the control is removed at the next restart of the integration. |
| An alert carries the remedy text | The event carries what happened, what it means and what to do, as B5 writes it, and never a credential. |
| A member key’s account leaves the household | The key is refused and reauthentication is asked for. |
Acceptance criteria
| ID | Requirement |
|---|---|
| F12-R1 | The integration MUST reach a stack only through sdk-python and only with an integration key, and MUST NOT ask for, accept or store the operator password. |
| F12-R2 | Setup MUST take the stack’s address, a key and its certificate pin, MUST verify all three against the stack before creating an entry, and MUST name whichever failed. |
| F12-R3 | A refused key MUST start Home Assistant’s reauthentication flow, and the address and pin MUST be changeable without removing the entry. |
| F12-R4 | The integration MUST create entities only for what its key’s scope admits. A member key MUST yield no technical entity. |
| F12-R5 | With a read or act key, the integration MUST provide stack health, doctor findings by severity, disk free per mount, active streams, the download queue and its speed, whether the VPN is up, and updates available. |
| F12-R6 | Each alert MUST be fired as a Home Assistant event at onset and at resolution, carrying what happened, what it means and what to do, and never a credential. |
| F12-R7 | State MUST follow the event stream. A value gathered before a gap MUST be shown as unavailable until the stream resumes, and MUST NOT be shown as current. |
| F12-R8 | With an act key, the integration MUST provide restart-service and run-doctor buttons, update entities that apply a stack update, and a pause/resume downloads switch, and no control for an action the contract does not list as callable by a key. Each control MUST report the outcome of the job it started. |
| F12-R9 | With a member:<account> key, the integration MUST provide that member’s requests by state and what they are playing, in the household’s words. |
| F12-R10 | Diagnostics MUST withhold the key, the address and the pin. |
| F12-R11 | Every string the integration shows MUST be translated, in English and Dutch at least. |
| F12-R12 | The integration MUST meet every rule of Home Assistant’s integration quality scale up to and including Platinum. |
| F12-R13 | The integration MUST be installable as a HACS custom repository from this organisation, and MUST NOT require any change to Home Assistant itself. |
| F12-R14 | Setup MUST accept a key link (C10-R18) in place of the address, key and pin: it MUST collect the key once over the TLS the link’s fingerprint verifies (C10-R20), keep only what the reply carries, and name the reason when the claim is refused. |
Related
- C10 Integration keys — what it holds
- C6 Web UI security & binding policy — whether it can reach the stack at all
- B5 Notifications — what an alert says
sdk-python·integration-home-assistant