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,227 @@
1
+ /* eslint-disable brace-style */
2
+ import { Sensor } from './sensors/virtualSensor.js';
3
+ import { SensorValueUpdateNotAllowed } from './errors.js';
4
+ import express from 'express';
5
+ /**
6
+ * Create server to accept sensor events
7
+ */
8
+ export class SensorUpdateServer {
9
+ static accessoryIdPattern = '^[A-Za-z0-9\\-]{5,}$';
10
+ accessories = new Map();
11
+ log;
12
+ serverName = 'Sensor Server';
13
+ server = express();
14
+ httpServer;
15
+ port;
16
+ constructor(log, port, accessories) {
17
+ this.log = log;
18
+ this.port = port;
19
+ // parse application/x-www-form-urlencoded
20
+ this.server.use(express.urlencoded({ extended: true }));
21
+ // parse application/json
22
+ this.server.use(express.json());
23
+ if (accessories) {
24
+ this.addAccessories(accessories);
25
+ }
26
+ // Routes
27
+ const routeHumidity = '/humidity';
28
+ this.log.info(`[${this.serverName}] Setting up route: ${routeHumidity}`);
29
+ this.server.post(routeHumidity, (request, response) => {
30
+ const accessoryId = request.body.id;
31
+ const humidity = request.body.value;
32
+ this.log.debug(`[${this.serverName}] Request: ${request.method} ${request.path}, ${JSON.stringify(request.body)}`);
33
+ if (this.accessoryIdIsValid(accessoryId, response) && this.humidityIsValid(humidity, response)) {
34
+ this.processRequest(accessoryId, 'humidifierdehumidifier', Number(humidity), response);
35
+ }
36
+ });
37
+ const routeTemperature = '/temperature';
38
+ this.log.info(`[${this.serverName}] Setting up route: ${routeTemperature}`);
39
+ this.server.post(routeTemperature, (request, response) => {
40
+ const accessoryId = request.body.id;
41
+ const temperature = request.body.value;
42
+ this.log.debug(`[${this.serverName}] Request: ${request.method} ${request.path}, ${JSON.stringify(request.body)}`);
43
+ if (this.accessoryIdIsValid(accessoryId, response) && this.temperatureIsValid(temperature, response)) {
44
+ this.processRequest(accessoryId, 'heatercooler', Number(temperature), response);
45
+ }
46
+ });
47
+ const routeObstruction = '/obstruction';
48
+ this.log.info(`[${this.serverName}] Setting up route: ${routeObstruction}`);
49
+ this.server.post(routeObstruction, (request, response) => {
50
+ const accessoryId = request.body.id;
51
+ const obstruction = request.body.value;
52
+ this.log.debug(`[${this.serverName}] Request: ${request.method} ${request.path}, ${JSON.stringify(request.body)}`);
53
+ if (this.accessoryIdIsValid(accessoryId, response) && this.obstructionIsValid(obstruction, response)) {
54
+ this.processRequest(accessoryId, 'garagedoor', obstruction, response);
55
+ }
56
+ });
57
+ const routeTriggerAlarm = '/triggeralarm';
58
+ this.log.info(`[${this.serverName}] Setting up route: ${routeTriggerAlarm}`);
59
+ this.server.post(routeTriggerAlarm, (request, response) => {
60
+ const accessoryId = request.body.id;
61
+ const trigger = request.body.value;
62
+ this.log.debug(`[${this.serverName}] Request: ${request.method} ${request.path}, ${JSON.stringify(request.body)}`);
63
+ if (this.accessoryIdIsValid(accessoryId, response) && this.triggerIsValid(trigger, response)) {
64
+ this.processRequest(accessoryId, 'securitysystem', trigger, response);
65
+ }
66
+ });
67
+ const routeTriggerSensor = '/triggersensor';
68
+ this.log.info(`[${this.serverName}] Setting up route: ${routeTriggerSensor}`);
69
+ this.server.post(routeTriggerSensor, (request, response) => {
70
+ const accessoryId = request.body.id;
71
+ const trigger = request.body.value;
72
+ this.log.debug(`[${this.serverName}] Request: ${request.method} ${request.path}, ${JSON.stringify(request.body)}`);
73
+ if (this.accessoryIdIsValid(accessoryId, response) && this.triggerIsValid(trigger, response)) {
74
+ this.processRequest(accessoryId, 'sensor', trigger, response);
75
+ }
76
+ });
77
+ }
78
+ start() {
79
+ this.log.info(`[${this.serverName}] Starting Sensor Server`);
80
+ this.httpServer = this.server.listen(this.port, () => {
81
+ this.log.info(`[${this.serverName}] Sensor Server running on port ${this.port}`);
82
+ });
83
+ }
84
+ stop() {
85
+ this.log.info(`[${this.serverName}] Stopping Sensor Server`);
86
+ this.httpServer?.close(() => {
87
+ this.log.info(`[${this.serverName}] Sensor Server terminated`);
88
+ });
89
+ }
90
+ addAccessories(accessories) {
91
+ accessories.forEach((accessory) => {
92
+ this.addAccessory(accessory);
93
+ });
94
+ }
95
+ addAccessory(accessory) {
96
+ let addedAccessory = false;
97
+ if (accessory.updateSensor !== undefined) {
98
+ this.accessories.set(accessory.accessoryConfiguration.accessoryID, accessory);
99
+ addedAccessory = true;
100
+ }
101
+ else if (accessory.triggerSensor !== undefined) {
102
+ this.accessories.set(accessory.accessoryConfiguration.accessoryID, accessory);
103
+ addedAccessory = true;
104
+ }
105
+ else if (accessory.updateObstruction !== undefined) {
106
+ this.accessories.set(accessory.accessoryConfiguration.accessoryID, accessory);
107
+ addedAccessory = true;
108
+ }
109
+ else if (accessory instanceof Sensor) {
110
+ const trigger = accessory.getTrigger();
111
+ if (trigger.triggerSensor !== undefined) {
112
+ this.accessories.set(accessory.accessoryConfiguration.accessoryID, accessory);
113
+ addedAccessory = true;
114
+ }
115
+ }
116
+ if (addedAccessory === true) {
117
+ this.log.info(`[${this.serverName}] Added accessory ${accessory.accessoryConfiguration.accessoryName} (${accessory.accessoryConfiguration.accessoryID})`);
118
+ }
119
+ else {
120
+ // eslint-disable-next-line max-len
121
+ this.log.debug(`[${this.serverName}] Skipping accessory ${accessory.accessoryConfiguration.accessoryName} (${accessory.accessoryConfiguration.accessoryID})`);
122
+ }
123
+ }
124
+ removeAccessory(accessory) {
125
+ const found = this.accessories.delete(accessory.accessoryConfiguration.accessoryID);
126
+ this.log.info(`[${this.serverName}] Removed accessory ${accessory.accessoryConfiguration.accessoryName} (${accessory.accessoryConfiguration.accessoryID})`);
127
+ return found;
128
+ }
129
+ getAccessories() {
130
+ const accessories = [...this.accessories.values()];
131
+ return accessories;
132
+ }
133
+ accessoryIdIsValid(accessoryId, response) {
134
+ const patternRegex = new RegExp(SensorUpdateServer.accessoryIdPattern);
135
+ const isValidAccessoryId = ((accessoryId !== undefined) &&
136
+ patternRegex.test(accessoryId));
137
+ if (!isValidAccessoryId) {
138
+ const errorMsg = `Invalid accessory id: ${accessoryId}`;
139
+ this.log.error(`[${this.serverName}] ${errorMsg}`);
140
+ response.status(HttpResponse.BadRequest).send(`${errorMsg}`);
141
+ return false;
142
+ }
143
+ return true;
144
+ }
145
+ humidityIsValid(humidity, response) {
146
+ const humidityPercent = Number(humidity);
147
+ if (isNaN(humidityPercent) || humidityPercent < 0 || humidityPercent > 100) {
148
+ const errorMsg = `Invalid humidity value: ${humidity}. Value must be a percentage`;
149
+ this.log.error(`[${this.serverName}] ${errorMsg}`);
150
+ response.status(HttpResponse.BadRequest).send(`${errorMsg}`);
151
+ return false;
152
+ }
153
+ return true;
154
+ }
155
+ temperatureIsValid(temperature, response) {
156
+ const temperatureDegrees = Number(temperature);
157
+ if (isNaN(temperatureDegrees)) {
158
+ const errorMsg = `Invalid temperature value: ${temperature}. Value must be a number`;
159
+ this.log.error(`[${this.serverName}] ${errorMsg}`);
160
+ response.status(HttpResponse.BadRequest).send(`${errorMsg}`);
161
+ return false;
162
+ }
163
+ return true;
164
+ }
165
+ obstructionIsValid(obstruction, response) {
166
+ if (typeof obstruction !== 'boolean') {
167
+ const errorMsg = `Invalid obstruction value: ${obstruction}. Value must be a boolean`;
168
+ this.log.error(`[${this.serverName}] ${errorMsg}`);
169
+ response.status(HttpResponse.BadRequest).send(`${errorMsg}`);
170
+ return false;
171
+ }
172
+ return true;
173
+ }
174
+ triggerIsValid(trigger, response) {
175
+ if (typeof trigger !== 'boolean') {
176
+ const errorMsg = `Invalid trigger value: ${trigger}. Value must be a boolean`;
177
+ this.log.error(`[${this.serverName}] ${errorMsg}`);
178
+ response.status(HttpResponse.BadRequest).send(`${errorMsg}`);
179
+ return false;
180
+ }
181
+ return true;
182
+ }
183
+ processRequest(accessoryId, accessoryType, value, response) {
184
+ const accessory = this.accessories.get(accessoryId);
185
+ if (accessory !== undefined && accessory.accessoryConfiguration.accessoryType === accessoryType) {
186
+ try {
187
+ if (accessory.updateSensor !== undefined) {
188
+ accessory.updateSensor(value, accessoryId);
189
+ }
190
+ else if (accessory.updateObstruction !== undefined) {
191
+ accessory.updateObstruction(value, accessoryId);
192
+ }
193
+ else if (accessory.triggerSensor !== undefined) {
194
+ accessory.triggerSensor(value, accessoryId);
195
+ }
196
+ else if (accessory instanceof Sensor) {
197
+ const trigger = accessory.getTrigger();
198
+ if (trigger.triggerSensor !== undefined) {
199
+ trigger.triggerSensor(value, accessoryId);
200
+ }
201
+ }
202
+ const message = `Set accessory with id: ${accessoryId} to value: ${value}`;
203
+ this.log.info(`[${this.serverName}] ${message}`);
204
+ response.status(HttpResponse.Ok).send(`${message}`);
205
+ }
206
+ catch (error) {
207
+ let errorMsg = error;
208
+ if (error instanceof SensorValueUpdateNotAllowed) {
209
+ errorMsg = error.message;
210
+ }
211
+ this.log.error(`[${this.serverName}] ${errorMsg}`);
212
+ response.status(HttpResponse.BadRequest).send(`${errorMsg}`);
213
+ }
214
+ }
215
+ else {
216
+ const errorMsg = `No accessory found with type '${accessoryType}' and id '${accessoryId}'`;
217
+ this.log.error(`[${this.serverName}] ${errorMsg}`);
218
+ response.status(HttpResponse.NotFound).send(`${errorMsg}`);
219
+ }
220
+ }
221
+ }
222
+ class HttpResponse {
223
+ static Ok = 200;
224
+ static BadRequest = 400;
225
+ static NotFound = 404;
226
+ }
227
+ //# sourceMappingURL=sensorServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sensorServer.js","sourceRoot":"","sources":["../src/sensorServer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { Characteristic, CharacteristicValue, PlatformAccessory, Service, WithUUID } from 'homebridge';
2
+ import { VirtualAccessoriesPlatform } from '../platform.js';
3
+ import { Accessory } from '../accessories/virtualAccessory.js';
4
+ import { Trigger } from '../triggers/trigger.js';
5
+ /**
6
+ * Platform Accessory
7
+ * An instance of this class is created for each accessory your platform registers
8
+ * Each accessory may expose multiple services of different service types.
9
+ */
10
+ export declare abstract class Sensor extends Accessory {
11
+ static readonly ON: boolean;
12
+ static readonly OFF: boolean;
13
+ static readonly NORMAL_INACTIVE: string;
14
+ static readonly TRIGGERED_ACTIVE: string;
15
+ static readonly NORMAL: number;
16
+ static readonly TRIGGERED: number;
17
+ protected trigger: Trigger | undefined;
18
+ protected eventDetected: WithUUID<{
19
+ new (): Characteristic;
20
+ }>;
21
+ protected states: {
22
+ SensorState: number;
23
+ };
24
+ constructor(platform: VirtualAccessoriesPlatform, accessory: PlatformAccessory);
25
+ getTrigger(): Trigger;
26
+ protected abstract getService(): WithUUID<typeof Service>;
27
+ protected abstract getEventDetectedCharacteristic(): WithUUID<{
28
+ new (): Characteristic;
29
+ }>;
30
+ getEventDetected(): Promise<CharacteristicValue>;
31
+ protected getJsonState(): string;
32
+ static getStateName(state: number): string;
33
+ /**
34
+ * This method is called by this sensor's trigger
35
+ */
36
+ triggerSensorState(sensorState: number, trigger: Trigger, isLoggingDisabled?: boolean): Promise<void>;
37
+ }
@@ -0,0 +1,87 @@
1
+ import { Accessory } from '../accessories/virtualAccessory.js';
2
+ import { AccessoryFactory } from '../accessoryFactory.js';
3
+ import { TriggerNotAllowedError, InvalidSensorValue } from '../errors.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 class Sensor extends Accessory {
10
+ static ON = true;
11
+ static OFF = false;
12
+ static NORMAL_INACTIVE = 'NORMAL-INACTIVE';
13
+ static TRIGGERED_ACTIVE = 'TRIGGERED-ACTIVE';
14
+ static NORMAL = 0;
15
+ static TRIGGERED = 1;
16
+ trigger;
17
+ eventDetected;
18
+ states = {
19
+ SensorState: Sensor.NORMAL,
20
+ };
21
+ constructor(platform, accessory) {
22
+ super(platform, accessory);
23
+ this.eventDetected = this.getEventDetectedCharacteristic();
24
+ const sensorService = this.getService();
25
+ this.service = this.accessory.getService(sensorService) || this.accessory.addService(sensorService);
26
+ this.service.setCharacteristic(this.platform.Characteristic.Name, this.accessoryConfiguration.accessoryName);
27
+ // Update the initial state of the accessory
28
+ this.log.debug(`[${this.accessoryConfiguration.accessoryName}] Setting Sensor Current State: ${Sensor.getStateName(this.states.SensorState)}`);
29
+ this.service.updateCharacteristic(this.eventDetected, (this.states.SensorState));
30
+ // register handlers
31
+ this.service.getCharacteristic(this.eventDetected)
32
+ .onGet(this.getEventDetected.bind(this));
33
+ // Create Trigger
34
+ if (this.accessoryConfiguration.sensor !== undefined && this.accessoryConfiguration.sensor.trigger !== undefined) {
35
+ this.trigger = AccessoryFactory.createTrigger(this, this.accessoryConfiguration.sensor.trigger, this.accessoryConfiguration.accessoryName + ' Trigger');
36
+ }
37
+ }
38
+ getTrigger() {
39
+ return this.trigger;
40
+ }
41
+ // Handlers
42
+ async getEventDetected() {
43
+ const sensorState = this.states.SensorState;
44
+ this.log.debug(`[${this.accessoryConfiguration.accessoryName}] Getting Sensor Current State: ${Sensor.getStateName(sensorState)}`);
45
+ return sensorState;
46
+ }
47
+ getJsonState() {
48
+ return JSON.stringify({});
49
+ }
50
+ static getStateName(state) {
51
+ let sensorStateName;
52
+ switch (state) {
53
+ case undefined: {
54
+ sensorStateName = 'undefined';
55
+ break;
56
+ }
57
+ case Sensor.NORMAL: {
58
+ sensorStateName = Sensor.NORMAL_INACTIVE;
59
+ break;
60
+ }
61
+ case Sensor.TRIGGERED: {
62
+ sensorStateName = Sensor.TRIGGERED_ACTIVE;
63
+ break;
64
+ }
65
+ default: {
66
+ sensorStateName = state.toString();
67
+ }
68
+ }
69
+ return sensorStateName;
70
+ }
71
+ /**
72
+ * This method is called by this sensor's trigger
73
+ */
74
+ async triggerSensorState(sensorState, trigger, isLoggingDisabled = false) {
75
+ if (trigger.sensorConfig.accessoryID !== this.accessoryConfiguration.accessoryID) {
76
+ throw new TriggerNotAllowedError(`Trigger ${trigger.name} is not allowed to trigger this sensor`);
77
+ }
78
+ if (![Sensor.NORMAL, Sensor.TRIGGERED].includes(sensorState)) {
79
+ throw new InvalidSensorValue(`Sensor value ${Sensor.getStateName(sensorState)} is not a valid state`);
80
+ }
81
+ this.states.SensorState = sensorState;
82
+ this.service.updateCharacteristic(this.eventDetected, (this.states.SensorState));
83
+ // eslint-disable-next-line max-len
84
+ this.log.info(`[${this.accessoryConfiguration.accessoryName}] Setting Sensor Current State: ${Sensor.getStateName(this.states.SensorState)}`, isLoggingDisabled);
85
+ }
86
+ }
87
+ //# sourceMappingURL=virtualSensor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtualSensor.js","sourceRoot":"","sources":["../../src/sensors/virtualSensor.ts"],"names":[],"mappings":"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"}
@@ -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 CarbonDioxideSensor extends Sensor {
10
+ static readonly ACCESSORY_TYPE_NAME: string;
11
+ static readonly CO2_LEVELS_NORMAL: number;
12
+ static readonly CO2_LEVELS_ABNORMAL: 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 CarbonDioxideSensor extends Sensor {
8
+ static ACCESSORY_TYPE_NAME = 'CarbonDioxideSensor';
9
+ static CO2_LEVELS_NORMAL = 0; // Characteristic.CarbonDioxideDetected.CO2_LEVELS_NORMAL;
10
+ static CO2_LEVELS_ABNORMAL = 1; // Characteristic.CarbonDioxideDetected.CO2_LEVELS_ABNORMAL;
11
+ constructor(platform, accessory) {
12
+ super(platform, accessory);
13
+ }
14
+ getService() {
15
+ return this.platform.Service.CarbonDioxideSensor;
16
+ }
17
+ getEventDetectedCharacteristic() {
18
+ return this.platform.Characteristic.CarbonDioxideDetected;
19
+ }
20
+ getStateName(state) {
21
+ let sensorStateName;
22
+ switch (state) {
23
+ case undefined: {
24
+ sensorStateName = 'undefined';
25
+ break;
26
+ }
27
+ case CarbonDioxideSensor.CO2_LEVELS_NORMAL: {
28
+ sensorStateName = Sensor.NORMAL_INACTIVE;
29
+ break;
30
+ }
31
+ case CarbonDioxideSensor.CO2_LEVELS_ABNORMAL: {
32
+ sensorStateName = Sensor.TRIGGERED_ACTIVE;
33
+ break;
34
+ }
35
+ default: {
36
+ sensorStateName = state.toString();
37
+ }
38
+ }
39
+ return sensorStateName;
40
+ }
41
+ getAccessoryTypeName() {
42
+ return CarbonDioxideSensor.ACCESSORY_TYPE_NAME;
43
+ }
44
+ }
45
+ //# sourceMappingURL=virtualSensorCarbonDioxide.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtualSensorCarbonDioxide.js","sourceRoot":"","sources":["../../src/sensors/virtualSensorCarbonDioxide.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C;;;;GAIG;AACH,MAAM,OAAO,mBAAoB,SAAQ,MAAM;IAE7C,MAAM,CAAU,mBAAmB,GAAW,qBAAqB,CAAC;IAEpE,MAAM,CAAU,iBAAiB,GAAW,CAAC,CAAC,CAAI,0DAA0D;IAC5G,MAAM,CAAU,mBAAmB,GAAW,CAAC,CAAC,CAAE,4DAA4D;IAE9G,YACE,QAAoC,EACpC,SAA4B;QAE5B,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC7B,CAAC;IAES,UAAU;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,mBAAmB,CAAC;IACnD,CAAC;IAES,8BAA8B;QACtC,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC;IAC5D,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,mBAAmB,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;gBAAC,MAAM;YAAC,CAAC;YAChG,KAAK,mBAAmB,CAAC,mBAAmB,CAAC,CAAC,CAAC;gBAAC,eAAe,GAAG,MAAM,CAAC,gBAAgB,CAAC;gBAAC,MAAM;YAAC,CAAC;YACnG,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,mBAAmB,CAAC,mBAAmB,CAAC;IACjD,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 CarbonMonoxideSensor extends Sensor {
10
+ static readonly ACCESSORY_TYPE_NAME: string;
11
+ static readonly CO_LEVELS_NORMAL: number;
12
+ static readonly CO_LEVELS_ABNORMAL: 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 CarbonMonoxideSensor extends Sensor {
8
+ static ACCESSORY_TYPE_NAME = 'CarbonMonoxideSensor';
9
+ static CO_LEVELS_NORMAL = 0; // Characteristic.CarbonMonoxideDetected.CO_LEVELS_NORMAL;
10
+ static CO_LEVELS_ABNORMAL = 1; // Characteristic.CarbonMonoxideDetected.CO_LEVELS_ABNORMAL;
11
+ constructor(platform, accessory) {
12
+ super(platform, accessory);
13
+ }
14
+ getService() {
15
+ return this.platform.Service.CarbonMonoxideSensor;
16
+ }
17
+ getEventDetectedCharacteristic() {
18
+ return this.platform.Characteristic.CarbonMonoxideDetected;
19
+ }
20
+ getStateName(state) {
21
+ let sensorStateName;
22
+ switch (state) {
23
+ case undefined: {
24
+ sensorStateName = 'undefined';
25
+ break;
26
+ }
27
+ case CarbonMonoxideSensor.CO_LEVELS_NORMAL: {
28
+ sensorStateName = Sensor.NORMAL_INACTIVE;
29
+ break;
30
+ }
31
+ case CarbonMonoxideSensor.CO_LEVELS_ABNORMAL: {
32
+ sensorStateName = Sensor.TRIGGERED_ACTIVE;
33
+ break;
34
+ }
35
+ default: {
36
+ sensorStateName = state.toString();
37
+ }
38
+ }
39
+ return sensorStateName;
40
+ }
41
+ getAccessoryTypeName() {
42
+ return CarbonMonoxideSensor.ACCESSORY_TYPE_NAME;
43
+ }
44
+ }
45
+ //# sourceMappingURL=virtualSensorCarbonMonoxide.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtualSensorCarbonMonoxide.js","sourceRoot":"","sources":["../../src/sensors/virtualSensorCarbonMonoxide.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C;;;;GAIG;AACH,MAAM,OAAO,oBAAqB,SAAQ,MAAM;IAE9C,MAAM,CAAU,mBAAmB,GAAW,sBAAsB,CAAC;IAErE,MAAM,CAAU,gBAAgB,GAAW,CAAC,CAAC,CAAK,0DAA0D;IAC5G,MAAM,CAAU,kBAAkB,GAAW,CAAC,CAAC,CAAG,4DAA4D;IAE9G,YACE,QAAoC,EACpC,SAA4B;QAE5B,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC7B,CAAC;IAES,UAAU;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,oBAAoB,CAAC;IACpD,CAAC;IAES,8BAA8B;QACtC,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,sBAAsB,CAAC;IAC7D,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,oBAAoB,CAAC,gBAAgB,CAAC,CAAC,CAAC;gBAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;gBAAC,MAAM;YAAC,CAAC;YAChG,KAAK,oBAAoB,CAAC,kBAAkB,CAAC,CAAC,CAAC;gBAAC,eAAe,GAAG,MAAM,CAAC,gBAAgB,CAAC;gBAAC,MAAM;YAAC,CAAC;YACnG,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,oBAAoB,CAAC,mBAAmB,CAAC;IAClD,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 ContactSensor extends Sensor {
10
+ static readonly ACCESSORY_TYPE_NAME: string;
11
+ static readonly CONTACT_DETECTED: number;
12
+ static readonly CONTACT_NOT_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 ContactSensor extends Sensor {
8
+ static ACCESSORY_TYPE_NAME = 'ContactSensor';
9
+ static CONTACT_DETECTED = 0; // Characteristic.ContactSensorState.CONTACT_DETECTED;
10
+ static CONTACT_NOT_DETECTED = 1; // Characteristic.ContactSensorState.CONTACT_NOT_DETECTED;
11
+ constructor(platform, accessory) {
12
+ super(platform, accessory);
13
+ }
14
+ getService() {
15
+ return this.platform.Service.ContactSensor;
16
+ }
17
+ getEventDetectedCharacteristic() {
18
+ return this.platform.Characteristic.ContactSensorState;
19
+ }
20
+ getStateName(state) {
21
+ let sensorStateName;
22
+ switch (state) {
23
+ case undefined: {
24
+ sensorStateName = 'undefined';
25
+ break;
26
+ }
27
+ case ContactSensor.CONTACT_DETECTED: {
28
+ sensorStateName = Sensor.NORMAL_INACTIVE;
29
+ break;
30
+ }
31
+ case ContactSensor.CONTACT_NOT_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 ContactSensor.ACCESSORY_TYPE_NAME;
43
+ }
44
+ }
45
+ //# sourceMappingURL=virtualSensorContact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtualSensorContact.js","sourceRoot":"","sources":["../../src/sensors/virtualSensorContact.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C;;;;GAIG;AACH,MAAM,OAAO,aAAc,SAAQ,MAAM;IAEvC,MAAM,CAAU,mBAAmB,GAAW,eAAe,CAAC;IAE9D,MAAM,CAAU,gBAAgB,GAAW,CAAC,CAAC,CAAO,sDAAsD;IAC1G,MAAM,CAAU,oBAAoB,GAAW,CAAC,CAAC,CAAG,0DAA0D;IAE9G,YACE,QAAoC,EACpC,SAA4B;QAE5B,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC7B,CAAC;IAES,UAAU;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC;IAC7C,CAAC;IAES,8BAA8B;QACtC,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,kBAAkB,CAAC;IACzD,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,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAAC;gBAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;gBAAC,MAAM;YAAC,CAAC;YACzF,KAAK,aAAa,CAAC,oBAAoB,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,aAAa,CAAC,mBAAmB,CAAC;IAC3C,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 LeakSensor extends Sensor {
10
+ static readonly ACCESSORY_TYPE_NAME: string;
11
+ static readonly LEAK_NOT_DETECTED: number;
12
+ static readonly LEAK_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
+ }