iobroker.zigbee 2.0.4 → 2.0.5

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/io-package.json CHANGED
@@ -1,8 +1,21 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "zigbee",
4
- "version": "2.0.4",
4
+ "version": "2.0.5",
5
5
  "news": {
6
+ "2.0.5": {
7
+ "en": "ZHC 23.6.0\nZH 3.3.x\nremoved extra logging\nfixed memory issue.\nConfigure on Message - 5 attempts.\nupdate transmitPower\nfix crash in ZigbeeController.ByteArrayToString\ndevice designation for devices without mapped model (allows use in groups and bindings)\n",
8
+ "de": "ZHC 23.6.0\nZH 3.3.x\nentfernte zusätzliche protokollierung\nfeste speicherausgabe.\nKonfigurieren auf Nachricht - 5 Versuche.\nupdate sendPower\ncrash in ZigbeeController beheben. ByteArrayToString\ngerätebezeichnung für geräte ohne abgebildetes modell (ermöglicht die verwendung in gruppen und bindungen)\n",
9
+ "ru": "ZHC 23.6.0\nZH 3.3.x\nудаленный дополнительный лес\nпроблемы с памятью.\nНастройка на сообщение - 5 попыток.\nобновление передатчика\nкрушение в ZigbeeController. Разработчик:teArrayToString\nобозначение устройства для устройств без картографической модели (позволяет использовать в группах и привязках)\n",
10
+ "pt": "ZHC 23.6.0\nZH 3.3.x\nretirada extra\nproblema de memória fixa.\nConfigurar na Mensagem - 5 tentativas.\natualização de energia\ncorrigir acidente em ZigbeeController. Linha de produção\ndesignação do dispositivo para dispositivos sem modelo mapeado (permite o uso em grupos e encadernações)\n",
11
+ "nl": "ZHC 23.6.0\nZH 3.3.x\nextra loggen verwijderd\nvast geheugen probleem.\nConfigureren op Bericht - 5 pogingen.\nupdate transmitPower\nherstel crash in ZigbeeController. ByteArrayToString\napparaataanduiding voor apparaten zonder in kaart gebracht model (kan worden gebruikt in groepen en bindingen)\n",
12
+ "fr": "ZHC 23.6.0\nZH 3.3.x\nretrait de l'exploitation supplémentaire\nproblème de mémoire fixe.\nConfigurer sur Message - 5 tentatives.\nmise à jour de transmissionPower\nréparer l'accident dans ZigbeeController. ByteArrayToString\ndésignation de l'appareil pour les dispositifs sans modèle cartographié (permet d'utiliser en groupes et de fixations)\n",
13
+ "it": "ZHC 23.6.0\nZH 3.3.x\nrimosso extra logging\nproblema di memoria fisso.\nConfigurare su Messaggio - 5 tentativi.\naggiornamento trasmetterePower\nfissare l'incidente a ZigbeeController. ByteArrayToString\ndesignazione del dispositivo per dispositivi senza modello mappato (permette l'uso in gruppi e binding)\n",
14
+ "es": "ZHC 23.6.0\nZH 3.3.x\nextra de registro\nproblema de memoria fijo.\nConfigurar en el Mensaje - 5 intentos.\ntransmisión de actualizaciónPower\narregla el accidente en ZigbeeController. ByteArrayToString\ndesignación de dispositivos para dispositivos sin modelo mapeado (permite el uso en grupos y encuadernaciones)\n",
15
+ "pl": "ZHC 23.6.0\nZH 3.3.x\nusunięte dodatkowe logowanie\nproblemy z pamięcią stałą.\nKonfiguracja wiadomości - 5 prób.\ntransmiter aktualizacji Power\nnaprawić wypadek w ZigbeeController. ByteArrayToString\noznaczenie urządzenia dla urządzeń bez mapowanego modelu (pozwala na stosowanie w grupach i wiązaniach)\n",
16
+ "uk": "ЗХК 23.6.0\nZH 3.3.x\nвидалення додаткового входу\nвиправлено проблему пам'яті.\nНастроювання повідомлення - 5 спроб.\nоновлення трансмісії\nфіксувати аварійну аварійну аварійність в ZigbeeController. ByteArrayToString\nпозначення пристрою для пристроїв без картографічної моделі ( дозволяє використовувати в групах і зв'язках)\n",
17
+ "zh-cn": "ZHC 23.6.0\nZH 3.3.x 电话\n已删除的额外日志\n固定记忆问题.\n配置信件 - 5 个尝试 .\n更新传输\n修复Zigbee控制器的崩溃。 字节箭头结构\n没有绘图模型的设备指定(分组和捆绑中的允许使用)\n"
18
+ },
6
19
  "2.0.4": {
7
20
  "en": "back to 2.0.2",
8
21
  "de": "zurück zu 2.0.2",
@@ -55,19 +68,6 @@
55
68
  "uk": "БРЕАКІНГОВІ ЗМІНИ\n\nперемикач на перетворювачі 21 змінює висадки для великої кількості пристроїв (найбільш віддалені)\nновий метод контролю кольору на основі підканалів для rgb, hs і xy\nЗа замовчуванням для всіх пристроїв. Використання старого визначення як варіант\nВимагає Node 20.x або нові\n\nФіксація Пірсинг\nзмінити пінг\nгенерація карти затримки до освіження активується, повідомлення після генерації\nвидалити вкладку в'язання з вкладки zigbee\nвкладка зворотного замовлення в конфігурації\nвидалити вкладку з конфігурації\nвидалити карту з конфігурації\nadd debug до zigbee tab\nEnglish, Українська, Français..\nЕкспози як за замовчуванням, використання застарілих параметрів пристрою, як необов'язковий\nКористувальницькі специфічні зображення (моделі на основі пристрою)\nУдосконалено редагування груп - видалення членів з групової картки",
56
69
  "zh-cn": "裂变\n\n21 更改大量设备(大多为远程设备)的曝光量\n基于 rgb、 hs 和 xy 子通道的新的颜色控制方法\n曝光为默认所有设备 。 仅将旧定义用作选项\n需要节点 20.x 或更新\n\n修复对齐\n更改键\n将映射生成延迟到刷新启动, 映射消息生成后\n从 zigbee 标签中删除绑定标签\n在配置中重新排序标签\n从配置中删除绑定标签\n从配置中删除地图\n添加调试到 zigbee 标签\n牧民 3.2.5,转换器 21.30.0\n将曝光作为默认, 将旧设备定义作为遗留选项\n用户特定图像( 基于模型、 设备)\n改进组编辑 - 从组卡中删除成员"
57
70
  },
58
- "1.11.2": {
59
- "en": "debug for states",
60
- "de": "debug for states",
61
- "ru": "debug for states",
62
- "pt": "debug for states",
63
- "nl": "debug for states",
64
- "fr": "debug for states",
65
- "it": "debug for states",
66
- "es": "debug for states",
67
- "pl": "debug for states",
68
- "uk": "debug for states",
69
- "zh-cn": "debug for states"
70
- },
71
71
  "1.10.14": {
72
72
  "en": "Herdsman 2.1.9, Converters 20.58.0\nFix: Aqara T1M (CL-L02D) \ndeleteDeviceStates change to deleteObj",
73
73
  "de": "Herdsman 2.1.9, Konverter 20.58.0\nFix: Aqara T1M (CL-L02D)\nlöschen DeviceState Änderung zum Löschen Ob",
@@ -187,7 +187,7 @@
187
187
  },
188
188
  "globalDependencies": [
189
189
  {
190
- "admin": ">=5.1.25"
190
+ "admin": ">=6.0.0"
191
191
  }
192
192
  ],
193
193
  "dependencies": [
@@ -270,27 +270,6 @@
270
270
  "flowCTRL": false
271
271
  },
272
272
  "instanceObjects": [
273
- {
274
- "_id": "exclude",
275
- "type": "channel",
276
- "common": {
277
- "name": "exclude devs from devices.js"
278
- },
279
- "native": {}
280
- },
281
- {
282
- "_id": "exclude.all",
283
- "type": "state",
284
- "common": {
285
- "role": "state",
286
- "name": "all",
287
- "type": "string",
288
- "read": true,
289
- "write": true,
290
- "def": "[]"
291
- },
292
- "native": {}
293
- },
294
273
  {
295
274
  "_id": "info",
296
275
  "type": "channel",
@@ -351,19 +330,6 @@
351
330
  },
352
331
  "native": {}
353
332
  },
354
- {
355
- "_id": "info.groups",
356
- "type": "state",
357
- "common": {
358
- "role": "state",
359
- "name": "Groups",
360
- "type": "string",
361
- "read": true,
362
- "write": false,
363
- "def": ""
364
- },
365
- "native": {}
366
- },
367
333
  {
368
334
  "_id": "info.undefinedDevices",
369
335
  "type": "state",
@@ -6,6 +6,7 @@ class DeviceDebug extends EventEmitter {
6
6
  this.adapter = adapter;
7
7
  this.dataByID = { };
8
8
  this.dataByDevice = { };
9
+ this.logStatus = true;
9
10
 
10
11
  }
11
12
 
@@ -65,14 +66,15 @@ class DeviceDebug extends EventEmitter {
65
66
  target.push(item);
66
67
  this.dataByDevice[item.deviceID] = DevData;
67
68
  }
68
- if (message.hasOwnProperty('message')) {
69
+ if (message.hasOwnProperty('message') && this.logStatus) {
69
70
  this.warn(`ELEVATED:${flag} (${dataId.toString(16).slice(-4)}) ${message.message}`)
70
71
  }
71
72
  }
72
73
  }
73
74
  }
