NEWS
2 Heizkörper synchron steuern
-
@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
-
Hallo zusammen,
bisher hab ich als Mitleser oft hilfreiche Posts gesehen und nach und nach meine Ideen umsetzen können und auftretende Probleme mit etwas Recherche ganz gut lösen können. Jetzt bin ich auf aber auf ein Verhalten gestoßen, bei dem ich eure Unterstützung bräuchte.Es ähnelt sehr dem Anliegen wie hier zwei Status gleich halten zu wollen. Anstatt die Temperatur zweier Thermostate möchte ich den Schaltstatus eines Status aus Homematic und den Schaltstatus eines Shelly bidirektional verknüpfen. Sowie sich z. B. der Zustand des Shelly ändert, soll sich der in der Homematic identisch geändert werden. Und andersrum. Bisher hat es mit den beigefügten Skripts super geklappt, es gab keine Schleifen. Anfang der Woche ist es mir bei einer anderen Kombination zum ersten Mal aufgefallen und heute bei dem aktuellen Beispiel.
Normal würde ich es erstmal eine Zeit beobachten und "draufrum denken", habe diesmal aber etwas Bedenken, da die Shelly vermutlich das viele schnelle Schalten nicht auf Dauer toll finden.
Hier mal beide Skripte (ich wusste lange nicht, dass auch beide in eins können):
Und hier ein Auszug aus dem Log:
Könnte hier der Vorschlag mit der Pause ebenfalls funktionieren und habt ihr eine Idee, wie ich es reproduzieren kann? Es tritt (leider) nicht bei jeder Änderung auf. Dankeschön