DbLogInclude: Wie mehrere Readings loggen wenn ein Reading matched

Begonnen von stefanru, 26 November 2019, 21:01:08

Vorheriges Thema - Nächstes Thema

stefanru

Hi,

ich habe ein Geofancy Device und würde gern nur Zeiten loggen wenn ich die Arbeit (work) verlasse.
Mich interessiert also die Readings "lastPosArr_rr_Stefan", "lastPosDep_rr_Stefan" und "lastPosDur_rr_Stefan", aber nur wenn das Reading "lastDep" = rr_Stefan work.
Kann man irgendwie mit einer Bedingung, also Reading "lastDep" = rr_Stefan work die anderen oben erwähnten readings zu diesem Event mitloggen?

Zur Veranschaulichung hier mal ein Auszug aus DbLog der zurzeit entsteht mit:


2019-11-26 19:25:59 geofancy GEOFANCY lastArr: rr_Stefan home lastArr rr_Stefan home
2019-11-26 19:25:59 geofancy GEOFANCY lastPosArr_rr_Stefan: 2019-11-26 19:09:00 lastPosArr_rr_Stefan 2019-11-26 19:09:00
2019-11-26 19:25:59 geofancy GEOFANCY lastPosDep_rr_Stefan: 2019-11-26 19:25:57 lastPosDep_rr_Stefan 2019-11-26 19:25:57
2019-11-26 19:25:59 geofancy GEOFANCY lastPosDur_rr_Stefan: 1017 lastPosDur_rr_Stefan 1017
2019-11-26 19:09:03 geofancy GEOFANCY lastArr: rr_Stefan wayhome lastArr rr_Stefan wayhome
2019-11-26 19:09:03 geofancy GEOFANCY lastPosArr_rr_Stefan: 2019-11-26 18:42:39 lastPosArr_rr_Stefan 2019-11-26 18:42:39
2019-11-26 19:09:03 geofancy GEOFANCY lastPosDep_rr_Stefan: 2019-11-26 19:09:00 lastPosDep_rr_Stefan 2019-11-26 19:09:00
2019-11-26 19:09:03 geofancy GEOFANCY lastPosDur_rr_Stefan: 1581 lastPosDur_rr_Stefan 1581
2019-11-26 18:42:43 geofancy GEOFANCY lastDep: rr_Stefan work lastDep rr_Stefan work
2019-11-26 18:42:43 geofancy GEOFANCY lastPosArr_rr_Stefan: 2019-11-26 09:12:44 lastPosArr_rr_Stefan 2019-11-26 09:12:44
2019-11-26 18:42:43 geofancy GEOFANCY lastPosDep_rr_Stefan: 2019-11-26 18:42:39 lastPosDep_rr_Stefan 2019-11-26 18:42:39
2019-11-26 18:42:43 geofancy GEOFANCY lastPosDur_rr_Stefan: 34195 lastPosDur_rr_Stefan 34195
2019-11-26 09:12:47 geofancy GEOFANCY lastArr: rr_Stefan work lastArr rr_Stefan work
2019-11-26 09:12:47 geofancy GEOFANCY lastPosArr_rr_Stefan: 2019-11-26 09:06:35 lastPosArr_rr_Stefan 2019-11-26 09:06:35
2019-11-26 09:12:47 geofancy GEOFANCY lastPosDep_rr_Stefan: 2019-11-26 09:12:44 lastPosDep_rr_Stefan 2019-11-26 09:12:44
2019-11-26 09:12:47 geofancy GEOFANCY lastPosDur_rr_Stefan: 369 lastPosDur_rr_Stefan 369
2019-11-26 09:06:37 geofancy GEOFANCY lastArr: rr_Stefan waywork lastArr rr_Stefan waywork
2019-11-26 09:06:37 geofancy GEOFANCY lastPosArr_rr_Stefan: 2019-11-26 08:23:21 lastPosArr_rr_Stefan 2019-11-26 08:23:21
2019-11-26 09:06:37 geofancy GEOFANCY lastPosDep_rr_Stefan: 2019-11-26 09:06:35 lastPosDep_rr_Stefan 2019-11-26 09:06:35
2019-11-26 09:06:37 geofancy GEOFANCY lastPosDur_rr_Stefan: 2594 lastPosDur_rr_Stefan 2594
2019-11-26 08:23:26 geofancy GEOFANCY lastDep: rr_Stefan home lastDep rr_Stefan home
2019-11-26 08:23:26 geofancy GEOFANCY lastPosArr_rr_Stefan: 2019-11-26 07:56:10 lastPosArr_rr_Stefan 2019-11-26 07:56:10
2019-11-26 08:23:26 geofancy GEOFANCY lastPosDep_rr_Stefan: 2019-11-26 08:23:21 lastPosDep_rr_Stefan 2019-11-26 08:23:21
2019-11-26 08:23:26 geofancy GEOFANCY lastPosDur_rr_Stefan: 1631 lastPosDur_rr_Stefan 1631
2019-11-26 07:56:13 geofancy GEOFANCY lastArr: rr_Stefan home lastArr rr_Stefan home
2019-11-26 07:56:13 geofancy GEOFANCY lastPosArr_rr_Stefan: 2019-11-26 01:58:38 lastPosArr_rr_Stefan 2019-11-26 01:58:38
2019-11-26 07:56:13 geofancy GEOFANCY lastPosDep_rr_Stefan: 2019-11-26 07:56:10 lastPosDep_rr_Stefan 2019-11-26 07:56:10
2019-11-26 07:56:13 geofancy GEOFANCY lastPosDur_rr_Stefan: 21452 lastPosDur_rr_Stefan 21452


