homebridge-dummy 1.1.0-beta.0 → 1.1.0-beta.10

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 (61) hide show
  1. package/CHANGELOG.md +24 -14
  2. package/README.md +84 -19
  3. package/config.schema.json +263 -98
  4. package/dist/accessory/base.d.ts +8 -4
  5. package/dist/accessory/base.js +26 -18
  6. package/dist/accessory/base.js.map +1 -1
  7. package/dist/accessory/helpers.js +3 -0
  8. package/dist/accessory/helpers.js.map +1 -1
  9. package/dist/accessory/lock.d.ts +2 -1
  10. package/dist/accessory/lock.js +23 -5
  11. package/dist/accessory/lock.js.map +1 -1
  12. package/dist/accessory/onoff/lightbulb.d.ts +2 -2
  13. package/dist/accessory/onoff/lightbulb.js +5 -0
  14. package/dist/accessory/onoff/lightbulb.js.map +1 -1
  15. package/dist/accessory/onoff/onoff.d.ts +4 -4
  16. package/dist/accessory/onoff/onoff.js +24 -8
  17. package/dist/accessory/onoff/onoff.js.map +1 -1
  18. package/dist/accessory/position/position.d.ts +2 -1
  19. package/dist/accessory/position/position.js +22 -4
  20. package/dist/accessory/position/position.js.map +1 -1
  21. package/dist/accessory/sensor.d.ts +11 -11
  22. package/dist/accessory/sensor.js +44 -30
  23. package/dist/accessory/sensor.js.map +1 -1
  24. package/dist/accessory/thermostat.d.ts +28 -0
  25. package/dist/accessory/thermostat.js +151 -0
  26. package/dist/accessory/thermostat.js.map +1 -0
  27. package/dist/homebridge-ui/public/index.html +2 -2
  28. package/dist/homebridge-ui/public/ui.js +1 -1
  29. package/dist/i18n/en.d.ts +37 -2
  30. package/dist/i18n/en.js +44 -9
  31. package/dist/i18n/en.js.map +1 -1
  32. package/dist/i18n/i18n.d.ts +37 -2
  33. package/dist/i18n/template.d.ts +37 -2
  34. package/dist/i18n/zz.d.ts +37 -2
  35. package/dist/model/types.d.ts +37 -1
  36. package/dist/model/types.js +19 -0
  37. package/dist/model/types.js.map +1 -1
  38. package/dist/timeout/schedule.d.ts +14 -0
  39. package/dist/timeout/schedule.js +68 -0
  40. package/dist/timeout/schedule.js.map +1 -0
  41. package/dist/timeout/timeout.d.ts +23 -0
  42. package/dist/timeout/timeout.js +91 -0
  43. package/dist/timeout/timeout.js.map +1 -0
  44. package/dist/timeout/timer.d.ts +10 -0
  45. package/dist/timeout/timer.js +29 -0
  46. package/dist/timeout/timer.js.map +1 -0
  47. package/dist/tools/configMigration.js +2 -2
  48. package/dist/tools/configMigration.js.map +1 -1
  49. package/dist/tools/storage.d.ts +1 -0
  50. package/dist/tools/storage.js +1 -0
  51. package/dist/tools/storage.js.map +1 -1
  52. package/dist/tools/temperature.d.ts +3 -0
  53. package/dist/tools/temperature.js +14 -0
  54. package/dist/tools/temperature.js.map +1 -0
  55. package/dist/tools/validation.d.ts +2 -0
  56. package/dist/tools/validation.js +7 -0
  57. package/dist/tools/validation.js.map +1 -1
  58. package/package.json +21 -3
  59. package/dist/model/timer.d.ts +0 -12
  60. package/dist/model/timer.js +0 -62
  61. package/dist/model/timer.js.map +0 -1
