import {z} from 'zod' export type GetApiV1SubscribeDevicesOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const nvrId = z.string(); export const nvrModelKey = z.literal("nvr"); export const name = z.string(); export const doorbellSettings = z.object({defaultMessageText: z.string().optional(), defaultMessageResetTimeoutMs: z.number().optional(), customMessages: z.array(z.string()).optional(), customImages: z.array(z.object({preview: z.string(), sprite: z.string()})).optional()}); export const nvrArmMode = z.object({status: z.enum(["arming", "armed", "breach", "disabled"]), armProfileId: z.string().nullable(), armedAt: z.number().nullable(), willBeArmedAt: z.number().nullable(), breachDetectedAt: z.number().nullable(), breachEventCount: z.number(), breachTriggerEventId: z.string().nullable(), breachEventId: z.string().nullable()}); export const nvr = z.object({id: nvrId, modelKey: nvrModelKey, name: name.nullable(), doorbellSettings: doorbellSettings, armMode: nvrArmMode}); export const cameraId = z.string(); export const cameraModelKey = z.literal("camera"); export const deviceState = z.enum(["CONNECTED", "CONNECTING", "DISCONNECTED"]); export const mac = z.string(); export const isMicEnabled = z.boolean(); export const osdIsNameEnabled = z.boolean(); export const osdIsDateEnabled = z.boolean(); export const osdIsLogoEnabled = z.boolean(); export const osdIsDebugEnabled = z.boolean(); export const osdOverlayLocation = z.enum(["topLeft", "topMiddle", "topRight", "bottomLeft", "bottomMiddle", "bottomRight"]); export const osdSettings = z.object({isNameEnabled: osdIsNameEnabled, isDateEnabled: osdIsDateEnabled, isLogoEnabled: osdIsLogoEnabled, isDebugEnabled: osdIsDebugEnabled, overlayLocation: osdOverlayLocation}); export const ledIsEnabled = z.boolean(); export const ledWelcomeLed = z.boolean(); export const ledFloodLed = z.boolean(); export const ledSettings = z.object({isEnabled: ledIsEnabled, welcomeLed: ledWelcomeLed, floodLed: ledFloodLed}); export const lcdMessageUnion = z.object({type: z.enum(["LEAVE_PACKAGE_AT_DOOR", "DO_NOT_DISTURB", "CUSTOM_MESSAGE", "IMAGE"]).optional(), resetAt: z.number().nullable().optional(), text: z.string().optional()}); export const micVolume = z.number().gte(0).lte(100); export const activePatrolSlot = z.number(); export const videoMode = z.enum(["default", "highFps", "sport", "slowShutter", "lprReflex", "lprNoneReflex"]); export const hdrType = z.enum(["auto", "on", "off"]); export const cameraFeatureFlags = z.object({supportFullHdSnapshot: z.boolean(), hasHdr: z.boolean(), smartDetectTypes: z.array(z.enum(["person", "vehicle", "package", "licensePlate", "face", "animal"])), smartDetectAudioTypes: z.array(z.enum(["alrmSmoke", "alrmCmonx", "alrmSiren", "alrmBabyCry", "alrmSpeak", "alrmBark", "alrmBurglar", "alrmCarHorn", "alrmGlassBreak"])), videoModes: z.array(z.enum(["default", "highFps", "homekit", "sport", "slowShutter", "lprReflex", "lprNoneReflex"])), hasMic: z.boolean(), hasLedStatus: z.boolean(), hasSpeaker: z.boolean()}); export const objectTypes = z.array(z.enum(["person", "vehicle", "package", "licensePlate", "face", "animal"])); export const audioTypes = z.array(z.enum(["alrmSmoke", "alrmCmonx", "alrmSiren", "alrmBabyCry", "alrmSpeak", "alrmBark", "alrmBurglar", "alrmCarHorn", "alrmGlassBreak"])); export const smartDetectSettings = z.object({objectTypes: objectTypes, audioTypes: audioTypes}); export const hasPackageCamera = z.boolean(); export const camera = z.object({id: cameraId, modelKey: cameraModelKey, state: deviceState, name: name.nullable(), mac: mac, isMicEnabled: isMicEnabled, osdSettings: osdSettings, ledSettings: ledSettings, lcdMessage: lcdMessageUnion, micVolume: micVolume, activePatrolSlot: activePatrolSlot.nullable(), videoMode: videoMode, hdrType: hdrType, featureFlags: cameraFeatureFlags, smartDetectSettings: smartDetectSettings, hasPackageCamera: hasPackageCamera}); export const chimeId = z.string(); export const chimeModelKey = z.literal("chime"); export const ringtoneId = z.string(); export const ringSettings = z.object({cameraId: cameraId, repeatTimes: z.number().gte(1).lte(10), ringtoneId: ringtoneId, volume: z.number().gte(0).lte(100)}); export const chime = z.object({id: chimeId, modelKey: chimeModelKey, state: deviceState, name: name.nullable(), mac: mac, cameraIds: z.array(cameraId), ringSettings: z.array(ringSettings)}); export const lightId = z.string(); export const lightModelKey = z.literal("light"); export const lightMode = z.union([z.literal("always"), z.literal("motion"), z.literal("off")]); export const enableAt = z.union([z.literal("fulltime"), z.literal("dark")]); export const lightModeSettings = z.object({mode: lightMode.optional(), enableAt: enableAt.optional()}); export const lightDeviceSettings = z.object({isIndicatorEnabled: z.boolean().optional(), pirDuration: z.number().gte(0).optional(), pirSensitivity: z.number().gte(0).lte(100).optional(), ledLevel: z.number().gte(1).lte(6).optional()}); export const isDark = z.boolean(); export const isLightOn = z.boolean(); export const isLightForceEnabled = z.boolean(); export const lastMotion = z.number().nullable(); export const isPirMotionDetected = z.boolean(); export const light = z.object({id: lightId, modelKey: lightModelKey, state: deviceState, name: name.nullable(), mac: mac, lightModeSettings: lightModeSettings, lightDeviceSettings: lightDeviceSettings, isDark: isDark, isLightOn: isLightOn, isLightForceEnabled: isLightForceEnabled, lastMotion: lastMotion, isPirMotionDetected: isPirMotionDetected, camera: cameraId.nullable()}); export const viewerId = z.string(); export const viewerModelKey = z.literal("viewer"); export const liveviewId = z.string(); export const streamLimit = z.number(); export const viewer = z.object({id: viewerId, modelKey: viewerModelKey, state: deviceState, name: name.nullable(), mac: mac, liveview: liveviewId.nullable(), streamLimit: streamLimit}); export const speakerId = z.string(); export const speakerModelKey = z.literal("speaker"); export const speakerVolume = z.number().int().gte(0).lte(100); export const speakerMicVolume = z.number().int().gte(0).lte(100); export const speakerIsMicEnabled = z.boolean(); export const speakerStateStatus = z.enum(["idle", "streaming", "playing", "tts_playing", "uploading"]); export const speakerStateMode = z.enum(["listen", "talk"]); export const speakerState = z.object({status: speakerStateStatus, mode: speakerStateMode}); export const speakerFeatureFlagsHasMic = z.boolean(); export const speakerFeatureFlags = z.object({hasMic: speakerFeatureFlagsHasMic}); export const speaker = z.object({id: speakerId, modelKey: speakerModelKey, state: deviceState, name: name.nullable(), mac: mac, volume: speakerVolume, micVolume: speakerMicVolume, isMicEnabled: speakerIsMicEnabled, speakerState: speakerState, featureFlags: speakerFeatureFlags}); export const bridgeId = z.string(); export const bridgeModelKey = z.literal("bridge"); export const bridgePlatform = z.string().nullable(); export const bridgeClients = z.array(z.string()); export const bridgeMaxClients = z.number(); export const bridge = z.object({id: bridgeId, modelKey: bridgeModelKey, state: deviceState, name: name.nullable(), mac: mac, platform: bridgePlatform, clients: bridgeClients, maxClients: bridgeMaxClients}); export const sensorId = z.string(); export const sensorModelKey = z.literal("sensor"); export const sensorMountType = z.enum(["door", "window", "garage", "leak", "none"]); export const batteryStatus = z.object({percentage: z.number().nullable().optional(), isLow: z.boolean().optional()}); export const sensorValue = z.number(); export const sensorStatus = z.enum(["neutral", "low", "safe", "high", "unknown"]); export const sensorStats = z.object({light: z.object({value: sensorValue.nullable().optional(), status: sensorStatus.optional()}).optional(), humidity: z.object({value: sensorValue.nullable().optional(), status: sensorStatus.optional()}).optional(), temperature: z.object({value: sensorValue.nullable().optional(), status: sensorStatus.optional()}).optional()}); export const lightSettings = z.object({isEnabled: z.boolean().optional(), margin: z.number().optional(), lowThreshold: z.number().gte(1).lte(503192).nullable().optional(), highThreshold: z.number().nullable().optional()}); export const humiditySettings = z.object({isEnabled: z.boolean().optional(), margin: z.number().optional(), lowThreshold: z.number().gte(1).lte(99).nullable().optional(), highThreshold: z.number().nullable().optional()}); export const temperatureSettings = z.object({isEnabled: z.boolean().optional(), margin: z.number().optional(), lowThreshold: z.number().gte(-39).lte(124).nullable().optional(), highThreshold: z.number().nullable().optional()}); export const sensorIsOpened = z.boolean().nullable(); export const sensorOpenStatusChangedAt = z.number().nullable(); export const sensorIsMotionDetected = z.boolean(); export const sensorMotionDetectedAt = z.number().nullable(); export const motionSettings = z.object({isEnabled: z.boolean().optional(), sensitivity: z.number().gte(0).lte(100).optional(), sensitivityWhenArmed: z.number().gte(0).lte(100).optional()}); export const glassBreakSettings = z.object({isEnabled: z.boolean().optional(), sensitivity: z.number().gte(0).lte(100).optional(), sensitivityWhenArmed: z.number().gte(0).lte(100).optional()}); export const sensorScheduleMode = z.enum(["always", "when_armed"]); export const sensorArmProfileIds = z.array(z.string().max(64)).nullable(); export const sensorHasCustomSensitivityWhenArmed = z.boolean(); export const sensorAlarmTriggeredAt = z.number().nullable(); export const alarmSettings = z.object({isEnabled: z.boolean().optional()}); export const sensorLeakDetectedAt = z.number().nullable(); export const sensorExternalLeakDetectedAt = z.number().nullable(); export const leakSettings = z.object({isInternalEnabled: z.boolean().optional(), isExternalEnabled: z.boolean().optional()}); export const tamperingDetectedAt = z.number().nullable(); export const signalQuality = z.number().nullable(); export const signalStrength = z.number().nullable(); export const signalState = z.object({signalQuality: signalQuality, signalStrength: signalStrength}); export const wirelessBatteryPercentage = z.number().nullable(); export const wirelessBatteryIsLow = z.boolean(); export const wirelessBatteryStatus = z.object({percentage: wirelessBatteryPercentage, isLow: wirelessBatteryIsLow}); export const wirelessBridgeId = z.string(); export const wirelessConnectionState = z.object({signalState: signalState, batteryStatus: wirelessBatteryStatus, bridge: wirelessBridgeId}); export const sensor = z.object({id: sensorId, modelKey: sensorModelKey, state: deviceState, name: name.nullable(), mac: mac, mountType: sensorMountType, batteryStatus: batteryStatus, stats: sensorStats, lightSettings: lightSettings, humiditySettings: humiditySettings, temperatureSettings: temperatureSettings, isOpened: sensorIsOpened, openStatusChangedAt: sensorOpenStatusChangedAt, isMotionDetected: sensorIsMotionDetected, motionDetectedAt: sensorMotionDetectedAt, motionSettings: motionSettings, glassBreakSettings: glassBreakSettings, scheduleMode: sensorScheduleMode, armProfileIds: sensorArmProfileIds, hasCustomSensitivityWhenArmed: sensorHasCustomSensitivityWhenArmed, alarmTriggeredAt: sensorAlarmTriggeredAt, alarmSettings: alarmSettings, leakDetectedAt: sensorLeakDetectedAt, externalLeakDetectedAt: sensorExternalLeakDetectedAt, leakSettings: leakSettings, tamperingDetectedAt: tamperingDetectedAt, wirelessConnectionState: wirelessConnectionState}); export const sirenId = z.string(); export const sirenModelKey = z.literal("siren"); export const sirenVolume = z.number().int().gte(1).lte(100); export const sirenLedIsEnabled = z.boolean(); export const sirenLedSettingsExternal = z.object({isEnabled: sirenLedIsEnabled}); export const sirenStatusIsActive = z.boolean(); export const sirenStatusActivatedAt = z.number().nullable(); export const sirenStatusDuration = z.union([z.literal(5000), z.literal(10000), z.literal(20000), z.literal(30000)]); export const sirenStatus = z.object({isActive: sirenStatusIsActive, activatedAt: sirenStatusActivatedAt, duration: sirenStatusDuration}); export const sirenConnectionType = z.enum(["ucp4", "lora"]); export const siren = z.object({id: sirenId, modelKey: sirenModelKey, state: deviceState, name: name.nullable(), mac: mac, volume: sirenVolume, ledSettings: sirenLedSettingsExternal, sirenStatus: sirenStatus, connectionType: sirenConnectionType, wirelessConnectionState: wirelessConnectionState}); export const fobId = z.string(); export const fobModelKey = z.literal("fob"); export const fobAwayState = z.enum(["ONLINE", "RECENTLY_SEEN", "NO_RECENT_HEARTBEAT", "DEVICE_LOST"]); export const fobButtonLabels = z.enum(["securityActions", "positionHint"]); export const fobButtons = z.array(z.enum(["function", "alarmHubButton", "arm", "disarm", "night", "panic", "left", "right", "input1", "input2"])); export const fobFeatureFlags = z.object({buttons: fobButtons}); export const fob = z.object({id: fobId, modelKey: fobModelKey, state: deviceState, name: name.nullable(), mac: mac, awayState: fobAwayState, buttonLabels: fobButtonLabels, featureFlags: fobFeatureFlags, wirelessConnectionState: wirelessConnectionState}); export const relayId = z.string(); export const relayModelKey = z.literal("relay"); export const relayLedIsEnabled = z.boolean(); export const relayLedSettings = z.object({isEnabled: relayLedIsEnabled}); export const relayOutputId = z.number(); export const relayOutputName = z.string().nullable(); export const relayOutputType = z.enum(["garageDoor", "gate", "valve", "siren", "custom"]).nullable(); export const relayOutputDelay = z.number().nullable(); export const relayOutputPulseDuration = z.number().nullable(); export const relayOutputState = z.enum(["on", "off", "offOtp"]).nullable(); export const relayOutputRebootState = z.enum(["restore", "on", "off"]); export const relayOutput = z.object({id: relayOutputId, name: relayOutputName, type: relayOutputType, delay: relayOutputDelay, pulseDuration: relayOutputPulseDuration, state: relayOutputState, rebootState: relayOutputRebootState}); export const relayOutputs = z.array(relayOutput); export const relayInputId = z.number(); export const relayInputName = z.string().nullable(); export const relayInputState = z.enum(["on", "off"]).nullable(); export const relayInputActionTrigger = z.enum(["switchedOn", "switchedOff"]).nullable(); export const relayInputActionType = z.enum(["setOutputOn", "setOutputOff", "toggleOutput", "followInput"]).nullable(); export const relayInputActionOutputId = z.number().nullable(); export const relayInput = z.object({id: relayInputId, name: relayInputName, state: relayInputState, actionTrigger: relayInputActionTrigger, actionType: relayInputActionType, actionOutputId: relayInputActionOutputId}); export const relayInputs = z.array(relayInput); export const relay = z.object({id: relayId, modelKey: relayModelKey, state: deviceState, name: name.nullable(), mac: mac, ledSettings: relayLedSettings, outputs: relayOutputs, inputs: relayInputs, wirelessConnectionState: wirelessConnectionState}); export const deviceId = z.string(); export const aiprocessorModelKey = z.literal("aiprocessor"); export const aiProcessor = z.object({id: deviceId, modelKey: aiprocessorModelKey, state: deviceState, name: name.nullable(), mac: mac}); export const aiportModelKey = z.literal("aiport"); export const aiPort = z.object({id: deviceId, modelKey: aiportModelKey, state: deviceState, name: name.nullable(), mac: mac}); export const linkStationId = z.string(); export const linkstationModelKey = z.literal("linkstation"); export const linkStationIsAlarmHub = z.boolean(); export const linkStationLedIsEnabled = z.boolean(); export const linkStationLedSettings = z.object({isEnabled: linkStationLedIsEnabled}); export const linkStationLastEvent = z.number().nullable(); export const alarmHubStatus = z.object({armed: z.enum(["on", "off"]), battery: z.object({charging: z.enum(["on", "off"]).optional(), connection: z.enum(["connected", "disconnected"]).optional(), voltage: z.number().optional(), batteryStatus: z.enum(["ok", "low", "critical"]).optional()}).optional(), buckboost: z.enum(["on", "off"]), connector: z.object({emergency: z.object({"+": z.enum(["connected", "disconnected"]), "-": z.enum(["connected", "disconnected"])}).optional(), "12v": z.record(z.string(), z.object({"+": z.enum(["connected", "disconnected"]), "-": z.enum(["connected", "disconnected"])})).optional(), relay: z.record(z.string(), z.object({com: z.enum(["connected", "disconnected"]), nc: z.enum(["connected", "disconnected"]), no: z.enum(["connected", "disconnected"])})).optional(), tb: z.record(z.string(), z.object({"+": z.enum(["connected", "disconnected"]), "-": z.enum(["connected", "disconnected"])})).optional(), battery: z.enum(["connected", "disconnected"]).optional(), poeout: z.enum(["connected", "disconnected"]).optional()}).optional(), cover: z.object({distance: z.number().int().optional(), status: z.enum(["open", "close"]).optional()}).optional(), currentMeterChannelStatus: z.record(z.string(), z.object({criticalAlarm: z.enum(["normal", "alert"]), criticalThreshold: z.number(), value: z.number(), warningAlarm: z.enum(["normal", "alert"]), warningThreshold: z.number()})), currentMeterStatus: z.record(z.string(), z.object({critical: z.enum(["normal", "alert"]), efuse: z.enum(["normal", "warning", "fault"]), enable: z.enum(["on", "off"]), powerValid: z.enum(["normal", "alert"]), timingControl: z.enum(["normal", "alert"]), warning: z.enum(["normal", "alert"])})), inputPower: z.object({bt: z.enum(["low", "high"]).optional(), typ1: z.enum(["low", "high"]).optional(), typ2: z.enum(["low", "high"]).optional()}).optional(), poeout: z.object({connection: z.enum(["connected", "disconnected"]).optional(), powerSupply: z.enum(["on", "off"]).optional()}).optional(), powerMeter: z.record(z.string(), z.object({alarm: z.enum(["normal", "alert"]), current: z.number(), efuse: z.enum(["normal", "warning", "fault"]), enable: z.enum(["on", "off"]), power: z.number(), powerThreshold: z.number(), voltage: z.number()})), output: z.record(z.string(), z.object({enable: z.enum(["on", "off"]), active: z.enum(["on", "off"]), status: z.enum(["wet", "dry"]), delay: z.number().int().optional(), duration: z.number().int().optional(), name: z.string().optional()})), input: z.record(z.string(), z.object({enable: z.enum(["on", "off"]), type: z.union([z.literal("no"), z.literal("nc")]), eolr: z.number().int().gte(0).lte(2), resistor: z.number().gte(0).lte(10), status: z.enum(["normal", "alarm", "fault", "short", "cut"]), trigger: z.number().int(), name: z.string().optional(), inputType: z.enum(["MOTION", "ENTRY", "SMOKE", "GLASS_BREAK", "EMERGENCY_BUTTON"]).optional(), allowedArmingProfiles: z.array(z.string()).optional(), triggerWhenDisarmed: z.enum(["on", "off"]).optional(), triggerOnCurrentArmingProfile: z.enum(["on", "off"]).optional(), lastTriggeredAt: z.number().nullable().optional(), cameraId: z.string().nullable().optional(), powerReset: z.boolean().optional()})), inputTerminalStatus: z.record(z.string(), z.object({plusPinStatus: z.enum(["disabled", "idle", "not-connected", "tamper", "triggered", "cut", "short"]), minusPinStatus: z.enum(["disabled", "idle", "not-connected", "tamper", "triggered", "cut", "short"]), terminalStatus: z.enum(["disabled", "idle", "not-connected", "tamper", "triggered", "cut", "short", "partially-connected"]), idleSubState: z.enum(["open", "closed"]).optional()})).optional(), outputTerminalStatus: z.record(z.string(), z.object({pins: z.object({no: z.enum(["disabled", "idle", "not-connected", "tamper", "triggered", "cut", "short"]), com: z.enum(["disabled", "idle", "not-connected", "tamper", "triggered", "cut", "short"]), nc: z.enum(["disabled", "idle", "not-connected", "tamper", "triggered", "cut", "short"])}), statusLabel: z.enum(["disabled", "off", "active"]), mode: z.enum(["dry-contact", "powered-12v"]), efuseAlert: z.enum(["none", "high-current", "over-current"]), wiredPins: z.array(z.enum(["+", "-", "nc", "no", "com"]))})).optional(), emergencyTerminalStatus: z.object({plusPinStatus: z.enum(["disabled", "idle", "not-connected", "tamper", "triggered", "cut", "short"]), minusPinStatus: z.enum(["disabled", "idle", "not-connected", "tamper", "triggered", "cut", "short"]), terminalStatus: z.enum(["disabled", "idle", "not-connected", "tamper", "triggered", "cut", "short", "partially-connected"]), idleSubState: z.enum(["open", "closed"]).optional()}).nullable().optional(), auxiliaryPowerTerminalStatus: z.record(z.string(), z.object({plusPinStatus: z.enum(["disabled", "idle", "not-connected", "tamper", "triggered", "cut", "short"]), minusPinStatus: z.enum(["disabled", "idle", "not-connected", "tamper", "triggered", "cut", "short"]), status: z.enum(["not-connected", "partially-connected", "connected"]), currentMa: z.number().optional(), loadPercent: z.number().optional()})).optional()}); export const linkStation = z.object({id: linkStationId, modelKey: linkstationModelKey, state: deviceState, name: name.nullable(), mac: mac, isAlarmHub: linkStationIsAlarmHub, ledSettings: linkStationLedSettings, lastEvent: linkStationLastEvent, alarmHub: alarmHubStatus.optional()}); export const device = z.discriminatedUnion("modelKey", [nvr, camera, chime, light, viewer, speaker, bridge, sensor, siren, fob, relay, aiProcessor, aiPort, linkStation]); export const deviceAdd = z.object({type: z.literal("add"), item: device}); export const nvrPartialWithReference = z.object({id: nvrId, modelKey: nvrModelKey, name: name.nullable().optional(), doorbellSettings: doorbellSettings.optional(), armMode: nvrArmMode.optional()}); export const cameraPartialWithReference = z.object({id: cameraId, modelKey: cameraModelKey, state: deviceState.optional(), name: name.nullable().optional(), mac: mac.optional(), isMicEnabled: isMicEnabled.optional(), osdSettings: osdSettings.optional(), ledSettings: ledSettings.optional(), lcdMessage: lcdMessageUnion.optional(), micVolume: micVolume.optional(), activePatrolSlot: activePatrolSlot.nullable().optional(), videoMode: videoMode.optional(), hdrType: hdrType.optional(), featureFlags: cameraFeatureFlags.optional(), smartDetectSettings: smartDetectSettings.optional(), hasPackageCamera: hasPackageCamera.optional()}); export const chimePartialWithReference = z.object({id: chimeId, modelKey: chimeModelKey, state: deviceState.optional(), name: name.nullable().optional(), mac: mac.optional(), cameraIds: z.array(cameraId).optional(), ringSettings: z.array(ringSettings).optional()}); export const lightPartialWithReference = z.object({id: lightId, modelKey: lightModelKey, state: deviceState.optional(), name: name.nullable().optional(), mac: mac.optional(), lightModeSettings: lightModeSettings.optional(), lightDeviceSettings: lightDeviceSettings.optional(), isDark: isDark.optional(), isLightOn: isLightOn.optional(), isLightForceEnabled: isLightForceEnabled.optional(), lastMotion: lastMotion.optional(), isPirMotionDetected: isPirMotionDetected.optional(), camera: cameraId.nullable().optional()}); export const viewerPartialWithReference = z.object({id: viewerId, modelKey: viewerModelKey, state: deviceState.optional(), name: name.nullable().optional(), mac: mac.optional(), liveview: liveviewId.nullable().optional(), streamLimit: streamLimit.optional()}); export const speakerPartialWithReference = z.object({id: speakerId, modelKey: speakerModelKey, state: deviceState.optional(), name: name.nullable().optional(), mac: mac.optional(), volume: speakerVolume.optional(), micVolume: speakerMicVolume.optional(), isMicEnabled: speakerIsMicEnabled.optional(), speakerState: speakerState.optional(), featureFlags: speakerFeatureFlags.optional()}); export const bridgePartialWithReference = z.object({id: bridgeId, modelKey: bridgeModelKey, state: deviceState.optional(), name: name.nullable().optional(), mac: mac.optional(), platform: bridgePlatform.optional(), clients: bridgeClients.optional(), maxClients: bridgeMaxClients.optional()}); export const sensorPartialWithReference = z.object({id: sensorId, modelKey: sensorModelKey, state: deviceState.optional(), name: name.nullable().optional(), mac: mac.optional(), mountType: sensorMountType.optional(), batteryStatus: batteryStatus.optional(), stats: sensorStats.optional(), lightSettings: lightSettings.optional(), humiditySettings: humiditySettings.optional(), temperatureSettings: temperatureSettings.optional(), isOpened: sensorIsOpened.optional(), openStatusChangedAt: sensorOpenStatusChangedAt.optional(), isMotionDetected: sensorIsMotionDetected.optional(), motionDetectedAt: sensorMotionDetectedAt.optional(), motionSettings: motionSettings.optional(), glassBreakSettings: glassBreakSettings.optional(), scheduleMode: sensorScheduleMode.optional(), armProfileIds: sensorArmProfileIds.optional(), hasCustomSensitivityWhenArmed: sensorHasCustomSensitivityWhenArmed.optional(), alarmTriggeredAt: sensorAlarmTriggeredAt.optional(), alarmSettings: alarmSettings.optional(), leakDetectedAt: sensorLeakDetectedAt.optional(), externalLeakDetectedAt: sensorExternalLeakDetectedAt.optional(), leakSettings: leakSettings.optional(), tamperingDetectedAt: tamperingDetectedAt.optional(), wirelessConnectionState: wirelessConnectionState.optional()}); export const sirenPartialWithReference = z.object({id: sirenId, modelKey: sirenModelKey, state: deviceState.optional(), name: name.nullable().optional(), mac: mac.optional(), volume: sirenVolume.optional(), ledSettings: sirenLedSettingsExternal.optional(), sirenStatus: sirenStatus.optional(), connectionType: sirenConnectionType.optional(), wirelessConnectionState: wirelessConnectionState.optional()}); export const fobPartialWithReference = z.object({id: fobId, modelKey: fobModelKey, state: deviceState.optional(), name: name.nullable().optional(), mac: mac.optional(), awayState: fobAwayState.optional(), buttonLabels: fobButtonLabels.optional(), featureFlags: fobFeatureFlags.optional(), wirelessConnectionState: wirelessConnectionState.optional()}); export const relayPartialWithReference = z.object({id: relayId, modelKey: relayModelKey, state: deviceState.optional(), name: name.nullable().optional(), mac: mac.optional(), ledSettings: relayLedSettings.optional(), outputs: relayOutputs.optional(), inputs: relayInputs.optional(), wirelessConnectionState: wirelessConnectionState.optional()}); export const aiProcessorPartialWithReference = z.object({id: deviceId, modelKey: aiprocessorModelKey, state: deviceState.optional(), name: name.nullable().optional(), mac: mac.optional()}); export const aiPortPartialWithReference = z.object({id: deviceId, modelKey: aiportModelKey, state: deviceState.optional(), name: name.nullable().optional(), mac: mac.optional()}); export const linkStationPartialWithReference = z.object({id: linkStationId, modelKey: linkstationModelKey, state: deviceState.optional(), name: name.nullable().optional(), mac: mac.optional(), isAlarmHub: linkStationIsAlarmHub.optional(), ledSettings: linkStationLedSettings.optional(), lastEvent: linkStationLastEvent.optional(), alarmHub: alarmHubStatus.optional()}); export const devicePartialWithReference = z.discriminatedUnion("modelKey", [nvrPartialWithReference, cameraPartialWithReference, chimePartialWithReference, lightPartialWithReference, viewerPartialWithReference, speakerPartialWithReference, bridgePartialWithReference, sensorPartialWithReference, sirenPartialWithReference, fobPartialWithReference, relayPartialWithReference, aiProcessorPartialWithReference, aiPortPartialWithReference, linkStationPartialWithReference]); export const deviceUpdate = z.object({type: z.literal("update"), item: devicePartialWithReference}); export const nvrReference = z.object({id: nvrId, modelKey: nvrModelKey}); export const cameraReference = z.object({id: cameraId, modelKey: cameraModelKey}); export const chimeReference = z.object({id: chimeId, modelKey: chimeModelKey}); export const lightReference = z.object({id: lightId, modelKey: lightModelKey}); export const viewerReference = z.object({id: viewerId, modelKey: viewerModelKey}); export const speakerReference = z.object({id: speakerId, modelKey: speakerModelKey}); export const bridgeReference = z.object({id: bridgeId, modelKey: bridgeModelKey}); export const sensorReference = z.object({id: sensorId, modelKey: sensorModelKey}); export const sirenReference = z.object({id: sirenId, modelKey: sirenModelKey}); export const fobReference = z.object({id: fobId, modelKey: fobModelKey}); export const relayReference = z.object({id: relayId, modelKey: relayModelKey}); export const aiProcessorReference = z.object({id: deviceId, modelKey: aiprocessorModelKey}); export const aiPortReference = z.object({id: deviceId, modelKey: aiportModelKey}); export const linkStationReference = z.object({id: linkStationId, modelKey: linkstationModelKey}); export const deviceReference = z.discriminatedUnion("modelKey", [nvrReference, cameraReference, chimeReference, lightReference, viewerReference, speakerReference, bridgeReference, sensorReference, sirenReference, fobReference, relayReference, aiProcessorReference, aiPortReference, linkStationReference]); export const deviceRemove = z.object({type: z.literal("remove"), item: deviceReference}); export const deviceBulk = z.union([z.object({id: z.union([nvrId, z.array(nvrId)]), modelKey: nvrModelKey, name: name.nullable(), doorbellSettings: doorbellSettings, armMode: nvrArmMode}), z.object({id: z.union([cameraId, z.array(cameraId)]), modelKey: cameraModelKey, state: deviceState, name: name.nullable(), mac: mac, isMicEnabled: isMicEnabled, osdSettings: osdSettings, ledSettings: ledSettings, lcdMessage: lcdMessageUnion, micVolume: micVolume, activePatrolSlot: activePatrolSlot.nullable(), videoMode: videoMode, hdrType: hdrType, featureFlags: cameraFeatureFlags, smartDetectSettings: smartDetectSettings, hasPackageCamera: hasPackageCamera}), z.object({id: z.union([chimeId, z.array(chimeId)]), modelKey: chimeModelKey, state: deviceState, name: name.nullable(), mac: mac, cameraIds: z.array(cameraId), ringSettings: z.array(ringSettings)}), z.object({id: z.union([lightId, z.array(lightId)]), modelKey: lightModelKey, state: deviceState, name: name.nullable(), mac: mac, lightModeSettings: lightModeSettings, lightDeviceSettings: lightDeviceSettings, isDark: isDark, isLightOn: isLightOn, isLightForceEnabled: isLightForceEnabled, lastMotion: lastMotion, isPirMotionDetected: isPirMotionDetected, camera: cameraId.nullable()}), z.object({id: z.union([viewerId, z.array(viewerId)]), modelKey: viewerModelKey, state: deviceState, name: name.nullable(), mac: mac, liveview: liveviewId.nullable(), streamLimit: streamLimit}), z.object({id: z.union([speakerId, z.array(speakerId)]), modelKey: speakerModelKey, state: deviceState, name: name.nullable(), mac: mac, volume: speakerVolume, micVolume: speakerMicVolume, isMicEnabled: speakerIsMicEnabled, speakerState: speakerState, featureFlags: speakerFeatureFlags}), z.object({id: z.union([bridgeId, z.array(bridgeId)]), modelKey: bridgeModelKey, state: deviceState, name: name.nullable(), mac: mac, platform: bridgePlatform, clients: bridgeClients, maxClients: bridgeMaxClients}), z.object({id: z.union([sensorId, z.array(sensorId)]), modelKey: sensorModelKey, state: deviceState, name: name.nullable(), mac: mac, mountType: sensorMountType, batteryStatus: batteryStatus, stats: sensorStats, lightSettings: lightSettings, humiditySettings: humiditySettings, temperatureSettings: temperatureSettings, isOpened: sensorIsOpened, openStatusChangedAt: sensorOpenStatusChangedAt, isMotionDetected: sensorIsMotionDetected, motionDetectedAt: sensorMotionDetectedAt, motionSettings: motionSettings, glassBreakSettings: glassBreakSettings, scheduleMode: sensorScheduleMode, armProfileIds: sensorArmProfileIds, hasCustomSensitivityWhenArmed: sensorHasCustomSensitivityWhenArmed, alarmTriggeredAt: sensorAlarmTriggeredAt, alarmSettings: alarmSettings, leakDetectedAt: sensorLeakDetectedAt, externalLeakDetectedAt: sensorExternalLeakDetectedAt, leakSettings: leakSettings, tamperingDetectedAt: tamperingDetectedAt, wirelessConnectionState: wirelessConnectionState}), z.object({id: z.union([sirenId, z.array(sirenId)]), modelKey: sirenModelKey, state: deviceState, name: name.nullable(), mac: mac, volume: sirenVolume, ledSettings: sirenLedSettingsExternal, sirenStatus: sirenStatus, connectionType: sirenConnectionType, wirelessConnectionState: wirelessConnectionState}), z.object({id: z.union([fobId, z.array(fobId)]), modelKey: fobModelKey, state: deviceState, name: name.nullable(), mac: mac, awayState: fobAwayState, buttonLabels: fobButtonLabels, featureFlags: fobFeatureFlags, wirelessConnectionState: wirelessConnectionState}), z.object({id: z.union([relayId, z.array(relayId)]), modelKey: relayModelKey, state: deviceState, name: name.nullable(), mac: mac, ledSettings: relayLedSettings, outputs: relayOutputs, inputs: relayInputs, wirelessConnectionState: wirelessConnectionState}), z.object({id: z.union([deviceId, z.array(deviceId)]), modelKey: aiprocessorModelKey, state: deviceState, name: name.nullable(), mac: mac}), z.object({id: z.union([deviceId, z.array(deviceId)]), modelKey: aiportModelKey, state: deviceState, name: name.nullable(), mac: mac}), z.object({id: z.union([linkStationId, z.array(linkStationId)]), modelKey: linkstationModelKey, state: deviceState, name: name.nullable(), mac: mac, isAlarmHub: linkStationIsAlarmHub, ledSettings: linkStationLedSettings, lastEvent: linkStationLastEvent, alarmHub: alarmHubStatus.optional()})]); export const devicesAdd = z.object({type: z.literal("add"), item: deviceBulk}); export const deviceBulkPartialWithReference = z.union([z.object({id: z.union([nvrId, z.array(nvrId)]), modelKey: nvrModelKey, name: name.nullable().optional(), doorbellSettings: doorbellSettings.optional(), armMode: nvrArmMode.optional()}), z.object({id: z.union([cameraId, z.array(cameraId)]), modelKey: cameraModelKey, state: deviceState.optional(), name: name.nullable().optional(), mac: mac.optional(), isMicEnabled: isMicEnabled.optional(), osdSettings: osdSettings.optional(), ledSettings: ledSettings.optional(), lcdMessage: lcdMessageUnion.optional(), micVolume: micVolume.optional(), activePatrolSlot: activePatrolSlot.nullable().optional(), videoMode: videoMode.optional(), hdrType: hdrType.optional(), featureFlags: cameraFeatureFlags.optional(), smartDetectSettings: smartDetectSettings.optional(), hasPackageCamera: hasPackageCamera.optional()}), z.object({id: z.union([chimeId, z.array(chimeId)]), modelKey: chimeModelKey, state: deviceState.optional(), name: name.nullable().optional(), mac: mac.optional(), cameraIds: z.array(cameraId).optional(), ringSettings: z.array(ringSettings).optional()}), z.object({id: z.union([lightId, z.array(lightId)]), modelKey: lightModelKey, state: deviceState.optional(), name: name.nullable().optional(), mac: mac.optional(), lightModeSettings: lightModeSettings.optional(), lightDeviceSettings: lightDeviceSettings.optional(), isDark: isDark.optional(), isLightOn: isLightOn.optional(), isLightForceEnabled: isLightForceEnabled.optional(), lastMotion: lastMotion.optional(), isPirMotionDetected: isPirMotionDetected.optional(), camera: cameraId.nullable().optional()}), z.object({id: z.union([viewerId, z.array(viewerId)]), modelKey: viewerModelKey, state: deviceState.optional(), name: name.nullable().optional(), mac: mac.optional(), liveview: liveviewId.nullable().optional(), streamLimit: streamLimit.optional()}), z.object({id: z.union([speakerId, z.array(speakerId)]), modelKey: speakerModelKey, state: deviceState.optional(), name: name.nullable().optional(), mac: mac.optional(), volume: speakerVolume.optional(), micVolume: speakerMicVolume.optional(), isMicEnabled: speakerIsMicEnabled.optional(), speakerState: speakerState.optional(), featureFlags: speakerFeatureFlags.optional()}), z.object({id: z.union([bridgeId, z.array(bridgeId)]), modelKey: bridgeModelKey, state: deviceState.optional(), name: name.nullable().optional(), mac: mac.optional(), platform: bridgePlatform.optional(), clients: bridgeClients.optional(), maxClients: bridgeMaxClients.optional()}), z.object({id: z.union([sensorId, z.array(sensorId)]), modelKey: sensorModelKey, state: deviceState.optional(), name: name.nullable().optional(), mac: mac.optional(), mountType: sensorMountType.optional(), batteryStatus: batteryStatus.optional(), stats: sensorStats.optional(), lightSettings: lightSettings.optional(), humiditySettings: humiditySettings.optional(), temperatureSettings: temperatureSettings.optional(), isOpened: sensorIsOpened.optional(), openStatusChangedAt: sensorOpenStatusChangedAt.optional(), isMotionDetected: sensorIsMotionDetected.optional(), motionDetectedAt: sensorMotionDetectedAt.optional(), motionSettings: motionSettings.optional(), glassBreakSettings: glassBreakSettings.optional(), scheduleMode: sensorScheduleMode.optional(), armProfileIds: sensorArmProfileIds.optional(), hasCustomSensitivityWhenArmed: sensorHasCustomSensitivityWhenArmed.optional(), alarmTriggeredAt: sensorAlarmTriggeredAt.optional(), alarmSettings: alarmSettings.optional(), leakDetectedAt: sensorLeakDetectedAt.optional(), externalLeakDetectedAt: sensorExternalLeakDetectedAt.optional(), leakSettings: leakSettings.optional(), tamperingDetectedAt: tamperingDetectedAt.optional(), wirelessConnectionState: wirelessConnectionState.optional()}), z.object({id: z.union([sirenId, z.array(sirenId)]), modelKey: sirenModelKey, state: deviceState.optional(), name: name.nullable().optional(), mac: mac.optional(), volume: sirenVolume.optional(), ledSettings: sirenLedSettingsExternal.optional(), sirenStatus: sirenStatus.optional(), connectionType: sirenConnectionType.optional(), wirelessConnectionState: wirelessConnectionState.optional()}), z.object({id: z.union([fobId, z.array(fobId)]), modelKey: fobModelKey, state: deviceState.optional(), name: name.nullable().optional(), mac: mac.optional(), awayState: fobAwayState.optional(), buttonLabels: fobButtonLabels.optional(), featureFlags: fobFeatureFlags.optional(), wirelessConnectionState: wirelessConnectionState.optional()}), z.object({id: z.union([relayId, z.array(relayId)]), modelKey: relayModelKey, state: deviceState.optional(), name: name.nullable().optional(), mac: mac.optional(), ledSettings: relayLedSettings.optional(), outputs: relayOutputs.optional(), inputs: relayInputs.optional(), wirelessConnectionState: wirelessConnectionState.optional()}), z.object({id: z.union([deviceId, z.array(deviceId)]), modelKey: aiprocessorModelKey, state: deviceState.optional(), name: name.nullable().optional(), mac: mac.optional()}), z.object({id: z.union([deviceId, z.array(deviceId)]), modelKey: aiportModelKey, state: deviceState.optional(), name: name.nullable().optional(), mac: mac.optional()}), z.object({id: z.union([linkStationId, z.array(linkStationId)]), modelKey: linkstationModelKey, state: deviceState.optional(), name: name.nullable().optional(), mac: mac.optional(), isAlarmHub: linkStationIsAlarmHub.optional(), ledSettings: linkStationLedSettings.optional(), lastEvent: linkStationLastEvent.optional(), alarmHub: alarmHubStatus.optional()})]); export const devicesBulkUpdate = z.object({type: z.literal("update"), item: deviceBulkPartialWithReference}); export const deviceBulkReference = z.union([z.object({id: z.union([nvrId, z.array(nvrId)]), modelKey: nvrModelKey}), z.object({id: z.union([cameraId, z.array(cameraId)]), modelKey: cameraModelKey}), z.object({id: z.union([chimeId, z.array(chimeId)]), modelKey: chimeModelKey}), z.object({id: z.union([lightId, z.array(lightId)]), modelKey: lightModelKey}), z.object({id: z.union([viewerId, z.array(viewerId)]), modelKey: viewerModelKey}), z.object({id: z.union([speakerId, z.array(speakerId)]), modelKey: speakerModelKey}), z.object({id: z.union([bridgeId, z.array(bridgeId)]), modelKey: bridgeModelKey}), z.object({id: z.union([sensorId, z.array(sensorId)]), modelKey: sensorModelKey}), z.object({id: z.union([sirenId, z.array(sirenId)]), modelKey: sirenModelKey}), z.object({id: z.union([fobId, z.array(fobId)]), modelKey: fobModelKey}), z.object({id: z.union([relayId, z.array(relayId)]), modelKey: relayModelKey}), z.object({id: z.union([deviceId, z.array(deviceId)]), modelKey: aiprocessorModelKey}), z.object({id: z.union([deviceId, z.array(deviceId)]), modelKey: aiportModelKey}), z.object({id: z.union([linkStationId, z.array(linkStationId)]), modelKey: linkstationModelKey})]); export const devicesBulkRemove = z.object({type: z.literal("remove"), item: deviceBulkReference}); export const deviceEvent = z.union([z.union([deviceAdd, deviceUpdate, deviceRemove]), z.union([devicesAdd, devicesBulkUpdate, devicesBulkRemove])]); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Get update messages about devices * * GET /v1/subscribe/devices */ export const getApiV1SubscribeDevices = async (options?: GetApiV1SubscribeDevicesOptions) => { const {baseUrl = "https://api.ui.com/v1/connector/consoles/942A6FF664C0000000000964970E0000000009E710560000000068A9873F:9999999999/proxy/protect/integration", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") const url = `${baseUrl.replace(/\/+$/, '')}/v1/subscribe/devices${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(deviceEvent, await res.json()) };