Mehrere Variablen mit Aktion überwachen?

Interessant… Ich habe ein Skript angelegt, welches bei der Änderung der 10 Variablen etwas machen soll. Dann habe ich alle diese 10 Variablen markiert und dann habe ich Objekt-Ändern aufgerufen und dort als Aktion dann das neue Skrip VariableChangeListener für alle 10 Variablen eingetragen

Und das ist dann kein Aktion-Skripte?

Dein Vorschlag wäre also anders… Hinter jede der variablen ein ausgelöstes Ereignis hängen und dann immer dort das Skript aufrufen, in dem man dann vermutlich den Auslöser ermitteln kann?

Das AKTION Script wird ausgelöst, wenn man als BEDIENER über Webfront o.ä. die Variable ändern möchte und schaltet das GERÄT. Wenn sich die Variable ändert (Statusrückmeldung oder durch Benutzerinteraktion) und du möchtest darauf reagieren, benötigst du ein ausgelöstes Ereignis. Sieht bei mir z.B. so aus:

Doch, aber das reagiert nicht auf geänderte Werte einer Variable.
Wie @tobiasr schon schrieb, ist das zum Bedienen einer Variable.
Schau dir bitte die Grundlagen in der Doku dazu an:

Michael

Was soll ich sagen, ich glaube euch ja gerne, aber wenn ich in meinem Popup die Variable A oder B ändere wird definitiv das dahinter gehängte Skript aufgerufen. Auch ohne ausgelöstes Ereignis. es ist ja als Aktion hinter die Variable gehängt.

Was meinst du hier?
In der Konsole? Die fragt sogar ob du nur den Wert setzen (simulieren) oder schalten (Aktion der Variable Ausführen) willst.
Das hat aber alles nix mit auf Änderungen von Werten reagieren zu tun, das können nur ausgelöste Ereignisse.

Michael

Hier missverstehen wir uns.
Ich setze durch die Slider in meinem IPSView-Popup bestimmte Variablen im Objektbaum. Hinter alle Variablen, die fachlich zu einem Zeitintervall gehören (StartMinute, StartStunde, StopMinute, StopStunde) habe ich das gleiche Skript gehängt. Dieses wird bei den Änderungen über IPSView bei jeder Änderung aufgerufen.
Von diesen Zeitintervallen habe ich in der View insgesamt 4 Stück (Szene 01 von/bis, Szene 02 von/bis, Szene03 von/bis und Szene 04 von/bis). Ich habe die Anforderung, dass ich mit dem Beenden des Popups für jede dieser Szenen ein anders Skript aufrufen will, welches mit den geänderten Zeiten, mal die Außenbeleuchtung, mal die Flurbeleuchtung etc. beeinflusst.

Über das einheitliche Skript hinter den Variablen habe ich im ersten Ansatz festgestellt, zu welcher Szene die beeinflussten Variablen gehören und habe dann in einer zentralen Variable die ID des auszuführenden, szenenspezifischen Zielskriptes eingetragen. Dieses wurde dann beim Beenden des Popups aufgerufen , nimmt die vorher geänderten Zeiten und macht damit, was es machen muss.

Mit Hilfe Eurer Hinweise mach ich es nun ganz anders.
Aufruf des Popups über Skript-Button (statt über Popup-Button und Verzicht auf Alias-Ids) und direktes Speichern der Skript-ID des, für die weitere Verarbeitung zuständen Skriptes in einer Variable. Dann Ändern der Zeitvariablen durch das Popup. Beim Beenden des Popups, Aufruf des Skriptes mit der vorher gespeicherten Skript-ID, die dann die manipulierten Variablen nimmt und weiterverarbeitet. Fertig.

Ja, weil es bei dir wirklich um Aktionsskripte geht. Das Thema vom TE war aber auf Änderungen von von Variablen zu reagieren.
Bei dir geht es um das Bedienen von Variablen.
Michael

