Neues Modul für Alarmanlage

Begonnen von Prof. Dr. Peter Henning, 08 September 2014, 20:43:06

Vorheriges Thema - Nächstes Thema

UweUwe

Ich bitte darum, einige Fragen für mich zu beantworten.

1. Bedingung für die Alarm Level (Funktion habe ich verstanden). Syntax nicht (bitte nicht auf Pearl Kurs verweisen. Habe ich schon im Sinn)

Könnte ich bitte einige Beispiele von Pearl Code bekommen, die hier sinnvoll sind und funktionieren

==> zum Beispiel aus dem Modul Residents  8) 8). Dort gibt es das reading "residentsTotalGuests" und das reading "residentsHome".
Immer wenn die Summe aus den beiden readings 0 ist (niemand zu Hause) soll der Alarm scharf geschalten werden, also die Bedingung den Wert 1 erhalten. Ich habe verstanden, dass diese Bedingung ein neues Feature ist und deshalb noch nicht im Wiki mit "Beispielen auftaucht.

2. Im wiki steht bei den Beispielen einige Male der Hinweis:
Zitat(Diese Zeile wird vom Modul 95_Alarm.pm automatisch erzeugt)

bedeutet dies, dass man dies bei der Dummy  Definition nicht beachten muss und einfach ignorieren. Das Modul Alarm setzt diese Attribute etc. beim Setzten und Schärfen. Korrekt? Passt aber irgendwie nicht in meine 3. Frage:

3. DebianMail Beispiel  Alarmierung per SMS

