Skip to content

Commit 5feae84

Browse files
committed
docs: release 2.2.0 - single zone device, updated README, info, SDD, ADD and workflows
README: 2.2.0 release block (zone entities on one device, entity ids unchanged, retired devices cleaned up). info.md: features, device registry section and the wizard order (the real order is connection -> areas -> outputs -> zones, all zones on one page), plus a 2.2.0 changelog entry. SDD: version/status and the device layout and alignment sections for the single device. ADD: front matter on master/2.2.0, entry_id in the runtime data, and a new DEC-7 recording why all zone entities live on one device. WORKFLOWS: branch/version on master and a release flow without the retired dev branch. manifest 2.2.0.
1 parent e0a54a0 commit 5feae84

7 files changed

Lines changed: 92 additions & 40 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
# Changelog
22

3-
## [2.2.0-beta.1] - 2026-10-10
3+
## [2.2.0] - 2026-10-10
44

5-
> ⚠️ **Pre-release - enable *Show beta versions* in HACS to test it.**
5+
The promotion of `2.2.0-beta.1` to stable - same behaviour, no configuration change. The beta was
6+
published for testing and is superseded by this release.
67

78
**All zone entities now live on one device** (`Crow Alarm Sensors`) instead of one device per zone
89
type. Home Assistant links an entity to a device only when it is registered for the very first time,

‎README.md‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@ This is a custom integration for **Home Assistant** to control **Crow Runner**,
88

99
Unlike previous solutions, this integration uses a **direct local TCP implementation** (the driver is vendored inside the integration, so no external Python dependency is installed) to ensure robust connection handling, specific command sequences (`Code` -> `Command` -> `Enter`), and accurate status parsing.
1010

11-
> **Current release: `2.1.4`.** Targets Home Assistant 2026.9.3.
11+
> **Current release: `2.2.0`.** Targets Home Assistant 2026.9.3.
1212
> Users on Home Assistant 2026.8 or older should stay on `2.0.0`.
13-
> The `2.1.0-beta.1` / `2.1.0-beta.2` pre-releases are superseded - update to `2.1.4`
13+
> `2.2.0` reworks the zone devices: **all zone entities now live on one device**
14+
> (*Crow Alarm Sensors*) and the retired per-type devices are cleaned up automatically.
15+
> Existing entity ids are left untouched, so no dashboard or automation needs editing.
16+
> The `2.1.0-beta.*` and `2.2.0-beta.1` pre-releases are superseded - update to `2.2.0`
1417
> (HACS shows it without enabling *Show beta versions*).
15-
> `2.2.0-beta.1` is available for testing with *Show beta versions* enabled.
1618
1719
## ✅ Requirements
1820

‎custom_components/crowipmodule/manifest.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@
99
"integration_type": "hub",
1010
"iot_class": "local_push",
1111
"issue_tracker": "https://github.com/acdcnow/Crow-AAP-Alarm-System-for-Home-Assistant/issues",
12-
"version": "2.2.0-beta.1"
12+
"version": "2.2.0"
1313
}

‎docs/ADD.md‎

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
**Project:** Crow/AAP Alarm IP Module for Home Assistant
44
**Integration domain:** `crowipmodule`
5-
**Branch:** `HA2026_09_dev`
6-
**Version:** `2.1.0-beta.1`
7-
**Status:** Pre-release, implementation complete
8-
**Last updated:** 2026-09-21
5+
**Branch:** `master`
6+
**Version:** `2.2.0`
7+
**Status:** Released
8+
**Last updated:** 2026-10-10
99

1010
---
1111

@@ -49,7 +49,7 @@ Out of scope:
4949
| G3 | Stay usable when the panel or network is unavailable | Availability driven by real connection state; supervised reconnect with backoff |
5050
| G4 | Report every panel signal the protocol exposes | 16 zones, 2 areas, 8 outputs, 21 system statuses |
5151
| G5 | Be diagnosable from a user's Home Assistant instance | Downloadable diagnostics with redaction, plus a "System Status" text sensor |
52-
| G6 | Present as a first-class integration | Local `brand/` assets, UI config flow, 5 translations, device registry grouping |
52+
| G6 | Present as a first-class integration | Local `brand/` assets, UI config flow, 5 translations, device registry (hub + one zone device) |
5353

