Ereignis bei Variablenänderung soll ein andere Variable aktualisieren

Hallo,
ich habe ein Variable angelegt die im Webfront angezeigt wird.
Dann habe ich ein ausgelöstes Ereignis „bei Variablenänderung“ an einer anderen Variablen gleichen Types angelegt. Auf der 2. Seite des Ereignis Dialogs habe ich unter Aktion „Variable ändern“ eingestellt und als Ziel die Variable welche im Webfront angezeigt wird.

Wenn nun der Wert der Variablen an der das Ereignis hängt geändert wird, passiert nichts mit der „Ziel“ Variablen.
Wenn ich statt Aktion „Variable ändern“ nun Code eingebe und mit SetValue den Wert der „Ziel“ Variable ändere, dann funktioniert es.

Was mache ich falsch, dass die Aktion „Variable ändern“ nicht funktioniert?
Klar kann ich auch immer Code eintippen, aber wenn nun mal die elegante Möglichkeit besteht per Konfiguration den Wert einer Variablen über ein ausgelöstes Ereignis an eine andere Variable weiterzugeben würde ich diesen Weg bevorzugen.

Viele Grüße
SneMi

Wenn du mit ‚an der das Ereignis hängt‘ die Baumansicht in IPS meinst, dann ist zu beachten, dass das Ereignis immer unterhalb des zu steuernden ‚Ziel‘ einsortiert wird.
Änderst (verschiebst) du das Ereignis an eine andere Stelle in den Baum, änderst du das Ziel des Ereignisses, nicht seinen Auslöser.

Michael

Zur Veranschaulichung hab ich mal ein paar Screenshots gemacht.

Hier sieht man zuerst, dass das Ereignis unter der Variablen „Ziel“ hängt. Ändere ich den Wert der Variablen „Quelle“, so sieht man am Zeitstempel, dass das Ereignis aufgerufen wird. Der Wert der Variablen „Ziel“ ändert sich aber nicht.

Hier noch der Konfigurationsdialog des Ereignisses
Seite 1
Dialog_Seite1.JPG

Seite 2
Dialog_Seite2.JPG

Muss ich denn im Code Bereich etwas eingeben? Wenn ja, was? Wenn man hier SetValue() verwenden muss frage ich mich warum bei Aktion „Variable ändern“ steht. Zur Ausführung von Code gibt es ja unter Aktion den Punkt „Code ausführen“.

Wo mache ich hier den Fehler?

Viele Grüße
SneMi

Aktion bezieht sich nur auf die möglichen Arten von Zielen.
Was passiert muss schon bei Code stehen.
Oder eine Vorlage gewählt werden.

Das hier kannst du machen:

IPS_SetValue($_IPS['TARGET'], $_IPS['VALUE']);

Zwischenablage01.png

Aber wozu eigentlich ?

Michael

Also ehrlich gesagt verstehe ich dann nicht wozu es die Aktion „Variable ändern“ überhaupt gibt wenn sie genau das selbe macht wie „Quellcode ausführen“. Wenn sie rein dazu da ist um zu dokumentieren, dass eine Variable geändert wird, dann kann man sich diese Option auch sparen und als Kommentar im Code angeben was gemacht wird.

In der Dokumentation habe ich folgenden Absatz zum Thema Ereignisse gefunden:

…An sonstiges Objekt gebunden (Variable, Medienobjekt, Kategorie…)
Wenn das Ereignis eintritt kann der Wert der Variable direkt geändert oder Quellcode aufgerufen werden.

Also ich interpretiere das so, dass eine Variable geändert werden kann ohne Quellcode zu schreiben.

Aber wozu eigentlich ?

Nun, ich ziehe es generell immer vor Änderungen per Konfiguration zu machen anstelle Code zu schreiben. Dies hat den Vorteil, dass es weniger fehlerträchtig ist. Klar ist die Fehler Möglichkeit bei einem einfachen SetValue() sehr gering :). Trotzdem ist es umständlicher.
Weiterhin lässt sich schneller etwas zusammenklicken als Code zu schreiben. Ich benutzte IP-Symcon schon seit mehreren Jahren, genauer gesagt seit 2009. Ich habe damals weitestgehend alles in IP-Symcon umgesetzt was ich machen wollte. Wenn man dann nach Jahren mal wieder eine Kleinigkeit ändern oder erweitern will muss man die Doku zu Hand nehmen weil man nicht mehr die ganzen Funktionsnamen kennt. So geht es jedenfalls mir.

