FHEM Forum

FHEM => Sonstiges => Thema gestartet von: grossmaggul am 17 Februar 2020, 13:55:11

Titel: [Gelöst] Mal wieder: Anwesenheit plotten
Beitrag von: grossmaggul am 17 Februar 2020, 13:55:11
Hallo,

ich frage mich, ist es überhaupt möglich mit dem Plotassistenten aus DBLog einen vernünftigen Plot der Anwesenheit zu erzeugen oder muß man sich wohl oder übel mit kryptischen Regexen rumschlagen? Irgendwie werde ich nicht so recht fündig und erfolgreich bin ich bisher auch nicht gewesen.;-)

Beispiel, dieser Versuch...
1. Bild

...endet in sowas:
2. Bild
(presence liefert je nach Status "presence" oder "absent")

Mache ich da grundsätzlich etwas falsch oder geht es wirklich nur "händisch"?

gm


Titel: Antw:Mal wieder: Anwesenheit plotten
Beitrag von: KernSani am 17 Februar 2020, 13:59:53
Das geht vernünftig nur "händisch", wenn du damit meinst, die gplot-Datei zu editieren. Ich kann dir heute abend ein Beispiel anhängen...
Titel: Antw:Mal wieder: Anwesenheit plotten
Beitrag von: grossmaggul am 17 Februar 2020, 14:02:08
ZitatDas geht vernünftig nur "händisch", wenn du damit meinst, die gplot-Datei zu editieren.
Ja, das meinte ich, das ist schade, weil ich die Regexe einfach nicht verstehe.:-(

ZitatIch kann dir heute abend ein Beispiel anhängen...
Das wäre nett.
Titel: Antw:Mal wieder: Anwesenheit plotten
Beitrag von: KernSani am 17 Februar 2020, 22:22:55
Hier mal mein gplot (gekürzt, eigentlich habe ich 6 Residents da drin) mit Kommentaren versehen. Frag mich bitte nicht, warum ich die G-Tags direkt plotte und nicht die zugehörigen Residents/Guests.


# Created by FHEM/98_SVG.pm, 2017-02-06 23:05:55
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 '<TL>'
# wir mappen Anwesend auf 1, alles andere auf 0, entsprechend werden die "Tics" gesetzt
set ytics ("Abwesend" 0, "Anwesend" 1)
set y2tics ("Abwesend" 0, "Anwesend" 1)
set grid
set ylabel "Presence"
set y2label ""
# wir setzen eine Y-Range ein bisschen größer, dadurch gibt es einen Versatz in der Höhe und sich überschneidende Blöcke werden besser unterscheidbar (wenn einer auf y1 und der andere auf y2 sitzt)
set yrange [0:1.1]

# das eigentliche regex-search-replace: ersetze jeden möglichen Status mit: Wenn "present" dann 1, sonst 0.
# Beispiel für G-Tag
#mysqlDbLog gTag_red_BT:state:::$val=~s/(present|absent|maybe|CONNECTED|DISCONNECTED|disconnected|disabled|statusRequest)(\d*).*/$1eq"present"?1:0/eg
# Beispiel für RESIDENT via Locative (Geofancy)
#mysqlDbLog rr_Oli:presence:::$val=~s/(present|absent)(\d*).*/$1eq"present"?1:0/eg

plot "<IN>" using 1:2 axes x1y2 title 'David' ls l1fill lw 1 with steps
     "<IN>" using 1:2 axes x1y1 title 'Oli' ls l2fill lw 1 with steps


ich hoffe das hilft für den Anfang.

Grüße,

Oli
Titel: Antw:Mal wieder: Anwesenheit plotten
Beitrag von: grossmaggul am 18 Februar 2020, 09:50:09
Vielen Dank!

Leider funktioniert es immer noch nicht, meine gplot Datei:
# Created by FHEM/98_SVG.pm, 2020-02-17 13:26:57
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 'Anwesenheit Samsung'
set ytics "Abwesend" 0, "Anwesend" 1
set y2tics
set grid ytics
set ylabel "Anwesenheit"
set y2label ""
set yrange [0:1.1]

#logdb samsung_fon:presence

logdb samsung_fon:presence:::$val=~s/(presence|absent)(\d*).*/$1eq"presence"?1:0/eg

plot "<IN>" using 1:2 axes x1y1 title 'Anwesenheit' ls l2fill lw 1 with steps

Mein Problem dabei, ich verstehe die Regex nicht wirklich.:-(

Und list des samsung_fon
Internals:
   DEF        event unifi_ap_ac_lr:android-ba7e5117eb64998d:.disconnected unifi_ap_ac_lr:android-ba7e5117eb64998d:.connected
   EVENT_ABSENT unifi_ap_ac_lr:android-ba7e5117eb64998d:.disconnected
   EVENT_PRESENT unifi_ap_ac_lr:android-ba7e5117eb64998d:.connected
   FUUID      5e4a6136-f33f-f310-fec0-e9fa1a449206416d
   MODE       event
   NAME       samsung_fon
   NOTIFYDEV  unifi_ap_ac_lr,global
   NR         284
   NTFY_ORDER 50-samsung_fon
   STATE      present
   TYPE       PRESENCE
   Helper:
     DBLOG:
       presence:
         logdb:
           TIME       1582015522.58163
           VALUE      present
   READINGS:
     2020-02-18 09:41:30   model           event
     2020-02-18 09:45:22   presence        present
     2020-02-18 09:45:22   state           present
   helper:
     CURRENT_STATE present
     PRESENT_COUNT 0
Attributes:
   DbLogExclude .*
   DbLogInclude presence
   absenceTimeout 10:00
   event-on-update-reading presence
   presenceTimeout 10
   room       9.6_HomeStatus


Titel: Antw:Mal wieder: Anwesenheit plotten
Beitrag von: ch.eick am 18 Februar 2020, 15:34:34
$val=~s/(presence|absent)(\d*).*/$1eq"presence"?1:0/eg

$val wird überschrieben

s / / /eg   ist suche was zwischen den ersten// steht und ersetze mit dem was zwischen den zweiten// steht.

Es wird entweder presence oder absent gefolgt von mehreren dezimalziffern und eventuellen Folgezeichen erwartet.

Trifft das ein wird ersetzt.
$1 beinhaltet das Ergebnis der ersten Suchgruppe ( | ) , also presence oder absent.

Ist $1 gleich presence, dann wird 1 gesetzt, wenn nicht dann 0

Also steht in $val entweder 1 oder 0

Gruß Christian

Gesendet von meinem SM-G930F mit Tapatalk
Titel: Antw:Mal wieder: Anwesenheit plotten
Beitrag von: justme1968 am 18 Februar 2020, 15:50:41
ein$val=($val=~"present"?1:0)sollte es auch tun.
Titel: Antw:Mal wieder: Anwesenheit plotten
Beitrag von: ch.eick am 18 Februar 2020, 15:53:05
Ich habe es ihm nur versucht zu erklären;-)

Das zweite $val ist eventuell auch noch zu viel.

Gesendet von meinem SM-G930F mit Tapatalk
Titel: Antw:Mal wieder: Anwesenheit plotten
Beitrag von: justme1968 am 18 Februar 2020, 16:04:21
ich weiss :). aber auch das geht mit der kurzen version einfacher.

