feat: Trigger cameras on HA bus events (#2512)

This commit is contained in:
Dermot Duffy
2026-06-30 17:45:13 -07:00
committed by dermotduffy
parent 406176eebc
commit 0a36358394
49 changed files with 1376 additions and 269 deletions
+15 -6
View File
@@ -8,7 +8,7 @@ import { imageBaseConfigDefault, imageBaseConfigSchema } from './common/image';
import { proxyBaseConfigDefault, proxyBaseConfigSchema } from './common/proxy';
import { severitySchema } from './common/severity';
const CAMERA_TRIGGER_EVENT_TYPES = [
const CAMERA_TRIGGER_MEDIA_EVENT_TYPES = [
// An event whether or not it has any media yet associated with it.
'events',
@@ -16,7 +16,8 @@ const CAMERA_TRIGGER_EVENT_TYPES = [
'clips',
'snapshots',
] as const;
export type CameraTriggerEventType = (typeof CAMERA_TRIGGER_EVENT_TYPES)[number];
export type CameraTriggerMediaEventType =
(typeof CAMERA_TRIGGER_MEDIA_EVENT_TYPES)[number];
// *************************************************************************
// Live Provider Configuration
@@ -149,8 +150,9 @@ export const cameraConfigDefault = {
motion: false,
occupancy: false,
doorbell: false,
events: [],
media_events: [],
entities: [],
events: [],
reviews: {
severities: ['high' as const],
description: true,
@@ -217,6 +219,12 @@ const cameraMediaConfigSchema = z.object({
.default(cameraMediaConfigDefault.reviewed),
});
const triggerEventSchema = z.object({
event_type: z.string().min(1),
event_data: z.record(z.string(), z.unknown()).optional(),
});
export type TriggerEvent = z.infer<typeof triggerEventSchema>;
export const cameraConfigSchema = z
.looseObject({
camera_entity: z.string().optional(),
@@ -251,10 +259,11 @@ export const cameraConfigSchema = z
occupancy: z.boolean().default(cameraConfigDefault.triggers.occupancy),
doorbell: z.boolean().default(cameraConfigDefault.triggers.doorbell),
entities: z.string().array().default(cameraConfigDefault.triggers.entities),
events: z
.enum(CAMERA_TRIGGER_EVENT_TYPES)
events: triggerEventSchema.array().default(cameraConfigDefault.triggers.events),
media_events: z
.enum(CAMERA_TRIGGER_MEDIA_EVENT_TYPES)
.array()
.default(cameraConfigDefault.triggers.events),
.default(cameraConfigDefault.triggers.media_events),
reviews: z
.object({
severities: severitySchema