74
75
 
75
- collectDebugData() {
76
+ collectDebugData(logStatus) {
77
+ this.logStatus = logStatus;
76
78
  return this.dataByDevice;
77
79
  }
78
80
  }
package/lib/commands.js CHANGED
@@ -154,6 +154,10 @@ class Commands {
154
154
  if (obj) {
155
155
  this.adapter.sendTo(obj.from, obj.command, {clean:this.stController.CleanupRequired(), errors:this.stController.getStashedErrors()}, obj.callback);
156
156
  }
157
+ case 'getDebugMessages':
158
+ if (obj) {
159
+ this.adapter.sendTo(obj.from, obj.command, {byId:this.adapter.deviceDebug.collectDebugData( obj.message.inlog)},obj.callback);
160
+ }
157
161
  }
158
162
  }
159
163
  }
@@ -352,6 +356,18 @@ class Commands {
352
356
 
353
357
  const id = getZbId(devInfo._id);
354
358
  devInfo.info = await this.zbController.resolveEntity(id);
359
+ // check configuration
360
+ try {
361
+ if (devInfo.info) {
362
+ const result = await this.zbController.callExtensionMethod(
363
+ 'shouldConfigure',
364
+ [devInfo.info.device, devInfo.info.mapped],
365
+ );
366
+ if (result.length > 0) devInfo.isConfigured = !result[0];
367
+ }
368
+ } catch (error) {
369
+ this.warn('error calling shouldConfigure: ' + error && error.message ? error.message : 'no error message');
370
+ }
355
371
 
356
372
  devInfo.rooms = [];
357
373
  for (const room in rooms) {
@@ -588,7 +604,7 @@ class Commands {
588
604
  async getLocalImages(from, command, msg, callback) {
589
605
  if (this.stController) {
590
606
  const id = msg.id;
591
- const result = await this.stController.localConfig.enumerateImages(utils.getAbsoluteInstanceDataDir(this.adapter).replace('.','_'));
607
+ const result = await this.stController.localConfig.enumerateImages(utils.getAbsoluteInstanceDataDir(this.adapter).replace('zigbee.','zigbee_'));
592
608
  this.adapter.sendTo(from, command, {imageData:result}, callback)
593
609
  }
594
610
  }
@@ -623,6 +639,10 @@ class Commands {
623
639
  const target = msg.target.replace(`${this.adapter.namespace}.`, '');
624
640
  const entity = await this.zbController.resolveEntity(target);
625
641
  //this.warn('entity for ' + target + ' is '+ JSON.stringify(entity))
642
+ if (entity && !entity.mapped) {
643
+ this.warn('unable to set local Override for device whithout mapped model');
644
+ return;
645
+ }
626
646
  if (msg.data)
627
647
  {
628
648
  for (const prop in msg.data) {
@@ -653,7 +673,6 @@ class Commands {
653
673
  'doConfigure',
654
674
  [entity.device, entity.mapped],
655
675
  );
656
- this.warn('do configure result is ' + JSON.stringify(result));
657
676
  const msg = result.join(',');
658
677
  if (msg.length > 5)
659
678
  this.adapter.sendTo(from, command, {error: msg}, callback);
package/lib/developer.js CHANGED
File without changes
package/lib/exposes.js CHANGED
@@ -594,7 +594,7 @@ function createFromExposes(model, def, device, log) {
594
594
  break;
595
595
 
596
596
  case 'voltage':
597
- state = statesDefs.plug_voltage;
597
+ state = genState(expose);
598
598
  break;
599
599
 
600
600
  case 'temperature':
@@ -885,9 +885,14 @@ function applyExposes(mappedDevices, byModel) {
885
885
  }
886
886
  }
887
887
 
888
- async function applyExposeForDevice(mappedDevices, byModel, device) {
888
+ async function applyExposeForDevice(mappedDevices, byModel, device, logger) {
889
+ const t = Date.now();
889
890
  const deviceDef = await zigbeeHerdsmanConverters.findByDevice(device);
890
- if (!deviceDef) return false;
891
+ if (!deviceDef) {
892
+ //logger.warn(`ZHC02,${Date.now()},${Date.now()-t},${device && device.ieeeAddr ? device.ieeeAddr : '0x0'}, failed`);
893
+ return false;
894
+ }
895
+ //logger.warn(`ZHC02,${Date.now()},${Date.now()-t},${device && device.ieeeAddr ? device.ieeeAddr : '0x0'}, passed`);
891
896
  applyDeviceDef(mappedDevices, byModel, deviceDef, device);
892
897
  return true;
893
898
  }
package/lib/groups.js CHANGED
@@ -2,7 +2,6 @@
2
2
 
3
3
  const json = require('iobroker.zigbee/lib/json');
4
4
  const statesMapping = require('./devices');
5
- const { numberWithinRange } = require('zigbee-herdsman-converters/lib/utils');
6
5
  const idRegExp = new RegExp(/group_(\d+)/);
7
6
 
8
7
 
@@ -168,7 +167,7 @@ class Groups {
168
167
  for (const gpid of groups[epid]) {
169
168
  const gpidn = parseInt(gpid);
170
169
  if (gpidn < 0) {
171
- this.warn(`calling removeDevFromGroup with ${sysid}, ${-gpidn}, ${epid}` );
170
+ this.debug(`calling removeDevFromGroup with ${sysid}, ${-gpidn}, ${epid}` );
172
171
  const response = await this.zbController.removeDevFromGroup(sysid, (-gpidn), epid);
173
172
  if (response && response.error) {
174
173
  errors.push(response.error);
@@ -176,7 +175,7 @@ class Groups {
176
175
  }
177
176
  const icon = this.stController.getDefaultGroupIcon(-gpidn)
178
177
  } else if (gpidn > 0) {
179
- this.warn(`calling addDevToGroup with ${sysid}, ${gpidn}, ${epid}` );
178
+ this.debug(`calling addDevToGroup with ${sysid}, ${gpidn}, ${epid}` );
180
179
  const response = await this.zbController.addDevToGroup(sysid, (gpidn), epid);
181
180
  if (response && response.error) {
182
181
  errors.push(response.error);
@@ -233,7 +232,7 @@ class Groups {
233
232
  throw error;
234
233
  }
235
234
  if (result.unread.length > 0) {
236
- this.warn(`unread ${stateDesc.id} change for group members ${JSON.stringify(result.unread)}`);
235
+ this.debug(`unread ${stateDesc.id} change for group members ${JSON.stringify(result.unread)}`);
237
236
  }
238
237
  }
239
238
 
@@ -254,11 +253,10 @@ class Groups {
254
253
  if (message.remove) {
255
254
  for (const member of message.remove) {
256
255
  const response = await this.zbController.removeDevFromGroup(member.id, id, member.ep);
257
- this.warn('trying to remove ' + member.id + (member.ep ? '.'+member.ep : '') + ' ' + ' from group ' + message.id + ' response is '+JSON.stringify(response));
256
+ this.debug('trying to remove ' + member.id + (member.ep ? '.'+member.ep : '') + ' ' + ' from group ' + message.id + ' response is '+JSON.stringify(response));
258
257
  }
259
258
  }
260
259
  if (icon.match(/img\/group_\d+\.png/g)) {
261
- this.warn('.');
262
260
  icon = await this.zbController.rebuildGroupIcon(group);
263
261
  }
264
262
  } catch (e) {
@@ -270,7 +268,7 @@ class Groups {
270
268
  this.warn(`rename group name ${name}, id ${id}, icon ${icon} remove ${JSON.stringify(message.removeMembers)}`);
271
269
  const group = await this.adapter.getObjectAsync(id);
272
270
  if (!group) {
273
- this.warn('group object doesnt exist ')
271
+ this.debug('group object doesnt exist ')
274
272
  // assume we have to create the group
275
273
  this.adapter.setObjectNotExists(id, {
276
274
  type: 'device',
@@ -301,7 +299,7 @@ class Groups {
301
299
  });
302
300
  }
303
301
  else {
304
- this.warn('group object exists');
302
+ this.debug('group object exists');
305
303
  this.adapter.extendObject(id, {common: {name, type: 'group', icon: icon}});
306
304
  }
307
305
  }
@@ -138,7 +138,7 @@ class localConfig extends EventEmitter {
138
138
  try {
139
139
  this.adapter.fileExists(namespace, rv, (err, result) => {
140
140
  if (result) return;
141
- const src = this.adapter.expandFileName(iconPath).replace('.','_');
141
+ const src = this.adapter.expandFileName(iconPath).replace('zigbee.','zigbee_');
142
142
  fs.readFile(src, (err, data) => {
143
143
  if (err) {
144
144
  this.error('unable to read ' + src + ' : '+ (err && err.message? err.message:' no message given'))
@@ -220,8 +220,7 @@ class localConfig extends EventEmitter {
220
220
  }
221
221
 
222
222
  async updateFromDeviceNames() {
223
- this.warn('updateFromDeviceNames');
224
- const fn = this.adapter.expandFileName('dev_names').replace('.', '_').concat('.json');
223
+ const fn = this.adapter.expandFileName('dev_names').replace('zigbee.', 'zigbee_').concat('.json');
225
224
  fs.readFile(fn, (err, content) => {
226
225
  if (!err) {
227
226
  let data_js = {};
@@ -250,7 +249,7 @@ class localConfig extends EventEmitter {
250
249
 
251
250
  async init() {
252
251
  this.info('init localConfig');
253
- const fn = this.adapter.expandFileName('LocalOverrides').replace('.','_').concat('.json');
252
+ const fn = this.adapter.expandFileName('LocalOverrides').replace('zigbee.','zigbee_').concat('.json');
254
253
  this.filename = fn;
255
254
  this.basefolder = path.dirname(fn);
256
255
 
@@ -286,7 +285,7 @@ class localConfig extends EventEmitter {
286
285
  const files= fs.readdirSync(_path, {withFileTypes: true, recursive: true}).filter(item => (!item.isDirectory() && item.name.endsWith('.png')));
287
286
  files.forEach((item) => {
288
287
  const fn = path.join(item.parentPath, item.name);
289
- rv.push({file: fn, name: item.name, data: fs.readFileSync(path.join(item.parentPath, item.name), 'base64')})
288
+ rv.push({file: fn, name: item.name, data: fs.readFileSync(path.join(item.parentPath, item.name), 'base64'), isBase64:true});
290
289
  });
291
290
  //this.warn('enumerateImages for ' + _path + ' is ' + JSON.stringify(rv));
292
291
  }
package/lib/ota.js CHANGED
@@ -55,7 +55,7 @@ class Ota {
55
55
  async checkOtaAvail(obj) {
56
56
  const device = await this.getDeviceForMessage(obj);
57
57
  if (!device) {
58
- this.debug(`Device ${obj.message.devId} is unavailable`);
58
+ this.info(`Device ${obj.message.devId} is unavailable`);
59
59
  this.adapter.sendTo(obj.from, obj.command, {
60
60
  status: 'fail',
61
61
  device: getZbId(obj.message.devId),
@@ -64,13 +64,13 @@ class Ota {
64
64
  return;
65
65
  }
66
66
  if (this.inProgress.has(device.device.ieeeAddr)) {
67
- this.warn(`Update or check already in progress for '${device.name}', skipping...`);
67
+ this.info(`Update or check already in progress for '${device.name}', skipping...`);
68
68
  return;
69
69
  }
70
70
  // do not attempt update for a device which has been deactivated or is unavailable
71
71
  const stateObj = await this.adapter.getObjectAsync(obj.message.devId);
72
72
  if (stateObj && stateObj.common && stateObj.common.deactivated) {
73
- this.warn(`Device ${obj.message.devId} is deactivated, skipping...`);
73
+ this.info(`Device ${obj.message.devId} is deactivated, skipping...`);
74
74
  this.adapter.sendTo(obj.from, obj.command, {
75
75
  status: 'fail',
76
76
  device: getZbId(obj.message.devId),
@@ -81,7 +81,7 @@ class Ota {
81
81
  const availablestate = await this.adapter.getStateAsync(`${obj.message.devId.replace(this.namespace + '.', '')}.available`);
82
82
  const lqi = await this.adapter.getStateAsync(`${obj.message.devId.replace(this.namespace + '.', '')}.link_quality`);
83
83
  if ((availablestate && (!availablestate.val)) || (lqi && lqi.val < 1)) {
84
- this.warn(`Device ${obj.message.devId} is marked unavailable, skipping...`);
84
+ this.info(`Device ${obj.message.devId} is marked unavailable, skipping...`);
85
85
  this.adapter.sendTo(obj.from, obj.command, {
86
86
  status: 'fail',
87
87
  device: getZbId(obj.message.devId),
@@ -133,13 +133,13 @@ class Ota {
133
133
  // do not attempt update for a device which has been deactivated or is unavailable
134
134
  const stateObj = await this.adapter.getObjectAsync(obj.message.devId);
135
135
  if (stateObj && stateObj.common && stateObj.common.deactivated) {
136
- this.warn(`Device ${obj.message.devId} is deactivated, skipping...`);
136
+ this.info(`Device ${obj.message.devId} is deactivated, skipping...`);
137
137
  return;
138
138
  }
139
139
  const availablestate = await this.adapter.getStateAsync(`${obj.message.devId.replace(this.namespace + '.', '')}.available`);
140
140
  const lqi = await this.adapter.getStateAsync(`${obj.message.devId.replace(this.namespace + '.', '')}.link_quality`);
141
141
  if ((availablestate && (!availablestate.val)) || (lqi && lqi.val < 1)) {
142
- this.warn(`Device ${obj.message.devId} is marked unavailable, skipping...`);
142
+ this.info(`Device ${obj.message.devId} is marked unavailable, skipping...`);
143
143
  return;
144
144
  }
145
145
  this.inProgress.add(device.device.ieeeAddr);