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
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
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:
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.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
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
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
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.