Wie kann ein Tür- und Batteriezustand gPlot für Fhem (HM-Sec-SC) erstellt werden?

Um die digitalen Werten, wie Tür auf oder zu in einem Plot mit dem Batterie Zustand auszugeben, kann wie folgt vorgegangen werden. Der HM-Sec-SC Funk-Tür-/Fensterkontakt gibt die Werte ja zurück. Die rote Linie gibt den Türzustand aus ob die Tür auf oder zu ist bzw. war.

Plot der Schaltzustände der Tür und der Batterie aus Fhem
Plot der Schaltzustände der Tür und der Batterie aus Fhem

Diese /fhem/www/gplot/myTerrassenTuer.gplot Datei speichern:


/*
   myTerrassenTuer.gplot Version 1.0 vom 07.09.2013

   Dieses GNU-Plot Script (myTerrassenTuer.gplot) gibt zwei Zustaende des Tuerkontakt als Kurven aus und zwar
   den Batterie-Zustand, den Status der Tuer.

   (C) 2013 Thomas Wenzlaff http://www.wenzlaff.de

   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see {http://www.gnu.org/licenses/}.
*/

set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title 'Terrassen Tuer'

set ytics ("Zu" 0, "Ok" 0.8, "Auf" 1)
set y2tics ("Zu" 0, "Ok" 0.8, "Auf" 1)
set yrange [-0.1:1.1]
set y2range [-0.1:1.1]
set ylabel ""
set y2label ""

#FileLog 3:wz_Tuerschalter:0:$fld[2]=~"open"?1:0
#FileLog 4:wz_Tuerschalter:0:$fld[2]=~"ok"?0:0.8

plot \
       "< awk '/wz_Tuerschalter/ {print $1, $3~/open/? 1 : 0; }' <IN>"\
       using 1:2 title 'Tuer' with steps
       "< awk '/wz_Tuerschalter/ {print $1, $3~/ok/? 1 : 0; }' <IN>"\
       using 1:2 title 'Batterie' with steps

Folgende Einträge sind in der fhem.cfg Datei noch nötig:

# TW Tuerschalter
define wz_Tuerschalter CUL_HM 000000
attr wz_Tuerschalter .devInfo 000000
attr wz_Tuerschalter .stc 80
attr wz_Tuerschalter actCycle 028:00
attr wz_Tuerschalter actStatus alive
attr wz_Tuerschalter expert 2_full
attr wz_Tuerschalter firmware 2.1
attr wz_Tuerschalter model HM-SEC-SC
attr wz_Tuerschalter peerIDs 
attr wz_Tuerschalter room Wohnzimmer
attr wz_Tuerschalter serialNr KEQ0000000
attr wz_Tuerschalter subType threeStateSensor

define FileLog_wz_Tuerschalter FileLog ./log/wz_Tuerschalter-%Y.log wz_Tuerschalter
attr FileLog_wz_Tuerschalter logtype text
attr FileLog_wz_Tuerschalter room Wohnzimmer

define SVG_FileLog_wz_Tuerschalter_1 SVG FileLog_wz_Tuerschalter:myTerrassenTuer:CURRENT
attr SVG_FileLog_wz_Tuerschalter_1 room Wohnzimmer

(Besucher 7.804 und 6 Heute)

