iobroker.zigbee 3.2.0 → 3.2.2
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 +10 -0
- package/admin/admin.js +4 -2
- package/io-package.json +27 -27
- package/lib/commands.js +19 -2
- package/lib/groups.js +1 -1
- package/lib/localConfig.js +6 -1
- package/lib/zigbeecontroller.js +20 -13
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -154,6 +154,16 @@ You can thank the authors by these links:
|
|
|
154
154
|
|
|
155
155
|
-----------------------------------------------------------------------------------------------------
|
|
156
156
|
## Changelog
|
|
157
|
+
### 3.2.2 (2025-10-27)
|
|
158
|
+
* (asgothian) Bugfix on delete object.
|
|
159
|
+
* (asgothian) improved device query.
|
|
160
|
+
* (asgothain) fixed delete device with local overrides.
|
|
161
|
+
*
|
|
162
|
+
|
|
163
|
+
### 3.2.1 (2025-10-26)
|
|
164
|
+
* (asgothian) fix bug #2640
|
|
165
|
+
*
|
|
166
|
+
|
|
157
167
|
### 3.2.0 (2025-10-26)
|
|
158
168
|
* (asgothian) remove local overrides tab from config
|
|
159
169
|
* (asgothian) establish local data tab in config to edit global and device level settings and options
|
package/admin/admin.js
CHANGED
|
@@ -466,7 +466,8 @@ function showLocalData() {
|
|
|
466
466
|
const keys = item.replace('d_delall_', '').split('-');
|
|
467
467
|
const model = models[keys[0]];
|
|
468
468
|
const device = model.devices.find( (d) => d.native.id === keys[1]);
|
|
469
|
-
|
|
469
|
+
console.warn(`setting delete confirmation with ${keys[1]} ${models[keys[0]].devices?.length} ${models[keys[0]]?.model.model} `);
|
|
470
|
+
deleteConfirmation(keys[1], device.common.name, keys[1], models[keys[0]]?.devices?.length <=1 ? models[keys[0]]?.model?.model : undefined);
|
|
470
471
|
});
|
|
471
472
|
}
|
|
472
473
|
}
|
|
@@ -497,6 +498,7 @@ function getCard(dev) {
|
|
|
497
498
|
rooms.push(dev.rooms[r]);
|
|
498
499
|
}
|
|
499
500
|
}
|
|
501
|
+
|
|
500
502
|
const NoInterviewIcon = dev.info?.device?.interviewstate != 'SUCCESSFUL' ? `<div class="col tool"><i class="material-icons icon-red">perm_device_information</i></div>` : ``;
|
|
501
503
|
const paired = (dev.paired) ? '' : '<i class="material-icons right">leak_remove</i>';
|
|
502
504
|
const rid = id.split('.').join('_');
|
|
@@ -1835,7 +1837,7 @@ function displayDebugMessages(msg) {
|
|
|
1835
1837
|
const modelUrl = (type_url === 'unknown') ? 'unknown' : `<a href="https://www.zigbee2mqtt.io/devices/${type_url}.html" target="_blank" rel="noopener noreferrer">${image}</a>`;
|
|
1836
1838
|
const devName = (dev && dev.common && dev.common.name) ? dev.common.name : 'unnamed';
|
|
1837
1839
|
const button = `<a id="e_${devID}" class="btn-floating waves-effect waves-light green tooltipped center-align hoverable translateT" title="Update debug messages"><i class="material-icons large">sync_problem</i></a>`
|
|
1838
|
-
const dbutton = `<a id="d_${devID}" class="btn-floating waves-effect waves-light red tooltipped center-align hoverable translateT" title="
|
|
1840
|
+
const dbutton = `<a id="d_${devID}" class="btn-floating waves-effect waves-light red tooltipped center-align hoverable translateT" title="Delete debug messages"><i class="material-icons icon-yellow large">delete_forever</i></a>`;
|
|
1839
1841
|
buttonNames.push(devID);
|
|
1840
1842
|
Html.push(`<li><table><thead id="dbgtable"><tr><td colspan="4">${devName} (ID: ${devID} Model: ${dev && dev.common ? dev.common.name : 'unknown'})</td><td>${modelUrl}</td><td>${button}</td><td>${dbutton}</td></tr></thead><tbody>`);
|
|
1841
1843
|
if (dbgData[devID].IN.length > 0) {
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "zigbee",
|
|
4
|
-
"version": "3.2.
|
|
4
|
+
"version": "3.2.2",
|
|
5
5
|
"news": {
|
|
6
|
+
"3.2.2": {
|
|
7
|
+
"en": "Bugfix on delete object.\nimproved device query.\nfixed delete device with local overrides.\n",
|
|
8
|
+
"de": "Bugfix auf Löschobjekt.\nverbesserte geräteabfrage.\nfeste löschvorrichtung mit lokalen overrides.\n",
|
|
9
|
+
"ru": "Bugfix для удаления объекта.\nулучшенный запрос устройства.\nфиксированное устройство удаления с локальными переопределениями.\n",
|
|
10
|
+
"pt": "Correcção de erros ao apagar o objecto.\npesquisa de dispositivos melhorada.\ndispositivo de exclusão fixo com substituições locais.\n",
|
|
11
|
+
"nl": "Bugfix bij verwijderen van object.\nverbeterde apparaatquery.\nvast delete apparaat met lokale overrides.\n",
|
|
12
|
+
"fr": "Correction sur objet de suppression.\nrequête de périphérique améliorée.\ndispositif de suppression fixe avec redéfinitions locales.\n",
|
|
13
|
+
"it": "Bugfix su delete object.\nmigliore query del dispositivo.\ndispositivo di cancellazione fisso con override locali.\n",
|
|
14
|
+
"es": "Bugfix en el objeto borrado.\nmejorada consulta de dispositivos.\ndispositivo de eliminación fijo con anulas locales.\n",
|
|
15
|
+
"pl": "Bugfix na usunąć obiekt.\nulepszone zapytanie urządzenia.\nnaprawione urządzenie usuwające z lokalnymi przekroczeniami.\n",
|
|
16
|
+
"uk": "Виправлення помилок при видаленні об'єкта.\nпокращений пристрій запиту.\nфіксований пристрій видалення з локальними перенаряддями.\n",
|
|
17
|
+
"zh-cn": "删除对象上的错误修正 .\n改进设备查询 .\n有本地覆盖的固定删除设备 .\n"
|
|
18
|
+
},
|
|
19
|
+
"3.2.1": {
|
|
20
|
+
"en": "fix bug #2640\n",
|
|
21
|
+
"de": "fehler beheben #2640\n",
|
|
22
|
+
"ru": "исправить ошибку #2640\n",
|
|
23
|
+
"pt": "corrigir o erro # 2640\n",
|
|
24
|
+
"nl": "fix bug #2640\n",
|
|
25
|
+
"fr": "correction du bug #2640\n",
|
|
26
|
+
"it": "fix bug #2640\n",
|
|
27
|
+
"es": "corrección de error #2640\n",
|
|
28
|
+
"pl": "fix bug # 2640\n",
|
|
29
|
+
"uk": "виправлення помилки #2640\n",
|
|
30
|
+
"zh-cn": "修复错误 # 2640\n"
|
|
31
|
+
},
|
|
6
32
|
"3.2.0": {
|
|
7
33
|
"en": "remove local overrides tab from config\nestablish local data tab in config to edit global and device level settings and options\nremove the local overrides tab\nremove the ability to set model level overrides from device tab.\nfix errors for 'polling' devices with changed poll times.\nwarning icon for devices which are not completely interviewed.\nimproved router detection for opening the network\nbugfix: open network on router\nZHC 25.x latest, ZH 6.1.3,\nrestore from in-adapter backup",
|
|
8
34
|
"de": "entfernen sie lokale overrides tab von config\nlokale daten tab erstellen, um globale und geräteebene einstellungen und optionen zu bearbeiten\nentfernen der lokalen overrides tab\nentfernen sie die fähigkeit, modellebene überschrieben von der geräte-tab.\nfehler für \"polling\"-geräte mit veränderten abfragezeiten beheben.\nwarnsymbol für geräte, die nicht vollständig interviewt werden.\nverbesserte routererkennung zum öffnen des netzwerks\nbugfix: offenes netzwerk auf router\nZHC 25.x neueste, ZH 6.1.3,\nwiederherstellung von in-adapter-backup",
|
|
@@ -67,32 +93,6 @@
|
|
|
67
93
|
"pl": "ZHC 25.x\nZH 6.x\nNapraw błąd parowania\nDodaj wiadomości ping do debugowania urządzenia, aby zweryfikować przyczyny niepowodzenia pingu\n",
|
|
68
94
|
"uk": "ЗХК 25.x\nЗХ 6.х\nВиправлено помилку з'єднання\nдодано повідомлення ping до відлагодження пристрою для перевірки причин невдачі ping\n",
|
|
69
95
|
"zh-cn": "ZHC 25.x\nZH 6.x (英语)\n修复配对问题\n将ping消息添加到设备调试中,以验证ping失败的原因\n"
|
|
70
|
-
},
|
|
71
|
-
"3.0.5": {
|
|
72
|
-
"en": "fix random error where devices are not shown due to illegal groups\ndrop support for node 18\nRequired node Versions Node 20.19.0 or 22.11.0 or newer (courtesy of ZH 4.4.1 / ZHC 24.8.0)",
|
|
73
|
-
"de": "fehler beheben, bei denen geräte wegen illegaler gruppen nicht angezeigt werden\ndrop-unterstützung für knoten 183\nErforderliche Knotenversionen Nr. 20.19.0 oder 22.11.0 oder neuer (courtesy of ZH 4.4.1 / ZHC 24.8.0)",
|
|
74
|
-
"ru": "исправить случайную ошибку, когда устройства не отображаются из-за незаконных групп\nподдержка drop для node 18\nТребуемый узел Версии Узел 20.19.0 или 22.11.0 или новее (документ ZH 4.4.1 / ZHC 24.8.0)",
|
|
75
|
-
"pt": "corrigir erro aleatório onde os dispositivos não são mostrados devido a grupos ilegais\nsuporte de gota para o nó 18\nNó necessário Versões Node 20.19.0 ou 22.11.0 ou mais recente (cortesia de ZH 4.4.1 / ZHC 24.8.0)",
|
|
76
|
-
"nl": "fix willekeurige fout wanneer apparaten niet worden getoond als gevolg van illegale groepen\ndrop ondersteuning voor knooppunt 18\nVereiste node Versies Node 20.19.0 of 22.11.0 of nieuwer (met dank aan ZH 4.4.1 / ZHC 24.8.0)",
|
|
77
|
-
"fr": "corriger une erreur aléatoire lorsque les appareils ne sont pas montrés en raison de groupes illégaux\nsupport de chute pour noeud 18\nVersion requise Node 20.19.0 ou 22.11.0 ou plus récent (avec la permission de ZH 4.4.1 / ZHC 248.0)",
|
|
78
|
-
"it": "correggere errore casuale in cui i dispositivi non vengono visualizzati a causa di gruppi illegali\nsupporto a goccia per nodo 18\nNodo richiesto Versioni Nodo 20.19.0 o 22.11.0 o più recente (cortesia di ZH 4.4.1 / ZHC 24.8.0)",
|
|
79
|
-
"es": "corregir errores aleatorios donde no se muestran dispositivos debido a grupos ilegales\napoyo a los nodos 18\nNodo requerido Versiones Nodo 20.19.0 o 22.11.0 o nuevo (cortesía de ZH 4.4.1 / ZHC 24.8.0)",
|
|
80
|
-
"pl": "naprawić błąd losowy w przypadku gdy urządzenia nie są wyświetlane z powodu nielegalnych grup\nobsługa zrzutu dla węzła 18\nWymagany węzeł Wersje Węzeł 20.19.0 lub 22.11.0 lub nowszy (uprzejmość ZH 4.4.1 / ZHC 24.8.0)",
|
|
81
|
-
"uk": "виправити випадкові помилки, де пристрої не відображаються через незаконні групи\nпідтримка крапель для вузла 18 років\nПотрібні версії вузла Node 20.19.0 або 22.11.0 або новачка (кількість ЗЗ 4.4.1 / ЗЖК 24.8.0)",
|
|
82
|
-
"zh-cn": "在设备因非法组而未显示时修复随机错误\n放弃节点支持 第 18 条\n要求的节点版本为20.19.0或22.11.0或更新(礼仪为ZH 4.4.1 / ZHC 24.8.0)"
|
|
83
|
-
},
|
|
84
|
-
"3.0.3": {
|
|
85
|
-
"en": "fix 'icon' error for unknown devices\nfix state for level.color.rgb role (hex_color, accepts only #rrggbb values\nZH 4.4.1\nZHC 23.72.1\npreparation for breaking change in ZHC 24.0.0",
|
|
86
|
-
"de": "'icon' fehler für unbekannte geräte beheben\nfix zustand für level.color.rgb rolle (hex_color, akzeptiert nur #rrggbb werte\nZH 4.4.1\nZHC 23.72.1\nvorbereitung auf den Bruchwechsel in ZHC 24.0.0",
|
|
87
|
-
"ru": "исправьте ошибку «икона» для неизвестных устройств\nисправить состояние для роли level.color.rgb (hex_color, принимает только значения #rrggbb)\nZH 4.4.1\nZHC 23.72.1\nподготовка к нарушению изменений в ZHC 24.0.0",
|
|
88
|
-
"pt": "corrigir erro 'icon' para dispositivos desconhecidos\nestado de correção para papel level.color.rgb (hex_color, aceita apenas valores #rrggbb\nZH 4.4.1\nZHC 23.72.1\npreparação para quebrar a mudança em ZHC 24.0.0",
|
|
89
|
-
"nl": "fix 'icon' fout voor onbekende apparaten\nfix status voor level.color.rgb role (hex_color, accepteert alleen #rrggbb waarden\nZH 4.4.1\nZHC 23,72,1\nvoorbereiding voor het breken van verandering in ZHC 24.0.0",
|
|
90
|
-
"fr": "correction de l'erreur 'icon' pour les périphériques inconnus\nfixer l'état pour le rôle level.color.rgb (hex_color, accepte uniquement les valeurs #rrggbb\nZH 4.4.1\nZHC 23,72.1\npréparation pour briser le changement dans ZHC 24.0.0",
|
|
91
|
-
"it": "correzione di errore 'icon' per dispositivi sconosciuti\nfix stato per livello.color.rgb ruolo (hex_color, accetta solo valori #rrrggbb\nZH 4.4.1\n23.7.2.1\npreparazione per rompere il cambiamento in ZHC 24.0.0",
|
|
92
|
-
"es": "corregir el error 'icon' para dispositivos desconocidos\nfijar estado para el nivel.color.rgb papel (hex_color, acepta sólo #rrggbb valores\nZH 4.4.1\nZHC 23.72.1\npreparación para romper el cambio en ZHC 24.0.0",
|
|
93
|
-
"pl": "naprawić błąd 'icon' dla nieznanych urządzeń\nfix state for level.color.rgb role (hex _ color, akceptuje tylko # rrggbb values\nZH 4.4.1\nZHC 23.72.1\nprzygotowanie do złamania zmian w ZHC 24.0.0",
|
|
94
|
-
"uk": "виправлено помилку 'icon' для невідомих пристроїв\nвиправити стан для рівня.color.rgb роль (hex_color, приймає тільки значення #rrggbb\nЗХ 4.4.1\nЗХК 23.72.1\nпідготовка до зміни розриву в ЗЖК 24.0.0",
|
|
95
|
-
"zh-cn": "修复未知设备的“ icon” 错误\n级的固定状态.color.rgb 角色(hex_color,只接受#rrggbb值)\n兹哈4.4.1\nZHC 23.72.1 电话\n准备打破ZHC 24.0"
|
|
96
96
|
}
|
|
97
97
|
},
|
|
98
98
|
"titleLang": {
|
package/lib/commands.js
CHANGED
|
@@ -445,6 +445,14 @@ class Commands {
|
|
|
445
445
|
return undefined;
|
|
446
446
|
|
|
447
447
|
}
|
|
448
|
+
|
|
449
|
+
function haveBindableClusters(clusters) {
|
|
450
|
+
const nonBindableClusters = [25,33, 4096]
|
|
451
|
+
if (Array.isArray(clusters)) {
|
|
452
|
+
return (clusters.filter((candidate) => !nonBindableClusters.includes(candidate)).length > 0);
|
|
453
|
+
}
|
|
454
|
+
return false;
|
|
455
|
+
}
|
|
448
456
|
const rv = {};
|
|
449
457
|
try {
|
|
450
458
|
rv.device = {
|
|
@@ -463,19 +471,28 @@ class Commands {
|
|
|
463
471
|
date_code:device.device.dateCode,
|
|
464
472
|
build:device.device.softwareBuildID,
|
|
465
473
|
interviewstate:device.device.interviewState || 'UNKNOWN',
|
|
474
|
+
BindSource: false,
|
|
475
|
+
isGroupable: false,
|
|
466
476
|
}
|
|
467
477
|
rv.endpoints = [];
|
|
478
|
+
let dBindSource = false;
|
|
479
|
+
let disGroupable = false;
|
|
468
480
|
for (const ep_idx in device.endpoints) {
|
|
469
481
|
const ep = device.endpoints[ep_idx];
|
|
482
|
+
const bindable = haveBindableClusters(ep.outputClusters);
|
|
483
|
+
dBindSource |= bindable;
|
|
470
484
|
rv.endpoints.push({
|
|
471
485
|
ID:ep.ID,
|
|
472
486
|
epName: device.mapped?.endpoint ? getKey(device.mapped?.endpoint(device), ep.ID) : ep.ID,
|
|
473
487
|
profile:ep.profileID,
|
|
474
488
|
input_clusters:ep.inputClusters,
|
|
475
489
|
output_clusters:ep.outputClusters,
|
|
490
|
+
BindSource: Boolean(bindable),
|
|
476
491
|
})
|
|
477
|
-
|
|
492
|
+
disGroupable |= ep.inputClusters.includes(4);
|
|
478
493
|
}
|
|
494
|
+
rv.device.isGroupable = Boolean(disGroupable);
|
|
495
|
+
rv.device.BindSource = Boolean(dBindSource);
|
|
479
496
|
if (device.mapped) {
|
|
480
497
|
rv.mapped = {
|
|
481
498
|
model:device.mapped.model,
|
|
@@ -745,7 +762,7 @@ class Commands {
|
|
|
745
762
|
else this.adapter.sendTo(from, command, {error:err}, callback);
|
|
746
763
|
}
|
|
747
764
|
this.adapter.sendTo(from, command, {}, callback);
|
|
748
|
-
this.adapter.stController.localConfig.removeLocalData()
|
|
765
|
+
if (msg.dev) this.adapter.stController.localConfig.removeLocalData(devId, msg.model);
|
|
749
766
|
} else {
|
|
750
767
|
this.adapter.sendTo(from, command, {error: err}, callback);
|
|
751
768
|
}
|
package/lib/groups.js
CHANGED
|
@@ -629,7 +629,7 @@ class Groups {
|
|
|
629
629
|
const entity = await this.zbController.resolveEntity(member.ieee, member.epid);
|
|
630
630
|
let epname = undefined;
|
|
631
631
|
if (entity && entity.mapped && entity.mapped.endpoint) {
|
|
632
|
-
const epnames = entity.mapped.endpoint(entity);
|
|
632
|
+
const epnames = entity.mapped.endpoint(entity.device);
|
|
633
633
|
for (const key in epnames) {
|
|
634
634
|
if (epnames[key] == member.epid) {
|
|
635
635
|
epname = key;
|
package/lib/localConfig.js
CHANGED
|
@@ -142,6 +142,12 @@ class localConfig extends EventEmitter {
|
|
|
142
142
|
return defaultName;
|
|
143
143
|
}
|
|
144
144
|
|
|
145
|
+
removeLocalData(dev, model) {
|
|
146
|
+
delete this.localData.by_id[dev];
|
|
147
|
+
if (model) delete this.localData.by_model[model];
|
|
148
|
+
this.retainData();
|
|
149
|
+
}
|
|
150
|
+
|
|
145
151
|
IconForId(id, model, defaultIcon) {
|
|
146
152
|
let modeloverride = {};
|
|
147
153
|
this.debug('Icon for id with ' + id + ', ' + model + ' and ' + defaultIcon);
|
|
@@ -303,7 +309,6 @@ class localConfig extends EventEmitter {
|
|
|
303
309
|
}
|
|
304
310
|
|
|
305
311
|
writeData() {
|
|
306
|
-
this.info('retaining local config: ' + JSON.stringify(this.localData));
|
|
307
312
|
try {
|
|
308
313
|
fs.writeFileSync(this.filename, JSON.stringify(this.localData, null, 2))
|
|
309
314
|
this.info('Saved local configuration data');
|
package/lib/zigbeecontroller.js
CHANGED
|
@@ -657,7 +657,7 @@ class ZigbeeController extends EventEmitter {
|
|
|
657
657
|
mapped = await zigbeeHerdsmanConverters.findByDevice(device, false);
|
|
658
658
|
}
|
|
659
659
|
catch (error) {
|
|
660
|
-
|
|
660
|
+
// intentionally empty
|
|
661
661
|
}
|
|
662
662
|
if (!mapped) {
|
|
663
663
|
if (device.type === 'Coordinator')
|
|
@@ -812,7 +812,7 @@ class ZigbeeController extends EventEmitter {
|
|
|
812
812
|
else if (this._permitJoinInterval) {
|
|
813
813
|
const timestr = this._permitJoinTime > 0 ? ` with ${this._permitJoinTime} second${this._permitJoinTime > 1 ? 's':''} remaining.`: '.';
|
|
814
814
|
this.info(`Closed Zigbee network${timestr}`)
|
|
815
|
-
this.emit('pairing', `Closed network${timestr}
|
|
815
|
+
this.emit('pairing', `Closed network${timestr}`, 0);
|
|
816
816
|
clearInterval(this._permitJoinInterval);
|
|
817
817
|
this._permitJoinInterval = null;
|
|
818
818
|
}
|
|
@@ -1517,18 +1517,25 @@ class ZigbeeController extends EventEmitter {
|
|
|
1517
1517
|
}
|
|
1518
1518
|
if (sources.length == 0) sources.push(entity.device.endpoints[0]);
|
|
1519
1519
|
for (const source of sources) {
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1520
|
+
for (const k of converter.key)
|
|
1521
|
+
try {
|
|
1522
|
+
await converter.convertGet(source, k, {device:entity.device});
|
|
1523
|
+
if (elevated) {
|
|
1524
|
+
const message = `read for state${converter.key.length ? '' : 's'} '${converter.key.join(',')}' of '${entity.device.ieeeAddr}/${source.ID}' after device query`;
|
|
1525
|
+
this.warn(`ELEVATED O02.1 ${message}`);
|
|
1526
|
+
this.emit('device_debug', { ID:debugID, data: { flag: k, IO:false }, message:message });
|
|
1527
|
+
}
|
|
1528
|
+
else
|
|
1529
|
+
this.debug(`read for state${converter.key.length ? '' : 's'} '${converter.key.join(',')}' of '${entity.device.ieeeAddr}/${source.ID}' after device query`);
|
|
1530
|
+
} catch (error) {
|
|
1531
|
+
if (elevated) {
|
|
1532
|
+
const message = `Failed to read for state${converter.key.length ? '' : 's'} '${converter.key.join(',')}' of '${source.ID}' from query with '${error && error.message ? error.message : 'no error message'}`;
|
|
1533
|
+
this.warn(`ELEVATED OE02.1 ${message}`);
|
|
1534
|
+
this.emit('device_debug', { ID:debugID, data: { error: 'NOTREAD' , IO:false }, message:message });
|
|
1535
|
+
}
|
|
1536
|
+
else
|
|
1537
|
+
this.debug(`failed to read for state${converter.key.length ? '' : 's'} '${converter.key.join(',')}' of '${source.ID}'after device query`);
|
|
1528
1538
|
}
|
|
1529
|
-
else
|
|
1530
|
-
this.debug(`failed to read for state${converter.key.length ? '' : 's'} '${converter.key.join(',')}' of '${source.ID}'after device query`);
|
|
1531
|
-
}
|
|
1532
1539
|
}
|
|
1533
1540
|
}
|
|
1534
1541
|
}
|