Hi, ich möchte gerne, dass ein Skript durch verschiedene Variablen aufgerufen wird, ohne dass ich für jeden Auslöser zusätzliche Ereignisse erstellen muss. Ist sowas überhaupt möglich?
Da die Variablen Rollo links/rechts von Modulen kommen und eine Standardaktion haben, kann ich ja den Aufruf des Skriptes nicht hier erstellen. Wird daher nur so wie oben gehen?
Oder könnte man ein Skript immer aufrufen wenn sich z.B. innerhalt einer Kategorie etwas ändert und dann abhängig davon welche Variable sich geändert hat innerhalb des Skriptes verzweigen?
Auch nein.
Auslösende Ereignisse sind immer an eine Variable gebunden.
Es gibt allerdings Module im Store mit denen das klappen könnte. Wie das Universalereignis.
Was meinst du? Was ist hier dein Ziel?
Selbstverständlich kannst du auch bei Statusvariablen ein eigenes Aktionsskript hinterlegen (also über eigene Aktion die Standardaktion überschreiben).
Michael
Ich möchte aber gerne die Standardaktion und mein Skript auslösen. Aber du bringst mich da auf eine sehr naheliegende Idee! Das könnte ich natürlich machen in dem ich statt der Standardaktion das Skript hier ausführe:
Das meine ich aber nicht, sondern wirklich das Endergebnis was du erreichen willst und nicht teile vom Weg.
Vorsicht, die erste Zeile für zu einer Endlosschleife!
Weil die Aktion ist dieses Skript, was du mit RequestAction ja wieder und wieder startest.
Wolltest du eventuell SetValue benutzen?
Michael
Okay. Also ich habe in einem Raum 2 Rollos, die ich über TaHoma eingebunden habe. Nun habe ich mir zusätzlich eine Dummy Instanz angelegt mit der ich auch beide Rollos zusammen fahren kann. Jetzt hat mir aber nicht gefallen, dass sich der Value von Rollo Alle nicht ändert, wenn die Rollos einzeln gefahren werden. Daher möchte ich bei einer Änderung von Position Rollo links/rechts ein Skript aufrufen, welches mir den Mittelwert der beiden Rollos berechnet und diesen dann mit SetValue() an die Variable Rollo Alle übergibt. Aktuell rufe ich das Skript mit 2 Ereignissen auf und nun war die Überlegung, ob ich es nicht direkt durch die Aktion der einzel-Rollos aufrufen kann.
Das dachte ich ja auch, aber @Nall-chan meinte ja, dass ich dann eine Endlosschleife bekomme. Womit er vermutlich auch recht haben wird.
Aber wenn das alles zu komplex wird, dann lasse ich es einfach beim Aufruf durch die 2 Ereignisse. Ich habe den Use-Case halt insgesamt 4 mal und dachte rein über Skripte wäre es etwas eleganter zu lösen. Aber muss auch nicht.
Mit ereignissen ist der Standardweg. Du willst aber nur die Rückmeldung anpassen (also SetValue), dabei rufst du doch garkein RequestAction auf und das kannst du gefahrlos auch ohne Rückkopplung tun.
Und zu meiner vorherigen Nachricht: Bitte mal GENAU lesen, wie die Funktion heißt.
IPS_RequestAction ist eine andere Funktionen. Die brauchst du, wie @tobiasr schon schrieb, wenn du bei einer Statusvariable eine eigene Aktion definiert hast, aber nicht diese (mit RequestAction) sondern die originale Standardaktion (der Instanz) aufrufen willst.
Wenn du einfach zwei zusammenfassen willst, probier doch mal das Blind Modul von @bumaas aus.
Michael
Edit:
Ja, aber warum, wenn die erste Zeile RequestAction eh überflüssig ist.
Edit2:
Werden sie jemals einzeln gefahren? Sonst hätte ich nur eine in der Visu verlinkt und die zweite wird über das Aktionsskript der ersten mit gefahren.
Also so in der Richtung:
IPS_RequestAction(12345, Ident der Statusvariable, $_IPS['VALUE']); // Instanz links
IPS_RequestAction(54321, Ident der Statusvariable, $_IPS['VALUE']); // Instanz rechts
Du erstellst dir ein Skript , dass du für alle Variablen als Aktionsskript angibst. Dort setzt zu zunächst den Wert der Variablen, wie im Standardaktionsskript.
Dann setzt zu den deine Variable in Abhängigkeit von den betätigten Rollos:
SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
switch ($_IPS['VARIABLE']){
case <idRolloA1>:
case <idRolloA2>:
$mittelwert = ....;
SetValue (idGruppeA, $mittelwert);
break;
case <idRolloB1>:
case <idRolloB2>:
$mittelwert = ....;
SetValue (idGruppeB, $mittelwert);
break;
default:
echo "falsche ID";
}
Das ist nicht zum Zusammenfassen von Rollläden geeignet
Was mir da aber noch fehlt ist die Ausführung der Standardaktion des einzelnen Rollos, der bedient wurde, denn sonst fährt der ja nicht. Hast du da noch eine Idee? Vermutlich dann durch den Aufruf von IPS_RunAction(). Wobei das ja schon wieder komplexer wird, da ich hier erst mal den passenden Befehl kennen muss. Aber klar, das ginge auch
Ah, das war mir nicht bekannt, dass es auch noch IPS_RequestAction() gibt. Wieder etwas neues gelernt
Aber könnte es sein, dass der Befehl IPS_RunAction() heißt? In der Befehlsreferenz gibt es zumindest kein IPS_RequestAction() und die Suche findet den Befehl auch nicht. Vielleicht machen aber auch beide einfach das selbe.
Zu 95% werden sie wohl zusammen gefahren. Aber du weißt ja wie es ist, wenn man sich etwas überlegt hat um auch die Sonderfälle anzufangen, dann will man das auch irgendwie umsetzen.
Ok, Planänderung Bei der Statusvariablen belässt du alles so wie es ist, also keine eigene Aktion. Somit kannst du weiterhin einzeln ganz normal den Rollladen bewegen.
Unter deinem Skript erstellst du für jede auslösende Variable ein Event mit Auslösung bei Änderung. Damit wird dann bei jeder Änderung der Rollladenposition das Skript aufgerufen, und deine gemeinsamen Variablen werden nachgeführt.
Ist auch eher speziell. Sollte aber eigentlich dennoch dokumentiert werden. @paresy : oder?