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,29 @@
1
+ import type { CharacteristicValue, PlatformAccessory, Service, WithUUID } from 'homebridge';
2
+ import { VirtualAccessoriesPlatform } from '../platform.js';
3
+ import { ExternalAccessory } from './externalAccessory.js';
4
+ import { AudioAccessoryConfiguration } from '../configuration/configurationAudioAccessoryConfiguration.js';
5
+ /**
6
+ * AudioAccessory - Abstract accessory
7
+ */
8
+ export declare abstract class AudioAccessory extends ExternalAccessory {
9
+ static readonly INACTIVE: number;
10
+ static readonly ACTIVE: number;
11
+ static readonly MUTED: boolean;
12
+ static readonly UNMUTED: boolean;
13
+ private readonly stateStorageKey;
14
+ private readonly muteStorageKey;
15
+ private readonly volumeStorageKey;
16
+ private audioAccessoryConfiguration;
17
+ private states;
18
+ constructor(platform: VirtualAccessoriesPlatform, accessory: PlatformAccessory);
19
+ setActive(value: CharacteristicValue): Promise<void>;
20
+ getActive(): Promise<CharacteristicValue>;
21
+ setVolume(value: CharacteristicValue): Promise<void>;
22
+ getVolume(): Promise<CharacteristicValue>;
23
+ setMute(value: CharacteristicValue): Promise<void>;
24
+ getMute(): Promise<CharacteristicValue>;
25
+ protected abstract getAudioAccessoryConfiguration(): AudioAccessoryConfiguration;
26
+ protected abstract getAudioAccessoryService(): WithUUID<typeof Service>;
27
+ protected getJsonState(): string;
28
+ static getStateName(state: number): string;
29
+ }
@@ -0,0 +1,119 @@
1
+ import { ExternalAccessory } from './externalAccessory.js';
2
+ /**
3
+ * AudioAccessory - Abstract accessory
4
+ */
5
+ export class AudioAccessory extends ExternalAccessory {
6
+ static INACTIVE = 0; // Characteristic.Active.INACTIVE;
7
+ static ACTIVE = 1; // Characteristic.Active.ACTIVE;
8
+ static MUTED = true; // Characteristic.Mute;
9
+ static UNMUTED = false; // Characteristic.Mute;
10
+ stateStorageKey = 'SpeakerState';
11
+ muteStorageKey = 'SpeakerMuteState';
12
+ volumeStorageKey = 'SpeakerVolume';
13
+ audioAccessoryConfiguration;
14
+ states = {
15
+ Active: AudioAccessory.INACTIVE,
16
+ Mute: AudioAccessory.UNMUTED,
17
+ Volume: 100,
18
+ };
19
+ constructor(platform, accessory) {
20
+ super(platform, accessory);
21
+ // First configure the device based on the accessory details
22
+ this.audioAccessoryConfiguration = this.getAudioAccessoryConfiguration();
23
+ const mute = (this.audioAccessoryConfiguration.mute !== undefined) ? this.audioAccessoryConfiguration.mute : AudioAccessory.UNMUTED;
24
+ const volume = this.audioAccessoryConfiguration.volume;
25
+ this.states.Active = AudioAccessory.INACTIVE;
26
+ this.states.Mute = mute;
27
+ this.states.Volume = volume;
28
+ // If the accessory is stateful retrieve stored state
29
+ if (this.accessoryConfiguration.accessoryIsStateful) {
30
+ const accessoryState = this.loadAccessoryState(this.storagePath);
31
+ const cachedState = accessoryState[this.stateStorageKey];
32
+ const cachedMute = accessoryState[this.muteStorageKey];
33
+ const cachedVolume = accessoryState[this.volumeStorageKey];
34
+ if (cachedState !== undefined) {
35
+ this.states.Active = cachedState;
36
+ }
37
+ if (cachedMute !== undefined) {
38
+ this.states.Mute = cachedMute;
39
+ }
40
+ if (cachedVolume !== undefined) {
41
+ this.states.Volume = cachedVolume;
42
+ }
43
+ }
44
+ // set accessory information
45
+ const service = this.getAudioAccessoryService();
46
+ this.service = this.accessory.getService(service) || this.accessory.addService(service);
47
+ this.service.setCharacteristic(this.platform.Characteristic.Name, this.accessoryConfiguration.accessoryName);
48
+ // register handlers
49
+ this.service.getCharacteristic(this.platform.Characteristic.Active)
50
+ .onSet(this.setActive.bind(this))
51
+ .onGet(this.getActive.bind(this));
52
+ this.service.getCharacteristic(this.platform.Characteristic.Mute)
53
+ .onSet(this.setMute.bind(this))
54
+ .onGet(this.getMute.bind(this));
55
+ this.service.getCharacteristic(this.platform.Characteristic.Volume)
56
+ .onSet(this.setVolume.bind(this))
57
+ .onGet(this.getVolume.bind(this));
58
+ }
59
+ // Handlers
60
+ async setActive(value) {
61
+ this.states.Active = value;
62
+ this.storeState();
63
+ this.log.info(`[${this.accessoryConfiguration.accessoryName}] Setting State: ${AudioAccessory.getStateName(this.states.Active)}`);
64
+ }
65
+ async getActive() {
66
+ const speakerState = this.states.Active;
67
+ this.log.debug(`[${this.accessoryConfiguration.accessoryName}] Getting State: ${AudioAccessory.getStateName(speakerState)}`);
68
+ return speakerState;
69
+ }
70
+ async setVolume(value) {
71
+ this.states.Volume = value;
72
+ this.log.info(`[${this.accessoryConfiguration.accessoryName}] Setting Volume: ${this.states.Volume}`);
73
+ }
74
+ async getVolume() {
75
+ const volume = this.states.Volume;
76
+ this.log.debug(`[${this.accessoryConfiguration.accessoryName}] Getting Volume: ${volume}`);
77
+ return volume;
78
+ }
79
+ async setMute(value) {
80
+ this.states.Mute = value;
81
+ this.log.info(`[${this.accessoryConfiguration.accessoryName}] Setting Mute: ${this.states.Mute}`);
82
+ }
83
+ async getMute() {
84
+ const mute = this.states.Mute;
85
+ this.log.debug(`[${this.accessoryConfiguration.accessoryName}] Getting Mute: ${mute}`);
86
+ return mute;
87
+ }
88
+ getJsonState() {
89
+ const jsonState = {
90
+ [this.stateStorageKey]: this.states.Active,
91
+ [this.muteStorageKey]: this.states.Mute,
92
+ [this.volumeStorageKey]: this.states.Volume,
93
+ };
94
+ const json = JSON.stringify(jsonState);
95
+ return json;
96
+ }
97
+ static getStateName(state) {
98
+ let stateName;
99
+ switch (state) {
100
+ case undefined: {
101
+ stateName = 'undefined';
102
+ break;
103
+ }
104
+ case AudioAccessory.INACTIVE: {
105
+ stateName = 'INACTIVE';
106
+ break;
107
+ }
108
+ case AudioAccessory.ACTIVE: {
109
+ stateName = 'ACTIVE';
110
+ break;
111
+ }
112
+ default: {
113
+ stateName = state.toString();
114
+ }
115
+ }
116
+ return stateName;
117
+ }
118
+ }
119
+ //# sourceMappingURL=audioAccessory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audioAccessory.js","sourceRoot":"","sources":["../../src/accessories/audioAccessory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { PlatformAccessory } from 'homebridge';
2
+ import { VirtualAccessoriesPlatform } from '../platform.js';
3
+ import { Accessory } from './virtualAccessory.js';
4
+ /**
5
+ * ExternalAccessory - Abstract accessory
6
+ */
7
+ export declare abstract class ExternalAccessory extends Accessory {
8
+ constructor(platform: VirtualAccessoriesPlatform, accessory: PlatformAccessory);
9
+ getExternalAccessoryCategory(): number;
10
+ }
@@ -0,0 +1,13 @@
1
+ import { Accessory } from './virtualAccessory.js';
2
+ /**
3
+ * ExternalAccessory - Abstract accessory
4
+ */
5
+ export class ExternalAccessory extends Accessory {
6
+ constructor(platform, accessory) {
7
+ super(platform, accessory);
8
+ }
9
+ getExternalAccessoryCategory() {
10
+ return this.accessory.category;
11
+ }
12
+ }
13
+ //# sourceMappingURL=externalAccessory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"externalAccessory.js","sourceRoot":"","sources":["../../src/accessories/externalAccessory.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD;;GAEG;AACH,MAAM,OAAgB,iBAAkB,SAAQ,SAAS;IAEvD,YACE,QAAoC,EACpC,SAA4B;QAE5B,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC7B,CAAC;IAED,4BAA4B;QAC1B,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;IACjC,CAAC;CACF"}
@@ -0,0 +1,35 @@
1
+ import { CharacteristicValue, PlatformAccessory, Service, WithUUID } from 'homebridge';
2
+ import { VirtualAccessoriesPlatform } from '../platform.js';
3
+ import { Accessory } from './virtualAccessory.js';
4
+ import { OpenableAccessoryConfiguration } from '../configuration/configurationOpenableAccesory.js';
5
+ /**
6
+ * OpeningAccessory - Abstract accessory
7
+ */
8
+ export declare abstract class OpeningAccessory extends Accessory {
9
+ static readonly CLOSED: number;
10
+ static readonly OPEN: number;
11
+ static readonly DECREASING: number;
12
+ static readonly INCREASING: number;
13
+ static readonly STOPPED: number;
14
+ private static readonly MIN_TIMEOUT_SECS;
15
+ private static readonly DEFAULT_TIMEOUT_SECS;
16
+ private readonly stateStorageKey;
17
+ private transitionTimer;
18
+ private transitionSteps;
19
+ private openingAccessoryConfiguration;
20
+ protected states: {
21
+ TargetPosition: number;
22
+ CurrentPosition: number;
23
+ PositionState: number;
24
+ };
25
+ constructor(platform: VirtualAccessoriesPlatform, accessory: PlatformAccessory);
26
+ getCurrentPosition(): Promise<CharacteristicValue>;
27
+ setTargetPosition(value: CharacteristicValue): Promise<void>;
28
+ getTargetPosition(): Promise<CharacteristicValue>;
29
+ getPositionState(): Promise<CharacteristicValue>;
30
+ protected abstract getOpeningAccessoryConfiguration(): OpenableAccessoryConfiguration;
31
+ protected abstract getOpeningAccessoryService(): WithUUID<typeof Service>;
32
+ protected getJsonState(): string;
33
+ static getStateName(position: number): string;
34
+ static getPositionName(state: number): string;
35
+ }
@@ -0,0 +1,166 @@
1
+ import { Accessory } from './virtualAccessory.js';
2
+ import { Timer } from '../timer.js';
3
+ /**
4
+ * OpeningAccessory - Abstract accessory
5
+ */
6
+ export class OpeningAccessory extends Accessory {
7
+ static CLOSED = 0; // 0%
8
+ static OPEN = 100; // 100%
9
+ static DECREASING = 0; // Characteristic.PositionState.DECREASING; -> CLOSING
10
+ static INCREASING = 1; // Characteristic.PositionState.INCREASING; -> OPENING
11
+ static STOPPED = 2; // Characteristic.PositionState.STOPPED; -> OPEN or CLOSED
12
+ static MIN_TIMEOUT_SECS = 1;
13
+ static DEFAULT_TIMEOUT_SECS = 3;
14
+ stateStorageKey = 'Position';
15
+ transitionTimer;
16
+ transitionSteps = 0;
17
+ openingAccessoryConfiguration;
18
+ states = {
19
+ TargetPosition: OpeningAccessory.CLOSED, // %
20
+ CurrentPosition: OpeningAccessory.CLOSED, // %
21
+ PositionState: OpeningAccessory.STOPPED,
22
+ };
23
+ constructor(platform, accessory) {
24
+ super(platform, accessory);
25
+ // First configure the device based on the accessory details
26
+ this.openingAccessoryConfiguration = this.getOpeningAccessoryConfiguration();
27
+ this.defaultState = this.openingAccessoryConfiguration.defaultState === 'open' ? OpeningAccessory.OPEN : OpeningAccessory.CLOSED;
28
+ this.states.CurrentPosition = this.defaultState;
29
+ // If the accessory is stateful retrieve stored state
30
+ if (this.accessoryConfiguration.accessoryIsStateful) {
31
+ const accessoryState = this.loadAccessoryState(this.storagePath);
32
+ const cachedState = accessoryState[this.stateStorageKey];
33
+ if (cachedState !== undefined) {
34
+ this.states.CurrentPosition = cachedState;
35
+ }
36
+ }
37
+ this.states.TargetPosition = this.states.CurrentPosition;
38
+ // Timer is resettable
39
+ const timerIsResettable = true;
40
+ this.transitionTimer = new Timer(this.accessoryConfiguration.accessoryName, this.log, timerIsResettable);
41
+ // set accessory information
42
+ const service = this.getOpeningAccessoryService();
43
+ this.service = this.accessory.getService(service) || this.accessory.addService(service);
44
+ this.service.setCharacteristic(this.platform.Characteristic.Name, this.accessoryConfiguration.accessoryName);
45
+ // Update the initial state of the accessory
46
+ // eslint-disable-next-line max-len
47
+ this.log.debug(`[${this.accessoryConfiguration.accessoryName}] Setting Window Covering Current Position: ${OpeningAccessory.getStateName(this.states.CurrentPosition)}`);
48
+ this.service.updateCharacteristic(this.platform.Characteristic.CurrentPosition, (this.states.CurrentPosition));
49
+ this.service.updateCharacteristic(this.platform.Characteristic.TargetPosition, (this.states.TargetPosition));
50
+ this.service.updateCharacteristic(this.platform.Characteristic.PositionState, (this.states.PositionState));
51
+ // register handlers
52
+ this.service.getCharacteristic(this.platform.Characteristic.CurrentPosition)
53
+ .onGet(this.getCurrentPosition.bind(this));
54
+ this.service.getCharacteristic(this.platform.Characteristic.TargetPosition)
55
+ .onSet(this.setTargetPosition.bind(this))
56
+ .onGet(this.getTargetPosition.bind(this));
57
+ this.service.getCharacteristic(this.platform.Characteristic.PositionState)
58
+ .onGet(this.getPositionState.bind(this));
59
+ }
60
+ // Handlers
61
+ async getCurrentPosition() {
62
+ // If timer is running, then blinds are moving, so calculate the interim position
63
+ if (this.transitionTimer.isTimerRunning()) {
64
+ const runtimeMillis = this.transitionTimer.getRuntime() * 1000;
65
+ const remainingSteps = Math.ceil(this.transitionTimer.getRemainingDurationMillis() / runtimeMillis * this.transitionSteps);
66
+ this.states.CurrentPosition = this.states.TargetPosition - remainingSteps;
67
+ }
68
+ const currentPosition = this.states.CurrentPosition;
69
+ this.log.debug(`[${this.accessoryConfiguration.accessoryName}] Getting Current Position: ${OpeningAccessory.getStateName(currentPosition)}`);
70
+ return currentPosition;
71
+ }
72
+ async setTargetPosition(value) {
73
+ this.states.TargetPosition = value;
74
+ this.log.info(`[${this.accessoryConfiguration.accessoryName}] Setting Target Position: ${OpeningAccessory.getStateName(this.states.TargetPosition)}`);
75
+ this.states.PositionState = (this.states.TargetPosition > this.states.CurrentPosition) ? OpeningAccessory.INCREASING : OpeningAccessory.DECREASING;
76
+ this.service.setCharacteristic(this.platform.Characteristic.PositionState, (this.states.PositionState));
77
+ this.log.info(`[${this.accessoryConfiguration.accessoryName}] Setting Position State: ${OpeningAccessory.getPositionName(this.states.PositionState)}`);
78
+ const transitionDuration = this.openingAccessoryConfiguration.transitionDuration;
79
+ const transitionDelay = (transitionDuration ? transitionDuration : OpeningAccessory.DEFAULT_TIMEOUT_SECS);
80
+ this.transitionSteps = this.states.TargetPosition - this.states.CurrentPosition;
81
+ this.log.debug(`[${this.accessoryConfiguration.accessoryName}] Transition Steps: ${this.transitionSteps}`);
82
+ const proportionalTransitionDelay = Math.max(
83
+ // Round up to the nearest second
84
+ Math.ceil(transitionDelay / 100 * Math.abs(this.transitionSteps)), OpeningAccessory.MIN_TIMEOUT_SECS);
85
+ this.log.debug(`[${this.accessoryConfiguration.accessoryName}] Proportional Delay: ${proportionalTransitionDelay}/(${transitionDelay})`);
86
+ const updateIntervalMillis = 100;
87
+ // Stop transition timer, if running
88
+ this.transitionTimer.stop();
89
+ this.transitionTimer.start(() => {
90
+ this.states.PositionState = OpeningAccessory.STOPPED;
91
+ this.service.setCharacteristic(this.platform.Characteristic.PositionState, (this.states.PositionState));
92
+ this.log.info(`[${this.accessoryConfiguration.accessoryName}] Setting Position State: ${OpeningAccessory.getPositionName(this.states.PositionState)}`);
93
+ this.states.CurrentPosition = this.states.TargetPosition;
94
+ this.service.setCharacteristic(this.platform.Characteristic.CurrentPosition, (this.states.CurrentPosition));
95
+ this.transitionSteps = 0;
96
+ this.storeState();
97
+ this.log.info(`[${this.accessoryConfiguration.accessoryName}] Setting Current Position: ${OpeningAccessory.getStateName(this.states.CurrentPosition)}`);
98
+ }, proportionalTransitionDelay, updateIntervalMillis);
99
+ }
100
+ async getTargetPosition() {
101
+ const targetPosition = this.states.TargetPosition;
102
+ this.log.debug(`[${this.accessoryConfiguration.accessoryName}] Getting Target Position: ${OpeningAccessory.getStateName(targetPosition)}`);
103
+ return targetPosition;
104
+ }
105
+ async getPositionState() {
106
+ const positionState = this.states.PositionState;
107
+ this.log.debug(`[${this.accessoryConfiguration.accessoryName}] Getting Position State: ${OpeningAccessory.getPositionName(positionState)}`);
108
+ return positionState;
109
+ }
110
+ getJsonState() {
111
+ const json = JSON.stringify({
112
+ [this.stateStorageKey]: this.states.CurrentPosition,
113
+ });
114
+ return json;
115
+ }
116
+ static getStateName(position) {
117
+ let positionName;
118
+ switch (position) {
119
+ case undefined: {
120
+ positionName = 'undefined';
121
+ break;
122
+ }
123
+ case OpeningAccessory.CLOSED: {
124
+ positionName = 'CLOSED';
125
+ break;
126
+ }
127
+ case OpeningAccessory.OPEN: {
128
+ positionName = 'OPEN';
129
+ break;
130
+ }
131
+ default: {
132
+ positionName = `POSITION: ${position.toString()}%`;
133
+ }
134
+ }
135
+ if (position > OpeningAccessory.OPEN) {
136
+ positionName = `INVALID ${positionName}%`;
137
+ }
138
+ return positionName;
139
+ }
140
+ static getPositionName(state) {
141
+ let stateName;
142
+ switch (state) {
143
+ case undefined: {
144
+ stateName = 'undefined';
145
+ break;
146
+ }
147
+ case OpeningAccessory.DECREASING: {
148
+ stateName = 'DECREASING';
149
+ break;
150
+ }
151
+ case OpeningAccessory.INCREASING: {
152
+ stateName = 'INCREASING';
153
+ break;
154
+ }
155
+ case OpeningAccessory.STOPPED: {
156
+ stateName = 'STOPPED';
157
+ break;
158
+ }
159
+ default: {
160
+ stateName = state.toString();
161
+ }
162
+ }
163
+ return stateName;
164
+ }
165
+ }
166
+ //# sourceMappingURL=openingAccessory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openingAccessory.js","sourceRoot":"","sources":["../../src/accessories/openingAccessory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Accessory } from './virtualAccessory.js';
2
+ /**
3
+ *
4
+ */
5
+ export interface TriggerableEventAccessory {
6
+ triggerEvent(companionAccessory: Accessory): any;
7
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=triggerableEventAccessory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triggerableEventAccessory.js","sourceRoot":"","sources":["../../src/accessories/triggerableEventAccessory.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ import type { PlatformAccessory, Service } from 'homebridge';
2
+ import { VirtualAccessoriesPlatform } from '../platform.js';
3
+ import { PlatformConfiguration } from '../configuration/configurationPlatform.js';
4
+ import { VirtualAccessoriesLogger } from '../virtualLogger.js';
5
+ /**
6
+ * Abstract Accessory
7
+ */
8
+ export declare abstract class Accessory {
9
+ service?: Service;
10
+ readonly platform: VirtualAccessoriesPlatform;
11
+ readonly accessory: PlatformAccessory;
12
+ readonly accessoryConfiguration: PlatformConfiguration;
13
+ readonly log: VirtualAccessoriesLogger;
14
+ protected accessoryName: string;
15
+ protected defaultState: any;
16
+ protected storagePath: string;
17
+ private accessoryInformationService?;
18
+ constructor(platform: VirtualAccessoriesPlatform, accessory: PlatformAccessory);
19
+ isExternalAccessory(): boolean;
20
+ updateConfiguredName(): void;
21
+ private readonly EMPTY_ACCESSORY_STATE;
22
+ protected isEmptyAccessoryState(json: any): boolean;
23
+ protected loadAccessoryState(storagePath: string): any;
24
+ private saveAccessoryState;
25
+ protected deleteAccessoryState(storagePath: string): void;
26
+ protected storeState(): void;
27
+ protected abstract getAccessoryTypeName(): string;
28
+ protected abstract getJsonState(): string;
29
+ }
@@ -0,0 +1,86 @@
1
+ import fs from 'fs';
2
+ /**
3
+ * Abstract Accessory
4
+ */
5
+ export class Accessory {
6
+ service;
7
+ platform;
8
+ accessory;
9
+ accessoryConfiguration;
10
+ log;
11
+ accessoryName = '';
12
+ defaultState;
13
+ storagePath;
14
+ accessoryInformationService;
15
+ constructor(platform, accessory) {
16
+ this.accessory = accessory;
17
+ this.platform = platform;
18
+ // The accessory configuration is stored in the context in VirtualAccessoryPlatform.discoverDevices()
19
+ this.accessoryConfiguration = accessory.context.deviceConfiguration;
20
+ this.accessoryName = this.accessoryConfiguration.accessoryName;
21
+ this.log = this.platform.log;
22
+ this.log.debug(`[${this.accessoryName}] Accessory context: ${JSON.stringify(accessory.context)}`);
23
+ this.storagePath = accessory.context.storagePath;
24
+ if (!this.accessoryConfiguration.accessoryIsStateful) {
25
+ this.deleteAccessoryState(this.storagePath);
26
+ }
27
+ // set accessory information
28
+ this.accessoryInformationService = this.accessory.getService(this.platform.Service.AccessoryInformation);
29
+ this.accessoryInformationService
30
+ .setCharacteristic(this.platform.Characteristic.Manufacturer, 'Virtual Accessories for Homebridge')
31
+ .setCharacteristic(this.platform.Characteristic.Model, `Virtual Accessory - ${this.getAccessoryTypeName()}`)
32
+ .setCharacteristic(this.platform.Characteristic.SerialNumber, this.accessory.UUID)
33
+ .setCharacteristic(this.platform.Characteristic.Name, this.accessoryConfiguration.accessoryName);
34
+ }
35
+ isExternalAccessory() {
36
+ return [26 /* Categories.SPEAKER */, 31 /* Categories.TELEVISION */].includes(this.accessory.category);
37
+ }
38
+ updateConfiguredName() {
39
+ const configuredName = this.accessoryInformationService.getCharacteristic(this.platform.Characteristic.ConfiguredName);
40
+ if (configuredName !== undefined) {
41
+ this.accessoryInformationService.removeCharacteristic(configuredName);
42
+ }
43
+ }
44
+ EMPTY_ACCESSORY_STATE = '{}';
45
+ isEmptyAccessoryState(json) {
46
+ return JSON.stringify(json) === this.EMPTY_ACCESSORY_STATE;
47
+ }
48
+ loadAccessoryState(storagePath) {
49
+ let contents = this.EMPTY_ACCESSORY_STATE;
50
+ if (fs.existsSync(storagePath)) {
51
+ contents = fs.readFileSync(storagePath, 'utf8');
52
+ }
53
+ const json = JSON.parse(contents);
54
+ this.log.debug(`[${this.accessoryName}] Loading state: ${JSON.stringify(json)}`);
55
+ return json;
56
+ }
57
+ saveAccessoryState(storagePath, stateJson) {
58
+ // Overwrite the existing persistence file
59
+ this.log.debug(`[${this.accessoryName}] Saving state: ${stateJson}`);
60
+ try {
61
+ fs.writeFileSync(storagePath, stateJson, { encoding: 'utf8', flag: 'w' });
62
+ this.log.debug(`[${this.accessoryName}] Saved state: ${stateJson}`);
63
+ }
64
+ catch (error) {
65
+ this.log.error(`[${this.accessoryName}] Error saving state: ${error}`);
66
+ }
67
+ }
68
+ deleteAccessoryState(storagePath) {
69
+ this.log.debug(`[${this.accessoryName}] Deleting state file ${storagePath}`);
70
+ if (fs.existsSync(storagePath)) {
71
+ try {
72
+ fs.unlinkSync(storagePath);
73
+ }
74
+ catch (err) {
75
+ this.log.error(`[${this.accessoryName}] Error deleting state file ${storagePath}`);
76
+ }
77
+ }
78
+ }
79
+ // Store device state if stateful
80
+ storeState() {
81
+ if (this.accessoryConfiguration.accessoryIsStateful) {
82
+ this.saveAccessoryState(this.storagePath, this.getJsonState());
83
+ }
84
+ }
85
+ }
86
+ //# sourceMappingURL=virtualAccessory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtualAccessory.js","sourceRoot":"","sources":["../../src/accessories/virtualAccessory.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB;;GAEG;AACH,MAAM,OAAgB,SAAS;IAC7B,OAAO,CAAW;IAET,QAAQ,CAA6B;IACrC,SAAS,CAAoB;IAE7B,sBAAsB,CAAwB;IAC9C,GAAG,CAA2B;IAE7B,aAAa,GAAW,EAAE,CAAC;IAE3B,YAAY,CAAC;IAEb,WAAW,CAAS;IAEtB,2BAA2B,CAAW;IAE9C,YACE,QAAoC,EACpC,SAA4B;QAE5B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAEzB,qGAAqG;QACrG,IAAI,CAAC,sBAAsB,GAAG,SAAS,CAAC,OAAO,CAAC,mBAAmB,CAAC;QACpE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC;QAC/D,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAE7B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,aAAa,wBAAwB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAElG,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC;QAEjD,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,mBAAmB,EAAE,CAAC;YACrD,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC9C,CAAC;QAED,4BAA4B;QAC5B,IAAI,CAAC,2BAA2B,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QACzG,IAAI,CAAC,2BAA4B;aAC9B,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,YAAY,EAAE,oCAAoC,CAAC;aAClG,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,EAAE,uBAAuB,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC;aAC3G,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;aACjF,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC,CAAC;IACrG,CAAC;IAED,mBAAmB;QACjB,OAAO,6DAA2C,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACvF,CAAC;IAED,oBAAoB;QAClB,MAAM,cAAc,GAAG,IAAI,CAAC,2BAA4B,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;QACxH,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,2BAA4B,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAEgB,qBAAqB,GAAG,IAAI,CAAC;IAEpC,qBAAqB,CAAC,IAAS;QACvC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,qBAAqB,CAAC;IAC7D,CAAC;IAES,kBAAkB,CAC1B,WAAmB;QAEnB,IAAI,QAAQ,GAAG,IAAI,CAAC,qBAAqB,CAAC;QAC1C,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/B,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAElC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,aAAa,oBAAoB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjF,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,kBAAkB,CACxB,WAAmB,EACnB,SAAiB;QAEjB,0CAA0C;QAC1C,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,aAAa,mBAAmB,SAAS,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC;YACH,EAAE,CAAC,aAAa,CACd,WAAW,EACX,SAAS,EACT,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAChC,CAAC;YAEF,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,aAAa,kBAAkB,SAAS,EAAE,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,aAAa,yBAAyB,KAAK,EAAE,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAES,oBAAoB,CAC5B,WAAmB;QAEnB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,aAAa,yBAAyB,WAAW,EAAE,CAAC,CAAC;QAC7E,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YAC7B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,aAAa,+BAA+B,WAAW,EAAE,CAAC,CAAC;YACrF,CAAC;QACH,CAAC;IACH,CAAC;IAED,iCAAiC;IACvB,UAAU;QAClB,IAAI,IAAI,CAAC,sBAAsB,CAAC,mBAAmB,EAAE,CAAC;YACpD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;CAKF"}
@@ -0,0 +1,14 @@
1
+ import type { PlatformAccessory, Service, WithUUID } from 'homebridge';
2
+ import { VirtualAccessoriesPlatform } from '../platform.js';
3
+ import { OpeningAccessory } from './openingAccessory.js';
4
+ import { OpenableAccessoryConfiguration } from '../configuration/configurationOpenableAccesory.js';
5
+ /**
6
+ * Door - Accessory implementation
7
+ */
8
+ export declare class Door extends OpeningAccessory {
9
+ static readonly ACCESSORY_TYPE_NAME: string;
10
+ constructor(platform: VirtualAccessoriesPlatform, accessory: PlatformAccessory);
11
+ protected getOpeningAccessoryConfiguration(): OpenableAccessoryConfiguration;
12
+ protected getOpeningAccessoryService(): WithUUID<typeof Service>;
13
+ protected getAccessoryTypeName(): string;
14
+ }
@@ -0,0 +1,20 @@
1
+ import { OpeningAccessory } from './openingAccessory.js';
2
+ /**
3
+ * Door - Accessory implementation
4
+ */
5
+ export class Door extends OpeningAccessory {
6
+ static ACCESSORY_TYPE_NAME = 'Door';
7
+ constructor(platform, accessory) {
8
+ super(platform, accessory);
9
+ }
10
+ getOpeningAccessoryConfiguration() {
11
+ return this.accessoryConfiguration.door;
12
+ }
13
+ getOpeningAccessoryService() {
14
+ return this.platform.Service.Door;
15
+ }
16
+ getAccessoryTypeName() {
17
+ return Door.ACCESSORY_TYPE_NAME;
18
+ }
19
+ }
20
+ //# sourceMappingURL=virtualAccessoryDoor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtualAccessoryDoor.js","sourceRoot":"","sources":["../../src/accessories/virtualAccessoryDoor.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD;;GAEG;AACH,MAAM,OAAO,IAAK,SAAQ,gBAAgB;IAExC,MAAM,CAAU,mBAAmB,GAAW,MAAM,CAAC;IAErD,YACE,QAAoC,EACpC,SAA4B;QAE5B,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC7B,CAAC;IAES,gCAAgC;QACxC,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC;IAC1C,CAAC;IAES,0BAA0B;QAClC,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;IACpC,CAAC;IAES,oBAAoB;QAC5B,OAAO,IAAI,CAAC,mBAAmB,CAAC;IAClC,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { CharacteristicValue, PlatformAccessory } from 'homebridge';
2
+ import { VirtualAccessoriesPlatform } from '../platform.js';
3
+ import { Accessory } from './virtualAccessory.js';
4
+ import { TriggerableEventAccessory } from './triggerableEventAccessory.js';
5
+ /**
6
+ * Doorbell - Accessory implementation
7
+ */
8
+ export declare class Doorbell extends Accessory implements TriggerableEventAccessory {
9
+ static readonly ACCESSORY_TYPE_NAME: string;
10
+ static readonly SINGLE_PRESS: number;
11
+ static readonly DOUBLE_PRESS: number;
12
+ static readonly LONG_PRESS: number;
13
+ private static readonly COMPANION_TIMER_RESET;
14
+ private companionSensorResetTimerId;
15
+ private states;
16
+ private companionSwitch?;
17
+ constructor(platform: VirtualAccessoriesPlatform, accessory: PlatformAccessory);
18
+ getProgrammableSwitchEvent(): Promise<CharacteristicValue>;
19
+ setVolume(value: CharacteristicValue): Promise<void>;
20
+ getVolume(): Promise<CharacteristicValue>;
21
+ /**
22
+ * This method is called by the comoanion switch to ring the doorbell
23
+ */
24
+ triggerEvent(companionAccessory: Accessory): Promise<void>;
25
+ protected getJsonState(): string;
26
+ protected getAccessoryTypeName(): string;
27
+ static getEventName(event: number): string;
28
+ private createCompanionSwitch;
29
+ }