Danke und Gruß,
Stefan

DS_Starter

#1
Hallo Stefan,

ja, sowas geht mit dem Attribut valueFn im DbLog.
Hier ein Beispiel ohne es getestet zu haben und die Fehlerfreiheit garantieren zu können (valueFn so setzen):


{
if ($DEVICE eq "geofancy" && $READING =~ /lastPosArr_rr_Stefan|lastPosDep_rr_Stefan|lastPosDur_rr_Stefan/) {
    $IGNORE=1 if(ReadingsVal($DEVICE, "lastDep", "") ne "rr_Stefan work");
  }
}


Es geht darum das Prinzip zu verstehen. Wenn der Event mit Reading lastPosArr_rr_Stefan oder lastPosDep_rr_Stefan oder lastPosDur_rr_Stefan geloggt werden soll, wird der Wert des Readings lastDep geprüft und der Event ignoriert (d.h. nicht geloggt) wenn dessen Wert nicht "rr_Stefan work" ist.

Grüße,
Heiko
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

stefanru

Hi Heiko,

ich danke dir vielmals.
Das Attribut hatte ich schon gesehen, da bin ich aber nicht drauf gekommen.
Ist aber eigentlich ganz klar :-)

Sag mal brauch ich das $DEVICE eq "geofancy" wenn ich das Attribut DbLogValueFn am geofency Gerät definiere?

Danke und Gruß,
Stefan

DS_Starter

#3
ZitatSag mal brauch ich das $DEVICE eq "geofancy" wenn ich das Attribut DbLogValueFn am geofency Gerät definiere?
Nicht zwangsläufig. Aber es dient zur genauen Abgrenzung dass die besagten Readings auch die des Device geofancy sind.
Könnte ja sein andere Devices haben auch diese Readingnamen.


Unsinn, ist schon spät ... nein in diesem Fall brauchst du es nicht. Gibt es dort auch garnicht als Parameter.

Grüße,
Heiko
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

stefanru

Ok,

hat mit dem Device auch nicht funktioniert im Gerät.
Habs mal rausgemacht.
Mal sehen ob es nun klappt.

Gruß und Danke,
Stefan

Frank_Huber

Also ich würde hier instinktiv mit notify oder doif auf das eine Reading triggern und dann mit addlog die gewünschten readi gs loggen.

Gesendet von meinem S60 mit Tapatalk


stefanru

#6
Hi,

ich würde schon das dafür vorgesehene valueFn nehmen.
Leider tut es nicht.

Ich habe jetzt folgendes in valueFn:

{
if ($READING =~ /lastPosArr_rr_Stefan|lastPosDep_rr_Stefan|lastPosDur_rr_Stefan/) {
    $IGNORE=1 if(ReadingsVal($DEVICE, "lastDep", "") ne "rr_Stefan work");
  }
}


