Ergebnisse der Logdatenbank per Perl in einer Tabelle ausgeben

Begonnen von jannis, 10 Mai 2020, 20:34:35

Vorheriges Thema - Nächstes Thema

jannis

Habe heute viel gemacht und einige Fragen sind offen geblieben:

Ich nutze das Modul dbRep, um mit sqlcmd das SQL-Kommando "select" in der Logdatenbank abzusetzen:

set dbRep sqlcmd select DEVICE,READING,count(*) as Menge from history group by DEVICE,READING order by Menge DESC;

Das Ergebnis ist dann jeweils ein Reading pro Ergebniszeile:

SqlResultRow_0001      DEVICE|READING|MENGE                                                    2020-05-10 20:27:38
SqlResultRow_0002      AB_Gm_Ts_Temperatursensor_13|temperature|4129     2020-05-10 20:27:38
SqlResultRow_0003      DG_Gz_Ts_Temperatursensor_04|temperature|3552     2020-05-10 20:27:38


Ich möchte den select-Befehl in Perl absetzen und dann das Ergebnis aufbereitet als Tabelle ausgeben.
Klar, obigen Befehl kann ich mit fhem(...) absetzen und dann mühsam die Ergebnisse aus der Liste oben herauspicken.

Geht das "Rauspicken"  irgendwie einfach? Oder gibt es einen viel leichteren Weg, um das Ergebnis in ein Perl-Array zu ziehen und dann mittels Schleife in einer Tabelle auszugeben?

Schönen Restsonntag noch.
+ + + Gibt es eigentlich hier Smarthome-Enthusiasten aus + + +
Norddeutschland / Nordfriesland / Bredstedt / Husum oder Niebül?

DS_Starter

Hallo,

reicht dir nicht das Attribut sqlResultFormat auf table zu stellen ?
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

jannis

Zitat von: DS_Starter am 10 Mai 2020, 22:11:16
Hallo,

reicht dir nicht das Attribut sqlResultFormat auf table zu stellen ?

Das hatte ich auch schon probiert, war aber auf folgende Probleme gestoßen:

sub jkDatabaseStatus() {
   my $tabelle = "";

   fhem("attrib logdbRep sqlResultFormat table");   ## (1)
   fhem("set logdbRep sqlCmd select DEVICE,READING from history group by DEVICE,READING LIMIT 10;");  ## (2)

   $ausgabe = ReadingsVal("logdbRep", "SqlResult", -1) ;
   return $ausgabe;
}


Ausgegeben wird leider nur:
-1

A)
Kommentiere ich die beiden fhem-Befehle aus, enthält die Ausgabe die gewünschte Tabelle aus SqlResult, aber natürlich nur noch die aus der vorherigen Abfrage.
Gibt es da timing-Probleme? Also der Art, dass der sqlCmd aus (2) noch nicht abgearbeitet ist und die Datenbank sperrt, deshalb "-1" ???


B)
Das Ergebnis aus SqlResult wird leider auch nur so ausgegeben:
<html><table border=2 bordercolor='darkgreen' cellspacing=0><tr><td style='padding-right:5px;padding-left:5px;text-align: right;'>DEVICE</td><td style='padding-right:5px;padding-left:5px;text-align: right;'>READING</td></tr><tr><td style='padding-right:5px;padding-left:5px;text-align: right;'>20_05_08_11_26_58_at_Meldung_di_sw_MachWarm_Dauer</td><td style='padding-right:5px;padding-left:5px;text-align: right;'>state</td></tr><tr><td style='padding-right:5px;padding-left:5px;text-align: right;'>20_05_08_11_26_58_at_Meldung_di_sw_MachWarm_Raum</td><td style='padding-right:5px;padding-left:5px;text-align: right;'>state</td></tr><tr><td style='padding-right:5px;padding-left:5px;text-align: right;'>20_05_08_11_26_58_at_Meldung_di_sw_MachWarm_Start</td><td style='padding-right:5px;padding-left:5px;text-align: right;'>state</td></tr><tr><td style='padding-right:5px;padding-left:5px;text-align: right;'>20_05_08_11_26_58_at_Meldung_di_sw_MachWarm_Temperatur</td><td style='padding-right:5px;padding-left:5px;text-align: right;'>state</td></tr><tr><td style='padding-right:5px;padding-left:5px;text-align: right;'>20_05_08_11_26_58_at_Meldung_di_sw_MachWarm_state</td><td style='padding-right:5px;padding-left:5px;text-align: right;'>state</td></tr><tr><td style='padding-right:5px;padding-left:5px;text-align: right;'>20_05_09_11_36_07_at_Meldung_di_sw_MachWarm_Dauer</td><td style='padding-right:5px;padding-left:5px;text-align: right;'>state</td></tr><tr><td style='padding-right:5px;padding-left:5px;text-align: right;'>20_05_09_11_36_07_at_Meldung_di_sw_MachWarm_Raum</td><td style='padding-right:5px;padding-left:5px;text-align: right;'>state</td></tr><tr><td style='padding-right:5px;padding-left:5px;text-align: right;'>20_05_09_11_36_07_at_Meldung_di_sw_MachWarm_Start</td><td style='padding-right:5px;padding-left:5px;text-align: right;'>state</td></tr><tr><td style='padding-right:5px;padding-left:5px;text-align: right;'>20_05_09_11_36_07_at_Meldung_di_sw_MachWarm_Temperatur</td><td style='padding-right:5px;padding-left:5px;text-align: right;'>state</td></tr><tr><td style='padding-right:5px;padding-left:5px;text-align: right;'>20_05_09_11_36_07_at_Meldung_di_sw_MachWarm_state</td><td style='padding-right:5px;padding-left:5px;text-align: right;'>state</td></tr></table></html>