5454
### 2.2 Non-goals
5555

@@ -184,15 +184,17 @@ untyped, unnamespaced, and leaks if a platform fails to unload.
184184
@dataclass
185185
class CrowRuntimeData:
186186
controller: CrowIPAlarmPanel
187+
entry_id: str | None = None # config entry id, to scope registry lookups
187188
device_id: str | None = None # device registry id of the hub, for via_device_id
188189
firmware: str | None = None # "<version> (<date>)", for sw_version
189190
```
190191

191192
**Consequences.**
192193

193-
* ✔ Lifetime is tied to the entry; unload cannot leak.
194-
* ✔ One object carries every shared dependency, so platform setup is a single attribute read.
195-
* ✔ `device_id` gives the zone sub-devices a valid `via_device_id` (see DEC-5).
194+
* ✔ Lifetime is tied to the entry; unload cannot leak.
195+
* ✔ One object carries every shared dependency, so platform setup is a single attribute read.
196+
* ✔ `device_id` gives the zone sub-devices a valid `via_device_id` (see DEC-5).
197+
* ✔ `entry_id` scopes the entity-registry lookups of the zone alignment (see DEC-7).
196198

197199
### 5.5 DEC-5 — Register the hub device before forwarding platforms
198200

@@ -226,7 +228,33 @@ drops and recover on reconnect.
226228
* ✔ Users and automations can distinguish "disarmed" from "unknown".
227229
* ✔ `Diagnostics` and the System Status sensor expose `connected` explicitly.
228230
* ✘ A brief network blip marks entities unavailable, which some automations treat as a state change.
231+
### 5.7 DEC-7 — One device for all zone entities
232+
233+
**Context.** Releases 2.1.x gave every zone type its own device (*Crow Alarm Windows*, *Crow Alarm
234+
Doors*, *Crow Alarm Motion*, ...) so that the type became part of the entity name and entity id.
235+
That turned out to be a trap: Home Assistant links an entity to a device **only when the entity is
236+
registered for the very first time**. An entity created while a zone still had another type stayed on
237+
the device of that former type, and re-configuring the zone in the UI did not move it - the device
238+
list kept showing a door zone under *Windows* with no way to correct it from the UI.
239+
240+
**Decision.** All zone entities are registered on the single *Crow Alarm Sensors* device
241+
(`const.IDENTIFIER_ZONE`). The zone type still selects the binary-sensor **device class** (the icon:
242+
door, window, motion, smoke, ...), but never the device. `binary_sensor._async_align_zone_entities()`
243+
re-links existing zone entities to that device on every setup, so an installation that has been
244+
through the split layout is corrected by a restart, and
245+
`_remove_retired_zone_devices()` deletes the retired per-type devices once nothing is registered on
246+
them.
229247

248+
**Consequences.**
249+
250+
* ✔ There is no second device left for a zone to be stuck on, whatever order zones were configured
251+
or re-typed in.
252+
* ✔ Entity ids are never rewritten by the integration: they are stable handles for dashboards and
253+
automations, and a zone that keeps its id keeps working after the move.
254+
* ✘ An entity id may still name a device the entity no longer hangs off
255+
(`binary_sensor.crow_alarm_windows_terrassentur` on *Crow Alarm Sensors*). That is cosmetic; the
256+
diagnostics `zone_registry` report shows the real device link.
257+
* ✘ The type is no longer visible in the device name, so the icon and the entity name carry it.
230258
---
231259

232260
## 6. Runtime view
@@ -347,7 +375,7 @@ Verified against the real 2026.9.3 sources; each row is asserted by
347375
```
348376
<config>/custom_components/crowipmodule/
349377
```
350-
Installed by HACS from GitHub release archive `2.1.0-beta.1` (or the branch), or copied manually.
378+
Installed by HACS from GitHub release archive `2.2.0` (or the branch), or copied manually.
351379
Home Assistant imports the package at startup; the config entry lives in
352380
`.storage/core.config_entries`, not in YAML. Per-entry runtime objects are constructed at setup and
353381
released at unload.

‎docs/SDD.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
**Project:** Crow/AAP Alarm IP Module for Home Assistant
44
**Integration domain:** `crowipmodule`
5-
**Branch:** `master` · **Version:** `2.2.0-beta.1` · **Status:** pre-release
5+
**Branch:** `master` · **Version:** `2.2.0` · **Status:** released
66
**Last updated:** 2026-10-10
77

88
This document specifies **how** the integration is built: modules, signatures, data shapes,

‎docs/WORKFLOWS.md‎

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# Workflows and Diagrams
22

33
**Project:** Crow/AAP Alarm IP Module for Home Assistant
4-
**Branch:** `HA2026_09_dev` · **Version:** `2.1.0-beta.1`
5-
**Last updated:** 2026-09-21
4+
**Branch:** `master` · **Version:** `2.2.0`
5+
**Last updated:** 2026-10-10
66

77
Every diagram below is **Mermaid**, so it renders natively on GitHub, in the wiki, and in any
88
Mermaid-capable viewer. The narrative companion is the [ADD](ADD.md); the module-level detail is the
@@ -271,7 +271,7 @@ needs Python 3.14.2+.
271271
> **Important limitation.** GitDiagram analyses the repository's **default branch only**. At the time
272272
> of writing that is `master`, which still depends on the external `pycrowipmodule` package — the tool
273273
> said so itself: *"the external pycrowipmodule implementation was not provided."*
274-
> The diagram therefore describes the **legacy** architecture, not `HA2026_09_dev`.
274+
> The diagram therefore describes the **legacy** architecture, not `master`.
275275
276276
Re-generate or explore it interactively at:
277277
**https://gitdiagram.com/acdcnow/crow-aap-alarm-system-for-home-assistant**
@@ -318,7 +318,7 @@ flowchart TD
318318
class CC legacy
319319
```
320320