@@ -7,24 +7,70 @@
7
7
  "schema": {
8
8
  "type": "object",
9
9
  "definitions": {
10
+ "units": {
11
+ "type": "string",
12
+ "title": "${config.title.units}",
13
+ "enum": [ "MILLISECONDS", "SECONDS", "MINUTES", "HOURS"],
14
+ "enumNames": ["${config.enumNames.milliseconds}", "${config.enumNames.seconds}", "${config.enumNames.minutes}", "${config.enumNames.hours}"]
15
+ },
16
+ "sensor": {
17
+ "type": "object",
18
+ "properties": {
19
+ "type": {
20
+ "type": "string",
21
+ "title": "${config.title.sensor}",
22
+ "enum": ["CarbonDioxideSensor", "CarbonMonoxideSensor", "ContactSensor", "LeakSensor", "MotionSensor", "OccupancySensor", "SmokeSensor"],
23
+ "enumNames": ["${config.enumNames.carbonDioxideSensor}", "${config.enumNames.carbonMonoxideSensor}", "${config.enumNames.contactSensor}", "${config.enumNames.leakSensor}", "${config.enumNames.motionSensor}", "${config.enumNames.occupancySensor}", "${config.enumNames.smokeSensor}"]
24
+ },
25
+ "timerControlled": {
26
+ "type": "boolean",
27
+ "title": "${config.title.timerControlled}",
28
+ "description": "${config.description.timerControlled}"
29
+ }
30
+ }
31
+ },
10
32
  "timer": {
11
33
  "type": "object",
12
34
  "properties": {
13
35
  "delay": {
14
36
  "type": "integer",
15
- "title": "${config.title.delay}",
37
+ "title": "${config.title.delay}",
16
38
  "minimum": 1
17
39
  },
18
- "units": {
40
+ "units": { "$ref": "#/definitions/units" },
41
+ "random": {
42
+ "type": "boolean",
43
+ "title": "${config.title.random}",
44
+ "description": "${config.description.random}"
45
+ }
46
+ }
47
+ },
48
+ "schedule": {
49
+ "type": "object",
50
+ "properties": {
51
+ "type": {
19
52
  "type": "string",
20
- "title": "${config.title.units}",
21
- "enum": [ "SECONDS", "MINUTES", "HOURS"],
22
- "enumNames": ["${config.enumNames.seconds}", "${config.enumNames.minutes}", "${config.enumNames.hours}"]
53
+ "title": "${config.title.type}",
54
+ "enum": [ "INTERVAL", "CRON"],
55
+ "enumNames": ["${config.enumNames.interval}", "${config.enumNames.cron}"]
56
+ },
57
+ "interval": {
58
+ "type": "integer",
59
+ "title": "${config.title.interval}",
60
+ "minimum": 1
23
61
  },
62
+ "units": { "$ref": "#/definitions/units" },
24
63
  "random": {
25
64
  "type": "boolean",
26
65
  "title": "${config.title.random}",
27
66
  "description": "${config.description.random}"
67
+ },
68
+ "cron": {
69
+ "type": "string",
70
+ "title": "${config.title.cron}",
71
+ "description": "${config.description.cron}",
72
+ "placeholder": "* * * * * *",
73
+ "minimum": 1
28
74
  }
29
75
  }
30
76
  }
@@ -49,20 +95,22 @@
49
95
  },
50
96
  "type": {
51
97
  "type": "string",
52
- "title": "${config.title.type}",
53
- "enum": ["Door", "Lightbulb", "LockMechanism", "Outlet", "Switch", "Window", "WindowCovering"],
54
- "enumNames": ["${config.enumNames.door}", "${config.enumNames.lightbulb}", "${config.enumNames.lockMechanism}", "${config.enumNames.outlet}", "${config.enumNames.switch}", "${config.enumNames.window}", "${config.enumNames.windowCovering}"]
98
+ "title": "${config.title.type}",
99
+ "enum": ["Door", "Lightbulb", "LockMechanism", "Outlet", "Switch", "Thermostat", "Window", "WindowCovering"],
100
+ "enumNames": ["${config.enumNames.door}", "${config.enumNames.lightbulb}", "${config.enumNames.lockMechanism}", "${config.enumNames.outlet}", "${config.enumNames.switch}", "${config.enumNames.thermostat}", "${config.enumNames.window}", "${config.enumNames.windowCovering}"]
55
101
  },
56
102
  "groupName": {
57
103
  "type": "string",
58
104
  "title": "${config.title.groupName}"
59
105
  },
106
+ "sensor": { "$ref": "#/definitions/sensor" },
60
107
  "timer": { "$ref": "#/definitions/timer" },
61
- "sensor": {
108
+ "schedule": { "$ref": "#/definitions/schedule" },
109
+ "temperatureUnits": {
62
110
  "type": "string",
63
- "title": "${config.title.sensor}",
64
- "enum": ["CarbonDioxideSensor", "CarbonMonoxideSensor", "ContactSensor", "LeakSensor", "MotionSensor", "OccupancySensor", "SmokeSensor"],
65
- "enumNames": ["${config.enumNames.carbonDioxideSensor}", "${config.enumNames.carbonMonoxideSensor}", "${config.enumNames.contactSensor}", "${config.enumNames.leakSensor}", "${config.enumNames.motionSensor}", "${config.enumNames.occupancySensor}", "${config.enumNames.smokeSensor}"]
111
+ "title": "${config.title.units}",
112
+ "enum": ["C", "F"],
113
+ "enumNames": ["${config.enumNames.celsius}", "${config.enumNames.fahrenheit}"]
66
114
  },
67
115
  "defaultBrightness": {
68
116
  "type": "number",
@@ -88,6 +136,16 @@
88
136
  "enum": ["open", "closed"],
89
137
  "enumNames": ["${config.enumNames.open}", "${config.enumNames.closed}"]
90
138
  },
139
+ "defaultThermostatState": {
140
+ "type": "string",
141
+ "title": "${config.title.defaultState}",
142
+ "enum": ["auto", "heat", "cool", "off"],
143
+ "enumNames": ["${config.enumNames.auto}", "${config.enumNames.heat}", "${config.enumNames.cool}", "${config.enumNames.off}"]
144
+ },
145
+ "defaultTemperature": {
146
+ "type": "number",
147
+ "title": "${config.title.defaultTemperature}"
148
+ },
91
149
  "commandOn": {
92
150
  "type": "string",
93
151
  "title": "${config.title.commandOn}"
@@ -112,16 +170,20 @@
112
170
  "type": "string",
113
171
  "title": "${config.title.commandClose}"
114
172
  },
173
+ "commandTemperature": {
174
+ "type": "string",
175
+ "title": "${config.title.commandTemperature}"
176
+ },
115
177
  "resetOnRestart": {
116
178
  "type": "boolean",
117
179
  "title": "${config.title.resetOnRestart}"
118
180
  },
119
181
  "disableLogging": {
120
- "title": "${config.title.disableLogging}",
121
- "type": "boolean"
182
+ "type": "boolean",
183
+ "title": "${config.title.disableLogging}"
122
184
  }
123
185
  }
124
- }
186
+ }
125
187
  }