Also werden die html-Tags maskiert. Wie kann ich das in der Kombination fhem/perl verhindern?


+ + + Gibt es eigentlich hier Smarthome-Enthusiasten aus + + +
Norddeutschland / Nordfriesland / Bredstedt / Husum oder Niebül?

DS_Starter

Zitat
A)
Kommentiere ich die beiden fhem-Befehle aus, enthält die Ausgabe die gewünschte Tabelle aus SqlResult, aber natürlich nur noch die aus der vorherigen Abfrage.
Gibt es da timing-Probleme? Also der Art, dass der sqlCmd aus (2) noch nicht abgearbeitet ist und die Datenbank sperrt, deshalb "-1"
Das hat etwas mit der asynchronen (non-blocking) Arbeitsweise zu tun. Du kannst das Ergebnis so nicht auswerten weil es zu dem Zeitpunkt noch nicht vorliegt. Ein Lösungsweg ist die Verwendung von userExitFn (Attribut). Im Wiki gibt es noch weitere Erläuterungen dazu. (https://wiki.fhem.de/wiki/DbRep_-_Reporting_und_Management_von_DbLog-Datenbankinhalten#Abarbeitung_einer_sequentiellen_Befehlskette_mittels_non-blocking_sqlCmd-Kommandos)

Zitat
B)
Das Ergebnis aus SqlResult wird leider auch nur so ausgegeben: ...
Das Problem habe ich bei mir auch festgestellt. Allerdings scheint es etwas mit der Ergebnismenge (sprich Größe der Tabelle) zu tun zu haben, denn der Aufruf:

sqlCmd select device,reading,count(*) as Menge from history where timestamp > "2020-04-20 00:00:00" group by device, reading order by Menge desc;

oder auch

select DEVICE,READING from history group by DEVICE,READING LIMIT 10;

hat bei mir wunderbar funktioniert wie erwartet (siehe Screenshots). Teste das bei dir bitte auch mal.

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

jannis

Zitat von: DS_Starter am 11 Mai 2020, 12:34:22

select DEVICE,READING from history group by DEVICE,READING LIMIT 10;

hat bei mir wunderbar funktioniert wie erwartet (siehe Screenshots). Teste das bei dir bitte auch mal.

Klar, in der FHEM-Ausgabe des Devices logdbRep ist das kein Problem. Da wurde auch bei mir die Tabelle ausgegeben. Ich lese diese aber per Perl und ReadingsVal() ein und gebe sie dann aus. Und dann werden die HTML-Tags (spitze Klammern) maskiert und halt wie oben gezeigt der HTML-Quellcode ausgegeben und nicht eine hübsche Tabelle :)

Kann man vielleicht per Perl gar keine html-Tags in FHEM ausgeben?

Soll ich Perl-spezifische FHEM-Fragen eigentlich hier bei Anfängerfragen fragen oder unter Development?
+ + + Gibt es eigentlich hier Smarthome-Enthusiasten aus + + +
Norddeutschland / Nordfriesland / Bredstedt / Husum oder Niebül?

DS_Starter

ZitatIch lese diese aber per Perl und ReadingsVal() ein und gebe sie dann aus.
Achso, ich dachte du willst gleich die erzeugte Tabelle verwenden.

