Dblog goes to gplot SVG: Verständnisfragen

1,820 views
Skip to first unread message

tobias.faust

unread,
Jun 9, 2012, 2:33:51 PM6/9/12
to fhem-de...@googlegroups.com
Hi,
ich habe das DbLog Modul mit einer get funktion aufgepeppt um Plots in FHEM zu bekommen.
In fhem funktioniert schon folgendes:

get <DbLogDevice> - - <timevon> <timebis> <egalwas>:<device>:<reading>

get DbLog - - 2012-01-01 2012-12-31 4:KS300:temperature 4:KS300:humidity
2012-05-30_11:48:02 61
2012-05-30_11:53:07 61
2012-05-30_11:58:12 62
2012-05-30_12:00:45 61
2012-05-30_12:05:50 61
2012-05-30_12:08:23 61
2012-05-30_11:48:02 15.3 2012-05-30_11:53:08 15.2 2012-05-30_11:58:12 15.4 2012-05-30_12:00:45 15.3 2012-05-30_12:05:50 15.5 2012-05-30_12:08:23 15.3

Ich möchte also einen Plot für Temperatur und Luftfeuchte haben.

Für jedes Reading (temperature und humidity) kommen hier im Beispiel 6 Werte.
Eines der unklaren Fakten ist, wie ist der Trenner zwischen den Readings in der Ergebnismenge? Wie kann also das Plot zwischen temp und hum unterscheiden?

Rudolf Koenig

unread,
Jun 10, 2012, 4:08:16 AM6/10/12
to fhem-de...@googlegroups.com
> Eines der unklaren Fakten ist, wie ist der Trenner zwischen den Readings in
> der Ergebnismenge?

Nach einem Block kommt jeweils eine Zeile die mit # anfaengt, content ist z.Zt
egal. FileLog schreibt die Spaltendefinition rein (Argument von "#FileLog" in
der .gplot Datei).

tobias.faust

unread,
Jun 11, 2012, 3:19:39 AM6/11/12
to fhem-de...@googlegroups.com
ich habe jetzt folgendes:

define DbLog DbLog /usr/share/fhem/DbLog.conf .*:.*
define weblink_DbLog weblink fileplot DbLog:myDbLogtest:CURRENT
attr weblink_DbLog fixedrange 2012-01-01 2012-12-31

myDbLogtest.gplot sieht folgendermaßen aus:

##############################
set terminal size <SIZE>
set title 'Title'
set ylabel 'Label1'
set y2label 'Label2'
#FileLog 4:KS300:temperature:
plot \
     axes x1y1 title 'Title3' with steps lw 2
##############################

Der Get Befehl bringt folgendes:

get DbLog - - 2012-01-01 2012-12-31 4:KS300:temperature

2012-05-30_11:48:02 15.3
2012-05-30_11:53:08 15.2
2012-05-30_11:58:12 15.4
2012-05-30_12:00:45 15.3
2012-05-30_12:05:50 15.5

Trotzdem kommt:
Broken definition for weblink_DbLog: DbLog:myDbLogtest:CURRENT

Ich dachte, das der #Filelog Eintrag direkt dem "get" Befehl übergeben wird??
Mit fehlt da noch der rote Faden, der globale Zusammenhang wie die Komponenten interagieren. Einen entsprechenden WikiEintrag habe ich nicht gefunden.
(Den hier kenne ich aber: http://fhemwiki.de/wiki/Creating_Plots )

Rudolf Koenig

unread,
Jun 11, 2012, 1:09:49 PM6/11/12
to fhem-de...@googlegroups.com
> *get DbLog - - 2012-01-01 2012-12-31 4:KS300:temperature*
...
Schaut schon mal gut aus, evtl. fehtl unten nocht der Trenner, bei mir schaut
es gerade so aus:

fhem> get outlog - - 2012-06-11_18:5 2012-06-12 4:IR:0:
2012-06-11_18:52:14 16.4
2012-06-11_18:57:19 16.4
2012-06-11_18:59:52 16.4
2012-06-11_19:02:24 16.2
#4:IR:0:

> *Broken definition for weblink_DbLog: DbLog:myDbLogtest:CURRENT*

Laut Sourcecode :) liegt es entweder daran, dass die weblink definition nicht
korrekt ist, oder (was ich eher vermute) dass $defs{<log>}{currentlogfile}
nicht gesetzt ist. Wird verwendet, um CURRENT mit dem richtigen logfile zu
ersetzen.