Aber vielleicht kann sich ja mal der Entwickler dazu äußern wofür es zwei identische Aktionen gibt. Vielleich ist mir der Vorteil einfach noch nicht klar geworden.
SneMi

Variable ändern sagt ja nicht aus wie sie zu ändern ist :wink:
Mit ‚wozu eigentlich‘ meinte ich was du erreichen willst.
Wirklich nur den Wert von A auch in B haben?
Und darauf bezogen ‚wozu‘ ?
Michael

Genau, ich möchte nur den Variablen Wert von A nach B übertragen. A ist eine Variable die zu einer Instanz eines Homematic Geräts gehört. B ist die Variable, welche zur Visualisierung im Webfront genutzt wird.

SneMi

Dann Lösch diese Variablen und Events und benutze doch einfach Links :wink:
Michael

Links benutzen; genau das will ich nicht. Ich will eine Trennung zwischen Instanz Variable und Visualisierung. :slight_smile:

Es ist nicht so, dass ich es nicht hinbekomme was ich will. Ich möchte einfach nur wissen was es mit der Aktion „Variable ändern“ auf sich hat und wie man die richtig benutzt. ich kann mir einfach nicht vorstellen, dass diese Aktion nur einfach so da ist um zu verwirren, sondern dass sich dahinter etwas verbirg was vielleicht hilfreich ist, wenn man weiß wie man es benutzt.

Vielleicht geht man ja mal in der Doku auf das Thema ein.

Fürs erste vielen Dank. Ich werde dann mal weiter Code schreiben :slight_smile:

SneMi

Ich versteh trotzdem noch nicht was Du genau willst? Insofern ich das richtig verstanden habe willst Du doch einfach in der Visualisierung den aktuellen Status angezeigt bekommen dafür sind Links da.

In der Regel benutzt man das im Zusammenhang mit einem Skript das bei Variablenaktualisierung getriggert wird und dann etwas bestimmtes ausführt. Beispiel es Klingelt dann schreibst Du Dir ein Skript das dann etwas machen soll. Das Skript läst Du ausführen bei Variablenaktualisierung der Klingel Variable. In dem Skript kannst Du jetzt z.B. die Tageszeit prüfen, prüfen ob Du überhaupt zu Hause bist und ähnliches und dann davon abhängig eine Aktion ausführen. Wenn es Dunkel ist zum Beispiel Licht einschalten oder wenn Du nicht zu Hause bist Dir einen Email schicken. Was genau passiert legt in dem Fall der Inhalt des Skripts fest bei Variablenaktualisierung ist nur der Trigger für das Ausführen des Skripts.

Ich versteh trotzdem noch nicht was Du genau willst? Insofern ich das richtig verstanden habe willst Du doch einfach in der Visualisierung den aktuellen Status angezeigt bekommen dafür sind Links da.

Also: In der Visualisierung möchte ich Variablen Profile und Aktions Skirpts verwenden und die möchte ich nicht mit den Instanz Variablen mischen. Deshalb: keine Links. Man ist wesentlich flexibler wenn man für die Visualisierung eigene Variablen mit Variablenprofil und Aktion Skripts verwendet. Denkbar ist z.B.: dass man verschiedene Webfronts nutzt und dann wiederum mit verschiedenen Variablen arbeitet. das geht mit der Link Lösung nicht.

Generell, wie ich bereit weiter oben geschrieben habe, ist es ein guter Stil wenn man Visualisierung und Daten trennt. Hierzu gibt es Konzepte wie beispielsweise „Modell View Controller“. Siehe Wikipedia Artikel: https://de.wikipedia.org/wiki/Model_View_Controller

