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.
@@ -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 (e) {
152
- this.sendError(e);
153
- this.error(`Starting zigbee-herdsman problem : ${JSON.stringify(e.message)}`);
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(JSON.stringify(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
- const nid = typeof id === 'number' ? id : parseInt(id);
326
- let group = await this.herdsman.getGroupByID(nid);
327
- if (!group) {
328
- group = await this.herdsman.createGroup(nid);
329
- group.toZigbee = groupConverters;
330
- group.model = 'group';
331
- this.debug(`verifyGroupExists: created group ${nid}`);
332
- } else {
333
- this.debug(`verifyGroupExists: group ${nid} exists`);
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
- await this.herdsman.addInstallCode(code);
341
- this.info(`added code ${code} for pairing`);
342
- return true;
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: error is ${JSON.stringify(error)} ${JSON.stringify(new Error().stack)}`);
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
- return this.herdsman.getDeviceByIeeeAddr(key);
391
+ try {
392
+ return this.herdsman.getDeviceByIeeeAddr(key);
393
+ }
394
+ catch {
395
+ return undefined;
396
+ }
382
397
  }
383
398
 
384
399
  getDevicesByType(type) {
385
- return this.herdsman.getDevicesByType(type);
400
+ try {
401
+ return this.herdsman.getDevicesByType(type);
402
+ }
403
+ catch {
404
+ return undefined;
405
+ }
386
406
  }
387
407
 
388
408
  getDeviceByNetworkAddress(networkAddress) {
389
- return this.herdsman.getDeviceByNetworkAddress(networkAddress);
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
- if (typeof key === 'string') {
396
- if (key === 'coordinator') {
397
- const coordinator = this.herdsman.getDevicesByType('Coordinator')[0];
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
- mapped,
426
- endpoint,
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
- return {
452
- type: 'device',
453
- device: key,
454
- mapped: mapped,
455
- name: key.type === 'Coordinator' ? 'Coordinator' : key.ieeeAddr,
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
- this.debug('incoming msg', message);
462
- const device = await this.herdsman.getDeviceByIeeeAddr(message.srcaddr);
463
- if (!device) {
464
- this.debug('Message without device!');
465
- return;
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
- // We can't handle devices without modelId.
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
- if (type === 'foundation') {
819
- cfg.disableDefaultResponse = true;
820
-
821
- if (cmd === 'read' && !Array.isArray(zclData)) {
822
- /* // needs to be iterable (string[] | number [])
823
- zclData[Symbol.iterator] = function* () {
824
- let k;
825
- for (k in this) {
826
- yield k;
827
- }
828
- };
829
- */
830
- }
831
- let result;
832
- if (cmd === 'configReport') {
833
- result = await endpoint.configureReporting(cid, zclData, cfg);
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
- if (cmd === 'read' && !Array.isArray(zclData))
836
- result = await endpoint[cmd](cid, Object.keys(zclData), cfg);
837
- else
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}: ${JSON.stringify(error)}`};
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
- ep.bind(cluster, target, error => {
961
- if (error) {
962
- this.sendError(error);
963
- this.error(`Failed to bind ${log} - (${error})`);
964
- } else {
965
- this.debug(`Successfully bound ${log}`);
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
- ep.unbind(cluster, target, (error) => {
978
- if (error) {
979
- this.error(`Failed to unbind ${log} - (${error})`);
980
- } else {
981
- this.debug(`Successfully unbound ${log}`);
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.deleteDeviceStates(devId, () =>
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
- if (this.stController.checkDebugDevice(devId)) {
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
- this.log.debug(`publishFromState : ${deviceId} ${model} ${safeJsonStringify(stateList)}`);
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
- this.log.debug(`entity: ${deviceId} ${model} ${safeJsonStringify(entity)}`);
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.warn(`ELEVATED: No mapped model for ${model}`)
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.warn(`Device query for '${entity.device.ieeeAddr}' blocked`);
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
- this.log.debug(`Device query for '${entity.device.ieeeAddr}' started`);
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
- this.log.warn(`Failed to read state '${JSON.stringify(ckey)}'of '${entity.device.ieeeAddr}' after query with '${JSON.stringify(error)}'`);
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
- this.log.debug(`Device query for '${entity.device.ieeeAddr}' done`);
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') && c.hasOwnProperty('convertSet') && converter === undefined)
737
+ if (!c.hasOwnProperty('key'))
719
738
  {
720
- converter = c;
721
-
722
- if (has_elevated_debug) this.log.warn(`ELEVATED: setting converter to keyless converter for ${deviceId} of type ${model}`)
723
- this.log.debug('setting converter to keyless converter')
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.prop || stateDesc.id || stateDesc.setattr;
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)} for device ${deviceId}`);
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) this.log.warn(`Error convert result for ${key} with ${safeJsonStringify(preparedValue)} is undefined on device ${deviceId}.`);
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) this.log.warn(`caught error ${safeJsonStringify(error)} is undefined on device ${deviceId}.`);
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.deleteDeviceStates(devId);
957
+ this.stController.deleteObj(devId);
938
958
  }
939
959
  }
940
960