> Einen entsprechenden WikiEintrag habe ich nicht gefunden.

Ist auch kein Wunder, hab keins geschrieben, und Du bist der erste, der diese
Funktionalitaet dupliziert. Und mich wuerde es wundern, wenn Du nach deinem
erfolgreichen Tat einen WikiEintrag schreiben wuerdest. Wundern im Sinne von
"Dich bewundern" :)

tobias.faust

unread,
Jun 11, 2012, 3:22:54 PM6/11/12
to fhem-de...@googlegroups.com
aber ich habe doch kein Logfile ;)
Was ich aus der DB ziehen möchte steht doch im *.gplot drin
#FileLog 4:KS300:temperature:

heißt, aus der DB werden die Werte für das Device "KS300" mit dem Reading "temperature" gezogen. Das macht ja die get-Funktion

Habe mich heute auch schon durch 01_FHEMWEB.pm gekämpft,  habe aber erstmal (für heute) aufgegeben als ich die Datenspur in der showlog Prozedur im SVG Teil verloren hatte....
Ich denke mal, da muss 01_FHEMWEB.pm gepached werden weil es ja kein logfile gibbet ... :(

tobias.faust

unread,
Jun 23, 2012, 1:29:54 AM6/23/12
to fhem-de...@googlegroups.com
Hallo Rudi,
ich bekomme im fhemweb im log folgende Ferhlermeldung:
Use of uninitialized value $t in string eq at /usr/share/fhem/FHEM/01_FHEMWEB.pm line 610.
Use of uninitialized value $t in hash element at /usr/share/fhem/FHEM/01_FHEMWEB.pm line 611.

Dummerweise habe ich an dieser Stelle aber nichts verändert. Ansonsten funktioniert alles wie geünscht. Kannst du da mal bitte kurz  drüberschauen??

01_FHEMWEB.pm

tobias.faust

unread,
Jun 23, 2012, 1:39:33 AM6/23/12
to fhem-de...@googlegroups.com
Achso, das ist diese Prozedur:

Irgendwie ist im Fehlerfall $d leer, aber warum?
Der Fehler kommt, sobald ich mir ein Plot ausgeben lassen

606 # Needed for type sorting
607  %FW_types = ();
608  foreach my $d (sort keys %defs ) {
609    next if(IsIgnored($d));
610    my $t = AttrVal($d, "subType", $defs{$d}{TYPE});
611    $t = AttrVal($d, "model", $t) if($t eq "unknown");
612    $FW_types{$t}{$d} = 1;
613  }
614
615  $FW_room = AttrVal($FW_detail, "room", "Unsorted") if($FW_detail);
616 }

Rudolf Koenig

unread,
Jun 23, 2012, 6:30:52 AM6/23/12
to fhem-de...@googlegroups.com
> Use of uninitialized value $t in string eq at /usr/share/fhem/FHEM/01_FHEMWEB.pm line 610.
...
> 610 my $t = AttrVal($d, "subType", $defs{$d}{TYPE});

Code passt nicht zum Fehlermeldung. Evtl. ist aber $defs{$d}{TYPE} nicht
definiert. In solchen Feaellen mit Log alles moegliche ausgeben:
Log 1, "D:$d, T:$t";
usw.

tobias.faust

unread,
Jun 28, 2012, 4:52:19 PM6/28/12
to fhem-de...@googlegroups.com
Hi,

ich bin vorerst fertig.
@Rudi: Könntest du bitte die Änderungen von weblink und fhemweb prüfen und einchecken?
@Boris: Könntest du bitte die Änderungen vom ECMDDevice und DbLog prüfen und einchecken?

