Zählerstände von Gas/Strom/Wasser erfassen und verarbeiten

member1

Member
Hallo,

nach einer längeren Odysee bin ich nun hier gelandet und wollte mal meine Erfahrungen teilen um zu sehen wie ihr die Dinge so angegangen seit...

Das Thema Home Assistent hat mich erst kürzlich gepackt, habe nach einigem hin und her dann einen meiner RPi4 damit installiert, was recht gut ging. Dann fing ich an div. Sensoren andocken zu wollen. In erster Linie weniger wegen Komfortfunktionen, sondern Sichtbarkeit von Werten wie z.B. dem Strom- und Gasverbrauch.

Ich habe in meinem EFH noch alte, herkömmliche Analogzähler z.B. einen solchen "Ferraris" Stromzähler:
power_meter.JPG
und einen solchen "Pipersberg BK4 G4" Gaszähler:
gaszaehler_pipersberg_bk4_g4.png
sowie eine solche "Sensus" Wasseruhr:
wasserzaehler_sensus.png

Als erstes habe ich mich an den Stromzähler gemacht. Hierzu gibt es, wie für den Rest auch, quasi unzählige Suchtreffer im Netz, leider aber überwiegend für digitale Stromzähler mit Impulsausgang. Die Lösungen für diesen Zähler verwenden eine optische Abtastung mittels einer kleinen IR-Reflexlichtschranke wie sie auch für den Line-Tracker bei Robotern benutzt wird. Als Elektronik-Bastler hatte ich sowas natürlich in der Kiste und dachte das wäre in 5 Minuten erledigt... wie unrecht ich hatte. Das Shield mit einem TCRT5000 Sende/Empfangsblock:
b.jpg
besteht aus einer IR-LED welche einfach nur konstant einen Infraroten Lichtstrom erzeugt. Der Empfänger ist eine IR-Empfindliche Diode, welche einen Spannungsabfall analog zur eintretenden IR-Lichtmenge erzeugt. Um daraus ein digitales Schaltsignal zu erhalten ist ein OpAmp (LM339) als Komparator dahinter geschaltet. Dieser vergleicht das Signal der IR-Diode mit einem über einen Poti einstellbaren Spannungswert. Ist die empfangene Menge IR-Licht groß genug, so erzeugt er am Ausgang ein HIGH-Signal (5V oder 3,3V), ansonsten LOW (0V). Über eine LED wird dieser Schaltzustand zusätzlich angezeigt.
Also das Ding mit einem provisorium am Zählerglas befestigt und versucht so einzustellen das die rote Markierung am Zählerrad als LOW erkannt wird. Der silberne Teil reflektiert, der rote Teil nicht zu gut. Diesen Unterschied galt es einzustellen. Das wollte einfach nicht sicher gelingen, egal wie ich das Teil positionierte. Das Problem ist das die IR-Sendediode einen Lichtkegel erzeugt und ein guter Teil davon als Streulicht von der Glasscheibe und der silbernen Platte des Zählers reflektiert wird. Der Unterschied in der von der IR-Empfangsdiode erhaltenen Lichtmenge zwischen silbernem Zählerrad und roter Markierung ist einfach zu gering. Der kleine schwarze Plastik-Abschotter welcher auf den Dioden sitzt hat also hier keine Wirkung.

Nach etwas Tüfteln war klar das ich Sende- und Empfangsdiode besser auf den kleinen Bereich fokussieren muss. Das habe ich mit einem einfachen Stück Schrumpfschlauch erledigt, welchen ich auf die Dioden gesteckt habe. Den Plastikhalter habe ich zuvor runtergenommen. So konnte ich den Streuwinkel der IR-Sendediode auch einen Punkt bringen. Das war entscheidend für die notwenige Empfindlichkeit. Anschließend hatte ich ein sauberes 1/0 Signal wenn die rote Markierung am IR-Kopf vorbeikam.
VOLTCRAFT99_3.gif

Damit war die Erfassung soweit geregelt, aber alle meine Versuche diese Werte mit einem ESPHome-Node (8266) im Dashboard von HA darzustellen scheiterten. Zuerst habe ich "pulse_meter" verwendet, dann "pulse_counter" aber irgendwie kam ich damit überhaupt nicht zurecht. Die angezeigten Werten wichen kolossal vom Zählerstand ab. Dann fand ich einen Beitrag von jemand mit dem gleichen Problem der dann den "binary_sensor" genommen hat und eine interne Variable damit füttert. Das hat auf Anhieb ganz gut geklappt auch wenn mir da noch viele Grundlagen fehlen wie das ganze wirklich funktioniert. Ich musste den Code auch etwas abwandeln damit es passt:
Code:
globals:
  - id: total_pulses
    type: int
    restore_value: false
    initial_value: '4413158'  # hier kann der Stromzähler initialisiert werden (kWh * 75)

binary_sensor:
  - platform: gpio
    name: "Zählerrad-Markierung erkannt"
    id: internal_pulse_counter
    pin:
      number: GPIO5 # "D1"
      mode: INPUT_PULLUP
    filters:
      - delayed_on: 500ms
    on_press:
      then:
        - lambda: id(total_pulses) += 1;

sensor:
  - platform: template
    name: "Stromverbrauch"
    device_class: power
    unit_of_measurement: "kWh"
    state_class: "total_increasing"
    icon: "mdi:power"
    accuracy_decimals: 1
    lambda: |-
      return id(total_pulses) / 75;

Die Idee dahinter ist das bei meinem Zählertyp das Zählrad 75 Umdrehungen braucht damit das Zählwerk 1kWh weiter zählt. Pro Umdrehung also 1/75 kWh = 0,0133 kWh. Bei jedem 1/0 Übergang wird der Wert von "total_pulses" also um 1 erhöht, was eben dieser Arbeit entspricht. Folglich musste ich den Initialwert zum Abgleich mit meinem Zählerstand also erst ausrechnen mit Zählerstand ohne Nachkomma * 75. Umgekehrt muss ich bei dem was ich als Sensorwert dem HA liefere den Wert / 75 teilen um wieder kWh zu erhalten.

Vermutlich geht das alles auch viel eleganter?!
Und nun käme auch gleich meine Frage wie ich so Tages-/Monats- und Jahreszähler ableiten könnte, denn mich interessiert neben dem Momentanverbrauch natürlich ganz besonders die statistische Abweichung zum Vorjahreswert und vortages/montas Wert.
 

Zurzeit aktive Besucher

Letzte Anleitungen

Statistik des Forums

Themen
5.801
Beiträge
56.673
Mitglieder
5.718
Neuestes Mitglied
Vossberger
Zurück
Oben