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,45 @@
|
|
1
|
+
import { Sensor } from './virtualSensor.js';
|
2
|
+
/**
|
3
|
+
* Platform Accessory
|
4
|
+
* An instance of this class is created for each accessory your platform registers
|
5
|
+
* Each accessory may expose multiple services of different service types.
|
6
|
+
*/
|
7
|
+
export class LeakSensor extends Sensor {
|
8
|
+
static ACCESSORY_TYPE_NAME = 'LeakSensor';
|
9
|
+
static LEAK_NOT_DETECTED = 0; // Characteristic.LeakDetected.LEAK_NOT_DETECTED;
|
10
|
+
static LEAK_DETECTED = 1; // Characteristic.LeakDetected.LEAK_DETECTED;
|
11
|
+
constructor(platform, accessory) {
|
12
|
+
super(platform, accessory);
|
13
|
+
}
|
14
|
+
getService() {
|
15
|
+
return this.platform.Service.LeakSensor;
|
16
|
+
}
|
17
|
+
getEventDetectedCharacteristic() {
|
18
|
+
return this.platform.Characteristic.LeakDetected;
|
19
|
+
}
|
20
|
+
getStateName(state) {
|
21
|
+
let sensorStateName;
|
22
|
+
switch (state) {
|
23
|
+
case undefined: {
|
24
|
+
sensorStateName = 'undefined';
|
25
|
+
break;
|
26
|
+
}
|
27
|
+
case LeakSensor.LEAK_NOT_DETECTED: {
|
28
|
+
sensorStateName = Sensor.NORMAL_INACTIVE;
|
29
|
+
break;
|
30
|
+
}
|
31
|
+
case LeakSensor.LEAK_DETECTED: {
|
32
|
+
sensorStateName = Sensor.TRIGGERED_ACTIVE;
|
33
|
+
break;
|
34
|
+
}
|
35
|
+
default: {
|
36
|
+
sensorStateName = state.toString();
|
37
|
+
}
|
38
|
+
}
|
39
|
+
return sensorStateName;
|
40
|
+
}
|
41
|
+
getAccessoryTypeName() {
|
42
|
+
return LeakSensor.ACCESSORY_TYPE_NAME;
|
43
|
+
}
|
44
|
+
}
|
45
|
+
//# sourceMappingURL=virtualSensorLeak.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"virtualSensorLeak.js","sourceRoot":"","sources":["../../src/sensors/virtualSensorLeak.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C;;;;GAIG;AACH,MAAM,OAAO,UAAW,SAAQ,MAAM;IAEpC,MAAM,CAAU,mBAAmB,GAAW,YAAY,CAAC;IAE3D,MAAM,CAAU,iBAAiB,GAAW,CAAC,CAAC,CAAE,iDAAiD;IACjG,MAAM,CAAU,aAAa,GAAW,CAAC,CAAC,CAAM,6CAA6C;IAE7F,YACE,QAAoC,EACpC,SAA4B;QAE5B,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC7B,CAAC;IAES,UAAU;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC;IAC1C,CAAC;IAES,8BAA8B;QACtC,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAC;IACnD,CAAC;IAES,YAAY,CAAC,KAAa;QAClC,IAAI,eAAuB,CAAC;QAE5B,QAAQ,KAAK,EAAE,CAAC;YAChB,KAAK,SAAS,CAAC,CAAC,CAAC;gBAAC,eAAe,GAAG,WAAW,CAAC;gBAAC,MAAM;YAAC,CAAC;YACzD,KAAK,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;gBAAC,MAAM;YAAC,CAAC;YACvF,KAAK,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;gBAAC,eAAe,GAAG,MAAM,CAAC,gBAAgB,CAAC;gBAAC,MAAM;YAAC,CAAC;YACpF,OAAO,CAAC,CAAC,CAAC;gBAAC,eAAe,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YAAA,CAAC;QAC/C,CAAC;QAED,OAAO,eAAe,CAAC;IACzB,CAAC;IAES,oBAAoB;QAC5B,OAAO,UAAU,CAAC,mBAAmB,CAAC;IACxC,CAAC"}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
import type { Characteristic, PlatformAccessory, Service, WithUUID } from 'homebridge';
|
2
|
+
import { VirtualAccessoriesPlatform } from '../platform.js';
|
3
|
+
import { Sensor } from './virtualSensor.js';
|
4
|
+
/**
|
5
|
+
* Platform Accessory
|
6
|
+
* An instance of this class is created for each accessory your platform registers
|
7
|
+
* Each accessory may expose multiple services of different service types.
|
8
|
+
*/
|
9
|
+
export declare class MotionSensor extends Sensor {
|
10
|
+
static readonly ACCESSORY_TYPE_NAME: string;
|
11
|
+
static readonly MOTION_NOT_DETECTED: number;
|
12
|
+
static readonly MOTION_DETECTED: number;
|
13
|
+
constructor(platform: VirtualAccessoriesPlatform, accessory: PlatformAccessory);
|
14
|
+
protected getService(): WithUUID<typeof Service>;
|
15
|
+
protected getEventDetectedCharacteristic(): WithUUID<{
|
16
|
+
new (): Characteristic;
|
17
|
+
}>;
|
18
|
+
protected getStateName(state: number): string;
|
19
|
+
protected getAccessoryTypeName(): string;
|
20
|
+
}
|
@@ -0,0 +1,45 @@
|
|
1
|
+
import { Sensor } from './virtualSensor.js';
|
2
|
+
/**
|
3
|
+
* Platform Accessory
|
4
|
+
* An instance of this class is created for each accessory your platform registers
|
5
|
+
* Each accessory may expose multiple services of different service types.
|
6
|
+
*/
|
7
|
+
export class MotionSensor extends Sensor {
|
8
|
+
static ACCESSORY_TYPE_NAME = 'MotionSensor';
|
9
|
+
static MOTION_NOT_DETECTED = 0; // No Charteristic exists for Motion sensor. Modeled on other sensors
|
10
|
+
static MOTION_DETECTED = 1; // No Charteristic exists for Motion sensor. Modeled on other sensors
|
11
|
+
constructor(platform, accessory) {
|
12
|
+
super(platform, accessory);
|
13
|
+
}
|
14
|
+
getService() {
|
15
|
+
return this.platform.Service.MotionSensor;
|
16
|
+
}
|
17
|
+
getEventDetectedCharacteristic() {
|
18
|
+
return this.platform.Characteristic.MotionDetected;
|
19
|
+
}
|
20
|
+
getStateName(state) {
|
21
|
+
let sensorStateName;
|
22
|
+
switch (state) {
|
23
|
+
case undefined: {
|
24
|
+
sensorStateName = 'undefined';
|
25
|
+
break;
|
26
|
+
}
|
27
|
+
case MotionSensor.MOTION_NOT_DETECTED: {
|
28
|
+
sensorStateName = Sensor.NORMAL_INACTIVE;
|
29
|
+
break;
|
30
|
+
}
|
31
|
+
case MotionSensor.MOTION_DETECTED: {
|
32
|
+
sensorStateName = Sensor.TRIGGERED_ACTIVE;
|
33
|
+
break;
|
34
|
+
}
|
35
|
+
default: {
|
36
|
+
sensorStateName = state.toString();
|
37
|
+
}
|
38
|
+
}
|
39
|
+
return sensorStateName;
|
40
|
+
}
|
41
|
+
getAccessoryTypeName() {
|
42
|
+
return MotionSensor.ACCESSORY_TYPE_NAME;
|
43
|
+
}
|
44
|
+
}
|
45
|
+
//# sourceMappingURL=virtualSensorMotion.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"virtualSensorMotion.js","sourceRoot":"","sources":["../../src/sensors/virtualSensorMotion.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C;;;;GAIG;AACH,MAAM,OAAO,YAAa,SAAQ,MAAM;IAEtC,MAAM,CAAU,mBAAmB,GAAW,cAAc,CAAC;IAE7D,MAAM,CAAU,mBAAmB,GAAW,CAAC,CAAC,CAAE,qEAAqE;IACvH,MAAM,CAAU,eAAe,GAAW,CAAC,CAAC,CAAM,qEAAqE;IAEvH,YACE,QAAoC,EACpC,SAA4B;QAE5B,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC7B,CAAC;IAES,UAAU;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC;IAC5C,CAAC;IAES,8BAA8B;QACtC,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC;IACrD,CAAC;IAES,YAAY,CAAC,KAAa;QAClC,IAAI,eAAuB,CAAC;QAE5B,QAAQ,KAAK,EAAE,CAAC;YAChB,KAAK,SAAS,CAAC,CAAC,CAAC;gBAAC,eAAe,GAAG,WAAW,CAAC;gBAAC,MAAM;YAAC,CAAC;YACzD,KAAK,YAAY,CAAC,mBAAmB,CAAC,CAAC,CAAC;gBAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;gBAAC,MAAM;YAAC,CAAC;YAC3F,KAAK,YAAY,CAAC,eAAe,CAAC,CAAC,CAAC;gBAAC,eAAe,GAAG,MAAM,CAAC,gBAAgB,CAAC;gBAAC,MAAM;YAAC,CAAC;YACxF,OAAO,CAAC,CAAC,CAAC;gBAAC,eAAe,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YAAA,CAAC;QAC/C,CAAC;QAED,OAAO,eAAe,CAAC;IACzB,CAAC;IAES,oBAAoB;QAC5B,OAAO,YAAY,CAAC,mBAAmB,CAAC;IAC1C,CAAC"}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
import type { Characteristic, PlatformAccessory, Service, WithUUID } from 'homebridge';
|
2
|
+
import { VirtualAccessoriesPlatform } from '../platform.js';
|
3
|
+
import { Sensor } from './virtualSensor.js';
|
4
|
+
/**
|
5
|
+
* Platform Accessory
|
6
|
+
* An instance of this class is created for each accessory your platform registers
|
7
|
+
* Each accessory may expose multiple services of different service types.
|
8
|
+
*/
|
9
|
+
export declare class OccupancySensor extends Sensor {
|
10
|
+
static readonly ACCESSORY_TYPE_NAME: string;
|
11
|
+
static readonly OCCUPANCY_NOT_DETECTED: number;
|
12
|
+
static readonly OCCUPANCY_DETECTED: number;
|
13
|
+
constructor(platform: VirtualAccessoriesPlatform, accessory: PlatformAccessory);
|
14
|
+
protected getService(): WithUUID<typeof Service>;
|
15
|
+
protected getEventDetectedCharacteristic(): WithUUID<{
|
16
|
+
new (): Characteristic;
|
17
|
+
}>;
|
18
|
+
protected getStateName(state: number): string;
|
19
|
+
protected getAccessoryTypeName(): string;
|
20
|
+
}
|
@@ -0,0 +1,45 @@
|
|
1
|
+
import { Sensor } from './virtualSensor.js';
|
2
|
+
/**
|
3
|
+
* Platform Accessory
|
4
|
+
* An instance of this class is created for each accessory your platform registers
|
5
|
+
* Each accessory may expose multiple services of different service types.
|
6
|
+
*/
|
7
|
+
export class OccupancySensor extends Sensor {
|
8
|
+
static ACCESSORY_TYPE_NAME = 'OccupancySensor';
|
9
|
+
static OCCUPANCY_NOT_DETECTED = 0; // Characteristic.OccupancyDetected.OCCUPANCY_NOT_DETECTED;
|
10
|
+
static OCCUPANCY_DETECTED = 1; // Characteristic.OccupancyDetected.OCCUPANCY_DETECTED;
|
11
|
+
constructor(platform, accessory) {
|
12
|
+
super(platform, accessory);
|
13
|
+
}
|
14
|
+
getService() {
|
15
|
+
return this.platform.Service.OccupancySensor;
|
16
|
+
}
|
17
|
+
getEventDetectedCharacteristic() {
|
18
|
+
return this.platform.Characteristic.OccupancyDetected;
|
19
|
+
}
|
20
|
+
getStateName(state) {
|
21
|
+
let sensorStateName;
|
22
|
+
switch (state) {
|
23
|
+
case undefined: {
|
24
|
+
sensorStateName = 'undefined';
|
25
|
+
break;
|
26
|
+
}
|
27
|
+
case OccupancySensor.OCCUPANCY_NOT_DETECTED: {
|
28
|
+
sensorStateName = Sensor.NORMAL_INACTIVE;
|
29
|
+
break;
|
30
|
+
}
|
31
|
+
case OccupancySensor.OCCUPANCY_DETECTED: {
|
32
|
+
sensorStateName = Sensor.TRIGGERED_ACTIVE;
|
33
|
+
break;
|
34
|
+
}
|
35
|
+
default: {
|
36
|
+
sensorStateName = state.toString();
|
37
|
+
}
|
38
|
+
}
|
39
|
+
return sensorStateName;
|
40
|
+
}
|
41
|
+
getAccessoryTypeName() {
|
42
|
+
return OccupancySensor.ACCESSORY_TYPE_NAME;
|
43
|
+
}
|
44
|
+
}
|
45
|
+
//# sourceMappingURL=virtualSensorOccupancy.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"virtualSensorOccupancy.js","sourceRoot":"","sources":["../../src/sensors/virtualSensorOccupancy.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C;;;;GAIG;AACH,MAAM,OAAO,eAAgB,SAAQ,MAAM;IAEzC,MAAM,CAAU,mBAAmB,GAAW,iBAAiB,CAAC;IAEhE,MAAM,CAAU,sBAAsB,GAAW,CAAC,CAAC,CAAG,2DAA2D;IACjH,MAAM,CAAU,kBAAkB,GAAW,CAAC,CAAC,CAAO,uDAAuD;IAE7G,YACE,QAAoC,EACpC,SAA4B;QAE5B,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC7B,CAAC;IAES,UAAU;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC;IAC/C,CAAC;IAES,8BAA8B;QACtC,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC;IACxD,CAAC;IAES,YAAY,CAAC,KAAa;QAClC,IAAI,eAAuB,CAAC;QAE5B,QAAQ,KAAK,EAAE,CAAC;YAChB,KAAK,SAAS,CAAC,CAAC,CAAC;gBAAC,eAAe,GAAG,WAAW,CAAC;gBAAC,MAAM;YAAC,CAAC;YACzD,KAAK,eAAe,CAAC,sBAAsB,CAAC,CAAC,CAAC;gBAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;gBAAC,MAAM;YAAC,CAAC;YACjG,KAAK,eAAe,CAAC,kBAAkB,CAAC,CAAC,CAAC;gBAAC,eAAe,GAAG,MAAM,CAAC,gBAAgB,CAAC;gBAAC,MAAM;YAAC,CAAC;YAC9F,OAAO,CAAC,CAAC,CAAC;gBAAC,eAAe,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YAAA,CAAC;QAC/C,CAAC;QAED,OAAO,eAAe,CAAC;IACzB,CAAC;IAES,oBAAoB;QAC5B,OAAO,eAAe,CAAC,mBAAmB,CAAC;IAC7C,CAAC"}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
import type { Characteristic, PlatformAccessory, Service, WithUUID } from 'homebridge';
|
2
|
+
import { VirtualAccessoriesPlatform } from '../platform.js';
|
3
|
+
import { Sensor } from './virtualSensor.js';
|
4
|
+
/**
|
5
|
+
* Platform Accessory
|
6
|
+
* An instance of this class is created for each accessory your platform registers
|
7
|
+
* Each accessory may expose multiple services of different service types.
|
8
|
+
*/
|
9
|
+
export declare class SmokeSensor extends Sensor {
|
10
|
+
static readonly ACCESSORY_TYPE_NAME: string;
|
11
|
+
static readonly SMOKE_NOT_DETECTED: number;
|
12
|
+
static readonly SMOKE_DETECTED: number;
|
13
|
+
constructor(platform: VirtualAccessoriesPlatform, accessory: PlatformAccessory);
|
14
|
+
protected getService(): WithUUID<typeof Service>;
|
15
|
+
protected getEventDetectedCharacteristic(): WithUUID<{
|
16
|
+
new (): Characteristic;
|
17
|
+
}>;
|
18
|
+
protected getStateName(state: number): string;
|
19
|
+
protected getAccessoryTypeName(): string;
|
20
|
+
}
|
@@ -0,0 +1,45 @@
|
|
1
|
+
import { Sensor } from './virtualSensor.js';
|
2
|
+
/**
|
3
|
+
* Platform Accessory
|
4
|
+
* An instance of this class is created for each accessory your platform registers
|
5
|
+
* Each accessory may expose multiple services of different service types.
|
6
|
+
*/
|
7
|
+
export class SmokeSensor extends Sensor {
|
8
|
+
static ACCESSORY_TYPE_NAME = 'SmokeSensor';
|
9
|
+
static SMOKE_NOT_DETECTED = 0; // Characteristic.SmokeDetected.SMOKE_NOT_DETECTED;
|
10
|
+
static SMOKE_DETECTED = 1; // Characteristic.SmokeDetected.SMOKE_DETECTED;
|
11
|
+
constructor(platform, accessory) {
|
12
|
+
super(platform, accessory);
|
13
|
+
}
|
14
|
+
getService() {
|
15
|
+
return this.platform.Service.SmokeSensor;
|
16
|
+
}
|
17
|
+
getEventDetectedCharacteristic() {
|
18
|
+
return this.platform.Characteristic.SmokeDetected;
|
19
|
+
}
|
20
|
+
getStateName(state) {
|
21
|
+
let sensorStateName;
|
22
|
+
switch (state) {
|
23
|
+
case undefined: {
|
24
|
+
sensorStateName = 'undefined';
|
25
|
+
break;
|
26
|
+
}
|
27
|
+
case SmokeSensor.SMOKE_NOT_DETECTED: {
|
28
|
+
sensorStateName = Sensor.NORMAL_INACTIVE;
|
29
|
+
break;
|
30
|
+
}
|
31
|
+
case SmokeSensor.SMOKE_DETECTED: {
|
32
|
+
sensorStateName = Sensor.TRIGGERED_ACTIVE;
|
33
|
+
break;
|
34
|
+
}
|
35
|
+
default: {
|
36
|
+
sensorStateName = state.toString();
|
37
|
+
}
|
38
|
+
}
|
39
|
+
return sensorStateName;
|
40
|
+
}
|
41
|
+
getAccessoryTypeName() {
|
42
|
+
return SmokeSensor.ACCESSORY_TYPE_NAME;
|
43
|
+
}
|
44
|
+
}
|
45
|
+
//# sourceMappingURL=virtualSensorSmoke.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"virtualSensorSmoke.js","sourceRoot":"","sources":["../../src/sensors/virtualSensorSmoke.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C;;;;GAIG;AACH,MAAM,OAAO,WAAY,SAAQ,MAAM;IAErC,MAAM,CAAU,mBAAmB,GAAW,aAAa,CAAC;IAE5D,MAAM,CAAU,kBAAkB,GAAW,CAAC,CAAC,CAAG,mDAAmD;IACrG,MAAM,CAAU,cAAc,GAAW,CAAC,CAAC,CAAO,+CAA+C;IAEjG,YACE,QAAoC,EACpC,SAA4B;QAE5B,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC7B,CAAC;IAES,UAAU;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC;IAC3C,CAAC;IAES,8BAA8B;QACtC,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC;IACpD,CAAC;IAES,YAAY,CAAC,KAAa;QAClC,IAAI,eAAuB,CAAC;QAE5B,QAAQ,KAAK,EAAE,CAAC;YAChB,KAAK,SAAS,CAAC,CAAC,CAAC;gBAAC,eAAe,GAAG,WAAW,CAAC;gBAAC,MAAM;YAAC,CAAC;YACzD,KAAK,WAAW,CAAC,kBAAkB,CAAC,CAAC,CAAC;gBAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;gBAAC,MAAM;YAAC,CAAC;YACzF,KAAK,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC;gBAAC,eAAe,GAAG,MAAM,CAAC,gBAAgB,CAAC;gBAAC,MAAM;YAAC,CAAC;YACtF,OAAO,CAAC,CAAC,CAAC;gBAAC,eAAe,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YAAA,CAAC;QAC/C,CAAC;QAED,OAAO,eAAe,CAAC;IACzB,CAAC;IAES,oBAAoB;QAC5B,OAAO,WAAW,CAAC,mBAAmB,CAAC;IACzC,CAAC"}
|
@@ -0,0 +1,8 @@
|
|
1
|
+
/**
|
2
|
+
* This is the name of the platform that users will use to register the plugin in the Homebridge config.json
|
3
|
+
*/
|
4
|
+
export declare const PLATFORM_NAME = "VirtualAccessoriesForHomebridge";
|
5
|
+
/**
|
6
|
+
* This must match the name of your plugin as defined the package.json
|
7
|
+
*/
|
8
|
+
export declare const PLUGIN_NAME = "homebridge-virtual-accessories";
|
package/dist/settings.js
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
/**
|
2
|
+
* This is the name of the platform that users will use to register the plugin in the Homebridge config.json
|
3
|
+
*/
|
4
|
+
export const PLATFORM_NAME = 'VirtualAccessoriesForHomebridge';
|
5
|
+
/**
|
6
|
+
* This must match the name of your plugin as defined the package.json
|
7
|
+
*/
|
8
|
+
export const PLUGIN_NAME = 'homebridge-virtual-accessories';
|
9
|
+
//# sourceMappingURL=settings.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,iCAAiC,CAAC;AAE/D;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,gCAAgC,CAAC"}
|
package/dist/timer.d.ts
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
import { VirtualAccessoriesLogger } from './virtualLogger.js';
|
2
|
+
import { ZonedDateTime } from '@js-joda/core';
|
3
|
+
/**
|
4
|
+
*
|
5
|
+
*/
|
6
|
+
export declare class Timer {
|
7
|
+
private readonly oneSecond;
|
8
|
+
private accessoryName;
|
9
|
+
private log;
|
10
|
+
private timerIsResettable;
|
11
|
+
private id;
|
12
|
+
private defaultDuration;
|
13
|
+
private updateIntervalMillis;
|
14
|
+
private startTime;
|
15
|
+
private isRunning;
|
16
|
+
private runtime;
|
17
|
+
private remainingDurationMillis;
|
18
|
+
private logDebugCountdown;
|
19
|
+
/**
|
20
|
+
* Set duration in seconds
|
21
|
+
*/
|
22
|
+
constructor(accessoryName: string, log: VirtualAccessoriesLogger, timerIsResettable: boolean);
|
23
|
+
constructor(accessoryName: string, log: VirtualAccessoriesLogger, timerIsResettable: boolean, duration: number);
|
24
|
+
/**
|
25
|
+
* Set duration/oneOffDuration in seconds
|
26
|
+
*/
|
27
|
+
start(callback: () => void): void;
|
28
|
+
start(callback: () => void, duration: number): void;
|
29
|
+
start(callback: () => void, duration: number, updateIntervalMillis: number): void;
|
30
|
+
stop(): void;
|
31
|
+
getStartTime(): ZonedDateTime;
|
32
|
+
/**
|
33
|
+
* Returns runtime in seconds
|
34
|
+
*/
|
35
|
+
getRuntime(): number;
|
36
|
+
/**
|
37
|
+
* Returns interval in milliseconds
|
38
|
+
*/
|
39
|
+
getUpdateIntervalMillis(): number;
|
40
|
+
/**
|
41
|
+
* Returns duration in seconds
|
42
|
+
*/
|
43
|
+
getDefaultDuration(): number;
|
44
|
+
/**
|
45
|
+
* Set duration in seconds
|
46
|
+
*/
|
47
|
+
setDefaultDuration(duration: number): void;
|
48
|
+
/**
|
49
|
+
* Returns remaining duration in seconds
|
50
|
+
*/
|
51
|
+
getRemainingDuration(): number;
|
52
|
+
/**
|
53
|
+
* Returns remaining duration in milliseconds
|
54
|
+
*/
|
55
|
+
getRemainingDurationMillis(): number;
|
56
|
+
isTimerRunning(): boolean;
|
57
|
+
debugCountdown(): void;
|
58
|
+
}
|
package/dist/timer.js
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
import { Utils } from './utils.js';
|
2
|
+
/**
|
3
|
+
*
|
4
|
+
*/
|
5
|
+
export class Timer {
|
6
|
+
oneSecond = 1000; // in milliseconds
|
7
|
+
accessoryName;
|
8
|
+
log;
|
9
|
+
timerIsResettable = false;
|
10
|
+
id;
|
11
|
+
defaultDuration = 0;
|
12
|
+
updateIntervalMillis = this.oneSecond;
|
13
|
+
startTime;
|
14
|
+
isRunning = false;
|
15
|
+
runtime = 0;
|
16
|
+
remainingDurationMillis = 0;
|
17
|
+
logDebugCountdown = false;
|
18
|
+
constructor(accessoryName, log, timerIsResettable = false, duration) {
|
19
|
+
this.accessoryName = accessoryName;
|
20
|
+
this.log = log;
|
21
|
+
this.timerIsResettable = timerIsResettable;
|
22
|
+
this.startTime = Utils.now();
|
23
|
+
if (duration !== undefined) {
|
24
|
+
this.setDefaultDuration(duration);
|
25
|
+
}
|
26
|
+
}
|
27
|
+
start(callback, oneOffDuration, updateIntervalMillis) {
|
28
|
+
if (this.isRunning && !this.timerIsResettable) {
|
29
|
+
return;
|
30
|
+
}
|
31
|
+
// In case timer is running, stop it
|
32
|
+
this.stop();
|
33
|
+
// Now setup new run
|
34
|
+
this.runtime = (oneOffDuration === undefined) ? this.defaultDuration : oneOffDuration;
|
35
|
+
this.updateIntervalMillis = (updateIntervalMillis === undefined) ? this.oneSecond : updateIntervalMillis;
|
36
|
+
if (this.runtime > 0) {
|
37
|
+
this.remainingDurationMillis = this.runtime * 1000;
|
38
|
+
this.log.debug(`[${this.accessoryName} Timer] Start - Duration: ${this.runtime} seconds`);
|
39
|
+
this.id = setInterval(() => {
|
40
|
+
this.remainingDurationMillis -= this.updateIntervalMillis;
|
41
|
+
// We don't want this flooding the debug logs
|
42
|
+
if (this.logDebugCountdown && this.remainingDurationMillis % 1000 === 0) {
|
43
|
+
this.log.debug(`[${this.accessoryName} Timer] Remaining Duration: ${this.remainingDurationMillis} seconds`);
|
44
|
+
}
|
45
|
+
if (this.remainingDurationMillis <= 0) {
|
46
|
+
callback();
|
47
|
+
this.stop();
|
48
|
+
}
|
49
|
+
}, this.updateIntervalMillis);
|
50
|
+
this.startTime = Utils.now();
|
51
|
+
this.isRunning = true;
|
52
|
+
}
|
53
|
+
}
|
54
|
+
stop() {
|
55
|
+
clearInterval(this.id);
|
56
|
+
this.isRunning = false;
|
57
|
+
this.runtime = 0;
|
58
|
+
this.remainingDurationMillis = 0;
|
59
|
+
this.updateIntervalMillis = this.oneSecond;
|
60
|
+
this.logDebugCountdown = false;
|
61
|
+
this.log.debug(`[${this.accessoryName} Timer] Stop - Cleared Duration: ${this.getRemainingDuration()} seconds`);
|
62
|
+
}
|
63
|
+
getStartTime() {
|
64
|
+
return this.startTime;
|
65
|
+
}
|
66
|
+
/**
|
67
|
+
* Returns runtime in seconds
|
68
|
+
*/
|
69
|
+
getRuntime() {
|
70
|
+
return this.runtime;
|
71
|
+
}
|
72
|
+
/**
|
73
|
+
* Returns interval in milliseconds
|
74
|
+
*/
|
75
|
+
getUpdateIntervalMillis() {
|
76
|
+
return this.updateIntervalMillis;
|
77
|
+
}
|
78
|
+
/**
|
79
|
+
* Returns duration in seconds
|
80
|
+
*/
|
81
|
+
getDefaultDuration() {
|
82
|
+
return this.defaultDuration;
|
83
|
+
}
|
84
|
+
/**
|
85
|
+
* Set duration in seconds
|
86
|
+
*/
|
87
|
+
setDefaultDuration(duration) {
|
88
|
+
this.defaultDuration = duration;
|
89
|
+
this.log.debug(`[${this.accessoryName} Timer] Set Duration: ${this.defaultDuration} seconds`);
|
90
|
+
}
|
91
|
+
/**
|
92
|
+
* Returns remaining duration in seconds
|
93
|
+
*/
|
94
|
+
getRemainingDuration() {
|
95
|
+
return Math.ceil(this.remainingDurationMillis / 1000);
|
96
|
+
}
|
97
|
+
/**
|
98
|
+
* Returns remaining duration in milliseconds
|
99
|
+
*/
|
100
|
+
getRemainingDurationMillis() {
|
101
|
+
return this.remainingDurationMillis;
|
102
|
+
}
|
103
|
+
isTimerRunning() {
|
104
|
+
return this.isRunning;
|
105
|
+
}
|
106
|
+
debugCountdown() {
|
107
|
+
this.logDebugCountdown = true;
|
108
|
+
}
|
109
|
+
}
|
110
|
+
//# sourceMappingURL=timer.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"timer.js","sourceRoot":"","sources":["../src/timer.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"triggerableSensor.js","sourceRoot":"","sources":["../src/triggerableSensor.ts"],"names":[],"mappings":""}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
import { PlatformConfiguration } from '../configuration/configurationPlatform.js';
|
2
|
+
import { Sensor } from '../sensors/virtualSensor.js';
|
3
|
+
import { VirtualAccessoriesLogger } from '../virtualLogger.js';
|
4
|
+
/**
|
5
|
+
* Abstract Trigger
|
6
|
+
*/
|
7
|
+
export declare abstract class Trigger {
|
8
|
+
protected sensor: Sensor;
|
9
|
+
readonly sensorConfig: PlatformConfiguration;
|
10
|
+
readonly name: string;
|
11
|
+
protected log: VirtualAccessoriesLogger;
|
12
|
+
constructor(sensor: Sensor, name: string);
|
13
|
+
}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
/**
|
2
|
+
* Abstract Trigger
|
3
|
+
*/
|
4
|
+
export class Trigger {
|
5
|
+
sensor;
|
6
|
+
sensorConfig;
|
7
|
+
name;
|
8
|
+
log;
|
9
|
+
constructor(sensor, name) {
|
10
|
+
this.sensor = sensor;
|
11
|
+
this.sensorConfig = this.sensor.accessoryConfiguration;
|
12
|
+
this.name = name;
|
13
|
+
this.log = this.sensor.platform.log;
|
14
|
+
}
|
15
|
+
}
|
16
|
+
//# sourceMappingURL=trigger.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"trigger.js","sourceRoot":"","sources":["../../src/triggers/trigger.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,OAAgB,OAAO;IAEjB,MAAM,CAAS;IAChB,YAAY,CAAwB;IAEpC,IAAI,CAAS;IAEZ,GAAG,CAA2B;IAExC,YACE,MAAc,EACd,IAAY;QAEZ,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC;QAEvD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAEjB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;IACtC,CAAC;CACF"}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
import { Trigger } from './trigger.js';
|
2
|
+
import { Sensor } from '../sensors/virtualSensor.js';
|
3
|
+
import '@js-joda/timezone';
|
4
|
+
/**
|
5
|
+
* CronTrigger - Trigger implementation
|
6
|
+
*/
|
7
|
+
export declare class CronTrigger extends Trigger {
|
8
|
+
private cronJob;
|
9
|
+
constructor(sensor: Sensor, name: string);
|
10
|
+
/**
|
11
|
+
* Private methods
|
12
|
+
*/
|
13
|
+
private displayNextRun;
|
14
|
+
private getZonedDateTime;
|
15
|
+
private includeStartTime;
|
16
|
+
private includeEndTime;
|
17
|
+
private adjustTime;
|
18
|
+
}
|
19
|
+
export declare const dynamicTrigger: typeof CronTrigger;
|
@@ -0,0 +1,102 @@
|
|
1
|
+
import { Trigger } from './trigger.js';
|
2
|
+
import { Sensor } from '../sensors/virtualSensor.js';
|
3
|
+
import { Utils } from '../utils.js';
|
4
|
+
import { Cron } from 'croner';
|
5
|
+
import { DateTimeFormatter, LocalDateTime, ZonedDateTime, ZoneId } from '@js-joda/core';
|
6
|
+
import '@js-joda/timezone';
|
7
|
+
/**
|
8
|
+
* CronTrigger - Trigger implementation
|
9
|
+
*/
|
10
|
+
export class CronTrigger extends Trigger {
|
11
|
+
cronJob;
|
12
|
+
constructor(sensor, name) {
|
13
|
+
super(sensor, name);
|
14
|
+
const triggerConfig = this.sensorConfig.cronTrigger;
|
15
|
+
if (triggerConfig.isDisabled) {
|
16
|
+
this.log.info(`[${this.sensorConfig.accessoryName}] Cron trigger is disabled`);
|
17
|
+
return;
|
18
|
+
}
|
19
|
+
if (triggerConfig.disableTriggerEventLogging) {
|
20
|
+
this.log.info(`[${this.sensorConfig.accessoryName}] Cron trigger event logging is disabled. Sensor state changes will not be displayed in the logs`);
|
21
|
+
}
|
22
|
+
// Hardcode reset delay
|
23
|
+
const resetDelayMillis = 3 * 1000; // 3 second reset delay
|
24
|
+
// System settings - date/time formatting - timezone
|
25
|
+
const timezone = (triggerConfig.zoneId !== undefined) ? triggerConfig.zoneId : Intl.DateTimeFormat().resolvedOptions().timeZone;
|
26
|
+
this.log.debug(`[${this.sensorConfig.accessoryName}] Setting timezone to '${timezone}'`);
|
27
|
+
const zoneId = ZoneId.of(timezone);
|
28
|
+
this.log.debug(`[${this.sensorConfig.accessoryName}] Setting ZoneId to '${zoneId}'`);
|
29
|
+
const cronStart = this.getZonedDateTime(triggerConfig.startDateTime, zoneId);
|
30
|
+
const cronEnd = this.getZonedDateTime(triggerConfig.endDateTime, zoneId);
|
31
|
+
this.log.debug(`[${this.sensorConfig.accessoryName}] Start time: '${cronStart?.format(DateTimeFormatter.ISO_ZONED_DATE_TIME)}'`);
|
32
|
+
this.log.debug(`[${this.sensorConfig.accessoryName}] End time: '${cronEnd?.format(DateTimeFormatter.ISO_ZONED_DATE_TIME)}'`);
|
33
|
+
this.log.debug(`[${this.sensorConfig.accessoryName}] Now time: '${Utils.now().format(DateTimeFormatter.ISO_ZONED_DATE_TIME)}'`);
|
34
|
+
// If we're past the end date, don't even bother starting up the cron job
|
35
|
+
if (cronEnd && Utils.now().isAfter(cronEnd)) {
|
36
|
+
this.log.info(`[${this.sensorConfig.accessoryName}] After cron end: '${triggerConfig.endDateTime}'. Not setting up cron job`);
|
37
|
+
return;
|
38
|
+
// eslint-disable-next-line brace-style
|
39
|
+
}
|
40
|
+
else if (cronStart && (Utils.now().isEqual(cronStart) || Utils.now().isBefore(cronStart))) {
|
41
|
+
this.log.info(`[${this.sensorConfig.accessoryName}] Before cron start: '${triggerConfig.startDateTime}'. Waiting for start time`);
|
42
|
+
}
|
43
|
+
let firstTrigger = true;
|
44
|
+
this.cronJob = new Cron(triggerConfig.pattern, {
|
45
|
+
name: `Schedule Cron Job (${this.sensorConfig.accessoryName})`,
|
46
|
+
startAt: this.includeStartTime(triggerConfig.startDateTime),
|
47
|
+
stopAt: this.includeEndTime(triggerConfig.endDateTime),
|
48
|
+
timezone: timezone,
|
49
|
+
}, (async () => {
|
50
|
+
if (firstTrigger) {
|
51
|
+
this.log.info(`[${this.sensorConfig.accessoryName}] Starting cron job`);
|
52
|
+
firstTrigger = false;
|
53
|
+
}
|
54
|
+
this.log.debug(`[${this.sensorConfig.accessoryName}] Matched cron pattern '${triggerConfig.pattern}'. Triggering sensor`);
|
55
|
+
sensor.triggerSensorState(Sensor.TRIGGERED, this, triggerConfig.disableTriggerEventLogging);
|
56
|
+
await Utils.delay(resetDelayMillis);
|
57
|
+
sensor.triggerSensorState(Sensor.NORMAL, this, triggerConfig.disableTriggerEventLogging);
|
58
|
+
if (!this.cronJob.nextRun()) {
|
59
|
+
this.log.info(`[${this.sensorConfig.accessoryName}] Stopping cron job`);
|
60
|
+
}
|
61
|
+
}));
|
62
|
+
this.displayNextRun(this.cronJob);
|
63
|
+
}
|
64
|
+
/**
|
65
|
+
* Private methods
|
66
|
+
*/
|
67
|
+
displayNextRun(cronJob) {
|
68
|
+
let nextRunTimestamp = cronJob.nextRun()?.toISOString();
|
69
|
+
nextRunTimestamp = (nextRunTimestamp === undefined) ?
|
70
|
+
'None scheduled' :
|
71
|
+
`${nextRunTimestamp.split('.')[0]} (count: ${cronJob.options.maxRuns})`;
|
72
|
+
this.log.debug(`[${this.sensorConfig.accessoryName}] Next ${cronJob.name} run: ${nextRunTimestamp}`);
|
73
|
+
}
|
74
|
+
getZonedDateTime(datetime, zoneId) {
|
75
|
+
if (datetime === undefined) {
|
76
|
+
return undefined;
|
77
|
+
}
|
78
|
+
const localDateTimeLength = 'yyyy:MM:ddThh:mm:ss'.length;
|
79
|
+
const localDatetime = datetime.substring(0, localDateTimeLength);
|
80
|
+
const zonedDateTime = ZonedDateTime.of(LocalDateTime.parse(localDatetime), zoneId);
|
81
|
+
return zonedDateTime;
|
82
|
+
}
|
83
|
+
// The cron implementation is exclusive of start and end times
|
84
|
+
// To include start time, setting start time to one second earlier
|
85
|
+
// To include end time, setting end time to one second later
|
86
|
+
includeStartTime(startTime) {
|
87
|
+
return this.adjustTime(startTime, -1);
|
88
|
+
}
|
89
|
+
includeEndTime(endTime) {
|
90
|
+
return this.adjustTime(endTime, 1);
|
91
|
+
}
|
92
|
+
adjustTime(datetime, adjusmentSeconds) {
|
93
|
+
if (datetime === undefined) {
|
94
|
+
return undefined;
|
95
|
+
}
|
96
|
+
let localDateTime = LocalDateTime.parse(datetime);
|
97
|
+
localDateTime = localDateTime.plusSeconds(adjusmentSeconds);
|
98
|
+
return localDateTime.format(DateTimeFormatter.ISO_DATE_TIME);
|
99
|
+
}
|
100
|
+
}
|
101
|
+
export const dynamicTrigger = CronTrigger;
|
102
|
+
//# sourceMappingURL=triggerCron.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"triggerCron.js","sourceRoot":"","sources":["../../src/triggers/triggerCron.ts"],"names":[],"mappings":"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"}
|