DbLog – Datenbank anstelle von LogFiles

Die meisten FHEM-Einsteiger beginnen mit dem loggen von Werten mit Hilfe der LogFiles. Sie sind schnell eingerichtet und loggen dann brav die gewünschten Werte. Auch das Erstellen von Graphen gelingt über die LogFiles kinderleicht. Nach mehreren Monaten können diese LogFiles jedoch relativ groß werden. Bei einer Temperaturmessung mit minütlicher Messung enthält das LogFile nach 6 Monaten bereits ca. 262.000 Einträge. Ein Lösungsansatz wäre das Erstellen von wöchentlichen oder monatlichen LogFiles. Möchte man jedoch einen lückenfreien Verlauf der Temperaturmessung haben, ist man gezwungen die LogFiles zu behalten. Die Anzahl der LogFiles wächst somit stetig.

FileLog - FHEM

Aufgrund der Tatsache, dass LogFiles als reine Textdatei angelegt werden, erschweren große LogFiles zudem das Durchsuchen und Auswerten der Einträge. Das Anzeigen von Graphen kann dadurch etwas Zeit in Anspruch nehmen. Um diesen Flaschenhals zu umgehen gibt es eine relativ simple Lösung. Das Erstellen einer Datenbank. In diesem Beitrag erkläre ich euch wie ihr eure Werte in eine Datenbank schreibt und daraus einen Graphen erstellt.

FHEM bietet dazu das Modul DbLog. Es stellt die Verbindung zwischen FHEM und einer Datenbank her. Als Datenbank können unter anderem SQLite, MySQL oder PostGreSql verwendet werden. Ich persönlich habe mich für eine SQLite-Datenbank entschieden.

Vorbereitung auf dem Raspberry

Damit FHEM mit SQLite arbeiten kann, muss das entsprechende Paket auf dem Raspberry installiert werden:

sudo aptitude install sqlite3 libdbi-perl libdbd-sqlite3-perl

Datenbank einrichten

Es wird nun eine Datenbank mit dem Namen fhem.db im FHEM-Installationsordner erstellt.

sudo sqlite3 /opt/fhem/fhem.db

Es öffnet sich direkt die Kommandozeile der Datenbank. Hier kann nun der Aufbau der Datenbank festgelegt werden.

CREATE TABLE 'history' (TIMESTAMP TIMESTAMP, DEVICE varchar(32), TYPE varchar(32), EVENT varchar(512), READING varchar(32), VALUE varchar(32), UNIT varchar(32));
CREATE TABLE 'current' (TIMESTAMP TIMESTAMP, DEVICE varchar(32), TYPE varchar(32), EVENT varchar(512), READING varchar(32), VALUE varchar(32), UNIT varchar(32));

In dieser Definition wird für die Werte eine Größe von 32 Zeichen festgelegt. Sollte man Devices mit sehr langen Readings loggen wollen, sollte man hier bereits für etwas mehr Platz sorgen. Dazu einfach VALUE varchar(32) zu VALUE varchar(64) ändern.

Die Kommandozeile der Datenbank kann nun verlassen werden.

.exit

Damit FHEM in die Datenbank lesen und auch bearbeiten kann, sollten die Rechte und Besitzverhältnisse entsprechend angepasst werden:

sudo chown fhem /opt/fhem/fhem.db
sudo chmod 666 /opt/fhem/fhem.db

In FHEM wird DbLog später über eine Config-Datei definiert. In dieser Config-Datei wird der Pfad zu der erstellten Datenbank angegeben.

sudo nano /opt/fhem/db.conf

db.conf mit folgendem Inhalt füllen:

%dbconfig= (
  connection => "SQLite:dbname=/opt/fhem/fhem.db",
  user => "",
  password => ""
);

Sollte die Datenbank mit einem Benutzer und Passwort geschützt sein, sind diese Daten ebenfalls in die Config-Datei einzutragen.

