iobroker.zigbee 2.0.2 → 2.0.3
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 +64 -35
- package/admin/admin.js +211 -19
- package/admin/img/philips_hue_lom001.png +0 -0
- package/admin/tab_m.html +13 -8
- package/docs/tutorial/groups-1.png +0 -0
- package/docs/tutorial/groups-2.png +0 -0
- package/docs/tutorial/tab-dev-1.png +0 -0
- package/io-package.json +15 -49
- package/lib/DeviceDebug.js +80 -0
- package/lib/commands.js +16 -1
- package/lib/developer.js +0 -0
- package/lib/exposes.js +1 -1
- package/lib/groups.js +6 -8
- package/lib/localConfig.js +1 -2
- package/lib/ota.js +6 -6
- package/lib/statescontroller.js +270 -97
- package/lib/zbDeviceAvailability.js +2 -2
- package/lib/zbDeviceConfigure.js +22 -15
- package/lib/zigbeecontroller.js +13 -6
- package/main.js +132 -194
- package/package.json +2 -2
package/io-package.json
CHANGED
|
@@ -1,8 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "zigbee",
|
|
4
|
-
"version": "2.0.
|
|
4
|
+
"version": "2.0.3",
|
|
5
5
|
"news": {
|
|
6
|
+
"2.0.3": {
|
|
7
|
+
"en": "fix configured info\nfix battery voltage (V -> mV)\nenable debug interface v1.0\nPush Zigbee-Herdsman to 3.5.7\nPush Zigbee-Herdsman-Converters to 23.1.1\nfix configure on message\nremove extra warning messages\nfix Adapter-Checker notes\nimprove base64 image detection\nremoved unused adaptert objects (info.groups, excludes) from adapter config\n",
|
|
8
|
+
"de": "die konfigurierten informationen\nbatteriespannung fixieren (V -> mV)\ndebug interface v1.0\nPush Zigbee-Herdsman auf 3.5.7\nPush Zigbee-Herdsman-Konverter auf 23.1.1\nkonfigurieren der nachricht\nzusätzliche warnmeldungen entfernen\nfix Adapter-Checker-Noten\nverbesserung der bilderkennung von base64\nentfernte ungenutzte adapterobjekte (info.groups, ausgenommen) von adapter config\n",
|
|
9
|
+
"ru": "исправить сконфигурированную информацию\nфиксировать напряжение батареи (V -> mV)\nвключить интерфейс отладки v1.0\nПодтолкнуть Зигби-Хердсмана к 3.5.7\nНажмите Zigbee-Herdsman-Converters на 23.1.1\nисправить конфигурацию на сообщение\nудалить дополнительные предупреждающие сообщения\nзаписи Adapter-Checker\nобнаружение изображений base64\nудаленные неиспользуемые объекты адаптера (info.groups, исключает) из конфигурации адаптера\n",
|
|
10
|
+
"pt": "corrigir informações configuradas\ncorrigir a tensão da bateria (V -> mV)\nenable debug interface v1.0\nEmpurre Zigbee-Herdsman para 3.5.7\nEmpurre Zigbee-Herdsman-Converters para 23.1.1\ncorrigir configurar na mensagem\nremover mensagens de aviso extra\ncorrigir notas Adapter-Checker\nmelhorar a detecção de imagem base64\nremoveu objetos adaptadores não utilizados (info.groups, exclui) da configuração do adaptador\n",
|
|
11
|
+
"nl": "fix geconfigureerde informatie\nvast te stellen batterijspanning (V -> mV)\ndebug interface v1.0 inschakelen\nDuw Zigbee-Herdsman naar 3.5.7\nDuw Zigbee-Herdsman-Converters naar 23.1.1\nfix configureren op bericht\nextra waarschuwingsberichten verwijderen\nfix Adapter-Checker notities\nverbeteren base64 beelddetectie\nverwijderd ongebruikte adapter objecten (info.groups, exclusief) uit adapter config\n",
|
|
12
|
+
"fr": "correction des informations configurées\ncorrection de la tension de la batterie (V -> mV)\nactive l'interface debug v1.0\nPoussez Zigbee-Herdsman à 3.5.7\nPousser Zigbee-Herdsman-Converters à 23.1.1\ncorrection de configuration sur le message\nsupprimer les messages d'avertissement supplémentaires\ncorrection des notes de l'adaptateur-vérificateur\naméliorer la détection d'image de base64\nobjets de l'adaptateurt supprimés (info.groups, exclut) de la configuration de l'adaptateur\n",
|
|
13
|
+
"it": "correzione delle informazioni configurate\ncorreggere la tensione della batteria (V -> mV)\nabilitare l'interfaccia di debug v1.0\nSpingere Zigbee-Herdsman a 3.5.7\nSpingere Zigbee-Herdsman-Converters a 23.1.1\ncorrezione configurare sul messaggio\nrimuovere i messaggi di avviso extra\nfissare le note dell'adattatore-Checker\nmigliorare il rilevamento delle immagini base64\nrimosso oggetti adattatori non utilizzati (info.groups, esclude) dalla configurazione dell'adattatore\n",
|
|
14
|
+
"es": "fijar información configurada\ntensión de batería de fijación (V - título mV)\nhabilitar interfaz de depuración v1.0\nEmpuja Zigbee-Herdsman a 3.5.7\nEmpuja Zigbee-Herdsman-Converters a 23.1.1\nfijar configuración en el mensaje\neliminar mensajes de advertencia extra\nfijar las notas de Adaptador-Checker\nmejorar la detección de imágenes base64\nobjetos de adaptador no usados (info.groups, excluye) de configuración de adaptador\n",
|
|
15
|
+
"pl": "naprawić skonfigurowane informacje\nstałe napięcie akumulatora (V - > mV)\nwłącz interfejs debugowania v1.0\nPush Zigbee-Herdsman do 3.5.7\nPush Zigbee- Herdsman- Konwertery do 23.1.1\nustaw konfigurację na wiadomości\nusuwa dodatkowe komunikaty ostrzegawcze\nfix Adapter- Notatki kontrolne\npoprawa wykrywania obrazu bazowego64\nusunięte niewykorzystane obiekty adaptert (info.groups, excluses) z konfiguracji adaptera\n",
|
|
16
|
+
"uk": "виправлено налаштовану інформацію\nфіксатор напруги акумулятора (В -> мВ)\nувімкнути інтерфейс налагодження v1.0\nPush Zigbee-Herdsman до 3.5.7\nPush Zigbee-Herdsman-Converters до 23.1.1\nфіксувати налаштування на повідомлення\nвидалити додаткові повідомлення попередження\nвиправити адаптер-Checker ноти\nполіпшення базового64 виявлення зображень\nвидалити невикористані об'єкти адаптера (info.groups, виключає) з налаштування адаптера\n",
|
|
17
|
+
"zh-cn": "修复已配置的信息\n固定电池电压(V - > mV)\n启用调试接口 v1.0\n将Zigbee-Herdsman推至3.5.7\n将Zigbee-Herdsman-Convers推向23.1.1\n固定信件的配置\n删除额外的警告信件\n修正适配器检查符\n改进基本64图像检测\n从适配器配置中删除未使用的适配对象( 信息组, 排除)\n"
|
|
18
|
+
},
|
|
6
19
|
"2.0.2": {
|
|
7
20
|
"en": "fix expose generation with expose function requiring a device. (Issue #1842)\nfix failure to configure for devices needing multiple configurations (Issue #2375)\nfix hold/release and press/release action handling (Issue #2387)\nfix lib/legacy requirement for external converters (Issue #2376)\nimproved external converter handling\nfix OTA bug\nimproved message handling for devices which report values outside their defined ranges\npreparation for ZHC 22.x (model definition loaded on demand\nfix legacy definition for devices\nadded action state for remotes.\n",
|
|
8
21
|
"de": "fix exponieren Erzeugung mit exponierender Funktion, die ein Gerät benötigt. (Ausgabe #1842)\nfehler beim Konfigurieren von Geräten, die mehrere Konfigurationen benötigen (Issue #2375)\nfix Hold/Release und Presse/Release-Action-Handling (Issue #2387)\nfix lib/legacy Anforderung für externe Konverter (Issue #2376)\nverbesserte externe konverterhandhabung\noTA Fehler beheben\nverbesserte nachrichtenbehandlung für geräte, die werte außerhalb ihrer definierten bereiche melden\nvorbereitung auf ZHC 22.x (Modelldefinition geladen auf Anfrage\nfix legacy definition für geräte\nden aktionszustand für remotes hinzugefügt.\n",
|
|
@@ -29,19 +42,6 @@
|
|
|
29
42
|
"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Удосконалено редагування груп - видалення членів з групової картки",
|
|
30
43
|
"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改进组编辑 - 从组卡中删除成员"
|
|
31
44
|
},
|
|
32
|
-
"1.11.2": {
|
|
33
|
-
"en": "debug for states",
|
|
34
|
-
"de": "debug for states",
|
|
35
|
-
"ru": "debug for states",
|
|
36
|
-
"pt": "debug for states",
|
|
37
|
-
"nl": "debug for states",
|
|
38
|
-
"fr": "debug for states",
|
|
39
|
-
"it": "debug for states",
|
|
40
|
-
"es": "debug for states",
|
|
41
|
-
"pl": "debug for states",
|
|
42
|
-
"uk": "debug for states",
|
|
43
|
-
"zh-cn": "debug for states"
|
|
44
|
-
},
|
|
45
45
|
"1.10.14": {
|
|
46
46
|
"en": "Herdsman 2.1.9, Converters 20.58.0\nFix: Aqara T1M (CL-L02D) \ndeleteDeviceStates change to deleteObj",
|
|
47
47
|
"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": ">=
|
|
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",
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
const { EventEmitter } = require('events');
|
|
2
|
+
const fs = require('fs');
|
|
3
|
+
class DeviceDebug extends EventEmitter {
|
|
4
|
+
constructor(adapter) {
|
|
5
|
+
super();
|
|
6
|
+
this.adapter = adapter;
|
|
7
|
+
this.dataByID = { };
|
|
8
|
+
this.dataByDevice = { };
|
|
9
|
+
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
info(message, data) {
|
|
13
|
+
this.emit('log', 'info', message, data);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
error(message, data) {
|
|
17
|
+
this.emit('log', 'error', message, data);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
debug(message, data) {
|
|
21
|
+
this.emit('log', 'debug', message, data);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
warn(message, data) {
|
|
25
|
+
this.emit('log', 'warn', message, data);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
start(statescontroller, zigbeecontroller) {
|
|
29
|
+
this.info('--- creating device debug ---');
|
|
30
|
+
statescontroller.on('device_debug', this.onDebugEvent.bind(this))
|
|
31
|
+
this.adapter.on('device_debug', this.onDebugEvent.bind(this))
|
|
32
|
+
zigbeecontroller.on('device_debug', this.onDebugEvent.bind(this))
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
onDebugEvent(message) {
|
|
36
|
+
if (typeof message === 'object' && message.hasOwnProperty('ID'))
|
|
37
|
+
{
|
|
38
|
+
let flag='NONE';
|
|
39
|
+
if (message.hasOwnProperty('data')) {
|
|
40
|
+
const dataId = message.ID;
|
|
41
|
+
const item = this.dataByID[dataId] ? this.dataByID[dataId] : { dataID: dataId, deviceID:'unknown', states:[],flags:[], errors:[], IO:message.IO };
|
|
42
|
+
this.dataByID[dataId] = item;
|
|
43
|
+
const data = message.data;
|
|
44
|
+
if (data.error && item.errors.indexOf(data.error)<0) item.errors.push(data.error);
|
|
45
|
+
if (data.states) item.states.push(...data.states);
|
|
46
|
+
if (data.flag && item.flags.indexOf(data.flag)<0) item.flags.push(data.flag);
|
|
47
|
+
if (data.payload && !item.payload) item.payload = data.payload;
|
|
48
|
+
item.IO = data.IO ? true : false;
|
|
49
|
+
if (data.error) flag = data.error;
|
|
50
|
+
else if (data.flag)
|
|
51
|
+
if (data.flag === 'SUCCESS') flag = data.flag;
|
|
52
|
+
else flag = item.IO ? 'I'+data.flag : 'O'+data.flag;
|
|
53
|
+
else
|
|
54
|
+
flag = item.IO ? 'IN' : 'OUT';
|
|
55
|
+
if (data.ID && data.ID !== item.deviceID) {
|
|
56
|
+
item.deviceID = data.ID;
|
|
57
|
+
const DevData = this.dataByDevice[item.deviceID] ? this.dataByDevice[item.deviceID] : { IN:[], OUT:[] };
|
|
58
|
+
const target = (data.IO ? DevData.IN : DevData.OUT)
|
|
59
|
+
while (target.length > 20 || (target.length > 10 && dataId - target[0]>30000)) {
|
|
60
|
+
const pre = target.length;
|
|
61
|
+
const ditem = target.shift();
|
|
62
|
+
delete this.dataByID[ditem.dataID];
|
|
63
|
+
this.debug(`on Debug Message: removing item ${ditem.dataID} : pre ${pre} post ${target.length}`)
|
|
64
|
+
}
|
|
65
|
+
target.push(item);
|
|
66
|
+
this.dataByDevice[item.deviceID] = DevData;
|
|
67
|
+
}
|
|
68
|
+
if (message.hasOwnProperty('message')) {
|
|
69
|
+
this.warn(`ELEVATED:${flag} (${dataId.toString(16).slice(-4)}) ${message.message}`)
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
collectDebugData() {
|
|
76
|
+
return this.dataByDevice;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
module.exports = DeviceDebug;
|
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.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) {
|
|
@@ -653,7 +669,6 @@ class Commands {
|
|
|
653
669
|
'doConfigure',
|
|
654
670
|
[entity.device, entity.mapped],
|
|
655
671
|
);
|
|
656
|
-
this.warn('do configure result is ' + JSON.stringify(result));
|
|
657
672
|
const msg = result.join(',');
|
|
658
673
|
if (msg.length > 5)
|
|
659
674
|
this.adapter.sendTo(from, command, {error: msg}, callback);
|
package/lib/developer.js
CHANGED
|
File without changes
|
package/lib/exposes.js
CHANGED
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
302
|
+
this.debug('group object exists');
|
|
305
303
|
this.adapter.extendObject(id, {common: {name, type: 'group', icon: icon}});
|
|
306
304
|
}
|
|
307
305
|
}
|
package/lib/localConfig.js
CHANGED
|
@@ -220,7 +220,6 @@ class localConfig extends EventEmitter {
|
|
|
220
220
|
}
|
|
221
221
|
|
|
222
222
|
async updateFromDeviceNames() {
|
|
223
|
-
this.warn('updateFromDeviceNames');
|
|
224
223
|
const fn = this.adapter.expandFileName('dev_names').replace('.', '_').concat('.json');
|
|
225
224
|
fs.readFile(fn, (err, content) => {
|
|
226
225
|
if (!err) {
|
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
142
|
+
this.info(`Device ${obj.message.devId} is marked unavailable, skipping...`);
|
|
143
143
|
return;
|
|
144
144
|
}
|
|
145
145
|
this.inProgress.add(device.device.ieeeAddr);
|