⚠️ BREAKING CHANGES — ACTION REQUIRED BEFORE UPGRADING
Warning
Illuminator entities removed on affected channels: Channels that explicitly report a white emitter without a supported brightness bank no longer get an Illuminator light entity. Check automations and dashboards that reference it and remove or update affected references before upgrading.
Indoor monitors with no camera: Affected VTH monitors that do not describe a local camera and explicitly refuse the VideoInput table no longer get camera-related entities. Existing registry rows can remain unavailable. Review automations and dashboards that reference them.
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.
- Illuminator entities: A named white-light row without a MiddleLight, NearLight or FarLight brightness bank no longer creates an Illuminator entity. This removes controls whose writes target a nonexistent brightness field and are refused. Review affected automation/dashboard references.
- VTH camera-related entities: A monitor with no Local0 camera declaration and an explicitly refused VideoInput table loses the nonworking camera-related entities, including motion controls. Retire affected dashboard and automation references. Session failures leave the capability undecided.
- HTTP indoor monitors: This release 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.
2.0.0 is a stable release. Requires Home Assistant 2026.8.0 or newer. Read the breaking-change notice above before upgrading from 1.3.1.
Features since 1.3.1
- Clarify what the H.264 repair changes, when writes happen and how recordings are affected. The picker and explanation now include camera names while keeping channel selection unchanged. (#1133)
- Add a post-publication check that the release is visible to the intended HACS channel. It detects API ordering that would hide an update. (#1135)
- Device speaker playback: Play media, TTS results or allowed audio files with
dahua.play_audio. Supported output 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) - Indoor monitors: Add monitors without HTTP through local DHIP on TCP port 5000, with real serial identities, push events, session recovery and reauthentication handling. Add Do not disturb and volume controls where reported, including a separate ring-volume slider for each configured door station. Concurrent settings updates preserve neighboring values. (#1103, #1105, #1110, #1124)
- Recorder terminals: Give physical alarm inputs their own sensors and relay outputs their own switches on the recorder device. Existing per-camera alarm sensors and duplicate relay switches are replaced; update affected references as described above. (#1093, #1096, #1097)
- Illumination: Choose the illumination mode on supported dual-light cameras, with per-scene write verification and respect for an active Illuminator override. White-light entities require a supported brightness bank where the device explicitly names the emitter type. (#1091, #1123)
- Motion controls: Add Region 1 sensitivity and threshold sliders on channels reporting those fields. Suggest the existing motion-polling option when polling sees active motion but the event stream has delivered none; the option stays user-controlled. (#1118, #1095)
- Browser playback repair: Explain when H.265 without audio affects live view and optionally switch selected main streams to H.264. The repair checks supported codecs, targets the selected device and channels, and requires an explicit main-stream codec read-back. Changing the main stream also changes what the device records. The contributor verified both codec directions using ffprobe on a DHI-NVR5464-16P-EI. (#1127)
Fixes and diagnostics
- Migrate existing HTTP indoor monitors to their reported serial while preserving registry identities and entity IDs. Check conflicts and back up all three registries before changes; retry instead of creating duplicate entities when migration cannot complete. Share complete, unchanged backups and recreate missing or changed copies. (#1108, #1112, #1113)
- Retry incomplete monitor identity responses instead of deriving a different identity. Detect camera-less monitors from their own responses and omit unsupported camera-related entities. (#1106, #1111)
- Offer an optional repair to remove leftover registry rows together. Wait for configured channels, enabled platforms, probes and entity registration; retain rows after failed builds or registration. Work from before a reload cannot release the current cleanup gate. Confirmation rechecks the displayed candidates. (#1114, #1125)
- Emit one doorbell event per press despite multiple ringing states. Recognize vendor-prefixed DB6 models, including DH-DB6I, and devices reporting class DB. (#1109, #1132)
- Avoid assigning a MAC shared by several recorder channels to each channel's device connection, while retaining distinct camera MACs and unique identifiers. (#1107)
- Recover siren and white-light status through RPC2 when CGI is explicitly refused. Skip the coaxial-status setup probe when no enabled entity consumes it. (#1101, #1122)
- Restore motion-enable and day/night fallback writes after a declined primary write. (#1116)
- Accept numeric and string RPC2 session IDs without changing their JSON type, and accept a leading UTF-8 byte-order marker in HTTP JSON responses. (#1120)
- Retain the latest redacted event for each code alongside chronological diagnostics, report listener counts per event/channel key, and record the call and HTTP status behind a generated identity. (#1117, #1102, #1130)
- Clarify which overlay the text-overlay service writes and the model-dependent Location title label. (#1092)
Validation
The full local suite passed 5,455 tests, including all three real-ffmpeg conversion cases. Formatting passed for all 353 Python files. The release HACS ZIP is verified against the tagged source and manifest version. Hardware measurements in the linked PRs were supplied by contributors.
Full changelog: 1.3.1...2.0.0