Folgendes wurde im Filelog gespeichert:

019-11-28_19:07:16 geofancy lastDep: rr_Stefan work
2019-11-28_19:07:16 geofancy lastPosArr_rr_Stefan: 2019-11-28 11:28:58
2019-11-28_19:07:16 geofancy lastPosDep_rr_Stefan: 2019-11-28 19:07:14
2019-11-28_19:07:16 geofancy lastPosDur_rr_Stefan: 27496


Für mich sieht das ja eigentlich gut aus.
Hat aber nicht gezogen. Irgendeine Idee?

Benötige ich zusätzlich ein DBLogInclude? Ich habe DBLog im DbLogSelectionMode Include laufen.

Wie könnte ich das denn ordentlich testen. Leider sendet die geofanc app das ja immer nur wenn ich einen 'Bereich wirklich verlasse.

Gruß,
Stefan

DS_Starter

Hi Stefan,

genaueres sieht man nur wenn du verbose 4 oder 5 im DbLog einschaltest.

Aber es könnte auch sein dass das Reading "rr_Stefan work" erst NACH den Readings lastPosArr_rr_Stefan,lastPosDep_rr_Stefan,lastPosDur_rr_Stefan gesetzt wird. Dann klappt das nicht so. Dann wäre das Verfahren wie von Frank genannt besser.  :)

DBLogInclude muss natürlich alle Readings beinhalten, die ausgewertet werden sollen, also alle die oben genannten.
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

stefanru

Ok danke.
Ich hatte LogInclude entfernt.

Ich teste mal.

Gruß,
Stefan

stefanru

So, es hat leider noch nicht geklappt.

Erstmal möchte ich lastDep auch nur loggen wenn es "rr_Stefan work" ist.
Scheinbar hat auch das Freizeichen einen einfluss auf das "ne"

Ich habe jetzt mal folgendes

DbLogInclude

lastDep,lastPosArr_rr_Stefan,lastPosDep_rr_Stefan,lastPosDur_rr_Stefan


DbLogValueFn

{
if ($READING =~ /lastPosArr_rr_Stefan|lastPosDep_rr_Stefan|lastPosDur_rr_Stefan|lastDep/) {
    $IGNORE=1 if(ReadingsVal("geofancy", "lastDep", "") !~ /work/);
  }
}


Ich hoffe so funktioniert es. Muss es noch testen.

Danke und Gruß,
Stefan

DS_Starter

Wenn es nicht klappt prüfe bitte was

{ ReadingsVal("geofancy", "lastDep", "") }

eigegeben in der Befehlszeile im FEHEMWEB ausgibt.

Außerdem ist dann DbLog verbose 4 oder 5 ein Hilfsmittel um herauszubekommen was nicht funktioniert.
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

stefanru

Hi Heiko,

es geht nun wunderbar. Ich hätte da aber noch eine Frage dazu.

Ich logge nun meine Arbeitszeit beim Verlassen der Arbeit mit dieser Bedingung:
DbLogInclude
lastDep,lastPosArr_rr_Stefan,lastPosDep_rr_Stefan,lastPosDur_rr_Stefan,rr_Stefan

DbLogValueFn
{
if ($READING =~ /lastPosArr_rr_Stefan|lastPosDep_rr_Stefan|lastPosDur_rr_Stefan|lastDep|rr_Stefan/) {
    $IGNORE=1 if(ReadingsVal("geofancy", "rr_Stefan", "") !~ /left work/ or
(ReadingsVal("geofancy", "rr_Stefan", "") =~ /left work/ and
ReadingsVal("geofancy", "lastPosDur_rr_Stefan", 0) < 1200));
  }
}


Das ist schonmal sehr cool. Jetzt habe ich einen SVG Plot erzeugt und dabei ist mir aufgefallen dass er das Wochenende mit dem Freitagswert einzeichnet.
Ist ja auch klar, der letzte Wert wurde Freitag gelogged und am Wochenende gab es gar keinen Eintrag.

Das könnte ich natürlich mit einem "AT" das SA und SO einen 0 Wert einträgt beheben.
Aber was ist mit Urlaub?

