Datenbank aufräumen, säubern und klein halten

RudiP

Well-known member
Gestern überraschte mich HA mit der Meldung, das ihm der Festplattenspeicher knapp werden würde.
"Was ? Kann nicht sein" war mein erster Gedanke. Immerhin hatte ich HA damals 100 GB zugewiesen. Die können doch unmöglich voll sein.
Im Internet fand ich dann einen Hinweis, wie man das prüfen kann. Den Weg kannte ich auch noch nicht.
Einstellungen -> System -> Reparaturen und dann rechts oben die 3 Punkte auswählen und "Informationen zum System".
Weit unten unter "Recorder" findet man dann die Datenbank und siehe da, die hat eine Größe von knapp 57 GB. Ufff
Unter Einstellungen -> System -> Speicher sieht man auch, wie voll die Festplatte ist und ja, 96 GB von 100 GB belegt ist nicht so toll.

Nun gut. Ich habe mir erst mal damit geholfen, das ich HA mal schnell 100 GB zusätzlich gegeben habe, was dank Proxmox überhaupt kein Problem war.
Aber das kann natürlich nicht die Lösung des Problems sein.
Nun bin ich ein Freund davon, gewisse Daten auch mal was länger zur Verfügung zu haben, so 2 - 3 Jahre wären da schon fein. Damit kann man dann auch mal die PV Produktion oder den Gasverbrauch mit den letzten Jahren vergleichen.
Also habe ich in der configuration.yaml den Eintrag
Code:
recorder:
  purge_keep_days: 1100
Da die Datenbank aber nun doch deutlich gewachsen ist und das in nur knapp 2 Jahren, kam mir der Gedanke, WAS speichert die Datenbank eigentlich alles und was davon ist unnütz ?
Ich habe z.B. den Müllkalender am laufen. Speichert die Datenbank etwas alle Abfuhrtermine und das über 3 Jahre ?
Wäre ja totaler Blödsinn.
Wurde eine Automatisierung am 21.03.2020 ausgelöst ? Vollkommen unwichtig.
Habe ich vor 5 Wochen mit dem Lichtschalter das Licht angemacht ? Interessiert doch gar nicht mehr.
Aber, wenn HA sowas tatsächlich in der Datenbank speichert, könnte man das ja vom Speichern ausschließen und die Datenbank damit eventuell deutlich kleiner machen.
Taucht also die Frage auf, WAS speichert HA alles in der Datenbank.
InfluxDB -> Explorer und.....
Mist, nach Entitäten kann man wohl nicht suchen.
Ich habe mir dann mal SQLite web installiert, um ein wenig in der Datenbank zu schnüffeln.
ACHTUNG !!! Wer keine Ahnung von Datenbanken hat, sollte da nichts machen. Das Risiko, sich die Datenbank zu zerschiessen ist zu groß.

Nun, ich bin da noch nicht allzu tief in die tiefen der Datenbank eingedrungen, aber meine Befürchtungen scheinen sich bewahrheitet zu haben.
Eine Abfrage der Tabelle "states" erbrachte 195.400.702 Ergebnisse. Die Abfrage dauerte auch mal eben über 3 Minuten.
Ohne den Aufbau der Tabelle bzw. der Datenbank zu kennen wird es schwer, da was vernünftiges raus zu lesen, aber was man sehen kann sind Einträge wie "23:13" oder "am: 05.10.2023" oder "on" bzw. "off".
Das sind genau so Einträge, wie ich meine, braucht kein Mensch über einen längeren Zeitraum. Ich muß jetzt nur noch rausfinden, zu welcher Entität dieser Eintrag gehört um diesen dann in der configuration.yaml in Zukunft vom Speichern in der Datenbank auszuschließen.

Daran werde ich die nächsten Tage arbeiten und euch davon Berichten, so das jeder von euch das Nachvollziehen und auch selbst bei sich Anwenden kann. Ich denke, der ein oder andere hat auch Interesse daran, gewisse Daten über einen längeren Zeitraum zu speichern.
 