126
188
  }
127
189
  },
@@ -143,88 +205,21 @@
143
205
  "items": [
144
206
  {
145
207
  "key": "accessories[].name",
146
- "flex": "1 1 0"
208
+ "flex": "1 1 33%"
147
209
  },
148
210
  {
149
211
  "key": "accessories[].type",
150
- "flex": "1 1 0"
212
+ "flex": "1 1 33%"
151
213
  },
152
214
  {
153
215
  "key": "accessories[].groupName",
154
- "flex": "1 1 0"
216
+ "flex": "1 1 33%"
155
217
  }
156
218
  ]
157
219
  },
158
220
  {
159
221
  "type": "fieldset",
160
- "title": "${config.title.timer}",
161
- "description": "${config.description.timer}",
162
- "condition": {
163
- "functionBody": "return model.accessories?.[arguments[1]]?.type !== undefined;"
164
- },
165
- "items": [
166
- {
167
- "type": "div",
168
- "displayFlex": true,
169
- "flex-direction": "row",
170
- "items": [
171
- {
172
- "key": "accessories[].timer.delay",
173
- "flex": "1 1 0"
174
- },
175
- {
176
- "key": "accessories[].timer.units",
177
- "flex": "1 1 0"
178
- }
179
- ]
180
- },
181
- {
182
- "key": "accessories[].timer.random",
183
- "condition": {
184
- "functionBody": "return model.accessories?.[arguments[1]]?.timer?.delay !== undefined;"
185
- }
186
- }
187
- ]
188
- },
189
- {
190
- "type": "fieldset",
191
- "title": "${config.title.commands}",
192
- "description": "${config.description.commands}",
193
- "condition": {
194
- "functionBody": "return ['Lightbulb','Outlet','Switch'].includes(model.accessories?.[arguments[1]]?.type);"
195
- },
196
- "items": [
197
- "accessories[].commandOn",
198
- "accessories[].commandOff"
199
- ]
200
- },
201
- {
202
- "type": "fieldset",
203
- "title": "${config.title.commands}",
204
- "description": "${config.description.commands}",
205
- "condition": {
206
- "functionBody": "return ['LockMechanism'].includes(model.accessories?.[arguments[1]]?.type);"
207
- },
208
- "items": [
209
- "accessories[].commandLock",
210
- "accessories[].commandUnlock"
211
- ]
212
- },
213
- {
214
- "type": "fieldset",
215
- "title": "${config.title.commands}",
216
- "description": "${config.description.commands}",
217
- "condition": {
218
- "functionBody": "return ['Door', 'Window', 'WindowCovering'].includes(model.accessories?.[arguments[1]]?.type);"
219
- },
220
- "items": [
221
- "accessories[].commandOpen",
222
- "accessories[].commandClose"
223
- ]
224
- },
225
- {
226
- "type": "fieldset",
227
- "title": "${config.title.options}",
222
+ "notitle": true,
228
223
  "condition": {
229
224
  "functionBody": "return model.accessories?.[arguments[1]]?.type !== undefined;"
230
225
  },
@@ -239,15 +234,15 @@
239
234
  "items": [
240
235
  {
241
236
  "key": "accessories[].defaultOn",
242
- "flex": "0 0 25%"
237
+ "flex": "0 0 33%"
243
238
  },
244
239
  {
245
- "key": "accessories[].sensor",
246
- "flex": "0 0 25%"
240
+ "key": "accessories[].sensor.type",
241
+ "flex": "0 0 33%"
247
242
  },
248
243
  {
249
244
  "key": "accessories[].defaultBrightness",
250
- "flex": "0 0 25%",
245
+ "flex": "0 0 33%",
251
246
  "condition": {
252
247
  "functionBody": "return ['Lightbulb'].includes(model.accessories?.[arguments[1]]?.type);"
253
248
  }
@@ -264,7 +259,11 @@
264
259
  "items": [
265
260
  {
266
261
  "key": "accessories[].defaultLockState",
267
- "flex": "0 0 25%"
262
+ "flex": "0 0 33%"
263
+ },
264
+ {
265
+ "key": "accessories[].sensor.type",
266
+ "flex": "0 0 33%"
268
267
  }
269
268
  ]
270
269
  },
@@ -278,10 +277,36 @@
278
277
  "items": [
279
278
  {
280
279
  "key": "accessories[].defaultPosition",
281
- "flex": "0 0 25%"
280
+ "flex": "0 0 33%"
281
+ },
282
+ {
283
+ "key": "accessories[].sensor.type",
284
+ "flex": "0 0 33%"
282
285
  }
283
286
  ]
284
- },
287
+ },
288
+ {
289
+ "type": "div",
290
+ "displayFlex": true,
291
+ "flex-direction": "row",
292
+ "condition": {
293
+ "functionBody": "return ['Thermostat'].includes(model.accessories?.[arguments[1]]?.type);"
294
+ },
295
+ "items": [
296
+ {
297
+ "key": "accessories[].temperatureUnits",
298
+ "flex": "0 0 33%"
299
+ },
300
+ {
301
+ "key": "accessories[].defaultThermostatState",
302
+ "flex": "0 0 33%"
303
+ },
304
+ {
305
+ "key": "accessories[].defaultTemperature",
306
+ "flex": "0 0 33%"
307
+ }
308
+ ]
309
+ },
285
310
  {
286
311
  "type": "div",
287
312
  "displayFlex": true,
@@ -289,19 +314,159 @@
289
314
  "items": [
290
315
  {
291
316
  "key": "accessories[].disableLogging",
292
- "flex": "0 1 25%"
317
+ "flex": "0 1 33%"
293
318
  },
294
319
  {
295
320
  "key": "accessories[].resetOnRestart",
296
- "flex": "0 1 25%",
321
+ "flex": "0 1 33%",
297
322
  "condition": {
298
- "functionBody": "return model.accessories?.[arguments[1]]?.timer?.delay === undefined;"
323
+ "functionBody": "return model.accessories?.[arguments[1]]?.schedule?.type === undefined && model.accessories?.[arguments[1]]?.timer?.delay === undefined;"
299
324
  }
300
- }
325
+ }
301
326
  ]
