homebridge-deconz 0.0.6 → 0.0.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 (58) hide show
  1. package/README.md +8 -0
  2. package/cli/deconz.js +980 -0
  3. package/config.schema.json +1 -1
  4. package/lib/Client/ApiError.js +42 -0
  5. package/lib/{DeconzClient.js → Deconz/ApiClient.js} +82 -158
  6. package/lib/Deconz/ApiError.js +42 -0
  7. package/lib/Deconz/ApiResponse.js +54 -0
  8. package/lib/Deconz/Device.js +100 -0
  9. package/lib/{DeconzDiscovery.js → Deconz/Discovery.js} +4 -3
  10. package/lib/Deconz/Resource.js +1206 -0
  11. package/lib/{DeconzWsClient.js → Deconz/WsClient.js} +59 -44
  12. package/lib/Deconz/index.js +21 -0
  13. package/lib/DeconzAccessory/Contact.js +54 -0
  14. package/lib/DeconzAccessory/Gateway.js +316 -374
  15. package/lib/DeconzAccessory/Light.js +72 -0
  16. package/lib/DeconzAccessory/Motion.js +51 -0
  17. package/lib/DeconzAccessory/Sensor.js +35 -0
  18. package/lib/DeconzAccessory/Temperature.js +63 -0
  19. package/lib/DeconzAccessory/Thermostat.js +50 -0
  20. package/lib/DeconzAccessory/WarningDevice.js +56 -0
  21. package/lib/DeconzAccessory/WindowCovering.js +47 -0
  22. package/lib/DeconzAccessory/index.js +216 -0
  23. package/lib/DeconzPlatform.js +8 -3
  24. package/lib/DeconzService/AirPressure.js +43 -0
  25. package/lib/DeconzService/AirQuality.js +20 -10
  26. package/lib/DeconzService/Alarm.js +16 -9
  27. package/lib/DeconzService/Battery.js +43 -0
  28. package/lib/DeconzService/Button.js +12 -2
  29. package/lib/DeconzService/CarbonMonoxide.js +38 -0
  30. package/lib/DeconzService/Consumption.js +65 -0
  31. package/lib/DeconzService/Contact.js +60 -0
  32. package/lib/DeconzService/Daylight.js +132 -0
  33. package/lib/DeconzService/DeviceSettings.js +13 -5
  34. package/lib/DeconzService/Flag.js +52 -0
  35. package/lib/DeconzService/GatewaySettings.js +8 -58
  36. package/lib/DeconzService/Humidity.js +37 -0
  37. package/lib/DeconzService/Leak.js +38 -0
  38. package/lib/DeconzService/Light.js +376 -0
  39. package/lib/DeconzService/LightLevel.js +54 -0
  40. package/lib/DeconzService/LightsResource.js +112 -0
  41. package/lib/DeconzService/Motion.js +101 -0
  42. package/lib/DeconzService/Outlet.js +76 -0
  43. package/lib/DeconzService/Power.js +83 -0
  44. package/lib/DeconzService/SensorsResource.js +96 -0
  45. package/lib/DeconzService/Smoke.js +38 -0
  46. package/lib/DeconzService/Status.js +53 -0
  47. package/lib/DeconzService/Switch.js +93 -0
  48. package/lib/DeconzService/Temperature.js +63 -0
  49. package/lib/DeconzService/Thermostat.js +175 -0
  50. package/lib/DeconzService/WarningDevice.js +68 -0
  51. package/lib/DeconzService/WindowCovering.js +139 -0
  52. package/lib/DeconzService/index.js +94 -0
  53. package/package.json +7 -4
  54. package/lib/DeconzAccessory/Device.js +0 -91
  55. package/lib/DeconzAccessory.js +0 -16
  56. package/lib/DeconzDevice.js +0 -245
  57. package/lib/DeconzService/Sensor.js +0 -58
  58. package/lib/DeconzService.js +0 -43
@@ -1,4 +1,4 @@
1
- // homebridge-deconz/lib/DeconzWsClient.js
1
+ // homebridge-deconz/lib/Deconz/WsClient.js
2
2
  //
3
3
  // Homebridge plug-in for deCONZ.
4
4
  // Copyright © 2018-2022 Erik Baauw. All rights reserved.
@@ -9,15 +9,15 @@ const events = require('events')
9
9
  const homebridgeLib = require('homebridge-lib')
10
10
  const WebSocket = require('ws')
11
11
 
12
- /** Client for deCONZ web socket notifications.
12
+ /** Client for web socket notifications by a deCONZ gateway.
13
13
  *
14
14
  * See the
15
15
  * [deCONZ](https://dresden-elektronik.github.io/deconz-rest-doc/endpoints/websocket/)
16
16
  * documentation for a better understanding of the web socket notifications.
17
- * @copyright © 2018-2021 Erik Baauw. All rights reserved.
17
+ * @memberof Deconz
18
18
  */
