DbLogInclude: Wie mehrere Readings loggen wenn ein Reading matched

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

Vorheriges Thema - Nächstes Thema

stefanru

Ok alles klar,

ein kurze Frage ob ich das alles richtig verstehe.
Ich habe ein DBRep Device für allgemeine Aufgaben wie z.B. Vacuum der DB.

Für diesen neuen Task lege ich mir ein neues DBRep device an das ich mit den Attributen auf mein Device und Reading einschränke.
Habe ich das soweit richtig verstanden?

Nur damit ich nicht in eine total falsche Richtung loslege.

Danke und Gruß,
Stefan

DS_Starter

Hallo Stefan,

ja genau richtig. Lege dir ein neues an.
Ich habe sehr viele Devices für die verschiedensten Aufgaben. Um sich die Arbeit zu erleichtern, kopiere ich ein vorhandenes Device und passe es dann nur noch den Bedürfnissen an.

Das geht nach ein bisschen Einarbeitung sehr flott von der Hand.
Ein Device benutze ich z.B.  immer um mit set .... fetchrows einen schnellen Blick in die DB zu haben um zu sehen was dort so los ist oder zu schauen ob die Datenmanipulationen erfolgreich waren.

Grüße,
Heiko
ESXi@NUC+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.
Dann probiere ich das mit countEntries pro Tag und ergänze wen kein Eintrag da ist einen mit 0.
Das sollte eigentlich erstmal für meine Zwecke ausreichen.

Vielen Dank,
Stefan

stefanru

Hi Heiko,

das ist ja alles einfacher als gedacht!

