diff --git a/src/camera-manager/manager.ts b/src/camera-manager/manager.ts index f923ab1d..2f83ad18 100644 --- a/src/camera-manager/manager.ts +++ b/src/camera-manager/manager.ts @@ -1,9 +1,5 @@ import { HomeAssistant } from 'custom-card-helpers'; -import { - CameraConfig, - CamerasConfig, - CardWideConfig, -} from '../types.js'; +import { CameraConfig, CamerasConfig, CardWideConfig } from '../types.js'; import { allPromises, arrayify, setify } from '../utils/basic.js'; import { CameraManagerCameraCapabilities, @@ -137,11 +133,11 @@ export class CameraManager { }; const engineTypes = await getEngineTypes(camerasConfig); - for (const [index, cameraConfig] of camerasConfig.entries()) { - const engineType = engineTypes[index]; + for (const [index, cameraConfig] of camerasConfig.entries()) { + const engineType = engineTypes[index]; const engine = engineType - ? engines.get(engineType) ?? this._engineFactory.createEngine(engineType) - : null; + ? engines.get(engineType) ?? this._engineFactory.createEngine(engineType) + : null; if (!engine || !engineType) { throw new CameraInitializationError( localize('error.no_camera_engine'), @@ -180,6 +176,8 @@ export class CameraManager { entityRegistryManager: EntityRegistryManager, camerasConfig: CamerasConfig, ): Promise { + const initializationStartTime = new Date(); + const hasAutoTriggers = (config: CameraConfig): boolean => { return config.triggers.motion || config.triggers.occupancy; }; @@ -229,6 +227,16 @@ export class CameraManager { if (!this._store.getVisibleCameraCount()) { throw new CameraInitializationError(localize('error.no_visible_cameras')); } + + log( + this._cardWideConfig, + 'Frigate Card CameraManager initialized (Cameras: ', + camerasConfig, + `, Duration: ${ + (new Date().getTime() - initializationStartTime.getTime()) / 1000 + }s,`, + ')', + ); } public isInitialized(): boolean { diff --git a/src/card.ts b/src/card.ts index 010f3727..cbe9122a 100644 --- a/src/card.ts +++ b/src/card.ts @@ -1063,16 +1063,14 @@ class FrigateCard extends LitElement { this._cardWideConfig, ); - // For each camera merge the config into the camera global config. The - // merging must happen in this order, to ensure that the defaults in the - // cameras global config do not override the values specified in the - // per-camera config. + // For each camera merge the config (which has no defaults) into the camera + // global config (which does have defaults). The merging must happen in this + // order, to ensure that the defaults in the cameras global config do not + // override the values specified in the per-camera config. const cameras = config.cameras.map((camera) => merge(cloneDeep(config.cameras_global), camera), ); - console.info("MERGED CAMERAS", cameras); - try { await this._cameraManager.initializeCameras( hass, diff --git a/src/types.ts b/src/types.ts index d9969f04..89ecbc61 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1282,9 +1282,14 @@ export interface CardWideConfig { * Main card config. */ export const frigateCardConfigSchema = z.object({ - // Main configuration sections. - cameras: camerasConfigSchema, - cameras_global: cameraConfigSchema.optional(), + // Defaults are stripped out of the individual cameras, since each camera will + // be merged with `cameras_global` which *does* have defaults. If we didn't do + // this, the default values of each individual camera would override the + // intentionally specified values in `cameras_global` during camera + // initialization when the two configs are merged. + cameras: deepRemoveDefaults(camerasConfigSchema), + cameras_global: cameraConfigSchema, + view: viewConfigSchema, menu: menuConfigSchema, live: liveConfigSchema,