HM Rauchmelder - kann IPS den Auslöser in einer Gruppe ermitteln ?

Hallo Experten …

ich hab da mal eine generelle Frage:

Könnte man über IPS in einem Alarmfall eigentlich erkennen, welcher Rauchmelder in einer Gruppe von Meldern zuerst ausgelöst hat - also quasi den Rauch- / Brandherd auf Anhieb mitgeteilt bekommen ? So etwas könnte für das eigene Verhalten im Brandfall schon recht hilfreich sein.

Zum Hintergrund: Ich habe drei HM Rauchmelder über den LAN Adapter in IPS eingebunden. Diese sind auch als Meldergruppe untereinander bekannt („meldet einer --> melden alle“). Nun ist einer im Hobbykeller (ist auch „Serverraum“!), einer im Heizungskeller und einer im OG-Flur (vor der meist geschlossenen Schlafzimmertür) installiert. Falls es zu einem Alarm in einem der geschlossenen Kellerräume kommen sollte, würde ich mich wahrscheinlich entsprechend anders verhalten, als wenn der Qualm schon vor der Schlafzimmertür stehen sollte.
Ich plane weitere Melder zu beschaffen. Und insofern ist diese Frage - zumindest für mich - schon in sehr interessant.

Vielen Dank für ernst gemeinte Beiträge.
mareng

Hmmm…wenn der Feueralarm losgeht, würdest Du erstmal seelenruhig auf dein IPS Gerät/Handy kucken, WO es denn brennt, statt erst einmal die Gefahrenzoen zu verlassen ?
Wir hatten neulich nacht um halb drei einen Fehlalarm (meine Frau behauptet immer noch, ich hätte das geplant…) und das Erste was ich gemacht hab’, war zu kucken wo der Alarm denn herkommt - und zwar zu Fuß…an mein Handy hab ich nicht gedacht.

Aber zu Deiner Frage: Du müsstest eigentlich aus der Aktualisierung der ‚STATE‘ Variable ablesen können, welcher RM als erstes ausgelöst hat…

Viele Grüße
Martin

Ja ich denke so sollte das funzen…

Halllo… und Danke zunächst einmal für den Hinweis, die STATE Variable dafür heran zu ziehen.

Gegenfrage dazu: Kann man denn per Script die Änderungszeit dieser Variablen ermitteln ? Wenn ja, wäre es relativ einfach, den „Verursacher“ zu ermitteln.

Wahrscheinlich gibt es sogar einen IPS-Befehl !? Für einen Tip in dieser Richtung wäre ich sehr dankbar.

viele Grüße
Martin E.

p.s. @mcbelly: Also im Ernstfall würde ich schon lieber sofort (über Handy / IPS-Monitor am Bett) wissen wollen, was los ist. Wenn z.B. unser Treppenhaus verqualmt wäre, wollte ich nicht mehr da hindurch flüchten, und einen anderen Weg ins Freie gibts es leider nicht (außer aus dem Fenster zu springen :confused:). Dann rufe ich lieber sofort die Feuerwehr, und bleibe in einem unverrauchtem Raum. Denn wir wissen ja inzwischen, dass die Rauchgase eines Brandes lebensgefährlicher sein können, als das Feuer selbst.

Klar :slight_smile:

Im Prinzip hast Du 2 Möglichkeiten:

  1. Du hängst an die State Variable ein Ereignis (rechte Maustaste, Ereignis hinzufügen), „Ausgelöstes Ereignis“, welches auf die Variablenaktualisierung reagiert und ein Skript ausführt, oder

  2. Du schreibst die Aktualisierungszeit in eine Variable und wertest diese aus, so z.B.

<? 
$zeit = IPS_GetVariable(12345);//lesen der Updatezeit mit der ID 12345 
SetValue (23456, date("d.m.Y  H:i:s", $zeit['VariableUpdated']));//schreiben der Zeit in Variable 23456 
?>

Dieses Skript führst Du dann zyklisch aus (auch ein Ereignis). Spricht aber auch nichts dagegen, es als ausgelöstes Ereignis laufen zu lassen…

Viel Spaß damit :slight_smile:

ich denke, hier ist ‚VariableChanged‘ sinnvoller, er will ja nicht wissen, wann sich der Status aktualisiert hat, er will wissen wann sich der Status (auf true) geändert hat.:wink:

Eine andere Idee:

  1. Variable anlegen
  2. Script anlegen, getriggert durch Events von allen Rauchmeldrn (je rauchmelder 1 Event)
  3. Script schreibt in die Variable welcher Rauchmelder wann ausgelöst hat (über Identifikation des Events)
  4. Script schreibt nur dann neuen Wert in die Variable, wenn diese vorher leer war ( jedes später ausgelöste Event bleibt wirkungslos)
  5. per manueller Bestätigung kann der Inhalt der Var gelöscht werden

damit weiß man, welcher RM wann als erster ausgelöst hat

