NEWS
Javascript: Multischalter / Datenpunkt
-
Hallo zusammen
Hab ein Problem
Ich habe 3 Datenpunkte mit welchen ich die Weihnachtsbeleuchtung schalten will. Im VIS will ich auf der Startseite aber nur ein Button (weitere Datenpunkt) haben, welcher wenn noch eine einer der 3 Datenpunkte auf true ist auch auf true ist und wenn alle aus sind auf false.
Wenn ich den Button drücke wenn er noch auf true ist, dann sollen alle 3 Datenpunkte auf false gehen.
Andersrum soll er wenn er auf False ist alle auf true setzen.Auf einer "Unterseite" werden dann alle Lichter einzeln dargestellt.
Ich habe das mal in Javascript versucht umzusetzen, aber wahrscheinlich habe ich irgendwo ein Denkfehler, ich komme immer in eine Endlosschleife:
var Weihnachten = ['hm-rpc.0.000B9BE98C3FC5.4.STATE', 'shelly.0.SHSW-25#C45BBE5F9833#1.Relay0.Switch','shelly.0.SHSW-25#C45BBE5F9833#1.Relay1.Switch']; on(Weihnachten , function (obj) { var lighton = false; Weihnachten.forEach(function(obj) { if (getState(obj).val == true) { lighton = true; } }) setState('javascript.0.Weihnachtsbeleuchtung', lighton); }); // Weichnachtsbeleuchtung einschalten on('javascript.0.Weihnachtsbeleuchtung' , function (obj) { if (obj.state.val == true) { Weihnachten.forEach(function(obj2) { if (getState(obj2).val == false){ setState(obj2, true); console.log(obj2 + " AN"); } }); } if (obj.state.val == false) { Weihnachten.forEach(function(obj2) { if (getState(obj2).val == true){ setState(obj2, false); } console.log(obj2 + " AUS"); }); } });
Jemand eine Idee wie ich das am beste löse?
-
Ohne das Skript im Detail durchgegangen zu sein:
Der mir bekannte normale Weg für diese Aufgabe ist die Nutzung des 'acknowledge'
Man nehme
- Die States A, B, C die die Weihnachtsbeleuchtung steuern
- Den State V der in der Vis angezeigt wird.
Die Vis sollte den State V immer mit 'acknowledge' = false setzen, um damit ein Gerät anzusteuern. Dementsprechend kann der Trigger um die States A,B,C anzusteuern mit "ack=false" verbunden werden.
Die Aktualisierung des States V basierend auf den States A,B,C sollte dementsprechend mit 'acknowledge' auf true passieren. Damit wird der Trigger nicht aktiv und es entsteht keine Schaltschleife.
Zur Frage wie mach ich das mit acknowledge im Trigger siehe hier.
-
@asgothian Vielen Dank.
Bekomme es leider nicht hin. Wenn ich Anfange mit acknowledge zu arbeiten, merkt das VIS nicht mehr, dass sich der Status geändert hat und zeigt mir den Button als aktiv an obwohl er auf false steht. -
@kernal Hmm.. das ist nicht schön.
Dann bleibt dir nur eine Option. Am Trigger auf den Datenpunkt V müsstest du im Trigger auf verifizieren was in
state.val.from
drinsteht. Da ich vis nicht einsetze kann ich Dir nicht sagen was da steht wenn der State über die vis gesetzt wird. Aus einem Skript heraus muss dasystem.adapter.javascript.x
stehen, wobei x die InstanzID (zumeist 0) ist.A.
-
@asgothian Vielen Danke. Bei state.val.from ist immer undefiniert, aber in state.from steht system.web.0 beim vis drin.
So funktioniert es jetzt:
//Weihnachtsbeleuchtung Gruppe var Weihnachten = ['hm-rpc.0.000B9BE98C3FC5.4.STATE', 'shelly.0.SHSW-25#C45BBE5F9833#1.Relay0.Switch','shelly.0.SHSW-25#C45BBE5F9833#1.Relay1.Switch']; on('javascript.0.Weihnachtsbeleuchtung', function(obj) { if (obj.state.from != "system.adapter.javascript.0") { Weihnachten.forEach(function(wobj){ setState(wobj, obj.state.val); }); } }); on(Weihnachten, function(obj) { var lightson = false; setTimeout(function() { Weihnachten.forEach(function(wobj) { if (getState(wobj).val == true) { lightson = true; } }); if (getState('javascript.0.Weihnachtsbeleuchtung').val != lightson) { } }, 2000); });