Mail / SMS bei Homematic Hardware Problemen (Batterie, Erreichbarkeit, Error)

Hallo zusammen,

ich hab viel Homematic bei mir und, neben den normalen Instanzen, auch immer die Instanz 0 mit den Infos zu Batteriestand und Erreichbarkeit angelegt. Ich habe also nun folgende Auswertbare Variablen: LOWBAT, UNREACH, ERROR.

Nachfolgendes Skript durchläuft bei erstmaligen Aufruf meinen Objektbaum und legt für jeder dieser Variablen ein Ereignis an.

Wird das Skript durch eines dieser Ereignise ausgelöst, schickt es mir eine SMS / Mail mit den Infos, welches Gerät betroffen ist und was das Problem ist.

So geht’s:

  1. Kategorie anlegen
  2. neues Skript anlegen
  3. Quellcode reinkopieren
  4. Variablen-Array am Skriptanfang ggf. anpassen (sollte für Homematic ok sein, außer ihr wollt mehr Variablen)
  5. Auszuführende Aktion am Skript Ende anpassen (Mail, SMS)
  6. Skript ausführen
    => beim ersten Ausführen werden die ganzen Ereignisse für die Variablen angelegt
    => diese Ereignisse führen das Skript aus, wenn was passiert (z.B. eine LOWBAT Meldung)

<?
/*
Das nachfolgende Skript dienst zum erkennen von Hardwarestörungen bei Homematic & FS20
(schwache Batterie, nicht erreichbarkeit von Funkkomponenten, Error-Meldung).

Im ersten Teil wird für jeder zu überwachende Variable ein Ereignis angelegt. Dabei
reagiert das Ereignis bei Boolean Variablen auf TRUE (Batterie schwach) und bei Integer
Variablen auf Werte > 0. Beim ersten Ausführen des Skriptes wird in der Skriptkategorie
je Variable ein Ereignis angelegt.

Der Zweite Teil wird durchlaufen, wenn eines der Ereignise ausgelöst wird. Eine Meldung
wird erzeugt, welche gemailt oder per SMS geschickt werden kann. Oder ins LogFile. 

*/

/* Teil 1 */

//HIER ANPASSEN
$variables[1] = 'ERROR';         //Homematic - Fehler
$variables[2] = 'LOWBAT';        //Homemetic - Batterie schwach
$variables[3] = 'UNREACH';       //Homematic - Gerät nicht mehr erreichbar
$variables[4] = 'LowBatteryVar'; //FS20 Geräte - Batterie schwach


//Nachts wird geprüft, ob es neue relevante Variablen gibt. Falls ja wird ein Ereignis angelegt.
if (($IPS_SENDER=='TimerEvent') or ($IPS_SENDER=='Execute'))
{
	foreach(IPS_GetInstanceListByModuleType(3) as $id)
	//foreach(IPS_GetInstanceListByModuleID("{EE4A81C6-5C90-4DB7-AD2F-F6BBD521412E}") as $id)
	{
		//echo IPS_GetName($id)."
";
	   //print_r (IPS_GetStatusVariableIdents($id));
	   
		foreach ($variables as $CurrentVarName)
		{
		   if(IPS_StatusVariableExists($id, $CurrentVarName))
			{
			   $var = IPS_GetStatusVariable($id, $CurrentVarName);
			   //echo ("  - ".$CurrentVarName."
");
			   //print_r ($var);
			   //Boolean Variablen
			   if($var['VariableType'] == 0)
			   {
			      //Ereignis zum Skriptaufrufen anlegen
			   	if(@IPS_GetEventIDByName('Event '.$var['VariableID'], $IPS_SELF) === false)
					{
                  $ereignis = IPS_CreateEvent(0);
                  IPS_SetEventTrigger($ereignis, 4, $var['VariableID']);
                  IPS_SetEventTriggerValue($ereignis, true);
                  IPS_SetEventTriggerSubsequentExecution($ereignis, false);
                  IPS_SetParent($ereignis, $IPS_SELF);
                  IPS_SetName($ereignis, 'Event '.$var['VariableID']);
						IPS_SetEventActive($ereignis, true);
					}
			   }
			   //Integer Variablen
			   if($var['VariableType'] == 1)
			   {
			      //Ereignis zum Skriptaufrufen anlegen
			   	if(@IPS_GetEventIDByName('Event '.$var['VariableID'], $IPS_SELF) === false)
					{
                  $ereignis = IPS_CreateEvent(0);
                  IPS_SetEventTrigger($ereignis, 2, $var['VariableID']);
                  IPS_SetEventTriggerValue($ereignis, 0);
                  IPS_SetEventTriggerSubsequentExecution($ereignis, false);
                  IPS_SetParent($ereignis, $IPS_SELF);
                  IPS_SetName($ereignis, 'Event '.$var['VariableID']);
						IPS_SetEventActive($ereignis, true);
					}
			   }
			}
		}
	}
}