Ich habe herausgefunden, wie ich einzelne Entitäten sehen kann. Ich sehe z.B. mein Gasmeter bzw. das freie RAM.
Start der Aufzeichnung 02.10.2023 um 13:00:00 Uhr und seit dem meldet er stündlich seinen Wert.
8114 Einträge befinden sich in der Datenbank, das passt halbwegs, wenn man jeden Tag seit dem 02.10.2023 rechnet, mit 24 multipliziert. Abzüglich einiger Stunden, wo keine Werte Aufgezeichnet wurden, weil HA nicht lief oder das Gasmeter nicht wollte.
Und ehrlich, mich Interessiert es nicht, was das Gasmeter an einem Tag vor über 10 Monaten an freiem Speicher hatte.
Also werde ich diesen Wert, sowie wohl etliche andere von der weiteren Aufzeichnung in der Datenbank ausschließen und dann demnächst mal einen PURGE auslösen und hoffen, das die Datenbank dann deutlich verkleinert wird.
Ich werde Berichten.
 
Vermutlich hast Du mich falsch Verstanden. Das HA in der Grundeinstellung einfach alles aufzeichnet, ist bekannt. Der Wunsch, einiges auch länger aufzuheben, wurde hier auch schon mal geäußert.
Und das die Raspi Freunde, die auf SD Arbeiten davon auch noch profitieren dürften, wenn man die Schreibwut etwas eingrenzt, ist doch nur positiv.
Ich schau jetzt halt nur, wie man alles miteinander kombinieren könnte, so das alle davon profitieren können.
 
Hier mal ein Beispiel, wie ich aktuell meine configuration.yaml aufgebaut habe, um der Datenbank ein wenig auf die Finger zu schauen.
Code:
recorder:
  purge_keep_days: 1100
  exclude:
    domains:
      - update
    entity_globs:
      - sensor.sun*
      - weather.*
    entities:
      - sensor.wechselrichter_1_powerdc
      - sensor.wechselrichter_2_powerdc
      - sensor.nachtstrom_powerdc
      - sensor.wechselrichter_1_voltage
      - sensor.wechselrichter_2_voltage
      - sensor.nachtstrom_voltage
      - sensor.wechselrichter_1_frequency
      - sensor.wechselrichter_2_frequency
      - sensor.nachtstrom_frequency
      - sensor.wechselrichter_1_powerfactor
      - sensor.wechselrichter_2_powerfactor
      - sensor.nachtstrom_powerfactor
      - sensor.wechselrichter_1_reactivepower
      - sensor.wechselrichter_2_reactivepower
      - sensor.nachtstrom_reactivepower
      - sensor.shell_heinsberger_str_37_diesel
      - sensor.aral_gladbacher_strasse_21_diesel
      - sensor.aral_lauerstrasse_12_diesel
      - sensor.hem_forster_weg_31_diesel
      - sensor.bft_erkelenzer_str_21_diesel
      - sensor.aral_beecker_strasse_79_diesel
      - sensor.aral_roermonder_strasse_2_diesel
      - sensor.tankcenter_heerstr_60_diesel
      - sensor.pm_heerstr_14_diesel
      - sensor.totalenergies_ungerath_301_diesel
purge_keep_days: 1100
besagt, das ich meine Daten 1100 Tage, also ca. 3 Jahre aufheben will. Das ist damals aus dem Gedanken gewachsen, das man ja doch mal gerne eine Statistik für das aktuelle Jahr mit der des Vorjahres vergleichen will.
Das HomeAssistant dann quasi alles in die Datenbank schreibt und so lange speichert, naja, damals wußte ich noch nicht, was da auf mich zukommt.
Heute weiß ich, das allein das installieren einer Wetter Integration eine wahre Datenflut auslösen kann.
Da wird einfach jede Entität, die die Wetter Integration mit sich bringt, gnadenlos in der Datenbank gespeichert und das teilweise sogar im Minuten Takt.
Kann man sich leicht Vorstellen, was das Bedeutet.
Nun bin ich aber der Meinung, das ich nicht Wissen will, wie hoch die Wolkendecke vor 2 Jahren war oder ob wir Neben hatten. Das sind Daten, die sind aktuell bzw. für die Zukunft wichtig, aber nicht in der Vergangenheit.
Gut, das wir der Datenbank mit Einträgen in der configuration.yaml sagen können, das die gewisse Sensoren nicht speichern soll.
Dafür ist das "exclude:" da. Danach haben wir die Möglichkeit, entweder ganze Bereiche (domains), teile aus Bereichen (entity_globs) oder auch nur einzelne Entitäten (entities) vom Speichern auszuschließen.
Wie man in meinem Beispiel sieht Interessiert es mich nicht, welche Spannung einer der Wechselrichter vor 2 Jahren anliegen hatte.
Bei den Spritpreisen könnte man natürlich sagen, kann man sich ne nette Statistik erstellen, wie der Spritpreis sich entwickelt hat, aber ich glaube, das haben andere für uns schon getan und kann man im Internet nachsehen.

