Zum Inhalt springen
Gassensor Gaszähler Hassio Home Assistant Arduino Esphome NodeMCU Einrichtung

Gaszähler auslesen mit ESP Home und Hassio (Home Assistant)

    In diesem Tutorial zeige ich dir, wie ich unseren Gaszähler per Home Assistant auslese. Ich hatte – unvorhergesehener Weise – Glück, dass der Gaszähler bereits für das digitale Auslesen vorbereitet war. Wenn auf deinem Gaszähler irgendwo sowas wie 1imp = 0,01m3 steht, würde das dort auch klappen.

    Gassensor Gaszähler Hassio Home Assistant Arduino Esphome NodeMCU

    Sensor: Metrix Impulsnehmer NI-3 für Metrix & Apator-Gaszähler

    Viele Gaszähler haben in einem der Drehrädchen einen Magneten integriert, der sich beim Gasverbrauch mitdreht. Ich habe ein paar Versuche mit einem normalen Magnetkontakt unternommen, mich am Ende aber für einen passenden Sensor entschieden.

    Gassensor Gaszähler Hassio Home Assistant Arduino Esphome NodeMCU Sensor Gassensor
    Magnetsensor zum Auslesen der Impulse des Gaszählers

    Beim Sensor handelt es sich um den Metrix Impulsnehmer NI-3 für Metrix & Apator-Gaszähler und er hat ca. 35 Euro gekostet. Um ihn am Gaszähler anzubringen wird es aber spannend. Hierzu muss aus dem aktuellen Gaszähler eine Abdeckkappe mit einer Zange rausgebrochen werden. Wie man das genau macht, ist im Datenblatt des Sensors gezeigt. Danach lässt sich der Sensor wie erwartet einfach in den Gaszähler einklicken und sieht aus, wie dafür gemacht.


    Sieh dir jetzt meinen neuen Arduino-Videokurs an: Jetzt ansehen!


    Hier hab ich das gute Stück gekauft: mySmartShop.de

    Der Sensor verfügt über vier Anschlusskabel: Zwei für einen öffnenden Kontakt, zwei für einen schließenden. Die beiden schließenden hab ich zum Auslesen verwendet.

    Elektronik

    Gassensor Gaszähler Hassio Home Assistant Arduino Esphome NodeMCU Schaltplan

    Die Schaltung ist relativ übersichtlich. An ein D1 Mini ESP-Board wird der Magnetsensor mit dem GND und dem D3 (GPIO0) verbunden. Ich habe ihn über Schraubklemmen angeschlossen. Es bietet sich an, gleich noch einen Temperatursensor in dem Raum zu haben, der ist allerdings optional. Ich habe mich für einen DS18B20 entschieden und ihn mit 5V, GND und dem Pin D2 (GPIO4) verbunden. Zusätzlich werde ich die LED vom D1 Mini (eigentlich vom ESP8266-Modul) verwenden. Sie ist intern am Pin D4 (GPIO2) angeschlossen und wird bei jedem Magnetimpuls aufleuchten.

    Bauteile

    Code und Installation

    Um das Programm auf das D1 zu übertragen, kann man es im einfachsten Fall per USB-Kabel an das Raspberry Pi anschließen. Gehe nun in Home Assistant auf ESP Home und klicke auf + New Device.

    Vergib hier einen Namen, z.B. Gaszaehler und wähle unter Pick Specific Board das Wemos D1 and Wemos D1 Mini aus.

    Gassensor Gaszähler Hassio Home Assistant Arduino Esphome NodeMCU Setup

    Klicke auf Install und wähle hier Plug into the computer running ESPhome Dashboard.

    Nun wird das Programm compiliert und auf das D1 übertragen. Dabei wird auch ein OTA-Key generiert. OTA steht für Over-The-Air und ermöglicht es nach der ersten Konfiguration, neue Änderungen per Wifi zu übertragen.

    Am Ende der Übertragung wird ein Status generiert. Hier kannst du Signalstärken und Hardware prüfen. Das automatisch erzeugte Programm sieht jetzt ungefähr so aus:

    esphome:
      name: gaszaehler
    
    esp8266:
      board: d1_mini
    
    # Enable logging
    logger:
    
    # Enable Home Assistant API
    api:
    
    ota:
      password: "#################################"
    
    wifi:
      ssid: !secret wifi_ssid
      password: !secret wifi_password
    
      # Enable fallback hotspot (captive portal) in case wifi connection fails
      ap:
        ssid: "Gaszaehler Fallback Hotspot"
        password: "#################"
    
    captive_portal:
    

    Jetzt kannst du das D1 an seine finale Position bringen und den Magnetsensor vom Gaszähler anschließen. Ich habe meines per USB-Netzteil versorgt.

    Danach füge den folgenden Code unter captive_portal: ein.

    globals:
      - id: total_pulses
        type: int
        restore_value: false
        initial_value: '0'  # hier kann der Gaszählerstand initialisiert werden
    
    dallas:
      - pin: GPIO4
        
    binary_sensor:
      - platform: gpio
        id: internal_pulse_counter
        pin:
          number: GPIO0
          mode: INPUT_PULLUP
        name: "Live-Impuls"
        filters:
          - delayed_on: 10ms
        on_press:
          then:
            - lambda: id(total_pulses) += 1;
            - output.turn_off: led  # optional: für eine LED, die den Gaszählerpuls visualisiert
        on_release:
          then:
            - output.turn_on: led  # optional: für eine LED, die den Gaszählerpuls visualisiert
            
    sensor:
      - platform: dallas
        address: 0xd23c01d607bc1228
        name: "Temperatur_Teekueche" 
      - platform: template
        name: "Gasverbrauch"
        device_class: gas
        unit_of_measurement: "m³"
        state_class: "total_increasing"
        icon: "mdi:fire"
        accuracy_decimals: 2
        lambda: |-
          return id(total_pulses) * 0.01;
    
    # Optional: Diese LED soll blinken, sobald ein Signal vom Gaszähler erkannt wird
    output:
      - platform: gpio
        pin: GPIO2
        id: 'led'
        inverted: true

    Klicke nun unten rechts auf Install und wähle Wirelessly. Der Code wird erneut compiliert und dann per Wifi (OTA) auf das Board übertragen. Es startet automatisch neu und zeigt nach kurzer Zeit den Status an.

    Einrichtung in Home Assistant

    Jetzt wollen die Daten erstmal im Home Assistant Dashboard anzeigen lassen. Klicke dazu in der Home Assistant Sidebar auf Einstellungen und wähle Geräte und Dienste. Suche nach der Gaszähler-Karte und klicke auf Konfigurieren. Nun taucht ein Gaszähler-Eintrag auf der Karte ESPHome auf.

    Gassensor Gaszähler Hassio Home Assistant Arduino Esphome NodeMCU Karte erstellen

    Klicke nun auf den Link 1 Gerät. Auf der Unterseite findest du eine Dashboard-Karte mit drei Einträgen. Klicke auf Zum Dashboard Hinzufügen. Nun sollte die Gaszähler-Karte im Dashboard auftauchen.

    Gassensor Gaszähler Hassio Home Assistant Arduino Esphome NodeMCU Karte

    Ab jetzt sollten auch die erfassten Daten in der InfluxDB für das Grafana-Dashboard gespeichert werden. Hier sieht mal also erst was, wenn auch ein paar Daten angekommen sind. Konfigurieren wir mal ein Dashboard in Grafana.

    Gassensor Gaszähler Hassio Home Assistant Arduino Esphome NodeMCU Dashboard

    Klicke auf Grafana in der Seitenleiste von Home Assistant (Hassio, dann im Grafana-Menü auf das Plus-Zeichen und dann auf Create. Klicke auf Add a new Panel.

    Der obere Teil ist noch leer, denn wir müssen hier eine Datenquelle aus der InfluxDB zuweisen. Klicke also in der unteren Hälfte in der ersten Zeile auf das + hinter dem WHERE-Selektor und wähle entity_id. Es öffnet sich die select tag value Auswahl. Hier musst du den Namen des Sensors des Gaszähler-ESPs eingeben. In unserem Fall also gasverbrauch. Die Autovervollständigung sollte den Namen auch vorschlagen.

    Nun wähle weiter vorn bei select measurement Qubikmeter aus. Jetzt solltest du schon die ersten Einträge im Grafen oben sehen (das setzt voraus, dass schon Daten aus dem Gaszähler abzulesen waren – kann also sein, dass man hier erst ein paar Stunden abwarten muss).

    Die Gaszählermessung ist inkrementell. Das heißt, der Wert erhöht sich, je mehr Gas man verbraucht. Um den Verbrauch pro Stunde (oder auch pro Tag) anzuzeigen, musst du in der Zeile SELECT auf das Plus klicken und difference hinzufügen. Jetzt sieht man im Grafen eine zeitliche Abfolge.

    Nun kannst du unter ALIAS in der untersten Zeile noch einen Namen für deinen Grafen vergeben. Er wird in der Legende eingeblendet.

    Jetzt kannst du die Anzeige noch im rechten Seitenmenü nach deinen Wünschen stylen. Ich schlage vor, eine Fill opacity hinzuzufügen. Dadurch wird der Bereich unter dem Grafen gefüllt. Unter Line Interpolation habe ich Step after (das letzte Icon) ausgewählt. Es verbindet die Punkte nachziehend.

    Jetzt kannst du mit Save speichern und dann auf Apply drücken (beides oben rechts). Nun wird dir der Graf im Dashboard als Panel angezeigt. Du kannst das Panel an der unteren rechten Ecke mit der Maus anfassen und über die Breite ziehen. Drücke dann aber wieder oben auf Speichern (Diskettensymbol). Den angezeigten Zeitbereich kannst du übrigens auch oben rechts einstellen.

    So, das waren viele Einstellungen. Ich habe sie mal hier als animiertes Gif zusammengefasst.

    Gassensor Gaszähler Hassio Home Assistant Arduino Esphome NodeMCU Einrichtung

    Ich hoffe, das hat dir geholfen. Ich habe noch ein weiteres Panel mit dem Verbrauch pro Tag oben drüber erstellt. So lässt sich ein leichterer Überblick erschaffen.

    Ich habe die Daten mit meinem echten Zählerstand abgeglichen und habe eine Abweichung von ca. 8%. Das ist für mich genau genug. Wenn du mehr willst, müsstest du die Formel im ESPHome etwas anpassen.

    Und jetzt viel Spaß beim Nachbauen und Energiesparen :-)


    Wenn dir das Projekt gefallen hat und du von weiteren interessanten Projekten inspiriert werden willst, sieh dir doch mal mein neues E-Book »Arduino Projekte Volume 1« an!

    • Die beliebtesten Arduino-Projekte von StartHardware
    • Inklusive Schaltplan, Beschreibung und Code
    • Arduino-Schnellstart-Kapitel
    • Kompakter Programmierkurs


    0 0 votes
    Article Rating
    Abonnieren
    Benachrichtige mich bei

    Diese Seite verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden..

    21 Comments
    Newest
    Oldest Most Voted
    Inline Feedbacks
    Alle Kommentare anzeigen
    dakobert
    4 Monate zuvor

    Hey, bei mir funktioniert es nicht mehr so, wie es einmal war. Ich weiß auch nicht so recht woran es liegt. Der Gassensor ist immer nur für kurze Zeiträume online, meist wird er als offline angezeigt. Es werden auch nicht wirklich Daten erfassen, immer nur minimal, dann wieder offline.
    Zur Historie: Bei uns wurde der Router ausgetauscht, ich musste mich dann um diverse Baustellen kümmern. Habe es irgendwann auch beim ESP hinbekommen und in der secret.yaml die korrekten Daten hinterlegt.
    Woran könnte es liegen, dass der Sensor immer nur kurzzeitig online ist? WLAN und Stromversorgung sind ok.

    dakobert
    Antworte an  Stefan Hermann
    3 Monate zuvor

    Yes, das hat geklappt. Also wirklich nochmal alles von vorne.. Wo genau der Fehler lag, keine Ahnung. Der ESP ist wieder online. Allerdings sendet der ESP keine Daten mehr so wie früher. Alles steht seit Tagen auf Null. Letzt Aktualisierung der Entität lässt sich nur mit einem Update des ESP auf den neusten Stand bringen. Daten werden dadurch nicht erfasst.
    Hab ich einen Fehler in meiner Konfig? Ich stelle dieser hier einmal ein, vielleicht habe ich ja etwas falsch gemacht!?

    esphome:
    name: gas
    friendly_name: gas

    esp8266:
    board: esp01_1m

    # Enable logging
    logger:

    # Enable Home Assistant API
    api:
    encryption:
    key: „nV66I+flZQpslCMb55MFkh3/7An9xJGIIm7fAr3WnAM=“

    ota:
    – platform: esphome
    password: „cdf3c3cbecbe78954d71fff1ac4860fd“

    wifi:
    ssid: !secret wifi_ssid
    password: !secret wifi_password

    # Enable fallback hotspot (captive portal) in case wifi connection fails
    ap:
    ssid: „Jugendheim Gastzugang“
    password: „Hollenstede“

    captive_portal:

    globals:
    – id: total_pulses
    type: int
    restore_value: false
    initial_value: ‚0‘ # hier kann der Gaszählerstand initialisiert werden

    one_wire:
    – platform: gpio
    pin: GPIO4

    binary_sensor:
    – platform: gpio
    id: internal_pulse_counter
    pin:
    number: GPIO0
    mode: INPUT_PULLUP
    name: „Live-Impuls“
    filters:
    – delayed_on: 10ms
    on_press:
    then:
    – lambda: id(total_pulses) += 1;
    – output.turn_off: led # optional: für eine LED, die den Gaszählerpuls visualisiert
    on_release:
    then:
    – output.turn_on: led # optional: für eine LED, die den Gaszählerpuls visualisiert

    sensor:
    – platform: template
    name: „Gasverbrauch“
    device_class: gas
    unit_of_measurement: „m³“
    state_class: „total_increasing“
    icon: „mdi:fire“
    accuracy_decimals: 2
    lambda: |-
    return id(total_pulses) * 0.01;

    dakobert
    Antworte an  Stefan Hermann
    3 Monate zuvor

    Hi, ich habe den Gaszähler wieder online. Einfach nochmal alles von vorne, dann funktionierte es. Aber: Der binary_sensor.gas_live_impuls reagiert zwar, der sensor.gas_gasverbrauch schreibt aber keine Werte, hier steht immer nur „0“. Habt ihr noch eine Idee?

    Martin G
    10 Monate zuvor

    Nach der Änderung auf ESPHome 6.2 sind folgende Zeilen zu ändern:
    1. Um die Over the air update Funktion weiterhin zu nutzen:
    # Alt
    ota:
    password: „xxxx“
    # Neu
    ota:
    platform: esphome
    password: „xxxx“
    2. Um den Dallas Sensor weiterhin zu nutzen:
    # Alt
    dallas:
    – pin: GPIOXX
    sensor:
    – platform: dallas
    address: 0x1234567890abcdef
    name: „MeinSensorname“
    # Neu
    one_wire:
    – platform: gpio
    pin: GPIOXX
    sensor:
    – platform: dallas_temp
    address: 0x1234567890abcdef
    name: „MeinSensorname“

    Dann klappt der hier vorgestellte Gassensor weiterhin und läßt sich updaten.

    Martin G
    Antworte an  Martin G
    10 Monate zuvor

    Meine Änderungen beziehen sich nur auf die ESPHome-Version ab: 2024.6.1 bzw 2024.6.0 (Juni 2024, Rev. 0 und 1). Der Sensor wird auch ohne Änderung weiterhin funktionieren kann dann jedoch nicht mehr neu kompiliert und OTA per Wlan übertragen werden (durch die zusätzliche OTA-Platform wird nun genau die Platform bezeichnet die die OTA-Update dann auch „ausschließlich“ durchführen darf) .
    Die „One-Wire“ Sensoren werden zukünftig nicht nur auf Temperatursensoren beschränkt bleiben deswegen gibt es eine neue Obergruppe „one-wire“ wobei unser Temperatursensor jetzt die platform bezeichnung dallas_temp erhalten hat. Nur als Erklärung.

    Christopher
    1 Jahr zuvor

    Wer hat nicht auch das Ziel, in seiner SmartHome-Umgebung seinen Energieverbrauch aufzuzeichnen. Bei vielen Tüftlern ist das bereits selbstverständlich. Neben dem aktuellen Stromverbrauch ist es auch möglich, den Gasverbrauch mit einem ESP8266 auszulesen. Gerade jetzt ist es umso wichtiger, seinen tatsächlichen Verbrauch von Erdgas im Auge zu behalten und mögliche Optimierungen festzustellen.
    https://raphalang.de/blog/technik/esphome-gaszaehler/

    Martin G
    1 Jahr zuvor

    Danke für die leicht nachzubauende Anleitung. Hat augenblicklich funktioniert.
    Anmerkung: Mein verbauter Dallas Temperatursensor hatte eine individuelle Seriennummer, d.h. in dem Programm muss unter dem Sensor (Dallas) diese Seriennummer eingetragen werden (kann in Home-Assistant in Log-File von ESP-Home (Gaszähler) eingesehen werden. Außerdem habe ich die 3.3V-Versorgungsspannung anstatt den 5V-Pin für den Temperatursensor und das Gas-Signal genommen, funktioniert auch sehr gut.
    Problematisch erachte ich das dauernde Schreiben in den Flash. Laut Spezifikation kann man 100000x in den Speicher Flaschen, Bei 0.01m^3 pro Inpuls wäre es möglich dass der Flasch nach 1000m^3 nicht mehr beschreibbar ist. Wie könnte ich das Programm umschreiben, dass das immer nur alle 100 Impulse (bei mir also 1m^3) in den Flash geschrieben wird?

    Martin G
    Antworte an  Martin G
    1 Jahr zuvor

    nochmals Dank für deine Anleitung:
    ich habe im api:-Bereich noch die Zeile
    api:

    reboot_timeout: 0 # 0=nicht automatisch booten alternativ z.B. 24h
    ….
    eingefügt. Somit überlebt das Modul eine etwas längers Funkstille meiner Home-Assistant-Instanz bzw. ein kurzzeitiger Ausfall des Wlan z.B. beim Flashen meiner Fritzbox ohne neu Standardmäßig nach 15 Minunten zu booten.Habe nämlich bemerkt dass bei Ausfall des Wlan (kommt bei mir gelegentlich vor) immer wieder von 0 gezählt wurde, weil irgendwann das esp32 neu gebootet hat.
    Außerdem experimentiere ich mit dem ersetzen des „sensors:“ mit der „numbers:“-Komponenten welches ein Übertagen von Werten von HomeAssistant an das Modul ermöglicht. Klappt irgenwie noch nicht ganz obwohl ich schon Teilerfolge habe (vielleicht hat jemand eine Idee numers: sinnvoll einzusetzen)

    Andreas
    Antworte an  Martin G
    1 Jahr zuvor

    Hallo,

    konntest du hier schon was erreichen bzgl. numbers?

    Martin G
    Antworte an  Andreas
    1 Jahr zuvor

    Bei mir läuft folgendes:
    1. erstelle in HomeAssist einen Helfer (number) unter „Einstellungen“->“Geräte und Dieste“-> „Helfer“ -> „+Helfer Erstellen“ einen Helfer in dem später der zu setzende Zählerstand eingegeben werden kann
    2. in esphome definiere einen sensor:homeassistant
    sensor:
    – platform: homeassistant
    name: „Gaszählerstand“
    id: Zaehlerstand # id zur interne verwendung
    accuracy_decimals: 2
    device_class: gas
    unit_of_measurement: „m³“
    state_class: „total“
    icon: „mdi:fire“
    entity_id: input_number.gaszahler_stand # das ist entity_id des helfers
    internal: false # Rückgabe an Homeassist erlaubt

    3. Verwenden der Daten
    lambda: |-
    id(Zaehlerstand).state += 0.01; # Beispiel wie man den Zählerstand ändert
    id(Zaehlerstand).publish_state(id(Zaehlerstand).state); #Hier wird der Zähler zurück an Homeassist gegeben
    5. Im Dashboard muss nun noch der Helfer (von Homeassist zum Setzen) und parrallel (lesend vom esp) angelegt werden.

    Die total_pulses würde ich auf jeden Fall für das Energie-Dashboard nutzen (das funktioniert sehr gut) den Zählerstand parrallel auch übermittelt als (2. Sensorwert)

    Simon Z
    Antworte an  Martin G
    1 Jahr zuvor

    Hallo Martin.
    Kannst du deine Settings auch für Anfänger (yaml Beispiel) etwas genauer erklären?
    Irgendwie bekomme ich das so nicht hin.

    Simon
    Antworte an  Martin G
    1 Jahr zuvor

    Hallo Martin.
    Kannst du für Anfänger deine Konfiguration mal posten?
    Gruß
    Simon

    Edi
    Antworte an  Martin G
    1 Jahr zuvor

    Hey Martin G,

    das kannst Du ganz einfach mittels eines Dienstes machen:

    api:
    services:
    – service: set_total_pulses
    variables:
    my_total_pulses: int
    then:
    – globals.set:
    id: total_pulses
    value: !lambda ‚return my_total_pulses;‘

    Dann kannst du in HA unter Entwicklerwerkzeuge -> Dienste -> esphome***** die total_pulses setzen.

    Gruss, Edi

    Grisu
    1 Jahr zuvor

    Danke für die Anleitung.
    Funktioniert einwandfrei und dank Olli bleibt der letzte Wert nach einem Neustart auch erhalten.

    LG

    Marco
    2 Jahre zuvor

    Moin
    Super Anleitung!
    Komischerweise bekomme ich seid dem letzten Esphome Update keine Werte mehr!
    Hat noch jemand die Probleme?

    Patrick
    2 Jahre zuvor

    Tolle Anleitung, habs testweise mal auf meine Hardware gespielt und funktionierte auf Anhieb. Was ich aber nicht ganz verstehe: Der Zähler beginnt bei jedem Einschalten des ESP wieder bei Null (Initialwert) – klar das gibt ja der Code vor. Aber ist das nicht unpraktisch? Sollte der ESP doch mal vom Strom getrennt werden, zählt er ja wieder von vorne los – kann Home Assistant damit umgehen oder was passiert in diesem Moment?
    Wäre es nicht möglich (und besser) den Zählerstand remanent zu sichern?

    Matthias J.
    Antworte an  Stefan Hermann
    2 Jahre zuvor

    Hi, tolle Anleitung. Danke dir. Bzgl. der Thematik des Zählerstandes nach Stromausfall etc. – hast du dir da bereits Gedanken zu gemacht oder hast eine Lösung parat?

    Antworte an  Stefan Hermann
    1 Jahr zuvor

    Hi Stefan,

    habe heute dieses Projekt nachgebaut, echt tolle Anleitung.
    Zu dem speichern bin ich wo anders drauf gestoßen.

    esp8266:

    restore_from_flash: true

    und

    globals:

    restore_value: True

    Ich hoffe das hilft weiter.
    Gruß Olli

    21
    0
    Ich würde mich über deine Meinung freuen.x