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


    17 Gedanken zu „Gaszähler auslesen mit ESP Home und Hassio (Home Assistant)“

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

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

    2. 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/

    3. 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?

      1. 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)

          1. 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)

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

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

    4. 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?

      1. Hi Patrick, ja, das ist mega unpraktisch und Home-Assistant erzeugt dann negative Werte. Bin leider gerade etwas knapp, was die Zeit angeht. Sobald das besser ist, denke ich mal drüber nach. Beim Arduino könnte man in den EPROM schreiben …

        1. 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?

          1. Hi Matthias, bin ich aus privaten Gründen leider noch nicht zu gekommen. Zurzeit geht hier alles drunter und drüber. Ich dachte aber, dass es vielleicht einen nicht-flüchtigen Speicher gibt, auf den man im Zweifel schreiben könnte. Weiß nicht, ob der ESP einen EPROM dafür hat, könnte ich mir aber vorstellen. Ansonsten kann man bestimmt auch eine SD-Karte oder ähnliches verwenden. Liebe Grüße Stefan

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

    Schreibe einen Kommentar

    Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

     

    Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.