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> {
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);
}
}
}
+6 -2
View File
@@ -49,7 +49,7 @@ export class FrigateCamera extends Camera {
public async initialize(options: FrigateCameraInitializationOptions): Promise<Camera> {
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<void> {
protected async _initializeCapabilities(
hass: HomeAssistant,
stateWatcher: StateWatcherSubscriptionInterface,
): Promise<void> {
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 {
+11 -5
View File
@@ -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<Camera> {
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<void> {
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(