Ist es möglich einen 0 Wert zu erzeugen wenn lastPosDur_rr_Stefan an einem Tag nicht erzeugt wurde?
Ich bräuchte also eine Abfrage auf das DBlog ob an diesem Tag ein Log Eintrag mit lastPosDur_rr_Stefan erzeugt wurde und wenn nicht würde ich gern einen mit 0 als Wert erzeugen.

Ich kann mir gut vorstellen dass man das mit at oder notify irgendwie lösen kann, mir fehlt aber etwas das wissen wir ich hier die logdb abfrage ob ein Wert vorhanden ist.

Etwas störend ist auch dass die Zeit sich immer zum Logzeitpunkt im Graph ändert.
Somit wäre am besten eine Logik die jeden Tag um 23:59 ins DB Log schaut und wenn ein lastPosDur_rr_Stefan vorhanden ist den Timestamp auf 00:01 am Tag vorverlegt und falls lastPosDur_rr_Stefan nicht vorhanden ist einen Eintrag mit 00:01 timestamp und Wert 0 erzeugt.

Was wäre da denn der beste Weg für?

Gruß,
Stefan

DS_Starter

Hallo Stefan,

so etwas kann man natürlich machen. Ein Hilfsmittel dafür ist DbRep.
Folgendes Vorgehen wäre zum Beispiel möglich, ohne es jetzt bis ins kleinste ausgearbeitet zu haben. Ich bin heute eher müde und nicht so sehr kreativ.  ;)

Also:

1. definiere DbRep Device
2. grenze immer auf einen Tag ein (timestamp_begin/end auf current_day_begin/end) und natürlich auf das device und das reading lastPosDur_rr_Stefan
3. erstelle ein at um dieses Dbrep-Device um 23:59 ein "set dbrep countEntries" ausführt.

Im Ergebnis wird, wenn kein Eintrag in der DB gefunden wurde,  ein Reading erzeugt welches z.B. so aussieht:

                      2019-12-17__COUNT_history__no_aggregation   -

Jetzt gibt es die Option mit einem notify zu reagieren und mit "set DbRep insert .... " einen entsprechenden Eintrag mit "0" in die DB zu schreiben, also mit timestamp 00:01 wenn ich dich richtig verstanden habe. Oder eleganter mit der userExitFn. Da bei kann ich dir auch helfen, nur heute nicht mehr.

In dem anderen Fall, also wenn ein lastPosDur_rr_Stefan vorhanden it (das Reading würde dann eine Zahl enthalten), könnte man auf dem gleichen Weg einen Eintrag ungleich 0 um 00:001 erzeugen.

Umverlegen, d.h. den Timestamp ändern, geht so einfach nicht mit Bordmitteln. Geht natürlich auch, indem man sich ein passendes SQL-Statement überlegt welches den timestamp des letzten Eintrag des laufenden Tages selektiert und ihn dann auf 00:01 ändert. Dieses SQL kann man immer täglich 23:59 im DbRep  mit "set DbRep sqlCmd" ausführen.

Damit wäre alles erreicht was du machen wolltest denke ich.
Ob es nun der beste Weg ist, möchte ich momentan nicht bewerten, aber er fiel mir ein und ist sicherlich so umsetzbar.  ;)

Grüße,
Heiko

Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

stefanru

Ok, vielen Dank Heiko.

Ich schaue mir DBRep mal an und melde mich dann nochmal falls ich Rückfragen habe.
Eilig ist das ja sowieso nicht, wäre nur echt cool wenn ich meine Arbeitszeit darüber erfassen könnt und auch noch in FHEM aufbereiten.

Danke schonmal,
Stefan



DS_Starter

Guten Morgen,

DbRep ist am Anfang sicherlich etwas gewöhnungsbedürftig. Es ist ein Datenbankfrontend und hat Attribute, die teilweise generell und teilweise nur im Kontext des jeweiligen Befehls wirken.
Deswegen zögere nicht zu fragen wenn du Unterstützung benötigst.

Zumindest bis Freitag kann ich noch helfen, dann ist erstmal Weihnachtspause.  :)

Grüße,
Heiko
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter