homebridge-virtual-accessories
Version:
Virtual HomeKit accessories for Homebridge.
398 lines • 17.2 kB
JavaScript
/* eslint-disable curly */
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
import { BatteryConfiguration } from './accessories/configurationBattery.js';
import { DoorConfiguration } from './accessories/configurationDoor.js';
import { DoorbellConfiguration } from './accessories/configurationDoorbell.js';
import { FanConfiguration } from './accessories/configurationFan.js';
import { FilterMaintenanceConfiguration } from './accessories/configurationFilterMaintenance.js';
import { GarageDoorConfiguration } from './accessories/configurationGarageDoor.js';
import { HeaterCoolerConfiguration } from './accessories/configurationHeaterCooler.js';
import { HumidifierDehumidifierConfiguration } from './accessories/configurationHumidifierDehumidifier.js';
import { LightbulbConfiguration } from './accessories/configurationLightbulb.js';
import { LockConfiguration } from './accessories/configurationLock.js';
import { SecuritySystemConfiguration } from './accessories/configurationSecuritySystem.js';
import { SensorConfiguration } from './configurationSensor.js';
import { SpeakerConfiguration } from './accessories/configurationSpeaker.js';
import { SwitchConfiguration } from './accessories/configurationSwitch.js';
import { TelevisionConfiguration } from './accessories/configurationTelevision.js';
import { ValveConfiguration } from './accessories/configurationValve.js';
import { WindowConfiguration } from './accessories/configurationWindow.js';
import { WindowCoveringConfiguration } from './accessories/configurationWindowCovering.js';
import { CronTriggerConfiguration } from './triggers/configurationCronTrigger.js';
import { PingTriggerConfiguration } from './triggers/configurationPingTrigger.js';
import { SunEventsTriggerConfiguration } from './triggers/configurationSunEventsTrigger.js';
import { WebhookTriggerConfiguration } from './triggers/configurationWebhookTriggerConfiguration.js';
import { CompanionSensorConfiguration } from './configurationCompanionSensor.js';
import { TimerConfiguration } from './configurationTimer.js';
import { AccessoryType, TriggerType } from './schema.js';
import { Utils } from '../utils/utils.js';
import { Type } from 'typeserializer';
/**
*
*/
export class AccessoryConfiguration {
// ****************************** Schema fields ******************************
// Required
accessoryID;
accessoryName;
accessoryType;
// Optional
accessoryIsStateful = false;
// Accessories
// Battery
battery;
// Door
door;
// Doorbell
doorbell;
// Fan
fan;
// Filter Maintenance
filterMaintenance;
// Garage Door
garageDoor;
// HeaterCooler
heaterCooler;
// HumidifierDehumidifier
humidifierDehumidifier;
// Lightbulb
lightbulb;
// Lock
lock;
// SecuritySystem
securitySystem;
// Sensor
sensor;
// Speaker
speaker;
// Switch
switch;
// Television
television;
// Valve
valve;
// Window
window;
// Window Covering
windowCovering;
// Switch decorations
// Reset timer
resetTimer;
// Companion Sensor
companionSensor;
// Triggers
pingTrigger;
cronTrigger;
sunEventsTrigger;
webhookTrigger;
// ********************* Configuration enrichment fields *********************
// External accessory category
category;
// Television input source
inputSource;
// ***************************************************************************
errorFields = [];
fieldNames = Utils.proxiedPropertiesOf(this);
isValid() {
const isValidAccessoryID = (Utils.required(this.accessoryID) &&
this.isValidId());
const isValidAccessoryName = (Utils.required(this.accessoryName));
const isValidAccessoryType = (Utils.required(this.accessoryType));
const isValidAccessory = (this.isValidAccessory());
// Store fields failing validation
if (!isValidAccessoryID)
this.errorFields.push(this.fieldNames.accessoryID);
if (!isValidAccessoryName)
this.errorFields.push(this.fieldNames.accessoryName);
if (!isValidAccessoryType)
this.errorFields.push(this.fieldNames.accessoryType);
return [
(isValidAccessoryID &&
isValidAccessoryName &&
isValidAccessoryType &&
isValidAccessory),
this.errorFields,
];
}
isValidId() {
const accessoryIdPattern = '^[A-Za-z0-9\\-]{5,}$';
const patternRegex = new RegExp(accessoryIdPattern);
const isValidId = ((this.accessoryID !== undefined) &&
patternRegex.test(this.accessoryID));
return isValidId;
}
isValidAccessory() {
switch (this.accessoryType) {
case AccessoryType.Battery:
this.accessoryIsStateful = true;
return this.isErrorless(this.battery, this.fieldNames.battery);
case AccessoryType.Door:
return this.isErrorless(this.door, this.fieldNames.door);
case AccessoryType.Doorbell:
this.accessoryIsStateful = true;
return this.isErrorless(this.doorbell, this.fieldNames.doorbell);
case AccessoryType.Fan:
return this.isErrorless(this.fan, this.fieldNames.fan);
case AccessoryType.FilterMaintenance:
this.accessoryIsStateful = true;
return this.isErrorless(this.filterMaintenance, this.fieldNames.filterMaintenance);
case AccessoryType.GarageDoor:
return this.isErrorless(this.garageDoor, this.fieldNames.garageDoor);
case AccessoryType.HeaterCooler:
return this.isErrorless(this.heaterCooler, this.fieldNames.heaterCooler);
case AccessoryType.HumidifierDehumidifier:
return this.isErrorless(this.humidifierDehumidifier, this.fieldNames.humidifierDehumidifier);
case AccessoryType.Lightbulb:
return this.isErrorless(this.lightbulb, this.fieldNames.lightbulb);
case AccessoryType.Lock:
return this.isErrorless(this.lock, this.fieldNames.lock);
case AccessoryType.SecuritySystem:
return this.isErrorless(this.securitySystem, this.fieldNames.securitySystem);
case AccessoryType.Sensor:
return this.isErrorlessSensor(this.sensor, this.fieldNames.sensor);
case AccessoryType.Speaker:
this.category = 26 /* Categories.SPEAKER */;
return this.isErrorless(this.speaker, this.fieldNames.speaker);
case AccessoryType.Switch:
return this.isErrorlessSwitch(this.switch, this.fieldNames.switch);
case AccessoryType.Television:
this.category = 31 /* Categories.TELEVISION */;
return this.isErrorless(this.television, this.fieldNames.television);
case AccessoryType.Valve:
return this.isErrorless(this.valve, this.fieldNames.valve);
case AccessoryType.Window:
return this.isErrorless(this.window, this.fieldNames.window);
case AccessoryType.WindowCovering:
return this.isErrorless(this.windowCovering, this.fieldNames.windowCovering);
}
return false;
}
;
/**
* Accessory validation
*/
isErrorless(accessory, prefix) {
let isValid = false;
let errorFields = [prefix];
if (accessory !== undefined) {
[isValid, errorFields] = accessory.isValid(prefix);
}
this.errorFields.push(...errorFields);
return (isValid);
}
;
isErrorlessSensor(accessory, prefix) {
let isValidSensor = false;
let sensorErrorFields = [prefix];
if (accessory !== undefined) {
[isValidSensor, sensorErrorFields] = accessory.isValid(prefix);
}
this.errorFields.push(...sensorErrorFields);
// Validate SensorTrigger
let isValidTrigger = false;
let triggerErrorFields = ['Trigger'];
if (this.sensor !== undefined) {
[isValidTrigger, triggerErrorFields] = this.isValidTrigger();
}
this.errorFields.push(...triggerErrorFields);
return (isValidSensor &&
isValidTrigger);
}
;
isErrorlessSwitch(accessory, prefix) {
let isValidSwitch = false;
let switchErrorFields = [prefix];
if (accessory !== undefined) {
[isValidSwitch, switchErrorFields] = accessory.isValid(prefix);
}
this.errorFields.push(...switchErrorFields);
// Validate ResetTimer
let isValidResetTimer = false;
let resetTimerErrorFields = [this.fieldNames.resetTimer];
[isValidResetTimer, resetTimerErrorFields] = this.isErrorlessResetTimer(this.resetTimer, this.fieldNames.resetTimer);
this.errorFields.push(...resetTimerErrorFields);
// Validate CompanionSensor
let isValidCompanionSensor = false;
let companionSensorErrorFields = [this.fieldNames.companionSensor];
[isValidCompanionSensor, companionSensorErrorFields] = this.isValidCompanionSensor(this.companionSensor, this.fieldNames.companionSensor);
this.errorFields.push(...companionSensorErrorFields);
return (isValidSwitch &&
isValidResetTimer &&
isValidCompanionSensor);
}
;
/**
* Decoration validations
*/
// Validate if accessory has reset timer - default true
isErrorlessResetTimer(accessory, prefix) {
if (this.switch !== undefined && this.switch.hasResetTimer) {
let isValid;
let errorFields;
if (accessory === undefined) {
return [false, []];
}
// eslint-disable-next-line prefer-const
[isValid, errorFields] = accessory.isValid(prefix);
return [isValid, errorFields];
}
return [true, []];
}
// Validate if accessory has companion sensor - default true
isValidCompanionSensor(accessory, prefix) {
if (this.switch !== undefined && this.switch.hasCompanionSensor) {
let isValid;
let errorFields;
if (accessory === undefined) {
return [false, []];
}
// eslint-disable-next-line prefer-const
[isValid, errorFields] = accessory.isValid(prefix);
return [isValid, errorFields];
}
return [true, []];
}
isValidTrigger() {
if (this.sensor.trigger !== undefined) {
let isValid;
let errorFields;
switch (this.sensor.trigger) {
case TriggerType.Cron:
if (this.cronTrigger === undefined) {
return [false, [this.fieldNames.cronTrigger]];
}
[isValid, errorFields] = this.cronTrigger.isValid(this.fieldNames.cronTrigger);
break;
case TriggerType.Ping:
if (this.pingTrigger === undefined) {
return [false, [this.fieldNames.pingTrigger]];
}
[isValid, errorFields] = this.pingTrigger.isValid(this.fieldNames.pingTrigger);
break;
case TriggerType.SunEvents:
if (this.sunEventsTrigger === undefined) {
return [false, [this.fieldNames.sunEventsTrigger]];
}
[isValid, errorFields] = this.sunEventsTrigger.isValid(this.fieldNames.sunEventsTrigger);
break;
case TriggerType.Webhook:
// This can be undefined, as it is only a checkbox, so just create it here for now
this.webhookTrigger = (this.webhookTrigger === undefined ? new WebhookTriggerConfiguration() : this.webhookTrigger);
if (this.webhookTrigger === undefined) {
return [false, [this.fieldNames.webhookTrigger]];
}
[isValid, errorFields] = this.webhookTrigger.isValid(this.fieldNames.webhookTrigger);
break;
default:
return [false, ['trigger']];
}
return [isValid, errorFields];
}
return [false, ['sensorTrigger']];
}
}
__decorate([
Type(BatteryConfiguration),
__metadata("design:type", BatteryConfiguration)
], AccessoryConfiguration.prototype, "battery", void 0);
__decorate([
Type(DoorConfiguration),
__metadata("design:type", DoorConfiguration)
], AccessoryConfiguration.prototype, "door", void 0);
__decorate([
Type(DoorbellConfiguration),
__metadata("design:type", DoorbellConfiguration)
], AccessoryConfiguration.prototype, "doorbell", void 0);
__decorate([
Type(FanConfiguration),
__metadata("design:type", FanConfiguration)
], AccessoryConfiguration.prototype, "fan", void 0);
__decorate([
Type(FilterMaintenanceConfiguration),
__metadata("design:type", FilterMaintenanceConfiguration)
], AccessoryConfiguration.prototype, "filterMaintenance", void 0);
__decorate([
Type(GarageDoorConfiguration),
__metadata("design:type", GarageDoorConfiguration)
], AccessoryConfiguration.prototype, "garageDoor", void 0);
__decorate([
Type(HeaterCoolerConfiguration),
__metadata("design:type", HeaterCoolerConfiguration)
], AccessoryConfiguration.prototype, "heaterCooler", void 0);
__decorate([
Type(HumidifierDehumidifierConfiguration),
__metadata("design:type", HumidifierDehumidifierConfiguration)
], AccessoryConfiguration.prototype, "humidifierDehumidifier", void 0);
__decorate([
Type(LightbulbConfiguration),
__metadata("design:type", LightbulbConfiguration)
], AccessoryConfiguration.prototype, "lightbulb", void 0);
__decorate([
Type(LockConfiguration),
__metadata("design:type", LockConfiguration)
], AccessoryConfiguration.prototype, "lock", void 0);
__decorate([
Type(SecuritySystemConfiguration),
__metadata("design:type", SecuritySystemConfiguration)
], AccessoryConfiguration.prototype, "securitySystem", void 0);
__decorate([
Type(SensorConfiguration),
__metadata("design:type", SensorConfiguration)
], AccessoryConfiguration.prototype, "sensor", void 0);
__decorate([
Type(SpeakerConfiguration),
__metadata("design:type", SpeakerConfiguration)
], AccessoryConfiguration.prototype, "speaker", void 0);
__decorate([
Type(SwitchConfiguration),
__metadata("design:type", SwitchConfiguration)
], AccessoryConfiguration.prototype, "switch", void 0);
__decorate([
Type(TelevisionConfiguration),
__metadata("design:type", TelevisionConfiguration)
], AccessoryConfiguration.prototype, "television", void 0);
__decorate([
Type(ValveConfiguration),
__metadata("design:type", ValveConfiguration)
], AccessoryConfiguration.prototype, "valve", void 0);
__decorate([
Type(WindowConfiguration),
__metadata("design:type", WindowConfiguration)
], AccessoryConfiguration.prototype, "window", void 0);
__decorate([
Type(WindowCoveringConfiguration),
__metadata("design:type", WindowCoveringConfiguration)
], AccessoryConfiguration.prototype, "windowCovering", void 0);
__decorate([
Type(TimerConfiguration),
__metadata("design:type", TimerConfiguration)
], AccessoryConfiguration.prototype, "resetTimer", void 0);
__decorate([
Type(CompanionSensorConfiguration),
__metadata("design:type", CompanionSensorConfiguration)
], AccessoryConfiguration.prototype, "companionSensor", void 0);
__decorate([
Type(PingTriggerConfiguration),
__metadata("design:type", PingTriggerConfiguration)
], AccessoryConfiguration.prototype, "pingTrigger", void 0);
__decorate([
Type(CronTriggerConfiguration),
__metadata("design:type", CronTriggerConfiguration)
], AccessoryConfiguration.prototype, "cronTrigger", void 0);
__decorate([
Type(SunEventsTriggerConfiguration),
__metadata("design:type", SunEventsTriggerConfiguration)
], AccessoryConfiguration.prototype, "sunEventsTrigger", void 0);
__decorate([
Type(WebhookTriggerConfiguration),
__metadata("design:type", WebhookTriggerConfiguration)
], AccessoryConfiguration.prototype, "webhookTrigger", void 0);
//# sourceMappingURL=configurationAccessory.js.map