NEWS
[Gelöst] VIS Homematic Dimmer per Checkbox an/aus schalten
-
Hallo nachdem ich mit Hilfe dieses super Forums und des Homematic Forums mein System soweit zum laufen bekommen habe, bin ich jetzt an einem Punkt angekommen wo ich doch mal etwas direkt Fragen muss.
Ich habe einen (bzw. mehrere) Homematic Dimmer die ich über VIS mit einer Checkbox nur ein und ausschalten möchte (0% und 100%), die Dimmstufe wird über die anderen Kanele Zeit gesteuert gesetzt. Über einen Dialog soll (etwas versteckt) auch die Dimmstufe geändert werden aber das ist erst mal nicht das Thema.
Da ich es über die Checkbox direkt nicht hinbekommen habe, habe ich mir 2 Variablen angelegt und es über JavaScript gelöst. Jetzt frage ich mich allerdings ob es wirklich nicht einfacher geht. Es funktioniert zwar aber ich finde es ist schon sehr umständlich und viel Code um nur eine Lampe an und aus zu schalten. Da gibt es doch bestimmt einen besseren Weg?! Ich hatte gehofft, dass ich der Checkbox einen Wert für on und off mitgeben kann. Also bei "false" 0 und bei "true" 100, habe ich da eventuell etwas übersehen?
on("javascript.0.Homematic.KellerlichtDimmer", function(obj) { if(!getState("javascript.0.Homematic.KellerlichtDimmerManuell").val) { var val = getState("javascript.0.Homematic.KellerlichtDimmer").val; if(val) { setState("hm-rpc.0.OEQ0076563.1.LEVEL", 100); } else { setState("hm-rpc.0.OEQ0076563.1.LEVEL", 0); } } }); on("hm-rpc.0.OEQ0076563.1.LEVEL", function(obj) { var val = getState("hm-rpc.0.OEQ0076563.1.LEVEL").val; setState("javascript.0.Homematic.KellerlichtDimmerManuell", true); if(val > 0) { setState("javascript.0.Homematic.KellerlichtDimmer", true); } else { setState("javascript.0.Homematic.KellerlichtDimmer", false); } setState("javascript.0.Homematic.KellerlichtDimmerManuell", false); });
Über die Checkbox wird die Variable "javascript.0.Homematic.KellerlichtDimmer" auf true und false gesetzt.
Gruß
Martin
-
Ich habe grad mal probiert. Es gibt drei Checkboxen, die zwei, wo man nur den Haken rein und raus macht funktionieren nicht, weil als Wert 0 und 1 mitgegeben wird. Die Checkbox, die wie ein Schiebeschalter aussieht lässt sich dahingehend konfigurieren, dass als Werte 0 und 100 mitgegeben werden, damit kann man den Datenpunkt "Level" der HM-Dimmer direkt an- und ausschalten.
Enrico
-
Ich hab das Ganze mal etwas optimiert.
Bei dem on-Trigger kriegt man nämlich ein Objekt mit, daß schon den state in sich hat.
Somit ist eine erneue Abfrage mittels getState nicht nötig.
Da mit dem "KellerlichtDimmerManuell" ist mir jedoch noch nicht ganz klar,
deswegen habe ich das hier erstmal weg gelassen.
on("javascript.0.Homematic.KellerlichtDimmer", function(obj) { // setzt den Level auf 100 oder 0, je nachdem ob AN oder AUS gesetz wurde setState("hm-rpc.0.OEQ0076563.1.LEVEL", (obj.state.val ? 100 : 0)); }); on("hm-rpc.0.OEQ0076563.1.LEVEL", function(obj) { // settzt Wert von KellerlichtDimmer auf true, wenn Wert > 0, somsz false setState("javascript.0.Homematic.KellerlichtDimmer", (obj.state.val > 0)); });
Über Endlosschleifen brauch man sich keine Sorgen machen, da der erste Trigger
höchstens den 2 on-Befhle triggert, aber dann nicht wieder den ersten triggern
kann, da sich nichts geändert hat.
Siehe auch:
-
Danke für die hilfreichen und schnellen Antworten. Leider werde ich erst heute Abend zum ausprobieren kommen.
Das es mehrere verschiedene Checkboxen gibt ist mir nicht aufgefallen. Aber ich befürchte, dass es damit auch nicht so funktionieren wird wie ich es gerne hätte. Damit kann ich dann zwar das Level per VIS auf 0 und 100 setzen aber was zeigt die Box dann bei einem Level von z.B. 20% an? Aber wie gesagt, ich werde es heute Abend testen und berichten.
Danke für den Hinweis, dass in dem Object des Triggers schon der Wert steht und mit dem ?:-Operator sieht der Code jetzt auch gar nicht mehr so schlimm aus, gerade in diesem Bereich sollte ich den öfter verwenden.
Aber um das "KellerlichtDimmerManuell" werde ich nicht herumkommen. Da geht es nicht um Endlosschleifen. Wenn ich diese Abfrage nicht drin habe und das Level z.B. auf 20% gesetzt wird, würde der Trigger doch die Variable "KellerlichtDimmer" auf true setzen und damit würde der andere Trigger das Level auf 100% setzen. Aber auch das werde ich heute Abend noch mal genauer testen und das Script entsprechend anpassen.
Gruß
Martin
-
Dann paßt das Skript immer noch:
Der "on"-Trigger, nur mit der ID, greift nur, wenn die Werte unterschiedlich sind.
Also egal wie man am Level zwischen 1 und 100 dreht, wird der Trigger nicht beim KellerlichtDimmer nicht ausgeführt,
da ein Wechsel von "true" auf "true" keine Änderung ist.
Man kann das noch verfeinern mit:
on("javascript.0.Homematic.KellerlichtDimmer", function(obj) { // setzt den Level auf 100 oder 0, je nachdem ob AN oder AUS gesetz wurde setState("hm-rpc.0.OEQ0076563.1.LEVEL", (obj.state.val ? 100 : 0)); }); on("hm-rpc.0.OEQ0076563.1.LEVEL", function(obj) { // setzt Wert von KellerlichtDimmer auf true, wenn Wert > 0, somsz false var newVal = (obj.state.val > 100); if (newVal != getState("javascript.0.Homematic.KellerlichtDimmer").val) { setState("javascript.0.Homematic.KellerlichtDimmer", newVal); } });
Bedeutet:
Vom Dimmer aus wird der status "KellerlichtDimmer" nur auf true gesetzt,
wenn der Level von 0 nach >0 welchselt. Oder eben andersrum.
In VIS macht sich das dann durch eine Änderung der Checkbox bemerkbar.
Wenn man nun in VIS die Checkbox ändert, dann wird der Dimmer
entweder an- oder ausgeschaltet.
Also doch nochmal die Beschreibung des ON-Triggers durchlesen …
-
Sorry, bin erst jetzt zum ausprobieren gekommen.
Die Checkbox bei der man den On und Off Wert angeben kann funktioniert nicht. Wenn das Level auf 50% ist, ist diese auf dem Zustand aus. Ist ja auch ein nicht definierter Zustand und somit ok. Aber für meinen Fall leider nicht richtig.
Den State "…Manuell" brauche ich. Habe es jetzt ohne getestet und es ging nicht. Wenn ich über die Homematic WebUI den Dimmer auf 50% stelle, springt der Trigger auf Level an und stellt den State "KellerlichtDimmer" auf true. Damit legt der Trigger auf KellerlichtDimmer los und stellt das Level auf 100%, so wie es aus meiner Sicht auch zu erwarten war und richtig ist. Dieses verhalten habe ich mit dem "...Manuell verhindert".
In den Skripten war noch ein Problem, wenn ich über die Checkbox das Licht auf aus geschaltet hatte, ist die Checkbox erst auf aus, dann auf an und dann wieder auf aus gesprungen. Dieses liegt wohl an dem HM Dimmer Einstellungen. Sobald ich aus schalte startet der Trigger auf Level mit dem aktuellen Wert - 0,5 und dieser hatte bisher den State wieder auf true geschalten irgendwann kommt der Trigger dann mit Level 0 und hatte den State wieder auf false gestellt. Funktion war richtig aber es war auf der Oberfläche nicht schön, dieses habe ich jetzt auch noch angepasst. Anbei mein Script so wie ich es für mich jetzt funktioniert.
Danke noch für eure Hilfe!
on("javascript.0.Homematic.KellerlichtDimmer", function(obj) { if(!getState("javascript.0.Homematic.KellerlichtDimmerManuell").val) { // setzt den Level auf 100 oder 0, je nachdem ob AN oder AUS gesetz wurde setState("hm-rpc.0.OEQ0076563.1.LEVEL", (obj.state.val ? 100 : 0)); } }); on("hm-rpc.0.OEQ0076563.1.LEVEL", function(obj) { //Wenn der Dimmer per VIS ausgeschalten wird, wird der Trigger erst mit xy,5% ausgeführt und dann mit 0% //damit die Checkbox nicht aus/an und wieder aus geht, wird hier xy,5% ignoriert if(obj.state.val % 1 == 0.5) return; var newVal = (obj.state.val > 0); if (newVal != getState("javascript.0.Homematic.KellerlichtDimmer").val) { setState("javascript.0.Homematic.KellerlichtDimmerManuell", true); setState("javascript.0.Homematic.KellerlichtDimmer", newVal); setState("javascript.0.Homematic.KellerlichtDimmerManuell", false); } });