9 Antworten auf „Wie kann ein Tür- und Batteriezustand gPlot für Fhem (HM-Sec-SC) erstellt werden?“

  1. Hallo Thomas,

    wenn die Zeile
    #FileLog 3:wz_Tuerschalter:0:$fld[2]=~”open”?1:0

    wie folgt geändert wird, kann auch die Zeit der offenen Tür angezeigt werden!
    #FileLog 3:wz_Tuerschalter:0:$fld[3]=~”open”?1:0

    Ohne diese Änderung produziert das Signal “open” nur einen Ausschlag und läuft mit “Zu” weiter, wie man auch schon auf Deinem Beispielbild sehen kann! @;->

    Die Plotfunktion kann zumindest in der aktuellen Version von fhem wie folgt vereinfacht werden.
    plot “” using 1:2 axes x1y2 title ‘Tuer’ ls l0 lw 1 with steps,\
    “” using 1:2 axes x1y2 title ‘Batterie’ ls l1 lw 1 with steps

    Sonst aber eine super Anleitung, bzw. ein super Beispiel das mir sehr geholfen hat.
    Ich hoffe auch etwas hilfreiches beigetragen zu haben.

    Gruß
    Linus

    1. Ich finde die Idee toll!
      Mit den Settings von Linus bekomme ich folgenden Logeintrag:
      2014.11.23 21:50:09 3: eval: $fld[3]=~”open”?1:0
      2014.11.23 21:50:09 1: PERL WARNING: Use of uninitialized value $fld[3] in pattern match (m//)
      Irgendeine Idee?

      Gruß
      Ron

      1. Die Anwendung einer RegEx auf eine nicht definierte Variable (hier die nicht gefüllte $fld[3]) führt zu dieser Warnung.
        Abhilfe: VOR Anwendung der RegEx prüfen, ob Variable einen Inhalt hat. Ergibt den Code:
        $fld[3]&&$fld[3]=~“open“?1:0
        Bedeutet:
        Wenn $fld[3] definiert ist UND ‘open’ enthält, liefere ‘1’ zurück, sonst ‘0’. Ist nun nix drin, wird die RegEx nicht ausgeführt und kann keine Warnung produzieren :-).
        Oder man schnappt sich nicht jede Zeile, sondern nur die mit ‘open’ oder ‘closed’ -> (open|closed) statt ‘.*’

  2. Hallo Thomas/Linus

    Unten ist ein Auszug meines Logfiles:

    2014-01-06_22:57:00 SA.Poolpumpe set_on
    2014-01-06_22:57:00 SA.Poolpumpe level: 100 %
    2014-01-06_22:57:00 SA.Poolpumpe pct: 100
    2014-01-06_22:57:00 SA.Poolpumpe deviceMsg: on (to HMLAN1)
    2014-01-06_22:57:00 SA.Poolpumpe on
    2014-01-06_22:57:00 SA.Poolpumpe timedOn: off
    2014-01-06_23:14:06 SA.Poolpumpe set_off
    2014-01-06_23:14:07 SA.Poolpumpe level: 0 %
    2014-01-06_23:14:07 SA.Poolpumpe pct: 0
    2014-01-06_23:14:07 SA.Poolpumpe deviceMsg: off (to HMLAN1)
    2014-01-06_23:14:07 SA.Poolpumpe off
    2014-01-06_23:14:07 SA.Poolpumpe timedOn: off

    Wenn ich die die vorgeschlagene Definition nehme, macht er im Plot eine Nadel, wenn "on" auftritt. Er schaltet aber nicht um, bis "off" kommt. Wie kann ich "off" der Null zuweisen ?

    Gruß
    Gernot

  3. ich bekomme den gleichen Fehler beim verwenden von der Zeile
    2014.11.23 21:50:09 3: eval: $fld[3]=~”open”?1:0
    2014.11.23 21:50:09 1: PERL WARNING: Use of uninitialized value $fld[3]

    habt ihr eine Lösung gefunden ..

    MFG Harway2007

  4. $fld[3] ist in diesen Fällen “undefined”, also nicht vorhanden und dann kann keine RegEx angewendet werden. Möchte man die Meldung nicht, muss man vorher prüfen, ob $fld[3] auch etwas enthält und nur dann die RegEx anwenden, etwa so:
    $fld[3]&&$fld[3]=~”open”?1:0;
    Oder man wählt in der Dropdown-Liste nur die Zeilen aus, die SICHER die gewünschte Spalte enthalten.

  5. @Gernot: da rätsel ich auch noch dran herum. Es gibt nur eine “Nadel” mit dieser Funktion. Und “steps” helfen auch nicht, da sie zwar Flächen anzeigen, aber leider zwischen “closed” und “open”, nicht andersherum.
    Es wird wohl darauf hinaus laufen, ein eigenes Logfile nur für die “open” und “close” der Kontaktsensoren zu erzeugen, und dort vor jedem “close” ein künstliches “open” einzufügen, damit der Graph auch genau bis dahin geplottet wird. Natürlich dürfen nur geänderte Zustände (event-on-change-reading) erfasst werden, keine zyklischen Status-Meldungen.

  6. Hier eine (1) Möglichkeit, saubere Plots von digitalen Zuständen (wie z. B. Bewegunsgerkennung, Fenster offen/zu usw.) zu erzeugen.
    Beispieldevice: Fensterkontakt (etwa HM-SEC-SCo),
    bei mir umbenannt je nach Raum, z. B. fürs Wohnzimmer: FKO.WOZ.
    Das Grundproblem ist, dass es bei einer Zustandsänderung von ‘open’ nach ‘closed’ und andersherum eigentlich genau im Zeitpunkt der Änderung zwei Werte geben müsste, um saubere rechteckige Plots zu bekommen. Aber die Darstellungsprobleme sind vermutlich bekannt.
    Diese Lösung hier erzeugt mittels eines eigenen Logfiles für die hier als Beispiel genommenen Kontaktsensoren (alle gleichzeitig) bei Statusänderungen ZWEI Einträge pro Änderung, anstatt eines einzigen ‘open’ oder ‘closed’. Damit bei der Erstellung der Plots keine mitunter schwer nachvollziehbaren Perlkonstrukte verwendet werden müssen, werden die textliche Statusänderungen schon im Logfile als ‘0’ für ‘closed’ und ‘1’ für ‘open’ mitgeloggt.
    Wichtig: die Sensoren müssen alle das ‘attr FKO.WOZ event-on-change-reading .*’ gesetzt haben, damit nicht zyklische Statusmeldungen unerwünschte Ausschläge erzeugen.
    Der Code in der fhem.cfg:
    define FKO_Status dummy
    define FileLog_FKO_Status FileLog ./log/Status_FKO-%Y.log FKO_Status
    attr FileLog_FKO_Status logtype text

    define FKO_Status_notify notify FKO\.\w\w\w:(open|closed).* {\
    #Log( 3, “$NAME Status: $EVENT”);;\
    my $is_open = $EVENT eq “open” ? 1 : 0;;\
    my $isnot_open = $is_open ? 0 : 1;;\
    fhem “set FKO_Status $NAME $isnot_open”;;\
    fhem “set FKO_Status $NAME $is_open”;;\
    }

    Das ist schon alles. Die RegEx muss natürlich auf die eigenen Meldungen angepasst werden. Die Logfiledefinitionen sind leicht einleuchtend. Der notify benutzt zwei Variablen. Eine ($is_open) ist ‘1’, wenn das Event ein ‘open’ war, sonst ‘0’. Und die zweite enthält immer das Gegenteil von ‘0’ und ‘1’, womit künstlich der bisherige Zustand als Logfileeintrag erzeugt werden kann.
    Findet jetzt ein Event statt, also öffnet jemand das Fenster im Wohnzimmer, springt der Kontaktstatus auf ‘open’. Der notify bekommt das mit und schreibt in das eigene Logfile zuerst den alten Status ($isnot_open, also ‘0’) und zum selben Zeitpunkt den neuen Status ($is_open, also ‘1’). Beim Event ‘closed’ vice versa.
    Damit lässt sich der Plot mit einer einfachen Linie und auf das jeweilige Zimmer (Device) aus der Dropdownliste erzeugen. Für den Homematic-Sensor ist das Spalte 4 und für meine Geräte dann z. B. FKO.Status.FKO.WOZ auswählen, fertig. Keine Hampelei mit $fld[3] usw. Die perfekte Kurve bzw. perfekte Rechtecke. Als Tics kann man noch ‘(“auf” 1, “zu” 0)’ setzen, bringt ein wenig kosmetischen Glanz in die Sache. Oder die Range zwischen ‘0’ und ‘1’ festlegen, damit die Kurve auch gut zu sehen ist.
    Ob man nun für jeden Sensor einen dedizierten Plot erzeugt oder bunt gemischt alle in einem, bleibt jedem selbst überlassen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.