homebridge-virtual-accessories
Version:
Virtual HomeKit accessories for Homebridge.
119 lines • 6.16 kB
JavaScript
/* 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