iobroker.zigbee 1.6.8 → 1.6.12

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.
@@ -105,11 +105,11 @@ class ZigbeeController extends EventEmitter {
105
105
  this.debug('zigbee-herdsman started');
106
106
  this.herdsman_started = true;
107
107
  this.info(`Coordinator firmware version: ${JSON.stringify(await this.herdsman.getCoordinatorVersion())}`);
108
-
108
+
109
109
  // debug info from herdsman getNetworkParameters
110
110
  const debNetworkParam = JSON.parse(JSON.stringify(await this.herdsman.getNetworkParameters()));
111
111
  const extendedPanIDDebug = (typeof debNetworkParam.extendedPanID == 'string') ? debNetworkParam.extendedPanID.replace('0x','') : debNetworkParam.extendedPanID;
112
-
112
+
113
113
  let extPanIDDebug = '';
114
114
  for (let i = extendedPanIDDebug.length - 1; i >= 0; i--) {
115
115
  extPanIDDebug += extendedPanIDDebug[i-1];
@@ -117,8 +117,8 @@ class ZigbeeController extends EventEmitter {
117
117
  i--;
118
118
  }
119
119
 
120
- this.debug(`Zigbee network parameters: panID=${debNetworkParam.panID} channel=${debNetworkParam.channel} extendedPanID=${extPanIDDebug}`);
121
-
120
+ this.debug(`Zigbee network parameters: panID=${debNetworkParam.panID} channel=${debNetworkParam.channel} extendedPanID=${extPanIDDebug}`);
121
+
122
122
  } catch (e) {
123
123
  this.sendError(e);
124
124
  this.error('Starting zigbee-herdsman problem : ' + JSON.stringify(e.message));
@@ -148,6 +148,9 @@ class ZigbeeController extends EventEmitter {
148
148
  case '19':
149
149
  powerText = 'high';
150
150
  break;
151
+ case '20':
152
+ powerText = 'high+';
153
+ break;
151
154
  default:
152
155
  powerText = 'normal';
153
156
  }
@@ -217,13 +220,14 @@ class ZigbeeController extends EventEmitter {
217
220
  }
218
221
 
219
222
  callExtensionMethod(method, parameters) {
223
+ const result = [];
220
224
  for (const extension of this.extensions) {
221
225
  if (extension[method]) {
222
226
  try {
223
227
  if (parameters !== undefined) {
224
- extension[method](...parameters);
228
+ result.push(extension[method](...parameters));
225
229
  } else {
226
- extension[method]();
230
+ result.push(extension[method]());
227
231
  }
228
232
  } catch (error) {
229
233
  this.sendError(error);
@@ -231,6 +235,7 @@ class ZigbeeController extends EventEmitter {
231
235
  }
232
236
  }
233
237
  }
238
+ return Promise.all(result);
234
239
  }
235
240
 
236
241
  async getClients(all) {
@@ -248,9 +253,11 @@ class ZigbeeController extends EventEmitter {
248
253
 
249
254
  async getGroups() {
250
255
  try {
251
- return this.herdsman.getGroups();
256
+ const rv = await this.herdsman.getGroups();
257
+ return rv;
252
258
  } catch (error) {
253
259
  this.sendError(error);
260
+ this.error(JSON.stringify(error));
254
261
  return undefined;
255
262
  }
256
263
  }
@@ -280,11 +287,11 @@ class ZigbeeController extends EventEmitter {
280
287
  const group = await this.getGroupByID(id);
281
288
  if (group) {
282
289
  const groupmembers = group.members;
283
-
284
290
  for (const member of groupmembers) {
291
+ const epid = (member.ID ? member.ID:-1);
285
292
  const nwk = member.deviceNetworkAddress;
286
293
  const device = this.getDeviceByNetworkAddress(nwk);
287
- if (device && device.ieeeAddr) members.push( { device:device.ieeeAddr, model:device.modelID } );
294
+ if (device && device.ieeeAddr) members.push( { ieee:device.ieeeAddr, model:device.modelID, epid:epid, ep:member } );
288
295
  }
289
296
  }
290
297
  else {
@@ -525,6 +532,13 @@ class ZigbeeController extends EventEmitter {
525
532
  const entity = await this.resolveEntity(message.device || message.ieeeAddr);
526
533
  const friendlyName = entity.name;
527
534
  this.warn(`Device '${friendlyName}' announced itself`);
535
+
536
+ if (entity && entity.mapped) {
537
+ this.callExtensionMethod(
538
+ 'onZigbeeEvent',
539
+ [ {'device': message.device, 'type': 'deviceAnnounce'}, (entity ? entity.mapped : null)]);
540
+ }
541
+
528
542
  this.emit('pairing', `Device '${friendlyName}' announced itself`);
529
543
  if (!this.herdsman.getPermitJoin()) this.callExtensionMethod('registerDevicePing', [message.device, entity]);
530
544
  // if has modelID so can create device
@@ -534,6 +548,7 @@ class ZigbeeController extends EventEmitter {
534
548
  }
535
549
  }
536
550
 
551
+
537
552
  async handleDeviceJoined(message) {
538
553
  this.debug('handleDeviceJoined', message);
539
554
  //const entity = await this.resolveEntity(message.device || message.ieeeAddr);
@@ -729,12 +744,6 @@ class ZigbeeController extends EventEmitter {
729
744
  if (callback) callback(undefined, result);
730
745
  }
731
746
  else if(type === 'functionalResp'){
732
- if (!zclSeqNum) {
733
- this.error(
734
- `Zigbee cannot publish commandResponse message to device because zclSeqNum is not known`
735
- );
736
- return;
737
- }
738
747
  cfg.disableDefaultResponse = false;
739
748
  const result = await endpoint.commandResponse(cid, cmd, zclData, cfg, zclSeqNum);
740
749
  if (callback) callback(undefined, result);
@@ -746,13 +755,44 @@ class ZigbeeController extends EventEmitter {
746
755
  }
747
756
  }
748
757
 
749
- async addDevToGroup(devId, groupId) {
758
+ async addDevToGroup(devId, groupId, epid) {
750
759
  try {
751
760
  const entity = await this.resolveEntity(devId);
752
761
  const group = await this.resolveEntity(groupId);
753
- this.debug(`entity: ${safeJsonStringify(entity)}`);
754
- this.debug(`group: ${safeJsonStringify(group)}`);
755
- await entity.endpoint.addToGroup(group.mapped);
762
+ this.debug(`addDevFromGroup - entity: ${safeJsonStringify(entity)}`);
763
+ this.debug(`addDevFromGroup - group: ${safeJsonStringify(group)}`);
764
+ if (epid != undefined) {
765
+ for (const ep of entity.endpoints) {
766
+ if (ep.ID == epid && (ep.inputClusters.includes(4) || ep.outputClusters.includes(4)))
767
+ {
768
+ this.debug(`adding endpoint ${ep.ID} (${epid}) to group ${groupId}`)
769
+ await(ep.addToGroup(group.mapped));
770
+ }
771
+ }
772
+
773
+ }
774
+ else
775
+ {
776
+ if (entity.endpoint.inputClusters.includes(4))
777
+ {
778
+ this.debug(`adding endpoint ${entity.endpoint.ID} to group`)
779
+ await entity.endpoint.addToGroup(group.mapped);
780
+ }
781
+ else {
782
+ let added = false;
783
+ for (const ep of entity.endpoints)
784
+ {
785
+ if (ep.inputClusters.includes(4))
786
+ {
787
+ this.debug(`adding endpoint ${ep.ID} to group`)
788
+ await ep.addToGroup(group.mapped);
789
+ added = true;
790
+ break;
791
+ }
792
+ }
793
+ if (!added) throw ('cluster genGroups not supported');
794
+ }
795
+ }
756
796
  } catch (error) {
757
797
  this.sendError(error);
758
798
  this.error(`Exception when trying to Add ${devId} to group ${groupId}`, error);
@@ -761,11 +801,38 @@ class ZigbeeController extends EventEmitter {
761
801
  return {};
762
802
  }
763
803
 
804
+ async removeDevFromGroup(devId, groupId, epid) {
805
+ try {
806
+ const entity = await this.resolveEntity(devId);
807
+ const group = await this.resolveEntity(groupId);
808
+ this.debug(`removeDevFromGroup - entity: ${safeJsonStringify(entity)}`);
809
+ this.debug(`removeDevFromGroup - group: ${safeJsonStringify(group)}`);
810
+ if (epid != undefined) {
811
+ for (const ep of entity.endpoints) {
812
+ if (ep.ID == epid && (ep.inputClusters.includes(4) || ep.outputClusters.includes(4)))
813
+ {
814
+ this.debug(`removing endpoint ${ep.ID} (${epid}) group ${groupId}`)
815
+ await(ep.removeFromGroup(group.mapped))
816
+ }
817
+ }
818
+ } else await entity.endpoint.removeFromGroup(group.mapped);
819
+ } catch (error) {
820
+ this.sendError(error);
821
+ this.error(`Exception when trying remove ${devId} (ep ${epid?epid:entity.endpoint.ID}) from group ${devId}`, error);
822
+ return { error: `Failed to remove dev ${devId} (ep ${epid?epid:entity.endpoint.ID}) from group ${devId}`};
823
+ }
824
+ return {};
825
+ }
826
+
764
827
  async removeDevFromAllGroups(devId) {
765
828
  try {
766
829
  const entity = await this.resolveEntity(devId);
767
830
  this.debug(`entity: ${safeJsonStringify(entity)}`);
768
- await entity.endpoint.removeFromAllGroups();
831
+ for (const ep of entity.endpoints) {
832
+ if (ep.inputClusters.includes(4) || ep.outputClusters.includes(4))
833
+ await ep.removefromAllGroups();
834
+ }
835
+ //await entity.endpoint.removeFromAllGroups();
769
836
  } catch (error) {
770
837
  this.sendError(error);
771
838
  this.error(`Exception when trying remove ${devId} from all groups`, error);
package/main.js CHANGED
@@ -159,7 +159,7 @@ class Zigbee extends utils.Adapter {
159
159
  this.log.error(`${message}: Code ${error.code} (${ecode.message})`);
160
160
  this.sendError(error, `${message}: Code ${error.code} (${ecode.message})`);
161
161
  break;
162
- default:
162
+ default:
163
163
  this.log.error(`${message}: Code ${error.code} (malformed error)`);
164
164
  this.sendError(error, `${message}: Code ${error.code} (malformed error)`);
165
165
  }
@@ -306,6 +306,7 @@ class Zigbee extends utils.Adapter {
306
306
 
307
307
  async onZigbeeAdapterReady() {
308
308
  if (this.reconnectTimer) clearTimeout(this.reconnectTimer);
309
+ this.log.warn("config :" + JSON.stringify(this.config));
309
310
  this.log.info(`Zigbee started`);
310
311
  // https://github.com/ioBroker/ioBroker.zigbee/issues/668
311
312
  const extPanIdFix = this.config.extPanIdFix ? this.config.extPanIdFix : false;
@@ -431,7 +432,7 @@ class Zigbee extends utils.Adapter {
431
432
  delete msgForState['endpoint'];
432
433
  msgForState['endpoint_id'] = message.endpoint.ID;
433
434
  this.publishToState(devId, model, {msg_from_zigbee: safeJsonStringify(msgForState)});
434
-
435
+
435
436
  if (!entity.mapped) {
436
437
  return;
437
438
  }
@@ -771,8 +772,8 @@ class Zigbee extends utils.Adapter {
771
772
  getZigbeeOptions() {
772
773
  // file path for db
773
774
  let dbDir = path.join(utils.getAbsoluteInstanceDataDir(this), '');
774
- dbDir = dbDir.replace('.', '_');
775
-
775
+ dbDir = dbDir.replace('.', '_');
776
+
776
777
  if (this.systemConfig && !fs.existsSync(dbDir)) {
777
778
  try {
778
779
  fs.mkdirSync(dbDir);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.zigbee",
3
- "version": "1.6.8",
3
+ "version": "1.6.12",
4
4
  "author": {
5
5
  "name": "Kirov Ilya",
6
6
  "email": "kirovilya@gmail.com"
@@ -18,8 +18,8 @@
18
18
  "node": ">=10"
19
19
  },
20
20
  "dependencies": {
21
- "zigbee-herdsman": "0.13.178",
22
- "zigbee-herdsman-converters": "14.0.339",
21
+ "zigbee-herdsman": "0.13.192",
22
+ "zigbee-herdsman-converters": "14.0.378",
23
23
  "@iobroker/adapter-core": "^2.4.0",
24
24
  "tar": "^6.0.5",
25
25
  "typescript": "^4.0.5"