NEWS
Xiaomi Cube Blockly Skripte für Dimmer
-
Hallo Leute, habe heute einen Xiaomi Cube bekommen und natürlich direkt getestet.
Nun zu meinem Problem:
Ich wollte über die Rotation Funktion die Lichter im Wohnzimmer Dimmen. (nach links drehen - Dunkler - nach rechts drehen - Heller)
Es handelt sich um mehrere Tradfri Leuchtmittel in verschiedenen Lampen.
Dies funktioniert auch eigentlich ganz gut. Nur ist mir aufgefallen wenn z.b. eine Leuchte komplett ausgeschaltet ist, wird diese durch das dimmen automatisch eingeschaltet.
Jetzt wäre meine Frage, wie ich das Skript umstellen muss, dass dies nicht geschieht.
Im Prinzip, prüfe ob Lampe an wahr - dann dimme - wenn Lampe an unwahr - dann mache nichts. Wenn sowas möglich ist. Ich bekomme es aber leider nicht hin.
Vielen DANK im Vorraus.
-
ich denke das wird du nicht lösen können in dem du den Brightness-datenpunkt direkt beschreibst da der Wert zu Lampe gesendet wird und die Lampe eben mit Licht an reagiert.
Idee wäre ein zusätzlicher Datenpunt "Brightness_preset" den du mit deinem Würfel veränderst.
Fall Objekt [Rotation] -... "Brightness_preset"<- neuer drehwinkel Falls Objekt [ "Brightness_preset"] -wurde geändert --Falls Lampe_Power=wahr mache SetObjekt"Brightness" auf Wert von "Brightness_preset" //und noch ein Falls Objekt [ "Lampe_power"] -ist wahr SetObjekt"Brightness" auf wert von "Brightness_preset"
könnte klappen, muss aber nicht
Vermutlich wird die Lampe beim Einschalten erst mal auf die Helligkeit gehen die sie noch in der Birne gespeichert hat und dann auf den neuen Wert dimmen.
Mögliche Fehlerquelle :arrow:
iobroker sendet power_on->Lampe
iobroker erkennt "Lampe_power"=true und setzt neue Helligkeit
Lampe erkennt das on signal und schaltet ein mit alter helligkeit und quittiert den wert -> iobroker
iobroker objekt "brightness" hat wieder den alten Wert aus der Lampe.
dazu noch delay von WLAN/CLOUD/Zigbee also nicht ganz einfach das ganze…
Was ich mir auch schwierig vorstelle, wie stellst du mit drehen auf zb. 20% ein wenn die Lampe aus ist. Alexa sagt "ich habe Ikea-birne auf 20% voreingestellt" oder Anzeige in VIS.
-
Servus,
ich habe gestern abend so was ähnliches gebastelt, bin dann nur an Blockly gescheitert und auf JavaScript gewechselt.
Vielleicht hilft dir das hier ja weiter:
var tempBrightness; on({id: "zigbee.0.00158d00029a7618.rotate_left"/*Rotate left event*/, val: true}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; changeBrightness(-10) }); on({id: "zigbee.0.00158d00029a7618.rotate_right"/*Rotate right event*/, val: true}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; changeBrightness(10); }); function changeBrightness(i) { // getState ungetestet :-) if(getState('zigbee.0.7cb03eaa00add844.state').val === false ) { return; } tempBrightness = parseInt(getState('zigbee.0.7cb03eaa00add844.brightness').val); console.log('tempBrightness:' + tempBrightness); tempBrightness =tempBrightness + i; setState("zigbee.0.7cb03eaa00add844.brightness"/*Brightness*/, tempBrightness); }
Die Erweiterung, dass der Status der Leuchte ausgelesen wird und ggf. die Methode verlassen wird hab ich grad nur blind gemacht, sollte vom Prinzip her aber passen. Außerdem steuere ich immer mit +/- 10 Prozent, werde mir das mit dem RotationAngle mal abschauen
-
ich denke das wird du nicht lösen können in dem du den Brightness-datenpunkt direkt beschreibst da der Wert zu Lampe gesendet wird und die Lampe eben mit Licht an reagiert.
Idee wäre ein zusätzlicher Datenpunt "Brightness_preset" den du mit deinem Würfel veränderst.
Fall Objekt [Rotation] -... "Brightness_preset"<- neuer drehwinkel Falls Objekt [ "Brightness_preset"] -wurde geändert --Falls Lampe_Power=wahr mache SetObjekt"Brightness" auf Wert von "Brightness_preset" //und noch ein Falls Objekt [ "Lampe_power"] -ist wahr SetObjekt"Brightness" auf wert von "Brightness_preset"
könnte klappen, muss aber nicht
Vermutlich wird die Lampe beim Einschalten erst mal auf die Helligkeit gehen die sie noch in der Birne gespeichert hat und dann auf den neuen Wert dimmen.
Mögliche Fehlerquelle :arrow:
iobroker sendet power_on->Lampe
iobroker erkennt "Lampe_power"=true und setzt neue Helligkeit
Lampe erkennt das on signal und schaltet ein mit alter helligkeit und quittiert den wert -> iobroker
iobroker objekt "brightness" hat wieder den alten Wert aus der Lampe.
dazu noch delay von WLAN/CLOUD/Zigbee also nicht ganz einfach das ganze…
Was ich mir auch schwierig vorstelle, wie stellst du mit drehen auf zb. 20% ein wenn die Lampe aus ist. Alexa sagt "ich habe Ikea-birne auf 20% voreingestellt" oder Anzeige in VIS. `
Na ich dachte mir schon das es nicht ganz so einfach werden wird. Ich teste mal…VIELEN DANK!
-
Servus,
ich habe gestern abend so was ähnliches gebastelt, bin dann nur an Blockly gescheitert und auf JavaScript gewechselt.
Vielleicht hilft dir das hier ja weiter:
var tempBrightness; on({id: "zigbee.0.00158d00029a7618.rotate_left"/*Rotate left event*/, val: true}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; changeBrightness(-10) }); on({id: "zigbee.0.00158d00029a7618.rotate_right"/*Rotate right event*/, val: true}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; changeBrightness(10); }); function changeBrightness(i) { // getState ungetestet :-) if(getState('zigbee.0.7cb03eaa00add844.state').val === false ) { return; } tempBrightness = parseInt(getState('zigbee.0.7cb03eaa00add844.brightness').val); console.log('tempBrightness:' + tempBrightness); tempBrightness =tempBrightness + i; setState("zigbee.0.7cb03eaa00add844.brightness"/*Brightness*/, tempBrightness); }
Die Erweiterung, dass der Status der Leuchte ausgelesen wird und ggf. die Methode verlassen wird hab ich grad nur blind gemacht, sollte vom Prinzip her aber passen. Außerdem steuere ich immer mit +/- 10 Prozent, werde mir das mit dem RotationAngle mal abschauen `
Hey, super Vielen Dank auch an dich, leider bin ich beim Thema JavaScript genau gesagt ein Vollblut Anfänger. Wie muss ich denn jetzt weiter verfahren
-
WilliamDalton: so wie ich das verstanden habe möchte er den Dimmerwert auch ändern wenn die Lampe aus ist & aus bleiben soll dabei. Du änderts den Wert auch direkt und die Lampe leuchtet entsprechend. korrekt?
Rocker85: Hast du das mal nach meinem Vorschlag zusammengeklickt mit Blockly und probiert? Wenn ja was passiert?
-
Servus,
ich hab mal ein bissel was gebastelt. Bin auch noch neu im ioBroker, manche Sachen könnten vielleicht eleganter gehen, ein bisschen wackelig ist es vielleicht auch, aber so tut es erst mal
Den Dimmwert bei ausgeschalteter Lampe ändern habe ich nicht hin bekommen bzw. geht meiner Erfahrung nach nicht. Testweise hab ich versucht, den State vor dem ändern des Dimmwerts neu zu setzen. Dann flackert die Lampe aber auch, finde ich nicht so doll die Lösung…
Die Funktion "Wenn die Lampe aus ist, soll sie auch aus bleiben" hab ich implementiert, wenn das nicht gewollt ist kann man es auch auskommentieren.
Die Werte die der Cube liefert wenn der Winkel geändert wurde erschließen sich mir nicht wirklich. Ganze Drehung mach in Summe 250 Grad, halbe 150, aber nicht wirklich gut reproduzierbar. Ich hab daher nen Faktor mit rein gebracht, an dem kann man spielen...
Dann hab ich noch etwas aufgeräumt und die ObjektID´s nach oben gezogen, dann lässt es sich besser anpassen.
> Hey, super Vielen Dank auch an dich, leider bin ich beim Thema JavaScript genau gesagt ein Vollblut Anfänger. Wie muss ich denn jetzt weiter verfahren :-(
Einfach ein neues Skript erstellen und im PopUp JavaScript wählen. Dann den Code rein kopieren und oben die ersten beiden Ids auf deine Gegebenheiten anpassen. Welche das sind findest du im Objektbrowser rausvar idCube = 'zigbee.0.00158d00029a7618'; var idLamp = 'zigbee.0.7cb03eaa00add844'; var angleFactor = 0.3; // Steurt das Verhältnis von Drehungwinkel und resultierender Helligkeitsveränderung on({id: idCube + ".rotate_left"/*Rotate left event*/, val: true}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; var change = getAngle(); changeBrithness(change); }); on({id: idCube +".rotate_right"/*Rotate right event*/, val: true}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; var change = getAngle(); changeBrithness(change); }); function getAngle(){ var tempAngle = parseFloat( getState(idCube + '.rotate_angle').val ); tempAngle = Math.round(tempAngle * angleFactor,0); console.log('tempAngle:' + tempAngle); return parseInt(tempAngle); } function changeBrithness(i) { var tempBrightness = parseInt(getState(idLamp + '.brightness').val); var tempState = getState(idLamp + '.state').val; console.log('tempBrightness:' + tempBrightness); console.log('tempState:' +tempState); if(tempState === false) { console.log('Lampe war aus, dann bleibts aus...'); return; } if (isNaN(tempBrightness)) tempBrightness = 0; tempBrightness = tempBrightness + i; if(tempBrightness > 100) tempBrightness = 100; setState(idLamp + ".brightness"/*Brightness*/, tempBrightness); //setState(idLamp + ".state", tempState); }
-
Vielen DANK an alle für die tollen Tipps.
Wie folgt konnte ich das Problem nun lösen.
Ich musste erst mal jeden einzelne Lampe ansprechen und nicht die Wohnzimmergruppe. Desweiteren wurde noch ein UND hinzugefügt in dem der Power State abgefragt wurde.
Hier nochmals vielen DANK an Myzer@AT