bei FileLog geht es ohne die zuweisung, DbLog braucht sie glaube ich (weil intern nicht das ergebnis des eval ausgewertet wird sondern tatsächlich was nach dem eval in $val steht.
Titel: Antw:Mal wieder: Anwesenheit plotten
Beitrag von: grossmaggul am 18 Februar 2020, 18:35:36
Danke für die Erklärung, so richtig verstanden habe ich es aber immer noch nicht, ich werde es mir noch ein paar mal zu Gemüte führen.

Nur, das Problem, der Graph sieht immer noch nicht so aus, wie ich mir das vorstelle, so sah der auch schon aus, als ich den Plot mit dem Assistenten ausgeführt habe.

Wieso geht der Balken nicht auf 1 sondern nur bis 0?
Titel: Antw:Mal wieder: Anwesenheit plotten
Beitrag von: justme1968 am 18 Februar 2020, 18:51:10
balken sind bei binären oder wenigen diskret zuständen nicht sehr sinnvoll. stell map auf steps und schau das du mehr als 1-2 werte hast.
Titel: Antw:Mal wieder: Anwesenheit plotten
Beitrag von: grossmaggul am 18 Februar 2020, 19:29:33
Ich habe bereits auf steps stehen(siehe oben meine gplot Datei), Balken war falsch ausgedrückt, sorry.

Zitatschau das du mehr als 1-2 werte hast.
Das Presenzmodul erzeugt doch all paar Sekunden einen Wert, sollte also eigentlich reichen.
Titel: Antw:Mal wieder: Anwesenheit plotten
Beitrag von: justme1968 am 18 Februar 2020, 19:54:39
was sagt denn 'show preprocessed input' ?

ps: alle paar sekunden den gleichen wert zu loggen ist nicht sinnvoll. du solltest event-on-change-reading und event-min-interval
passend setzen.
Titel: Antw:Mal wieder: Anwesenheit plotten
Beitrag von: grossmaggul am 18 Februar 2020, 20:50:18
Zitatwas sagt denn 'show preprocessed input' ?
Auszug hängt dran.

Zitatalle paar sekunden den gleichen wert zu loggen ist nicht sinnvoll.
Schon klar, habe ich jetzt nur in der Testphase so eingestellt, wenn's denn irgendwann mal klappen sollte, stelle ich es um.
Titel: Antw:Mal wieder: Anwesenheit plotten
Beitrag von: justme1968 am 18 Februar 2020, 20:52:56
da müssen 0 oder 1 stehen damit es geht. solange noch present auftaucht stimmt das umsetzen auf 0/1 nicht und es kann nicht gehen.
Titel: Antw:Mal wieder: Anwesenheit plotten
Beitrag von: Frank_Huber am 18 Februar 2020, 21:14:20
Eventuell fet hier auch noch das event-on-change-reading im presence Gerät.


Gesendet von meinem Doogee S60 mit Tapatalk

Titel: Antw:Mal wieder: Anwesenheit plotten
Beitrag von: KernSani am 18 Februar 2020, 23:21:41
Du fragst auf "presence" ab, der Wert heißt aber "present"
Titel: Antw:Mal wieder: Anwesenheit plotten
Beitrag von: grossmaggul am 19 Februar 2020, 09:54:22
Es klappt einfach nicht.:-(

ZitatEventuell fet hier auch noch das event-on-change-reading im presence Gerät.
Nein, das ist da.

Hier das list des PRESENCE Devices
Internals:
   CHANGED   
   DEF        event unifi_ap_ac_lr:iphonese:.disconnected unifi_ap_ac_lr:iphonese:.connected
   EVENT_ABSENT unifi_ap_ac_lr:iphonese:.disconnected
   EVENT_PRESENT unifi_ap_ac_lr:iphonese:.connected
   FUUID      5e42aac2-f33f-f310-83dc-830f7a4513e07131
   MODE       event
   NAME       maggi_fon
   NOTIFYDEV  global,unifi_ap_ac_lr
   NR         280
   NTFY_ORDER 50-maggi_fon
   STATE      present
   TYPE       PRESENCE
   Helper:
     DBLOG:
       presence:
         logdb:
           TIME       1582064473.81366
           VALUE      present
   READINGS:
     2020-02-18 23:20:33   model           event
     2020-02-19 09:39:05   presence        present
     2020-02-19 09:39:05   state           present
   helper:
     CURRENT_STATE present
     PRESENT_COUNT 0
Attributes:
   DbLogExclude .*
   DbLogInclude presence
   absenceTimeout 10:00
   event-min-interval 60
   event-on-change-reading presence
   presenceTimeout 10
   room       9.6_HomeStatus




Zitat von: KernSaniDu fragst auf "presence" ab, der Wert heißt aber "present"
Ja, das ist mir auch schon aufgefallen.
Ich habe da auch einiges durcheinandergewürfelt, daher nochmal alles neu aufgebaut, trotzdem funktioniert es nicht.

# Created by FHEM/98_SVG.pm, 2020-02-19 09:29:21
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 '<L1>'
set ytics "absent" 0, "present" 1
set y2tics
set grid
set ylabel "Anwesenheit"
set y2label ""
set yrange [0:1.1]

#logdb maggi_fon:presence
#$val=($val=~"presence"?1:0)
logdb maggi_fon:presence:::$val=~s/(present|absent)(\d*).*/$1eq"presence"?1:0/eg

plot "<IN>" using 1:2 axes x1y1 title 'Da oder nicht' ls l1fill lw 1 with steps


"show preprocessed input" zeigt, daß die Umsetzung nicht funktioniert:

Zitatget logdb HISTORY INT 2020-02-19_00:00:00 2020-02-19_23:59:59 maggi_fon:presence

2020-02-19_09:44:40 maybe absent
2020-02-19_09:45:10 absent
#maggi_fon:presence:::

Titel: Antw:Mal wieder: Anwesenheit plotten
Beitrag von: Beta-User am 19 Februar 2020, 13:43:26
Versuchs mal mit
logdb maggi_fon:presence:::$val=~s/(present|absent)(\d*).*/$1eq"present"?1:0/eg
Da du das ganze scheinbar für mehrere Presence-Dinge nutzen willst, würde ich mal eine Blick ins Wiki empfehlen, konkret nach https://wiki.fhem.de/wiki/SVG
Da sind (nur) zwei Beispiele drin, eines für logDB und eines für FileLog, aber wenn man es "richtig" macht, muß man hinterher nur noch ein paar Werte im "plotReplace"-Attribut des SVG-Geräts festlegen und hat eine einfach nutzbare .gplot für alle Presence-Geräte...


Titel: Antw:Mal wieder: Anwesenheit plotten
Beitrag von: grossmaggul am 19 Februar 2020, 19:15:13
Ich muß da mal was Grundsätzliches fragen, wo editiere ich die gplot Datei am besten in der FHEM GUI oder im Terminal direkt im gplot Ordner?
Muß man irgendwas anstoßen, wenn man Änderungen gemacht hat?(shutdown restart, cache des Browsers löschen oder so)

ZitatVersuchs mal mit
Habe ich bereits, aber das brachte auch nichts.

ZitatDa du das ganze scheinbar für mehrere Presence-Dinge nutzen willst
Das möchte ich schon, allerdings würde ich das erstmal grundsätzlich zum Laufen bekommen und da hapert's ja im Moment noch.:-/

Ich muß das jetzt eh auf Eis legen, da ich ab morgen zwei Wochen weg bin und nicht dazu komme mich darum zu kümmern.
Titel: Antw:Mal wieder: Anwesenheit plotten
Beitrag von: ch.eick am 19 Februar 2020, 20:11:22
Am einfachsten nur im fhem bearbeitet. Dann auf save und die Änderung wird sofort aktiv.

Gesendet von meinem SM-G930F mit Tapatalk

Titel: Antw:Mal wieder: Anwesenheit plotten
Beitrag von: Beta-User am 20 Februar 2020, 06:58:38
Finde auch, dass es am einfachsten ist, die .gplot via "Edit files" unter FHEMWEB zu bearbeiten. Geht man da auf "Save ...", wird die Datei auch gleich neu geladen und man kann direkt unter "show preprecessed ..." die Auswirkungen testen (jedenfalls habe ich das so in Erinnerung).

Zum eigentlichen... Ist schon "komisch", manchmal übersehe ich scheinbar deswegen das Wesentliche, weil ich gar nicht auf den Gedanken gekommen wäre, bestimmte Punkte zu ändern (wie hier das mit dem "#"). Statt:
#logdb maggi_fon:presence
#$val=($val=~"presence"?1:0)
logdb maggi_fon:presence:::$val=~s/(present|absent)(\d*).*/$1eq"presence"?1:0/eg

sollte da m.E. auch nur diese eine Zeile, eingeleitet mit "#" stehen:
#logdb maggi_fon:presence:::$val=~s/(present|absent)(\d*).*/$1eq"presence"?1:0/eg
Titel: Antw:Mal wieder: Anwesenheit plotten
Beitrag von: grossmaggul am 20 Februar 2020, 09:34:30
Ich war davon ausgegangen, daß das # ein Kommentarzeichen ist.

Was es wohl nicht ist, denn nachdem ich die Zeile, so wie Du geschrieben hast, geändert habe und die anderen vermeintlichen Kommentarzeilen entfernt habe, scheint es zu funktionieren.

# Created by FHEM/98_SVG.pm, 2020-02-20 09:32:57
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 '<L1>'
set ytics "absent" 0, "present" 1
set y2tics
set grid
set ylabel "Anwesenheit"
set y2label ""
set yrange [0:1.1]

#logdb maggi_fon:presence:::$val=($val=~"present"?1:0)

plot "<IN>" using 1:2 axes x1y1 title 'Da oder nicht' ls l1fill lw 1 with steps
Titel: Antw:[Gelöst] Mal wieder: Anwesenheit plotten
Beitrag von: Beta-User am 20 Februar 2020, 11:44:22
Jein, das wäre aus gnuplot-Sicht tatsächlich eine Kommentarzeile.

Über diesen Mechanismus wird aber eine "Vorbehandlung" durch das SVG-Modul vorgenommen: Das wertet die Kommentarzeilen aus und führt dabei u.a. auch die Ersetzungen aus "plotReplace" aus...

Hoffe, der Schritt zur "Generalisierung" ist jetzt mit diesem ergänzenden Hinweis auch vollends einfach?