Manuelle Zählerstands-Erfassung

Hallo liebe S42-Community,

ich lese zwar aktuell meinen Stromzähler (via Shelly 3EM) und Gaszähler (via ESP-Hallsensor) aus, jedoch lese ich seit 11 Jahren jeden Monat alle meiner Zähler “von Hand” ab. Ich möchte gerne eine Art Datenbank in Home Assisstant “füttern”, indem ich jeden Monat ein Textfeld befülle, welches dann in einer Tabelle landet und grafische Auswertungen erlaubt.

Wie würdet ihr dieses Thema angehen? Danke euch vorab :slight_smile:

PS: hab noch keine influxDB / Grafana, weil ich noch auf sdcard unterwegs bin… :slight_smile:

Erstmal herzlich willkommen im HA-Forum! :slight_smile:

Ich habe das ganze mit EXCEL gelöst und für die einzelnen Verbräuche Kurven der
Monats-/Jahresverbräuche erzeugt.

Mit HA geht es sicherlich auch, macht aber m.E. nur Sinn, wenn die Zahlenwerte automatisch
erfasst werden (und dafür ist mir das ESP-Home momentan noch zu viel Bastelarbeit).

Auch bei mir: Excel … tut für mich was es soll

Ich bin auch noch bei Excel. Habe aber das Problem, dass ich es nicht schaffe immer am selben Tag, zB. am ersten des Monats, abzulesen.
Dadurch kann ich nur schwer die Monate zum Vorjahr vergleichen, da ich immer manuell (bzw mit einer Formel) interpolieren muss.
Wie habt ihr das gelöst?
Also zB.
1.1.23 1000kWh
17.1.23 1500kWh
10.2.23 2000kWh
20.2.23 2500kWh
5.3.23 3000kWh
Ich füge dann immer Zeilen dazwischen ein, um immer für den ersten zu interpolieren.

Ich versuche den Termin bestmöglich einzuhalten und Einzelwerte über die Tagesdaten aus dem Energie-Dashboard zu korrigieren

Eine manuelle Erfassung macht nicht wirklich Sinn, da HomeAssistant nach 10Tagen Sensorwerte wieder löscht. Das kann man zwar ändern, aber will man nicht wirklich.

Ich mache aktuell folgendes

Ich schreibe meine Werte (Kaltes Wasser, Warmes Wasser und Heizung) an jedem Monatsende in eine Textdatei und lese diese durch Home Assistant aus.

Dazu habe ich in der configuration.yaml folgendes eingefügt

#Hier wird definiert auf welche FileStruktur HomeAssistant zugreifen darf
homeassistant:
  whitelist_external_dirs:
    - /config/files

→ diese Funktionalität ist laut HA irgendwie abgekündigt oder soll irgendwann nicht mehr tun. Ich bin gespannt was dann kommen soll und wird.

in der Filestruktur unter /config/files (unter config direkt befindet sich z.B. die configuration.yaml) habe ich eine Datei, die wie folgt aussieht und den Namen sensor.csv heisst

timestamp,cold water, warm water, heating
1664575200,55.141,20.535,2.367
1667257200,60.016,21.998,2.370
1667257200,64.575,23.664,2.493
1672527600,68.466,24.951,2.989
1675206000,73.383,26.784,3.275
1677608087,77.636,28.395,3.427
1680300000,82.304,30.298,3.585
1682871682,87.985,32.226,3.646

Sobald die Datei geändert und gespeichert wurde liest HomeAssistant die letzte Zeile ein.
→ Achtung hier werden Zahlen in englischem Format verarbeitet. der Punkt ist das deutsche Komma.
→ timestamp ist ein Unix-Timestamp es gibt im Internet genug WebSeiten die Timestamps in dieses Format umrechnen können. Man kann die Spalte aber auch weg lassen. Siehe weiter unten.

und in der sensor.yaml, die ich in der configuration.yaml eingebunden habe, habe ich folgendes drin

- platform: file
  name: ColdWater
  file_path: /config/files/sensor.csv
  value_template: '{{ value.split(",")[1] }}'
  #class: water - nicht erlaubt
  unit_of_measurement: "m³"
- platform: file
  name: HotWater
  file_path: /config/files/sensor.csv
  value_template: '{{ value.split(",")[2] }}'
  #class: water - nicht erlaubt
  unit_of_measurement: "m³"
- platform: file
  name: Heating
  file_path: /config/files/sensor.csv
  value_template: '{{ value.split(",")[3] }}'
  #class: energy - nicht erlaubt
  unit_of_measurement: "°MWh"

Welche Schwächen hat dieses Vorgehen:

  1. Da HomeAssistant nur die letzten 10Tage (kann geändert werden, ist aber nicht zu empfehlen) speichert, ist diese monatliche Pflege sinnlos.
  2. Ich habe es bis heute nicht geschafft zu den Werten ein passendes Datum/Uhrzeit zu speichern. HomeAssistant nimmt hier einfach das Datum und die Uhrzeit zu der die Daten eingelesen werden.
  3. Ich habe es bisher nicht geschafft die Sensoren ins EnergieDashboard zu integrieren. Die “unit_of_mesurment” stimmen zwar, aber ich vermute das HomeAssistant hier mehr Werte und Veränderungen sehen möchte als einen wochenlang statischen Wert. Den Versuch einen Helfer aufzubauen der seine eigenen Werte einfach fortschreibt, habe ich erst gar nicht probiert.

