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.
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).*
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.
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:
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.
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.
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.
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!
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
Hallo Alex,
es müssen beide Zeilen verwendet werden. Wie der Name schon sagt, speichert „history“ die alten Werte und „current“ die neuen Werte. Damit weiß FHEM immer in welcher Zeile sich der aktuelle Wert befindet und wo die alten Werte beginnen.
Deine Fehlermeldung selber habe ich nicht bei mir und konnte sie auch nicht reproduzieren. Wenn man die Fehlermeldung und folgenden Beitrag im FHEM-Forum (LINK) mal anschaut, hat es etwas mit der Definition der SVG-Plots zu tun. Wenn die SVG-Plots über „Create SVG plot from DBLog“ erstellt werden, dann sollten sie eigentlich ohne Fehlermeldung ihren Dienst verrichten. Bei einer manuellen Definition der Plots muss man auf die Syntax achten:
„define [SVGName] [DbLogDevice]:[NamePLOTdatei]:HISTORY“ –> Auf das HISTORY ist zu achten. Ein CURRENT ist veraltet und könnte zu fehlern führen.
Zum Beispiel: „define SVG_Plot_Wohnzimmer SVG DbLog:SVG_Wohnzimmer:HISTORY“ –> Definiert den Plot mit dem Namen SVG_Plot_Wohnzimmer (SVGName). Die Daten werden aus der Datenbank DbLog (DbLogDevice) geholt. Die Datei, die erstellt wird hat den Namen SVG_Wohnzimmer (SVG_Wohnzimmer).
Hoffe ich konnte dir bisschen Helfen, ansonsten einfach mal im oben verlinkten Forumsbeitrag schauen. Du bist nicht alleine mit diesem Problem 😉
Gruß Daniel
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
Hallo Josch,
danke für das Lob. Habe mich selber auch schon mit dem Importieren beschäftigt. War jedoch bisher nicht erfolgreich. In einem Forums-Beitrag wird von einer Lösung über einer CSV-Datei geredet, hat bei mir aber bisher noch nicht geklappt. Im selben Beitrag hat „peterchen89“ ein Skript erstellt für das Importieren, dies jedoch leider nur für eine MySQL-Datenbank. Ich werde mir bei Gelegenheit nochmal Gedanken machen, kann dich aber bis jetzt leider nur auf das FHEM-Forum verweisen. Vielleicht findest du ja dort eine Lösung.
Gruß Daniel
Hallo Josch,
dafür gibt’s ein Modul: https://forum.fhem.de/index.php/topic,66383.0.html
Gruß,
Tim
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?
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
Hallo Peter,
das er Werte anzeigt ist ja schon mal was gutes. Ich vermute aber stark, dass dies nur „alte“ Werte sind, da ja auch die Fehlermeldung „No sample data due to missing table ‚Current‘“ auftaucht. FHEM fehlt also die Tabelle mit den aktuellen Einträgen.
Ich vermute mal, dass es da Fehler bei der Erstellung der Datenbank gab. Du kannst mal über FHEM teste, ob die Datenbank aktuelle Werte erhält:
set DbLog count
Der Name „DbLog“ natürlich auf deinen Namen anpassen. Es sollte nun als Reading die Anzahl der Werte in der Datenbank erscheinen. (siehe Bild)
In meinem Fall also „804939“ Zeilen mit „alten“ Werten und „24“ Zeilen mit „neuen“ bzw. „aktuellen“ Werten. Sollten bei dir das Reading countReading fehlen bzw. auf 0 sein, kann dies auf eine fehlerhafte Konfiguration hinweisen.
Würde dann einfach nochmal die Datenbank öffnen (Eingabe über die SSH-Verbindung zum Raspberry):
sudo sqlite3 /opt/fhem/fhem.db
Der Name der Datenbank sollte natürlich entsprechend angepasst werden, wenn sie bei dir anders heißt.
Dann mit folgendem Befehl die Tabelle für die aktuellen Werte erstellen.
CREATE TABLE 'current' (TIMESTAMP TIMESTAMP, DEVICE varchar(32), TYPE varchar(32), EVENT varchar(512), READING varchar(32), VALUE varchar(32), UNIT varchar(32));
Mit
.exit
kannst du die Bearbeitung dann verlassen.Nach ein paar Minuten kannst du ja dann mal testen ob es nun aktuelle Werte gibt in der Datenbank.
set DbLog count
Gruß 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
Hallo Peter,
passiert ist ja was, er hat die Readings erstellt. Hier sieht man nun, dass countCurrent auf 0 steht. Er hat also keine aktuellen Werte.
Die dafür benötigte Tabelle existiert ja aber. Sonst würde die Fehlermeldung ja nicht kommen.
Was mir gerade noch eingefallen ist, hast du das Attribut DbLogType richtig gesetzt:
attr DbLog DbLogType Current/History
Gruß 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.
Hallo Peter,
das habe ich auch gemerkt. Glaube das Attribut wurde damals bei mir automatisch gesetzt. Aber das ist wohl nicht mehr so. Werde es im Beitrag nun mit aufnehmen.
Tut mir leid, dass es dadurch bei dir nicht auf Anhieb klappte.
Gruß Daneil
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
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
Hallo Christoph,
das ist ja natürlich bisschen komisch. Was passiert den, wenn du einfach das gewünschte Device und Reading in das Feld eingibst? Im Format: „Device:Reading“ – Zum Beispiel „Heizung:Temperatur“.
Hast du mal überprüft, ob das loggen in der Datenbank funktioniert? Also ob sich Daten in der Datenbank befinden?
Gruß 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
Die Daten sind übrigens in der Datenbank vollständig und aktuell vorhanden.
Hallo,
habe im Forum ein ähnliches Problem gefunden. Dort gab es zwar ein Drop-Down-Menü, aber ohne Einträge.
Wie hast du kontrolliert, ob sich Daten in der Datenbank befinden? Über FHEM oder über die SSH-Konsole?
Im Forums-Beitrag hat nämlich FHEM gemeint, dass Daten vorhanden sind, die direkte Abfrage über die SSH-Konsole hat jedoch 0 Werte angezeigt.
–> Siehe Forum
Dort wurde das Problem durch ein Update vom dblog-Modul gelöst. Vielleicht hilft ja ein FHEM-Update bei dir auch.
Gruß 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
Hallo Christoph,
habe es bei mir mal eben schnell getestet. Die Plots sind wohl auf 9 Einträge begrenzt. Bei meinem zehnten Eintrag konnte ich auch keine Quelle angeben, siehe Bild.
Gruß 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
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
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
Hallo Jens,
sorry für die späte Antwort. War die letzten drei Wochen im Urlaub. Hast du dann mal in die DB geschaut, ob Werte der Devices in der Datenbank stehen? Oder beim Anlegen der DB vielleicht nicht alle gewünschten Readings mit eingebunden? Achte auf die Groß/Kleinschreibung: temperature ist nicht Temperature.
Gruß 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
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?