Ereignisse / Variablenänderungen zentral abgreifen

Hallo zusammen,

für bestimmte Fragestellungen (z.B. in der Art „Wurde im Haus ein beliebiger Taster betätigt?“) würde ich gerne am liebsten zentral auf Variablenänderungen bzw. -aktualisierungen in einem eigenen Skript reagieren.

Geht das? Mit „zentral“ meine ich eine Art Dispatcher, bei dem nicht die Erstellung vieler einzelner Ereignisse notwendig ist.

Danke!

Gruß
micheljarre

Moin … da würde mir nur spontan der Befehl fürs Webfront eibfallen, der alle Änderungen ausgibt.
Musst mal in die Doku fürs Webfront schauen.
War irgendwas mit Snapshot wenn ich mich nicht irre!?
Peter

Yep, da wäre ich auch dafür. Sowas such ich auch, um die Events replizieren zu können. Früher ging das über ein Modul, was man in die MessageLoop gehangen hat, aber das geht mit 4.0 nicht mehr. Z.B. könnte man aber im Eventcontrol dafür ein Script registrieren.

Tommi

Hallo,

danke für die Infos. Habe in der Webfront Doku nichts Passendes gefunden (oder nicht das Richtige gesucht :D).

Jedenfalls habe ich mir mit einem Skript weitergeholfen, das über einzeln angelegte Events geht. Falls es Euch auch weiterhilft, ist es hier:

<?

/*
 * true -> registrieren, false -> Events löschen.
 * ACHTUNG: Alle Events unterhalb von $SkriptID werden gelöscht.
 */
$Registrieren = false;

// Welches Skript soll registriert/deregistriert werden?
$SkriptID = 34791 /*[Tests\events]*/ ;

// Unterhalb welcher ID sollen Variablen (rekursiv!) gesucht werden?
$WurzelID = 0;

/*
 * Siehe 'Auslösertyp' in IPS Doku unter
 * https://www.symcon.de/service/dokumentation/befehlsreferenz/ereignisverwaltung/ips-seteventtrigger/
 */
$AusloeserTyp = 0;

/*
 * Siehe 'Grenzwert' in IPS Doku unter
 * https://www.symcon.de/service/dokumentation/befehlsreferenz/ereignisverwaltung/ips-seteventtriggervalue/
 */
$Grenzwert = 0;

/*
 * Wenn leerer String, werden alle Variablen unterhalb WurzelID registriert, ansonsten nur Instanzvariablen
 * des angegebenen Modulnamens.
 */
$ModuleName = 'HomeMatic Device';

/*
 * Wenn leerer String, werden alle Variablenidents verwendet, ansonsten nur der angebene Ident.
 */
$Ident = '';

/*
 * Wenn leerer String, werden alle Variablennamen verwendet, ansonsten nur der angebene Ident.
 */
$Name = '';

if (!IPS_GetScript($SkriptID))
{
	echo "Eehler: Kein Skript mit ID: " . $SkriptID . "gefunden. " . PHP_EOL;
}
else
{
	$Registrieren?registerRecursive($WurzelID):unregister();
}

function registerRecursive($ObjID)
{
	global $SkriptID;
	global $AusloeserTyp;
	global $Grenzwert;
	global $ModuleName;
	global $Ident;
	global $Name;
	
	// Variable?
	if (IPS_GetObject($ObjID)['ObjectType'] == 2)
	{
		$DoIt = ($ModuleName == @IPS_GetInstance(IPS_GetParent($ObjID))['ModuleInfo']['ModuleName'] || $ModuleName == "")
					&& ($Ident == IPS_GetObject($ObjID)['ObjectIdent'] || $Ident == "")
					&& ($Name  == IPS_GetObject($ObjID)['ObjectName']  || $Name == "");

	   if ($DoIt)
	   {
	      $EventID = IPS_CreateEvent(0);
	      IPS_SetEventTrigger($EventID, $AusloeserTyp, $ObjID);
	      if ($AusloeserTyp > 1)
	      {
	      	IPS_SetEventTriggerValue($EventID, $Grenzwert);
	      }
	      IPS_SetName($EventID, 'AutoRegisterVariable' . $ObjID);
			IPS_SetParent($EventID, $SkriptID);
			IPS_SetEventActive($EventID, true);
			IPS_SetHidden($EventID, true);
	   	IPS_LogMessage($_IPS['SELF'], "Variable registriert: " . IPS_GetLocation($ObjID));
	   }
	}
	else
	{
		foreach (IPS_GetChildrenIDs($ObjID) As $ChildID)
		{
			registerRecursive($ChildID);
		}
	}
}

function unregister()
{
	global $SkriptID;
	
		foreach (IPS_GetChildrenIDs($SkriptID) As $ChildID)
		{
			if (@IPS_GetEvent($ChildID))
			{
			   IPS_DeleteEvent($ChildID);
			}
		}
}

?>

Gruß
micheljarre

Das hatte ich gemeint:

IPS_GetSnapshotChanges()

GetSnapshot Timestamp

Ist aber wohl nicht das was Du eigentlich gesucht hast.

Gruß,
Peter