Influxdb aufräumen / alte sensoren löschen?

gibt es eine möglichkeit oder ein script, was die entitäten aus ha mit den entitäten in influxdb vergleicht und dann die nicht mehr vorhandenen aus der influxdb löscht?

mfg
markus

3 „Gefällt mir“

An einer automatisierten Lösung wäre ich auch interessiert

Skript in Python

import requests
import json

# InfluxDB Configuration
influxdb_host = "localhost"
influxdb_port = 8086
influxdb_db = "homeassistant"

# Home Assistant Config
ha_host = "localhost"
ha_port = 8123
ha_token = "YOUR_HA_ACCESS_TOKEN"

# Alle Entitäten aus Home Assistant
headers = {
    "Authorization": f"Bearer {ha_token}",
    "Content-Type": "application/json",
}
response = requests.get(f"http://{ha_host}:{ha_port}/api/states", headers=headers)
ha_entities = [entity["entity_id"] for entity in response.json()]

# Alle Entitäten aus InfluxDB
response = requests.get(f"http://{influxdb_host}:{influxdb_port}/query?q=SHOW MEASUREMENTS ON {influxdb_db}")
influxdb_entities = [measurement["name"] for measurement in response.json()["results"][0]["series"][0]["values"]]

# Löschen von Entitäten in InfluxDB, die sich nicht mehr im Home Assistant befinden
for entity in influxdb_entities:
    if entity not in ha_entities:
        requests.post(f"http://{influxdb_host}:{influxdb_port}/query?q=DROP MEASUREMENT {entity} ON {influxdb_db}")

Dieses Skript ruft zunächst alle Entitäten in HA ab schreibt sie in Variable ha_entities . Anschließend werden alle Entitäten in der InfluxDB-Datenbank abgefragt und in der Variable influxdb_entities gespeichert. Das Skript durchläuft dann die Liste der Entitäten in der InfluxDB und überprüft, ob es direse Entität auch in HA vorhanden ist. Wenn eine Entität in der InfluxDB nicht mehr in HA vorhanden ist, wird sie aus der InfluxDB-Datenbank gelöscht.

dieses Skript vorsichtig verwenden bitte voher Sicherungskopie Ihrer InfluxDB-Datenbank

ist aber noch ungetestet

danke für dein script.
gleich mal getestet, bekomme aber einen fehler.

➜  ~ python3 influxdb-aufräumen.py
Traceback (most recent call last):
  File "/root/influxdb-aufräumen.py", line 24, in <module>
    influxdb_entities = [measurement["name"] for measurement in response.json()["results"][0]["series"][0]["values"]]
KeyError: 'results'

vielleicht was ich machen muss, kenn mich mit py nicht aus.

mfg

KeyError: ‘results’" auftritt, was darauf hindeutet, dass die JSON-Antwort von InfluxDB nicht das erwartete Format hat oder dass keine Ergebnisse

Es gibt einige mögliche Ursachen für diesen Fehler:

  1. Überprüfen ob die InfluxDB-Verbindungsinformationen (Host, Port, Datenbank) korrekt sind. Stellen sicher, dass Sie auf die richtige InfluxDB-Instanz zugreifen und dass die Datenbank existiert.
  2. Stellen sicher, dass InfluxDB-Daten vorhanden sind. Das Skript erwartet, dass mindestens eine Messung vorhanden ist. Überprüfen die InfluxDB-Datenbank, um sicherzustellen, dass Messungen vorhanden sind.
  3. Überprüfen Sie die InfluxDB-Abfrage in der Zeile response = requests.get(f"http://{influxdb_host}:{influxdb_port}/query?q=SHOW MEASUREMENTS ON {influxdb_db}"). Stellen sicher, dass die Abfrage korrekt ist und die erwarteten Ergebnisse zurückgibt.
    Du Kannst auch die Abfrage direkt in Ihrem Webbrowser auszuführen, um die Ergebnisse zu überprüfen.

das ist das ergebnis der http://192.168.50.2:8086/query?q=SHOW abfrage.
es kam zuerst ein popup für user und passwort.
habs eingegeben und das war die ausgabe:

{"error":"error parsing query: found EOF, expected CONTINUOUS, DATABASES, DIAGNOSTICS, FIELD, GRANTS, MEASUREMENT, MEASUREMENTS, QUERIES, RETENTION, SERIES, SHARD, SHARDS, STATS, SUBSCRIPTIONS, TAG, USERS at line 1, char 6"}

wenn ich die abfrage so mache: http://192.168.50.2:8086/query?q=SHOW%20MEASUREMENTS%20ON%20homeassistant

kommt das:

{"results":[{"statement_id":0,"series":[{"name":"measurements","columns":["name"],"values":[["%"],["% available"],["A"],["EUR"],["EUR/kWh"],["GiB"],["Hz"],["Jobs"],["MB"],["MB/s"],["MiB"],["Tage"],["UV index"],["V"],["W"],["Wh"],["clients"],["dBm"],["gCO2eq/kWh"],["hPa"],["items"],["kVarh"],["kWh"],["lqi"],["m"],["m/s"],["mA"],["mV"],["min"],["mm"],["packages"],["pending backup(s)"],["pending update(s)"],["ppb"],["ppm"],["px"],["s"],["state"],["steps"],["var"],["°"],["°C"],["°C/s"],["µg/m³"],["€"]]}]}]}

Fehlermeldung deutet darauf hin, dass ein Fehler beim Parsen der Abfrage aufgetreten ist. Es scheint, dass die Abfrage nicht korrekt formatiert ist. Stelle sicher, dass du eine gültige InfluxDB-Abfrage verwendest.

Hier ist ein Beispiel für eine einfache InfluxDB-Abfrage, um alle Messwerte einer bestimmten Messung abzurufen:
SELECT * FROM measurement_name

Ersetze “measurement_name” durch den tatsächlichen Namen der Messung, von der du die Daten abrufen möchtest.

Wenn du weiterhin Probleme mit der InfluxDB-Abfrage hast, teile bitte die genaue Abfrage mit, die du verwendest, damit ich dir bei der Fehlerbehebung helfen kann.

das zweiter ist Antwort, die du erhalten hast, ist eine Liste der verfügbaren Messungen in deiner InfluxDB-Datenbank

response = {"results":[{"statement_id":0,"series":[{"name":"measurements","columns":["name"],"values":[["%"],["% available"],["A"],["EUR"],["EUR/kWh"],["GiB"],["Hz"],["Jobs"],["MB"],["MB/s"],["MiB"],["Tage"],["UV index"],["V"],["W"],["Wh"],["clients"],["dBm"],["gCO2eq/kWh"],["hPa"],["items"],["kVarh"],["kWh"],["lqi"],["m"],["m/s"],["mA"],["mV"],["min"],["mm"],["packages"],["pending backup(s)"],["pending update(s)"],["ppb"],["ppm"],["px"],["s"],["state"],["steps"],["var"],["°"],["°C"],["°C/s"],["µg/m³"],["€"]]}]}]}

measurements = [measurement[0] for measurement in response["results"][0]["series"][0]["values"]]

print(measurements)

Dieser Code extrahiert die Messungen aus der Antwort und gibt sie als Liste von Strings aus.

werde mich die Tage noch mall ran setzen aber schon mall danke für die infos

die abfrage