attr Mail.alarm alarmSettings alarm6,alarm7,|{DebianMail(<mailadresse>,'Alarm','$SHORT'}||30 (Vom Modul 95_Alarm.pm automatisch erzeugt)


Muss die <mailadresse> hier nicht in ' ..'  stehen? Die Set Action {DebianMail('haus..} muss ich doch weiterhin selbst überlegen und einfügen. "Alarm" weiss ja nicht, dass ich ein Mail schicken will.

4. Ich bitte um Hinweis, wie ich bei Alarm laute Musik zusätzlich zur Sirene abspielen kann. Nur eine Bitte

Ich finde den Gong nicht so .. ::) ::)

Idee ist, dass ich meine "Raumfeld" Geräte (Multiroom WLAN Lautsprecher von Teufel)  mit Spotify (Playlist)  zu verknüpfen und laut aufdrehen. Hab mich auch schon eingelesen in Spotify und Raumfeld. Spotify müsste machbar sein, für mich. Raumfeld (multiroom wifi-System von Teufel) wird zwar im Forum besprochen, ist für mich aufgrund mangelhafter Kenntnisse (speziell Linux) nicht konfigurierbar. Hat jemand noch eine Idee?

Meine Alarmanlage habe ich bisher durch Wiki und den 81 Seiten Forum weit gebracht. Danke. Gute Arbeit.




Prof. Dr. Peter Henning

1. Zuerst einmal: Es heißt Perl, nicht Pearl. Weiterhin: Ich kann es wegen meiner beruflichen Last derzeit nicht stemmen, mir neue Beispiele auszudenken, bitte um Verständnis - das kann ggf. jemand anders beisteuern.

2. Ja.

3.
ZitatMuss die <mailadresse> hier nicht in ' ..'  stehen?
Das ist eine Frage der Schreibweise. <mailadresse> ist ein String und ENTHÄLT natürlich die '-Zeichen.

4. Sicher geht das.

LG

pah


UweUwe

Danke pah,

toll wäre, wenn ich aus dem Forum noch einen Hinweis bekommen könnte:

1. Es geht um die Bedingung nach dem Alarmlevel , es gut um das Perl-eval().
Ich möchte einen Alarm Level davon abhängig machen, ob jemand "erlaubtes" im Hause sind. Residents kombiniert mit Geofancy passt hier sehr gut.
Ich habe verschiedene Reading, wobei der  !! state "home" am Besten passt.  Falls das reading von Bewohner:  (Bewohner:state ne home) ist, dann ist kein Bewohner und kein erlaubter Gast im Hause und dann soll dieser Alarm scharf werden.
Aber wie sag ich es dem Kinde. Ich bin (noch nicht) kein Perl Programmierer, leider. Man könnte auch die readings "residentsTotalGuestsPresent" und "residentsTotalPresent" des devices "Bewohner addieren, falls die Summe ist, ==> scharf stellen. "home" gefällt mir besser

Hab mal die wichtigsten Teile des List Bewohner angehängt:

Internals:
   CHANGED   
   DURATIONTIMER 1547153558.31711
   GUESTS     KERSTIN,PATRICK,TOBIAS
   NAME       Bewohner
   NOTIFYDEV  global,MARGIT,UWE,KERSTIN,PATRICK,TOBIAS
   NR         66
   NTFY_ORDER 50-Bewohner
   READY      1
   ROOMMATES  MARGIT,UWE
   STATE      home
   TYPE       RESIDENTS
   READINGS:
     2019-01-01 17:41:10   residentsTotalGuestsPresent 0
     2019-01-10 16:35:46   residentsTotalPresent 1
     2019-01-10 16:35:46   state           home
   TIMER:
     Bewohner_DurationTimer:
       HASH       Bewohner
       MODIFIER   DurationTimer
       NAME       Bewohner_DurationTimer
Attributes:
   DbLogExclude .*
   alias      Residents
   devStateIcon .*home:user_available:absent .*absent:user_away:home .*gone:user_ext_away:home .*gotosleep:scene_toilet:asleep .*asleep:scene_sleeping:awoken .*awoken:scene_sleeping_alternat:home .*:user_unknown:home
   group      Home State
   icon       control_building_filled
   room       Residents
   webCmd     state


Meine Idee für das Perl-eval war:       {Bewohner:state eq home} 

2. Eine weitere Frage bezieht sich auf das Beispiel "Zustandsprüfung Fenster und Türen" im Wiki, das ich gerne verstehen und modifiziert verwenden möchte. Auch um Perl zu lernen.

Sehe ich das richtig:
alle .F (z.B. Ke_WE.F) sind Fensterkontakte und alle .T (z.B. Ha:T) sind Türkontakte.

Diese werden dann in dem geprüft, ob sie ne "closed" sind. Einzeln. Hier kann man dann auch seine Türkontakte/Fensterkontakte einbauen.

Wie das if funktioniert, verstehe ich nicht. z.B. was macht main::Value{  .. und was bedeutet der Ausdruck "Ke_Ws/" (speziell der /).
Ich denke, wenn ich das if verstanden habe, kann ich den Rest erarbeiten.

Fände ich ganz prima, wenn ihr mir da weiterhelfen könntet. Merci.








UweUwe

Hallo,

zu dem Punkt 1 meiner letzten Anfrage (vorgehendes Post von Gestern) "Perl-eval" für die Bedingung zum Setzten des Alarms bin ich weitergekommen. In der FHEM Kommandozeile bekomme ich mit meinem Perl-Eval die korrekten Werte, aber "Alarm" weigert sich noch.
Meine Perl-Eval sieht so aus:
{ReadingsNum ("Bewohner","residentsHome","-1") +  ReadingsNum ("Bewohner","residentsTotalGuestsPresent","-1")  == 1} ("Bewohner","residentsHome","-1") +  ReadingsNum ("Bewohner","residentsTotalGuestsPresent","-1")  == 1}
Ich habe diese mit den {} in der FHEM Kommondozeile getestet und es kommen die korrekte Werte :
Kein Wert, falls der Ausdruck vor dem == nicht gleich 0 ist und 1 wenn der Ausdruck 0 ist. Also genau das, was ich will.
Setzte ich dies in dies genauso in den ALARM - "Bedingungsfeld" ein, so bleibt der Ausdruck auch nach Parameter setzen und fhem speichern erhalten.
Wechsele ich aber einmal in einen anderen Raum und kehre zur Alarmanlage wieder zurück, so steht nur noch der Ausdruck
{ReadingsNum (
in dem Bedingungsfeld.
Auch wenn ich das Blank zwischen ReadingsNum und "(" weglasse, keine Änderung.
Wo kann ich nachlesen, was ich falsch gemacht habe.

ChrisW

Vielleicht kann ja nochmal jemand bei meinem Problem helfen... Liegt es an den mehrerern Befehlen ? Reicht das ; nicht zum trennen ?
Danke

Zitat von: ChrisW am 06 Januar 2019, 14:48:24
Leider ist das Problem immer noch das die Auslösewartezeit Ignoriert wird bei allelichteran ..
Liegt es an der Trennung der Befehle ? Bei Alarmauslösung werden ohne Wartezeit alle Lichter eingeschaltet :(

Hier nochmal ein list:


Internals:
   NAME       ALLE_LICHTER_AN
   NR         835
   STATE      ???
   TYPE       dummy
Attributes:
   alarmDevice Actor
   alarmSettings alarm0,alarm5,|set strom_hannibal_dect on;set led_durchreiche on;set lampe_unterstand on;set lampe_reitplatz_untertsand on;set lampe_wiese_misthaufen on||01:40
   room       Alarm

Raspberry PI3 mit allem möglichen.

UweUwe

Hi ChrisW,
ich bin auch gerade erstmals beim Aufbau des Modules "Alarm" und amit nicht der Erfahrene. Aber einige Erfahrung hab ich schon gemacht.

Dein Problem verstehe ich nicht, kannst es noch etwas ausführlicher mit Daten schildern?

Hast du in deiner Abwednung irgendwann erfpgleich die "Bedingung" für das "Schärfen" eines Alarms verwendet?. Falls Ja, kannst du mir bitte eine solche Zukommen lassen. Da hänge ich gerade.

UweUwe

Hallo,
zwischenzeitlich bin ich auch mit meiner 2. Frage weitergekommen.
Zitat2. Eine weitere Frage bezieht sich auf das Beispiel "Zustandsprüfung Fenster und Türen" im Wiki, das ich gerne verstehen und modifiziert verwenden möchte. Auch um Perl zu lernen.

Sehe ich das richtig:
alle .F (z.B. Ke_WE.F) sind Fensterkontakte und alle .T (z.B. Ha:T) sind Türkontakte.
Diese werden dann in dem geprüft, ob sie ne "closed" sind. Einzeln. Hier kann man dann auch seine Türkontakte/Fensterkontakte einbauen.
Wie das if funktioniert, verstehe ich nicht. z.B. was macht main::Value{  .. und was bedeutet der Ausdruck "Ke_Ws/" (speziell der /).
Ich denke, wenn ich das if verstanden habe, kann ich den Rest erarbeiten.
Das Modul HouseOpen habe ich verstanden und bei mir angepasst. Tür und Fensterkontakte habe ich auf das System T. und F. System gebracht, ansonsten passt ja das alarmSettings nicht.

Aber dazu genau meine Frage, die sich jetzt stellt, ist wichtig für mich, auch wenn ich HouseOpen nicht unbedingt benötige:
Die REGEX für TFOpen.warn muss ja von mir gesetzt werden: TFOpen.warn:.*[TF].*|$EVENT|on (prüft, ob ein Tür oder Fensterkontakt in dem String (offen) steht und setzt dann nochmals TFOpen.warn, der setzt dann über $Event den Alarm 4, der dann mit 10 minütiger Verzögerung HouseOpen() nochmals startet.
Es tritt hier ein vergleichbarer Fall auf, als bei meinem bereits beschrieben Problem mit der Alarmbedingung:
Ich setzte den korrekten Wert  :
TFOpen.warn:.*[TF].*|$EVENT|on
in das dafür  vorgesehene Eingabe- Feld "
ZitatAuslösung durch RegExp" des TFOpen.warn
ein , es wird auch eingetragen, ich speichere sowohl "Parameter setzen" als auch save config. Immer noch der korrekte Wert.
Ich wechsle kurz in ein anderes Zimmer und zurück und das RegExp hat sich verändert:
TFOpen.warn:.*[TF].*

Im TFOpen.warn device steht als attr. alarmSettings:

   alarm4,|TFOpen.warn:.*[TF].*|EVENT|on|$EVENT|on 
also ein |EVENT| mehr, für mich syntaktisch nicht zu erklären.

Mit keiner dieser beiden Regex (meine Vermutung) wird der Alarm wieder gestartet.
Mache ich hier einen grundlegenden Denkfehler?

Hier nochmals das komplette Listung von TFOpen.warn:
Internals:
   NAME       TFOpen.warn
   NR         185
   STATE      SCHLAFT Tür
   TYPE       dummy
   READINGS:
     2019-01-13 22:11:05   state           SCHLAFT Tür
Attributes:
   DbLogExclude .*
   alarmDevice Sensor
   alarmSettings alarm4,|TFOpen.warn:.*[TF].*|EVENT|on|$EVENT|on
   group      windowDetector
   room       Alarm



Ich habe ja einen ähnlichen Effekt bei der Bedingung eines Alarmlevels. Beide Phänomene bekomme ich nicht in den Griff.
Ich hole mein erstes Thema "Bedingung" zum Schärfen des Alarms  nochmals hoch, dass alles zusammen in einer Nachricht ist:
Zitatzu dem Punkt 1 meiner letzten Anfrage (vorgehendes Post von Gestern) "Perl-eval" für die Bedingung zum Setzten des Alarms bin ich weitergekommen. In der FHEM Kommandozeile bekomme ich mit meinem Perl-Eval die korrekten Werte, aber "Alarm" weigert sich noch.
Meine Perl-Eval sieht so aus:
Code: [Auswählen]

{ReadingsNum ("Bewohner","residentsHome","-1") +  ReadingsNum ("Bewohner","residentsTotalGuestsPresent","-1")  == 1} ("Bewohner","residentsHome","-1") +  ReadingsNum ("Bewohner","residentsTotalGuestsPresent","-1")  == 1}

Ich habe diese mit den {} in der FHEM Kommondozeile getestet und es kommen die korrekte Werte :
Kein Wert, falls der Ausdruck vor dem == nicht gleich 0 ist und 1 wenn der Ausdruck 0 ist. Also genau das, was ich will.
Setzte ich dies in dies genauso in den ALARM - "Bedingungsfeld" ein, so bleibt der Ausdruck auch nach Parameter setzen und fhem speichern erhalten.
Wechsele ich aber einmal in einen anderen Raum und kehre zur Alarmanlage wieder zurück, so steht nur noch der Ausdruck
Code: [Auswählen]

{ReadingsNum (


in dem Bedingungsfeld.
Auch wenn ich das Blank zwischen ReadingsNum und "(" weglasse, keine Änderung.
Wo kann ich nachlesen, was ich falsch gemacht habe.

Dies sind auch zwei Punkte, vor denen ich jetzt kapituliere.



Prof. Dr. Peter Henning

Achtung, bei den notify-Devices gilt nur ein eingeschränkter Satz von Regeln für reguläre Ausdrücke. Ich habe mir deshalb erlaubt, die |-Zeichen als Trenner in dem Attribut zu verwenden. Wenn man sie also in einem regulären Ausdruck einsetzen will: \| sollte gehen.

LG

pah

UweUwe

Hi
war leider noch nicht die Lösung:

Inhaltlich richtig sollte sein.
TFOpen.warn:.*[TF].*|$EVENT|on   
gemäss der aktuellen Post setze ich jetzt ein:
TFOpen.warn:.*[TF].*\|$EVENT\|on
Angezeigt wird dann nach dem Abspeichern:
TFOpen.warn:.*[TF].*\
in den alarmsettings von TFOpen.warn steht dann
alarm4,|TFOpen.warn:.*[TF].*\|$EVENT\|on|$EVENT|on
Es verändert sich beim Abspeichern auch der Nachrichtenteil 1 des TFOpen.warn von
$EVENT
auf
$EVENT\

Für meine Bedingung für den Alarm sehe ich in dem Vorschlag keine Handhabe. In dem Perl code:
{ReadingsNum ("Bewohner","residentsHome","-1") +  ReadingsNum ("Bewohner","residentsTotalGuestsPresent","-1")  == 1} ("Bewohner","residentsHome","-1") +  ReadingsNum ("Bewohner","residentsTotalGuestsPresent","-1")  == 1}
ist aus meiner Sicht kein
Zitat|-Zeichen

Ich habe "Prosa" weggelassen, da für den Leser so übersichtlicher. Oben ist ja alles erklärt, sollte aber auch so klar sein.




Prof. Dr. Peter Henning

Ich habe aber nicht die Zeit, mich durch seitenlange Posts zu wühlen, sorry.

LG

pah

UweUwe

Das war ja der Hintergrund, warum ich alles nochmals zusammengeschrieben und zum Drüberfliegen zusammengefasst habe. Wie soll ich es vorbereiten? Mach ich gerne .

UweUwe

Hallo, vielen Dank für die Rückmeldung, anbei die Koplettinformation komprimiert. Verstehe den Hintergrund.
1. "Bedingung" für einen  Alaramlevel als Perl-Code.
Perl-Code ist in der FHEM-Kommandozeileverifiziert, zeigt keine Syntayfehler und liefert die korrekten Ergebnisse aus der FHEM Kommandozeile:
{ReadingsNum ("Bewohner","residentsHome","-1") +  ReadingsNum ("Bewohner","residentsTotalGuestsPresent","-1")  == 1} ("Bewohner","residentsHome","-1") +  ReadingsNum ("Bewohner","residentsTotalGuestsPresent","-1")  == 1}
Nach dem | Parameter setzen | Save config | Wechsel und Zurückwechsel des Raumes Alarmanlage|  zeigt sich als Perl-Code in der Bedingsspalte für den Alarm:
{ReadingsNum ( 
2. Auslösung durch RegExp im Bereich Sensoren für das Beispiel Kontrollrunde "Öffnung von Fenstern oder Türen" im https://wiki.fhem.de/wiki/Modul_Alarm.
Beispiel wurde identisch übernommen, die Tür und Fensternamen jedoch geändert, Systemmatic beibehalten.
Der String für "Auflösung durch RegExp" für das dummy TFOpen.warn wird nach | Parammeter setzen | Save config | Wechsel und Zurückwechsel des Raumes Alarmanlage von
TFOpen.warn:.*[TF].*|$EVENT|on
nach TFOpen.warn:.*[TF].* verändert. der Vorschlag mit dem
Zitat|-Zeichen
bringt folgende Veränderung. Der String wird dann von TFOpen.warn:.*[TF].*\|$EVENT\|on nach TFOpen.warn:.*[TF].*\ verändert.
Im attr alarmsettings von TFOpen.warn steht: alarm4,|TFOpen.warn:.*[TF].*\|$EVENT\|on|$EVENT|on. Auch wird der Message Part 1 von $EVENT nach $EVENT\ verändert.

Vielen Dank für die Bearbeitung.



UweUwe

Hallo,
fehlt noch Information von meiner Seite. Liefere ich gerne nach. Merci Uwe

gamauf

Hallo Uwe!
So ganz verstehe ich dein Problem auch nicht, aber was ich verstehe ist, dass deine Bedingung ein "|"-Symbol beinhaltet und das Alarm-Modul damit nicht umgehen kann.
Dieses Thema wurde hier im Thread bereits vor einem Jahr besprochen:
https://forum.fhem.de/index.php/topic,26893.msg746113.html#msg746113 (und folgende)
Anscheinend hat das "Escapen" von reservierten Symbolen im Alarm-Modul noch nicht die Testphase verlassen.

Als Workaround würde ich die, im Alarm-Modul nicht funktionierende, Abfrage auslagern in, entweder in ein Notify, das wiederum das Ergebnis in z.B. ein Dummy schreibt, oder ein userReading im abzufragenden Device und im Alarm-Modul dann nur mehr den (einfachen) Wert des Dummies bzw. des userReadings abfragen

LG
Rainer.

UweUwe

Hallo gamauf,
danke für die Antwort.
Ich sehe nicht, dass meine Bedingung (Punkt 1) ein | beinhaltet. Es soll sich ja um einen "Perl-Code" handeln. Wenn das Ergebnis des Perl-Codes ist, so wird der Alarm geschärft.
{ReadingsNum ("Bewohner","residentsHome","-1") +  ReadingsNum ("Bewohner","residentsTotalGuestsPresent","-1")  == 1} ("Bewohner","residentsHome","-1") +  ReadingsNum ("Bewohner","residentsTotalGuestsPresent","-1")  == 1}

Mein Punkt 2 (Auslösung durch RegExp im Bereich Sensoren für das Beispiel Kontrollrunde "Öffnung von Fenstern oder Türen" im https://wiki.fhem.de/wiki/Modul_Alarm) hingegen beinhaltet ein |. Dies ist aber exakt das Beispiel aus dem WIKI. TFOpen.warn:.*[TF].*|$EVENT|on Ich gehe davon aus, dass dieses Beispiel getestet worden ist.
Deshalb auch meine Frage, habe ich irgendwo einen grundlegenden Denkfehler? Ich suche den Fehler bei mir.
Auch die Antwort von pah:
ZitatAchtung, bei den notify-Devices gilt nur ein eingeschränkter Satz von Regeln für reguläre Ausdrücke. Ich habe mir deshalb erlaubt, die |-Zeichen als Trenner in dem Attribut zu verwenden. Wenn man sie also in einem regulären Ausdruck einsetzen will: \| sollte gehen.
besagt , dass es gehen müsste.
Aber nochmals, danke dass du dich darum kümmerst. Parallel versuche ich mich mit der alternativen Lösung.