/* Teil 2 */

//Wenn eine Variable ein Ereignis auslöst, wird die Message erzeugt und verschickt
if ($IPS_SENDER=='Variable') 
{
	$MSG = 'ISP Info: Variable '.IPS_GetLocation($IPS_VARIABLE).' hat den Wert '.GetValue($IPS_VARIABLE).' ('.GetValueFormatted($IPS_VARIABLE).').';
	
	// HIER NUN EINFÜGEN, WAS MIT DER NACHRICHT PASSIEREN SOLL, z.B. Mail oder SMS
	SMS_Send(#Clickatellinstanz#,#Handynummer#,$MSG);
	SMTP_SenMail(#SMTP Send Mail Instanz#, date("d.m.Y",time())." - ".date("H:i",time()).": IPS Info", $MSG);

}
?>

Die Variablenliste am Anfag könnt ihr bei Homematic so belassen
Die auszuführende Aktion am Ende müsst ihr auf Euch anpassen da ich ja nicht weiß, ob ihr Mail oder SMS wollt und wie das bei Euch eingerichtet ist. Man kann natürlich auch andere Sachen mit der Message machen.

PS: Ich hab für das Skript manuell noch ein TimerEreignis angelegt. Dieses ruft das Skript einmal täglich auf. Wenn es über Timer Ereignis aufgerufen wird, ergänzt es die Ereignisse für neu dazugekommene Geräte. Man kann das Skript aber bei neuen Geräten auch einfach einmal manuell starten.

Hi Tobias,

danke für das Script. Es funktioniert im ersten Schritt schon ganz gut.
Ich habe aber mit den Events ein Problem.

Bei der Ausführung des Script werden wie gewünscht, die entsprechenden Events angelegt. Jedoch wird z.B. für die Wohnungstür (Keymatic)
als Ergebnis Error=0 ausgegeben, obwohl in die Instanz Error=2 angezeigt
wird.

Hast Du eine Idee, weshalb ein falsches Ergebnis ausgegeben wird.
Normalerweise müsste bei Error=2 eine z.B. Mail versendet werden.

Screenshots hab ich angehängt.

Kannst Du mir vielleicht weiterhelfen?

Danke und Grüße
Micha

Bildschirmfoto 2011-02-08 um 22.28.33.png

Bildschirmfoto 2011-02-08 um 22.29.12.png

Moin,

das Ereignis sagt, wenn ERROR auf > 0 wechselt, dann führe das Skript aus. Wenn deine Variable die ganze Zeit schon auf 2 steht, dann passiert nix. Erst wenn sie von 0 auf eine Zahl größer 0 wechselt. Irgendwie musst du deine Variable also einmal auf 0 bekommen, erst dann funktioniert es beim nächsten Fehler.

Mach mal ein Doppelklick auf das Ereignis im Objektbaum, dann siehst du die genaue Beschreibung.

Servus!

Oh man, ist ja klar!
Daran hab ich garnicht gedacht.

Danke Dir!
Micha

Hallo Tobias,

ich versuche das Skript so zu benutzen, aber es gibt mir z.B. bei meinen Homematic Thermostaten keinen LOWBAT Wert aus. Man sieht diese auch in IPS nicht, obwohl man sie mit anderen Skripten von der Hoematic Zentrale abfragen kann.

Kannst Du mir da weiterhelfen?

Gruss

auch Tobias

Existieren bei Dir denn schon die Instanzen für diese Raumregler auf Kanal 0?

Zu jedem HM-Gerät mit z.b. Adresse XYZ123456:1 existiert auch ein Gerät XYZ123456:0 auf welchem z.b. die LOWBAT-Meldungen kommen. Da findest Du dann auch diese Variable. Sind die Geräte nicht angelegt gibt es in IPS auch keine LOWBAT-Variable.

Es gibt hier im Forum auch ein Skript welches alle noch fehlenden HM-Geräte nachträglich in einem Rutsch anlegt.
Spart eine Menge Arbeit.

Grüsse.

Nachtrag: Geht aber nur mit einer CCU

Steht sogar im ersten Satz :o

Gruß
Bruno

Danke, das hilft. Das mit Kanal 0 war mir nicht bewusst, bzw ich dachte ich hätte 0 und 1 angelegt, aber es waren 1 und 2…

Gruss

gros_ibou

Den Erklärungen von Powerfreddy in kronos habe ich nichts zu ergänzen! Ich hoffe es funktioniert jetzt bei dir!

Hallo,

hat das schon jemand für V2.5 (neue Funktionen) umgebaut?