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.
- package/README.md +11 -1
- package/admin/admin.js +167 -19
- package/admin/img/14153905L.png +0 -0
- package/admin/img/81855.png +0 -0
- package/admin/img/HG06338.png +0 -0
- package/admin/img/TI0001-cover.png +0 -0
- package/admin/index_m.html +93 -19
- package/admin/tab_m.html +119 -211
- package/admin/words.js +29 -28
- package/io-package.json +10 -2
- package/lib/commands.js +35 -4
- package/lib/devices.js +25 -0
- package/lib/exposes.js +791 -791
- package/lib/groups.js +28 -18
- package/lib/rgb.js +30 -0
- package/lib/states.js +38 -13
- package/lib/statescontroller.js +84 -22
- package/lib/zbBaseExtension.js +4 -3
- package/lib/zbDelayedAction.js +1 -0
- package/lib/zbDeviceAvailability.js +2 -1
- package/lib/zbDeviceConfigure.js +11 -7
- package/lib/zbDeviceEvent.js +6 -0
- package/lib/zigbeecontroller.js +87 -20
- package/main.js +5 -4
- package/package.json +3 -3
package/lib/zigbeecontroller.js
CHANGED
|
@@ -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
|
-
|
|
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( {
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
22
|
-
"zigbee-herdsman-converters": "14.0.
|
|
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"
|