Konfiguration in FHEM

In FHEM selber muss nun nur noch das Modul DbLog definiert werden. Dabei wird der Pfad zu der eben erstellten Config-Datei angegeben. Um die Datenbank nicht gleich mit unnützen Daten voll zu müllen, sollte man sich bei der Definition bereits einige Gedanken machen. In folgender Definition wird jedes Reading von jedem Device geloggt. Für mich persönlich ist diese Definition eher unvorteilhaft.

define logdb DbLog ./db.conf .*:.*

Selbst das Modul FritzBox hat bereits über 60 Readings. Ich habe deshalb bereits bei der Definition festgelegt welche Readings geloggt werden sollen:

define DbLog DbLog ./db.conf .*:(temperature|humidity|Gesendet|Gesendet_ges|Empfangen|Empfangen_ges|Leistung|cpu_freq|cpu_temp|cpu_temp_avg|stat_cpu_percent).*

DbLog - FHEM

Damit nun die aktuellen und die vergangenen Werte gespeichert werden, muss noch das Attribut DbLogType gesetzt werden.

attr DbLog DbLogType Current/History

Somit werden nur die Readings meiner WeMos-Sensoren, die Traffic-Daten der FritzBox, Leistungsverbrauch meiner PCA301-Steckdosen und ein paar Systeminfos geloggt. Möchte ich nun weitere Readings loggen, dann reicht es aus über die Detailseite vom DbLog-Device die Definition anzupassen.

DbLog - FHEM Define Anpassen

Bevor nun weiter mit der Datenbank gearbeitet wird, kann man kontrollieren ob das loggen funktioniert. Dafür loggt man sich wieder über SSH auf den Raspberry ein und öffnet die Datenbank.

sudo sqlite3 /opt/fhem/fhem.db

Mit nachfolgendem Befehl lässt man sich alle Werte der Datenbank ausgeben:

select * from history order by TIMESTAMP;

Da die Datenbank bisher noch relativ leer ist wird nach kurzer Zeit der Inhalt ausgegeben:

DbLog SQLite Einträge

Mit „.exit“ verlässt man die Datenbank wieder.

Graphen aus Einträgen der Datenbank erstellen

Ähnlich wie bei den LogFiles lassen sich natürlich auch mit den Werten aus der Datenbank SVG-Graphen erstellen. Hier kommt ein weiterer Vorteil von dblog zum Vorschein. Bei der Verwendung von LogFiles kann man nur ein Graphen aus einem LogFile erstellen. Bei einer dblog-Datenbank kann man aus der Datenbank so viele Graphen erstellen wir gewünscht. Dazu einfach das dblog-Device öffnen und unterhalb der Eingabezeile auf „Create SVG plot from DBLog“ klicken.

DbLog - SVG Create

Es öffnet sich die bekannte Konfigurationsseite der SVG-Plots. Nachdem man als Quelle die Datenbank ausgewählt hat, bemerkt man jedoch schon den Unterschied. Es gibt weniger Optionsfelder gegenüber eines LogFiles. Aufgrund der Tatsache, dass die Readings sich nun in einer Datenbank (Tabelle) befinden, weiß FHEM direkt, wo sich welcher Wert befindet. Die Angabe der Position des gewünschten Readings ist somit nicht mehr nötig.

DbLog SVG Plot

Zum Schluss noch den Graphentyp und Farbe auswählen und schon erhält man seinen Graphen. Dieser erstellte Graph ist nun um einiges leistungsstärker im Vergleich zu Graphen aus LogFiles. Bemerkbar macht sich dies, sobald man im Graphen sich bewegt. Sei es das Herrauszoomen oder das Zurückspringen zu älteren Werten. Der Aufbau des Graphen geht nun viel schneller. Der Grund ist der, dass das Lesen aus der Datenbank schneller ist als das Lesen aus reinen Textdateien, den LogFiles.