321-
The same shape in the current (`HA2026_09_dev`) architecture, for comparison — the differences are
321+
The same shape in the current (`master`) architecture, for comparison — the differences are
322322
the local driver, the extra sensor/button platforms, `runtime_data`, the hub device and diagnostics:
323323

324324
```mermaid
@@ -349,12 +349,11 @@ Green nodes mark what the 2026.9 development branch added or changed.
349349

350350
```mermaid
351351
flowchart LR
352-
Dev["Commit to<br/>HA2026_09_dev"] --> Ver{"All four<br/>checks pass"}
352+
Dev["Commit to<br/>master"] --> Ver{"All four<br/>checks pass"}
353353
Ver -->|no| Dev
354354
Ver -->|yes| Bump["Bump manifest version<br/>and CHANGELOG"]
355-
Bump --> Tag["Annotated tag<br/>no v prefix"]
356-
Tag --> Push["Push branch and tag"]
357-
Push --> Rel["GitHub pre-release<br/>with release notes"]
358-
Rel --> HACS["HACS offers it<br/>when betas are enabled"]
359-
Rel --> PR["PR stays open<br/>until promotion to stable"]
355+
Bump --> Tag["Tag<br/>no v prefix"]
356+
Tag --> Push["Push master and tag"]
357+
Push --> Rel["GitHub release<br/>prerelease: true for a beta"]
358+
Rel --> HACS["HACS offers it = tag<br/>(betas need Show beta versions)"]
360359
```

‎info.md‎

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,18 @@ It communicates directly with the IP module over the local network to provide re
66

77
## ✨ Features
88

9-
* **Config Flow:** Fully configurable via the Home Assistant UI (no YAML required).
9+
* **Config Flow:** Fully configurable via the Home Assistant UI (no YAML required). All zones are
10+
configured in a single step - one name/type pair per zone.
1011
* **Alarm Control Panel:** Arm (Away/Stay), Disarm, and Trigger panic alarms for up to 2 Areas (Partitions).
11-
* **Zones:** Binary sensors for up to 16 zones (Motion, Door, Window, Smoke, etc.).
12+
* **Zones:** Binary sensors for up to 16 zones. The **type** you pick (Motion, Door, Window, Smoke, ...)
13+
sets the icon and device class of the sensor and is selected from a translated dropdown.
1214
* **Outputs:** Control up to 2 switchable outputs (e.g., Garage Door, Gates).
1315
* **System Status:** Diagnostic sensors for Mains Power, Battery, Tamper, Phone Line, and Dialler status.
14-
* **Device Registry:** All entities are grouped under a single "Crow Alarm System" device.
16+
* **Device Registry:** every zone entity lives on the single **Crow Alarm Sensors** device; the panel
17+
itself and the system status sensors live on **Crow Alarm System**. The per-type devices of older
18+
releases (Windows, Doors, Motion, ...) are removed automatically once nothing is registered on them.
19+
* **Diagnostics:** *Download diagnostics* includes a per-zone report of the configured type and the
20+
device the entity is really registered on.
1521
* **Dashboard:** a ready-to-use Lovelace dashboard with a standard and an expert view ships in [`dashboards/`](dashboards/README.md).
1622

1723
## 📋 Requirements
@@ -47,27 +53,27 @@ This integration uses a 4-step configuration wizard.
4753

4854
### The Setup Wizard
4955

50-
* **Step 1: Areas**
56+
* **Step 1: Connection**
57+
* **IP Address:** The local IP of your alarm module.
58+
* **Port:** Usually `5002`.
59+
* Pick the firmware build, how the panel is armed, and how many areas / outputs / zones you have.
60+
61+
62+
* **Step 2: Areas**
5163
* Name your partitions (e.g., "House", "Garage").
5264
* (Optional) Enter a default code if you want to arm/disarm without typing it every time.
5365

5466

55-
* **Step 2: Switches (Outputs)**
67+
* **Step 3: Switches (Outputs)**
5668
* Name your controllable outputs (Output 3 & 4), e.g., "Garage Door".
5769

5870

59-
* **Step 3: Zones**
60-
* Name your 16 zones.
61-
* Select the type for each zone (Motion, Door, Window, Smoke, etc.) from the dropdown.
71+
* **Step 4: Zones**
72+
* All zones are on one page: name each zone and pick its type (Motion, Door, Window, Smoke, ...).
73+
* The type sets the sensor icon; it does not decide which device the sensor lives on.
6274
* *Tip: Leave unused zones empty.*
6375

6476

65-
* **Step 4: Connection**
66-
* **IP Address:** The local IP of your alarm module.
67-
* **Port:** Usually `5002`.
68-
69-
70-
7177
### Migration from YAML
7278

7379
If you previously used the YAML configuration, the integration will automatically import your settings (Zones, Areas, IP) upon the first restart. Once the device appears in the "Integrations" dashboard, you can safely remove the `crowipmodule:` section from your `configuration.yaml`.
@@ -96,6 +102,22 @@ Here is a detailed **CHANGELOG** summarizing the refactoring from the original Y
96102

97103
# Changelog
98104

105+
## [2.2.0] - Zone devices reworked
106+
107+
**All zone entities now live on one device, *Crow Alarm Sensors*.** Home Assistant links an entity to a
108+
device only when it is registered for the very first time, so the previous per-type devices (Windows,
109+
Doors, Motion, ...) could leave a zone on the device of a type it no longer had - and re-configuring
110+
the zone never moved it.
111+
112+
* Every existing zone entity is moved onto *Crow Alarm Sensors* on the next restart.
113+
* **Entity ids are left exactly as they are**, so dashboards and automations keep working. Entities
114+
created from scratch get `binary_sensor.crow_alarm_sensors_<name>`.
115+
* The retired per-type devices are removed automatically once nothing is registered on them.
116+
* The zone **type** still sets the sensor icon and device class (Fenster, Tür, Bewegung, Rauch, ...).
117+
* *Download diagnostics* now reports, per zone, the configured type and the device the entity is
118+
really registered on.
119+
* No configuration change is needed.
120+
99121
## [2.0.0] - Refactoring for Home Assistant 2026.09+
100122

101123
This release marks a complete rewrite of the integration to support modern Home Assistant standards, introducing UI configuration (Config Flow) and removing the dependency on YAML configuration files.

0 commit comments

Comments
 (0)