homey-api 3.0.0-rc.1 → 3.0.0-rc.11

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 (30) hide show
  1. package/assets/specifications/HomeyAPIV3Local.json +269 -5
  2. package/assets/types/homey-api.d.ts +267 -59
  3. package/assets/types/homey-api.private.d.ts +267 -59
  4. package/lib/HomeyAPI/HomeyAPI.js +12 -7
  5. package/lib/HomeyAPI/HomeyAPIV2/ManagerDevices/Capability.js +2 -2
  6. package/lib/HomeyAPI/HomeyAPIV2/ManagerDevices/Device.js +2 -2
  7. package/lib/HomeyAPI/HomeyAPIV2/ManagerDevices.js +0 -14
  8. package/lib/HomeyAPI/HomeyAPIV2/ManagerDrivers/Driver.js +2 -2
  9. package/lib/HomeyAPI/HomeyAPIV2/ManagerDrivers/PairSession.js +20 -0
  10. package/lib/HomeyAPI/HomeyAPIV2/ManagerDrivers.js +17 -0
  11. package/lib/HomeyAPI/HomeyAPIV2/ManagerFlow/AdvancedFlow.js +16 -3
  12. package/lib/HomeyAPI/HomeyAPIV2/ManagerFlow/Flow.js +25 -2
  13. package/lib/HomeyAPI/HomeyAPIV2/ManagerFlow/FlowCardAction.js +2 -2
  14. package/lib/HomeyAPI/HomeyAPIV2/ManagerFlow/FlowCardCondition.js +2 -2
  15. package/lib/HomeyAPI/HomeyAPIV2/ManagerFlow/FlowCardTrigger.js +2 -2
  16. package/lib/HomeyAPI/HomeyAPIV2/ManagerFlow.js +36 -13
  17. package/lib/HomeyAPI/HomeyAPIV2/ManagerFlowToken/FlowToken.js +3 -3
  18. package/lib/HomeyAPI/HomeyAPIV2/ManagerInsights/Log.js +2 -3
  19. package/lib/HomeyAPI/HomeyAPIV2/ManagerInsights.js +17 -0
  20. package/lib/HomeyAPI/HomeyAPIV3/Item.js +14 -1
  21. package/lib/HomeyAPI/HomeyAPIV3/Manager.js +29 -46
  22. package/lib/HomeyAPI/HomeyAPIV3/ManagerDevices/Device.js +12 -12
  23. package/lib/HomeyAPI/HomeyAPIV3/ManagerDevices/DeviceCapability.js +1 -1
  24. package/lib/HomeyAPI/HomeyAPIV3/ManagerDrivers/PairSession.js +9 -0
  25. package/lib/HomeyAPI/HomeyAPIV3/ManagerDrivers.js +2 -0
  26. package/lib/HomeyAPI/HomeyAPIV3/ManagerFlow/Flow.js +8 -0
  27. package/lib/HomeyAPI/HomeyAPIV3/ManagerFlow/FlowCard.js +8 -0
  28. package/lib/HomeyAPI/HomeyAPIV3/ManagerFlowToken/FlowToken.js +12 -4
  29. package/lib/HomeyAPI/HomeyAPIV3/ManagerInsights/Log.js +14 -0
  30. package/package.json +1 -1
@@ -18,22 +18,45 @@ class ManagerFlow extends Manager {
18
18
  FlowCardAction,
19
19
  }
20
20
 
21
- // TODO: Transform card IDs
22
- // async createFlow() {
23
-
24
- // }
25
-
26
- // async updateFlow() {
27
-
28
- // }
29
-
30
- // async createAdvancedFlow() {
21
+ async createFlow({
22
+ flow,
23
+ ...props
24
+ }) {
25
+ return this.__super__.createFlow({
26
+ flow: Flow.transformSet(flow),
27
+ ...props,
28
+ });
29
+ }
31
30
 
32
- // }
31
+ async updateFlow({
32
+ flow,
33
+ ...props
34
+ }) {
35
+ return this.__super__.updateFlow({
36
+ flow: Flow.transformSet(flow),
37
+ ...props,
38
+ });
39
+ }
33
40
 
34
- // async updateAdvancedFlow() {
41
+ async createAdvancedFlow({
42
+ advancedflow,
43
+ ...props
44
+ }) {
45
+ return this.__super__.createAdvancedFlow({
46
+ advancedflow: AdvancedFlow.transformSet(advancedflow),
47
+ ...props,
48
+ });
49
+ }
35
50
 
36
- // }
51
+ async updateAdvancedFlow({
52
+ advancedflow,
53
+ ...props
54
+ }) {
55
+ return this.__super__.updateAdvancedFlow({
56
+ advancedflow: AdvancedFlow.transformSet(advancedflow),
57
+ ...props,
58
+ });
59
+ }
37
60
 