Pöh, oller IPSchauvinist :smiley:

Recht hast Du aber trotzdem ^^

na super … ! Das sind doch geniale Hinweise.

Ich werde mich mal kurzfristig (ggf. bis zum WE) daran machen das zu realisieren, und natürlich auszuprobieren - wobei ich mich wahrscheinlich an dem von „Raketenschnecke“ vorgeschlagenen Ablauf orientieren werde.

Sobald ich was brauchbares habe, werde ich dazu berichten.

Danke und viele Grüße
Martin E.

skeptisch, weil in Multiprozessorumgebungen durchaus die -parallele- Bearbeitung eines späteren Ereignisses vor dem zuerst ausgelösten fertig sein kann und dann der falsche Wert da steht. Außerdem ist das einface Auswerten, ob Stringvariable leer ist potenziell fehlerträchtig, weil z.B. nach Fehl- oder Probealarm die Variable eben nicht mehr leer ist und deren Löschung nicht vergessen werden darf.

Ich würde sicherheitshalber so vorgehen: Alle Beteiligten dürfen jederzeit feuern, wenn aber danach älteres(!) Ereignis reinkommt (nebenbei: dank onChange ists ja immer neuer als der Probealarm von vorgestern), wird sozusagen neu bewertet und der Ausgabewert /Zeit lesbar als String) nochmal überschrieben. Als Vergleichswert wird der originale Integer-Timestamp des letzten Auslösers gespeichert.
Damit bei dieser Regel auch das erste Ereignis ausgewertet wird (ist ja jünger als Probealarm von letzter Woche) sollte dann die Zeitdifferenz-Regel noch um ein maximales Alter, z.B. 5 min, ergänzt werden. Also final:

feuern (=Anzeigestatus und gespeicherten Wert aktualisieren) wenn tdiff < 0 oder abs(tdiff) > ttimeout

praktischerweise würde ich auch noch gleich den Sensorbezeichner und -ort mit anzeigen und von Steffi in Schleife plappern lassen. Wegen Qualm und Schlaf in den Augen usw.

…aber ob das alles wirklich Sinn macht? Wenns brennt hätte ich auch andere Sorgen als Handy suchen, app anschalten usw. Die ansagende Stimme wär da schon wirklich sinnvoller

Gruß Gerd

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 ...)

}
?>

Event_onChange.jpg

Event_reset_Alarmstatus.jpg

Hm gibt es evtl. die Möglichkeit das ganze für die 2.5er Version umzustricken, ich steh da irgendwie auf dem Schlauch.

Mir würde es auch reichen ein Script von allen RM getriggert zu haben, welches dann den Auslöser in eine Variable schreibt.
Aber wie bekomme ich das mit diesem array hin?

Okay, also hier mal mein erster Ansatz (sorry aber das scripten hakt einfach noch derbe)

<?
$rauchmelder = array(
					"Kueche" => GetValueBoolean (32946 /*[Messen-Überwachen-Melden\Rauchmelder\Küche\STATE]*/) ,
					"Wohnzimmer" => GetValueBoolean (23382 /*[Messen-Überwachen-Melden\Rauchmelder\Wohnzimmer\STATE]*/) ,
					"Buero" => GetValueBoolean (33967 /*[Messen-Überwachen-Melden\Rauchmelder\Büro\STATE]*/) ,
					"HWR" => GetValueBoolean (25582 /*[Messen-Überwachen-Melden\Rauchmelder\HWR\STATE]*/) ,
					"Test" => GetValueBoolean (19287 /*[Messen-Überwachen-Melden\Rauchmelder\Testvar]*/) 
					);

	 if (in_array(True,$rauchmelder))
		{
		echo "yes";
		}
	else
	{
	echo "no";
	}

?>

Damit habe ich zumindest schon mal die Meldervariablen in meinem Array und ich kann überprüfen ob einer davon aktiv ist.
Aber wie bekomme ich jetzt genau den da raus, welcher aktiv ist? Und das auch noch mit dem passenden Namen?
thx

Hi Martin,

kannst du mir evtl. deinen Code etwas genauer erleutern?

// 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"));
?> 

Denke das ist genau der Punkt wo es bei mir noch unklar ist.
Du führst das Skript aus und ermittelst den Auslöser aus dem Array (wo wird dieses bei dir eigentlich erstellt?)

Ok, hab´s jetzt erst mal so gelöst, dass jeder Rauchmelder sein eigenes Script hat. Nicht so schön aber funktioniert auch.

Huhu,
diese Scriptzeile ist für jeden Melder einzeln anzupassen… Da steckt keine Logik drinn, die den Melder als solches Identifiziert und weitergibt…

Hm, ok. Also hast du auch pro Melder 1 Script?
Dachte ich könnte ein globales verwenden und dieses nur von jedem Melder triggern. Wäre mir lieber…aber dafür reichen dann die php Kenntnisse wohl nicht.