Sooooo, Halloo, da bin ich wieder …
ich habe am Wochenende meine neuen HM Rauchmelder (3 Stück) installiert, und meine Versuche in IPS vorbereitet. Konnte und wollte aber gestern - während meine Frau zu Hause ist :o - nicht alle Rauchmelder real (mit Prüfspray) testen. Das habe ich heute gemacht, und kann sagen, das Ergebnis ist (zumindest für meine Anforderungen) sehr positiv.
Wie habe ich das nun realisiert? Im Wesentlichen habe ich mich an dem Vorschlag von „Raketenschnecke“ orientiert:
1.) eine Variable (Typ Boolean) angelegt, die den „AlarmStatus“ darstellt
2.) ein Script „AlarmMelder“ angelegt, das bei einem Ereignis (von einem Rauchmelder) den Alarmstatus auswertet und ändert, und dann eine Aktion ausführt (bei mir eine SMS versenden).
3.) Für jeden Rauchmelder ein Ereignis definiert, das den Zustand der Statusvariablen überwacht, und im Fall einer Änderung (von false nach true) das o.g. Script mit einer Variablenübergabe aufruft. In dieser Übergabe ist ein Schlüssel - Wert - Paar definiert, das den Namen des entsprechenden Rauchmelders beinhaltet. Damit erhält das Script die Info, welcher Melder der Auslöser ist.
4.) ein zyklisches Ereignis für den Alarmstatus hinzugefügt, das erneute Aktionen wieder frei gibt - falls ich das selber vergessen sollte.
In den beigefügten Bildern sind meine Definitionen zu sehen. Die verschiedenen PHP Zeilen habe ich mal als ein Script zusammen gefasst und ausführlich kommentiert.
Bei meinem heutigen Test habe ich alle 6 installierten Rauchmelder jeweils einzeln mit dem Prüfspray angesprüht und folgendes Ergebnis erhalten:
- alle anderen Rauchmelder haben wie erwartet - verzögert - angesprochen
- es ist jeweils eine SMS mit dem richtigen Namen des Auslösers auf meinem Handy angekommen (5 mal sehr schnell, einmal ca. 20 s verzögert)
- im IPS Webfront wird klar ersichtlich welcher Rauchmelder der Auslöser war (solange der Alarm ansteht !).
Also ich bin für meine Situation mit dem jetzt erreichten zufrieden. Danke hier noch einmal an die Beitragenden für Ihre Anregungen. Falls jemand Fragen dazu haben sollte, und ich weiterhelfen kann, werde ich das gerne tun.
viele Grüße
Martin E.
p.s. Das mit dem Handy und der SMS ist ja nur ein Beispiel für eine Form von zielorientierter Benachrichtigung. Im Übrigen habe ich mir seit längerem angewöhnt, mein Handy griffbereit am Bett liegen zu haben… (man weiss ja nie, es könnte ja auch anderweitig sehr hilfreich sein, z.B. Notarzt rufen !?)
// mit einem täglichen Ereignis wird die Alarm Statusvariable grundsätzlich auf "false" gesetzt,
// - falls man das nach einem echten Alarm vergessen haben sollte ...;-)
<?
SetValueBoolean(30125 /*[Alarme\AlarmStatus]*/, false);
?>
// wenn sich die Statusvariable des betroffenen Gerätes ändert - also im echten Alarmfall -
// - wird innerhalb des onChange Ereignisses das Meldescript aufgerufen und
// - mittels Schlüssel - Wert - Paar der Name des Auslösers an das aufgerufene Script übergeben
<?
IPS_RunScriptEx(44877 /*[Alarme\AlarmMelder]*/, Array("Ausloeser" => "Rauchmelder Flur oben"));
?>
// das Meldescript prüft zunächst den Zustand der Statusvariablen
// - wenn dieser (noch) false ist - also eigentlich immer -->
// - wird die Statusvariable auf true gesetzt - also jetzt ist ALARM -->
// - damit wird verhindert, dass nachfolgende Auslöser die Alarmmeldung nachträglich beeinflussen
// der Name des Auslösers ist nun bekannt, und
// - kann in einer entsprechenden Routine (z.B. SMS) weiter gereicht werden.
<?
$crlf = chr(0x0D).chr(0x0A); // CR+LF
$IPS_AlarmStatus = GetValueBoolean(30125 /*[Alarme\AlarmStatus]*/);
if($IPS_AlarmStatus == false)
{
SetValueBoolean(30125 /*[Alarme\AlarmStatus]*/, true);
echo "Alarm: " . $Ausloeser . $crlf;
// ab Version 2.5 sollte es wohl etwas anders lauten ...
// $Quelle = $_IPS['$Ausloeser'];
// echo "Alarm: " . $Quelle . $crlf;
// ab hier folgt eine beliebige Benachrichtigungsroutine
// (z.B. SMS, Text to Speech, Status auf ein anderes Display/Monitor ...)
}
?>