Modul Alarm

Aus FHEMWiki

Diese Seite beschreibt die Konfiguration und Verwendung des Moduls 95_Alarm.pm.

ACHTUNG. WORK IN PROGRESS

Allgemeines

Das Modul 95_Alarm.pm stellt eine komfortable Oberfläche bereit, um per Webinterface bestimmte auslösende Elemente (nachfolgend 'Sensoren' genannt) mit bestimmten Aktionen (nachfolgend 'Aktoren' genannt) zu verknüpfen - und zwar nur innerhalb bestimmter Zeitfenster sowie an- und abschaltbar ("scharf/sharp" bzw. "unscharf/unsharp"). Diese Verknüpfungen werden als "normale" FHEM-Definitionen gespeichert.

Erste Schritte

Damit FHEM-Devices als Aktoren oder Sensoren für die Alarmanlage genutzt werden können, müssen zwei neue globale Attribute eingeführt werden. Dazu muss in der Grundkonfiguration von FHEM die Zeile mit der Definition der nutzerspezifischen Attribute userattr angepasst werden:

attr global userattr alarmDevice alarmSettings devStateIcon devStateStyle ...(hier folgen weitere Attribute)
  • Soll ein FHEM-Device als Sensor für die Alarmanlage genutzt werden, wird der Wert seines alarmDevice-Attributes auf 'Sensor' gesetzt.
  • Soll ein FHEM-Device als Aktor für die Alarmanlage genutzt werden, wird der Wert seines alarmDevice-Attributes auf 'Actor' gesetzt
  • Das Attribute alarmSettings wird beim Setzen der Alarme auf der Alarmkonfigurationsseite automatisch befüllt.

Ferner muss das Modul 95_Alarm.pm im Modulpfad installiert werden, ebenso die JavaScript-Datei alarm.js in www/pgm2.

Definition

Die Alarmanlage - hier mit dem Namen AAA versehen - selbst wird über

define AAA Alarm
attr AAA room AlarmRoom

definiert. Zusätzlich soll sie im oberen Menü des Webinterfaces auftauchen, dazu benötigen wir noch

define AAA_weblink weblink htmlCode {Alarm_Html("AAA")}
attr AAA_weblink room AlarmRoom
  • Der Raum AlarmRoom ist ein versteckter Raum, der nicht im unteren Menü auftaucht.
  • Es wird ein weiterer Raum benötigt, der in der gegenwärtigen Fassung des Moduls den Namen Alarm trägt

Konfiguration

Beim Anklicken des Begriffes Alarm im oberen Menü des Webinterfaces wird die Alarmkonfiguration angezeigt.

Settings

Als Default sind 8 Alarmlevel möglich, in der Tabelle 'Settings' können für jeden Level gesetzt werden:

  • Startzeit und Endzeit des Alarmlevels
  • Eine Nachricht zur Erläuterung des Alarms (Teil 2)
  • Checkbox sharp/unsharp = scharf/unscharf
  • Button Can zum Canceln = Aufheben des Alarms

Alarm settings.png

Sensors

Danach wird die Tabelle der Sensoren angezeigt. Für jeden Sensor kann gesetzt werden:

  • Alarmlevel, die hierdurch ausgelöst werden
  • Ein regulärer Ausdruck, bei dessen Erkennung die Auslösung erfolgt
  • Eine Nachricht zur Erläuterung des Alarms (Teil 1)
  • Ein Selektor, um festzulegen, ob dieser Sensor den Alarm
    • auslöst (=Raise),
    • widerruft (=Cancel),
    • scharf schaltet (=Sharpen) oder
    • unscharf schaltet (=Unsharpen).

Achtung: Es ist zwingend notwendig, dass für einen auszulösenden Alarmlevel auch ein Sensor für den Widerruf (=Cancel) des Alarms definiert wird, ansonsten ignoriert das Modul die Definition dieses Levels.

Die insgesamt in den STATE der Alarmanlage geschriebene Nachricht besteht dann aus

(Anzeige der Zustände) (Nachricht Teil 1)' '(Nachricht Teil 2).

Bitte weiter unten nachlesen, was mit der Anzeige der Zustände gemeint ist. In diesen Nachrichten werden die folgenden Ersetzungen vorgenommen

  • $NAME vird durch den Namen des auslösenden Devices ersetzt
  • $EVENT wird durch den kompletten Event ersetzt
  • $EVTPART1... wird durch den 1. Teilstring des Events gefüllt, etc.

Alarm sensors.png

Actors

Anschließend wird die Tabelle der Aktoren angezeigt. Für jeden Aktor kann gesetzt werden:

  • Alarmlevel, die diesen Aktor starten
  • Ein FHEM-Kommando zum Starten des Aktors
  • Ein FHEM-Kommando zum Stoppen des Aktors
  • Eine Zeitverzögerung - entweder als Angabe von Sekunden (<60) oder im Format mm:ss