Lösungsmöglichkeiten:
zu 1) habe ich folgende Lösung. Ich habe mir in proxmox eine LXC mit InfluxDB erstellt und speichere dort alle Sensorwerte längerfristig ab. Leider kann ich hier noch nicht berichten, da Proxmox erst seit einigen Wochen und die InfluxDB erst seit einigen Tagen läuft. Die Daten werden aber definitiv übertragen.
Ich habe es bisher nicht geschafft in der InfluxDB die Daten zu importieren und/oder dort die Datumsinformation zu manipulieren. Ein Datenimport ist in der InfluxDB auch keine triviale Geschichte. Als einigermaßen erfahrener SQLer mit Sybase/MSSQL KnowHow ist die InfluxDB einfach ein ganz anderes Datenbank Konstrukt und ich wollte mir jetzt mit wilden Importversuchen nicht die anderen Werte oder ganze Datenbank schrotten
zu 2) muss ich sagen, dass ich Werte halt ablese und sofort abspeichern. Wirklich toll ist das aber nicht, denn ich muss dann eben einfach wirklich an jedem Monatsende die Werte manuell auslesen und speichern.
zu 3) da ich für 2 keine wirkliche Lösung habe, habe ich für 3) erst gar nicht weiter gesucht.

Ich möchte jetzt erst einmal sehen in wieweit mein manueller Weg sauber in der InfluxDB ankommt und von Grafana auch sauber dargestellt wird. Eine manuelle Eingabemöglichkeit inklusive Timestamp wäre aber echt der absolute Knaller. Ich vermute, dass es sowas aber in HA nicht geben wird. Die Ausrichtung von HA ist hier einfach eine andere. Der FileImport wäre ja eine Lösung, wenn dabei auch der mitgelieferte Timestamp berücksichtigt werden würde.

Hallo, gibt es bei dir schon ein Update?
Bist du nach knapp einem Monat mit deiner InfluxDB schon weiter gekommen und der Datenaufbereitung?
Ich stehe gerade vor der selben Situation. Habe meinen DB aber auch erst seit Sonntag auf dem Proxmox am laufen und entsprechend noch keine Daten.

Gruß Sascha

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.

  1. Die gespeicherten Werte lassen sich sicherlich noch weiter reduzieren
  2. 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 :open_mouth: 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 :wink:

1 „Gefällt mir“

Ok, Danke für das Feedback.
Schaue ich mir mal an.

Gruß Sascha

Auch wenn meine Antwort spät kommt (so zwei Jahre nach der ursprünlgichen Frage) trotzdem noch die Skizze wie ich das gelöst habe:

==> Automatisierung, die einmal täglich den aktuellen Zählerstand ausliest und in eine Tabelle via Google Sheets einträgt.

Somit habe ich im einer Googe-Tabelle alle Werte und kann die dort auswerten.

kanst Du mir das bitte etwas genauer erklären?
Google-Sheets ist eingerichtet, und nun? Stehe ein bisschen auf dem Schlauch…

über die Integration Google-Sheets habe ich mir eine Tabelle angelegt (frag’ mich nicht wie, aber dazu gibt es ja genügend Anleitungen). Dann kannst Du über die Aktion “append_sheet“ immer einen neuen Eintrag in der Tabelle hinzufügen.

Über die u.g. Automatisierung lasse ich stündlich den aktuellen Zählerstand, den mein NodeNCU (ESPHome-Device) liefert, in der Tabelle speichern.

In der Tabelle habe ich dann noch eine kleine Berechnung hinzugefügt (Datum+Uhrzeit extrahiert) und daraus eine Grafik gebastelt.

PS… den Sensor zahlerstand_volle_stunde habe ich nur ergänzt, damit der Wert im Dashboard angezeigt werden kann…

alias: Jede Stunde aktuellen Zählerstand speichern
description: ""
triggers:
  - hours: "*"
    minutes: "2"
    seconds: "2"
    trigger: time_pattern
conditions: []
actions:
  - target:
      entity_id: sensor.zahlerstand_volle_stunde
    data:
      replace_attributes: false
      attributes:
        last_update: "{{ now() }}"
      value: "{{ states.sensor.nodemcu_dev_total_energy.state }}"
    action: variable.update_sensor
  - action: google_sheets.append_sheet
    metadata: {}
    data:
      config_entry: 12345678901234567890123456
      worksheet: Zählerstand
      data:
        Zählerstand: "{{ states.sensor.nodemcu_dev_total_energy.state | round(1) }}"
        Einspeisung: "{{ states.sensor.nodemcu_dev_total_energy_2.state | round (1) }}"
mode: single
1 „Gefällt mir“

vielen Dank, hab es hinbekommen.