⚠️ BREAKING CHANGES — ACTION REQUIRED BEFORE UPGRADING
Warning
Take a Home Assistant backup before upgrading. Existing HTTP indoor monitors now migrate their registry identities to their reported serial. Entity IDs are preserved; a registry conflict or backup failure causes setup to retry instead of building duplicate entities.
Affected recorder automations and dashboards need updating. This release removes the old per-camera Alarm Local sensors on recorders with the new terminal sensors and consolidates duplicate per-channel relay switches on the recorder.
- HTTP indoor monitors: This RC migrates generated identities to the real serial. The log names a private directory containing copies of the three persisted registries. Keep your Home Assistant backup; resolve any logged identity conflict or backup failure before retrying setup.
- Alarm inputs: Retarget automations and dashboards from the old per-camera Alarm Local sensors to the corresponding recorder terminal sensors. The old sensors become unavailable; their registry entries remain for reference.
- Relay outputs: Update automations and dashboards that used duplicate per-channel relay switches to use the recorder's relay switches.
Fourth release candidate for 2.0.0.
Since 2.0.0-rc.3
- Existing HTTP indoor monitors adopt their reported serial, preserving entity IDs, device IDs, dashboard references, automations and device metadata through an in-place registry migration. Legacy IDs are recognised even after credentials change. (#1108)
- Migration checks for entity, device and config-entry conflicts before making changes and again after copying all three persisted registries. Backup directories are private and unique. Any failure stops platform loading and releases sessions so setup can retry safely.
- After a monitor adopts its serial, failed identity reads on later reloads cause a retry instead of returning to a generated ID.
Included in 2.0.0-rc.3
- Add Do not disturb and four volume controls on indoor monitors that report the corresponding settings. Whole-table updates preserve neighboring settings, serialize concurrent changes, and clear cached reads. Invalid silence flags report unknown. (#1105)
- Retry incomplete DHIP monitor identities rather than generating a different serial. Missing model, firmware or serial responses cannot create a second set of entities, and subsequent attempts re-read the missing identity. Existing HTTP monitor identities stay unchanged. (#1106)
- Omit a MAC address reported by multiple recorder channels from those channels' device connections, including addresses spelled differently. Channels keep their unique identifiers, and cameras with a distinct MAC keep it. This fixes channel device registration failures on mixed coax/IP recorders. (#1107)
Included in 2.0.0-rc.2
- Add indoor monitors without an HTTP server through the normal add flow using local DHIP on TCP port 5000. Tested by the contributor on a VTH5221D. New DHIP entries use the monitor's real serial; existing HTTP entries retain their identities. Shared sockets close on unload, session expiry reconnects, and failed logins use Home Assistant's reauthentication handling. Actions are not automatically replayed after a lost reply. (#1103)
- Recover siren and white-light status through RPC2 when a channel refuses the CGI read. A transient failure or cancelled poll can recover later; an explicit method refusal is not retried every poll. This changes status reads only. (#1101)
- Include listener counts for each event/channel key in diagnostics, making accumulation visible.
events.listener_keysis now a mapping of keys to counts rather than a list; multiple listeners can be normal. (#1102)
Other changes since 1.3.1
- Play media, TTS results, or allowed audio files through a device's speaker with
dahua.play_audio. The offered formats use 8 kHz audio, with G.711 A-law as the default and little-endian PCM available. Conversion requires Home Assistant's ffmpeg integration. (#1086) - Choose the illumination mode on supported dual-light cameras. The selector reads the channel's scene state, verifies every scene after a write, and respects an active Illuminator override. (#1091)
- Give recorder alarm-input terminals their own sensors and relay outputs their own switches on the recorder's device. Read physical state as a bitmask; preserve input state or report relay state as unknown when a response cannot be read. (#1093, #1096, #1097)
- Suggest the existing motion-polling option when the device reports active motion but the stream has never delivered VideoMotion. Checks are bounded, the option remains user-controlled, and the repair clears when it is resolved or the device is removed. (#1095)
- Clarify which overlay the text-overlay service writes and the model-dependent "Location title" label. (#1092)
Validation
The full local suite passed 5,099 tests, with three real-ffmpeg conversion cases skipped locally and covered by GitHub CI with ffmpeg installed. Formatting passed for all 339 Python files. Real Home Assistant registry tests verify entity/device IDs are retained, conflicts and incomplete backups stop migration, backup copies are private and cannot overwrite each other, and serial policy survives reloads. The release ZIP is verified against the tagged source and manifest version.
Live migration on an existing HTTP monitor has not been exercised here. The migration is covered by automated tests using Home Assistant's real registries; hardware feedback remains part of RC validation.
Hardware evidence for audio formats comes from owner-listened VTO2000A speaker tests. Broader device and full Home Assistant service validation remain part of RC testing.
Full changelog: 1.3.1...2.0.0-rc.4
Changes since the previous RC: 2.0.0-rc.3...2.0.0-rc.4