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 CHANGED
@@ -13,7 +13,7 @@
13
13
 
14
14
  ## zigbee2mqtt adapter for ioBroker
15
15
 
16
- Zigbee2MQTT adapter for ioBroker
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.0",
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",
@@ -195,10 +195,20 @@ class DeviceController {
195
195
  }
196
196
  }
197
197
 
198
- async processRemoveEvent(messageObj) {
198
+ processRemoveEvent(messageObj) {
199
+ let ieee_address = undefined;
199
200
  if (messageObj.payload && messageObj.payload.type == 'device_leave') {
200
- this.adapter.setStateAsync(`${messageObj.payload.data.ieee_address}.available`, false, true);
201
- this.adapter.extendObject(`${messageObj.payload.data.ieee_address}`, { common: { name: 'Device removed!', } });
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
 
@@ -10,7 +10,7 @@ class StatesController {
10
10
  this.logCustomizations = logCustomizations;
11
11
  }
12
12
 
13
- async processDeviceMessage(messageObj) {
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.setDeviceState(messageObj, device);
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 setDeviceState(messageObj, device) {
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.setStateChangedAsync(stateName, state.getter(messageObj.payload));
61
+ await this.setStateChangedSafelyAsync(stateName, state.getter(messageObj.payload));
62
62
  } else {
63
- await this.setStateChangedAsync(stateName, value);
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 setStateAsync(stateName, value) {
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 setStateChangedAsync(stateName, value) {
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
- async processQueue() {
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
- async initWsClient(server, port) {
14
+ initWsClient() {
15
15
  try {
16
- wsClient = new WebSocket(`ws://${server}:${port}/api`);
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
- async send(message) {
48
+ send(message) {
49
49
  wsClient.send(message);
50
50
  }
51
51
 
52
- async sendPingToServer() {
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
- async wsHeartbeat() {
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.onReady();
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
- websocketController = new WebsocketController(this);
112
- const wsClient = await websocketController.initWsClient(this.config.wsServerIP, this.config.wsServerPort);
111
+ this.startWebsocket();
112
+ }
113
+ }
113
114
 
114
- wsClient.on('open', () => {
115
- this.log.info('Connect to Zigbee2MQTT over websocket connection.');
116
- });
115
+ startWebsocket() {
116
+ websocketController = new WebsocketController(this);
117
+ const wsClient = websocketController.initWsClient();
117
118
 
118
- wsClient.on('message', (message) => {
119
- this.messageParse(message);
120
- });
119
+ wsClient.on('open', () => {
120
+ this.log.info('Connect to Zigbee2MQTT over websocket connection.');
121
+ });
121
122
 
122
- wsClient.on('clo', async () => {
123
- this.setStateChangedAsync('info.connection', false, true);
124
- await statesController.setAllAvailableToFalse();
125
- this.log.warn('Websocket disconnectet');
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.0",
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.8.3",
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.0.0",
48
+ "mocha": "^10.1.0",
49
49
  "prettier": "^2.7.1",
50
50
  "proxyquire": "^2.1.3",
51
51
  "sinon": "^14.0.1",