NEWS
2 Heizkörper synchron steuern
-
@georg2608 versuch mal den Trigger auf 'wurde geändert' und 'Auslösung durch 'bestätigte Änderung'.
Dann sollte der Loop weg sein.
A.
-
@georg2608
nicht schön, aber funktioniert:// Heizung: Philipp - Werte übertragen auf die andere Heizung var logging = true; var vHeiz_L = "alias.0.HM.Heizung.Philipp L.SET_TEMPERATURE"; var vHeiz_R = "alias.0.HM.Heizung.Philipp R.SET_TEMPERATURE"; function weiter1() { //Wert übertragen if (getState(vHeiz_L).val != getState(vHeiz_R).val) { if (logging) log("(1) Heizung links aktuell: " + getState(vHeiz_L).val + "°C // Heizung rechts aktuell: " + getState(vHeiz_R).val + "°C"); setTimeout(function() { if (logging) setState(vHeiz_R, getState(vHeiz_L).val); }, 500); if (logging) log("Der links neu eingestellte Wert wurde auf die rechte Heizung übertragen."); setTimeout(function() { if (logging) log("(2) Heizung links aktuell: " + getState(vHeiz_L).val + "°C // Heizung rechts aktuell: " + getState(vHeiz_R).val + "°C"); }, 2000); } } function weiter2() { //Wert übertragen if (getState(vHeiz_L).val != getState(vHeiz_R).val) { if (logging) log("(3) Heizung links aktuell: " + getState(vHeiz_L).val + "°C // Heizung rechts aktuell: " + getState(vHeiz_R).val + "°C"); setTimeout(function() { if (logging) setState(vHeiz_R, getState(vHeiz_R).val); }, 500); if (logging) log("Der links neu eingestellte Wert wurde auf die rechte Heizung übertragen."); setTimeout(function() { if (logging) log("(4) Heizung links aktuell: " + getState(vHeiz_L).val + "°C // Heizung rechts aktuell: " + getState(vHeiz_R).val + "°C"); }, 2000); } } on(vHeiz_L, function() { //Heizung links geändert setTimeout(function() { weiter1() }, 2000); }); on(vHeiz_R, function() { //Heizung rechts geändert setTimeout(function() { weiter2() }, 2000); });
-
@georg2608 sagte in 2 Heizkörper synchron steuern:
Mit meiner Idee (rechtes Skript) lande ich in einem Loop
Alternative zum Vorschlag von @Asgothian: Man prüft die Quelle.
-
Vielen Dank erstmal!
Aber egal was ich probiere: ob bestätigte Änderung, das JS oder Ursprung, funktioniert das nur one-way. Also ich kann HK 1 steuern und HK 2 passt sich an.
Wie sollte das Skript denn aussehen, wenn dasa zusätzlich auch andersrum funktionieren soll?
Sobald ich das deaktivierte Skript laufen lasse, bin ich wieder in einem Loop: -
@georg2608 sagte: Wie sollte das Skript denn aussehen, wenn dasa zusätzlich auch andersrum funktionieren soll?
Du vergleichst mit dem falschen Ausdruck (Sollwert ist nicht der Ursprung). Versuche es mal so:
-
@paul53 hm, also das klappt auch irgendwie nicht. Der erste Block geht. ist aber wieder one-way.
Sobald der 2. Block aktiviert ist und ich am HK 1 stelle komme ich wieder in einen Loop.Würde es evtl Sinn machen per Blockly die Datenpunkte zusammenzufassen und die beiden HK's als Gruppe zu behandeln?
-
@georg2608 sagte: Sobald der 2. Block aktiviert ist und ich am HK 1 stelle komme ich wieder in einen Loop.
Wirklich? Füge mal einen Debug-Log ein:
Kann es sein, dass der Sollwert nach dem Schreiben des neuen Wertes erst wieder auf den alten Wert zurück geht und dann verzögert den neuen Wert bestätigt?
-
@paul53
Bei meinen Tests ist "Name des Scripts" = "undefined".@georg2608
Versuchs mit dem Ursprung. Aber mach das dann auch so wie gezeigt - also der Zeichenfolge "system.adapter.javascript.0" und nicht mit "Wert von xyz" (wie kommt man eigentlich auf sowas? Das Beispiel ist doch eindeutig). -
@codierknecht sagte: Bei meinen Tests ist "Name des Scripts" = "undefined".
Du meinst den Kommentar, wenn der Ursprung nicht ein Skript ist. In dem Fall wird "steuere" ausgeführt. Wenn der Ursprung das Skript ist, enthält der Kommentar den Skriptnamen.
-
@paul53 Ich hab das mal nach Deiner Vorlage nachgebaut. Aber es kommen immer wieder Dauermeldungen und der Loop
-
@codierknecht hm, selbst bei der Angabe: "system.adapter.javascript" kommt der Loop. Sorry, für mich ist das nicht wirklich eindeutig, warum der da so reagiert.
-
@georg2608
Der Text für den Debug-Block für HK2 sollte auch "HK2" lauten.
So kann man das nicht auseinanderhalten. -
@georg2608
Ändere es mal mit Deaktivierung von "steuern" im unteren Tigger, um die Loop zu vermeiden und korrigiere den String "javascript": -
@paul53
Also so bekomme ich keinen Loop mehr und wenn ich HK 1 steuere passt sich HK 2 an. Nur beim ändern von HK 2 ändert sich an HK 1 nichts (Screenshot mit Ausgabe)
Der 2. Screenshot ist die Ausgabe wenn ich HK 1 stelle.
-
@georg2608 sagte: Ausgabe wenn ich HK 1 stelle.
Wie vermutet: Bevor der neue Wert (24) bestätigt wird, wird der alte Wert (26) gesendet. Das führt zur Loop.
-
@paul53 Okay verstanden. Aber wie kann ich das umgehen?
Macht es Sinn einen timeout einzu bauen? -
Ich werf mal das „Binde“ Objekt in den Raum.
Kannst du da nicht einfach beide Objekte miteinander verbinden?
Also du brauchst das Binde Objekt zweimal untereinander.Einmal HK1 -> HK2 und einmal HK2 -> HK1
Und den Haken bei „nur Änderungen“ setzen.
Klappt das ohne einen Loop zu erzeugen? -
@black-falcon87 sagte in 2 Heizkörper synchron steuern:
Ich werf mal das „Binde“ Objekt in den Raum.
Das macht unter der Haube auch nix anders.
on({ id: 'Object ID 1', change: 'ne' }, (obj) => { setState('Object ID 2', obj.state.val); });
-
@georg2608 sagte: Macht es Sinn einen timeout einzu bauen?
Ein so hässliches Verhalten (bedanke dich in China) kann man per Timer-Sperre überbrücken.
-
@paul53 Ich bedanke mich da lieber bei Dir!
Ich glaub jetzt funktioniert das richtig gut.Vielen lieben Dank