UNPKG

homebridge-virtual-accessories

Version:
119 lines 6.16 kB
/* eslint-disable @typescript-eslint/no-explicit-any */ import { BinarySensor } from '../binarySensor.js'; import { BinarySensorType } from '../../configuration/schema.js'; import { AccessoryNotAllowedError } from '../../errors.js'; import { MotionSensor } from '../virtualSensorMotion.js'; import { CarbonDioxideSensor } from '../virtualSensorCarbonDioxide.js'; import { CarbonMonoxideSensor } from '../virtualSensorCarbonMonoxide.js'; import { ContactSensor } from '../virtualSensorContact.js'; import { LeakSensor } from '../virtualSensorLeak.js'; import { OccupancySensor } from '../virtualSensorOccupancy.js'; import { SmokeSensor } from '../virtualSensorSmoke.js'; export class CompanionSensor { static getTriggerableCompanionSensor(platform, accessory, accessoryConfiguration) { const sensorType = accessoryConfiguration.companionSensor.type; const companionSensorName = accessoryConfiguration.companionSensor.name; let virtualSensor; switch (sensorType) { case BinarySensorType.CarbonDioxide: virtualSensor = new CompanionCarbonDioxideSensor(platform, accessory, accessoryConfiguration, companionSensorName); break; case BinarySensorType.CarbonMonoxide: virtualSensor = new CompanionCarbonMonoxideSensor(platform, accessory, accessoryConfiguration, companionSensorName); break; case BinarySensorType.Contact: virtualSensor = new CompanionContactSensor(platform, accessory, accessoryConfiguration, companionSensorName); break; case BinarySensorType.Leak: virtualSensor = new CompanionLeakSensor(platform, accessory, accessoryConfiguration, companionSensorName); break; case BinarySensorType.Motion: virtualSensor = new CompanionMotionSensor(platform, accessory, accessoryConfiguration, companionSensorName); break; case BinarySensorType.Occupancy: virtualSensor = new CompanionOccupancySensor(platform, accessory, accessoryConfiguration, companionSensorName); break; case BinarySensorType.Smoke: virtualSensor = new CompanionSmokeSensor(platform, accessory, accessoryConfiguration, companionSensorName); break; default: platform.log.error(`Error creating sensor. Invalid sensor type: ${sensorType}`); } return virtualSensor; } } // Mixin function Companion(SensorInstance) { class CompanionSensor extends SensorInstance { uuidPostfix = '-sensor'; companionConstructor(companionSensorName) { // Replace the Sensor Service const sensorService = this.getService(); const service = this.accessory.getService(sensorService); if (service !== undefined) { this.accessory.removeService(service); } this.service = this.accessory.getService(companionSensorName) || this.accessory.addService(sensorService, companionSensorName, this.accessory.UUID + this.uuidPostfix); this.service.setCharacteristic(this.platform.Characteristic.Name, companionSensorName); this.trigger = undefined; } /** * This method is called by the accessory that has this sensor as a companion */ async triggerCompanionSensorState(sensorState, accessory, isLoggingDisabled = false) { if (accessory.accessory.UUID !== this.accessory.UUID) { throw new AccessoryNotAllowedError(`Switch ${accessory.accessoryConfiguration.accessoryName} is not allowed to trigger this sensor`); } this.states.SensorState = sensorState; this.service.updateCharacteristic(this.eventDetected, (this.states.SensorState)); // eslint-disable-next-line max-len this.log.info(`[${this.accessoryConfiguration.accessoryName}] Setting Sensor Current State: ${BinarySensor.getStateName(this.states.SensorState)}`, isLoggingDisabled); } } ; return CompanionSensor; } class CompanionCarbonDioxideSensor extends Companion(CarbonDioxideSensor) { constructor(platform, accessory, accessoryConfiguration, companionSensorName) { super(platform, accessory, accessoryConfiguration); this.companionConstructor(companionSensorName); } } class CompanionCarbonMonoxideSensor extends Companion(CarbonMonoxideSensor) { constructor(platform, accessory, accessoryConfiguration, companionSensorName) { super(platform, accessory, accessoryConfiguration); this.companionConstructor(companionSensorName); } } class CompanionContactSensor extends Companion(ContactSensor) { constructor(platform, accessory, accessoryConfiguration, companionSensorName) { super(platform, accessory, accessoryConfiguration); this.companionConstructor(companionSensorName); } } class CompanionLeakSensor extends Companion(LeakSensor) { constructor(platform, accessory, accessoryConfiguration, companionSensorName) { super(platform, accessory, accessoryConfiguration); this.companionConstructor(companionSensorName); } } class CompanionMotionSensor extends Companion(MotionSensor) { constructor(platform, accessory, accessoryConfiguration, companionSensorName) { super(platform, accessory, accessoryConfiguration); this.companionConstructor(companionSensorName); } } class CompanionOccupancySensor extends Companion(OccupancySensor) { constructor(platform, accessory, accessoryConfiguration, companionSensorName) { super(platform, accessory, accessoryConfiguration); this.companionConstructor(companionSensorName); } } class CompanionSmokeSensor extends Companion(SmokeSensor) { constructor(platform, accessory, accessoryConfiguration, companionSensorName) { super(platform, accessory, accessoryConfiguration); this.companionConstructor(companionSensorName); } } //# sourceMappingURL=companionSensors.js.map