Alarm actors.png

Einrichten

Durch Anklicken des Buttons Set Alarms werden die alarmSettings-Attribute befüllt. Achtung: Es ist zwingend notwendig, dass für einen auszulösenden Alarmlevel auch ein Sensor für den Widerruf (=Cancel) des Alarms definiert wird, ansonsten ignoriert das Modul die Definition dieses Levels.

Achtung: Es empfiehlt sich, danach ein Save Config auszuführen, damit die Attribute und Notifier permanent sind.

Anzeige der Zustände

Auf Wunsch können die Zustände der Alarmanlage zusammen mit der konkreten Meldung im reading state angezeigt werden. Hierfür gibt es ein Attribut statedisplay mit den folgenden möglichen Werten, die nachfolgend am Beispiel für den Zustand "Alarm Level 1 ausgelöst" erläutert sind:

  • none - keine Anzeige
  • simple - OXOOOOOO
  • color - 0 1 2 3 4 5 6 7
  • table - 

Das Problem ist, dass möglicherweise das reading state an anderer Stelle verwendet werden soll - z.B. beim Versenden von Mails als

Value('AAA')

Es macht natürlich keinen Sinn, eine HTML-Tabelle in eine Mail zu packen. Deshalb sollte für die Weiterverarbeitung statt des obigen Code verwendet werden

$defs{'AAA'}{READINGS}{"short"}{VAL}

Dies enthält nur die Meldung, nicht aber die Anzeige aller Zustände.

Sensoren

Rauchalarm

Dieser Alarm ist mit Lebensgefahr verbunden und wird deshalb unabhängig von FHEM ausgelöst, und von FHEM nur registriert und mit weiteren Aktoren verbunden.

Im Beispiel werden vernetzte Rauchmelder des Typs HM-SEC-SD verwendet. Deren Teamleader erhalten das Attribut alarmDevice Sensor, so dass sie in der Sensorenliste der Alarmanlage auftauchen. Sie lösen den Alarm mit dem höchsten Level aus. Die Realisierung lässt sich aber auch über beliebige andere in FHEM eingebundene Rauchmelder erreichen.

Alarm smoke.png

Öffnung von Fenstern oder Türen

Dies dient der Überwachung von Zustandsänderungen, ebenso wie zur Überprüfung eines statischen Zustands

Szenarien

Kontrollrunde

Dieses Alarmszenario (Alarmlevel 4) liegt vor, wenn die Hausbewohner anwesend sind, aber irgendwann zu Bett gehen wollen und vorher noch überprüfen, ob auch alle Türen und das Garagentor geschlossen sind. Sagen wir, beginnend um 22:00 bis 23:59. Man könnte diesen Alarmlevel aber auch durch einen externen Regensensor auslösen, der die Dachfenster auf ihren Öffnungszustand untersucht. Jedenfalls sollte dieser Alarmlevel immer scharf sein.

Durch einen externen Auslöser (sagen wir, beginnend um 22:00 Uhr) wird in periodischen Abständen eine Hilfsroutine gestartet, welche die Zustandsprüfung vornimmt und registriert. Nur wenn diese Registrierung eine Öffnung ergibt, wird der Alarm ausgelöst. Dieser Alarmlevel gehört also zur Kategorie Warnung und wird deshalb nur eine moderate Signalisierung benötigen - beispielsweise

Zutritt

Dieses Alarmszenario (Alarmlevel 5) liegt vor, wenn die Hausbewohner anwesend sind, aber vermutlich schlafen gegangen sind. Sagen wir, von 0:00 bis 5:00.

Wenn morgens um 4:00 die Haustür geöffnet wird, handelt es sich entweder um ein spätes Heimkommen eines Hausbewohners von einer Party - oder um einen Einbruchsversuch. Der Partygeher sollte also eine gewisse Warnungszeit bekommen, bevor ein moderater akustischer Aktor (sagen wir, ein Funkgong) losgeht. Dieser Aktor muss deshalb mit einer Verzögerung eingeschaltet werden, und der Partygeher erhält eine Warnung. Diese Warnung - sagen wir, eine bestimmte Lampe geht an - informiert ihn, dass er innerhalb von 30 Sekunden einen bestimmten Schalter betätigen muss. Etwa den für genau diese Lampe, um sie auszuschalten. Der Einbrecher kennt diesen Schalter nicht, der moderate Alarm wird also die schlafenden Hausbewohner wecken und ihn abschrecken.

Zusätzlich verfügt dieser Level auch noch über einen Partymodus: Mit diesem kann er für 24 Stunden abgestellt werden, so dass man auch um 3:00 in der Frühe die eigenen Partygäste aus dem Haus lassen kann, ohne ihn auszulösen.