Bitte anschließend um kurze Rückmeldung damit ich ein updatefhem machen kann...

Grüsse
Tobias

01_FHEMWEB.pm(1).diff
67_ECMDDevice.pm.diff
93_DbLog.pm.diff
98_weblink.pm.diff

Rudolf Koenig

unread,
Jun 29, 2012, 3:47:36 AM6/29/12
to fhem-de...@googlegroups.com
> @Rudi: K�nntest du bitte die �nderungen von weblink und fhemweb pr�fen und
> einchecken?

Die Aenderungen sind ok, hab sie auch eingecheckt. Was mir fehlt ist ein
commandref.html patch fuer weblink.


> @Boris: K�nntest du bitte die �nderungen vom ECMDDevice und DbLog pr�fen
> und einchecken?

Und bitte auch eine Zeile ins CHANGED schreiben.

tobias.faust

unread,
Jun 29, 2012, 8:25:32 AM6/29/12
to fhem-de...@googlegroups.com
wenn ich einen sourceforge Account habe, wie kann ich jetzt die commandref.html editieren?

Wie wird das hier gehandhabt? Gibts irgendwo eine Anleitung wie man unter Linux etwas im CVS entwickelt?

Rudolf Koenig

unread,
Jun 29, 2012, 2:02:26 PM6/29/12
to fhem-de...@googlegroups.com
> wenn ich einen sourceforge Account habe, wie kann ich jetzt die
> commandref.html editieren?

Erst Dein sourceforge account mir zuschicken, dann trage ich Dich ein, ab da
siehe README.SVN

Dr. Boris Neubert

unread,
Jul 2, 2012, 2:48:12 PM7/2/12
to fhem-de...@googlegroups.com
Hallo,

Am 28.06.2012 22:52, schrieb tobias.faust:
> @Boris: Könntest du bitte die Änderungen vom ECMDDevice und DbLog prüfen
> und einchecken?

ECMDDevice ist OK, gepatched und submitted.

Der Erste, der ein Semikolon benötigt, wird ein Problem bekommen.
Vielleicht bin ich das,

Der Patch auf DBLog geht nicht:

patch 93_DbLog.pm < 93_DbLog.pm.diff
patching file 93_DbLog.pm
patch: **** malformed patch at line 23: @@ -251,8 +254,9 @@

Das SQL darin sieht mir datenbankabhängig aus. Für welches DBS ist das
geschrieben? Das Modul ist zwar ein Graus, lief aber bisher unter MySQL
und PostgreSQL. Das sollte auch so bleiben. Es wäre besser, die
Formatierung in Perl zu erledigen.

Viele Grüße
Boris

tobias.faust

