[bug] 93_DbLog.pm - $data{firstvalX} funktioniert nicht

Begonnen von betateilchen, 07 März 2022, 16:00:17

Vorheriges Thema - Nächstes Thema

betateilchen

Bei Verwendung von DbLog können in SVG plots keine firstval Werte verwendet werden, da diese Daten von DbLog bei einem get nicht bereitgestellt werden.

Das Ganze ist umso schlimmer, als es den Wert in $data{firstval1} durchaus geben kann, falls man irgendwo in FHEM einen SVG plot aus einem FileLog angezeigt hat.


  • FileLog füllt die Variable
  • DbLog kennt die Variable nicht und verändert den Wert auch nicht
  • SVG verwendet die immer noch von FileLog befüllte Variable, die in den allermeisten Fällen einen komplett falschen Wert enthält




Edit:
Mit diesem Patch werden zumindest die Punkte 2 und 3 so gelöst, dass keine falschen Werte mehr auftauchen.
Nun müsste man noch die Stelle finden, an der man den firstval findet und in die Variable kippen kann  8)




Edit 2: dieser patch scheint das Problem zu lösen. Was ich nicht geprüft habe: ob es noch andere Werte im Vergleich zu FileLog gibt, die von DbLog nicht bereitgestellt werden.


Index: /opt/fhem/FHEM/93_DbLog.pm
===================================================================
--- /opt/fhem/FHEM/93_DbLog.pm  (revision 25791)
+++ /opt/fhem/FHEM/93_DbLog.pm  (working copy)
@@ -3510,7 +3510,7 @@
   my ($retval,$retvaldummy,$hour,$sql_timestamp, $sql_device, $sql_reading, $sql_value, $type, $event, $unit) = "";
   my @ReturnArray;
   my $writeout = 0;
-  my (@min, @max, @sum, @cnt, @lastv, @lastd, @mind, @maxd);
+  my (@min, @max, @sum, @cnt, @firstv, @firstd, @lastv, @lastd, @mind, @maxd);
   my (%tstamp, %lasttstamp, $out_tstamp, $out_value, $minval, $maxval, $deltacalc);   # fuer delta-h/d Berechnung

   # extract the Device:Reading arguments into @readings array
@@ -3612,6 +3612,8 @@
       $max[$i]   = -(~0 >> 1);
       $sum[$i]   = 0;
       $cnt[$i]   = 0;
+      $firstv[$i] = 0;
+      $firstd[$i] = "undef";
       $lastv[$i] = 0;
       $lastd[$i] = "undef";                                         
       $mind[$i]  = "undef";
@@ -3935,6 +3937,10 @@
                       $maxval = $sql_value;
                   }
                   else {
+      if($firstd[$i] eq "undef") {
+        $firstv[$i] = $sql_value;
+        $firstd[$i] = $sql_timestamp;
+      }
                       if($sql_value < $min[$i]) {
                           $min[$i] = $sql_value;
                           $mind[$i] = $sql_timestamp;
@@ -4021,6 +4027,8 @@
       $data{"avg$k"}      = $cnt[$j] ? sprintf("%0.2f", $sum[$j]/$cnt[$j]) : 0;
       $data{"sum$k"}      = $sum[$j];
       $data{"cnt$k"}      = $cnt[$j];
+      $data{"firstval$k"}  = $firstv[$j];
+      $data{"firstdate$k"} = $firstd[$j];
       $data{"currval$k"}  = $lastv[$j];
       $data{"currdate$k"} = $lastd[$j];
       $data{"mindate$k"}  = $mind[$j];
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

DS_Starter

Hallo betateilchen,

gibt immer wieder mal neue Erkenntnisse  ;)  ... firstval Werte kannte ich noch garnicht. Warscheinlich weil ich
bei mir schon "ewig" FileLog mit DbLog ersetzt habe.
Ich bau deinen Patch ein und muß mir auch mal die firstval-Verwendung anschauen, was man damit macht bzw. erzeugt.


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

betateilchen

Zitat von: DS_Starter am 08 März 2022, 19:35:56
Ich bau deinen Patch ein und muß mir auch mal die firstval-Verwendung anschauen, was man damit macht bzw. erzeugt.

firstvalX liefert den allerersten Datenpunkt eines device:reading, das in einem SVG dargestellt wird.

Damit kann man $data{firstval1} verwenden, um z.B. über logproxy eine horizontale Linie mit diesem Wert zu zeichnen.
Das ist beispielsweise hilfreich, wenn man Rohstoffpreise über den Tag darstellen möchte und damit den Startwert des Tages als Bezugsbasis nimmt.

Im angehängten Screenshot vom heutigen Goldpreis wird $data{firstval1} zweimal verwendet: Einmal für die rote Linie im Plot (das ist der Kurs von Mitternacht) und um im Titel die "33" am Ende zu errechnen. 33 ist die Differenz zwischen dem Mitternachtskurs (1840) und dem aktuellen Kurs (1873).
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zitat von: DS_Starter am 08 März 2022, 19:35:56
firstval Werte kannte ich noch garnicht.

Mach Dir nix draus, logProxy kannte die Werte bis gestern auch noch nicht  8)
https://forum.fhem.de/index.php/topic,126636.0.html

Zitat von: DS_Starter am 08 März 2022, 19:35:56
Warscheinlich weil ich bei mir schon "ewig" FileLog mit DbLog ersetzt habe.

Bei mir ist FileLog auch schon ewig durch DbLog ersetzt.
Nur firstval habe ich bisher nie gebraucht, deshalb war mir das noch nicht aufgefallen.
Dass es diesen Wert gibt, wusste ich aber von FileLog.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

DS_Starter

Ah ... verstanden  8)
Habe es eingebaut, kurz angetestet und eingecheckt.
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