38
61
  async getFlowCardTrigger({
39
62
  $cache = true,
@@ -4,15 +4,15 @@ const FlowTokenV3 = require('../../HomeyAPIV3/ManagerFlowToken/FlowToken');
4
4
 
5
5
  class FlowToken extends FlowTokenV3 {
6
6
 
7
- static transform(item) {
7
+ static transformGet(item) {
8
8
  // TODO: Remove FlowTokenV3.transform and uncomment this after front-end does not use FlowToken.uri|id|uriObj anymore!
9
- // item = super.transform(item);
9
+ // item = super.transformGet(item);
10
10
 
11
11
  item.ownerUri = item.uri;
12
12
  item.ownerId = item.id;
13
- item.ownerName = item.uriObj.name;
14
13
  item.id = `${item.ownerUri}:${item.ownerId}`;
15
14
 
15
+ delete item.ownerName; // Prepare for back-end change
16
16
  delete item.uri;
17
17
  delete item.uriObj;
18
18
 
@@ -4,12 +4,11 @@ const LogV3 = require('../../HomeyAPIV3/ManagerInsights/Log');
4
4
 
5
5
  class Log extends LogV3 {
6
6
 
7
- static transform(item) {
8
- item = super.transform(item);
7
+ static transformGet(item) {
8
+ item = super.transformGet(item);
9
9
 
10
10
  item.ownerId = item.id;
11
11
  item.ownerUri = item.uri;
12
- item.ownerName = item.uriObj.name;
13
12
  item.id = `${item.uri}:${item.id}`;
14
13
 
15
14
  delete item.uri;
@@ -24,6 +24,23 @@ class ManagerInsights extends ManagerInsightsV3 {
24
24
  });
25
25
  }
26
26
 
27
+ async getLogEntries({ id }) {
28
+ return this.__super__getLogEntries({
29
+ id: id.split(':').reverse()[0],
30
+ uri: id.split(':', 3).join(':'),
31
+ });
32
+ }
33
+
34
+ async deleteLogEntries({ id }) {
35
+ return this.__super__deleteLogEntries({
36
+ id: id.split(':').reverse()[0],
37
+ uri: id.split(':', 3).join(':'),
38
+ });
39
+ }
40
+
41
+ // deleteLog
42
+ // updateLog
43
+
27
44
  }
28
45
 
29
46
  module.exports = ManagerInsights;
@@ -64,8 +64,17 @@ class Item extends EventEmitter {
64
64
 
65
65
  __update(properties) {
66
66
  for (const [key, value] of Object.entries(properties)) {
67
+ if (key === 'id') continue;
68
+
67
69
  this[key] = value;
68
70
  }
71
+
72
+ this.emit('update', properties);
73
+ }
74
+
75
+ __delete() {
76
+ this.destroy();
77
+ this.emit('delete');
69
78
  }
70
79
 
71
80
  async connect() {
@@ -171,7 +180,11 @@ class Item extends EventEmitter {
171
180
  this.disconnect().catch(() => { });
172
181
  }
173
182
 
174
- static transform(item) {
183
+ static transformGet(item) {
184
+ return item;
185
+ }
186
+
187
+ static transformSet(item) {
175
188
  return item;
176
189
  }
177
190
 
@@ -258,9 +258,8 @@ class Manager extends EventEmitter {
258
258
  switch (operation.crud.type) {
259
259
  case 'getOne': {
260
260
  let item = { ...result };
261
- item = Item.transform(item);
261
+ item = Item.transformGet(item);
262
262
  item = new Item({
263
- itemId,
264
263
  id: item.id,
265
264
  homey: this.homey,
266
265
  manager: this,
@@ -278,13 +277,13 @@ class Manager extends EventEmitter {
278
277
 
279
278
  // Add all to cache
280
279
  for (let item of Object.values(result)) {
281
- item = Item.transform(item);
282
- if (this.__cache[itemId][item.id]) {
283
- this.__cache[itemId][item.id].__update(item);
280
+ item = Item.transformGet(item);
281
+
282
+ if (this.isConnected() && this.__cache[itemId][item.id]) {
284
283
  items[item.id] = this.__cache[itemId][item.id];
284
+ items[item.id].__update(item);
285
285
  } else {
286
286
  items[item.id] = new Item({
287
- itemId,
288
287
  id: item.id,
289
288
  homey: this.homey,
290
289
  manager: this,
@@ -316,13 +315,14 @@ class Manager extends EventEmitter {
316
315
  case 'createOne':
317
316
  case 'updateOne': {
318
317
  let item = { ...result };
319
- item = Item.transform(item);
320
- if (this.__cache[itemId][item.id]) {
321
- item = this.__cache[itemId][item.id].__update(item);
318
+ item = Item.transformGet(item);
319
+
320
+ if (this.isConnected() && this.__cache[itemId][item.id]) {
321
+ item = this.__cache[itemId][item.id];
322
+ item.__update(item);
322
323
  } else {
323
- item = Item.transform(item);
324
+ item = Item.transformGet(item);
324
325
  item = new Item({
325
- itemId,
326
326
  id: item.id,
327
327
  homey: this.homey,
328
328
  manager: this,
@@ -337,7 +337,7 @@ class Manager extends EventEmitter {
337
337
  return item;
338
338
  }
339
339
  case 'deleteOne': {
340
- if (this.__cache[itemId][args.id]) {
340
+ if (this.isConnected() && this.__cache[itemId][args.id]) {
341
341
  this.__cache[itemId][args.id].destroy();
342
342
  delete this.__cache[itemId][args.id];
343
343
  }
@@ -413,55 +413,38 @@ class Manager extends EventEmitter {
413
413
 
414
414
  switch (operation) {
415
415
  case 'create': {
416
- let item = { ...data };
417
- item = Item.transform(item);
418
- item = new Item({
419
- itemId,
420
- id: item.id,
416
+ data = Item.transformGet(data);
417
+
418
+ const item = new Item({
419
+ id: data.id,
421
420
  homey: this.homey,
422
421
  manager: this,
423
- properties: { ...item },
422
+ properties: { ...data },
424
423
  });
424
+ this.__cache[itemId][data.id] = item;
425
425
 
426
- this.__cache[itemId][item.id] = item;
427
- this.__cache[itemId][item.id].emit('create');
428
-
429
- return this.emit(`${itemId}.create`, item);
426
+ break;
430
427
  }
431
428
  case 'update': {
432
- let item = { ...data };
433
- item = Item.transform(item);
429
+ data = Item.transformGet(data);
434
430
 
435
- if (this.__cache[itemId][item.id]) {
436
- item = this.__cache[itemId][item.id];
437
- item.__update(item);
438
- item.emit('update');
439
- } else {
440
- item = new Item({
441
- itemId,
442
- id: item.id,
443
- homey: this.homey,
444
- manager: this,
445
- properties: { ...item },
446
- });
447
- this.__cache[itemId][item.id] = item;
431
+ if (this.__cache[itemId][data.id]) {
432
+ const item = this.__cache[itemId][data.id];
433
+ item.__update(data);
448
434
  }
449
435
 
450
- return this.emit(`${itemId}.update`, item);
436
+ break;
451
437
  }
452
438
  case 'delete': {
453
- let item = Item.transform({ ...data });
454
- item = Item.transform(item);
439
+ data = Item.transformGet(data);
455
440
 
456
- if (this.__cache[itemId][item.id]) {
457
- this.__cache[itemId][item.id].emit('delete');
458
- this.__cache[itemId][item.id].destroy();
441
+ if (this.__cache[itemId][data.id]) {
442
+ const item = this.__cache[itemId][data.id];
443
+ item.__delete();
459
444
  delete this.__cache[itemId][item.id];
460
445
  }
461
446
 
462
- return this.emit(`${itemId}.delete`, {
463
- id: item.id,
464
- });
447
+ break;
465
448
  }
466
449
  default:
467
450
  break;
@@ -17,17 +17,13 @@ class Device extends Item {
17
17
  });
18
18
  }
19
19
 
20
- get uri() {
21
- return `homey:device:${this.id}`;
22
- }
23
-
24
20
  /**
25
- * Creates an {@link HomeyAPIV2.DeviceCapability} for realtime capability updates.
21
+ * Creates an {@link HomeyAPIV3.DeviceCapability} for realtime capability updates.
26
22
  * @param {string} capabilityId
27
23
  * @param {Function} listener
28
24
  * @param {number|boolean|string} listener.value
29
- * @returns {HomeyAPIV2.ManagerDevices.Device.DeviceCapability}
30
- * @function HomeyAPIV2.ManagerDevices.Device#makeCapabilityInstance
25
+ * @returns {HomeyAPIV3.ManagerDevices.Device.DeviceCapability}
26
+ * @function HomeyAPIV3.ManagerDevices.Device#makeCapabilityInstance
31
27
  * @example
32
28
  *
33
29
  * const onOffInstance = device.makeCapabilityInstance('onoff', value => {
@@ -76,7 +72,7 @@ class Device extends Item {
76
72
  * @param {object} [opts.opts]
77
73
  * @param {number} [opts.opts.duration]
78
74
  * @returns {Promise<void>}
79
- * @function HomeyAPIV2.ManagerDevices.Device#setCapabilityValue
75
+ * @function HomeyAPIV3.ManagerDevices.Device#setCapabilityValue
80
76
  */
81
77
  async setCapabilityValue(options, ...args) {
82
78
  // Legacy compatibility from node-athom-api
@@ -199,10 +195,14 @@ class Device extends Item {
199
195
  }), {});
200
196
  }
201
197
 
202
- static transform(item) {
203
- for (const capabilityObj of Object.values(item.capabilitiesObj)) {
204
- if (capabilityObj.lastUpdated) {
205
- capabilityObj.lastUpdated = new Date(capabilityObj.lastUpdated);
198
+ static transformGet(item) {
199
+ item = super.transformGet(item);
200
+
201
+ if (item.capabilitiesObj) {
202
+ for (const capabilityObj of Object.values(item.capabilitiesObj)) {
203
+ if (capabilityObj.lastUpdated) {
204
+ capabilityObj.lastUpdated = new Date(capabilityObj.lastUpdated);
205
+ }
206
206
  }
207
207
  }
208
208
 
@@ -108,7 +108,7 @@ class DeviceCapability extends EventEmitter {
108
108
  const capabilityReference = this.device.capabilitiesObj && this.device.capabilitiesObj[this.id];
109
109
  if (capabilityReference) {
110
110
  capabilityReference.value = value;
111
- capabilityReference.lastUpdated = this.__lastChanged.toISOString();
111
+ capabilityReference.lastUpdated = this.__lastChanged;
112
112
  }
113
113
 
114
114
  this.__listener(value);
@@ -0,0 +1,9 @@
1
+ 'use strict';
2
+
3
+ const Item = require('../Item');
4
+
5
+ class PairSession extends Item {
6
+
7
+ }
8
+
9
+ module.exports = PairSession;
@@ -2,12 +2,14 @@
2
2
 
3
3
  const Manager = require('./Manager');
4
4
  const Driver = require('./ManagerDrivers/Driver');
5
+ const PairSession = require('./ManagerDrivers/PairSession');
5
6
 
6
7
  class ManagerDrivers extends Manager {
7
8
 
8
9
  static CRUD = {
9
10
  ...super.CRUD,
10
11
  Driver,
12
+ PairSession,
11
13
  }
12
14
 
13
15
  }
@@ -4,6 +4,14 @@ const Item = require('../Item');
4
4
 
5
5
  class Flow extends Item {
6
6
 
7
+ /**
8
+ * Check whether this Flow misses one or more {@link FlowCard} or {@link FlowToken}.
9
+ * @returns Promise<Boolean>
10
+ */
11
+ async isBroken() {
12
+ throw new Error('Not Implemented');
13
+ }
14
+
7
15
  }
8
16
 
9
17
  module.exports = Flow;
@@ -4,6 +4,14 @@ const Item = require('../Item');
4
4
 
5
5
  class FlowCard extends Item {
6
6
 
7
+ static transformGet(item) {
8
+ item = super.transformGet(item);
9
+
10
+ delete item.ownerName; // Prepare for back-end change
11
+
12
+ return item;
13
+ }
14
+
7
15
  }
8
16
 
9
17
  module.exports = FlowCard;
@@ -4,11 +4,19 @@ const Item = require('../Item');
4
4
 
5
5
  class FlowToken extends Item {
6
6
 
7
- // TODO: Remove when back-end has removed these properties.
8
- static transform(item) {
9
- delete item.uri;
10
- delete item.id;
7
+ static transformGet(item) {
8
+ item = super.transformGet(item);
9
+
10
+ if (item.uri) {
11
+ item.id = `${item.uri}:${item.id}`;
12
+ delete item.uri;
13
+ }
14
+
15
+ // TODO: Remove when back-end has removed these properties.
11
16
  delete item.uriObj;
17
+ delete item.ownerName; // Prepare for back-end change
18
+
19
+ return item;
12
20
  }
13
21
 
14
22
  }
@@ -4,6 +4,20 @@ const Item = require('../Item');
4
4
 
5
5
  class Log extends Item {
6
6
 
7
+ async getEntries() {
8
+ return this.manager.getLogEntries({
9
+ id: this.id,
10
+ });
11
+ }
12
+
13
+ static transformGet(item) {
14
+ item = super.transformGet(item);
15
+
16
+ delete item.ownerName; // Prepare for back-end change
17
+
18
+ return item;
19
+ }
20
+
7
21
  }
8
22
 
9
23
  module.exports = Log;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "homey-api",
3
- "version": "3.0.0-rc.1",
3
+ "version": "3.0.0-rc.11",
4
4
  "description": "Homey API",
5
5
  "main": "index.js",
6
6
  "files": [