302
327
  }
303
328
  ]
304
- }
329
+ },
330
+ {
331
+ "type": "fieldset",
332
+ "title": "${config.title.schedule}",
333
+ "description": "${config.description.schedule}",
334
+ "condition": {
335
+ "functionBody": "const type = model.accessories?.[arguments[1]]?.type; return type !== undefined && type !== 'Thermostat';"
336
+ },
337
+ "items": [
338
+ {
339
+ "type": "div",
340
+ "displayFlex": true,
341
+ "flex-direction": "row",
342
+ "items": [
343
+ {
344
+ "key": "accessories[].schedule.type",
345
+ "flex": "1 1 33%"
346
+ },
347
+ {
348
+ "key": "accessories[].schedule.interval",
349
+ "flex": "1 1 33%",
350
+ "condition": {
351
+ "functionBody": "return model.accessories?.[arguments[1]]?.schedule?.type === 'INTERVAL';"
352
+ }
353
+ },
354
+ {
355
+ "key": "accessories[].schedule.units",
356
+ "flex": "1 1 33%",
357
+ "condition": {
358
+ "functionBody": "return model.accessories?.[arguments[1]]?.schedule?.type === 'INTERVAL';"
359
+ }
360
+ }
361
+ ]
362
+ },
363
+ {
364
+ "key": "accessories[].schedule.cron",
365
+ "condition": {
366
+ "functionBody": "return model.accessories?.[arguments[1]]?.schedule?.type === 'CRON';"
367
+ }
368
+ },
369
+ {
370
+ "key": "accessories[].schedule.random",
371
+ "condition": {
372
+ "functionBody": "const schedule = model.accessories?.[arguments[1]]?.schedule; return schedule?.type === 'INTERVAL' && schedule?.interval !== undefined;"
373
+ }
374
+ }
375
+ ]
376
+ },
377
+ {
378
+ "type": "fieldset",
379
+ "title": "${config.title.timer}",
380
+ "description": "${config.description.timer}",
381
+ "condition": {
382
+ "functionBody": "const type = model.accessories?.[arguments[1]]?.type; return type !== undefined && type !== 'Thermostat';"
383
+ },
384
+ "items": [
385
+ {
386
+ "type": "div",
387
+ "displayFlex": true,
388
+ "flex-direction": "row",
389
+ "items": [
390
+ {
391
+ "key": "accessories[].timer.delay",
392
+ "flex": "1 1 33%"
393
+ },
394
+ {
395
+ "key": "accessories[].timer.units",
396
+ "flex": "1 1 33%"
397
+ }
398
+ ]
399
+ },
400
+ {
401
+ "type": "fieldset",
402
+ "notitle": true,
403
+ "condition": {
404
+ "functionBody": "return model.accessories?.[arguments[1]]?.timer?.delay !== undefined;"
405
+ },
406
+ "items": [
407
+ "accessories[].timer.random",
408
+ {
409
+ "key": "accessories[].sensor.timerControlled",
410
+ "condition": {
411
+ "functionBody": "return model.accessories?.[arguments[1]]?.sensor?.type !== undefined;"
412
+ }
413
+ }
414
+ ]
415
+ }
416
+ ]
417
+ },
418
+ {
419
+ "type": "fieldset",
420
+ "title": "${config.title.commands}",
421
+ "description": "${config.description.commands}",
422
+ "condition": {
423
+ "functionBody": "return model.accessories?.[arguments[1]]?.type !== undefined;"
424
+ },
425
+ "items": [
426
+ {
427
+ "key": "accessories[].commandOn",
428
+ "condition": {
429
+ "functionBody": "return ['Lightbulb','Outlet','Switch','Thermostat'].includes(model.accessories?.[arguments[1]]?.type);"
430
+ }
431
+ },
432
+ {
433
+ "key": "accessories[].commandOff",
434
+ "condition": {
435
+ "functionBody": "return ['Lightbulb','Outlet','Switch','Thermostat'].includes(model.accessories?.[arguments[1]]?.type);"
436
+ }
437
+ },
438
+ {
439
+ "key": "accessories[].commandLock",
440
+ "condition": {
441
+ "functionBody": "return ['LockMechanism'].includes(model.accessories?.[arguments[1]]?.type);"
442
+ }
443
+ },
444
+ {
445
+ "key": "accessories[].commandUnlock",
446
+ "condition": {
447
+ "functionBody": "return ['LockMechanism'].includes(model.accessories?.[arguments[1]]?.type);"
448
+ }
449
+ },
450
+ {
451
+ "key": "accessories[].commandOpen",
452
+ "condition": {
453
+ "functionBody": "return ['Door', 'Window', 'WindowCovering'].includes(model.accessories?.[arguments[1]]?.type);"
454
+ }
455
+ },
456
+ {
457
+ "key": "accessories[].commandClose",
458
+ "condition": {
459
+ "functionBody": "return ['Door', 'Window', 'WindowCovering'].includes(model.accessories?.[arguments[1]]?.type);"
460
+ }
461
+ },
462
+ {
463
+ "key": "accessories[].commandTemperature",
464
+ "condition": {
465
+ "functionBody": "return ['Thermostat'].includes(model.accessories?.[arguments[1]]?.type);"
466
+ }
467
+ }
468
+ ]
469
+ }
305
470
  ]