Ich habe eine Sub angelegt die ich als user exit rufe:
sub arbeitszeit {
my ($name,$reading,$value) = @_;
my $hash = $defs{$name};
my $device = "geofancy";
my $model  = "GEOFANCY";
my $readingdef = "lastPosDur_rr_Stefan";

if($reading =~ /^.*_COUNT_history__no_aggregation.*$/) {
     $reading =~ /^(\d+)-(\d+)-(\d+)_.*$/;
     my $pmts = "$1-$2-$3";
     my $fmtDateTime = FmtDateTime(gettimeofday());
     setReadingsVal($hash,"heute",$value,$fmtDateTime);
     setReadingsVal($hash,"heute_ts",$pmts,$fmtDateTime);

if ($value = 1) {         
         # Start der 3. Operation (update)
         CommandSet(undef,"logdbRepArbeitszeit sqlCmd update history set timestamp=\"$pmts 00:00:01\", EVENT=\"dayentry\" where DEVICE=\"$device\" and READING=\"$readingdef\" and timestamp > \"$pmts\";");
Log3 $name, 1, "$name - timestamp updated to $pmts 00:00:01";
} else {
CommandSet(undef,"logdbRepArbeitszeit sqlCmd insert into history (TIMESTAMP, DEVICE, TYPE, EVENT, READING, VALUE, UNIT)
   values (\"$pmts 00:00:01\", \"$device\", \"$model\", \"dayentry\", \"$readingdef\", \"0\", \"\")");
     Log3 $name, 1, "$name - insert for today $pmts";
}
}
return;
}


Die macht schon alles wie gewünscht. Richtig cool.

Jetzt hätte ich noch eine Frage an dich.
Wie würdest du Summen der Arbeitszeit bilden?
Also ich hätte gern auch die Summe der Zeiten pro Woche und pro Monat.
Gibts da auch einen einfachen weg über DBRep oder lieber statistiks oder so verwenden?

Vielen Dank,
Stefan

DS_Starter

#19
Hallo Stefan,

wow, gleich die userExitFn benutzt ... perfekt.  :D

Genau für solche Zwecke habe ich diese Möglichkeit vorgesehen. Ich freue mich, dass du es gleich hinbekommen hast.

Zitat
Wie würdest du Summen der Arbeitszeit bilden?
Also ich hätte gern auch die Summe der Zeiten pro Woche und pro Monat.
Sofern diese Rohdaten als Zahlen vorliegen ist es mit DbRep auch ganz einfach.

Setze dir die Attribute time* auf current_week_begin/current_week_end bzw. current_month_begin/current_moth_end
und führe dann ein "set ... sumValue" aus. Dann hast du die Summe die du weiterverarbeiten kannst. Zum Beispiel auch über einen user Exit diesen Wert in einen Dummy übertragen oder was auch immer.

Über diesen Weg gibt es quasi alle erdenklichen Möglichkeiten.

EDIT:  Naja, das war etwas kurz gedacht von mir, du hast sicherlich nur einen Anfangs- und Endzeitpunkt der Arbeitszeit in der DB. In dem Fall hilft dir bestimmt der Beitrag im Wiki: https://wiki.fhem.de/wiki/DbRep_-_Reporting_und_Management_von_DbLog-Datenbankinhalten#.C3.96ffnungszeiten_von_Fenster.2FT.C3.BCren_aus_der_Datenbank_ermitteln

Hier werden Öffnungszeiten berechnet, das Verfahren lässt sich aber bestimmt auf deine Anwendung umsetzen.

Ich berechne bei mir bis jetzt immer alles aus den in der Datenbank vorhandenen Werten. Dafür ist die DB ja da und man kann deutlich mehr damit machen als nur Plots zeichnen.

LG,
Heiko
ESXi@NUC+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

DS_Starter

Noch ein kleiner Hinweis.

Das


if ($value = 1) { 


sollte


if ($value == 1) { 


sein.
ESXi@NUC+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, super, vielen Dank.

Oh das == muss ich noch berichtigen.
Ich habe tatsächlich duration in sekunden.

Kann ich also über deinen tip super summieren und per insert wieder in die DB schreiben.

Dazu muss ich denke ich noch zwei neue DBRep anlegen.
Eins mit current_week_begin/current_week_end und eins mit current_month_begin/current_moth_end wie von dir beschrieben.

Ich glaub ich habe es jetzt kapiert wie das geht.

Danke dir vielmals.

Gruß,
Stefan

DS_Starter

#22
Zitat
Dazu muss ich denke ich noch zwei neue DBRep anlegen.
Eins mit current_week_begin/current_week_end und eins mit current_month_begin/current_moth_end wie von dir beschrieben.
Ja genau.

Wenn du den summierten Wert nicht umwandeln willst/musst, gibt es auch eine ganz einfache Möglichkeit:

set ... sumValue writeToDB

schreibt dir die Summe als neues Reading (neuer Readingname!) automatisch in die DB zurück. Die comref beschreibt genau wie das Verfahren ist.
Vielleicht das Richtige für dich ...

LG
ESXi@NUC+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 klingt super.

Ich probiere das mal aus.
Ich muss das mal einfach noch genauer lesen.
Am Anfang erschlägt einem die Wiki, aber eigentlich ist es gar nicht so schwer und alles gut beschrieben.

Sollte ich irgendwo probleme bekommen melde ich mich nochmal, aber ich glaub ich bekomme das jetzt hin.

Wie gesagt vielen Dank für die Hilfe und die tollen möglichkeiten mit DB Log.

Gruß,
Stefan

DS_Starter

Danke Stefan und noch viel Erfolg/Freude beim Probieren und Entdecken.
Ich bin überzeugt du kriegst das hin.  8)

Schönen Abend noch ...
Heiko
ESXi@NUC+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

DS_Starter

Ach ... noch einen Hinweis.
Solltest du mal sehr viele DbRep Devices definiert haben, könnte es sich lohnen überall das Attribut

    fastStart = 1

zu setzen.
Das bewirkt, dass die DEvices beim Start von FHEM sich nicht sofort mit der DB verbinden sondern erst bei der ersten Benutzung. -> Spart Zeit beim Start.
Aber wie gesagt, macht sich erst ab einer deutlichen Menge bemerkbar, schadet aber auch nicht es generell zu setzen.
ESXi@NUC+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 habe das ganze nun nochmal überarbeitet.
Das ganze geht ja auch komplett ohne user Exit.
SumValue mit writetoDB langt für mich völlig.
Als Attribute habe ich aggragation day und timestamp_begin current_week_begin.
So berechnet er mir für jeden Tag 23:59:58 die Summe der Zeiten, und wenn keine da ist schreibt er 0 (fürs WE oder Urlaub).
Das ganze nochmal für die Summe der Wochenzeit.
Ein at dass die dbRp SumValue mit writetoDB alle 15 minuten ausführt und ich habe immer ein aktuelle anzeige der Arbeitszeit im Graph.
Wusste nicht dass es so mächtig ist.

Super!

Vielen Dank nochmal für die tollen Möglichkeiten.
Frohe Weihnachten und einen guten Rutsch.
Stefan

DS_Starter

Hi Stefan,

danke für deine Rückmeldung.
Freut mich, dass du für deine Anwendung das richtige Werkzeug gefunden hast.  :)

Wünsche dir ebenfalls schöne Weihnachtsfeiertage,
Heiko
ESXi@NUC+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,

habe nun doch noch eine kurze frage.
Ich mache auch eine Summen aggregation für Wochen.
Leider schreibt er dann den Wert immer Montags mit Zeitstempel 23:59 weg.
Siehe: 2020-01-06 23:59:58   geofancy   GEOFANCY   calculated   sum_week_lastPosDur_rr_Stefan   134813.0000
Kannst du mir erklären warum Montagabends die Woche endet?
Kann ich das beeinflussen?

Danke und Gruß,
Stefan

DS_Starter

Hallo Stefan,

dazu müsste man sich die SQLs anschauen die die Summation machen.
verbose 4 im DbRep Device sollte es zeigen.

Grüße,
Heiko
ESXi@NUC+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