iobroker.zigbee2mqtt 2.1.0 → 2.1.1
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 +6 -1
- package/io-package.json +14 -1
- package/lib/deviceController.js +13 -3
- package/lib/statesController.js +8 -8
- package/lib/websocketController.js +6 -6
- package/main.js +22 -14
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
|
|
14
14
|
## zigbee2mqtt adapter for ioBroker
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
This adapter allows to control the data points of the devices of a Zigbee2MQTT instance in ioBroker.
|
|
17
17
|
|
|
18
18
|
## Adapter Documentation
|
|
19
19
|
|
|
@@ -30,6 +30,11 @@ Zigbee2MQTT adapter for ioBroker
|
|
|
30
30
|
Placeholder for the next version (at the beginning of the line):
|
|
31
31
|
### **WORK IN PROGRESS**
|
|
32
32
|
-->
|
|
33
|
+
### 2.1.1 (2022-10-16)
|
|
34
|
+
|
|
35
|
+
- (o0shojo0o) advanced detection if a device has been removed
|
|
36
|
+
- (o0shojo0o) fixes the design error in the websocket connection
|
|
37
|
+
|
|
33
38
|
### 2.1.0 (2022-10-14)
|
|
34
39
|
|
|
35
40
|
- (o0shojo0o) added option for color temperature sync with color
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "zigbee2mqtt",
|
|
4
|
-
"version": "2.1.
|
|
4
|
+
"version": "2.1.1",
|
|
5
5
|
"news": {
|
|
6
|
+
"2.1.1": {
|
|
7
|
+
"en": "advanced detection if a device has been removed\nfixes the design error in the websocket connection",
|
|
8
|
+
"de": "fortgeschrittene erkennung, wenn ein gerät entfernt wurde\nkorrigiert den designfehler in der websocket-verbindung",
|
|
9
|
+
"ru": "предварительное обнаружение, если устройство было удалено\nисправляет ошибку дизайна в подключении к сети",
|
|
10
|
+
"pt": "detecção avançada se um dispositivo foi removido\ncorrige o erro de projeto na conexão websocket",
|
|
11
|
+
"nl": "als er een apparaat verwijderd is\nde ontwerpfout in de websocket verbinding",
|
|
12
|
+
"fr": "détection avancée si un dispositif a été enlevé\ncorrige l'erreur de conception dans la connexion websocket",
|
|
13
|
+
"it": "rilevamento avanzato se un dispositivo è stato rimosso\ncorregge l'errore di progettazione nella connessione websocket",
|
|
14
|
+
"es": "detección avanzada si se ha eliminado un dispositivo\nfija el error de diseño en la conexión websocket",
|
|
15
|
+
"pl": "wykrywanie zaawansowane, jeśli urządzenie zostało usunięte\numożliwia to błędy projektowe w łączu internetowym",
|
|
16
|
+
"uk": "розширене виявлення, якщо пристрій було видалено\nвиправлено помилку дизайну в підключенні websocket",
|
|
17
|
+
"zh-cn": "如果一个装置被拆除,则预先发现\nf 确定网站的设计错误"
|
|
18
|
+
},
|
|
6
19
|
"2.1.0": {
|
|
7
20
|
"en": "added option for color temperature sync with color\nfix logfilter and debugDevices\nlots of bugfixes\nnow set the correct min/max at color temp\nbetter error handling for the connections",
|
|
8
21
|
"de": "zusatzoption für farbtemperatur-sync mit farbe\nlogfilter und DebugDevices fixieren\nviele bugfixes\njetzt die richtige min/max in der farbe tempo einstellen\nbessere fehlerbehandlung für die verbindungen",
|
package/lib/deviceController.js
CHANGED
|
@@ -195,10 +195,20 @@ class DeviceController {
|
|
|
195
195
|
}
|
|
196
196
|
}
|
|
197
197
|
|
|
198
|
-
|
|
198
|
+
processRemoveEvent(messageObj) {
|
|
199
|
+
let ieee_address = undefined;
|
|
199
200
|
if (messageObj.payload && messageObj.payload.type == 'device_leave') {
|
|
200
|
-
|
|
201
|
-
|
|
201
|
+
ieee_address = messageObj.payload.data.ieee_address;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
//{"data":{"block":false,"force":true,"id":"0xa4c138c954baaf54"},"status":"ok","transaction":"zhvjf-5"}
|
|
205
|
+
if (messageObj.payload && messageObj.payload.data) {
|
|
206
|
+
ieee_address = messageObj.payload.data.id;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
if (ieee_address != undefined) {
|
|
210
|
+
this.adapter.setStateAsync(`${ieee_address}.available`, false, true);
|
|
211
|
+
this.adapter.extendObject(`${ieee_address}`, { common: { name: 'Device removed!', } });
|
|
202
212
|
}
|
|
203
213
|
}
|
|
204
214
|
|
package/lib/statesController.js
CHANGED
|
@@ -10,7 +10,7 @@ class StatesController {
|
|
|
10
10
|
this.logCustomizations = logCustomizations;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
processDeviceMessage(messageObj) {
|
|
14
14
|
// Is payload present?
|
|
15
15
|
if (messageObj.payload == '') {
|
|
16
16
|
return;
|
|
@@ -19,7 +19,7 @@ class StatesController {
|
|
|
19
19
|
const device = this.groupCache.concat(this.deviceCache).find(x => x.id == messageObj.topic);
|
|
20
20
|
if (device) {
|
|
21
21
|
try {
|
|
22
|
-
this.
|
|
22
|
+
this.setDeviceStateSafely(messageObj, device);
|
|
23
23
|
} catch (error) {
|
|
24
24
|
this.adapter.log.error(error);
|
|
25
25
|
}
|
|
@@ -29,7 +29,7 @@ class StatesController {
|
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
async
|
|
32
|
+
async setDeviceStateSafely(messageObj, device) {
|
|
33
33
|
if (this.logCustomizations.debugDevices.includes(device.ieee_address)) {
|
|
34
34
|
this.adapter.log.warn(`--->>> fromZ2M -> ${device.ieee_address} states: ${JSON.stringify(messageObj)}`);
|
|
35
35
|
}
|
|
@@ -58,9 +58,9 @@ class StatesController {
|
|
|
58
58
|
}
|
|
59
59
|
} else {
|
|
60
60
|
if (state.getter) {
|
|
61
|
-
await this.
|
|
61
|
+
await this.setStateChangedSafelyAsync(stateName, state.getter(messageObj.payload));
|
|
62
62
|
} else {
|
|
63
|
-
await this.
|
|
63
|
+
await this.setStateChangedSafelyAsync(stateName, value);
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
66
|
} catch (err) {
|
|
@@ -71,13 +71,13 @@ class StatesController {
|
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
73
|
|
|
74
|
-
async
|
|
74
|
+
async setStateSafelyAsync(stateName, value) {
|
|
75
75
|
if (value !== undefined) {
|
|
76
76
|
await this.adapter.setStateAsync(stateName, value, true);
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
-
async
|
|
80
|
+
async setStateChangedSafelyAsync(stateName, value) {
|
|
81
81
|
if (value !== undefined) {
|
|
82
82
|
await this.adapter.setStateChangedAsync(stateName, value, true);
|
|
83
83
|
}
|
|
@@ -95,7 +95,7 @@ class StatesController {
|
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
-
|
|
98
|
+
processQueue() {
|
|
99
99
|
const oldIncStatsQueue = [];
|
|
100
100
|
utils.moveArray(incStatsQueue, oldIncStatsQueue);
|
|
101
101
|
while (oldIncStatsQueue.length > 0) {
|
|
@@ -11,9 +11,9 @@ class WebsocketController {
|
|
|
11
11
|
this.adapter = adapter;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
initWsClient() {
|
|
15
15
|
try {
|
|
16
|
-
wsClient = new WebSocket(`ws://${
|
|
16
|
+
wsClient = new WebSocket(`ws://${this.adapter.config.wsServerIP}:${this.adapter.config.wsServerPort}/api`);
|
|
17
17
|
|
|
18
18
|
wsClient.on('open', () => {
|
|
19
19
|
// Send ping to server
|
|
@@ -45,11 +45,11 @@ class WebsocketController {
|
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
send(message) {
|
|
49
49
|
wsClient.send(message);
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
|
|
52
|
+
sendPingToServer() {
|
|
53
53
|
//this.logDebug('Send ping to server');
|
|
54
54
|
wsClient.ping();
|
|
55
55
|
ping = setTimeout(() => {
|
|
@@ -57,7 +57,7 @@ class WebsocketController {
|
|
|
57
57
|
}, wsHeartbeatIntervall);
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
-
|
|
60
|
+
wsHeartbeat() {
|
|
61
61
|
clearTimeout(pingTimeout);
|
|
62
62
|
pingTimeout = setTimeout(() => {
|
|
63
63
|
this.adapter.log.warn('Websocked connection timed out');
|
|
@@ -68,7 +68,7 @@ class WebsocketController {
|
|
|
68
68
|
async autoRestart() {
|
|
69
69
|
this.adapter.log.warn(`Start try again in ${restartTimeout / 1000} seconds...`);
|
|
70
70
|
autoRestartTimeout = setTimeout(() => {
|
|
71
|
-
this.adapter.
|
|
71
|
+
this.adapter.startWebsocket();
|
|
72
72
|
}, restartTimeout);
|
|
73
73
|
}
|
|
74
74
|
|
package/main.js
CHANGED
|
@@ -108,23 +108,27 @@ class Zigbee2mqtt extends core.Adapter {
|
|
|
108
108
|
await this.delay(1500);
|
|
109
109
|
}
|
|
110
110
|
|
|
111
|
-
|
|
112
|
-
|
|
111
|
+
this.startWebsocket();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
113
114
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
115
|
+
startWebsocket() {
|
|
116
|
+
websocketController = new WebsocketController(this);
|
|
117
|
+
const wsClient = websocketController.initWsClient();
|
|
117
118
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
119
|
+
wsClient.on('open', () => {
|
|
120
|
+
this.log.info('Connect to Zigbee2MQTT over websocket connection.');
|
|
121
|
+
});
|
|
121
122
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
123
|
+
wsClient.on('message', (message) => {
|
|
124
|
+
this.messageParse(message);
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
wsClient.on('close', async () => {
|
|
128
|
+
this.setStateChangedAsync('info.connection', false, true);
|
|
129
|
+
await statesController.setAllAvailableToFalse();
|
|
130
|
+
this.log.warn('Websocket disconnectet');
|
|
131
|
+
});
|
|
128
132
|
}
|
|
129
133
|
|
|
130
134
|
async messageParse(message) {
|
|
@@ -159,6 +163,10 @@ class Zigbee2mqtt extends core.Adapter {
|
|
|
159
163
|
statesController.processQueue();
|
|
160
164
|
break;
|
|
161
165
|
case 'bridge/event':
|
|
166
|
+
console.log(JSON.stringify(messageObj));
|
|
167
|
+
deviceController.processRemoveEvent(messageObj);
|
|
168
|
+
break;
|
|
169
|
+
case 'bridge/response/device/remove':
|
|
162
170
|
deviceController.processRemoveEvent(messageObj);
|
|
163
171
|
break;
|
|
164
172
|
case 'bridge/extensions':
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.zigbee2mqtt",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.1",
|
|
4
4
|
"description": "Zigbee2MQTT adapter for ioBroker",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Dennis Rathjen",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"@types/chai": "^4.3.3",
|
|
37
37
|
"@types/chai-as-promised": "^7.1.5",
|
|
38
38
|
"@types/mocha": "^10.0.0",
|
|
39
|
-
"@types/node": "^18.
|
|
39
|
+
"@types/node": "^18.11.0",
|
|
40
40
|
"@types/proxyquire": "^1.3.28",
|
|
41
41
|
"@types/sinon": "^10.0.13",
|
|
42
42
|
"@types/sinon-chai": "^3.2.8",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"eslint": "^8.25.0",
|
|
46
46
|
"eslint-config-prettier": "^8.5.0",
|
|
47
47
|
"eslint-plugin-prettier": "^4.2.1",
|
|
48
|
-
"mocha": "^10.
|
|
48
|
+
"mocha": "^10.1.0",
|
|
49
49
|
"prettier": "^2.7.1",
|
|
50
50
|
"proxyquire": "^2.1.3",
|
|
51
51
|
"sinon": "^14.0.1",
|