Durchlauf eines Skriptes nach Änderung der Variable

Hallo Leute,

ich bin etwas verwundert…

Folgender „Testaufbau“:

  • Eine Variable „Test“, Typ Boolean
  • Erstes Skript ist in der Variablen als auszuführendes Skript hinterlegt
Echo $_IPS['VALUE'];
IPS_LogMessage("Test", "Programmdurchlauf: ".time());
  • Zweites Skript zum Verändern der Variablen
SetValueBoolean(42241 /*[Test\Test]*/, false);

Wenn ich das zweite Skript starte, dann wird jedesmal die letzte Zeit der Veränderung der Variabelen in der Konsole dokumentiert. Bei einem Statuswechsel zusätzlich auch im Meldungsfenster.
Das (für mich) verwunderliche:
Die letzte Durchlaufzeit für das erste Skript (was ja als Skript an der Variablen „hängt“) ändert sich nicht in der Konsole, es erscheinen keine Meldungen dazu im Meldungsfenster - es ist, als ob das Skript nicht durchlaufen wird…:confused:

An anderer Stelle hatte ich die Wahrnehmung, dass das Skript auf jeden Fall durchlaufen wird - egal ob eine Statusänderung stattfindet oder nicht…

Wie sollte es korrekt sein?

  • Sollte das Skript was an der Variablen „hängt“ auf jeden Fall durchlaufen werden?
  • Oder nur bei Statusänderung (true -> false oder eben false ->true)?

Joachim

Moin!

Du schreibst das ganz schön „umständlich“ :smiley: Schwer durchzublicken was du vor hast und wo das Problem ist :slight_smile:

Angenommen du hast ein Skript und eine Bool-Variable. Wenn du möchtest, dass bei Variablenänderung etwas ins Log geschrieben wird, dann legst du zu dem Skript ein Ereignis an, welches auf Variablenänderung (nicht Aktualisierung) getriggert wird. Ändert sich die Variable, dann wird das Skript ausgeführt und etwas ins Log geschrieben.

Und wo ist jetzt der Teil der bei dir „falsch“ ist oder den du nicht verstehst?

Grüße,
Chris

Hallo Chris,

meine Erwartungshaltung war folgende:
Wenn die Boolean-Variable von einem Skript auf true oder false gesetzt wird, dann wird das „angehängte“ Skript durchlaufen, dieses würde ins Log etwas schreiben. Außerdem müsste m.E. der Zeitpunkt des letzten Skriptaufrufs dann genau der Zeit entsprechen, wann die Boolean-Variable per Skript gesetzt wurde…

Tatsächlich wird zwar der Zeitstempel bei der Boolean-Variable aktualisiert, nicht jedoch bei dem „angehängten“ Skript. Es ist auch im Meldungsfenster nicht der eigentlich erwartete Eintrag zu sehen…so als würde das Skript gar nicht durchlaufen werden…

Joachim

Poste doch mal den ein oder anderen Screenshot. Dann kann man sich besser vorstellen wie wo was du meinst :slight_smile:

Wenn ein Skript ausgeführt wird, dann wird auch die Zeit in der IPS-Console aktualisiert. Wenn in dem Skript ein „IPS_LogMessage“ steht, dann sind diese Zeiten auch ziemlich identisch. Vielleicht nicht auf die Microsekunde, aber auf 1-2 Sekunden genau sollte es passen.

Wird die Variable NUR über das Skript auf true/false gesetzt, dann muss das Skript auch den neuen Zeitstempel bekommen. Ist das nicht so, dann wird die Variable nicht über das Skript, sondern über etwas anderes geändert!

Ist das bei dir anders, dann läuft da irgendwas anders bei dir und nicht wie du es beschreibst. Da könnten die erwähnten Screenshots helfen :slight_smile:

Grüße,
Chris

Was soll das sein ?
Es gibt keine angehängten Scripte an einer Variable.
Nur Ereignisse oder ein Aktions-Skript.
Und ein Ereignis ist nicht mit einer Aktion gleichzusetzen.
Michael

Hallo Chris,

  • ich habe eine Boolean-Variable angelegt
  • unter „Eigene Aktion“ auf folgendes Skript verwiesen
IPS_LogMessage("Test", "Programmdurchlauf: ".time());

Erwartunghaltung: Wird der Zustand der Variablen verändert erscheint im Log der Text aus IPS_LogMessage.

Joachim

Faaalsch :stuck_out_tongue:

Wenn du ein Skript bei „Eigene Aktion“ einträgst, dann reagiert dieses nicht auf Änderungen der Variable! Dazu brauchst du ein Event/Ereignis im/am Skript, welches auf Variablenänderung reagiert!
Aktuell wird das Skript nur ausgeführt, wenn du die Variable über das WebFront bedienst :wink:

Grüße,
Chris

…so einfach kann das sein!:slight_smile:

Manchmal…tja, was soll ich jetzt noch sagen?:rolleyes:

Danke!

Joachim

Deshalb sollte man immer alle relevanten Informationen im 1. Post verpacken, dann könnte man noch schneller zum Ergebnis kommen :wink:

Aber da es jetzt klappt, ist ja alles gut :slight_smile:

Grüße,
Chris

…naja, eigentlich hängen ich noch mit dem grundsätzlichen Problem…:mad:

Eine Boolean-Variable (A) muss zwei Dinge repräsentieren:

  1. es soll eine Aktion erfolgen in einer gewissen Abhängigkeit wenn A per Skript verändert wird

  2. sie soll synchron zu einer anderen Boolean-Variable (B) gehalten werden

  3. ist allein nicht das Problem (Ereignis-Skript wenn die Boolean sich verändert)

  4. ist allein nicht das Problem (Ereignis-Skript wenn die „synchrone“-Variable (B) sich verändert -> Setze A = B))

aber:
Wenn ich beides zusammen versuche, dann führt 2. immer dazu, dass 1. auch mit ausgelöst wird (weil sich A ja ändert)…

Wie unterscheide ich, dass es die „gewollten“ Änderung der Boolean-Variable ist?

Ich habe hier schon diverse Dinge probiert, aber ich bekomme es einfach nicht hin…:mad:

Joachim

2 Ereignisse mit Variablenänderung zu Variable1 und Variable2.

Im Skript, das durch die Ereignisse ausgelöst wird, dann unterscheiden mit „if ($_IPS[‚EVENT‘] == $Event1ID)“ und "„if ($_IPS[‚EVENT‘] == $Event2ID)“. Jeweilige Aktion im Skript eintragen, also SetValue oder IPS_LogMessage und voila :slight_smile:

Grüße,
Chris

Hallo Chris,

das war auch eine meiner Ideen, aber:

  • Event 1 (weil sich B verändert hat) tritt ein, durchläuft „ihren Teil“ des Skriptes und verändert die Variable A
  • Event 2 tritt ein (weil die Variable A ja verändert wurde) durchläuft „ihren Teil“ des Skriptes und führt die Aktion aus…

Ich habe auch schon versucht Event 2 temporär auszuschalten während Event 1 eintritt - ohne Erfolg…

Joachim

Nein :smiley:

Ich weiß nicht wie ich es anders beschreiben soll. Wenn du das vor hast was ich denke verstanden zu haben, dann funktioniert das so. Oder du meinst etwas anderes und wir reden aneinander vorbei…

Mach doch mal einen Testaufbau, verskripte das, leg die Events an, teste und wenn du dann noch Probleme hast > Screenshot machen + Skript posten.

Grüße,
Chris

Vielleicht erstmal die Frage des warum ?
Was ist das eigentliche Ziel ?
Woher kommt Variable b ?
Eventuell gibt es ja einen ‚ganz‘ anderen oder einfacherern Weg.
Michael

Hallo Chris und Michael,

Okay, ich versuche es mal.
Ich nutze zum Schalten der Beleuchtung eine LOGO die ich quasi in allen Räumen als „Stromstossschalter“ programmiert habe. Das heißt meine IPS-Schalter (sowie die pysischen Taster) lösen einen Tastvorgang aus, der Zustand der Variablen wird erst durch den zurückgemeldeten Status der LOGO gesetzt.

Das heißt, Bedienung im Webfront führt das Skript aus, dass den Zustand eigentlich nur toggelt, die Rückmeldung der LOGO setzt dann den Webfront-Schalter auf den korrekten Wert.

Nun benötige ich eine Boolean-Variable, die beides in einem ist - aber in einem definierten Zustand, d.h. das Schaltskript darf nur ausgeführt werden, wenn der Zustand sich ändern soll.

Das heißt:
Setze die Variable A auf true - Licht muss angehen oder an bleiben (nicht mehr toggeln!)
Setze die Variable A auf false - Licht muss ausgehen oder aus bleiben
Variable B repräsentiert den aktuellen Zustand (aus der LOGO)

Soweit ist das kein Problem, wenn es nur diesen Weg geben würde wäre A und B immer synchron…

Nun soll der der Variable A auf true oder false setzt die Rückmeldung bzw. den aktuellen Zustand wissen, dass kann aber nur vereingt werden, wenn es bei Änderung von B (also z.B. aus dem Webfront) A = B gesetzt wird.

…und da führt es zu Problemen:
Beispiel: B ist true und wird per Webfront auf false gesetzt

  • das Ereignisskript setzt A auf denn Zustand von B also auf False
  • jetzt tritt das Ereignis „A wird verändert“ ein und …

Ihr habt recht - müsste funktionieren!

Cut…

Ja, habe es jetzt noch einmal mit der Variante erstellt - und jetzt scheint alles so wie gewünscht zu funtionieren!!!:):slight_smile:

Danke!!

Joachim

