Es gibt eine Lösung für die Speicherung von Daten über einen Kommandozeilenbefehl. Leider scheint die Auswertung in der influxDB selbst, also die in der influxDB Oberfläche, fehlerhafte Werte anzuzeigen, wenn man den Darstellungsbereich sehr lange wählt. Sie sind aber korrekt in der influxDB abgelegt.
Grafana zeigt die Werte zumindest korrekt an.
Ich habe in der influxDB ein neues bucket test angelegt und dort erst einmal alles getestet. Das bucket kann man entweder immer wieder löschen und neu anlegen, oder durch den ganz unten aufgeführten Befehl alle Daten darin löschen.
influx write \
--bucket homeassistant \
--t HIER MUSS DEIN TOKEN HIN \
--org-id HIER MUSS DEINE IRG-ID HIN \
--format csv \
"#constant measurement,MWh
#datatype tag,tag,tag,tag,time:RFC3339,double
source,domain,entity_id,friendly_name,time,value
MANUELL,sensor,heating,Heating,2022-09-30T21:59:00Z,2.367
MANUELL,sensor,heating,Heating,2022-10-31T21:59:00Z,2.370
MANUELL,sensor,heating,Heating,2022-11-30T21:59:00Z,2.493
MANUELL,sensor,heating,Heating,2022-12-31T21:59:00Z,2.989
MANUELL,sensor,heating,Heating,2023-01-31T21:59:00Z,3.275
MANUELL,sensor,heating,Heating,2023-02-28T21:59:00Z,3.427
MANUELL,sensor,heating,Heating,2023-03-31T21:59:00Z,3.585
MANUELL,sensor,heating,Heating,2023-04-30T21:59:00Z,3.646
"
influx write \
--bucket homeassistant \
--t HIER MUSS DEIN TOKEN HIN \
--org-id HIER MUSS DEINE ORG-ID HIN \
--format csv \
"#constant measurement,m³
#datatype tag,tag,tag,tag,time:RFC3339,double
source,domain,entity_id,friendly_name,time,value
MANUELL,sensor,coldwater,ColdWater,2022-09-30T21:59:00Z,55.141
MANUELL,sensor,coldwater,ColdWater,2022-10-31T21:59:00Z,60.016
MANUELL,sensor,coldwater,ColdWater,2022-11-30T21:59:00Z,64.575
MANUELL,sensor,coldwater,ColdWater,2022-12-31T21:59:00Z,68.466
MANUELL,sensor,coldwater,ColdWater,2023-01-31T21:59:00Z,73.383
MANUELL,sensor,coldwater,ColdWater,2023-02-28T21:59:00Z,77.636
MANUELL,sensor,coldwater,ColdWater,2023-03-31T21:59:00Z,82.304
MANUELL,sensor,coldwater,ColdWater,2023-04-30T21:59:00Z,87.985
MANUELL,sensor,hotwater,HotWater,2022-09-30T21:59:00Z,20.535
MANUELL,sensor,hotwater,HotWater,2022-10-31T21:59:00Z,21.998
MANUELL,sensor,hotwater,HotWater,2022-11-30T21:59:00Z,23.664
MANUELL,sensor,hotwater,HotWater,2022-12-31T21:59:00Z,24.951
MANUELL,sensor,hotwater,HotWater,2023-01-31T21:59:00Z,26.784
MANUELL,sensor,hotwater,HotWater,2023-02-28T21:59:00Z,28.395
MANUELL,sensor,hotwater,HotWater,2023-03-31T21:59:00Z,30.298
MANUELL,sensor,hotwater,HotWater,2023-04-30T21:59:00Z,32.226
"
→ Ich hoffe die Werbezeiten sind selbsterklärend.
So konnte ich meine Werte einlesen und kann jedes beliebige Datum wählen.
Einmal im Monat ist das nicht die Welt und habe ich bereits für den Mai einmal ausgeführt. Dafür habe ich die obigen Befehlszeilen einfach nur reduziert, das neue Datum eingetragen und die neuen Werte.
Folgendes kommt dann bei mir raus.
→ Achtung, wenn man neue Werte zeitnah eingespielt hat, dann muss man warten bis diese in der Auswertung angezeigt werden, da z.B. bei mir das Datum der neuen Werte in der Zukunft lag.
Die Auswertung am Ende so hin zu bekommen war etwas tricky, da ich mich weder mit grafana noch der influxDB und ihrem “SQL” wirklich gut auskenne, aber mit folgendem Code ging es dann.
from(bucket: "homeassistant")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r["_measurement"] == "m³")
|> filter(fn: (r) => r["_field"] == "value")
|> filter(fn: (r) => r["domain"] == "sensor")
|> filter(fn: (r) => r["entity_id"] == "hotwater" or r["entity_id"] == "coldwater")
|> filter(fn: (r) => r["source"] == "MANUELL")
|> difference(nonNegative: false, columns: ["_value"])
#UND
from(bucket: "homeassistant")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r["_measurement"] == "MWh")
|> filter(fn: (r) => r["_field"] == "value")
|> filter(fn: (r) => r["domain"] == "sensor")
|> filter(fn: (r) => r["entity_id"] == "heating")
|> filter(fn: (r) => r["friendly_name"] == "Heating")
|> filter(fn: (r) => r["source"] == "MANUELL")
|> difference(nonNegative: false, columns: ["_value"])
Grundsätzlich zur InfoxDB
Ich habe die Erfahrung gemacht, dass sie schnell anwächst, weil Wirkich jeder Mist dort reingeschrieben wird. Ich habe deshalb die Werte, die in die influxDb geschrieben werden sollen stark eingeschränkt und alle entity_ids in einer include-Datei zusammen getragen.
#Config für die influxDB
api_version: 2
ssl: false
host: 192.168.178.252
port: 8086
token: TOKEN
organization: homeassistant
bucket: homeassistant
tags:
source: HA
tags_attributes:
- friendly_name
default_measurement: units
include: !include influxdb_include.yaml
Es werden aktuell nur noch ca 100Werte in die influxDB transferiert und sie belegt im Moment ca 5,5GB nach knapp 1,5 Monaten glaube. MariaDB habe ich 30Tage purge-keep-days eingestellt. Ob ich das so lasse weiss ich noch nicht.
Was ist weiterhin offen.
- Die gespeicherten Werte lassen sich sicherlich noch weiter reduzieren
- ein bucket für langfristige Werte, die aus einem bucket für kurzfristige Werte gefüttert wird, wobei in dem bucket mit den langfristigen Werten dann z.B. nur noch Tageswerte und keine untertägigenWerte mehr abgelegt werden wäre eine Lösung, habe ich aber noch nicht zu Ende gedacht und angegangen.
Mit 2. komme ich nicht so recht weiter, weil ich nichts löschen möchte was ich eventuell doch noch brauchen könnte
Ich kämpfe und hadere noch mit mir.
Das löschen von Werten in der influxDB ist ein bisschen tricky, aber es geht mit folgendem Befehl. Start- und Stopzeitpunkt sollte man großzügig wählen
influx delete \
--t HIER MUSS DER TOKEN HIN \
--bucket homeassistant \
--org-id HIER MUSS DIE ORG-ID HIN \
--start '1910-01-01T01:00:00Z' \
--stop '2030-12-31T23:00:00Z' \
--predicate 'entity_id="fritz_box_7590_upload_throughput_2"'
Dann werden alle gespeicherten Werte mit der entity_id="fritz_box_7590_upload_throughput_2" gelöscht zwischen obigem Start- und Stopdatum.
als predicate kann auch measurement oder domain oder bucket oder _field gewählt werden. Alles was man als Identifier in der influxDB auch finden kann.
Um dies alles in der Konsole der LXC der influxDB ausführen zu können muss die influxDB mit der influxDB CLI installiert wurden sein. Sonst gehen die Befehle nicht.
Viel Erfolg
Claudius
P.S. ich habe natürlich alles immer zuerst in meinem test bucket ausprobiert 