Aber ich will das Thema gar nicht weiter vertiefen. Die bisherige Diskussion geht an meiner Frage vorbei.
Nochmal: Ich habe eine Lösung für mein Problem. Mich interessiert nur was es mit der Aktion „Variable ändern“ auf sich hat. Ich denke das kann wirklich nur der beantworten, der diese Funktionalität implementiert hat.. :slight_smile:

Trotzdem vielen Dank, dass Du mir weiterhelfen wolltest.

SneMi

Du kannst bei „Variable ändern“ beliebigen Code angeben (z.B. SetValue) welcher dann die neue Ziel-Variable ändert. Wenn du keinen Code eingibst, wird halt nichts geändert. Ein leerer Code ändert eben auch nichts. Das ist genau so gewollt.

Deine Theorie mit den Variablen gefällt mir auch nicht. Für MVC an dieser Stelle benötige ich auch sehr viel Phantasie :wink:
Dafür haben wir wie gesagt die Links. Aber du bist ja frei alles so zu machen wie du magst :slight_smile: Das ist das tollen IP-Symcon.

paresy

Hallo Paresy,
erst mal vielen Dank für Deine Antwort. Jetzt habe ich zu dem Thema immer noch zwei Fragen:

  1. Worin besteht denn nun der Unterschied zwischen den beiden Aktionen „Variable ändern“ und „Quellcode ausführen“. Für mich sieht das immer noch so aus als handele es sich um das Selbe.

  2. Hilfreich wäre es auch wenn man eigene Code „Vorlagen“ erstellen könnte. Dann könnte man sich eine Vorlage erstellen die genau das tut, nämlich einen Variablen Wert ändern und käme dann ohne Doku aus.

Wie ich bereits weiter oben beschrieben habe, läuft bei mir IP-Symcon schon seit 2009 und seither habe ich wenig geändert. Aber immer dann wenn ich mal wieder ran muss, nach möglicherweise Jahren, muss ich eben immer die Doku zu rate ziehen. Das ist mit ein Grund weswegen ich in IP-Symcon lieber konfiguriere statt Code zu schreiben.

Noch eins zum Thema MVC:
Ich wollte nur einen Hinweis geben warum man Daten und Darstellung trennt. Für mich sind halt die Instanzen die eigentlichen Automationsobjekte (Daten) :slight_smile: Innerhalb IP-Symcon gibt es für mich sehr wohl auch gute Gründe diese von der Darstellung zu trennen… Ich habe beispielsweise zu Beginn alles in den Instanzen gemacht: Neue Variablen angelegt, bestehende umbenannt, ausgeblendet. Auch Skripte und Ereignisse befinden sich hier. Es ist halt im nachhinein ein schöner Durcheinander geworden und wenn ich dann mal daran was machen muss geht jedes Mal die Analyse los: „Was habe ich mir damals dabei gedacht, wie funktioniert das…“. Deshalb ist für mich eine klare Struktur und Vorgehensweise sinnvoll. Das macht zwar anfangs mehr Arbeit. Später aber spart man ein mehrfaches an Zeit.
Aber wie Du schon geschrieben hast, kann das ja Jeder machen wie er will.

SneMi

  1. Ja. Es ist das selbe. Quellcode ausführen ist komplett Freitext. Bei Variable ändern hast du die paar Beispiele zur Auswahl.
  2. Dafür ist die Doku ja da :slight_smile: Und es freut mich, dass du fündig wirst. Ich gucke auch öfters mal nach - So ganz alles kann man sich ja kaum merken. Vorlagen -> Gute Idee.

paresy

Kleine Bemerkung zum Thema:
Ich hab selbst öfter mal Quellcode ausführen bei den Ereignissen eingesetzt aber ich bin davon abgekommen, weil man den Überblick verliert.
Mittlerweile finde ich es sauberer, wenn mein Ereignis ein Skript aufruft und dort Dinge macht, die sich nicht vor mir verstecken können.

Und ich möchte auf Links nicht verzichten. Ich nutze auch ne klare Trennung. Die original Instanzen fasse ich grundsätzlich nicht an.

Gesendet von iPhone mit Tapatalk