NEWS
Problem mit JS und Zigbee-Lampen und -gruppen
-
Guten Morgen,
ich stehe im Moment vor einem Problem mit der Steuerung meiner Lampen via JavaScript und dem Zigbee-Adapter.
Zur Situation:
Ich habe einige Lampen und ein paar Schalter via Zigbee eingebunden. Dazu habe ich die Lampen (nicht die Gruppen) via iot auch für Alexa verfügbar gemacht. Innerhalb von Alexa habe ich diese dann zusätzlich gruppiert.
Ich kann die Gruppen aus ioBroker nicht an Alexa geben, weil ich in Alexa noch Geräte in den Gruppen habe, die nicht via ioBroker laufen.Zum Problem:
Wenn ich die Lampen(-gruppen) via Schalter steuere, funktioniert das. Ich lausche auf die "click" States der verschiedenen Schalter und setze dann die brightness oder den power state der Zigbee-Gruppen, zum Beispiel etwa so:on(['zigbee.0.ccccc.left_click','zigbee.0.ccccc.right_click'], function(obj) { let grp = 'zigbee.0.group_6'; if(obj.id.endsWith('.right_click')) { grp = 'zigbee.0.group_7'; } if(obj.state.val) { let cur = getState(grp + '.brightness').val; if(cur && cur > 0) { setState(grp + '.brightness', 0); setState(grp + '.state', false); } else { setState(grp + '.brightness', 100); setState(grp + '.state', true); } } });
Nun stellt sich folgendes Problem:
Wenn ich die Lampen zwischenzeitlich via Alexa ausschalte oder die Helligkeit ändere, dann wird dieser Wert ja nur bei den einzelnen Lampen gesetzt, nicht bei der Gruppe. Drücke ich also den Schalter das nächste Mal, erkennt er nicht den richtigen Status. Bei ein/aus kriege ich es noch gebacken, bei der Helligkeit wird es schon schwieriger.Ich habe nun versucht, einfach zusätzlich auf den Lampenstatus zu horchen und die entsprechenden Gruppen zu aktualisieren (jetzt wirds konfus
on(/^zigbee\.0\..*\.(brightness|state)$/, function(obj) { if(obj.state.ack) { return; } //log(obj.id + ': ' + JSON.stringify(obj)); let match = obj.id.match(/^(zigbee\.0\..*)\.(brightness|state)/); if(!match) { return; } let deviceId = match[1]; let attr = match[2]; //log('Dev ' + deviceId + ' attr ' + attr + ' changed from ' + obj.oldState.val + ' to ' + obj.state.val); if(attr === 'brightness') { if(obj.oldState.val > 0 && obj.state.val == 0) { setState(deviceId + '.state', false); } else if(obj.oldState.val == 0 && obj.state.val > 0) { setState(deviceId + '.state', true); } } else { if(obj.oldState.val === false && obj.state.val === true) { let stat = getState(deviceId + '.brightness').val; if(stat === 0) { setState(deviceId + '.brightness', 100); } } else if(obj.oldState.val === true && obj.state.val === false) { setState(deviceId + '.brightness', 0); } } if(obj.id.indexOf('zigbee.0.group_') === 0) { $('*.groups').each(function(stateid) { if(stateid.indexOf('zigbee.0.') !== 0) { return this; } else if(stateid.indexOf('zigbee.0.info.') === 0) { return this; } let grp = getState(stateid).val; if(!grp) { return this; } grp = JSON.parse(grp); if(!grp) { return this; } let memberId = stateid.substr(0, -7); log(JSON.stringify(grp)); if(grp.indexOf(deviceId.replace(/^zigbee\.0\.group_/, '')) !== -1) { log('Device ' + memberId + ' (' + stateid + ') is part of group ' + deviceId + ', setting ' + attr + ' to ' + JSON.stringify(obj.state.val)); setState(memberId + '.' + attr, obj.state.val, true); } }); } else if(existsState(deviceId + '.groups')) { let grp = getState(deviceId + '.groups').val; grp = JSON.parse(grp); for(let i = 0; i < grp.length; i++) { log('Device ' + deviceId + ' is part of group ' + grp[i] + ', setting ' + attr + ' to ' + JSON.stringify(obj.state.val)); setState('zigbee.0.group_' + grp[i] + '.' + attr, obj.state.val, true); } } });
Das funktioniert aber nur so semigut. Vielleicht hat noch jemand eine Idee, wie ich das Problem besser angehen kann.
Dazu kommt ja noch, dass ich ebenso folgende Konstellation habe:8 Lampen
4 davon in Gruppe 1
4 davon in Gruppe 2
alle 8 in Gruppe 3Gruppe 1 und 2 sind via Alexa verfügbar und dort wiederum in einer eigenen Gruppe (ich nenne sie mal Gruppe 4) zusammengefasst. Also hilft mein obiges Skript nicht, denn:
Alexa, schalte Gruppe 4 aus.
-> Gruppe 1 und 2 kriegen den Befehl ausschalten via ioBroker
-> Mein Listener greift und setzt die 4 Lampen in den jeweiligen Gruppen auf den richtigen Status
-> Da ich aber mit ack = true setzen muss, kann der Listener nun Gruppe 3 nicht mehr anpassen, die aber vom Lichtschalter gesteuert wird. Somit hat der Lichtschalter beim Drücken die falsche Info über Gruppe 3.Oje, das war jetzt hoffentlich nicht zu verwirrend.
Liebe Grüße
Marius