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.
Files changed (270) hide show
  1. package/LICENSE +7 -0
  2. package/README.md +1091 -0
  3. package/VirtualAccessories.jpg +0 -0
  4. package/VirtualAccessories.png +0 -0
  5. package/assets/changeorder.png +0 -0
  6. package/assets/creative-ideas/HowToAddAFakeThermostat.png +0 -0
  7. package/assets/keepaccessories.png +0 -0
  8. package/assets/mentions/youtube-EdgarsHomeTech.png +0 -0
  9. package/assets/mentions/youtube-MakeSmartMatter.png +0 -0
  10. package/assets/wiki/automation-shortcut-1.png +0 -0
  11. package/assets/wiki/automation-shortcut-2.png +0 -0
  12. package/assets/wiki/cron-schedule-config.png +0 -0
  13. package/assets/wiki/enable-sensor-webhooks.png +0 -0
  14. package/assets/wiki/humidifier-dehumidifier-config.png +0 -0
  15. package/assets/wiki/new-automation.png +0 -0
  16. package/assets/wiki/timer-duration-new.png +0 -0
  17. package/assets/wiki/timer-duration-old.png +0 -0
  18. package/assets/wiki/valve-timer-duration-new.png +0 -0
  19. package/assets/wiki/valve-timer-duration-old.png +0 -0
  20. package/config.schema.json +1570 -0
  21. package/dist/accessories/audioAccessory.d.ts +29 -0
  22. package/dist/accessories/audioAccessory.js +119 -0
  23. package/dist/accessories/audioAccessory.js.map +1 -0
  24. package/dist/accessories/externalAccessory.d.ts +10 -0
  25. package/dist/accessories/externalAccessory.js +13 -0
  26. package/dist/accessories/externalAccessory.js.map +1 -0
  27. package/dist/accessories/openingAccessory.d.ts +35 -0
  28. package/dist/accessories/openingAccessory.js +166 -0
  29. package/dist/accessories/openingAccessory.js.map +1 -0
  30. package/dist/accessories/triggerableEventAccessory.d.ts +7 -0
  31. package/dist/accessories/triggerableEventAccessory.js +2 -0
  32. package/dist/accessories/triggerableEventAccessory.js.map +1 -0
  33. package/dist/accessories/virtualAccessory.d.ts +29 -0
  34. package/dist/accessories/virtualAccessory.js +86 -0
  35. package/dist/accessories/virtualAccessory.js.map +1 -0
  36. package/dist/accessories/virtualAccessoryDoor.d.ts +14 -0
  37. package/dist/accessories/virtualAccessoryDoor.js +20 -0
  38. package/dist/accessories/virtualAccessoryDoor.js.map +1 -0
  39. package/dist/accessories/virtualAccessoryDoorbell.d.ts +29 -0
  40. package/dist/accessories/virtualAccessoryDoorbell.js +111 -0
  41. package/dist/accessories/virtualAccessoryDoorbell.js.map +1 -0
  42. package/dist/accessories/virtualAccessoryFan.d.ts +27 -0
  43. package/dist/accessories/virtualAccessoryFan.js +122 -0
  44. package/dist/accessories/virtualAccessoryFan.js.map +1 -0
  45. package/dist/accessories/virtualAccessoryFilterMaintenance.d.ts +26 -0
  46. package/dist/accessories/virtualAccessoryFilterMaintenance.js +122 -0
  47. package/dist/accessories/virtualAccessoryFilterMaintenance.js.map +1 -0
  48. package/dist/accessories/virtualAccessoryGarageDoor.d.ts +28 -0
  49. package/dist/accessories/virtualAccessoryGarageDoor.js +162 -0
  50. package/dist/accessories/virtualAccessoryGarageDoor.js.map +1 -0
  51. package/dist/accessories/virtualAccessoryHeaterCooler.d.ts +62 -0
  52. package/dist/accessories/virtualAccessoryHeaterCooler.js +441 -0
  53. package/dist/accessories/virtualAccessoryHeaterCooler.js.map +1 -0
  54. package/dist/accessories/virtualAccessoryHumidifierDehumidifier.d.ts +53 -0
  55. package/dist/accessories/virtualAccessoryHumidifierDehumidifier.js +365 -0
  56. package/dist/accessories/virtualAccessoryHumidifierDehumidifier.js.map +1 -0
  57. package/dist/accessories/virtualAccessoryInputSource.d.ts +38 -0
  58. package/dist/accessories/virtualAccessoryInputSource.js +196 -0
  59. package/dist/accessories/virtualAccessoryInputSource.js.map +1 -0
  60. package/dist/accessories/virtualAccessoryLightbulb.d.ts +37 -0
  61. package/dist/accessories/virtualAccessoryLightbulb.js +222 -0
  62. package/dist/accessories/virtualAccessoryLightbulb.js.map +1 -0
  63. package/dist/accessories/virtualAccessoryLock.d.ts +34 -0
  64. package/dist/accessories/virtualAccessoryLock.js +198 -0
  65. package/dist/accessories/virtualAccessoryLock.js.map +1 -0
  66. package/dist/accessories/virtualAccessorySecuritySystem.d.ts +30 -0
  67. package/dist/accessories/virtualAccessorySecuritySystem.js +214 -0
  68. package/dist/accessories/virtualAccessorySecuritySystem.js.map +1 -0
  69. package/dist/accessories/virtualAccessorySpeaker.d.ts +14 -0
  70. package/dist/accessories/virtualAccessorySpeaker.js +20 -0
  71. package/dist/accessories/virtualAccessorySpeaker.js.map +1 -0
  72. package/dist/accessories/virtualAccessorySwitch.d.ts +34 -0
  73. package/dist/accessories/virtualAccessorySwitch.js +191 -0
  74. package/dist/accessories/virtualAccessorySwitch.js.map +1 -0
  75. package/dist/accessories/virtualAccessoryTelevision.d.ts +44 -0
  76. package/dist/accessories/virtualAccessoryTelevision.js +230 -0
  77. package/dist/accessories/virtualAccessoryTelevision.js.map +1 -0
  78. package/dist/accessories/virtualAccessoryValve.d.ts +34 -0
  79. package/dist/accessories/virtualAccessoryValve.js +215 -0
  80. package/dist/accessories/virtualAccessoryValve.js.map +1 -0
  81. package/dist/accessories/virtualAccessoryWindow.d.ts +14 -0
  82. package/dist/accessories/virtualAccessoryWindow.js +20 -0
  83. package/dist/accessories/virtualAccessoryWindow.js.map +1 -0
  84. package/dist/accessories/virtualAccessoryWindowCovering.d.ts +14 -0
  85. package/dist/accessories/virtualAccessoryWindowCovering.js +20 -0
  86. package/dist/accessories/virtualAccessoryWindowCovering.js.map +1 -0
  87. package/dist/accessoryFactory.d.ts +15 -0
  88. package/dist/accessoryFactory.js +147 -0
  89. package/dist/accessoryFactory.js.map +1 -0
  90. package/dist/colors.d.ts +22 -0
  91. package/dist/colors.js +146 -0
  92. package/dist/colors.js.map +1 -0
  93. package/dist/companions/companionLightbulb.d.ts +10 -0
  94. package/dist/companions/companionLightbulb.js +12 -0
  95. package/dist/companions/companionLightbulb.js.map +1 -0
  96. package/dist/companions/companionSensors.d.ts +9 -0
  97. package/dist/companions/companionSensors.js +117 -0
  98. package/dist/companions/companionSensors.js.map +1 -0
  99. package/dist/companions/companionSwitch.d.ts +15 -0
  100. package/dist/companions/companionSwitch.js +46 -0
  101. package/dist/companions/companionSwitch.js.map +1 -0
  102. package/dist/configuration/accessories/configurationDoor.d.ts +9 -0
  103. package/dist/configuration/accessories/configurationDoor.js +31 -0
  104. package/dist/configuration/accessories/configurationDoor.js.map +1 -0
  105. package/dist/configuration/accessories/configurationDoorbell.d.ts +10 -0
  106. package/dist/configuration/accessories/configurationDoorbell.js +23 -0
  107. package/dist/configuration/accessories/configurationDoorbell.js.map +1 -0
  108. package/dist/configuration/accessories/configurationFan.d.ts +12 -0
  109. package/dist/configuration/accessories/configurationFan.js +36 -0
  110. package/dist/configuration/accessories/configurationFan.js.map +1 -0
  111. package/dist/configuration/accessories/configurationFilterMaintenance.d.ts +12 -0
  112. package/dist/configuration/accessories/configurationFilterMaintenance.js +48 -0
  113. package/dist/configuration/accessories/configurationFilterMaintenance.js.map +1 -0
  114. package/dist/configuration/accessories/configurationGarageDoor.d.ts +9 -0
  115. package/dist/configuration/accessories/configurationGarageDoor.js +31 -0
  116. package/dist/configuration/accessories/configurationGarageDoor.js.map +1 -0
  117. package/dist/configuration/accessories/configurationHeaterCooler.d.ts +20 -0
  118. package/dist/configuration/accessories/configurationHeaterCooler.js +116 -0
  119. package/dist/configuration/accessories/configurationHeaterCooler.js.map +1 -0
  120. package/dist/configuration/accessories/configurationHumidifierDehumidifier.d.ts +12 -0
  121. package/dist/configuration/accessories/configurationHumidifierDehumidifier.js +44 -0
  122. package/dist/configuration/accessories/configurationHumidifierDehumidifier.js.map +1 -0
  123. package/dist/configuration/accessories/configurationInputSource.d.ts +12 -0
  124. package/dist/configuration/accessories/configurationInputSource.js +33 -0
  125. package/dist/configuration/accessories/configurationInputSource.js.map +1 -0
  126. package/dist/configuration/accessories/configurationLightbulb.d.ts +14 -0
  127. package/dist/configuration/accessories/configurationLightbulb.js +55 -0
  128. package/dist/configuration/accessories/configurationLightbulb.js.map +1 -0
  129. package/dist/configuration/accessories/configurationLock.d.ts +11 -0
  130. package/dist/configuration/accessories/configurationLock.js +30 -0
  131. package/dist/configuration/accessories/configurationLock.js.map +1 -0
  132. package/dist/configuration/accessories/configurationSecuritySystem.d.ts +18 -0
  133. package/dist/configuration/accessories/configurationSecuritySystem.js +48 -0
  134. package/dist/configuration/accessories/configurationSecuritySystem.js.map +1 -0
  135. package/dist/configuration/accessories/configurationSpeaker.d.ts +9 -0
  136. package/dist/configuration/accessories/configurationSpeaker.js +24 -0
  137. package/dist/configuration/accessories/configurationSpeaker.js.map +1 -0
  138. package/dist/configuration/accessories/configurationSwitch.d.ts +13 -0
  139. package/dist/configuration/accessories/configurationSwitch.js +27 -0
  140. package/dist/configuration/accessories/configurationSwitch.js.map +1 -0
  141. package/dist/configuration/accessories/configurationTelevision.d.ts +12 -0
  142. package/dist/configuration/accessories/configurationTelevision.js +47 -0
  143. package/dist/configuration/accessories/configurationTelevision.js.map +1 -0
  144. package/dist/configuration/accessories/configurationValve.d.ts +25 -0
  145. package/dist/configuration/accessories/configurationValve.js +88 -0
  146. package/dist/configuration/accessories/configurationValve.js.map +1 -0
  147. package/dist/configuration/accessories/configurationWindow.d.ts +9 -0
  148. package/dist/configuration/accessories/configurationWindow.js +31 -0
  149. package/dist/configuration/accessories/configurationWindow.js.map +1 -0
  150. package/dist/configuration/accessories/configurationWindowCovering.d.ts +9 -0
  151. package/dist/configuration/accessories/configurationWindowCovering.js +31 -0
  152. package/dist/configuration/accessories/configurationWindowCovering.js.map +1 -0
  153. package/dist/configuration/configuration.d.ts +13 -0
  154. package/dist/configuration/configuration.js +41 -0
  155. package/dist/configuration/configuration.js.map +1 -0
  156. package/dist/configuration/configurationAccessory.d.ts +6 -0
  157. package/dist/configuration/configurationAccessory.js +6 -0
  158. package/dist/configuration/configurationAccessory.js.map +1 -0
  159. package/dist/configuration/configurationAudioAccessoryConfiguration.d.ts +9 -0
  160. package/dist/configuration/configurationAudioAccessoryConfiguration.js +9 -0
  161. package/dist/configuration/configurationAudioAccessoryConfiguration.js.map +1 -0
  162. package/dist/configuration/configurationCompanionSensor.d.ts +11 -0
  163. package/dist/configuration/configurationCompanionSensor.js +26 -0
  164. package/dist/configuration/configurationCompanionSensor.js.map +1 -0
  165. package/dist/configuration/configurationDuration.d.ts +19 -0
  166. package/dist/configuration/configurationDuration.js +55 -0
  167. package/dist/configuration/configurationDuration.js.map +1 -0
  168. package/dist/configuration/configurationOpenableAccesory.d.ts +9 -0
  169. package/dist/configuration/configurationOpenableAccesory.js +9 -0
  170. package/dist/configuration/configurationOpenableAccesory.js.map +1 -0
  171. package/dist/configuration/configurationPlatform.d.ts +76 -0
  172. package/dist/configuration/configurationPlatform.js +381 -0
  173. package/dist/configuration/configurationPlatform.js.map +1 -0
  174. package/dist/configuration/configurationSchema.d.ts +178 -0
  175. package/dist/configuration/configurationSchema.js +198 -0
  176. package/dist/configuration/configurationSchema.js.map +1 -0
  177. package/dist/configuration/configurationSensor.d.ts +11 -0
  178. package/dist/configuration/configurationSensor.js +30 -0
  179. package/dist/configuration/configurationSensor.js.map +1 -0
  180. package/dist/configuration/configurationSensorServer.d.ts +11 -0
  181. package/dist/configuration/configurationSensorServer.js +26 -0
  182. package/dist/configuration/configurationSensorServer.js.map +1 -0
  183. package/dist/configuration/configurationTimer.d.ts +15 -0
  184. package/dist/configuration/configurationTimer.js +101 -0
  185. package/dist/configuration/configurationTimer.js.map +1 -0
  186. package/dist/configuration/triggers/configurationCronTrigger.d.ts +18 -0
  187. package/dist/configuration/triggers/configurationCronTrigger.js +65 -0
  188. package/dist/configuration/triggers/configurationCronTrigger.js.map +1 -0
  189. package/dist/configuration/triggers/configurationPingTrigger.d.ts +11 -0
  190. package/dist/configuration/triggers/configurationPingTrigger.js +26 -0
  191. package/dist/configuration/triggers/configurationPingTrigger.js.map +1 -0
  192. package/dist/configuration/triggers/configurationSunEventsTrigger.d.ts +18 -0
  193. package/dist/configuration/triggers/configurationSunEventsTrigger.js +52 -0
  194. package/dist/configuration/triggers/configurationSunEventsTrigger.js.map +1 -0
  195. package/dist/configuration/triggers/configurationWebhookTriggerConfiguration.d.ts +9 -0
  196. package/dist/configuration/triggers/configurationWebhookTriggerConfiguration.js +17 -0
  197. package/dist/configuration/triggers/configurationWebhookTriggerConfiguration.js.map +1 -0
  198. package/dist/errors.d.ts +27 -0
  199. package/dist/errors.js +52 -0
  200. package/dist/errors.js.map +1 -0
  201. package/dist/index.d.ts +6 -0
  202. package/dist/index.js +9 -0
  203. package/dist/index.js.map +1 -0
  204. package/dist/platform.d.ts +28 -0
  205. package/dist/platform.js +221 -0
  206. package/dist/platform.js.map +1 -0
  207. package/dist/sensorServer.d.ts +27 -0
  208. package/dist/sensorServer.js +227 -0
  209. package/dist/sensorServer.js.map +1 -0
  210. package/dist/sensors/virtualSensor.d.ts +37 -0
  211. package/dist/sensors/virtualSensor.js +87 -0
  212. package/dist/sensors/virtualSensor.js.map +1 -0
  213. package/dist/sensors/virtualSensorCarbonDioxide.d.ts +20 -0
  214. package/dist/sensors/virtualSensorCarbonDioxide.js +45 -0
  215. package/dist/sensors/virtualSensorCarbonDioxide.js.map +1 -0
  216. package/dist/sensors/virtualSensorCarbonMonoxide.d.ts +20 -0
  217. package/dist/sensors/virtualSensorCarbonMonoxide.js +45 -0
  218. package/dist/sensors/virtualSensorCarbonMonoxide.js.map +1 -0
  219. package/dist/sensors/virtualSensorContact.d.ts +20 -0
  220. package/dist/sensors/virtualSensorContact.js +45 -0
  221. package/dist/sensors/virtualSensorContact.js.map +1 -0
  222. package/dist/sensors/virtualSensorLeak.d.ts +20 -0
  223. package/dist/sensors/virtualSensorLeak.js +45 -0
  224. package/dist/sensors/virtualSensorLeak.js.map +1 -0
  225. package/dist/sensors/virtualSensorMotion.d.ts +20 -0
  226. package/dist/sensors/virtualSensorMotion.js +45 -0
  227. package/dist/sensors/virtualSensorMotion.js.map +1 -0
  228. package/dist/sensors/virtualSensorOccupancy.d.ts +20 -0
  229. package/dist/sensors/virtualSensorOccupancy.js +45 -0
  230. package/dist/sensors/virtualSensorOccupancy.js.map +1 -0
  231. package/dist/sensors/virtualSensorSmoke.d.ts +20 -0
  232. package/dist/sensors/virtualSensorSmoke.js +45 -0
  233. package/dist/sensors/virtualSensorSmoke.js.map +1 -0
  234. package/dist/settings.d.ts +8 -0
  235. package/dist/settings.js +9 -0
  236. package/dist/settings.js.map +1 -0
  237. package/dist/timer.d.ts +58 -0
  238. package/dist/timer.js +110 -0
  239. package/dist/timer.js.map +1 -0
  240. package/dist/triggerableSensor.d.ts +6 -0
  241. package/dist/triggerableSensor.js +2 -0
  242. package/dist/triggerableSensor.js.map +1 -0
  243. package/dist/triggers/trigger.d.ts +13 -0
  244. package/dist/triggers/trigger.js +16 -0
  245. package/dist/triggers/trigger.js.map +1 -0
  246. package/dist/triggers/triggerCron.d.ts +19 -0
  247. package/dist/triggers/triggerCron.js +102 -0
  248. package/dist/triggers/triggerCron.js.map +1 -0
  249. package/dist/triggers/triggerPing.d.ts +19 -0
  250. package/dist/triggers/triggerPing.js +110 -0
  251. package/dist/triggers/triggerPing.js.map +1 -0
  252. package/dist/triggers/triggerSunEvents.d.ts +20 -0
  253. package/dist/triggers/triggerSunEvents.js +200 -0
  254. package/dist/triggers/triggerSunEvents.js.map +1 -0
  255. package/dist/triggers/triggerWebhook.d.ts +10 -0
  256. package/dist/triggers/triggerWebhook.js +26 -0
  257. package/dist/triggers/triggerWebhook.js.map +1 -0
  258. package/dist/updatableObstruction.d.ts +6 -0
  259. package/dist/updatableObstruction.js +2 -0
  260. package/dist/updatableObstruction.js.map +1 -0
  261. package/dist/updatableSensor.d.ts +6 -0
  262. package/dist/updatableSensor.js +2 -0
  263. package/dist/updatableSensor.js.map +1 -0
  264. package/dist/utils.d.ts +28 -0
  265. package/dist/utils.js +120 -0
  266. package/dist/utils.js.map +1 -0
  267. package/dist/virtualLogger.d.ts +15 -0
  268. package/dist/virtualLogger.js +38 -0
  269. package/dist/virtualLogger.js.map +1 -0
  270. 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";
@@ -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"}
@@ -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,6 @@
1
+ /**
2
+ *
3
+ */
4
+ export interface TriggerableSensor {
5
+ triggerSensor(value: boolean, accessoryId: string): void;
6
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=triggerableSensor.js.map
@@ -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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"}