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:
- Kategorie anlegen
- neues Skript anlegen
- Quellcode reinkopieren
- Variablen-Array am Skriptanfang ggf. anpassen (sollte für Homematic ok sein, außer ihr wollt mehr Variablen)
- Auszuführende Aktion am Skript Ende anpassen (Mail, SMS)
- 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.