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,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,9 @@
1
+ /**
2
+ *
3
+ */
4
+ export declare class WebhookTriggerConfiguration {
5
+ isDisabled: boolean;
6
+ private errorFields;
7
+ readonly fieldNames: { [P in keyof this]?: P | undefined; };
8
+ isValid(prefix: string): [boolean, string[]];
9
+ }
@@ -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"}
@@ -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"}
@@ -0,0 +1,6 @@
1
+ import type { API } from 'homebridge';
2
+ /**
3
+ * This method registers the platform with Homebridge
4
+ */
5
+ declare const _default: (api: API) => void;
6
+ export default _default;
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
+ }
@@ -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
+ }