Guten Morgen
Seit gestern habe ich DBLog am laufen und habe heute morgen in die Datenbank geschaut und dabei festgestellt das ich über das doppelte an Daten habe was sonst durch filelog gespeichert wird. eingebunden habe ich dblog über
## DBLog
define myDbLog DbLog /opt/fhem/db.conf .*:.*
jetzt werden alle Daten zu jedem Device in die Datenbank geschrieben wie ich sie analog mit
Telenet inform on auch sehen kann.
das sind bei einem S300TH sind das 3
2013-08-29 09:17:47 CUL_WS CUL_WS_2 T: 21.8 H: 54.5
2013-08-29 09:17:47 CUL_WS CUL_WS_2 temperature: 21.8
2013-08-29 09:17:47 CUL_WS CUL_WS_2 humidity: 54.5
und bei einem TX3 2 Datensätze
2013-08-29 09:20:18 CUL_TX CUL_TX_44 T: 16.1 H: 70.0
2013-08-29 09:20:18 CUL_TX CUL_TX_44 humidity: 70.0
gebraucht wird ja jeweils nur der erste Datensatz
in Filelog wurde auch immer nur dieser gespeichert und die anderen ignoriert
wie bekomme ich das denn bei Dblog hin??
Hallo,
dieses Regexp
Zitat.*:.*
matcht ja auch auf alles.
Zitatwie bekomme ich das denn bei Dblog hin??
Das regexp entsprechend anpassen.
Grüße
Danke für deine Antwort
define myDbLog DbLog /opt/fhem/db.conf .*:T:.*
damit schreibt dblog nur noch die relevanten Temperatureinträge in die Datenbank aber eben nur noch die Temperatur Daten
Dadurch werden die Daten der FHT8V nicht mehr mit geloggt also wieder nicht alles in einer Datenbank.
Muss ich jetzt für die anderen Device eine neue Datenbank erstellen oder wie schaffe ich es das die anderen Daten auch noch in die bestehende Datenbank bekomme.
Hallo,
Zitataber eben nur noch die Temperatur Daten
Logisch. T matcht eben nur auf Temperatur und auf sonst nichts - auch nicht temperatur da T != t (meine ich zumindest).
ZitatMuss ich jetzt für die anderen Device eine neue Datenbank erstellen
Nein das wäre ja schöner overkill ;-)
Du kannst die regexp auch kombinieren (hoffe ich zumindest).
Versuch mal
define myDbLog DbLog /opt/fhem/db.conf .*:(T|t):.*
Dann sollte das temperature vom FHT geloggt werden.
Ich verwende als regexp .*:.* da bei mir alles auf eine 500 GB-HDD am RasPi loggt und da ist es mir mehr oder weniger egal welche Datenmenge anfällt.
Grüße
So in der Richtung habe ich mir das auch gedacht. Ich habe eine 1TB Platte drin und wenn ich alles loggen lasse komme ich auf ungefähr 3 MB pro Tag also kann man mit ca 100 MB im Monat rechnen.
1. Der dumme Nebeneffekt beim begrenzen ist, das in der current tabelle auch nur die Temperatur Daten geschrieben werden. Aber gerade das hatte mir gefallen das ich in diesr tabelle von allen Geräten den momentanen Zustand ablesen kann.
2. möchte ich die Stellantriebe (FHT8V) in % mit geloggt haben und das hatte ich bis jetzt mit filelog nicht hin bekommen aber ohne Begrenzung werden schön in die Datenbank geschrieben.
Wäre wohl besser eine Lösung die Monatlich die history tabelle sichert und auf Null setzt sonst würden ja im Jahr über 1GB Daten anfallen oder habe ich hier einen Denkfehler?
mich würde mal interessieren wie es andere User so machen?
Ach ja eine Frage habe ich noch
Zitat.*:.*
meine FHT8V sind als Device "stellantrieb.01" bis "stellantrieb.06" wie kann ich denn die zusammen fassen links vom
:* mit ich die
%zahl geloogt bekomme
Hallo,
Zitatsonst würden ja im Jahr über 1GB Daten anfallen
Ich hab jetzt nicht nachgerechnet aber das würde bei meiner 500 GB-Platte heissen das ich 500 Jahre drauf loggen kann ^^
So alt will ich dann doch nicht werden.
Ja, die Platte hängt erstmal nur am RasPi dran und auf der wird zur Zeit sonst nichts gespeichert ausser das DBLog drauf loggt.
Grüße
ich hab jetzt nicht nachgerechnet aber das würde bei meiner 500 GB-Platte heissen das ich 500 Jahre drauf loggen kann
denke auch an deine Nachwelt :-)
ich denke aber mal wenn man einen Temperatur Plot gaben möchte könnte das bei 1GB größe lange dauern oder keine Ahnung --> in dieser Richtung liegen ehr meine bedenken.
ZitatAch ja eine Frage habe ich noch
Zitat:
.*:.*
meine FHT8V sind als Device "stellantrieb.01" bis "stellantrieb.06" wie kann ich denn die zusammen fassen links vom :* mit ich die %zahl geloogt bekomme
Hallo,
bzgl. der Anzeige der Plots mach ich mir weniger Sorgen.
Einen Jahresplot egal welches Device lass ich mir eh nicht mit den 5-Minuten-Werten anzeigen.
Dafür gehen grad noch so die Tageshöchst- und -tiefstwerte (und das sind schon 365 Werte in einem Plot).
Für Wochen- oder Monatsplot nehme ich auch nur noch die Tageshöchst- und -tiefstwerte.
Alles andere ist dann nur noch ein roter bzw. blauer Balken und da kann ich eh nichts mehr erkennen.
Wegen deiner Stellantriebe:
Ich vermute mal du willst die Ventilstellung loggen.
Dann solltest du sowas noch dazu nehmen:
define myDbLog DbLog /opt/fhem/db.conf .*:(T|t|actuator):.*
Und für Luftfeuchte evtl. noch:
define myDbLog DbLog /opt/fhem/db.conf .*:(T|t|actuator|humidity):.*
Grüße
dann solltest du sowas noch dazu nehmen:
Zitatdefine myDbLog DbLog /opt/fhem/db.conf .*:(T|t|actuator):.*
das klappt leider nicht :-(
die valve Werte werden nicht mit geloggt, wäre ja auch zu einfach gewesen
übrings wenn .*:T:.* begrenze werden Temperatur und Luftfeuchte geloggt "T: 23.2 H: 49.7"<-- und so in die Datenbank geschrieben.
so habe mal den FHT80B Termostat und Steuergerät in Betrieb genommen und bei dem funktioniert das .*:(T|t|actuator):.* da wird der Prozentsatz dem sich die Stellantriebe (FHT8V) bewegen sollen mit gelogt.
Aber die Stellantriebe (FHT8V) selber antworte ja zurück wie weit sie geöffnet haben und das möchte ich gerne geloggt haben. Hier mal die Einträge vom Event Monitor:
2013-08-31 17:30:33 FHT FHT_1a16 actuator: 0%
<-- funktioniert vom FHT80B
2013-08-31_17:37:13 FHT_1a16 temperature: 24.2
<-- aber seine Temperatur wird trotz T|t nicht mit geloggt
2013-08-31 17:31:36 FHT8V stellantrieb.03 valve 0
<-- wird nicht geloggt vom FHT8V
die valve Werte werden nicht mit geloggt, das sind aber die Ist Werte von den Stellantrieben
Hallo,
Zitatdie valve Werte werden nicht mit geloggt,
Natürlich nicht.
Das regexp lautet ja
.*:(T|t|actuator):.*
und da ist von
Zitatvalve
keine Rede.
Wenn du valve auch loggen willst musst du das nur ins regexp mit aufnehmen.
So wie übringes alles andere auch was du loggen willst.
Zitataber seine Temperatur wird trotz T|t nicht mit geloggt
Das wundert mich jetzt etwas.
Versuch mal
Zitattemperature
anstelle von
Zitatt
Zitatübrings wenn .*:T:.* begrenze werden Temperatur und Luftfeuchte geloggt "T: 23.2 H: 49.7"<-- und so in die Datenbank geschrieben.
Ich auch logisch da die Zeile mit T beginnt wird die gesamte Zeile geloggt.
.*:
= von jedem beliebigem Device
T:
= jede Zeile die mit T beginnt
.*
= auf das x-beliebige Zeichen folgen werden in die Datenbank geschrieben.
Grüße
Zitat von: Puschel74 am 30 August 2013, 22:47:10
Hallo,
Ich hab jetzt nicht nachgerechnet aber das würde bei meiner 500 GB-Platte heissen das ich 500 Jahre drauf loggen kann ^^
So alt will ich dann doch nicht werden.
Ja, die Platte hängt erstmal nur am RasPi dran und auf der wird zur Zeit sonst nichts gespeichert ausser das DBLog drauf loggt.
Grüße
Hallo Puschel
Frage: Wie schaffst Du es, dass die externe Platte in den Stromsparmodus geht und damit die Lebensdauer nachhaltig vergrößert.
Hast Du einen Mechanismus/Routine am laufen, welche alle xMB die Daten erst auf die Festplatte schreibt oder läuft die ständig unter Vollast mit?
Gruß
Sailor
je nach platte verlängert es die lebensdauer wenn sie durch läuft statt immer wieder neu zu starten...
Hallo,
ZitatWie schaffst Du es, dass die externe Platte in den Stromsparmodus geht
Garnicht - ich lass die einfach laufen und laufen und laufen ...
Grüße
Ich nutze DbLog jetzt schon ziemlich lange - eine mysql-Datenbank ist für mich die deutlich sinnvollere und flexiblere Lösung zur Speicherung solcher Daten.
Außerdem habe ich noch ein unabhängiges "Anzeigefrontend" in php auf dem Webserver laufen, welches seine Infos nur aus der Datenbank bekommt und sonst keine Verknüpfung zu FHEM hat.
Für die Definition vom DbLog gibt es 2 Ansätze:
a) in der DbLog-Definition alles einschliessen - also .*:.* ... und alles was man nicht möchte pro Device mit DbLogExclude ausschliessen.
Hat den Nachteil, dass man bei neuen Devices erstmal Einträge ins Log bekommt und man DbLogExclude für jedes Device nachträglich sauber pflegen muss.
b) DbLog nur für die benötigten Device und/oder Readings aktivieren.
So nutze ich es jetzt, da Variante a) zu viel Pflegeaufwand wurde und ich ständig unnützen Müll in der DB hatte.
Beide Varianten können problemlos ziemlich umfangreiche Definitionen haben ... zB.
attr xxxx DbLogExclude (C|R-(b|dayl|h|m|no|s|t|w)|R_P[123]_t|Reg|b|com|s|T|w).*
define DbLog DbLog ./myfiles/db.conf .*(Katzenklappe.Sensor|Thermostat_Climate|Fenster(|.L|.M|.R)|_Pwr|Heizung(|.L|.R)_Clima|Luefter|Kuehlschrank|Spuelmaschine|Gas7[02]|Strom(70|72|.EDV)|Helligkeit|[Tt]emperatur|Temp|Wetter|Twilight):(ValvePosition|window|consumption.*|controlMode|cooling|working|current|desired-temp|humidity|hum_diffAvg.*|inside|kWh_[tl].*|level|measured-temp|power|temperature|total|twilight).*
Wichtig ist es auch die Datenbank regelmäßig zu bereinigen - bei zB ein tägliches
set DbLog deleteOldDays 30
Besonders beim Anzeigen der Plots braucht eine große Datenbank schon ziemlich lang ... vor allem auf dem nicht so flotten Raspberry Pi, ich habe sie deswegen auf den Server (Mac Mini) verlegt.
Ansonsten wirklich versuchen die Datenbank möglichst klein zu halten.
Wenn man sein komplettes Leben protokollieren will, kann man auch "archivieren", d.h. ältere Datensätze in eine andere Tabelle bzw. Datenbank auslagern ... oder auch nur Daten löschen, von vor 30 Tagen brauche ich die gemessenen Temperaturen sicherlich nicht mehr im 5-Minuten-Takt, sondern nur noch stündlich.
Allein durch solche Maßnahmen lässt sich viel Platz und Performance gewinnen.
Ein andere Möglichkeit zum Performancegewinn wäre vielleicht auch noch eine Verbesserte DB-definition - damit habe ich mich bisher aber noch nicht beschäftigt.
Standardmäßig ist die DBLog-Datenbank ja nur eine ziemlich primitive Tabellendefinition ohne jegliche Indizierung oder (Primär)schlüssel.
ZitatStandardmäßig ist die DBLog-Datenbank ja nur eine ziemlich primitive Tabellendefinition ohne jegliche Indizierung oder (Primär)schlüssel.
Das stimmt ja nun so nicht. Wenn man die DBLog so anlegt, wir allgemein an vielen stellen empfohlen (man könnte auch selbst darauf kommen), hat man einen Index über die Spalten DEVICE, READING und TIMESTAMP. Und das bringt gerade für die Plots einen sehr deutlichen Performance Schub.
Wenn man gewisse Daten länger vorhalten will, als anderen, kann man durchaus auch 2 oder mehr DBLogs definieren. Bei mir werden die Temperaturwerte bspw. in eine DB geschrieben, die anderen Werte in eine andere und dort lösche ich regelmäßig alles, was älter ist als 30 Tage.
Zitat von: marvin78 am 19 Oktober 2014, 08:33:22
Das stimmt ja nun so nicht. Wenn man die DBLog so anlegt, wir allgemein an vielen stellen empfohlen (man könnte auch selbst darauf kommen), hat man einen Index über die Spalten DEVICE, READING und TIMESTAMP.....
Im FHEM-Paket ist contrib/fhemdb_create.sql zur Erstellung der Datenbank enthalten - und dort ists eben nur die simple Struktur definiert.
Auch im Wiki sind nur die Felder aufgelistet und keine sinnvolle Indizierung vorgeschlagen.
Vielleicht sollte man diese beiden Quellen dann mal anpassen.
Könntest du evtl. mal eine der "vielen Stellen" verlinken, die Forensische nach DbLog, Index, Performance etc. brachte keine hilfreichen Treffer.
Natürlich kann man auf vieles selbst kommen - aber genau das ist doch der Zweck eines Forums/Community .... sein Wissen zu teilen, damit nicht jeder wieder von vorn anfangen muss.
CREATE DATABASE `fhem` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
CREATE USER 'fhemuser'@'%' IDENTIFIED BY 'fhempassword';
CREATE TABLE `fhem`.`history` (TIMESTAMP TIMESTAMP, DEVICE varchar(32), TYPE varchar(32), EVENT varchar(512), READING varchar(32), VALUE varchar(32), UNIT varchar(32));
CREATE TABLE `fhem`.`current` (TIMESTAMP TIMESTAMP, DEVICE varchar(32), TYPE varchar(32), EVENT varchar(512), READING varchar(32), VALUE varchar(32), UNIT varchar(32));
GRANT SELECT, INSERT, DELETE, UPDATE ON `fhem`.* TO 'fhemuser'@'%';
CREATE INDEX Search_Idx ON `fhem`.`history` (DEVICE, READING, TIMESTAMP);
Aus meinem mySQL im contrib. Da wird ein Index gesetzt.
Hallo,
das sollte man dann evtl. auch hier
http://www.fhemwiki.de/wiki/Neues_Charting_Frontend (http://www.fhemwiki.de/wiki/Neues_Charting_Frontend)
einfügen.
Jedesmal wenn ich eine Datenbank benutzen möchte nehme ich diesen Wikiartikel als "Vorlage".
Grüße
ok, sorry ...in meiner db_create_mysql stand diese Zeile noch nicht drin :(
Wahrscheinlich wurde diese Datei nie durch den Update-Befehl aktualisiert.
Das contrib Verzeichnis wird tatsächlich nicht durch den Update Prozess aktualisiert.