unread,
Jul 3, 2012, 2:42:06 AM7/3/12
to fhem-de...@googlegroups.com
Hi Boris,
zu ECMDDevice:
Anstatt im postproc bisher:
set write postproc {s/OK;OK/success/; "$_" eq "success" ? "ok" : "error";

läufts jetzt mit:
set write postproc {s/([OK|;]*)/success/; "$_" eq "success" ? "ok" : "error";}

zu DbLog: Die "get" Funktion ist jetzt erstmal nur eine funktionierende Zwischenversion.
Es muss noch der "function"-Parameter sowie "delta-h" und "delta-d" eingearbeitet werden. So wie es jetzt ist läuft es aber mit den Einzelwerten die du ja im Modul zerteilst und jeweils extra ablegst.

Was meinst du mit "Das Modul ist zwar ein Graus...." bei mir läufts es gut. Übrigens unter Postgresql.
Ich muss mir noch etwas überlegen wie ich der Datenbank ein bestimmtes Datumsformat abringen kann weil die Formatierung unter Postgre und Mysql abweicht. Ev. lese ich die DBLog.conf aus, da steht es ja drin welche DB genutzt wird....

Dr. Boris Neubert

unread,
Jul 3, 2012, 4:14:13 PM7/3/12
to fhem-de...@googlegroups.com
Hallo,

Am 03.07.2012 08:42, schrieb tobias.faust:
> Anstatt im postproc bisher:
>
> set write postproc {s/OK;OK/success/; "$_" eq "success" ? "ok" : "error";
>
>
> läufts jetzt mit:
>
> set write postproc {s/([OK|;]*)/success/; "$_" eq "success" ? "ok" : "error";}

Das ist nicht, was ich will. Ich brauche vier aufeinanderfolgende OK auf
vier einzelnen Zeilen. Die Zeilenumbrüche werden durch Semikolon
ersetzt. Ich brauche also sogar genau /^OK;OK;OK;OK$/. Auf /[OK|;]*/
paßt aber auch eine leere Rückgabe oder nur ein OK.

Das gefällt mir nicht, weil es nicht das leistet, was es soll.

Das Problem liegt am Umgang mit dem Semikolon (siehe gesonderte
Diskussion hierzu). Und ohne einen vergleichsweise mächtigen Parser, der
die Maskierung von ; durch ;; obsolet macht, wird sich das auch
vermutlich nicht lösen lassen.

> Was meinst du mit "Das Modul ist zwar ein Graus...." bei mir läufts es
> gut. Übrigens unter Postgresql.

Ich finde es grausam, daß für jedes Modul eine Sonderbehandlung
implementiert werden muß. Aus diesem Grund befürworte ich das
Interface-Konzept und brauche nur noch zu sehen, welche Interfaces von
einem Gerät unterstützt werden, um die Rückgabewerte zu interpretieren.

Viele Grüße
Boris

tobias.faust

unread,
Jul 4, 2012, 1:51:05 AM7/4/12
to fhem-de...@googlegroups.com
Hi Boris,

habe ich jetzt einen Denkfehler??
die Zeile:
set write postproc {s/([OK|;]*)/success/; "$_" eq "success" ? "ok" : "error";}

liefert doch NUR dann "ok" wenn in der cmd Rückgabe ausschließlich OK´s enthalten sind. Sowie ein Error oder sonst eine abweichende Rückantwort als OK drin ist, kommt auch ein "error" aus dem Postproc.

Oder hast du ein besseres Regex als ([OK|;]*) ?? Ich kann zwar etwas regex aber noch etwas holpelig...
Ev. (^[OK|;]+$) ??

Dr. Boris Neubert

unread,
Jul 8, 2012, 4:07:58 AM7/8/12
to fhem-de...@googlegroups.com
Hallo,

Am 04.07.2012 07:51, schrieb tobias.faust:
> habe ich jetzt einen Denkfehler??
> die Zeile:
> set write postproc {s/([OK|;]*)/success/; "$_" eq "success" ? "ok" :
> "error";}

[OK|;] ist eine Zeichenklasse mit den Zeichen O und K und | und ;

Mit dem Stern dahinter matcht es alles, wo eines dieser Zeichen null Mal
oder öfter vorkommt.

> Oder hast du ein besseres Regex als ([OK|;]*) ?? Ich kann zwar etwas

/^OK;OK;OK;OK$/

Und das wird durch EvalPerlSpecials kaputtgemacht.

Ich denke mir was aus.

Grüße
Boris

Erwin

unread,
Aug 28, 2012, 6:48:16 AM8/28/12
to fhem-de...@googlegroups.com
Hi Boris & Tobias!

Ich möchte den den "original" titel des theads wieder aufwärmen.... weil das für mich ein sehr interessantes Thema ist.

Ich hab versucht, die SQL Abfrage insofern zu ändern, dass es mit mySQL funktioniert.

1)Auszug aus der Konfiguration:

  define my_DbLog DbLog /opt/etc/fhem_mhdb.cfg .*:(temperature|humidity|pressure|wind|wind_condition).*
  attr my_DbLog comment record all temp and humidity events (incl. avg) to mysql

  define testwl weblink dbplot my_DbLog:AussenTempHum_db
  attr testwl fixedrange 2012-08-01 2012-08-30
  attr testwl label "AussenTemperatur/Humidity current Month   T-min:  $data{min1}      T-max:  $data{max1}"

2)AussenTempHum_db.gplot
    ...
    #DbLog AussenTempHum:temperature:10:
    #DbLog AussenTempHum:humidity:50:
    ....
  wobei mich die Erkenntniss, das das #DbLog heissen muß (statt #FileLog) einige Stunden gekostet hat....