Kommen wir mal zu meiner Wetter App. Ich habe da Astroweather installiert, nutze es aber nur, um zu sehen, wie wird das Wetter heute oder morgen. Was Gestern, letzte Woche oder letztes Jahr war, ist mir egal. Also schließen wir Astroweather komplett vom Speichern in der Datenbank aus. Dazu füge ich im Abschnitt "entity_globs" folgendes hinzu.
Code:
      - Astroweather*
Damit sollte alles, was mit "Astroweather" anfängt, nicht mehr gespeichert werden.
Und immer dran denken. Configuration.yaml nach der Änderung speichern und HA einmal Neu starten.
Vermutlich würde es reichen, die schnelle Variante "Schnelles neu laden" zu nutzen, da ja nur die .yaml neu eingelesen werden sollen, aber sicherheitshalber starte ich lieber HA komplett neu, damit die Änderungen auch überall ankommen.

Der große Vorteil für alle, die noch mit SD Karte arbeiten, die Anzahl der zu schreibenden Daten reduziert sich deutlich, je nachdem, wie viel man vom Speichern ausschließt und die Lebenserwartung der SD dürfte auch ein wenig steigen.
Für alle anderen ist der Vorteil, weniger Schreibvorgänge, damit schnelleres Arbeiten von HA. Logisch, wenn da ein ganzer Schwall Daten gespeichert werden muß, dauert es ein wenig, bis HA sich wieder um andere Dinge kümmern kann.
Je nach Abfrageintervall der Sensoren könnte sich das eventuell schon bemerkbar machen, denke ich.
Aber auch die Größe der Datenbank dürfte sich merklich reduzieren und das Backup damit schneller laufen.
Da auch bei einem Update von HA vorher die Daten und auch die Datenbank gesichert wird, laufen sicher auch die Updates danach dann schneller.

Zu Erwähnen wäre auch noch, das man HA natürlich generell das Speichern von Daten in die Datenbank untersagen kann und nur ganz bestimmte Dinge dann explizite angibt, die gespeichert werden sollen. Hat in meinen Augen aber den Nachteil, wenn man was neues Anschließt und vergisst, es zum Speichern frei zu geben, werden auch keine Daten erfasst.


Es gibt auch die Möglichkeit, gezielt bereits gespeicherte Einträge zu löschen.
Wenn man z.B. mal ein Gerät Installiert hatte, was aber zwischenzeitlich nicht mehr existiert und man die Daten auch nicht mehr haben will oder beim Rumexperimentieren diverse Helfer erstellt und getestet und dann doch verworfen wurden, sowas könnte man dann auch gezielt löschen.
Aber dazu später mehr.

Ich mach mich bei mir erst mal wieder auf die Suche, was den noch so alles gespeichert wird, was ich gar nicht brauche.
 
1100 Tage? Wow ...

Und die Langzeitdaten? Ich speichere nur 10 Tage und habe trotzdem alle Daten von Beginn an... Die älteren Daten halt nicht mehr Sekunden genau
 
Naja, sind doch nur 3 Jahre. :)
Aber wieso hast Du Langzeitdaten ? Ich denke, InfluxDB löscht da Regelmäßig.
Wobei ich eben festgestellt habe, das obiges mit exclude wohl auch nicht funktioniert. Es werden trotzdem weiterhin Daten aufgezeichnet.
Ich muß mich da mal mehr Einlesen, was die Datenbank da genau macht.
 

Zurzeit aktive Besucher

Letzte Anleitungen

Statistik des Forums

Themen
5.294
Beiträge
52.611
Mitglieder
5.047
Neuestes Mitglied
HarryW
Zurück
Oben