UNPKG

homebridge-virtual-accessories

Version:
398 lines 17.2 kB
/* 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