Einbruch

Dieses Alarmszenario (Alarmlevel 6) liegt vor, wenn die Hausbewohner abwesend sind und diesen Level vorher scharf geschaltet haben - und idealerweise von 0:00 bis 23:59. Jeder Zutritt zu Haus löst diesen Alarm aus, und der akustische Aktor kann durchaus kräftig sein (etwa Einschalten der Rauchmelder für 1 Minute).

Da die Auslösung auch erfolgt, wenn der Hausbesitzer heimkommt, muss der akustische Aktor eine Verzögerung haben und innerhalb dieser einer Warnung gegeben werden, z.B. indem zunächst eine bestimmte Lampe angeht. Dies informiert ihn, dass er innerhalb von 30 Sekunden einen bestimmten Schalter betätigen muss. Etwa die Kombination, um diesen Alarmlevel unscharf zu schalten. Der Einbrecher kennt diese Kombination nicht, die Beleuchtung wird ihn also zunächst abschrecken und der nachfolgende laute akustische Aktor auch die Nachbarn wecken.

Zustandsänderung

Dazu werden alle überwachten Fenster- und Türkontakte mit dem Attribut alarmDevice Sensor versehen, so dass sie in der Sensorenliste der Alarmanlage auftauchen. In der Alarmkonfiguration sieht das dann so aus:

Alarm tf.png

Zustandsprüfung

Dies dient der Überprüfung eines statischen Zustands, konkret ob und welche Fenster oder Türen offen sind - z.B. abends, oder bei Regenwetter. Dazu benötigen wir drei dummy Devices, von denen zwei als alarmDevice Sensor und einer als alarmDevice Actor attributiert werden und somit in der Sensoren- bzw. Aktorenliste der Alarmanlage auftauchen.

define TFOpen.warn dummy
attr TFOpen.warn alarmDevice Sensor
attr TFOpen.warn alarm4,|TFOpen.warn:.*[TF].*|$EVENT|on (Diese Zeile wird vom Modul 95_Alarm.pm automatisch erzeugt)
attr TFOpen.warn group windowDetector
attr TFOpen.warn room Alarm
define TFClose.warn dummy
attr TFClose.warn alarmDevice Sensor
attr TFClose.warn alarmSettings alarm4,|TFClose.warn:yes|Alle zu|off (Diese Zeile wird vom Modul 95_Alarm.pm automatisch erzeugt)
attr TFClose.warn group windowDetector
attr TFClose.warn room Alarm
define TFOpen.check dummy
attr TFOpen.check alarmDevice Actor
attr TFOpen.check alarmSettings alarm4,|{HouseOpen()}||10:00 (Diese Zeile wird vom Modul 95_Alarm.pm automatisch erzeugt)
attr TFOpen.check group windowDetector
attr TFOpen.check room Alarm
TFAlarm.png

Als nächstes muss eine Überwachungsroutine geschrieben werden. Das kann entweder als FHEM-Skript geschehen, oder in der Datei 99_myUtils.pm als perl-Code. Dieses Unterprogramm muss

  • den obigen dummy TFOpen.warn setzen, und zwar auf den oder die Namen der geöffneten Fenster und Türen oder "none", wenn keine geöffnet sind.
  • den obigen dummy TFClose.warn setzen, und zwar auf den Wert "no", wenn irgendeine geöffnet ist und "yes", wenn keine geöffnet sind.

Ein Beispiel für eine solche Überwachungsroutine ist weiter unten zu sehen.

Diese Doppelung ist nötig, weil jeder Sensor nur mit einem notify in den Alarmen auftauchen kann - das dient der Sicherheit gegen Fehlkonfiguration und ist beabsichtigt.

In dem nebenstehenden Flussdiagramm wird der Ablauf dargestellt, der sich mit diesem System ergibt. Dabei wird um 22:00 der erste Test auf ein ordnungsgemäß geschlossenes Haus gestartet - und bis Mitternacht alle 10 Minuten wiederholt. Alternativ könnte man das auch mit einem Regensensor als Erstauslöser koppeln.




Beispielcode für eine Überwachungsroutine:

sub HouseOpen()
{
 my $kfo = 0;
 my $kfs = "";
 my $kto = 0;
 my $kts = "";
 my $str = "";
 if( $main::value{'BK.F'} ne "Closed" ){
   $kfo++;
   $kfs = "BK/";
 }
 if( $main::value{'WK.F'} ne 'Closed' ){
   $kfo++;
   $kfs = $kfs."WK/";
 }
 if( $main::value{'VK.T'} ne "Closed" ){
   $kto++;
   $kts = "VK/";
 }
 if( $main::value{'WZ.T'} ne 'Closed' ){
   $kto++;
   $kts = $kts."WZ/";
 }
if( ($kfo >= 1) && ($kto == 0) ){
   $kfs = substr($kfs,0,-1);
   fhem("define TFOpen.delay at +00:00:30 set TFOpen.warn $kfs Fenster"); 
   fhem("define TFClose.delay at +00:00:30 set TFClose.warn no");
 }elsif( ($kfo == 0) && ($kto >= 1) ){
   $kts = substr($kts,0,-1);
   fhem("define TFOpen.delay at +00:00:30 set TFOpen.warn $kts Tür"); 
   fhem("define TFClose.delay at +00:00:30 set TFClose.warn no");
 }elsif( ($kfo >= 1) && ($kto >= 1)){
    $kts = substr($kts,0,-1);
    $kfs = substr($kfs,0,-1);
    $str = "$kts Tür + $kfs Fenster";
    fhem("define TFOpen.delay at +00:00:30 set TFOpen.warn $kts T / $kfs F");
    fhem("define TFClose.delay at +00:00:30 set TFClose.warn no");
 }else{
    fhem("set TFOpen.warn none");
    fhem("set TFClose.warn yes");
 }
return $str;
}

Batterie schwach bei FHEM-Devices

Dieser Sensor besteht aus einem notify und einem dummy, der bei einer 'battery low'-Meldung eines beliebigen FHEM-Device auf dessen Namen gesetzt wird. Der dummy wird als alarmDevice Sensor attributiert, so dass er in der Sensorenliste der Alarmanlage auftaucht.

define LBatt.N notify .*:[Bb]attery.*[Ll]ow.* set LBatt.warn $NAME
attr LBatt.N room Alarm
attr LBatt.N group deviceDetector
define LBatt.warn dummy
attr LBatt.warn alarmDevice Sensor
attr LBatt.warn room Alarm
attr LBatt.warn group deviceDetector

Auf einen Test, ob gleichzeitig bei anderen FHEM-Devices die Batterie ebenfalls schwach ist, wird hier verzichtet. Für diesen Sensor wird ein eigener Alarmlevel (niedriger Priorität) erzeugt. Bei einem beliebigen 'battery low' Event wird somit der STATE der Alarmanlage gesetzt auf Batt. <devicename> schwach. Dieser Alarm muss manuell zurückgesetzt werden (schließlich sollten die Batterien ja erst gewechselt werden...)

Alarm lbatt.png

Aktoren

Rauchmelder als Alarmsignal

Für Alarme, bei denen es wirklich auf schnelle Reaktionen ankommt, kann man auch Rauchdetektoren verwenden, die über Funk aktivierbar sind. Im Beispiel werden vernetzte Rauchmelder des Typs HM-SEC-SD verwendet.

Achtung: Es ist sehr empfehlenswert, diesen Alarm auch wieder automatisch auszuschalten.

Dazu wird ein dummy erzeugt und mit alarmDevice Actor attributiert, so dass er in der Aktorenliste auftaucht:

define SD.alarm dummy
attr SD.alarm alarmDevice Actor
attr SD.alarm alarmSettings alarm7,|set TH.SD0 alarmOn|set TH.SD0 alarmOff|30
attr SD.alarm group alarmActor
attr SD.alarm room Alarm 

In der Alarmkonfiguration sieht das dann so aus:

Alarm smokeactor.png

Funk-Türgong als Alarmsignal

Hier wird ein FS20-Türgong als akustisches Alarmsignal verwendet.

define WZ.Gong FS20 <adresse>
attr WZ.Gong IODev CUL
attr WZ.Gong alarmDevice Actor
attr WZ.Gong alarmSettings alarm5,alarm6,|set WZ.Gong on||30 (Vom Modul 95_Alarm.pm automatisch erzeugt)
attr WZ.Gong group alarmActor
attr WZ.Gong room Alarm,Erdgeschoss

In der Alarmkonfiguration sieht das dann so aus:

Alarm gongactor.png

Alarmierung per SMS

Für Alarme, die man auch im Urlaub auf das Handy bekommen möchte, bedarf es natürlich eines Providers, der eine bestimmte Mailadresse als SMS weiterleitet. Ferner einer FHEM-Konfiguration, die Mails versenden kann. Dann wird ein dummy erzeugt und mit alarmDevice Actor attributiert, so dass er in der Aktorenliste auftaucht:

define Mail.alarm dummy
attr Mail.alarm alarmDevice Actor
attr Mail.alarm alarmSettings alarm6,alarm7,|{DebianMail(<mailadresse>,'Alarm',Value('AAA'))}||30 (automatisch erzeugt)
attr Mail.alarm group alarmActor
attr Mail.alarm room Alarm

In der Alarmkonfiguration sieht das dann so aus:

Alarm mailactor.png