homebridge-virtual-accessories 3.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +7 -0
- package/README.md +1091 -0
- package/VirtualAccessories.jpg +0 -0
- package/VirtualAccessories.png +0 -0
- package/assets/changeorder.png +0 -0
- package/assets/creative-ideas/HowToAddAFakeThermostat.png +0 -0
- package/assets/keepaccessories.png +0 -0
- package/assets/mentions/youtube-EdgarsHomeTech.png +0 -0
- package/assets/mentions/youtube-MakeSmartMatter.png +0 -0
- package/assets/wiki/automation-shortcut-1.png +0 -0
- package/assets/wiki/automation-shortcut-2.png +0 -0
- package/assets/wiki/cron-schedule-config.png +0 -0
- package/assets/wiki/enable-sensor-webhooks.png +0 -0
- package/assets/wiki/humidifier-dehumidifier-config.png +0 -0
- package/assets/wiki/new-automation.png +0 -0
- package/assets/wiki/timer-duration-new.png +0 -0
- package/assets/wiki/timer-duration-old.png +0 -0
- package/assets/wiki/valve-timer-duration-new.png +0 -0
- package/assets/wiki/valve-timer-duration-old.png +0 -0
- package/config.schema.json +1570 -0
- package/dist/accessories/audioAccessory.d.ts +29 -0
- package/dist/accessories/audioAccessory.js +119 -0
- package/dist/accessories/audioAccessory.js.map +1 -0
- package/dist/accessories/externalAccessory.d.ts +10 -0
- package/dist/accessories/externalAccessory.js +13 -0
- package/dist/accessories/externalAccessory.js.map +1 -0
- package/dist/accessories/openingAccessory.d.ts +35 -0
- package/dist/accessories/openingAccessory.js +166 -0
- package/dist/accessories/openingAccessory.js.map +1 -0
- package/dist/accessories/triggerableEventAccessory.d.ts +7 -0
- package/dist/accessories/triggerableEventAccessory.js +2 -0
- package/dist/accessories/triggerableEventAccessory.js.map +1 -0
- package/dist/accessories/virtualAccessory.d.ts +29 -0
- package/dist/accessories/virtualAccessory.js +86 -0
- package/dist/accessories/virtualAccessory.js.map +1 -0
- package/dist/accessories/virtualAccessoryDoor.d.ts +14 -0
- package/dist/accessories/virtualAccessoryDoor.js +20 -0
- package/dist/accessories/virtualAccessoryDoor.js.map +1 -0
- package/dist/accessories/virtualAccessoryDoorbell.d.ts +29 -0
- package/dist/accessories/virtualAccessoryDoorbell.js +111 -0
- package/dist/accessories/virtualAccessoryDoorbell.js.map +1 -0
- package/dist/accessories/virtualAccessoryFan.d.ts +27 -0
- package/dist/accessories/virtualAccessoryFan.js +122 -0
- package/dist/accessories/virtualAccessoryFan.js.map +1 -0
- package/dist/accessories/virtualAccessoryFilterMaintenance.d.ts +26 -0
- package/dist/accessories/virtualAccessoryFilterMaintenance.js +122 -0
- package/dist/accessories/virtualAccessoryFilterMaintenance.js.map +1 -0
- package/dist/accessories/virtualAccessoryGarageDoor.d.ts +28 -0
- package/dist/accessories/virtualAccessoryGarageDoor.js +162 -0
- package/dist/accessories/virtualAccessoryGarageDoor.js.map +1 -0
- package/dist/accessories/virtualAccessoryHeaterCooler.d.ts +62 -0
- package/dist/accessories/virtualAccessoryHeaterCooler.js +441 -0
- package/dist/accessories/virtualAccessoryHeaterCooler.js.map +1 -0
- package/dist/accessories/virtualAccessoryHumidifierDehumidifier.d.ts +53 -0
- package/dist/accessories/virtualAccessoryHumidifierDehumidifier.js +365 -0
- package/dist/accessories/virtualAccessoryHumidifierDehumidifier.js.map +1 -0
- package/dist/accessories/virtualAccessoryInputSource.d.ts +38 -0
- package/dist/accessories/virtualAccessoryInputSource.js +196 -0
- package/dist/accessories/virtualAccessoryInputSource.js.map +1 -0
- package/dist/accessories/virtualAccessoryLightbulb.d.ts +37 -0
- package/dist/accessories/virtualAccessoryLightbulb.js +222 -0
- package/dist/accessories/virtualAccessoryLightbulb.js.map +1 -0
- package/dist/accessories/virtualAccessoryLock.d.ts +34 -0
- package/dist/accessories/virtualAccessoryLock.js +198 -0
- package/dist/accessories/virtualAccessoryLock.js.map +1 -0
- package/dist/accessories/virtualAccessorySecuritySystem.d.ts +30 -0
- package/dist/accessories/virtualAccessorySecuritySystem.js +214 -0
- package/dist/accessories/virtualAccessorySecuritySystem.js.map +1 -0
- package/dist/accessories/virtualAccessorySpeaker.d.ts +14 -0
- package/dist/accessories/virtualAccessorySpeaker.js +20 -0
- package/dist/accessories/virtualAccessorySpeaker.js.map +1 -0
- package/dist/accessories/virtualAccessorySwitch.d.ts +34 -0
- package/dist/accessories/virtualAccessorySwitch.js +191 -0
- package/dist/accessories/virtualAccessorySwitch.js.map +1 -0
- package/dist/accessories/virtualAccessoryTelevision.d.ts +44 -0
- package/dist/accessories/virtualAccessoryTelevision.js +230 -0
- package/dist/accessories/virtualAccessoryTelevision.js.map +1 -0
- package/dist/accessories/virtualAccessoryValve.d.ts +34 -0
- package/dist/accessories/virtualAccessoryValve.js +215 -0
- package/dist/accessories/virtualAccessoryValve.js.map +1 -0
- package/dist/accessories/virtualAccessoryWindow.d.ts +14 -0
- package/dist/accessories/virtualAccessoryWindow.js +20 -0
- package/dist/accessories/virtualAccessoryWindow.js.map +1 -0
- package/dist/accessories/virtualAccessoryWindowCovering.d.ts +14 -0
- package/dist/accessories/virtualAccessoryWindowCovering.js +20 -0
- package/dist/accessories/virtualAccessoryWindowCovering.js.map +1 -0
- package/dist/accessoryFactory.d.ts +15 -0
- package/dist/accessoryFactory.js +147 -0
- package/dist/accessoryFactory.js.map +1 -0
- package/dist/colors.d.ts +22 -0
- package/dist/colors.js +146 -0
- package/dist/colors.js.map +1 -0
- package/dist/companions/companionLightbulb.d.ts +10 -0
- package/dist/companions/companionLightbulb.js +12 -0
- package/dist/companions/companionLightbulb.js.map +1 -0
- package/dist/companions/companionSensors.d.ts +9 -0
- package/dist/companions/companionSensors.js +117 -0
- package/dist/companions/companionSensors.js.map +1 -0
- package/dist/companions/companionSwitch.d.ts +15 -0
- package/dist/companions/companionSwitch.js +46 -0
- package/dist/companions/companionSwitch.js.map +1 -0
- package/dist/configuration/accessories/configurationDoor.d.ts +9 -0
- package/dist/configuration/accessories/configurationDoor.js +31 -0
- package/dist/configuration/accessories/configurationDoor.js.map +1 -0
- package/dist/configuration/accessories/configurationDoorbell.d.ts +10 -0
- package/dist/configuration/accessories/configurationDoorbell.js +23 -0
- package/dist/configuration/accessories/configurationDoorbell.js.map +1 -0
- package/dist/configuration/accessories/configurationFan.d.ts +12 -0
- package/dist/configuration/accessories/configurationFan.js +36 -0
- package/dist/configuration/accessories/configurationFan.js.map +1 -0
- package/dist/configuration/accessories/configurationFilterMaintenance.d.ts +12 -0
- package/dist/configuration/accessories/configurationFilterMaintenance.js +48 -0
- package/dist/configuration/accessories/configurationFilterMaintenance.js.map +1 -0
- package/dist/configuration/accessories/configurationGarageDoor.d.ts +9 -0
- package/dist/configuration/accessories/configurationGarageDoor.js +31 -0
- package/dist/configuration/accessories/configurationGarageDoor.js.map +1 -0
- package/dist/configuration/accessories/configurationHeaterCooler.d.ts +20 -0
- package/dist/configuration/accessories/configurationHeaterCooler.js +116 -0
- package/dist/configuration/accessories/configurationHeaterCooler.js.map +1 -0
- package/dist/configuration/accessories/configurationHumidifierDehumidifier.d.ts +12 -0
- package/dist/configuration/accessories/configurationHumidifierDehumidifier.js +44 -0
- package/dist/configuration/accessories/configurationHumidifierDehumidifier.js.map +1 -0
- package/dist/configuration/accessories/configurationInputSource.d.ts +12 -0
- package/dist/configuration/accessories/configurationInputSource.js +33 -0
- package/dist/configuration/accessories/configurationInputSource.js.map +1 -0
- package/dist/configuration/accessories/configurationLightbulb.d.ts +14 -0
- package/dist/configuration/accessories/configurationLightbulb.js +55 -0
- package/dist/configuration/accessories/configurationLightbulb.js.map +1 -0
- package/dist/configuration/accessories/configurationLock.d.ts +11 -0
- package/dist/configuration/accessories/configurationLock.js +30 -0
- package/dist/configuration/accessories/configurationLock.js.map +1 -0
- package/dist/configuration/accessories/configurationSecuritySystem.d.ts +18 -0
- package/dist/configuration/accessories/configurationSecuritySystem.js +48 -0
- package/dist/configuration/accessories/configurationSecuritySystem.js.map +1 -0
- package/dist/configuration/accessories/configurationSpeaker.d.ts +9 -0
- package/dist/configuration/accessories/configurationSpeaker.js +24 -0
- package/dist/configuration/accessories/configurationSpeaker.js.map +1 -0
- package/dist/configuration/accessories/configurationSwitch.d.ts +13 -0
- package/dist/configuration/accessories/configurationSwitch.js +27 -0
- package/dist/configuration/accessories/configurationSwitch.js.map +1 -0
- package/dist/configuration/accessories/configurationTelevision.d.ts +12 -0
- package/dist/configuration/accessories/configurationTelevision.js +47 -0
- package/dist/configuration/accessories/configurationTelevision.js.map +1 -0
- package/dist/configuration/accessories/configurationValve.d.ts +25 -0
- package/dist/configuration/accessories/configurationValve.js +88 -0
- package/dist/configuration/accessories/configurationValve.js.map +1 -0
- package/dist/configuration/accessories/configurationWindow.d.ts +9 -0
- package/dist/configuration/accessories/configurationWindow.js +31 -0
- package/dist/configuration/accessories/configurationWindow.js.map +1 -0
- package/dist/configuration/accessories/configurationWindowCovering.d.ts +9 -0
- package/dist/configuration/accessories/configurationWindowCovering.js +31 -0
- package/dist/configuration/accessories/configurationWindowCovering.js.map +1 -0
- package/dist/configuration/configuration.d.ts +13 -0
- package/dist/configuration/configuration.js +41 -0
- package/dist/configuration/configuration.js.map +1 -0
- package/dist/configuration/configurationAccessory.d.ts +6 -0
- package/dist/configuration/configurationAccessory.js +6 -0
- package/dist/configuration/configurationAccessory.js.map +1 -0
- package/dist/configuration/configurationAudioAccessoryConfiguration.d.ts +9 -0
- package/dist/configuration/configurationAudioAccessoryConfiguration.js +9 -0
- package/dist/configuration/configurationAudioAccessoryConfiguration.js.map +1 -0
- package/dist/configuration/configurationCompanionSensor.d.ts +11 -0
- package/dist/configuration/configurationCompanionSensor.js +26 -0
- package/dist/configuration/configurationCompanionSensor.js.map +1 -0
- package/dist/configuration/configurationDuration.d.ts +19 -0
- package/dist/configuration/configurationDuration.js +55 -0
- package/dist/configuration/configurationDuration.js.map +1 -0
- package/dist/configuration/configurationOpenableAccesory.d.ts +9 -0
- package/dist/configuration/configurationOpenableAccesory.js +9 -0
- package/dist/configuration/configurationOpenableAccesory.js.map +1 -0
- package/dist/configuration/configurationPlatform.d.ts +76 -0
- package/dist/configuration/configurationPlatform.js +381 -0
- package/dist/configuration/configurationPlatform.js.map +1 -0
- package/dist/configuration/configurationSchema.d.ts +178 -0
- package/dist/configuration/configurationSchema.js +198 -0
- package/dist/configuration/configurationSchema.js.map +1 -0
- package/dist/configuration/configurationSensor.d.ts +11 -0
- package/dist/configuration/configurationSensor.js +30 -0
- package/dist/configuration/configurationSensor.js.map +1 -0
- package/dist/configuration/configurationSensorServer.d.ts +11 -0
- package/dist/configuration/configurationSensorServer.js +26 -0
- package/dist/configuration/configurationSensorServer.js.map +1 -0
- package/dist/configuration/configurationTimer.d.ts +15 -0
- package/dist/configuration/configurationTimer.js +101 -0
- package/dist/configuration/configurationTimer.js.map +1 -0
- package/dist/configuration/triggers/configurationCronTrigger.d.ts +18 -0
- package/dist/configuration/triggers/configurationCronTrigger.js +65 -0
- package/dist/configuration/triggers/configurationCronTrigger.js.map +1 -0
- package/dist/configuration/triggers/configurationPingTrigger.d.ts +11 -0
- package/dist/configuration/triggers/configurationPingTrigger.js +26 -0
- package/dist/configuration/triggers/configurationPingTrigger.js.map +1 -0
- package/dist/configuration/triggers/configurationSunEventsTrigger.d.ts +18 -0
- package/dist/configuration/triggers/configurationSunEventsTrigger.js +52 -0
- package/dist/configuration/triggers/configurationSunEventsTrigger.js.map +1 -0
- package/dist/configuration/triggers/configurationWebhookTriggerConfiguration.d.ts +9 -0
- package/dist/configuration/triggers/configurationWebhookTriggerConfiguration.js +17 -0
- package/dist/configuration/triggers/configurationWebhookTriggerConfiguration.js.map +1 -0
- package/dist/errors.d.ts +27 -0
- package/dist/errors.js +52 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/platform.d.ts +28 -0
- package/dist/platform.js +221 -0
- package/dist/platform.js.map +1 -0
- package/dist/sensorServer.d.ts +27 -0
- package/dist/sensorServer.js +227 -0
- package/dist/sensorServer.js.map +1 -0
- package/dist/sensors/virtualSensor.d.ts +37 -0
- package/dist/sensors/virtualSensor.js +87 -0
- package/dist/sensors/virtualSensor.js.map +1 -0
- package/dist/sensors/virtualSensorCarbonDioxide.d.ts +20 -0
- package/dist/sensors/virtualSensorCarbonDioxide.js +45 -0
- package/dist/sensors/virtualSensorCarbonDioxide.js.map +1 -0
- package/dist/sensors/virtualSensorCarbonMonoxide.d.ts +20 -0
- package/dist/sensors/virtualSensorCarbonMonoxide.js +45 -0
- package/dist/sensors/virtualSensorCarbonMonoxide.js.map +1 -0
- package/dist/sensors/virtualSensorContact.d.ts +20 -0
- package/dist/sensors/virtualSensorContact.js +45 -0
- package/dist/sensors/virtualSensorContact.js.map +1 -0
- package/dist/sensors/virtualSensorLeak.d.ts +20 -0
- package/dist/sensors/virtualSensorLeak.js +45 -0
- package/dist/sensors/virtualSensorLeak.js.map +1 -0
- package/dist/sensors/virtualSensorMotion.d.ts +20 -0
- package/dist/sensors/virtualSensorMotion.js +45 -0
- package/dist/sensors/virtualSensorMotion.js.map +1 -0
- package/dist/sensors/virtualSensorOccupancy.d.ts +20 -0
- package/dist/sensors/virtualSensorOccupancy.js +45 -0
- package/dist/sensors/virtualSensorOccupancy.js.map +1 -0
- package/dist/sensors/virtualSensorSmoke.d.ts +20 -0
- package/dist/sensors/virtualSensorSmoke.js +45 -0
- package/dist/sensors/virtualSensorSmoke.js.map +1 -0
- package/dist/settings.d.ts +8 -0
- package/dist/settings.js +9 -0
- package/dist/settings.js.map +1 -0
- package/dist/timer.d.ts +58 -0
- package/dist/timer.js +110 -0
- package/dist/timer.js.map +1 -0
- package/dist/triggerableSensor.d.ts +6 -0
- package/dist/triggerableSensor.js +2 -0
- package/dist/triggerableSensor.js.map +1 -0
- package/dist/triggers/trigger.d.ts +13 -0
- package/dist/triggers/trigger.js +16 -0
- package/dist/triggers/trigger.js.map +1 -0
- package/dist/triggers/triggerCron.d.ts +19 -0
- package/dist/triggers/triggerCron.js +102 -0
- package/dist/triggers/triggerCron.js.map +1 -0
- package/dist/triggers/triggerPing.d.ts +19 -0
- package/dist/triggers/triggerPing.js +110 -0
- package/dist/triggers/triggerPing.js.map +1 -0
- package/dist/triggers/triggerSunEvents.d.ts +20 -0
- package/dist/triggers/triggerSunEvents.js +200 -0
- package/dist/triggers/triggerSunEvents.js.map +1 -0
- package/dist/triggers/triggerWebhook.d.ts +10 -0
- package/dist/triggers/triggerWebhook.js +26 -0
- package/dist/triggers/triggerWebhook.js.map +1 -0
- package/dist/updatableObstruction.d.ts +6 -0
- package/dist/updatableObstruction.js +2 -0
- package/dist/updatableObstruction.js.map +1 -0
- package/dist/updatableSensor.d.ts +6 -0
- package/dist/updatableSensor.js +2 -0
- package/dist/updatableSensor.js.map +1 -0
- package/dist/utils.d.ts +28 -0
- package/dist/utils.js +120 -0
- package/dist/utils.js.map +1 -0
- package/dist/virtualLogger.d.ts +15 -0
- package/dist/virtualLogger.js +38 -0
- package/dist/virtualLogger.js.map +1 -0
- package/package.json +120 -0
@@ -0,0 +1,65 @@
|
|
1
|
+
/* eslint-disable curly */
|
2
|
+
import { Utils } from '../../utils.js';
|
3
|
+
import { LocalDateTime, ZoneId } from '@js-joda/core';
|
4
|
+
import '@js-joda/timezone';
|
5
|
+
/**
|
6
|
+
*
|
7
|
+
*/
|
8
|
+
export class CronTriggerConfiguration {
|
9
|
+
pattern;
|
10
|
+
zoneId;
|
11
|
+
startDateTime;
|
12
|
+
endDateTime;
|
13
|
+
disableTriggerEventLogging = false;
|
14
|
+
isDisabled = false;
|
15
|
+
// 5: minutes granularity
|
16
|
+
// 6: seconds granularity
|
17
|
+
// 7: milliseconds granularity
|
18
|
+
static cronMinutesGranularityPattern = '^((((\\d+,)+\\d+|(\\d+(\\/|-|#)\\d+)|\\d+L?|\\*(\\/\\d+)?|L(-\\d+)?|\\?|[A-Z]{3}(-[A-Z]{3})?) ?){5})$';
|
19
|
+
static isoTimeNoMillisPattern = '^\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d(:[0-5]\\d|)$';
|
20
|
+
errorFields = [];
|
21
|
+
fieldNames = Utils.proxiedPropertiesOf(this);
|
22
|
+
isValid(prefix) {
|
23
|
+
const patternRegex = new RegExp(CronTriggerConfiguration.cronMinutesGranularityPattern);
|
24
|
+
const isValidPattern = (Utils.required(this.pattern) &&
|
25
|
+
patternRegex.test(this.pattern));
|
26
|
+
const isValidZoneId = (this.zoneId === undefined) || this.isValidZoneId(this.zoneId);
|
27
|
+
const isoTimeRegex = new RegExp(CronTriggerConfiguration.isoTimeNoMillisPattern);
|
28
|
+
const isValidStartDateTime = ((this.startDateTime !== undefined) ?
|
29
|
+
isoTimeRegex.test(this.startDateTime) :
|
30
|
+
true);
|
31
|
+
const isValidEndDateTime = ((this.endDateTime !== undefined) ?
|
32
|
+
isoTimeRegex.test(this.endDateTime) :
|
33
|
+
true);
|
34
|
+
let isValidExecutionRangeDateTime = true;
|
35
|
+
if (this.startDateTime !== undefined && this.endDateTime !== undefined) {
|
36
|
+
const startDate = LocalDateTime.parse(this.startDateTime);
|
37
|
+
const endDate = LocalDateTime.parse(this.endDateTime);
|
38
|
+
isValidExecutionRangeDateTime = endDate.isAfter(startDate);
|
39
|
+
}
|
40
|
+
if (!isValidPattern)
|
41
|
+
this.errorFields.push(prefix + '.' + this.fieldNames.pattern);
|
42
|
+
if (!isValidZoneId)
|
43
|
+
this.errorFields.push(prefix + '.' + this.fieldNames.zoneId);
|
44
|
+
if (!isValidStartDateTime)
|
45
|
+
this.errorFields.push(prefix + '.' + this.fieldNames.startDateTime);
|
46
|
+
if (!isValidEndDateTime)
|
47
|
+
this.errorFields.push(prefix + '.' + this.fieldNames.endDateTime);
|
48
|
+
if (!isValidExecutionRangeDateTime)
|
49
|
+
this.errorFields.push(prefix + '.' + this.fieldNames.startDateTime, prefix + '.' + this.fieldNames.endDateTime);
|
50
|
+
return [
|
51
|
+
(isValidPattern &&
|
52
|
+
isValidZoneId &&
|
53
|
+
isValidStartDateTime &&
|
54
|
+
isValidEndDateTime &&
|
55
|
+
isValidExecutionRangeDateTime),
|
56
|
+
this.errorFields,
|
57
|
+
];
|
58
|
+
}
|
59
|
+
isValidZoneId(zoneId) {
|
60
|
+
const availableZoneIds = ZoneId.getAvailableZoneIds();
|
61
|
+
const isValidZoneId = availableZoneIds.includes(zoneId);
|
62
|
+
return isValidZoneId;
|
63
|
+
}
|
64
|
+
}
|
65
|
+
//# sourceMappingURL=configurationCronTrigger.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"configurationCronTrigger.js","sourceRoot":"","sources":["../../../src/configuration/triggers/configurationCronTrigger.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
/**
|
2
|
+
*
|
3
|
+
*/
|
4
|
+
export declare class PingTriggerConfiguration {
|
5
|
+
host: string;
|
6
|
+
failureRetryCount: number;
|
7
|
+
isDisabled: boolean;
|
8
|
+
private errorFields;
|
9
|
+
readonly fieldNames: { [P in keyof this]?: P | undefined; };
|
10
|
+
isValid(prefix: string): [boolean, string[]];
|
11
|
+
}
|
@@ -0,0 +1,26 @@
|
|
1
|
+
/* eslint-disable curly */
|
2
|
+
import { Utils } from '../../utils.js';
|
3
|
+
/**
|
4
|
+
*
|
5
|
+
*/
|
6
|
+
export class PingTriggerConfiguration {
|
7
|
+
host;
|
8
|
+
failureRetryCount;
|
9
|
+
isDisabled = false;
|
10
|
+
errorFields = [];
|
11
|
+
fieldNames = Utils.proxiedPropertiesOf(this);
|
12
|
+
isValid(prefix) {
|
13
|
+
const isValidHost = (Utils.required(this.host));
|
14
|
+
const isValidFailureRetryCount = (Utils.required(this.failureRetryCount));
|
15
|
+
if (!isValidHost)
|
16
|
+
this.errorFields.push(prefix + '.' + this.fieldNames.host);
|
17
|
+
if (!isValidFailureRetryCount)
|
18
|
+
this.errorFields.push(prefix + '.' + this.fieldNames.failureRetryCount);
|
19
|
+
return [
|
20
|
+
(isValidHost &&
|
21
|
+
isValidFailureRetryCount),
|
22
|
+
this.errorFields,
|
23
|
+
];
|
24
|
+
}
|
25
|
+
}
|
26
|
+
//# sourceMappingURL=configurationPingTrigger.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"configurationPingTrigger.js","sourceRoot":"","sources":["../../../src/configuration/triggers/configurationPingTrigger.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAE1B,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC;;GAEG;AACH,MAAM,OAAO,wBAAwB;IACnC,IAAI,CAAU;IACd,iBAAiB,CAAU;IAC3B,UAAU,GAAY,KAAK,CAAC;IAEpB,WAAW,GAAa,EAAE,CAAC;IAE1B,UAAU,GAAG,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAEtD,OAAO,CAAC,MAAc;QACpB,MAAM,WAAW,GAAY,CAC3B,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAC1B,CAAC;QAEF,MAAM,wBAAwB,GAAY,CACxC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CACvC,CAAC;QAEF,IAAI,CAAC,WAAW;YAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,IAAK,CAAC,CAAC;QAC9E,IAAI,CAAC,wBAAwB;YAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,iBAAkB,CAAC,CAAC;QAExG,OAAO;YACL,CAAC,WAAW;gBACV,wBAAwB,CAAC;YAC3B,IAAI,CAAC,WAAW;SACjB,CAAC;IACJ,CAAC;CACF"}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
import '@js-joda/timezone';
|
2
|
+
/**
|
3
|
+
*
|
4
|
+
*/
|
5
|
+
export declare class SunEventsTriggerConfiguration {
|
6
|
+
event: string;
|
7
|
+
offset: number;
|
8
|
+
latitude: string;
|
9
|
+
longitude: string;
|
10
|
+
zoneId: string;
|
11
|
+
isDisabled: boolean;
|
12
|
+
private static latitudePattern;
|
13
|
+
private static longitudePattern;
|
14
|
+
private errorFields;
|
15
|
+
readonly fieldNames: { [P in keyof this]?: P | undefined; };
|
16
|
+
isValid(prefix: string): [boolean, string[]];
|
17
|
+
private isValidZoneId;
|
18
|
+
}
|
@@ -0,0 +1,52 @@
|
|
1
|
+
/* eslint-disable curly */
|
2
|
+
import { SunEvent } from '../configurationSchema.js';
|
3
|
+
import { Utils } from '../../utils.js';
|
4
|
+
import { ZoneId } from '@js-joda/core';
|
5
|
+
import '@js-joda/timezone';
|
6
|
+
/**
|
7
|
+
*
|
8
|
+
*/
|
9
|
+
export class SunEventsTriggerConfiguration {
|
10
|
+
event;
|
11
|
+
offset = 0;
|
12
|
+
latitude;
|
13
|
+
longitude;
|
14
|
+
zoneId;
|
15
|
+
isDisabled = false;
|
16
|
+
static latitudePattern = '^[-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?)$';
|
17
|
+
static longitudePattern = '^[-+]?(180(\\.0+)?|((1[0-7]\\d)|([1-9]?\\d))(\\.\\d+)?)$';
|
18
|
+
errorFields = [];
|
19
|
+
fieldNames = Utils.proxiedPropertiesOf(this);
|
20
|
+
isValid(prefix) {
|
21
|
+
const isValidEvent = (Utils.required(this.event) &&
|
22
|
+
SunEvent.Events.includes(this.event));
|
23
|
+
const latitudeRegex = new RegExp(SunEventsTriggerConfiguration.latitudePattern);
|
24
|
+
const isValidLatitude = (Utils.required(this.latitude) &&
|
25
|
+
latitudeRegex.test(this.latitude));
|
26
|
+
const longitudeRegex = new RegExp(SunEventsTriggerConfiguration.longitudePattern);
|
27
|
+
const isValidLongitude = (Utils.required(this.longitude) &&
|
28
|
+
longitudeRegex.test(this.longitude));
|
29
|
+
const isValidZoneId = (this.zoneId === undefined) || this.isValidZoneId(this.zoneId);
|
30
|
+
if (!isValidEvent)
|
31
|
+
this.errorFields.push(prefix + '.' + this.fieldNames.event);
|
32
|
+
if (!isValidLatitude)
|
33
|
+
this.errorFields.push(prefix + '.' + this.fieldNames.latitude);
|
34
|
+
if (!isValidLongitude)
|
35
|
+
this.errorFields.push(prefix + '.' + this.fieldNames.longitude);
|
36
|
+
if (!isValidZoneId)
|
37
|
+
this.errorFields.push(prefix + '.' + this.fieldNames.zoneId);
|
38
|
+
return [
|
39
|
+
(isValidEvent &&
|
40
|
+
isValidLatitude &&
|
41
|
+
isValidLongitude &&
|
42
|
+
isValidZoneId),
|
43
|
+
this.errorFields,
|
44
|
+
];
|
45
|
+
}
|
46
|
+
isValidZoneId(zoneId) {
|
47
|
+
const availableZoneIds = ZoneId.getAvailableZoneIds();
|
48
|
+
const isValidZoneId = availableZoneIds.includes(zoneId);
|
49
|
+
return isValidZoneId;
|
50
|
+
}
|
51
|
+
}
|
52
|
+
//# sourceMappingURL=configurationSunEventsTrigger.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"configurationSunEventsTrigger.js","sourceRoot":"","sources":["../../../src/configuration/triggers/configurationSunEventsTrigger.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAE1B,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,mBAAmB,CAAC;AAE3B;;GAEG;AACH,MAAM,OAAO,6BAA6B;IACxC,KAAK,CAAU;IACf,MAAM,GAAW,CAAC,CAAC;IACnB,QAAQ,CAAU;IAClB,SAAS,CAAU;IACnB,MAAM,CAAU;IAChB,UAAU,GAAY,KAAK,CAAC;IAEpB,MAAM,CAAC,eAAe,GAAG,yCAAyC,CAAC;IACnE,MAAM,CAAC,gBAAgB,GAAG,0DAA0D,CAAC;IAErF,WAAW,GAAa,EAAE,CAAC;IAE1B,UAAU,GAAG,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAEtD,OAAO,CAAC,MAAc;QACpB,MAAM,YAAY,GAAG,CACnB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;YAC1B,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CACrC,CAAC;QAEF,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,6BAA6B,CAAC,eAAe,CAAC,CAAC;QAChF,MAAM,eAAe,GAAY,CAC/B,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC7B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAClC,CAAC;QAEF,MAAM,cAAc,GAAG,IAAI,MAAM,CAAC,6BAA6B,CAAC,gBAAgB,CAAC,CAAC;QAClF,MAAM,gBAAgB,GAAY,CAChC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;YAC9B,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CACpC,CAAC;QAEF,MAAM,aAAa,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAErF,IAAI,CAAC,YAAY;YAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,KAAM,CAAC,CAAC;QAChF,IAAI,CAAC,eAAe;YAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,QAAS,CAAC,CAAC;QACtF,IAAI,CAAC,gBAAgB;YAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,SAAU,CAAC,CAAC;QACxF,IAAI,CAAC,aAAa;YAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,MAAO,CAAC,CAAC;QAElF,OAAO;YACL,CAAC,YAAY;gBACX,eAAe;gBACf,gBAAgB;gBAChB,aAAa,CAAC;YAChB,IAAI,CAAC,WAAW;SACjB,CAAC;IACJ,CAAC;IAEO,aAAa,CAAC,MAAc;QAClC,MAAM,gBAAgB,GAAa,MAAM,CAAC,mBAAmB,EAAE,CAAC;QAEhE,MAAM,aAAa,GAAY,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAEjE,OAAO,aAAa,CAAC;IACvB,CAAC"}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import { Utils } from '../../utils.js';
|
2
|
+
/**
|
3
|
+
*
|
4
|
+
*/
|
5
|
+
export class WebhookTriggerConfiguration {
|
6
|
+
isDisabled = false;
|
7
|
+
errorFields = [];
|
8
|
+
fieldNames = Utils.proxiedPropertiesOf(this);
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
10
|
+
isValid(prefix) {
|
11
|
+
return [
|
12
|
+
(true),
|
13
|
+
this.errorFields,
|
14
|
+
];
|
15
|
+
}
|
16
|
+
}
|
17
|
+
//# sourceMappingURL=configurationWebhookTriggerConfiguration.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"configurationWebhookTriggerConfiguration.js","sourceRoot":"","sources":["../../../src/configuration/triggers/configurationWebhookTriggerConfiguration.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC;;GAEG;AACH,MAAM,OAAO,2BAA2B;IACtC,UAAU,GAAY,KAAK,CAAC;IAEpB,WAAW,GAAa,EAAE,CAAC;IAE1B,UAAU,GAAG,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAEtD,6DAA6D;IAC7D,OAAO,CAAC,MAAc;QACpB,OAAO;YACL,CAAC,IAAI,CAAC;YACN,IAAI,CAAC,WAAW;SACjB,CAAC;IACJ,CAAC;CACF"}
|
package/dist/errors.d.ts
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
/**
|
2
|
+
* Custom errors
|
3
|
+
*/
|
4
|
+
export declare class NotCompanionError extends Error {
|
5
|
+
constructor(message: string);
|
6
|
+
}
|
7
|
+
export declare class AccessoryNotAllowedError extends Error {
|
8
|
+
constructor(message: string);
|
9
|
+
}
|
10
|
+
export declare class TriggerNotAllowedError extends Error {
|
11
|
+
constructor(message: string);
|
12
|
+
}
|
13
|
+
export declare class SensorValueUpdateNotAllowed extends Error {
|
14
|
+
constructor(message: string);
|
15
|
+
}
|
16
|
+
export declare class InvalidSensorValue extends Error {
|
17
|
+
constructor(message: string);
|
18
|
+
}
|
19
|
+
export declare class InvalidSensorValueType extends Error {
|
20
|
+
constructor(message: string);
|
21
|
+
}
|
22
|
+
export declare class ObstructionValueUpdateNotAllowed extends Error {
|
23
|
+
constructor(message: string);
|
24
|
+
}
|
25
|
+
export declare class InvalidObstructionValueType extends Error {
|
26
|
+
constructor(message: string);
|
27
|
+
}
|
package/dist/errors.js
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
/**
|
2
|
+
* Custom errors
|
3
|
+
*/
|
4
|
+
export class NotCompanionError extends Error {
|
5
|
+
constructor(message) {
|
6
|
+
super();
|
7
|
+
this.message = message;
|
8
|
+
}
|
9
|
+
}
|
10
|
+
export class AccessoryNotAllowedError extends Error {
|
11
|
+
constructor(message) {
|
12
|
+
super();
|
13
|
+
this.message = message;
|
14
|
+
}
|
15
|
+
}
|
16
|
+
export class TriggerNotAllowedError extends Error {
|
17
|
+
constructor(message) {
|
18
|
+
super();
|
19
|
+
this.message = message;
|
20
|
+
}
|
21
|
+
}
|
22
|
+
export class SensorValueUpdateNotAllowed extends Error {
|
23
|
+
constructor(message) {
|
24
|
+
super();
|
25
|
+
this.message = message;
|
26
|
+
}
|
27
|
+
}
|
28
|
+
export class InvalidSensorValue extends Error {
|
29
|
+
constructor(message) {
|
30
|
+
super();
|
31
|
+
this.message = message;
|
32
|
+
}
|
33
|
+
}
|
34
|
+
export class InvalidSensorValueType extends Error {
|
35
|
+
constructor(message) {
|
36
|
+
super();
|
37
|
+
this.message = message;
|
38
|
+
}
|
39
|
+
}
|
40
|
+
export class ObstructionValueUpdateNotAllowed extends Error {
|
41
|
+
constructor(message) {
|
42
|
+
super();
|
43
|
+
this.message = message;
|
44
|
+
}
|
45
|
+
}
|
46
|
+
export class InvalidObstructionValueType extends Error {
|
47
|
+
constructor(message) {
|
48
|
+
super();
|
49
|
+
this.message = message;
|
50
|
+
}
|
51
|
+
}
|
52
|
+
//# sourceMappingURL=errors.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAE1C,YACE,OAAe;QAEf,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IAEjD,YACE,OAAe;QAEf,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAE/C,YACE,OAAe;QAEf,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,2BAA4B,SAAQ,KAAK;IAEpD,YACE,OAAe;QAEf,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAE3C,YACE,OAAe;QAEf,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAE/C,YACE,OAAe;QAEf,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,gCAAiC,SAAQ,KAAK;IAEzD,YACE,OAAe;QAEf,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,2BAA4B,SAAQ,KAAK;IAEpD,YACE,OAAe;QAEf,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
import { VirtualAccessoriesPlatform } from './platform.js';
|
2
|
+
import { PLATFORM_NAME } from './settings.js';
|
3
|
+
/**
|
4
|
+
* This method registers the platform with Homebridge
|
5
|
+
*/
|
6
|
+
export default (api) => {
|
7
|
+
api.registerPlatform(PLATFORM_NAME, VirtualAccessoriesPlatform);
|
8
|
+
};
|
9
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C;;GAEG;AACH,eAAe,CAAC,GAAQ,EAAE,EAAE;IAC1B,GAAG,CAAC,gBAAgB,CAAC,aAAa,EAAE,0BAA0B,CAAC,CAAC;AAClE,CAAC,CAAC"}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
import type { API, Characteristic, DynamicPlatformPlugin, Logging, PlatformAccessory, PlatformConfig, Service } from 'homebridge';
|
2
|
+
import { VirtualAccessoriesLogger } from './virtualLogger.js';
|
3
|
+
/**
|
4
|
+
* HomebridgePlatform
|
5
|
+
*/
|
6
|
+
export declare class VirtualAccessoriesPlatform implements DynamicPlatformPlugin {
|
7
|
+
readonly config: PlatformConfig;
|
8
|
+
readonly api: API;
|
9
|
+
static platformName: string;
|
10
|
+
readonly Service: typeof Service;
|
11
|
+
readonly Characteristic: typeof Characteristic;
|
12
|
+
readonly log: VirtualAccessoriesLogger;
|
13
|
+
private readonly sensorUpdateServer?;
|
14
|
+
readonly accessories: PlatformAccessory[];
|
15
|
+
version: string;
|
16
|
+
constructor(log: Logging, config: PlatformConfig, api: API);
|
17
|
+
/**
|
18
|
+
* This function is invoked when homebridge restores cached accessories from disk at startup.
|
19
|
+
* It should be used to set up event handlers for characteristics and update respective values.
|
20
|
+
*/
|
21
|
+
configureAccessory(accessory: PlatformAccessory): void;
|
22
|
+
/**
|
23
|
+
* Accessories must only be registered once, previously created accessories
|
24
|
+
* must not be registered again to prevent "duplicate UUID" errors.
|
25
|
+
*/
|
26
|
+
discoverDevices(): void;
|
27
|
+
private deserializeConfiguredAccessories;
|
28
|
+
}
|
package/dist/platform.js
ADDED
@@ -0,0 +1,221 @@
|
|
1
|
+
import { AccessoryFactory } from './accessoryFactory.js';
|
2
|
+
import { Configuration } from './configuration/configuration.js';
|
3
|
+
import { PLATFORM_NAME, PLUGIN_NAME } from './settings.js';
|
4
|
+
import { SensorUpdateServer } from './sensorServer.js';
|
5
|
+
import { VirtualAccessoriesLogger } from './virtualLogger.js';
|
6
|
+
import * as path from 'path';
|
7
|
+
import fs from 'fs';
|
8
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
9
|
+
// @ts-ignore <-- TODO remove this line, unless that gives an error
|
10
|
+
import packageInfo from '../package.json' with { type: 'json' };
|
11
|
+
/**
|
12
|
+
* HomebridgePlatform
|
13
|
+
*/
|
14
|
+
export class VirtualAccessoriesPlatform {
|
15
|
+
config;
|
16
|
+
api;
|
17
|
+
static platformName = 'Virtual Accessories Platform';
|
18
|
+
Service;
|
19
|
+
Characteristic;
|
20
|
+
log;
|
21
|
+
sensorUpdateServer;
|
22
|
+
// this is used to track restored cached accessories
|
23
|
+
accessories = [];
|
24
|
+
version = packageInfo.version;
|
25
|
+
constructor(log, config, api) {
|
26
|
+
this.config = config;
|
27
|
+
this.api = api;
|
28
|
+
this.Service = api.hap.Service;
|
29
|
+
this.Characteristic = api.hap.Characteristic;
|
30
|
+
this.log = new VirtualAccessoriesLogger(log);
|
31
|
+
// Validate platform name
|
32
|
+
const platformName = this.config.name;
|
33
|
+
if (platformName !== VirtualAccessoriesPlatform.platformName) {
|
34
|
+
this.log.error(`Platform Name is invalid: '${platformName}'`);
|
35
|
+
this.log.error(`Platform Name must be '${VirtualAccessoriesPlatform.platformName}'`);
|
36
|
+
}
|
37
|
+
else {
|
38
|
+
this.log.debug(`Platform Name is valid: '${platformName}'`);
|
39
|
+
}
|
40
|
+
// Create sensor server
|
41
|
+
const sensorServerConfig = new Configuration(this.log).deserializeSensorServerConfig(this.config.sensorServer);
|
42
|
+
if (sensorServerConfig?.enabled) {
|
43
|
+
const prefix = 'sensorServer';
|
44
|
+
let isValid = false;
|
45
|
+
let errorFields = [prefix];
|
46
|
+
[isValid, errorFields] = sensorServerConfig.isValid(prefix);
|
47
|
+
if (!isValid) {
|
48
|
+
this.log.error(`Sensor Server configuration is invalid: ${JSON.stringify(sensorServerConfig)}`);
|
49
|
+
this.log.error(`Invalid fields: ${errorFields.toString()}`);
|
50
|
+
}
|
51
|
+
else {
|
52
|
+
this.log.debug(`Sensor Server configuration is valid: ${JSON.stringify(sensorServerConfig)}`);
|
53
|
+
this.sensorUpdateServer = new SensorUpdateServer(this.log, parseInt(sensorServerConfig.port));
|
54
|
+
}
|
55
|
+
}
|
56
|
+
this.log.debug('Finished initializing platform');
|
57
|
+
// When this event is fired it means Homebridge has restored all cached accessories from disk.
|
58
|
+
// Dynamic Platform plugins should only register new accessories after this event was fired,
|
59
|
+
// in order to ensure they weren't added to homebridge already. This event can also be used
|
60
|
+
// to start discovery of new accessories.
|
61
|
+
this.api.on("didFinishLaunching" /* APIEvent.DID_FINISH_LAUNCHING */, () => {
|
62
|
+
log.debug('Executing didFinishLaunching callback');
|
63
|
+
// run the method to discover / register your devices as accessories
|
64
|
+
this.discoverDevices();
|
65
|
+
this.log.info(`Running Virtual Accessories For Homebridge v${this.version}`);
|
66
|
+
});
|
67
|
+
this.api.on("shutdown" /* APIEvent.SHUTDOWN */, () => {
|
68
|
+
log.debug('Executing shutdown callback');
|
69
|
+
this.sensorUpdateServer?.stop();
|
70
|
+
});
|
71
|
+
}
|
72
|
+
/**
|
73
|
+
* This function is invoked when homebridge restores cached accessories from disk at startup.
|
74
|
+
* It should be used to set up event handlers for characteristics and update respective values.
|
75
|
+
*/
|
76
|
+
configureAccessory(accessory) {
|
77
|
+
this.log.info(`Loading accessory from cache: ${accessory.displayName}`);
|
78
|
+
// add the restored accessory to the accessories cache, so we can track if it has already been registered
|
79
|
+
this.accessories.push(accessory);
|
80
|
+
}
|
81
|
+
/**
|
82
|
+
* Accessories must only be registered once, previously created accessories
|
83
|
+
* must not be registered again to prevent "duplicate UUID" errors.
|
84
|
+
*/
|
85
|
+
discoverDevices() {
|
86
|
+
let configuredDevices = this.config.devices;
|
87
|
+
if (configuredDevices === undefined) {
|
88
|
+
this.log.info('No configured accessories');
|
89
|
+
configuredDevices = JSON.parse('[]');
|
90
|
+
}
|
91
|
+
this.log.debug(`Found ${configuredDevices.length} configured accessories: ${JSON.stringify(configuredDevices)}`);
|
92
|
+
const configuredAccessories = this.deserializeConfiguredAccessories(configuredDevices);
|
93
|
+
this.log.debug(`Deserialized accessories: ${JSON.stringify(configuredAccessories)}`);
|
94
|
+
const virtualAccessories = [];
|
95
|
+
// loop over the discovered devices and register each one if it has not already been registered
|
96
|
+
for (const configuredAccessory of configuredAccessories) {
|
97
|
+
// generate a unique id for the accessory this should be generated from
|
98
|
+
// something globally unique, but constant, for example, the device serial
|
99
|
+
// number or MAC address
|
100
|
+
const uuid = this.api.hap.uuid.generate(configuredAccessory.accessoryID);
|
101
|
+
// see if an accessory with the same uuid has already been registered and restored from
|
102
|
+
// the cached devices we stored in the `configureAccessory` method above
|
103
|
+
const existingAccessory = this.accessories.find(accessory => accessory.UUID === uuid);
|
104
|
+
if (existingAccessory) {
|
105
|
+
// the accessory already exists
|
106
|
+
this.log.info(`Restoring existing accessory: ${configuredAccessory.accessoryName}`);
|
107
|
+
// update the device configuration in the `accessory.context`
|
108
|
+
existingAccessory.context.deviceConfiguration = configuredAccessory;
|
109
|
+
// if you need to update the accessory.context then you should run `api.updatePlatformAccessories`. e.g.:
|
110
|
+
// existingAccessory.context.device = device;
|
111
|
+
// this.api.updatePlatformAccessories([existingAccessory]);
|
112
|
+
// create the accessory handler for the restored accessory
|
113
|
+
// this is imported from `platformAccessory.ts`
|
114
|
+
const virtualAccessory = AccessoryFactory.createVirtualAccessory(this, existingAccessory, configuredAccessory.accessoryType);
|
115
|
+
if (virtualAccessory !== undefined) {
|
116
|
+
if (existingAccessory.displayName !== configuredAccessory.accessoryName) {
|
117
|
+
this.log.info(`Updating accessory name from ${existingAccessory.displayName} to ${configuredAccessory.accessoryName}`);
|
118
|
+
virtualAccessory.updateConfiguredName();
|
119
|
+
existingAccessory.updateDisplayName(configuredAccessory.accessoryName);
|
120
|
+
this.api.updatePlatformAccessories([existingAccessory]);
|
121
|
+
}
|
122
|
+
virtualAccessories.push(virtualAccessory);
|
123
|
+
}
|
124
|
+
else {
|
125
|
+
this.log.error(`Error restoring existing accessory: ${configuredAccessory.accessoryName}`);
|
126
|
+
}
|
127
|
+
}
|
128
|
+
else {
|
129
|
+
// the accessory does not yet exist, so we need to create it
|
130
|
+
this.log.info(`Adding new accessory: ${configuredAccessory.accessoryName}`);
|
131
|
+
// create a new accessory
|
132
|
+
const accessory = new this.api.platformAccessory(configuredAccessory.accessoryName, uuid, configuredAccessory.category);
|
133
|
+
// store a copy of the device configuration in the `accessory.context`
|
134
|
+
// the `context` property can be used to store any data about the accessory you may need
|
135
|
+
accessory.context.deviceConfiguration = configuredAccessory;
|
136
|
+
const storagePath = path.join(this.api.user.persistPath(), `VA4HB_${configuredAccessory.accessoryID}.json`);
|
137
|
+
accessory.context.storagePath = storagePath;
|
138
|
+
this.log.debug(`Storage path if stateful accessory: ${storagePath}`);
|
139
|
+
// create the accessory handler for the newly create accessory
|
140
|
+
// this is imported from `platformAccessory.ts`
|
141
|
+
const virtualAccessory = AccessoryFactory.createVirtualAccessory(this, accessory, configuredAccessory.accessoryType);
|
142
|
+
if (virtualAccessory === undefined) {
|
143
|
+
this.log.error(`Error adding new accessory: ${configuredAccessory.accessoryName}`);
|
144
|
+
}
|
145
|
+
else if (virtualAccessory.isExternalAccessory()) {
|
146
|
+
this.log.info(`Publishing new external accessory: ${configuredAccessory.accessoryName}`);
|
147
|
+
this.api.publishExternalAccessories(PLUGIN_NAME, [accessory]);
|
148
|
+
}
|
149
|
+
else {
|
150
|
+
// link the accessory to your platform
|
151
|
+
this.log.info(`Publishing new accessory: ${configuredAccessory.accessoryName}`);
|
152
|
+
this.api.registerPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [accessory]);
|
153
|
+
virtualAccessories.push(virtualAccessory);
|
154
|
+
}
|
155
|
+
}
|
156
|
+
// Cleanup config
|
157
|
+
// const configPath = api.user.configPath();
|
158
|
+
}
|
159
|
+
// loop over the cached accessories and unregister each one if it is not in the config
|
160
|
+
for (const accessory of this.accessories) {
|
161
|
+
const configuredDevice = configuredDevices.find(device => this.api.hap.uuid.generate(device.accessoryID) === accessory.UUID);
|
162
|
+
// If there is no configured device for this cached accessory
|
163
|
+
if (!configuredDevice) {
|
164
|
+
this.log.info(`Removing deleted accessory: ${accessory.displayName}`);
|
165
|
+
// Unregister the accessory from the platform
|
166
|
+
this.api.unregisterPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [accessory]);
|
167
|
+
// Delete any stateful info, if it exists
|
168
|
+
const storagePath = accessory.context.storagePath;
|
169
|
+
if (fs.existsSync(storagePath)) {
|
170
|
+
fs.unlink(storagePath, (err) => {
|
171
|
+
if (err) {
|
172
|
+
this.log.debug(`No stateful storage found for: ${accessory.displayName}`);
|
173
|
+
}
|
174
|
+
else {
|
175
|
+
this.log.debug(`Deleted stateful storage for: ${accessory.displayName}`);
|
176
|
+
}
|
177
|
+
});
|
178
|
+
}
|
179
|
+
}
|
180
|
+
}
|
181
|
+
// Start sensor server
|
182
|
+
// TODO: check configuration
|
183
|
+
this.sensorUpdateServer?.addAccessories(virtualAccessories);
|
184
|
+
this.sensorUpdateServer?.start();
|
185
|
+
}
|
186
|
+
deserializeConfiguredAccessories(configuredDevices) {
|
187
|
+
const accessoryConfigurations = [];
|
188
|
+
const accessoryUUIDs = [];
|
189
|
+
for (const configuredDevice of configuredDevices) {
|
190
|
+
// Deserialize accessory configuration
|
191
|
+
const configuration = new Configuration(this.log);
|
192
|
+
const accessoryConfiguration = configuration.deserializeAccessoryConfig(configuredDevice);
|
193
|
+
// Skip accessory if the configuration is invalid
|
194
|
+
if (accessoryConfiguration === undefined) {
|
195
|
+
this.log.error(`Error deserializing: ${JSON.stringify(configuredDevice)}`);
|
196
|
+
this.log.info('Skipping accessory until configuration is fixed');
|
197
|
+
}
|
198
|
+
else if (accessoryUUIDs.includes(accessoryConfiguration.accessoryID)) {
|
199
|
+
this.log.error(`Found accessory with duplicate ID: ${JSON.stringify(configuredDevice)}`);
|
200
|
+
this.log.info('Skipping accessory until configuration is fixed');
|
201
|
+
}
|
202
|
+
else {
|
203
|
+
this.log.debug(`Deserialized accessory: ${JSON.stringify(configuredDevice)}`);
|
204
|
+
let isValidAccessoryConfig = false;
|
205
|
+
let errorFields = [];
|
206
|
+
[isValidAccessoryConfig, errorFields] = accessoryConfiguration.isValid();
|
207
|
+
if (!isValidAccessoryConfig) {
|
208
|
+
this.log.error(`Skipping accessory. Configuration is invalid: ${JSON.stringify(accessoryConfiguration)}`);
|
209
|
+
this.log.error(`Invalid fields: ${errorFields.toString()}`);
|
210
|
+
}
|
211
|
+
else {
|
212
|
+
this.log.debug(`Configuration is valid: ${JSON.stringify(accessoryConfiguration)}`);
|
213
|
+
accessoryConfigurations.push(accessoryConfiguration);
|
214
|
+
accessoryUUIDs.push(accessoryConfiguration.accessoryID);
|
215
|
+
}
|
216
|
+
}
|
217
|
+
}
|
218
|
+
return accessoryConfigurations;
|
219
|
+
}
|
220
|
+
}
|
221
|
+
//# sourceMappingURL=platform.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,27 @@
|
|
1
|
+
import { Accessory } from './accessories/virtualAccessory.js';
|
2
|
+
import { VirtualAccessoriesLogger } from './virtualLogger.js';
|
3
|
+
/**
|
4
|
+
* Create server to accept sensor events
|
5
|
+
*/
|
6
|
+
export declare class SensorUpdateServer {
|
7
|
+
private static accessoryIdPattern;
|
8
|
+
private readonly accessories;
|
9
|
+
private readonly log;
|
10
|
+
private readonly serverName;
|
11
|
+
private server;
|
12
|
+
private httpServer?;
|
13
|
+
readonly port: number;
|
14
|
+
constructor(log: VirtualAccessoriesLogger, port: number);
|
15
|
+
start(): void;
|
16
|
+
stop(): void;
|
17
|
+
addAccessories(accessories: Accessory[]): void;
|
18
|
+
addAccessory(accessory: Accessory): void;
|
19
|
+
removeAccessory(accessory: Accessory): boolean;
|
20
|
+
getAccessories(): Accessory[];
|
21
|
+
private accessoryIdIsValid;
|
22
|
+
private humidityIsValid;
|
23
|
+
private temperatureIsValid;
|
24
|
+
private obstructionIsValid;
|
25
|
+
private triggerIsValid;
|
26
|
+
private processRequest;
|
27
|
+
}
|