Mühsam ernährt sich das Eichhörnchen (und der Joachim) :smiley: Zum Glück hast du es noch hinbekommen, dein Beitrag war wieder nicht einfach (für mich) zu verstehen :smiley: Und Michael ist aktuell eh nicht auf der Höhe, also könnte er unten auf meinem Level sein und versteht es am Ende auch nicht :smiley: :wink:

Grüße,
Chris

Also eigentlich ist der Weg falsch…da ich aber keine Logo habe und die Anbindung nicht kenne, kann ich es nur rudimentär erklären wie ich es gemacht hätte.

Wenn Variable B immer den aktuellen Status der Logo abbildet, warum nicht einfach dort ein Aktions-Skript hinterlegen, wo nur der Schaltbefehl enthalten ist (ohne SetValue auf die eigene Variable).
Wenn der Schaltbefehl ausgeführt wurde, meldet die Logo ja den Zustand zurück an die Variable B.
Also wozu überhaupt A erstellen und Ereignisse ?
Oder habe ich jetzt eine Anforderung übersehen ?
Michael

Hallo Michael,

viele Wege führen bekanntlich nach Rom. Deiner ist sicherlich auch eine Möglichkeit. Ich werde das in der Tat mal näher beleuchten, wenn es das Skript und die „Verwebung“ etwas einfacher macht, dann werde ich umschwenken.
Derzeit bin ich ja gerade dabei den besten Weg zu eruieren. Wahrscheinlich wird Dein Vorschlag aber so nicht umsetzbar sein, weil die Zustandsvariable der LOGO ja nicht per Skript schaltbar ist („Nur-Lesen“) ich aber als Anknüpfungspunkt eine eben solche Variable brauche.

Alternativ gäbe es über die LOGO eben auch die Möglichkeit, nicht den Trigger-Eingang des simulierten Stromstossschalters (ähnlich einem Flip-Flop mit Trigger, Setzen und Rücksetzen) zu verwenden, sondern einen Setz bzw. Rücksetzeingang zu verwenden. Diesen verwende ich derzeit aber in einer Art, die es ermöglicht alle Beleuchtung mit einem Befehl definiert aus- bzw. einzuschalten.

Die physischen Taster im Haus laufen quasi auf den Trigger-Eingang, weil mit ihnen nur jeweils eine Zustandsänderung erfolgen soll. IPS ist derzeit ähnlich angebunden. Soll der Schaltzustand verändert werden, dann wird ähnlich des physischen Tasters für 20ms ein Signal auf den Trigger gegeben, auch dieses führt dann eben zu einer Zustandsänderung.

Mit der neunen Möglichkeit der Steuerung (siehe Siri-Homebridge) benötige ich jedoch den definierten Zustand, da ansonsten jeder Sprachbefehl zu einer Änderung führt (zweimal hintereinander „Schalte das Licht an“ führt dann zwei Schaltvorgänge aus - und dann steht man im Zweifelsfall wieder im Dunkeln). Gleichzeitig wird die Variable eben auch benötigt den aktuellen Zustand zu ermitteln (wäre einfacher wenn Zustandsvariable und Schaltvariable/Skript getrennt wäre).

Aber so ist das ja, wir wachsen mit unseren Aufgaben!:slight_smile:

Dank der Diskussion und Unterstützung hier im Forum findet man dann eben auch oft eine bessere Lösung - und so soll es ja dann auch sein.

Joachim

Wenn die Homebridge-Anbindung nur Variablen schalten kann und keine Möglichkeit hat Schaltbefehle an die Hardware zu senden; ist diese ‚Anbindung‘ schrott :wink:
Weil es so gar nicht der IPS-Philosophie entspricht, dass das ändern einer Variable eine Aktion zur Hardware auslöst.

Und genau das müßte die Homebridge-Anbindung auch machen.

Es ist ja immer so, das du nie Statusvariablen direkt beschreiben darfst, weil es ja auch keine Aktion in Richtung Hardware auslöst.
Statusvariablen bilden immer nur den Wert der Hardware ab. Und wenn diese sich Ändern soll, muss man die Aktion in Richtung Hardware z.B. per Script auslösen (oder bei dir auch einen Taster drücken).
Und wenn Statusvariabalen schaltbar sind per Webfront, macht IPS ja auch nicht anderes als den Befehl an die Hardware zu senden.
So kannst du das jederzeit auch mit deiner Statusvariabale der LOGO machen.
Als ‚Eigene Aktion‘ ein Script hinterlegen welches die Aktion in Richtung LOGO auslöst.

Damit kannst du zumindest schon aus dem Webfront direkt den aktuellen Status sehen und auch steuern.

IPSView sollte damit sogar direkt klarkommen.
Die Homebridge-Anbindung… keine Ahnung. Wenn sie gut ist, löst sie auch die ‚Eigene Aktion‘ aus und alles ist gut :slight_smile:

Michael