fix: Fix triggering for Reolink cameras (#2230)

- Fix inspired by #2228
This commit is contained in:
Dermot Duffy
2025-11-02 15:04:44 -08:00
committed by GitHub
parent 1f41781a84
commit 071dca07bf
3 changed files with 27 additions and 13 deletions
+10 -6
View File
@@ -38,12 +38,7 @@ export class Camera {
} }
async initialize(options: CameraInitializationOptions): Promise<Camera> { async initialize(options: CameraInitializationOptions): Promise<Camera> {
if (this._capabilities?.has('trigger')) { this._subscribeBasedOnCapabilities(options.stateWatcher);
options.stateWatcher.subscribe(
this._stateChangeHandler,
this._config.triggers.entities,
);
}
this._onDestroy(() => options.stateWatcher.unsubscribe(this._stateChangeHandler)); this._onDestroy(() => options.stateWatcher.unsubscribe(this._stateChangeHandler));
return this; return this;
} }
@@ -120,4 +115,13 @@ export class Camera {
protected _onDestroy(callback: DestroyCallback): void { protected _onDestroy(callback: DestroyCallback): void {
this._destroyCallbacks.push(callback); 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);
}
}
} }
+6 -2
View File
@@ -49,7 +49,7 @@ export class FrigateCamera extends Camera {
public async initialize(options: FrigateCameraInitializationOptions): Promise<Camera> { public async initialize(options: FrigateCameraInitializationOptions): Promise<Camera> {
await this._initializeConfig(options.hass, options.entityRegistryManager); await this._initializeConfig(options.hass, options.entityRegistryManager);
await this._initializeCapabilities(options.hass); await this._initializeCapabilities(options.hass, options.stateWatcher);
if (this._capabilities?.has('trigger')) { if (this._capabilities?.has('trigger')) {
await this._subscribeToEvents(options.hass, options.frigateEventWatcher); await this._subscribeToEvents(options.hass, options.frigateEventWatcher);
@@ -170,7 +170,10 @@ export class FrigateCamera extends Camera {
} }
} }
protected async _initializeCapabilities(hass: HomeAssistant): Promise<void> { protected async _initializeCapabilities(
hass: HomeAssistant,
stateWatcher: StateWatcherSubscriptionInterface,
): Promise<void> {
const config = this.getConfig(); const config = this.getConfig();
const configPTZCapabilities = getPTZCapabilitiesFromCameraConfig(this.getConfig()); const configPTZCapabilities = getPTZCapabilitiesFromCameraConfig(this.getConfig());
@@ -205,6 +208,7 @@ export class FrigateCamera extends Camera {
disableExcept: config.capabilities?.disable_except, disableExcept: config.capabilities?.disable_except,
}, },
); );
this._subscribeBasedOnCapabilities(stateWatcher);
} }
protected _getFrigateCameraNameFromEntity(entity: Entity): string | null { protected _getFrigateCameraNameFromEntity(entity: Entity): string | null {
+11 -5
View File
@@ -1,4 +1,5 @@
import { ActionsExecutor } from '../../card-controller/actions/types'; 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 { PTZAction, PTZActionPhase } from '../../config/schema/actions/custom/ptz';
import { Entity, EntityRegistryManager } from '../../ha/registry/entity/types'; import { Entity, EntityRegistryManager } from '../../ha/registry/entity/types';
import { HomeAssistant } from '../../ha/types'; import { HomeAssistant } from '../../ha/types';
@@ -50,7 +51,11 @@ export class ReolinkCamera extends BrowseMediaCamera {
public async initialize(options: ReolinkCameraInitializationOptions): Promise<Camera> { public async initialize(options: ReolinkCameraInitializationOptions): Promise<Camera> {
await super.initialize(options); await super.initialize(options);
this._initializeChannel(); this._initializeChannel();
await this._initializeCapabilities(options.hass, options.entityRegistryManager); await this._initializeCapabilities(
options.hass,
options.entityRegistryManager,
options.stateWatcher,
);
return this; return this;
} }
@@ -102,12 +107,13 @@ export class ReolinkCamera extends BrowseMediaCamera {
protected async _initializeCapabilities( protected async _initializeCapabilities(
hass: HomeAssistant, hass: HomeAssistant,
entityRegistry: EntityRegistryManager, entityRegistry: EntityRegistryManager,
stateWatcher: StateWatcherSubscriptionInterface,
): Promise<void> { ): Promise<void> {
const config = this.getConfig(); const config = this.getConfig();
const configPTZCapabilities = getPTZCapabilitiesFromCameraConfig(this.getConfig()); const configPTZCapabilities = getPTZCapabilitiesFromCameraConfig(this.getConfig());
const ptzEntities = await this._getPTZEntities(hass, entityRegistry); this._ptzEntities = await this._getPTZEntities(hass, entityRegistry);
const reolinkPTZCapabilities = ptzEntities const reolinkPTZCapabilities = this._ptzEntities
? this._entitiesToCapabilities(hass, ptzEntities) ? this._entitiesToCapabilities(hass, this._ptzEntities)
: null; : null;
const combinedPTZCapabilities: PTZCapabilities | null = const combinedPTZCapabilities: PTZCapabilities | null =
@@ -138,7 +144,7 @@ export class ReolinkCamera extends BrowseMediaCamera {
disableExcept: config.capabilities?.disable_except, disableExcept: config.capabilities?.disable_except,
}, },
); );
this._ptzEntities = ptzEntities; this._subscribeBasedOnCapabilities(stateWatcher);
} }
protected _entitiesToCapabilities( protected _entitiesToCapabilities(