19
- class DeconzWsClient extends events.EventEmitter {
20
- /** Create a new web socket client instance.
19
+ class WsClient extends events.EventEmitter {
20
+ /** Instantiate a new web socket client.
21
21
  * @param {object} params - Parameters.
22
22
  * @param {string} [params.host='localhost:443'] - IP address or hostname
23
23
  * and port of the web socket server.
@@ -35,7 +35,7 @@ class DeconzWsClient extends events.EventEmitter {
35
35
  this.config = {
36
36
  hostname: 'localhost',
37
37
  port: 443,
38
- retryTime: 10
38
+ retryTime: 15
39
39
  }
40
40
  const optionParser = new homebridgeLib.OptionParser(this.config)
41
41
  optionParser
@@ -45,19 +45,17 @@ class DeconzWsClient extends events.EventEmitter {
45
45
  .parse(params)
46
46
  }
47
47
 
48
- /** Websocket hostname and port.
48
+ /** The hostname or IP address and port of the web socket server.
49
49
  * @type {string}
50
50
  */
51
51
  get host () { return this.config.hostname + ':' + this.config.port }
52
52
  set host (host) {
53
- if (host !== this.host) {
54
- const { hostname, port } = homebridgeLib.optionParser.toHost(host)
55
- this.config.hostname = hostname
56
- this.config.port = port
57
- }
53
+ const { hostname, port } = homebridgeLib.OptionParser.toHost('host', host)
54
+ this.config.hostname = hostname
55
+ this.config.port = port
58
56
  }
59
57
 
60
- /** Listen for web socket notifications.
58
+ /** Connect to the web socket server, and listen notifications.
61
59
  */
62
60
  listen () {
63
61
  this.reconnect = true
@@ -73,7 +71,7 @@ class DeconzWsClient extends events.EventEmitter {
73
71
  this.emit('error', error)
74
72
  })
75
73
  .on('open', () => {
76
- /** Emitted when connection to web socket server is opened.
74
+ /** Emitted when connection to web socket server has been made.
77
75
  * @event DeconzWsClient#listening
78
76
  * @param {string} url - The URL of the web socket server.
79
77
  */
@@ -91,46 +89,61 @@ class DeconzWsClient extends events.EventEmitter {
91
89
  if (obj.t === 'event') {
92
90
  switch (obj.e) {
93
91
  case 'changed':
94
- if (obj.r && obj.id && obj.state) {
95
- const resource = '/' + obj.r + '/' + obj.id + '/state'
92
+ if (obj.r !== null && obj.id !== null) {
93
+ let body
94
+ if (obj.state != null) {
95
+ body = { state: obj.state }
96
+ } else if (obj.config != null) {
97
+ body = { config: obj.config }
98
+ } else if (obj.attr != null) {
99
+ body = obj.attr
100
+ }
96
101
  /** Emitted when a `changed` notification has been received.
102
+ *
103
+ * Note that the deCONZ gateway sends different
104
+ * notifications for top-level, `state`, and `config`
105
+ * attributes.
106
+ * Consequenly, the `body` only contains one of these.
97
107
  * @event DeconzWsClient#changed
98
- * @param {string} resource - The changed resource.<br>
99
- * This can be a `/lights`, `/groups`, or `/sensors`
100
- * resource for top-level attributes, or a `state` or
101
- * `config` sub-resource.
102
- * @param {object} attributes - The top-level, `state`, or
103
- * `config` attributes.
108
+ * @param {string} rtype - The resource type of the changed
109
+ * resource.
110
+ * @param {integer} rid - The resource ID of the changed
111
+ * resource.
112
+ * @param {object} body - The body of the changed resource.
104
113
  */
105
- this.emit('changed', resource, obj.state)
106
- return
107
- }
108
- if (obj.r && obj.id && obj.config) {
109
- const resource = '/' + obj.r + '/' + obj.id + '/config'
110
- this.emit('changed', resource, obj.config)
111
- return
112
- }
113
- if (obj.r && obj.id && obj.attr) {
114
- const resource = '/' + obj.r + '/' + obj.id
115
- this.emit('changed', resource, obj.attr)
114
+ this.emit('changed', obj.r, obj.id, body)
116
115
  return
117
116
  }
118
117
  break
119
118
  case 'added':
120
- if (obj.r && obj.id) {
121
- const resource = '/' + obj.r + '/' + obj.id
119
+ if (obj.r !== null && obj.id !== null) {
122
120
  /** Emitted when an `added` notification has been received.
123
121
  * @event DeconzWsClient#added
124
- * @param {string} resource - The added resource.
125
- * @param {object} attributes - The full attributes of the
126
- * added resource.
122
+ * @param {string} rtype - The resource type of the added
123
+ * resource.
124
+ * @param {integer} rid - The resource ID of the added
125
+ * resource.
126
+ * @param {object} body - The body of the added resource.
127
127
  */
128
- this.emit('added', resource, obj[obj.r.slice(0, -1)])
128
+ this.emit('added', obj.r, obj.id, obj[obj.r.slice(0, -1)])
129
+ return
130
+ }
131
+ break
132
+ case 'deleted':
133
+ if (obj.r !== null && obj.id !== null) {
134
+ /** Emitted when an `deleted` notification has been received.
135
+ * @event DeconzWsClient#deleted
136
+ * @param {string} rtype - The resource type of the deleted
137
+ * resource.
138
+ * @param {integer} rid - The resource ID of the deleted
139
+ * resource.
140
+ */
141
+ this.emit('deleted', obj.r, obj.id)
129
142
  return
130
143
  }
131
144
  break
132
145
  case 'scene-called':
133
- if (obj.gid && obj.scid) {
146
+ if (obj.gid != null && obj.scid != null) {
134
147
  const resource = '/groups/' + obj.gid + '/scenes/' + obj.scid
135
148
  /** Emitted when an `sceneRecall` notification has been received.
136
149
  * @event DeconzWsClient#sceneRecall
@@ -157,8 +170,10 @@ class DeconzWsClient extends events.EventEmitter {
157
170
  }
158
171
  })
159
172
  .on('close', async () => {
160
- this.ws.removeAllListeners()
161
- delete this.ws
173
+ if (this.ws != null) {
174
+ this.ws.removeAllListeners()
175
+ delete this.ws
176
+ }
162
177
  const retryTime = this.reconnect ? this.config.retryTime : 0
163
178
  /** Emitted when the connection to the web socket server has been closed.
164
179
  * @event DeconzWsClient#closed
@@ -174,7 +189,7 @@ class DeconzWsClient extends events.EventEmitter {
174
189
  })
175
190
  }
176
191
 
177
- /** Close the websocket.
192
+ /** Close the web socket connection.
178
193
  */
179
194
  async close () {
180
195
  if (this.ws != null) {
@@ -185,4 +200,4 @@ class DeconzWsClient extends events.EventEmitter {
185
200
  }
186
201
  }
187
202
 
188
- module.exports = DeconzWsClient
203
+ module.exports = WsClient
@@ -0,0 +1,21 @@
1
+ // homebridge-deconz/lib/Deconz/index.js
2
+ // Copyright © 2022 Erik Baauw. All rights reserved.
3
+ //
4
+ // Homebridge plugin for deCONZ.
5
+
6
+ 'use strict'
7
+
8
+ /** Library to discover, monitor, and interact with a deCONZ gateway.
9
+ * @hideconstructor
10
+ */
11
+ class Deconz {
12
+ static get ApiClient () { return require('./ApiClient') }
13
+ static get ApiError () { return require('./ApiError') }
14
+ static get ApiResponse () { return require('./ApiResponse') }
15
+ static get Device () { return require('./Device') }
16
+ static get Discovery () { return require('./Discovery') }
17
+ static get Resource () { return require('./Resource') }
18
+ static get WsClient () { return require('./WsClient') }
19
+ }
20
+
21
+ module.exports = Deconz
@@ -0,0 +1,54 @@
1
+ // homebridge-deconz/lib/DeconzAccessory/Contact.js
2
+ // Copyright © 2022 Erik Baauw. All rights reserved.
3
+ //
4
+ // Homebridge plugin for deCONZ.
5
+
6
+ 'use strict'
7
+
8
+ const homebridgeLib = require('homebridge-lib')
9
+ const DeconzAccessory = require('../DeconzAccessory')
10
+
11
+ const { History } = homebridgeLib.ServiceDelegate
12
+
13
+ /** Delegate class for a HomeKit accessory corresponding to a contact sensor,
14
+ * with Eve Door & Window history.
15
+ * @extends DeconzAccessory
16
+ * @memberof DeconzAccessory
17
+ */
18
+ class Contact extends DeconzAccessory {
19
+ /** Instantiate a contact sensor delegate.
20
+ * @param {DeconzAccessory.Gateway} gateway - The gateway.
21
+ * @param {Deconz.Device} device - The device.
22
+ */
23
+ constructor (gateway, device) {
24
+ super(gateway, device, gateway.Accessory.Categories.SENSOR)
25
+
26
+ this.identify()
27
+
28
+ this.service = this.createService(device.resource, { primaryService: true })
29
+
30
+ for (const subtype in device.resourceBySubtype) {
31
+ const resource = device.resourceBySubtype[subtype]
32
+ if (subtype === device.primary) {
33
+ continue
34
+ }
35
+ this.createService(resource)
36
+ }
37
+
38
+ this.historyService = new History.Contact(
39
+ this, {},
40
+ this.service.characteristicDelegate('contact'),
41
+ this.service.characteristicDelegate('timesOpened'),
42
+ this.service.characteristicDelegate('lastActivation')
43
+ )
44
+
45
+ this.createSettingsService()
46
+
47
+ setImmediate(() => {
48
+ this.debug('initialised')
49
+ this.emit('initialised')
50
+ })
51
+ }
52
+ }
53
+
54
+ module.exports = Contact