response = requests.get(f"http://{influxdb_host}:{influxdb_port}/query?q=SHOW MEASUREMENTS ON {influxdb_db}"

gibt ja das

{"results":[{"statement_id":0,"series":[{"name":"measurements","columns":["name"],"values":[["%"],["% available"],["A"],["EUR"],["EUR/kWh"],["GiB"],["Hz"],["Jobs"],["MB"],["MB/s"],["MiB"],["Tage"],["UV index"],["V"],["W"],["Wh"],["clients"],["dBm"],["gCO2eq/kWh"],["hPa"],["items"],["kVarh"],["kWh"],["lqi"],["m"],["m/s"],["mA"],["mV"],["min"],["mm"],["packages"],["pending backup(s)"],["pending update(s)"],["ppb"],["ppm"],["px"],["s"],["state"],["steps"],["var"],["°"],["°C"],["°C/s"],["µg/m³"],["€"]]}]}]}

zurück.
ist das jetzt falsch oder richtig?

denke die zeile

influxdb_entities = [measurement["name"] for measurement in response.json()["results"][0]["series"][0]["values"]]

kann damit nichts anfangen oder?

danke für deine hilfe

es Scheint alles zu Funktionieren könntest du mall überprüfen ob du noch entitäten influxdb hast die du in HA nicht mehr hast

hab immer noch einige drin.

wenn ich das script ausführe in root per ssh kommt das

➜  python3 influxdb-aufraeumen.py
Traceback (most recent call last):
  File "/config/python_scripts/influxdb-aufraeumen.py", line 24, in <module>
    influxdb_entities = [measurement["name"] for measurement in response.json()["results"][0]["series"][0]["values"]]
KeyError: 'results'

und wenn ich es in ha als dienst ausführe kommt das:

Error handling message: Service python_script.influxdb-aufraeumen does not match format <domain>.<name> for dictionary value @ data['sequence'][0]['service']. Got 'python_script.influxdb-aufraeumen' (invalid_format)

ok ich setzt noch noch mall ran mall kucken wo der Fehler liegt gebe dir auf jedenfalls bescheid wen ich es noch mall überarbeitet habe

Der Fehler “KeyError: ‘results’” tritt auf, wenn das angeforderte JSON-Objekt nicht den erwarteten Schlüssel “results” enthält. Dies deutet darauf hin, dass die JSON-Antwort von InfluxDB nicht das erwartete Format hat oder möglicherweise leer ist

  • Stelle sicher, dass die InfluxDB-Abfrage korrekt ist und die erwarteten Daten zurückgibt. Du kannst es überprüfen, indem du die Abfrage direkt in InfluxDB ausführst und die Ergebnisse überprüfst.
  • Vergewissere dich, dass die Verbindung zur InfluxDB erfolgreich hergestellt wurde und die Antwort korrekt empfangen wird. Du kannst dies überprüfen, indem du die Antwort der Anfrage ausdruckst und überprüfst, ob sie die erwarteten Daten enthält.
    überprüfe deine InfluxDB-Konfiguration, die Datenbank und die Messungen, um sicherzustellen, dass alles korrekt eingerichtet ist.

aber danke schon mal für das testen hab schon ein kleinen Ansatz wo ich das Debugging anfangen kann

meinst du dieses ergebnis?

info:
hab das influxdb addon von ha

Hallo
auch wenn das Thema schon ein paar Monate nicht angetastet worden ist… hast du schon ein neueres Script diesbezüglich hingekriegt? Wäre ein tolles Ding für viele User hier, denke ich :wink:
VG und danke schon mal für die Antwort
vsa

grüße danke der nach frage läuft noch nicht ganz so wie es soll noch ein paar Bugs aber sobald ich es richtig zum laufen bekomme stelle ich es gerne Bereit

Guten Morgen zusammen,

gibt es eigentlich generell nur eine Lösung über ein Script?

Als ich mal gegoogelt hatte, gab es eine Lösung in der es über eine Schaltfläche in der InfluxDB selbst gehen soll. Diese Schaltfläche gab es jedoch nicht, wenn man über den HA geht.

Und damals über Docker ginge es zumindest manuell über einen command.

Was meint ihr denn dazu?

EDIT:
Sorry, hatte die erste Frage falsch gelesen bzw. den Abgleich überlesen. Da kann ich leider nicht helfen. Ich lasse den ursprünglichen Post aber mal stehen, evtl. hilft es ja jemand anderen zufällig.

Falls es noch aktuell ist:

Ich bin bei mir in die InfluxDB in Home Assistant und habe im Query folgendes eingegeben:

USE “homeassistant”; DELETE FROM “°C” WHERE “entity_id” = ‘temperature_16’ AND time > ‘2022-07-28’ AND time < ‘2022-08-10’

“homeassistant” ist mein DB-Name, den müsstest du anpassen
“°C” müsstest du ersetzen, je nachdem aus welcher “Katergorie” deine Entität ist
“entity_id” = ‘blabla’ müsstest du auch anpassen. blabla wäre dein Entitätssname
AND time usw. brauchst du nur für bestimmte Zeiträume. Wenn du das weg lässt, löscht er einfach alles der genannten Entität, unabhängig vom Zeitraum.

WICHTIG: IMMER BACKUP VORHER

Ich hoffe die Syntax ist klar. Hat bei mir wunderbar geklappt und ich konnte die DB DEUTLICH reduzieren.

Jetzt suche ich nur nach einem Weg, wie ich zukünftig verhindere, dass z.B. “V” (Volt) überhaupt aufgezeichnet wird, weil mich bestimmte Sachen einfach nicht interessieren, unabhängig welche Entität. Aber da mach ich jetzt mal einen neuen Thread auf. Hoffe mir kann jemand helfen.

hi bei dein HA influx config einfach den eintrag mit erweitern zb so

exclude:
    entities:
      - sensor.pc_leiste_energy_voltage

leider kann nicht nur Voltage schreiben man mus genau den sensor angeben

so sieht meine aus

###################################################
#                                                  #
#                Datenbank                         #
#                                                  #
####################################################
influxdb:
  username: XXXXX
  password: XXXXX
  tags:
    source: HA
  tags_attributes:
    - friendly_name
  default_measurement: state
  exclude:
    entities:
      - zone.home
    domains:
      - persistent_notification
      - person
  include:
    domains:
      - sensor
      - binary_sensor
      - sun
      - light
      - cover
      - switch
      - climate
      - input_boolean
      - input_number
      - counter
      - number
    entities:
      - weather.home
      - water_heater.vicare_water
      - sensor.bitshake_smartmeterreader_energy_total
1 „Gefällt mir“

Sorry für die späte Antwort, aber ich wollte mich nochmal bedanken.
Ich habe es jetzt so gelöst wie von dir vorgeschlagen und halt “leider” jeden Sensor separat angesprochen… es war ein bisschen Aufwand, aber eben nur einmalig. Hatte gehofft, es gibt eine einfachere Möglichkeit - auch um zukünftige Sensoren gleich außen vor zu lassen. Letzteres könnte ich zwar auch über “include” und eben nur die zulassen, welche ich möchte, aber lieber habe ich mal zu viel Einträge in der DB als zu wenig, falls ich das mal vergessen sollte.

Also danke nochmal.