Jo, so wird ein Schuh draus… Um bei Änderungen von Variablen (z.B. aus KNX) zu reagieren, brauche ich ein Ereignis und um auf Manipulationen durch die View zu reagieren reicht ein Skript.

Moin,

Um mal das thema aufzugreifen…

Für Sammelmeldungen (also Fenster EG geschlossen) habe ich das so gelöst, das ich eine Dummyvariable erstellt, darunter aliasse der Fensterkontakte reingepackt und mir dann Ereignisse erstellt habe. Ist Fummelig, geht mit kopieren/einfügen aber gut und ich sehe es an einer zentralen stelle.



als auslösendes Script steht

IPS_RunScriptEx(25873, array("KL_EventID" => $_IPS['EVENT']));

das Script 25873 liegt an einer anderen Stelle und besitzt folgenden Inhalt

<?php

// Für Fenster und Licht-Sammelvariablen
//$ParentGroup = IPS_GetParent($_IPS['EVENT']);

$ParentGroup = IPS_GetParent($_IPS['KL_EventID']);

foreach(IPS_GetChildrenIDs($ParentGroup) as $item){

    if (IPS_LinkExists($item)){
            $LinkID = IPS_GetLink($item);
			$TargetLinkID = $LinkID['TargetID'];
			$ParentGroupArray[]=(GetValue($TargetLinkID));
    }
}
if (in_array("1",$ParentGroupArray) OR in_array("2",$ParentGroupArray) ) { SetValueBoolean($ParentGroup, true); } else { SetValueBoolean($ParentGroup, false); }

Öffne ich ein Fenster innerhalb der Gruppe schaltet die übergeordnete Variable „Fenster Auf“

Ich nutze das gleiche Script auch um eine Sammelvariable für Licht zu haben (also wenn im EG irgendwo Licht an ist).

Vielleicht hilft dir das weiter

Hallo Kris,
sieht gut aus. Zum Verständnis… Über die Aktions bekommst Du die Änderungen der Kontakte mit. In Deinem Loop referenzierst Du über die Links auf die tatsächlichen Stati. Die Werte „1“ oder „2“ in deinem ParentGroupArray sind vermutlich Konstanten für das Erkennen ob Fenster auf oder Zu, oder Licht an oder aus? Und damit setzt Du dann den Merker, bzw. den Wert der ParentGroup (hier Fenster EG)

Kennst du das Etagenlicht ?
Da geht dann auch das ausschalten aller Lampen einer Gruppe.
Die Zuordnung erfolgt über Namen der Ereignisse und Variablen. Somit braucht es kein separaten Code im Ereignis.
Michael

1 „Gefällt mir“

Schaue ich mir auch mal an… Gute Ideen sind ja , besonders am Anfang Gold wert… Und kein separater Code im Ereignis klingt wie weniger Klicken, was ich persönlich immer gut finde…

Genau. Ich habe in ipsview eine sammelvariable, wenn fenster auf, dann wird die etage angezeigt, ein klick drauf öffnet den flurplan.

Guten Morgen Zusammen,
ich muss noch mal auf das Thema Systemvariablen zurück kommen, weil ich vermutlich wieder etwas versuche, was so nicht geht. Um bei meinem Beispiel zu bleiben. Ich habe 4 zyklische Ereignisse angelegt: Start01, Stop01, Start02, Stop02, deren Schaltzeiten ich über das zentrale Popup konfigurieren kann. Funktioniert einwandfrei.

Nun setze ich in jedem dieser Ereignisse eine gemeinsame Variable DP_SWITCH_ON_OFF entweder auf true (Start01, Start02) oder false (Stop01, Stop02).
An diese Variable habe ich ein ausgelöstes Ereignis gehängt, welches dann über ein Skript (switchKnx) die KNX Kanäle mehrere Außenleuchten setzt. Funktioniert auch einwandfrei, allerdings würde ich gerne in diesem Skript mitbekommen, welches ursprüngliche Ereignis (Start01, Start02, Stop01, Stop02) die Variablenänderung verursacht hat. Das bekomm ich nicht hin.

