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
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...
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.
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
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
$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
ein$val=($val=~"present"?1:0)
sollte es auch tun.
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
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.
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?
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.
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.
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.
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.
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.
Eventuell fet hier auch noch das event-on-change-reading im presence Gerät.
Gesendet von meinem Doogee S60 mit Tapatalk
Du fragst auf "presence" ab, der Wert heißt aber "present"
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:::
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...
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.
Am einfachsten nur im fhem bearbeitet. Dann auf save und die Änderung wird sofort aktiv.
Gesendet von meinem SM-G930F mit Tapatalk
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
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
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?