ZitatKann man vielleicht per Perl gar keine html-Tags in FHEM ausgeben?
Doch, geht schon. Ich mache ja im Prinzip nichts anderes, nur mit integrierten Mitteln.
Für User fällt mir als erstes ein weblink-Device ein, dass man mit einer Funktion füttert die HTML-Code zurück gibt, wie deine.

https://fhem.de/commandref.html#weblink (das Beispiel define w_Frlink weblink htmlCode { WeatherAsHtml("w_Frankfurt") } )

ZitatSoll ich Perl-spezifische FHEM-Fragen eigentlich hier bei Anfängerfragen fragen oder unter Development?
Dort kannst du leider nichts posten. "Sonstiges" wäre IMHO ein guter Platz dafür.
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

jannis

Weblink will ich ausprobieren.
Zitat von: DS_Starter am 11 Mai 2020, 14:26:44
Für User fällt mir als erstes ein weblink-Device ein, dass man mit einer Funktion füttert die HTML-Code zurück gibt, wie deine.

Das HTML-Problem habe ich jetzt mal auf das Wesentlichste reduziert, ganz ohne sql und logdbRep:

{"<h1>hello World</h1>"}

Das eingegeben in die fhem-Kommandozeile ergibt:

<h1>hello</h1>

Könnte man perl/fhem nicht ganz einfach anstubsen, in diesem Fall den "<h1>"-Tag auszuführen? Eine mit ganz einfachen Mitteln html-formatierte Ausgabe kann doch nicht nur für mich interessant sein?
+ + + Gibt es eigentlich hier Smarthome-Enthusiasten aus + + +
Norddeutschland / Nordfriesland / Bredstedt / Husum oder Niebül?

DS_Starter

wie wärs damit ?

{ return qq{<html><h1>hello World</h1></html>} }
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

jannis

Zitat von: DS_Starter am 11 Mai 2020, 15:02:37
wie wärs damit ?

{ return qq{<html><h1>hello World</h1></html>} }

Prima, danke!!!

Hab es hinbekommen und das Problem mit dem "nonblocking" und das deshalb die Datensätze bei meiner Perl-Abfrage mit ReadingsVal() noch nicht da sind könnte ich ja lösen, indem ich alle paar Stunden diese Abfrage automatisiert mit einem "at" ausführen lasse und wenn mein user sich dann einen Überblick über die Datenbank ausgeben lässt, erhält er die vielleicht etwas älteren Daten, aber darauf kommt es nicht an.

Noch einmal, ich danke Dir.
+ + + Gibt es eigentlich hier Smarthome-Enthusiasten aus + + +
Norddeutschland / Nordfriesland / Bredstedt / Husum oder Niebül?

jannis

Hatte es schon als gelöst gekennzeichnet, aber einen Punkt hatte ich zu oberflächlich betrachtet:

Zitat von: jannis am 11 Mai 2020, 16:25:02
Prima, danke!!!

Hab es hinbekommen und das Problem mit dem "nonblocking" und das deshalb die Datensätze bei meiner Perl-Abfrage mit ReadingsVal() noch nicht da sind, könnte ich ja lösen, indem ich alle paar Stunden diese Abfrage automatisiert mit einem "at" ausführen lasse und wenn mein user sich dann einen Überblick über die Datenbank ausgeben lässt, erhält er die vielleicht etwas älteren Daten, aber darauf kommt es nicht an.

Wenn dann zwischendurch mal mit sqlcmd beim dbRep eine andere Abfrage gemacht wird, bekommt der User bei meiner obigen Abfrage natürlich Schrott angezeigt. Also muss dann doch bei meiner Perlfunktion erst einmal der sqlcmd abgesetzt werden. Ich nehme an, einen Perl sleep-Befehl vor der Anzeige der Tabelle abzusetzen ist auch nicht so toll. Vielleicht den sqlcmd blocking absetzen .... wenn das geht und sinnvoll ist?
+ + + Gibt es eigentlich hier Smarthome-Enthusiasten aus + + +
Norddeutschland / Nordfriesland / Bredstedt / Husum oder Niebül?

DS_Starter

ZitatVielleicht den sqlcmd blocking absetzen .... wenn das geht und sinnvoll ist?
Nein, wäre nicht sinnvoll. Diese Abfragen laufen ja einige Zeit und dein FHEM würde in dieser Zeit still stehen.
Das DbRep Device benutzt du einfach nur für diese eine Abfrage.
Für alle anderen Aufgaben erstellst du dir ein oder mehrere weitere Reps. Bei mir mir laufen über 100 für die unterschiedlichsten Dinge.
Das ist bei DbRep der allgemein gültige Ansatz. Nicht jedesmal irgendwelche Umkonfigurationen (Attribute) vornehmen.
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