Ich könnte in den zyklischen Ereignissen direkt das switchKnx-Skript aufrufen und den Auslöser als Parameter mitgeben. Das Aufrufen jeglicher PHP-Codeschnipseln im zyklischen Ereignis widerstrebt mir, weil meiner Meinung nach, damit ein Teil der Logik an dieser Stelle landet und der Rest im eigentlichen Skript. Das setzen einer Variablen hingegen ist losgelöst von jeglicher Logik und die Entscheidung, was die Änderung bedeutet wird woanders entschieden.

Vielleicht hat jemand eine Idee, oder die Info, das das Ermitteln des Auslösers über mehrere Ebenen hinweg so einfach nicht geht.

Warum der Zwischenschritt über die gemeinsame DP_SWITCH_ON_OFF Variable?
Wenn deine vier zyklischen Ereignis direkt das switchKnx-Skript aufrufen, dann hast du in der Systemvariable das Ereignis welches es gestartet hat.
Michael

Ok, aber ich bekomme auf dem einfachen Weg keine sinnvolle Systemvariable raus. So sieht das zyklische Ereignis aus:
image

Laut Doku, sollte ich zumindest Target und Event im Skript auslesen können:
image

Die Indices gibt es aber nicht… und liefern entsprechend nix zurück.

Wenn ich den Aufruf des Skriptes so ändere, das ich das auslösende Event als Parameter manuell übergeben:


Dann kann ich es im Skript verwenden.

Ok, neue Variante … Ich habe das Ereignis nun unter das Skript gehängt, so dass es im Objekt-Baum so aussieht:

Dann ist die Aktion kein IPS_RunScript mehr, sondern nur noch das Ausführen der Automation:
image

Dann kann ich auf $_IPS[‚EVENT‘] zugreifen… Darauf muss man erst mal kommen…

Und schon stellt sich mir die nächste Frage: Wenn ich X Skripte über das Event aufrufen möchte, weil sich später noch eine zusätzliche Aktion ergibt, die bei dem Ereignis ausgelöst werden soll, bekomme ich das so nicht hin. Dann muss ich also ein zentrales Skript sozusagen als Dispatcher verwenden, welches dann die weiteren Skripte aufruft…

Naja… ich sage es mal so, das ist bei den Grundlagen der Ereignisse in der Doku aber beschrieben. :wink:

Wenn du das willst. Ich habe meistens wirklich nur einzelne Ereignis für bestimmte Aufgaben.
Zumal ich meistens keine weiteren Skripte starte, sondern einfach Variablen mit RequestAction schalte. (Siehe auch oben bei dem Link zum Etagenlicht)
Michael

Das sich diese Info hier nicht auf den Aufruf eines PHP-Skriptes mit RunScript bezieht, sondern nur gilt, wenn das Ereignis unter dem Skript hängt… hat sich mir beim Lesen tatsächlich nicht erschlossen :roll_eyes:.

image

Einerseits sollte das Ereignis der LETZTE Schritt sein und könnte direkt die Lampe starten. Wenn du das wirklich nicht willst, wähle die Aktion ‚Starte Automatisierung‘ und wähle das Script aus. Wenn du das Script unmittelbar ÜBER die Events legst (statt bisher die Variable) wird das im Event-Einstelldialog auch prominent angeboten. Ansonsten kann man es aber auch auswählen.

Hallo Tobias,
ja, genau, ich habe jetzt alle zeitgesteuerten Ereignisse unter das „zentrale“ Skript gehängt, welches sich um das Schalten der unterschiedlichen Lampen kümmert. Dort werte ich den Auslöser aus und entscheide damit was tatsächlich passieren soll. Funktioniert einwandfrei.

1 „Gefällt mir“