From 071dca07bffd81fcb476f4eb31124248d905451e Mon Sep 17 00:00:00 2001 From: Dermot Duffy Date: Sun, 2 Nov 2025 15:04:44 -0800 Subject: [PATCH] fix: Fix triggering for Reolink cameras (#2230) - Fix inspired by #2228 --- src/camera-manager/camera.ts | 16 ++++++++++------ src/camera-manager/frigate/camera.ts | 8 ++++++-- src/camera-manager/reolink/camera.ts | 16 +++++++++++----- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/camera-manager/camera.ts b/src/camera-manager/camera.ts index e2de8c84..6dd5ccf7 100644 --- a/src/camera-manager/camera.ts +++ b/src/camera-manager/camera.ts @@ -38,12 +38,7 @@ export class Camera { } async initialize(options: CameraInitializationOptions): Promise { - if (this._capabilities?.has('trigger')) { - options.stateWatcher.subscribe( - this._stateChangeHandler, - this._config.triggers.entities, - ); - } + this._subscribeBasedOnCapabilities(options.stateWatcher); this._onDestroy(() => options.stateWatcher.unsubscribe(this._stateChangeHandler)); return this; } @@ -120,4 +115,13 @@ export class Camera { protected _onDestroy(callback: DestroyCallback): void { this._destroyCallbacks.push(callback); } + + protected _subscribeBasedOnCapabilities( + stateWatcher: StateWatcherSubscriptionInterface, + ): void { + if (this._capabilities?.has('trigger')) { + stateWatcher.unsubscribe(this._stateChangeHandler); + stateWatcher.subscribe(this._stateChangeHandler, this._config.triggers.entities); + } + } } diff --git a/src/camera-manager/frigate/camera.ts b/src/camera-manager/frigate/camera.ts index 2c0dfa1e..3c065200 100644 --- a/src/camera-manager/frigate/camera.ts +++ b/src/camera-manager/frigate/camera.ts @@ -49,7 +49,7 @@ export class FrigateCamera extends Camera { public async initialize(options: FrigateCameraInitializationOptions): Promise { await this._initializeConfig(options.hass, options.entityRegistryManager); - await this._initializeCapabilities(options.hass); + await this._initializeCapabilities(options.hass, options.stateWatcher); if (this._capabilities?.has('trigger')) { await this._subscribeToEvents(options.hass, options.frigateEventWatcher); @@ -170,7 +170,10 @@ export class FrigateCamera extends Camera { } } - protected async _initializeCapabilities(hass: HomeAssistant): Promise { + protected async _initializeCapabilities( + hass: HomeAssistant, + stateWatcher: StateWatcherSubscriptionInterface, + ): Promise { const config = this.getConfig(); const configPTZCapabilities = getPTZCapabilitiesFromCameraConfig(this.getConfig()); @@ -205,6 +208,7 @@ export class FrigateCamera extends Camera { disableExcept: config.capabilities?.disable_except, }, ); + this._subscribeBasedOnCapabilities(stateWatcher); } protected _getFrigateCameraNameFromEntity(entity: Entity): string | null { diff --git a/src/camera-manager/reolink/camera.ts b/src/camera-manager/reolink/camera.ts index 5a93decc..bf1d5d61 100644 --- a/src/camera-manager/reolink/camera.ts +++ b/src/camera-manager/reolink/camera.ts @@ -1,4 +1,5 @@ import { ActionsExecutor } from '../../card-controller/actions/types'; +import { StateWatcherSubscriptionInterface } from '../../card-controller/hass/state-watcher'; import { PTZAction, PTZActionPhase } from '../../config/schema/actions/custom/ptz'; import { Entity, EntityRegistryManager } from '../../ha/registry/entity/types'; import { HomeAssistant } from '../../ha/types'; @@ -50,7 +51,11 @@ export class ReolinkCamera extends BrowseMediaCamera { public async initialize(options: ReolinkCameraInitializationOptions): Promise { await super.initialize(options); this._initializeChannel(); - await this._initializeCapabilities(options.hass, options.entityRegistryManager); + await this._initializeCapabilities( + options.hass, + options.entityRegistryManager, + options.stateWatcher, + ); return this; } @@ -102,12 +107,13 @@ export class ReolinkCamera extends BrowseMediaCamera { protected async _initializeCapabilities( hass: HomeAssistant, entityRegistry: EntityRegistryManager, + stateWatcher: StateWatcherSubscriptionInterface, ): Promise { const config = this.getConfig(); const configPTZCapabilities = getPTZCapabilitiesFromCameraConfig(this.getConfig()); - const ptzEntities = await this._getPTZEntities(hass, entityRegistry); - const reolinkPTZCapabilities = ptzEntities - ? this._entitiesToCapabilities(hass, ptzEntities) + this._ptzEntities = await this._getPTZEntities(hass, entityRegistry); + const reolinkPTZCapabilities = this._ptzEntities + ? this._entitiesToCapabilities(hass, this._ptzEntities) : null; const combinedPTZCapabilities: PTZCapabilities | null = @@ -138,7 +144,7 @@ export class ReolinkCamera extends BrowseMediaCamera { disableExcept: config.capabilities?.disable_except, }, ); - this._ptzEntities = ptzEntities; + this._subscribeBasedOnCapabilities(stateWatcher); } protected _entitiesToCapabilities(