Deduplicate Frigate cameras on the timeline.

This commit is contained in:
Dermot Duffy
2022-06-11 16:06:48 -07:00
parent 9d99080c00
commit acbbef1bdb
2 changed files with 35 additions and 4 deletions
+10 -3
View File
@@ -50,6 +50,8 @@ import { getCameraTitle } from '../utils/camera.js';
import {
getRecordingSegments,
getRecordingsSummary,
getUniqueFrigateCameraEventsID,
getUniqueFrigateCameraID,
RecordingSegments,
RecordingSummary
} from '../utils/frigate';
@@ -597,9 +599,9 @@ export class FrigateCardTimelineCore extends LitElement {
// There is a single set of recordings for a given Frigate camera name.
// Zones on that same camera do not get separate recordings. The card may
// have multiple instances of the same camera for different zoness, so
// have multiple instances of the same camera for different zones, so
// need to enforce uniqueness here.
const uniqueID = `${config.frigate.client_id}/${config.frigate.camera_name}`;
const uniqueID = getUniqueFrigateCameraID(config);
if (processedCameras.has(uniqueID)) {
continue;
}
@@ -886,11 +888,16 @@ export class FrigateCardTimelineCore extends LitElement {
*/
protected _getGroups(): DataGroupCollectionType {
const groups: FrigateCardGroupData[] = [];
const processedCameras: Set<string> = new Set();
this.cameras?.forEach((cameraConfig, camera) => {
const frigateCameraID = getUniqueFrigateCameraEventsID(cameraConfig);
if (
cameraConfig.frigate.camera_name &&
cameraConfig.frigate.camera_name !== CAMERA_BIRDSEYE
cameraConfig.frigate.camera_name !== CAMERA_BIRDSEYE &&
!processedCameras.has(frigateCameraID)
) {
processedCameras.add(frigateCameraID);
groups.push({
id: camera,
content: getCameraTitle(this.hass, cameraConfig),
+25 -1
View File
@@ -1,5 +1,5 @@
import { z } from 'zod';
import { ExtendedHomeAssistant } from '../types';
import { CameraConfig, ExtendedHomeAssistant } from '../types';
import { homeAssistantHTTPRequest } from './ha';
export const FRIGATE_ICON_SVG_PATH =
@@ -95,3 +95,27 @@ export const getRecordingSegments = async (
}),
);
};
/**
* Get an id that unique identifies a particular camera (not zone, object, etc)
* within a particular Frigate instance. ID will not (necessarily) be unique
* within the card.
* @param cameraConfig The camera config.
*/
export const getUniqueFrigateCameraID = (config: CameraConfig): string => {
return [config.frigate.client_id, config.frigate.camera_name].join('/');
};
/**
* Get an id that unique identifies a source of Frigate events. ID will not
* (necessarily) be unique within the card.
* @param cameraConfig The camera config.
*/
export const getUniqueFrigateCameraEventsID = (config: CameraConfig): string => {
return [
config.frigate.client_id,
config.frigate.camera_name,
config.frigate.label,
config.frigate.zone,
].join('/');
};