Sobald alle Reading ordnungsgemäß geloggt werden, können die alten LogFiles gelöscht werden.

0 0 vote
Article Rating
Subscribe
Benachrichtige mich zu:
guest
27 Comments
älteste
neuste beste Bewertung
Inline Feedbacks
View all comments
Alex
Alex
4 Jahre her

Wow! DAS ist wirklich ein gewaltiger Unterschied. Fantastische Lösung! Selbst für mich als Laie war die Einrichtung dermassen Easy, das ich es wirklich jedem nur raten kann umzustellen.

Weiter so!

Alex
Alex
4 Jahre her

Ich habe gestern Abend sehr spät die Umstellung ausgeführt. Dazu hätte ich ein paar Fragen:

Müssen BEIDE Zeilen eingegeben werden?
„CREATE TABLE ‚history’…..“ UND
„CREATE TABLE ‚current‘ ….“ eingegeben werden?

Grund der Frage:
Ich habe folgende Log-Einträge die praktisch minütlich erscheinen:
„Defining DbLog SVG-Plots with :CURRENT is deprecated. Please define DbLog SVG-Plots with :HISTORY instead of :CURRENT. (define SVG ::HISTORY)“

Für eine kurze Erklärung wäre ich sehr dankbar.

Grus
Alex

Josch
Josch
4 Jahre her

Erstmal ein Lob, ich habe hier schon echt nützliche Tipps mitgenommen und könnte auch vieles in meiner Configuration verwenden, danke!!
Ist Dir eine Möglihkeit bekannt die alten Daten aus den txt-Logfiles in die Datenbank zu importieren? Leider kenne ich mich bisher nicht genug mit Datenbanken aus möchte aber ungern die Vergangenheitsdaten der Logfiles verlieren.

Vielen Dank im Voraus u Viele Grüße, Josch

Tim
Tim
3 Jahre her
Reply to  Josch

Hallo Josch,

dafür gibt’s ein Modul: https://forum.fhem.de/index.php/topic,66383.0.html

Gruß,
Tim

Dave
Dave
4 Jahre her

Ist es auch möglich die db auf z.B. einer synology (MariaDB) anzulegen?
Wenn ja, hast du Tipps oder hat das schonmal jemand gemacht?

Peter Gottschalk
Peter Gottschalk
3 Jahre her

Hallo Daniel,

ich versuche mich grade an deiner Umsetzung von Logfile auf dblog. Das hat eigendlich sehr gut geklappt, ich habe nur ein kleines Problem bei der Erstellung von den „Create SVG plot from DbLog“.
Im Feld Device:Reading hast du ein Auswahlfeld mit den ganzen geloggten Devices. Dies ist leider bei mir nicht vorhanden. Ich sehe auch bei :

Example lines for input:
No sample data due to missing table ‚Current‘.

Gebe ich die Daten von Hand ein zb.: Gesendet:Gesendet:: werden oben in der Grafik die Werte angezeigt.

Weiß du vielleicht woran das liegen könnte.

Gruß Peter

Peter Gottschalk
Peter Gottschalk
3 Jahre her
Reply to  Daniel

Hallo Daniel,

wenn ich

set DbLog count

eingebe passiert überhaut nichts.

Wenn ich in der fhem.db die Tabelle erstellen möchte bekomme ich folgenden Hinweis

Error: table ‚current‘ already exists

Was mir auffällt ist das in meinen DevicesDbLog das Reading:
countCurrent auf 0 steht
countHistory auf 48521

Gruß Peter

Peter Gottschalk
Peter Gottschalk
3 Jahre her
Reply to  Daniel

Hallo Daniel

jetzt funktioniert alles.

Das setzten des Attribut steht leider nicht in deiner Beschreibung und deshalb habe ich dieses auch nicht gesetzt.

Dann kann ich jetzt ja weiter testen und schauen was ich alles loggen kann.

Gruß Peter

Ach ja , vielen Dank für deine Seite , ich habe schon sehr viele Anregungen von dieser Seite bekommen.

