Skript an mehrere Variablen und Ereignisse hängen

…so viel vor und so wenig Ahnung… :stuck_out_tongue:

Hallo Forum !

Ich habe ein (wirklich!) sehr einfaches Skript geschrieben, welches mir die Änderungszeit einer Variable A in eine andere Variable B schreibt, damit ich sie mir im WebFront anzeigen lassen. Ausgelöst wird dieses Skript durch ein Ereignis, bei Variablenänderung „Variable A“. So weit, so gut.

Nun möchte ich das aber für mehrere Variablen haben - so um die 20 - und habe nur wenig Lust, das für jede Einzelne händisch zu machen. Daher dachte ich mir: Für sowas gibt es doch Computer :slight_smile:

Es geht mir dabei mehr um den Lerneffekt - insofern wäre ich dankbar für eine „Hilfe für Dummies“…

Also noch einmal die Problematik:

Dieses Skript:

<?
$var=(IPS_GetVariable(11732 /*[Haussteuerung\Wohnzimmer\TV Strom\xbox Strom\Status]*/));

setValueString (33796 /*[Haussteuerung\Wohnzimmer\TV Strom\xbox Strom\Zuletzt geschaltet]*/, (date('d.m.y H:i', ($var['VariableUpdated']))));
?>

Mit dem dazugehörigen Ereignis „Bei Variablenänderung“, soll so umgebaut werden, dass ich es auf andere Variablen anwenden kann, ohne alles manuell anpassen zu müssen. Kann mir einer Hilfestellung geben ?

Viele Grüße
Martin

Hallo Martin,
beim Auslösen durch eine Variable ist $IPS_SENDER=„Variable“ und in $IPS_VARIABLE die ID der auslösenden Variable. Über $IPS_VALUE erhälst Du auch direkt den Wert.

Du könntest so z.B. die unterschiedlichen Variablen per switch/case oder einer IF-Abfrage auf die verschiedenen IDs behandeln.

// Ausschnitt 
if($IPS_SENDER=="Variable"){

	switch($IPS_VARIABLE){
	
		case $id_Volume:
	    	echo "Volume set to: " . $IPS_VALUE . "

";
	   	$sonos->SetVolume($IPS_VALUE); //0-100 in %
			break;
		case $id_Mute:
	   	 echo "Volume set to: " . $IPS_VALUE . "

";
	   	$sonos->SetMute($IPS_VALUE); // true / false
			break;

Oder auch so kann man es aufbauen:

<? //Ausschnitt
if($IPS_SENDER=="Variable"){

	if ($IPS_VALUE==7){
            $eobj=IPS_GetObject($IPS_EVENT);
            echo $eobj['ObjectName']; // Name des Ereignisses



?>

Die wichtigsten Infos findest Du hier Systemvariablen: IP-Symcon :: Automatisierungssoftware

Grüße, Benjamin

Ja, Moment…

erstmal danke für die Antwort.

Ich habe jetzt folgendes:

if($IPS_SENDER=="Variable")

setValueString (33796 , (date('d.m.y H:i', ($IPS_VARIABLE['VariableUpdated']))));

Gibt mir als Timestamp spaßigerweise den 01.01.1970 01:00 - das Datum kenn’ ich doch irgendwoher^^

was ich noch nicht verstanden habe, ist das hier aus Deinem 2. Beispiel:

  if ($IPS_VALUE==7){
            $eobj=IPS_GetObject($IPS_EVENT);
            echo $eobj['ObjectName'];

OK, mal zum mitmeisseln:
Wenn der Wert der übergebenen Variable=7 ist
dann setze die Variable $eobj= gleich der ID des auslösenden Ereignisses
gib den Namen des Ereignisses aus.

Richtig ?

  1. Du musst erst ein IPS_GetVariable(…) machen damit Du ein Array mit der „VariableChanged“ erhälst - deswegen das doofe Datum (default).

was ich noch nicht verstanden habe, ist das hier aus Deinem 2. Beispiel:

  if ($IPS_VALUE==7){
            $eobj=IPS_GetObject($IPS_EVENT);
            echo $eobj['ObjectName'];

OK, mal zum mitmeisseln:
Wenn der Wert der übergebenen Variable=7 ist
dann setze die Variable $eobj= gleich der ID des auslösenden Ereignisses
gib den Namen des Ereignisses aus.
Richtig ?

Nein, der Wert 7 bei $IPS_VALUE war nur ein Beispiel. Aber über IPS_GetObject($IPS_EVENT); kommst Du an ein Object welches Dir auch die ID oder den Namen eines Ereignisses zeigt.

Gucke vielleicht einfach mal ein paar Skripte im Forum durch - so richtig fix und schnell kann ich das auch gerade nicht beschreiben.

Grüße, Benjamin

Der erste Teil ist leicht, du kannst es folgendermaßen abändern, dann hast du immer

<?
$var=(IPS_GetVariable($IPS_VARIABLE));

Aber im 2. Teil willst du ja die dazugehörige eigene Variable aktualisieren, aber dein Script weiss nicht welche Variable dazu gehört. du könnstest es mit einem langen IF machen, aber dann kannst du es gleich x-mal coden. Oder du legst irgendwo eine Liste ab, wo „Quellvariable“ und „Zielvariable“ drin stehen und befragst die.

Wie du ja schon sagtest, ist eher was zum üben als für den Alltag.

Ok, vielen Dank schon einmal - ich suche mal weiter !

Die Zuordnung Quell => Zielvariable könntest Du z.B. mit einem Array machen.

$var= array("24568" => 42801,
                   "24561" => 40140,
                   "32561" => 31845,
                   "36524" => 53157,
                   "36524" => 28606);

Gute Möglichkeit, dann würde sein Skript vollständig in etwa so aussehen (ohne es probiert zu haben):

<? 
$var=(IPS_GetVariable($IPS_VARIABLE));
$vararray= array("11732" => 33796 );

setValueString ($vararray[$IPS_VARIABLE] /*[Haussteuerung\Wohnzimmer\TV Strom\xbox Strom\Zuletzt geschaltet]*/, (date('d.m.y H:i', ($var['VariableUpdated'])))); 


Dann nur noch das Array um die anderen Beziehungen erweitern.