iobroker.zigbee 1.10.13 → 2.0.0
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/LICENSE +1 -1
- package/README.md +13 -402
- package/admin/img/TS0502B.png +0 -0
- package/admin/index_m.html +1 -1
- package/admin/tab_m.html +1 -1
- package/io-package.json +41 -54
- package/lib/binding.js +1 -1
- package/lib/commands.js +4 -4
- package/lib/devices.js +20 -3
- package/lib/exposes.js +21 -3
- package/lib/groups.js +24 -26
- package/lib/statescontroller.js +28 -37
- package/lib/zbDeviceAvailability.js +1 -1
- package/lib/zbDeviceEvent.js +13 -2
- package/lib/zigbeecontroller.js +188 -136
- package/main.js +58 -38
- package/package.json +7 -7
package/lib/zigbeecontroller.js
CHANGED
|
@@ -148,9 +148,9 @@ class ZigbeeController extends EventEmitter {
|
|
|
148
148
|
}
|
|
149
149
|
|
|
150
150
|
this.debug(`Zigbee network parameters: panID=${debNetworkParam.panID} channel=${debNetworkParam.channel} extendedPanID=${extPanIDDebug}`);
|
|
151
|
-
} catch (
|
|
152
|
-
this.sendError(
|
|
153
|
-
this.error(`Starting zigbee-herdsman problem : ${
|
|
151
|
+
} catch (error) {
|
|
152
|
+
this.sendError(error);
|
|
153
|
+
this.error(`Starting zigbee-herdsman problem : ${(error && error.message ? error.message : 'no error message')}`);
|
|
154
154
|
throw 'Error herdsman start';
|
|
155
155
|
}
|
|
156
156
|
// Check if we have to turn off the LED
|
|
@@ -297,7 +297,7 @@ class ZigbeeController extends EventEmitter {
|
|
|
297
297
|
}
|
|
298
298
|
} catch (error) {
|
|
299
299
|
this.sendError(error);
|
|
300
|
-
this.error(
|
|
300
|
+
this.error(`error in getGroups: ${(error && error.message ? error.message : 'no error message')} ${(error && error.stack ? error.stack : 'no call stack')}`);
|
|
301
301
|
return undefined;
|
|
302
302
|
}
|
|
303
303
|
}
|
|
@@ -308,7 +308,7 @@ class ZigbeeController extends EventEmitter {
|
|
|
308
308
|
group && group.removeFromNetwork();
|
|
309
309
|
} catch (error) {
|
|
310
310
|
this.sendError(error);
|
|
311
|
-
this.error(`error in removeGroupById: ${error}`);
|
|
311
|
+
this.error(`error in removeGroupById: ${(error && error.message ? error.message : 'no error message')} ${(error && error.stack ? error.stack : 'no call stack')}`);
|
|
312
312
|
}
|
|
313
313
|
}
|
|
314
314
|
|
|
@@ -322,24 +322,34 @@ class ZigbeeController extends EventEmitter {
|
|
|
322
322
|
}
|
|
323
323
|
|
|
324
324
|
async verifyGroupExists(id) {
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
325
|
+
try {
|
|
326
|
+
const nid = typeof id === 'number' ? id : parseInt(id);
|
|
327
|
+
let group = await this.herdsman.getGroupByID(nid);
|
|
328
|
+
if (!group) {
|
|
329
|
+
group = await this.herdsman.createGroup(nid);
|
|
330
|
+
group.toZigbee = groupConverters;
|
|
331
|
+
group.model = 'group';
|
|
332
|
+
this.debug(`verifyGroupExists: created group ${nid}`);
|
|
333
|
+
} else {
|
|
334
|
+
this.debug(`verifyGroupExists: group ${nid} exists`);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
catch (error) {
|
|
338
|
+
this.error(`verifyGroupExists: ${error && error.message ? error.message : 'unspecified error'}`);
|
|
334
339
|
}
|
|
335
340
|
}
|
|
336
341
|
|
|
337
342
|
async addPairingCode(code) {
|
|
338
343
|
this.debug(`calling addPairingCode with ${code}`);
|
|
339
344
|
if (code) {
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
345
|
+
try {
|
|
346
|
+
await this.herdsman.addInstallCode(code);
|
|
347
|
+
this.info(`added code ${code} for pairing`);
|
|
348
|
+
return true;
|
|
349
|
+
}
|
|
350
|
+
catch (error) {
|
|
351
|
+
this.error(`addPairingCode: ${error && error.message ? error.message : 'unspecified error'}`);
|
|
352
|
+
}
|
|
343
353
|
}
|
|
344
354
|
return false;
|
|
345
355
|
}
|
|
@@ -369,7 +379,7 @@ class ZigbeeController extends EventEmitter {
|
|
|
369
379
|
} catch (error) {
|
|
370
380
|
this.sendError(error);
|
|
371
381
|
if (error) {
|
|
372
|
-
this.error(`getGroupMembersFromController:
|
|
382
|
+
this.error(`getGroupMembersFromController: ${(error && error.message ? error.message : 'no error message')} ${(error && error.stack ? error.stack : 'no call stack')}`);
|
|
373
383
|
} else {
|
|
374
384
|
this.error('unidentified error in getGroupMembersFromController');
|
|
375
385
|
}
|
|
@@ -378,100 +388,125 @@ class ZigbeeController extends EventEmitter {
|
|
|
378
388
|
}
|
|
379
389
|
|
|
380
390
|
getDevice(key) {
|
|
381
|
-
|
|
391
|
+
try {
|
|
392
|
+
return this.herdsman.getDeviceByIeeeAddr(key);
|
|
393
|
+
}
|
|
394
|
+
catch {
|
|
395
|
+
return undefined;
|
|
396
|
+
}
|
|
382
397
|
}
|
|
383
398
|
|
|
384
399
|
getDevicesByType(type) {
|
|
385
|
-
|
|
400
|
+
try {
|
|
401
|
+
return this.herdsman.getDevicesByType(type);
|
|
402
|
+
}
|
|
403
|
+
catch {
|
|
404
|
+
return undefined;
|
|
405
|
+
}
|
|
386
406
|
}
|
|
387
407
|
|
|
388
408
|
getDeviceByNetworkAddress(networkAddress) {
|
|
389
|
-
|
|
409
|
+
try {
|
|
410
|
+
return this.herdsman.getDeviceByNetworkAddress(networkAddress);
|
|
411
|
+
}
|
|
412
|
+
catch {
|
|
413
|
+
return undefined;
|
|
414
|
+
}
|
|
390
415
|
}
|
|
391
416
|
|
|
392
417
|
async resolveEntity(key, ep) {
|
|
393
418
|
// assert(typeof key === 'string' || key.constructor.name === 'Device', `Wrong type '${typeof key}'`);
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
return {
|
|
399
|
-
type: 'device',
|
|
400
|
-
device: coordinator,
|
|
401
|
-
endpoint: coordinator.getEndpoint(1),
|
|
402
|
-
name: 'Coordinator',
|
|
403
|
-
};
|
|
404
|
-
} else {
|
|
405
|
-
const device = await this.herdsman.getDeviceByIeeeAddr(key);
|
|
406
|
-
if (device) {
|
|
407
|
-
const mapped = await zigbeeHerdsmanConverters.findByDevice(device);
|
|
408
|
-
const endpoints = mapped && mapped.endpoint ? mapped.endpoint(device) : null;
|
|
409
|
-
let endpoint;
|
|
410
|
-
if (endpoints && ep != undefined && endpoints[ep]) {
|
|
411
|
-
endpoint = device.getEndpoint(endpoints[ep]);
|
|
412
|
-
} else if (endpoints && endpoints['default']) {
|
|
413
|
-
endpoint = device.getEndpoint(endpoints['default']);
|
|
414
|
-
} else {
|
|
415
|
-
const epNum = parseInt(ep);
|
|
416
|
-
if (!isNaN(epNum)) {
|
|
417
|
-
endpoint = device.getEndpoint(epNum);
|
|
418
|
-
} else {
|
|
419
|
-
endpoint = device.endpoints[0];
|
|
420
|
-
}
|
|
421
|
-
}
|
|
419
|
+
try {
|
|
420
|
+
if (typeof key === 'string') {
|
|
421
|
+
if (key === 'coordinator') {
|
|
422
|
+
const coordinator = this.herdsman.getDevicesByType('Coordinator')[0];
|
|
422
423
|
return {
|
|
423
424
|
type: 'device',
|
|
424
|
-
device,
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
endpoints: device.endpoints,
|
|
428
|
-
name: key,
|
|
425
|
+
device: coordinator,
|
|
426
|
+
endpoint: coordinator.getEndpoint(1),
|
|
427
|
+
name: 'Coordinator',
|
|
429
428
|
};
|
|
429
|
+
} else {
|
|
430
|
+
const device = await this.herdsman.getDeviceByIeeeAddr(key);
|
|
431
|
+
if (device) {
|
|
432
|
+
const mapped = await zigbeeHerdsmanConverters.findByDevice(device);
|
|
433
|
+
const endpoints = mapped && mapped.endpoint ? mapped.endpoint(device) : null;
|
|
434
|
+
let endpoint;
|
|
435
|
+
if (endpoints && ep != undefined && endpoints[ep]) {
|
|
436
|
+
endpoint = device.getEndpoint(endpoints[ep]);
|
|
437
|
+
} else if (endpoints && endpoints['default']) {
|
|
438
|
+
endpoint = device.getEndpoint(endpoints['default']);
|
|
439
|
+
} else {
|
|
440
|
+
const epNum = parseInt(ep);
|
|
441
|
+
if (!isNaN(epNum)) {
|
|
442
|
+
endpoint = device.getEndpoint(epNum);
|
|
443
|
+
} else {
|
|
444
|
+
endpoint = device.endpoints[0];
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
return {
|
|
448
|
+
type: 'device',
|
|
449
|
+
device,
|
|
450
|
+
mapped,
|
|
451
|
+
endpoint,
|
|
452
|
+
endpoints: device.endpoints,
|
|
453
|
+
name: key,
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
} else if (typeof key === 'number') {
|
|
458
|
+
let group = await this.herdsman.getGroupByID(key);
|
|
459
|
+
if (!group) group = await this.herdsman.createGroup(key);
|
|
460
|
+
group.toZigbee = groupConverters;
|
|
461
|
+
group.model = 'group';
|
|
462
|
+
return {
|
|
463
|
+
type: 'group',
|
|
464
|
+
mapped: group,
|
|
465
|
+
group,
|
|
466
|
+
name: `Group ${key}`,
|
|
467
|
+
};
|
|
468
|
+
} else {
|
|
469
|
+
let mapped;
|
|
470
|
+
try {
|
|
471
|
+
mapped = await zigbeeHerdsmanConverters.findByDevice(key);
|
|
472
|
+
} catch (err) {
|
|
473
|
+
this.error(`zigbeeHerdsmanConverters findByDevice ${key.ieeeAddr}`);
|
|
430
474
|
}
|
|
431
|
-
}
|
|
432
|
-
} else if (typeof key === 'number') {
|
|
433
|
-
let group = await this.herdsman.getGroupByID(key);
|
|
434
|
-
if (!group) group = await this.herdsman.createGroup(key);
|
|
435
|
-
group.toZigbee = groupConverters;
|
|
436
|
-
group.model = 'group';
|
|
437
|
-
return {
|
|
438
|
-
type: 'group',
|
|
439
|
-
mapped: group,
|
|
440
|
-
group,
|
|
441
|
-
name: `Group ${key}`,
|
|
442
|
-
};
|
|
443
|
-
} else {
|
|
444
|
-
let mapped;
|
|
445
|
-
try {
|
|
446
|
-
mapped = await zigbeeHerdsmanConverters.findByDevice(key);
|
|
447
|
-
} catch (err) {
|
|
448
|
-
this.error(`zigbeeHerdsmanConverters findByDevice ${key.ieeeAddr}`);
|
|
449
|
-
}
|
|
450
475
|
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
476
|
+
return {
|
|
477
|
+
type: 'device',
|
|
478
|
+
device: key,
|
|
479
|
+
mapped: mapped,
|
|
480
|
+
name: key.type === 'Coordinator' ? 'Coordinator' : key.ieeeAddr,
|
|
481
|
+
};
|
|
482
|
+
}
|
|
457
483
|
}
|
|
484
|
+
catch {
|
|
485
|
+
return undefined;
|
|
486
|
+
}
|
|
487
|
+
|
|
458
488
|
}
|
|
459
489
|
|
|
460
490
|
async incMsgHandler(message) {
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
491
|
+
try {
|
|
492
|
+
this.debug('incoming msg', message);
|
|
493
|
+
const device = await this.herdsman.getDeviceByIeeeAddr(message.srcaddr);
|
|
494
|
+
if (!device) {
|
|
495
|
+
this.debug('Message without device!');
|
|
496
|
+
return;
|
|
497
|
+
}
|
|
498
|
+
// We can't handle devices without modelId.
|
|
499
|
+
if (!device.modelId) {
|
|
500
|
+
this.debug('Message without modelId!');
|
|
501
|
+
return;
|
|
502
|
+
}
|
|
503
|
+
this.event('msg', device.ieeeAddr, message, {
|
|
504
|
+
modelId: device.modelId
|
|
505
|
+
});
|
|
466
506
|
}
|
|
467
|
-
|
|
468
|
-
if (!device.modelId) {
|
|
469
|
-
this.debug('Message without modelId!');
|
|
507
|
+
catch {
|
|
470
508
|
return;
|
|
471
509
|
}
|
|
472
|
-
this.event('msg', device.ieeeAddr, message, {
|
|
473
|
-
modelId: device.modelId
|
|
474
|
-
});
|
|
475
510
|
}
|
|
476
511
|
|
|
477
512
|
// Stop controller
|
|
@@ -814,39 +849,45 @@ class ZigbeeController extends EventEmitter {
|
|
|
814
849
|
if (cfg == null) {
|
|
815
850
|
cfg = {};
|
|
816
851
|
}
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
852
|
+
try {
|
|
853
|
+
if (type === 'foundation') {
|
|
854
|
+
cfg.disableDefaultResponse = true;
|
|
855
|
+
/*
|
|
856
|
+
if (cmd === 'read' && !Array.isArray(zclData)) {
|
|
857
|
+
// needs to be iterable (string[] | number [])
|
|
858
|
+
zclData[Symbol.iterator] = function* () {
|
|
859
|
+
let k;
|
|
860
|
+
for (k in this) {
|
|
861
|
+
yield k;
|
|
862
|
+
}
|
|
863
|
+
};
|
|
864
|
+
}
|
|
865
|
+
*/
|
|
866
|
+
let result;
|
|
867
|
+
if (cmd === 'configReport') {
|
|
868
|
+
result = await endpoint.configureReporting(cid, zclData, cfg);
|
|
869
|
+
} else {
|
|
870
|
+
if (cmd === 'read' && !Array.isArray(zclData))
|
|
871
|
+
result = await endpoint[cmd](cid, Object.keys(zclData), cfg);
|
|
872
|
+
else
|
|
873
|
+
result = await endpoint[cmd](cid, zclData, cfg);
|
|
874
|
+
}
|
|
875
|
+
callback && callback(undefined, result);
|
|
876
|
+
} else if (type === 'functionalResp') {
|
|
877
|
+
cfg.disableDefaultResponse = false;
|
|
878
|
+
const result = await endpoint.commandResponse(cid, cmd, zclData, cfg, zclSeqNum);
|
|
879
|
+
callback && callback(undefined, result);
|
|
834
880
|
} else {
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
result = await endpoint[cmd](cid, zclData, cfg);
|
|
881
|
+
cfg.disableDefaultResponse = false;
|
|
882
|
+
const result = await endpoint.command(cid, cmd, zclData, cfg);
|
|
883
|
+
callback && callback(undefined, result);
|
|
839
884
|
}
|
|
840
|
-
callback && callback(undefined, result);
|
|
841
|
-
} else if (type === 'functionalResp') {
|
|
842
|
-
cfg.disableDefaultResponse = false;
|
|
843
|
-
const result = await endpoint.commandResponse(cid, cmd, zclData, cfg, zclSeqNum);
|
|
844
|
-
callback && callback(undefined, result);
|
|
845
|
-
} else {
|
|
846
|
-
cfg.disableDefaultResponse = false;
|
|
847
|
-
const result = await endpoint.command(cid, cmd, zclData, cfg);
|
|
848
|
-
callback && callback(undefined, result);
|
|
849
885
|
}
|
|
886
|
+
catch (error)
|
|
887
|
+
{
|
|
888
|
+
this.log.error(`error sending ${type} ${cmd} to endpoint: ${(error && error.message ? error.message : 'no error message')} ${(error && error.stack ? error.stack : 'no call stack')}`)
|
|
889
|
+
}
|
|
890
|
+
|
|
850
891
|
}
|
|
851
892
|
|
|
852
893
|
async addDevToGroup(devId, groupId, epid) {
|
|
@@ -894,7 +935,7 @@ class ZigbeeController extends EventEmitter {
|
|
|
894
935
|
} catch (error) {
|
|
895
936
|
this.sendError(error);
|
|
896
937
|
this.error(`Exception when trying to Add ${devId} to group ${groupId}`, error);
|
|
897
|
-
return {error: `Failed to add ${devId} to group ${groupId}: ${
|
|
938
|
+
return {error: `Failed to add ${devId} to group ${groupId}: ${(error && error.message ? error.message : 'no error message')} ${(error && error.stack ? error.stack : 'no call stack')}`};
|
|
898
939
|
}
|
|
899
940
|
return {};
|
|
900
941
|
}
|
|
@@ -957,16 +998,21 @@ class ZigbeeController extends EventEmitter {
|
|
|
957
998
|
target = !target ? this.getCoordinator() : target;
|
|
958
999
|
|
|
959
1000
|
this.debug(`Binding ${log}`);
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
1001
|
+
try {
|
|
1002
|
+
ep.bind(cluster, target, error => {
|
|
1003
|
+
if (error) {
|
|
1004
|
+
this.sendError(error);
|
|
1005
|
+
this.error(`Failed to bind ${log} - (${error})`);
|
|
1006
|
+
} else {
|
|
1007
|
+
this.debug(`Successfully bound ${log}`);
|
|
1008
|
+
}
|
|
967
1009
|
|
|
1010
|
+
callback(error);
|
|
1011
|
+
});
|
|
1012
|
+
}
|
|
1013
|
+
catch (error) {
|
|
968
1014
|
callback(error);
|
|
969
|
-
}
|
|
1015
|
+
}
|
|
970
1016
|
}
|
|
971
1017
|
|
|
972
1018
|
unbind(ep, cluster, target, callback) {
|
|
@@ -974,15 +1020,21 @@ class ZigbeeController extends EventEmitter {
|
|
|
974
1020
|
target = !target ? this.getCoordinator() : target;
|
|
975
1021
|
|
|
976
1022
|
this.debug(`Unbinding ${log}`);
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
1023
|
+
try {
|
|
1024
|
+
ep.unbind(cluster, target, (error) => {
|
|
1025
|
+
if (error) {
|
|
1026
|
+
this.error(`Failed to unbind ${log} - (${error})`);
|
|
1027
|
+
} else {
|
|
1028
|
+
this.debug(`Successfully unbound ${log}`);
|
|
1029
|
+
}
|
|
983
1030
|
|
|
1031
|
+
callback(error);
|
|
1032
|
+
});
|
|
1033
|
+
}
|
|
1034
|
+
catch (error)
|
|
1035
|
+
{
|
|
984
1036
|
callback(error);
|
|
985
|
-
}
|
|
1037
|
+
}
|
|
986
1038
|
}
|
|
987
1039
|
|
|
988
1040
|
reset(mode, callback) {
|
package/main.js
CHANGED
|
@@ -441,7 +441,7 @@ class Zigbee extends utils.Adapter {
|
|
|
441
441
|
|
|
442
442
|
Promise.all(chain)
|
|
443
443
|
.then(() =>
|
|
444
|
-
this.stController.
|
|
444
|
+
this.stController.deleteObj(devId, () =>
|
|
445
445
|
this.stController.updateDev(devId, model, model, async () => {
|
|
446
446
|
await this.stController.syncDevStates(device, model);
|
|
447
447
|
resolve();
|
|
@@ -467,7 +467,9 @@ class Zigbee extends utils.Adapter {
|
|
|
467
467
|
const devId = device.ieeeAddr.substr(2);
|
|
468
468
|
const meta = {device};
|
|
469
469
|
|
|
470
|
-
|
|
470
|
+
const has_elevated_debug = this.stController.checkDebugDevice(devId);
|
|
471
|
+
|
|
472
|
+
if (has_elevated_debug) {
|
|
471
473
|
const shortMessage = {};
|
|
472
474
|
for(const propertyName in message) {
|
|
473
475
|
shortMessage[propertyName] = message[propertyName];
|
|
@@ -475,7 +477,7 @@ class Zigbee extends utils.Adapter {
|
|
|
475
477
|
shortMessage.device = device.ieeeAddr;
|
|
476
478
|
shortMessage.meta = undefined;
|
|
477
479
|
shortMessage.endpoint = (message.endpoint.ID ? message.endpoint.ID: -1);
|
|
478
|
-
this.log.warn(`ELEVATED: Zigbee Event of Type ${type} from device ${safeJsonStringify(device.ieeeAddr)}, incoming event: ${safeJsonStringify(shortMessage)}`);
|
|
480
|
+
this.log.warn(`ELEVATED I0: Zigbee Event of Type ${type} from device ${safeJsonStringify(device.ieeeAddr)}, incoming event: ${safeJsonStringify(shortMessage)}`);
|
|
479
481
|
}
|
|
480
482
|
// this assigment give possibility to use iobroker logger in code of the converters, via meta.logger
|
|
481
483
|
meta.logger = this.log;
|
|
@@ -558,6 +560,8 @@ class Zigbee extends utils.Adapter {
|
|
|
558
560
|
if (!converters.length) {
|
|
559
561
|
if (type !== 'readResponse') {
|
|
560
562
|
this.log.debug(`No converter available for '${mappedModel.model}' '${devId}' with cluster '${cluster}' and type '${type}'`);
|
|
563
|
+
if (has_elevated_debug)
|
|
564
|
+
this.log.warn(`ELEVATED IE0: No converter available for '${mappedModel.model}' '${devId}' with cluster '${cluster}' and type '${type}'`);
|
|
561
565
|
}
|
|
562
566
|
return;
|
|
563
567
|
}
|
|
@@ -625,7 +629,14 @@ class Zigbee extends utils.Adapter {
|
|
|
625
629
|
let isGroup = false;
|
|
626
630
|
const has_elevated_debug = this.stController.checkDebugDevice(deviceId)
|
|
627
631
|
|
|
628
|
-
|
|
632
|
+
if (has_elevated_debug)
|
|
633
|
+
{
|
|
634
|
+
const stateNames = [];
|
|
635
|
+
stateList.forEach( state => stateNames.push(state.id));
|
|
636
|
+
this.log.warn(`ELEVATED O03: Publishing to ${deviceId} of model ${model} ${stateNames.join(', ')}`);
|
|
637
|
+
}
|
|
638
|
+
else
|
|
639
|
+
this.log.debug(`publishFromState : ${deviceId} ${model} ${safeJsonStringify(stateList)}`);
|
|
629
640
|
if (model === 'group') {
|
|
630
641
|
isGroup = true;
|
|
631
642
|
deviceId = parseInt(deviceId);
|
|
@@ -633,13 +644,11 @@ class Zigbee extends utils.Adapter {
|
|
|
633
644
|
try {
|
|
634
645
|
const entity = await this.zbController.resolveEntity(deviceId);
|
|
635
646
|
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
const mappedModel = entity.mapped;
|
|
647
|
+
const mappedModel = (entity ? entity.mapped : undefined);
|
|
639
648
|
|
|
640
649
|
if (!mappedModel) {
|
|
641
|
-
this.log.debug(`No mapped model for ${model}`);
|
|
642
|
-
if (has_elevated_debug) this.log.
|
|
650
|
+
this.log.debug(`No mapped model for ${deviceId} (model ${model})`);
|
|
651
|
+
if (has_elevated_debug) this.log.error(`ELEVATED OE01: No mapped model ${deviceId} (model ${model})`)
|
|
643
652
|
return;
|
|
644
653
|
}
|
|
645
654
|
|
|
@@ -678,25 +687,34 @@ class Zigbee extends utils.Adapter {
|
|
|
678
687
|
// on activation of the 'device_query' state trigger hardware query where possible
|
|
679
688
|
if (stateDesc.id === 'device_query') {
|
|
680
689
|
if (this.query_device_block.indexOf(deviceId) > -1) {
|
|
681
|
-
this.log.
|
|
690
|
+
this.log.info(`Device query for '${entity.device.ieeeAddr}' blocked`);
|
|
682
691
|
return;
|
|
683
692
|
}
|
|
684
693
|
if (mappedModel) {
|
|
685
694
|
this.query_device_block.push(deviceId);
|
|
686
|
-
|
|
695
|
+
if (has_elevated_debug)
|
|
696
|
+
this.log.warn(`ELEVATED O06: Device query for '${entity.device.ieeeAddr}/${entity.device.endpoints[0].ID}' triggered`);
|
|
697
|
+
let t;
|
|
687
698
|
for (const converter of mappedModel.toZigbee) {
|
|
688
699
|
if (converter.hasOwnProperty('convertGet')) {
|
|
689
700
|
for (const ckey of converter.key) {
|
|
690
701
|
try {
|
|
691
|
-
await converter.convertGet(entity.device.endpoints[0], ckey, {});
|
|
702
|
+
await converter.convertGet(entity.device.endpoints[0], ckey, {endpoint_name:entity.device.endpoints[0].ID.toString()});
|
|
692
703
|
} catch (error) {
|
|
693
|
-
|
|
694
|
-
|
|
704
|
+
if (has_elevated_debug) {
|
|
705
|
+
this.log.warn(`ELEVATED OE02.1 Failed to read state '${JSON.stringify(ckey)}'of '${entity.device.ieeeAddr}/${entity.device.endpoints[0].ID}' from query with '${error && error.message ? error.message : 'no error message'}`);
|
|
706
|
+
}
|
|
707
|
+
else
|
|
708
|
+
this.log.info(`failed to read state ${JSON.stringify(ckey)} of ${entity.device.ieeeAddr}/${entity.device.endpoints[0].ID} after device query`);
|
|
695
709
|
}
|
|
696
710
|
}
|
|
697
711
|
}
|
|
698
712
|
}
|
|
699
|
-
|
|
713
|
+
if (has_elevated_debug)
|
|
714
|
+
this.log.warn(`ELEVATED O07: Device query for '${entity.device.ieeeAddr}/${entity.device.endpoints[0].ID}' complete`);
|
|
715
|
+
else
|
|
716
|
+
this.log.info(`Device query for '${entity.device.ieeeAddr}/${entity.device.endpoints[0].ID}' complete`);
|
|
717
|
+
|
|
700
718
|
const idToRemove = deviceId;
|
|
701
719
|
setTimeout(() => {
|
|
702
720
|
const idx = this.query_device_block.indexOf(idToRemove);
|
|
@@ -711,30 +729,35 @@ class Zigbee extends utils.Adapter {
|
|
|
711
729
|
}
|
|
712
730
|
|
|
713
731
|
let converter = undefined;
|
|
732
|
+
let msgCnt = 1;
|
|
714
733
|
for (const c of mappedModel.toZigbee) {
|
|
715
734
|
|
|
716
735
|
if (!c.hasOwnProperty('convertSet')) continue;
|
|
717
736
|
this.log.debug(`Type of toZigbee is '${typeof c}', Contains key ${(c.hasOwnProperty('key')?JSON.stringify(c.key):'false ')}`)
|
|
718
|
-
if (!c.hasOwnProperty('key')
|
|
737
|
+
if (!c.hasOwnProperty('key'))
|
|
719
738
|
{
|
|
720
|
-
converter
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
739
|
+
if (c.hasOwnProperty('convertSet') && converter === undefined)
|
|
740
|
+
{
|
|
741
|
+
converter = c;
|
|
742
|
+
if (has_elevated_debug) {
|
|
743
|
+
this.log.warn(`ELEVATED O4.${msgCnt++}: Setting converter to keyless converter for ${deviceId} of type ${model}`)
|
|
744
|
+
}
|
|
745
|
+
this.log.debug('setting converter to keyless converter')
|
|
746
|
+
}
|
|
747
|
+
else
|
|
748
|
+
{
|
|
749
|
+
if (has_elevated_debug) this.log.warn(`ELEVATED O4.${msgCnt++}: ignoring keyless converter for ${deviceId} of type ${model}`)
|
|
750
|
+
this.log.debug('ignoring keyless converter')
|
|
751
|
+
}
|
|
724
752
|
continue;
|
|
725
753
|
}
|
|
726
754
|
if (c.key.includes(stateDesc.prop) || c.key.includes(stateDesc.setattr) || c.key.includes(stateDesc.id))
|
|
727
755
|
{
|
|
728
756
|
this.log.debug(`${(converter===undefined?'Setting':'Overriding')}' converter to converter with key(s)'${JSON.stringify(c.key)}}`)
|
|
729
|
-
if (has_elevated_debug) this.log.warn(`ELEVATED: ${(converter===undefined?'Setting':'Overriding')}' converter to converter with key(s)'${JSON.stringify(c.key)}}`)
|
|
757
|
+
if (has_elevated_debug) this.log.warn(`ELEVATED O4.${msgCnt++}: ${(converter===undefined?'Setting':'Overriding')}' converter to converter with key(s)'${JSON.stringify(c.key)}}`)
|
|
730
758
|
converter = c;
|
|
731
759
|
}
|
|
732
|
-
|
|
733
760
|
}
|
|
734
|
-
/*
|
|
735
|
-
if (!mappedModel.toZigbee[0].hasOwnProperty('key') && mappedModel.toZigbee[0].hasOwnProperty('convertSet')) converter = mappedModel.toZigbee[0];
|
|
736
|
-
converter = mappedModel.toZigbee.find(c => c && c.hasOwnProperty('key') && (c.key.includes(stateDesc.prop) || c.key.includes(stateDesc.setattr) || c.key.includes(stateDesc.id)));
|
|
737
|
-
*/
|
|
738
761
|
if (converter === undefined) {
|
|
739
762
|
this.log.error(`No converter available for '${model}' with key '${stateDesc.id}' `);
|
|
740
763
|
this.sendError(`No converter available for '${model}' with key '${stateDesc.id}' `);
|
|
@@ -755,9 +778,9 @@ class Zigbee extends utils.Adapter {
|
|
|
755
778
|
}
|
|
756
779
|
|
|
757
780
|
const epName = stateDesc.epname !== undefined ? stateDesc.epname : (stateDesc.prop || stateDesc.id);
|
|
758
|
-
const key = stateDesc.
|
|
781
|
+
const key = stateDesc.setattr || stateDesc.prop || stateDesc.id;
|
|
759
782
|
this.log.debug(`convert ${key}, ${safeJsonStringify(preparedValue)}, ${safeJsonStringify(preparedOptions)}`);
|
|
760
|
-
if (has_elevated_debug) this.log.warn(`ELEVATED: convert ${key}, ${safeJsonStringify(preparedValue)}, ${safeJsonStringify(preparedOptions)} for device ${deviceId}`);
|
|
783
|
+
if (has_elevated_debug) this.log.warn(`ELEVATED O4: convert ${key}, ${safeJsonStringify(preparedValue)}, ${safeJsonStringify(preparedOptions)} for device ${deviceId} with Endpoint ${epName}`);
|
|
761
784
|
|
|
762
785
|
let target;
|
|
763
786
|
if (model === 'group') {
|
|
@@ -797,30 +820,27 @@ class Zigbee extends utils.Adapter {
|
|
|
797
820
|
try {
|
|
798
821
|
const result = await converter.convertSet(target, key, preparedValue, meta);
|
|
799
822
|
this.log.debug(`convert result ${safeJsonStringify(result)}`);
|
|
800
|
-
if (has_elevated_debug) this.log.warn(`ELEVATED: convert result ${safeJsonStringify(result)}
|
|
823
|
+
if (has_elevated_debug) this.log.warn(`ELEVATED O05: convert result ${safeJsonStringify(result)} sent to device ${deviceId}`);
|
|
801
824
|
if (result !== undefined) {
|
|
802
825
|
if (stateModel && !isGroup) {
|
|
803
826
|
this.acknowledgeState(deviceId, model, stateDesc, value);
|
|
804
827
|
}
|
|
805
828
|
// process sync state list
|
|
806
829
|
this.processSyncStatesList(deviceId, model, syncStateList);
|
|
807
|
-
|
|
808
|
-
// if (isGroup) {
|
|
809
|
-
// await this.callPluginMethod('queryGroupMemberState', [deviceId, stateDesc]);
|
|
810
|
-
// this.acknowledgeState(deviceId, model, stateDesc, value);
|
|
811
|
-
// }
|
|
812
830
|
}
|
|
813
831
|
else
|
|
814
|
-
if (has_elevated_debug)
|
|
832
|
+
if (has_elevated_debug)
|
|
833
|
+
this.log.error(`ELEVATED OE2: Error convert result for ${key} with ${safeJsonStringify(preparedValue)} is undefined on device ${deviceId}.`);
|
|
815
834
|
|
|
816
835
|
} catch (error) {
|
|
817
|
-
if (has_elevated_debug)
|
|
836
|
+
if (has_elevated_debug)
|
|
837
|
+
this.log.error(`ELEVATED OE3: caught error ${safeJsonStringify(error)} when setting value for device ${deviceId}.`);
|
|
818
838
|
this.filterError(`Error ${error.code} on send command to ${deviceId}.` +
|
|
819
839
|
` Error: ${error.stack}`, `Send command to ${deviceId} failed with`, error);
|
|
820
840
|
}
|
|
821
841
|
});
|
|
822
842
|
} catch (err) {
|
|
823
|
-
this.log.error(`No entity for ${deviceId}`);
|
|
843
|
+
this.log.error(`No entity for ${deviceId} : ${err && err.message ? err.message : ''}`);
|
|
824
844
|
}
|
|
825
845
|
}
|
|
826
846
|
|
|
@@ -934,7 +954,7 @@ class Zigbee extends utils.Adapter {
|
|
|
934
954
|
if (ieeeAddr) {
|
|
935
955
|
const devId = ieeeAddr.substr(2);
|
|
936
956
|
this.log.debug(`Delete device ${devId} from iobroker.`);
|
|
937
|
-
this.stController.
|
|
957
|
+
this.stController.deleteObj(devId);
|
|
938
958
|
}
|
|
939
959
|
}
|
|
940
960
|
|