Peter Gottschalk
Peter Gottschalk
3 Jahre her
Reply to  Daniel

Leid muss es dir nun wirklich nicht tun. Ich glaube du steckst genug Freizeit und Wissen in deine Seite , da können solche Kleinigkeiten passieren.

Gruß Peter

Christoph
Christoph
3 Jahre her

Hallo Daniel, das war ein sehr hilfreicher Beitrag – die commandref von Fhem hat mir hier nicht so richtig geholfen.
Ich habe nun Probleme bei der Einrichtung des SVG Plots mit logdb. Wenn ich die Parameter zur Anzeige auf dem Plot auswählen will, erhalte ich bei den Quellen kein dropdown-Menü, sondern nur den Text „Device:Reading“. Es gibt keine Fehlermeldungen – kannst Du erahnen, wo das Problem liegt (siehe Anhang)?
Vielen Dank,
Christoph

Christoph
Christoph
3 Jahre her
Reply to  Daniel

Hallo Daniel,
wenn ich das Device und Reading von Hand eingebe, erhalte ich keinen Wert. Wenn ich unter ’source‘ die Datei Filelog_heizung nehme, habe ich plötzlich dropdowns und eine funktionierende Anzeige im Graph.

Viele Grüße
Christoph

Christoph
Christoph
3 Jahre her
Reply to  Christoph

Die Daten sind übrigens in der Datenbank vollständig und aktuell vorhanden.

Christoph
Christoph
3 Jahre her
Reply to  Daniel

Hallo Daniel,

nun scheint es zu funktionieren. Dass es in der Überschrift noch immer Device::Reading heisst, ist wohl in Ordnung. Nun habe ich jedenfalls die Dropdown-Menüs. Ich hatte Deine Tipps an Peter Gottschalk einfach implementiert – ich vermute, in der Datenbank war doch noch irgendein ‚Hänger‘.
Herzlichen Dank nochmal!

Was ich nicht herausfinden konnte: Gibt es eine maximale Anzahl von Sources bei SVG plot? Habe vorhin versucht, noch einen Quellwert einzugeben und anders als bei den vorigen Zeilen kann man nun keine Werte mehr eingeben (siehe screenshot).

Christoph

Christoph
Christoph
3 Jahre her
Reply to  Daniel

Hallo Daniel,

herzlichen Dank für den Gegentest und nochmals für Deine schnelle Hilfe!
Ich werde mich nun mal weiter durch Deine Seite lesen – Du hast hier ein paar wirklich interessante Themen und verständliche Anleitungen zusammengestellt.

Gruß
Christoph

Jens Gabler
Jens Gabler
2 Jahre her