306
471
  }
307
472
  ]
@@ -1,4 +1,5 @@
1
1
  import { PlatformAccessory, Service } from 'homebridge';
2
+ import { SensorAccessory } from './sensor.js';
2
3
  import { AccessoryType, CharacteristicType, DummyConfig, ServiceType } from '../model/types.js';
3
4
  import { Log } from '../tools/log.js';
4
5
  export declare abstract class DummyAccessory<C extends DummyConfig> {
@@ -8,19 +9,22 @@ export declare abstract class DummyAccessory<C extends DummyConfig> {
8
9
  protected readonly config: C;
9
10
  protected readonly log: Log;
10
11
  protected readonly persistPath: string;
12
+ protected sensor?: SensorAccessory;
11
13
  static identifier(config: DummyConfig): string;
12
14
  protected readonly accessoryService: Service;
13
- private readonly timer;
15
+ private readonly _schedule?;
16
+ private readonly _timer?;
14
17
  constructor(Service: ServiceType, Characteristic: CharacteristicType, accessory: PlatformAccessory, config: C, log: Log, persistPath: string, isGrouped: boolean);
15
18
  protected abstract getAccessoryType(): AccessoryType;
19
+ protected abstract schedule(): Promise<void>;
20
+ protected abstract reset(): Promise<void>;
16
21
  get subtype(): string | undefined;
17
22
  teardown(): void;
18
23
  protected get identifier(): string;
19
24
  protected get isStateful(): boolean;
20
25
  protected get defaultStateStorageKey(): string;
21
- protected startTimer(callback: () => Promise<void>): void;
26
+ protected startTimer(): void;
22
27
  protected cancelTimer(): void;
23
28
  protected executeCommand(command: string): void;
24
- protected assert(...keys: (keyof C)[]): boolean;
25
- protected logIfDesired(message: string, ...parameters: string[]): void;
29
+ protected logIfDesired(message: string, ...parameters: (string | number)[]): void;
26
30
  }
@@ -1,9 +1,11 @@
1
1
  import { exec } from 'child_process';
2
2
  import { PLATFORM_NAME, PLUGIN_ALIAS } from '../homebridge/settings.js';
3
+ import { SensorAccessory } from './sensor.js';
3
4
  import { strings } from '../i18n/i18n.js';
5
+ import { AccessoryType } from '../model/types.js';
6
+ import { Schedule } from '../timeout/schedule.js';
7
+ import { Timer } from '../timeout/timer.js';
4
8
  import { STORAGE_KEY_SUFFIX_DEFAULT_STATE } from '../tools/storage.js';
5
- import { Timer } from '../model/timer.js';
6
- import { assert } from '../tools/validation.js';
7
9
  import getVersion from '../tools/version.js';
8
10
  export class DummyAccessory {
9
11
  Service;
@@ -12,11 +14,13 @@ export class DummyAccessory {
12
14
  config;
13
15
  log;
14
16
  persistPath;
17
+ sensor;
15
18
  static identifier(config) {
16
19
  return config.id ?? `${PLATFORM_NAME}:${config.type}:${config.name.replace(/\s+/g, '')}`;
17
20
  }
18
21
  accessoryService;
19
- timer;
22
+ _schedule;
23
+ _timer;
20
24
  constructor(Service, Characteristic, accessory, config, log, persistPath, isGrouped) {
21
25
  this.Service = Service;
22
26
  this.Characteristic = Characteristic;
@@ -24,7 +28,13 @@ export class DummyAccessory {
24
28
  this.config = config;
25
29
  this.log = log;
26
30
  this.persistPath = persistPath;
27
- this.timer = new Timer(config.name, config.disableLogging ? undefined : log);
31
+ this.sensor = SensorAccessory.new(Service, Characteristic, accessory, this.config.name, log, this.config.disableLogging === true, config.sensor);
32
+ if (config.timer) {
33
+ this._timer = Timer.new(config.timer, config.name, log, config.disableLogging === true);
34
+ }
35
+ if (config.schedule) {
36
+ this._schedule = Schedule.new(config.schedule, config.name, log, config.disableLogging === true, this.schedule.bind(this));
37
+ }
28
38
  const serviceInstance = Service[this.getAccessoryType()];
29
39
  if (isGrouped) {
30
40
  let accessoryService = accessory.getServiceById(serviceInstance, this.identifier);
@@ -43,33 +53,34 @@ export class DummyAccessory {
43
53
  .setCharacteristic(Characteristic.SerialNumber, this.identifier)
44
54
  .setCharacteristic(Characteristic.FirmwareRevision, getVersion());
45
55
  this.accessoryService = accessory.getService(serviceInstance) || accessory.addService(serviceInstance);
56
+ for (const type of Object.values(AccessoryType)) {
57
+ const existingService = accessory.getService(Service[type]);
58
+ if (existingService && type !== this.getAccessoryType()) {
59
+ accessory.removeService(existingService);
60
+ }
61
+ }
46
62
  }
47
63
  get subtype() {
48
64
  return this.accessoryService.subtype;
49
65
  }
50
66
  teardown() {
51
- this.timer.teardown();
67
+ this._timer?.teardown();
68
+ this._schedule?.teardown();
52
69
  }
53
70
  get identifier() {
54
71
  return DummyAccessory.identifier(this.config);
55
72
  }
56
73
  get isStateful() {
57
- return this.config.timer?.delay === undefined && !this.config.resetOnRestart;
74
+ return this._timer === undefined && this._schedule === undefined && !this.config.resetOnRestart;
58
75
  }
59
76
  get defaultStateStorageKey() {
60
77
  return `${this.identifier}:${STORAGE_KEY_SUFFIX_DEFAULT_STATE}`;
61
78
  }
62
- startTimer(callback) {
63
- if (!this.config.timer?.delay) {
64
- return;
65
- }
66
- if (!assert(this.log, this.config.name, this.config.timer, 'units')) {
67
- return;
68
- }
69
- this.timer.start(this.config.timer, callback);
79
+ startTimer() {
80
+ this._timer?.start(this.reset.bind(this));
70
81
  }
71
82
  cancelTimer() {
72
- this.timer.cancel();
83
+ this._timer?.cancel();
73
84
  }
74
85
  executeCommand(command) {
75
86
  exec(command, (_error, stdout, stderr) => {
@@ -81,9 +92,6 @@ export class DummyAccessory {
81
92
  }
82
93
  });
83
94
  }
84
- assert(...keys) {
85
- return assert(this.log, this.config.name, this.config, ...keys);
86
- }
87
95
  logIfDesired(message, ...parameters) {
88
96
  if (this.config.disableLogging) {
89
97
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/accessory/base.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/accessory/base.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ import { LightbulbAccessory } from './onoff/lightbulb.js';
4
4
  import { LockAccessory } from './lock.js';
5
5
  import { OutletAccessory } from './onoff/outlet.js';
6
6
  import { SwitchAccessory } from './onoff/switch.js';
7
+ import { ThermostatAccessory } from './thermostat.js';
7
8
  import { WindowAccessory } from './position/window.js';
8
9
  import { strings } from '../i18n/i18n.js';
9
10
  import * as Types from '../model/types.js';
@@ -19,6 +20,8 @@ export function createDummyAccessory(Service, Characteristic, accessory, config,
19
20
  return new OutletAccessory(Service, Characteristic, accessory, config, log, persistPath, isGrouped);
20
21
  case Types.AccessoryType.Switch:
21
22
  return new SwitchAccessory(Service, Characteristic, accessory, config, log, persistPath, isGrouped);
23
+ case Types.AccessoryType.Thermostat:
24
+ return new ThermostatAccessory(Service, Characteristic, accessory, config, log, persistPath, isGrouped);
22
25
  case Types.AccessoryType.Window:
23
26
  return new WindowAccessory(Service, Characteristic, accessory, config, log, persistPath, isGrouped);
24
27
  case Types.AccessoryType.WindowCovering:
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/accessory/helpers.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,OAAO,KAAK,KAAK,MAAM,mBAAmB,CAAC;AAI3C,MAAM,UAAU,oBAAoB,CAClC,OAA0B,EAC1B,cAAwC,EACxC,SAA4B,EAC5B,MAAyB,EACzB,GAAQ,EACR,WAAmB,EACnB,YAAqB,KAAK;IAG1B,QAAO,MAAM,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,KAAK,CAAC,aAAa,CAAC,IAAI;YAC3B,OAAO,IAAI,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QACpG,KAAK,KAAK,CAAC,aAAa,CAAC,SAAS;YAChC,OAAO,IAAI,kBAAkB,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QACzG,KAAK,KAAK,CAAC,aAAa,CAAC,aAAa;YACpC,OAAO,IAAI,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QACpG,KAAK,KAAK,CAAC,aAAa,CAAC,MAAM;YAC7B,OAAO,IAAI,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QACtG,KAAK,KAAK,CAAC,aAAa,CAAC,MAAM;YAC7B,OAAO,IAAI,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QACtG,KAAK,KAAK,CAAC,aAAa,CAAC,MAAM;YAC7B,OAAO,IAAI,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QACtG,KAAK,KAAK,CAAC,aAAa,CAAC,cAAc;YACrC,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QACrG;YACE,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;YAC/D,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/accessory/helpers.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,OAAO,KAAK,KAAK,MAAM,mBAAmB,CAAC;AAI3C,MAAM,UAAU,oBAAoB,CAClC,OAA0B,EAC1B,cAAwC,EACxC,SAA4B,EAC5B,MAAyB,EACzB,GAAQ,EACR,WAAmB,EACnB,YAAqB,KAAK;IAG1B,QAAO,MAAM,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,KAAK,CAAC,aAAa,CAAC,IAAI;YAC3B,OAAO,IAAI,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QACpG,KAAK,KAAK,CAAC,aAAa,CAAC,SAAS;YAChC,OAAO,IAAI,kBAAkB,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QACzG,KAAK,KAAK,CAAC,aAAa,CAAC,aAAa;YACpC,OAAO,IAAI,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QACpG,KAAK,KAAK,CAAC,aAAa,CAAC,MAAM;YAC7B,OAAO,IAAI,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QACtG,KAAK,KAAK,CAAC,aAAa,CAAC,MAAM;YAC7B,OAAO,IAAI,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QACtG,KAAK,KAAK,CAAC,aAAa,CAAC,UAAU;YACjC,OAAO,IAAI,mBAAmB,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QAC1G,KAAK,KAAK,CAAC,aAAa,CAAC,MAAM;YAC7B,OAAO,IAAI,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QACtG,KAAK,KAAK,CAAC,aAAa,CAAC,cAAc;YACrC,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QACrG;YACE,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;YAC/D,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}