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.
- package/README.md +8 -0
- package/cli/deconz.js +980 -0
- package/config.schema.json +1 -1
- package/lib/Client/ApiError.js +42 -0
- package/lib/{DeconzClient.js → Deconz/ApiClient.js} +82 -158
- package/lib/Deconz/ApiError.js +42 -0
- package/lib/Deconz/ApiResponse.js +54 -0
- package/lib/Deconz/Device.js +100 -0
- package/lib/{DeconzDiscovery.js → Deconz/Discovery.js} +4 -3
- package/lib/Deconz/Resource.js +1206 -0
- package/lib/{DeconzWsClient.js → Deconz/WsClient.js} +59 -44
- package/lib/Deconz/index.js +21 -0
- package/lib/DeconzAccessory/Contact.js +54 -0
- package/lib/DeconzAccessory/Gateway.js +316 -374
- package/lib/DeconzAccessory/Light.js +72 -0
- package/lib/DeconzAccessory/Motion.js +51 -0
- package/lib/DeconzAccessory/Sensor.js +35 -0
- package/lib/DeconzAccessory/Temperature.js +63 -0
- package/lib/DeconzAccessory/Thermostat.js +50 -0
- package/lib/DeconzAccessory/WarningDevice.js +56 -0
- package/lib/DeconzAccessory/WindowCovering.js +47 -0
- package/lib/DeconzAccessory/index.js +216 -0
- package/lib/DeconzPlatform.js +8 -3
- package/lib/DeconzService/AirPressure.js +43 -0
- package/lib/DeconzService/AirQuality.js +20 -10
- package/lib/DeconzService/Alarm.js +16 -9
- package/lib/DeconzService/Battery.js +43 -0
- package/lib/DeconzService/Button.js +12 -2
- package/lib/DeconzService/CarbonMonoxide.js +38 -0
- package/lib/DeconzService/Consumption.js +65 -0
- package/lib/DeconzService/Contact.js +60 -0
- package/lib/DeconzService/Daylight.js +132 -0
- package/lib/DeconzService/DeviceSettings.js +13 -5
- package/lib/DeconzService/Flag.js +52 -0
- package/lib/DeconzService/GatewaySettings.js +8 -58
- package/lib/DeconzService/Humidity.js +37 -0
- package/lib/DeconzService/Leak.js +38 -0
- package/lib/DeconzService/Light.js +376 -0
- package/lib/DeconzService/LightLevel.js +54 -0
- package/lib/DeconzService/LightsResource.js +112 -0
- package/lib/DeconzService/Motion.js +101 -0
- package/lib/DeconzService/Outlet.js +76 -0
- package/lib/DeconzService/Power.js +83 -0
- package/lib/DeconzService/SensorsResource.js +96 -0
- package/lib/DeconzService/Smoke.js +38 -0
- package/lib/DeconzService/Status.js +53 -0
- package/lib/DeconzService/Switch.js +93 -0
- package/lib/DeconzService/Temperature.js +63 -0
- package/lib/DeconzService/Thermostat.js +175 -0
- package/lib/DeconzService/WarningDevice.js +68 -0
- package/lib/DeconzService/WindowCovering.js +139 -0
- package/lib/DeconzService/index.js +94 -0
- package/package.json +7 -4
- package/lib/DeconzAccessory/Device.js +0 -91
- package/lib/DeconzAccessory.js +0 -16
- package/lib/DeconzDevice.js +0 -245
- package/lib/DeconzService/Sensor.js +0 -58
- package/lib/DeconzService.js +0 -43
@@ -1,4 +1,4 @@
|
|
1
|
-
// homebridge-deconz/lib/
|
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
|
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
|
-
* @
|
17
|
+
* @memberof Deconz
|
18
18
|
*/
|
19
|
-
class
|
20
|
-
/**
|
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:
|
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
|
-
/**
|
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
|
-
|
54
|
-
|
55
|
-
|
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
|
-
/**
|
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
|
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
|
95
|
-
|
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}
|
99
|
-
*
|
100
|
-
*
|
101
|
-
*
|
102
|
-
* @param {object}
|
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',
|
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}
|
125
|
-
*
|
126
|
-
*
|
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',
|
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
|
161
|
-
|
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
|
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 =
|
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
|