3) Modifikationen der 93_DbLog.pm
   sorry, ich kann kein diff anbieten, weil ich noch etliche andere Modifikationen im DbLog drin hab, die mit diesem Problem nichts zu tun haben....
   Ich poste den relevanten Teil, basierend auf der SVN Version UND dem diff in diesem Thread.

          ......
##MHy1 prepare IN string for SQL
  my $jstring = "";
  if (int(@readings) > 0) {
     $jstring = join(",", @readings);
  } else {
     $jstring = "\'dummy\'";
  }

   my $dbh= $hash->{DBH};

   my $stm= "SELECT REPLACE(TIMESTAMP,' ','_'), DEVICE, READING, VALUE
             FROM history
             WHERE 1 =1
             AND CONCAT(DEVICE,'|',READING) IN ($jstring)
             AND TIMESTAMP BETWEEN '$from' AND '$to'
             ORDER BY DEVICE, READING, TIMESTAMP";

#   Log 1, "STM_result=$stm ";
   my $sth= $dbh->prepare($stm) ||
        return "Cannot prepare statement $stm: $DBI::errstr";
   my $rc= $sth->execute() ||
        return "Cannot execute statement $stm:  $DBI::errstr";
   #return "<result of execution $stm:  $rc  $DBI::errstr";
   #$retval .= "$stm \n";

   my ($aktrow, $lastrow) = ("", "");

   while( ($sql_timestamp,$sql_dev,$sql_reading,$sql_value)= $sth->fetchrow_array) {
      $aktrow = "#".$sql_dev.":".$sql_reading."::\n";
      if ($lastrow ne $aktrow && $lastrow ne "") {
         $retval .= $lastrow;
      }
      $retval .= "$sql_timestamp $sql_value\n";
      $lastrow = $aktrow;
   }
   $retval .= $lastrow;

   if($internal) {
    $internal_data = \$retval;
    return undef;
   }

   return $retval;


}
################################################################
1;


Damit läuft ein get my_DbLog - - 2012-08-20 2012-08-22 AussenTempHum:temperature und auch der weblink funktioniert.


Ich kann mir denken, daß Ihr dzt. viel zu tun habt, mit der 5.3 Release, aber vielleicht ergibt sich ja irgendwann die Möglichkeit, das einzubauen.

l.g. erwin





tobias.faust

unread,
Aug 28, 2012, 9:10:34 AM8/28/12
to fhem-de...@googlegroups.com
offener Punkt ist noch zu erkennen ob Postgre oder Mysql weil die Datumsformatierung grundlegend anders ist :(
Außerdem habe ich noch eine angepasste Tabellstruktur bzw Indices die exakt auf die Anfragen hin ausgerichtet sind. Damit bekomme ich noch performant Daten aus der schon recht großen DB....

Erwin

unread,
Aug 28, 2012, 10:31:24 AM8/28/12
to fhem-de...@googlegroups.com
Hi Tobias,

...ich kenne Postgre überhaupt nicht, ich denke jetzt nur laut....
Warum nicht den SQL-Select string zur Gänze in ein file auslagen (und ein paar Beispiele angeben) und einige wenige variablen definieren, die die unterschiedlichen Datumsformatierungen (z.B: TIMESTAMP_sql / TIMESTAMP_postgre) und sonstige Unterschiede berücksichtigt?
Ein Beispiel für die Konvertierung von FHEM-Timestamp nach mySQL hab ich im Select statement im vorigen post.
 Evtl. könnte man sich das einlesen des .gplot files ersparen (bzw. die schon vorhandenen verwenden, wenn man die relevanten Dinge dort auch noch unterbringt....

l.g. erwin
Reply all
Reply to author
Forward
0 new messages