Hallo Daniel,
mein Problem betrifft zwar den nicht diesen Beitrag, aber es geht auch um Datenbanken. Ich habe vor einiger Zeit bei mir auf dem Raspi auch MariaDb installiert. An sich funktionierte das auch alles. In den letzten Tagen ist mir aber im Eventmonitor eine Fehlermeldung aufgefallen, mit welcher ich nicht so klar komme.
2018-09-08 16:29:09 DbLog DBLogging DBI connect(‚database=fhem;host=localhost;port=3306′,’fhemuser‘,…) failed: Can’t connect to local MySQL server through socket ‚/var/run/mysqld/mysqld.sock‘ (13 „Keine Berechtigung“) at ./FHEM/93_DbLog.pm line 2357.
2018-09-08 16:29:09 DbLog DBLogging DBI connect(‚database=fhem;host=localhost;port=3306′,’fhemuser‘,…) failed: Can’t connect to local MySQL server through socket ‚/var/run/mysqld/mysqld.sock‘ (13 „Keine Berechtigung“) at ./FHEM/93_DbLog.pm line 2422.
2018-09-08 16:29:09 DbLog DBLogging connected
An sich habe ich nichts an Fhem oder der DB geändert. Ich habe aber in der Fritzbox einen VPN Zugang eingerichtet und ein Update gemacht. In dem Zusammenhang habe ich auch alle anderen User aus der Fritzbox raus geschmissen. Mein Gedanke dahinter war an sich, daß nur die Fritzbox nach „Außen“ horchen soll, ob jemand rein will. Ich weis nun nicht ob ich damit auch den Zugang zur DB beschädigt habe.
Ich weis leider auch nicht wie man diese aufgeführte PM-Datei lesen kann, um einfach mal zu schauen, was denn da auf Zeile 2357 und so weiter steht.
Dann habe ich noch mal versucht dass Tutorial von damals durch zuführen. Da bin ich aber leider immer bei dem Befehl „sudo mysql -u root -p“ gescheitert. Als Fehlermeldung kam :
ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‚/var/run/mysqld/mysqld.sock‘ (2 „No such file or directory“)
Mein Fhem und die Datenbank laufen auf dem selben Raspi. Was mir bei dem ganzen „forschen“ auch aufgefallen war, ist der Fakt, daß die SD Karte (16GB) auf dem das alles läuft so ziemlich komplett voll ist. Nach Eingabe von „df -h“ wird mir angezeigt, daß mein /dev/root zu 98% ausgelastet ist. Ich gehe mal davon aus, daß das nicht gerade gut ist, weis aber auch nicht wie ich das runter bekomme. Mit „clean“ und „autoclean“ habe ich an sich nicht viel erreicht.
Vielleicht kannst Du mir ein bisschen weiter helfen.
Gruß Jens

Jens Gabler
Jens Gabler
2 Jahre her
Reply to  Jens Gabler

Update zu meinem Kommentar. Mein DB Problem und das mit der vollen SD karte habe ich lösen können.
Ich habe einfach noch mal MariaDB angelegt. Ich habe aber leider beim Erstellen eines SVG mit der DB Probleme. Bei den „Device“ sehe ich leider nicht alle.Ich habe ein paar LaCrosse Geräte. Von denen sehe ich leider gar nichts.Woran kann das liegen?
Jens

Jens Gabler
Jens Gabler
2 Jahre her
Reply to  Daniel

Hallo Daniel,
ich habe beim Anlegen der DB das mit dem alles auslesen ( .*:.* ) verwendet.
Ich verbinde mich mit HeidiSQL von meinen Windows PC
auf die DB auf dem Raspberry. Da sehe ich dann auch Readings in history und
auch current. Nur sind das leider nicht alle und gerade auch die Falschen.
Aber ich wollte noch mal ausprobieren einfach deine Readingliste im
DBLogging rein zu schreiben. Mal sehen was dann passiert.
Aber seit ein paar Tage spinnt Fhem sowieso rum. Beim Jeelink-Stick bekomme
ich die blauen Lampen nicht aus.(Obwohl die schon mal aus waren) Habe die
beiden Wege aus dem Wiki versucht. Also Eingabe von „0a v“ in den Attributen und Eingabe eines define, wie im Wiki beschrieben, Aber alles ohne Erfolg. Und meine
Flur-Nachtschaltung – der Bewegungsmelder erkennt was und notify schaltet LED
an- geht auch nicht. Der Bewegungsmelder reagiert zwar aber das notify macht
es in den meisten Fällen nicht.
Das mit dem ESPEasy habe ich probiert und ging eigentlich gut. Zu mindestens
hat mein Helligkeitssensor gut Daten geliefert. Nur der gleichzeitig angeschlossene Bewegungsmelder war noch nicht zuverlässig.
Hast Du da Erfahrungen?

Gruß Jens

Matthias
Matthias
2 Jahre her

Hi habe mich heute dran gewagt. In der Console lief alles durch ohne Fehlermeldung aber bei FHEM kam „could not read connection“.

muss ich bei Passwort db das Passwirt zum Zugang zu FHEM eintragen?