Gaszähler mittels Reedkontakt einlesen

Hallo, jetzt muss ich meinen Senf auch noch dazu geben. Es gibt ein schönes Video wo das super erklärt wird und auch super funktioniert. Bei mir ist ein Reedkontakt im Zähler drin, hatte ich schon die verschiedenen Druckteile dafür verlinkt, das ganze wird einfach über einen Fensterkontakt den man zerlegt oder auch nicht, Aqara muss man nur das Gehäuse entfernen, sowie in den Geräten und Diensten einen Helfer erstellen. Dann kann man das ganze recht einfach in Betrieb nehmen nur die Reichweite von einem Aqara oder anderen ist nicht so toll weshalb ich in den Keller noch einen Repeater gepackt hab. Hier dürfte alles zu finden sein:

Den Helfer kann man ganz einfach erstellen und dann zählt das auch richtig, selbst Updates funktionieren super.

Servus,
ich versuche auch gerade als eines meiner ersten ESP Projekte das mit dem Gaszähler und Reed Kontakt umzusetzen.
Ich mache das mit einem ESP8266 D1mini V3

Ich bekomme diese Fehlermeldung:
INFO ESPHome 2024.7.3
INFO Reading configuration /config/esphome/gas-reed.yaml...
Failed config
binary_sensor.gpio: [source /config/esphome/gas-reed.yaml:38]
  platform: gpio
  id: internal_pulse_counter
  pin: 
    number: GPIO5
    mode: INPUT_PULLUP
  name: Live-Impuls
  filters: 
    - delayed_on: 10ms
  on_press: 
    then: 
      - lambda: id(total_pulses) += 1;
      - 
        Unable to find action with the name 'output.turn_off'.
        output.turn_off: led
  on_release: 
    then: 
      - 
        Unable to find action with the name 'output.turn_on'.
        output.turn_on: led

Was läuft da falsch, würde mich über Tips freuen!
Thomas

:crayon:by HarryP: Code-/Logzeilen formatiert (bitte immer in </> einbinden)

Hallo Stardust

Könnest Du mir vielleicht Deine ganze Konfig des ESP für Strom und Gas Zähler senden

ich hab einen ESP32 für den Stromzähler am laufen und würde darauf auch gerne den Gas Zähler laufen lassen
muss aber gestehen ich check es nicht ganz beides auf einen ESP zu bekommen

Meine Hoffnung ist das ich es mir von deiner Config abschauen kann

Danke
Peter

Hallo Peter,

auch wenn das etwas off topic ist :wink:, aber vielleicht hilft ja doch dem ein oder anderen. Hier meiner komplette Konfiguration mit Stromzähler. Sie ist auch kompatibel mit der letzten ESPHome-Version:

esphome:
  name: consumption
  comment: "Consumption ESP8266 controller"
  
esp8266:
  board: d1_mini

# Disable logging
logger:
  baud_rate: 0

# Home Assistant API
api:
  # Set encryption key
  encryption:
    key: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  
  # Set pulse counter total from home assistant using this service call:
  services:
    - service: set_pulse_total
      variables:
        new_pulse_total: int
      then:
        - pulse_counter.set_total_pulses:
            id: pulse_counter_id
            value: !lambda 'return new_pulse_total;'

# OTA (Over The Air) updates
ota:
  - platform: esphome
    password: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

# WiFi settings and manual IP adress
wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  manual_ip:
    static_ip: xxx.xxx.x.xxx
    gateway: xxx.xxx.x.x
    subnet: xxx.xxx.xxx.x
    dns1: xxx.xxx.x.x
  power_save_mode: none
  reboot_timeout: 5min
  # Only use fast connect, if only one repeater is reachable
  fast_connect: false 

# Status LED configuration
light:
  - platform: status_led
    name: "Switch state"
    pin: 
      number: GPIO2
      inverted: True

# UART configuration for smart meter serial interface
uart:
  id: uart_bus
  rx_pin: GPIO3
  baud_rate: 9600
  data_bits: 8
  parity: NONE
  stop_bits: 1

# SML component configuration
sml:
  id: mysml
  uart_id: uart_bus

# Sensor definitions for this device
# Please prefix the signal names by the component e.g. "Consumption" to get unique sensor names
text_sensor:
  - platform: sml
    name: "Consumption total energy uint text"
    id: consumption_total_energy_uint_text
    sml_id: mysml
    server_id: "0901454d480000725b39"
    obis_code: "1-0:1.8.0"
    format: uint

sensor:
  # Reports the WiFi signal strength/RSSI in dBm
  - platform: wifi_signal 
    name: "Consumption WiFi signal strength"
    icon: "mdi:wifi"
    id: consumption_wifi_signal_db
    update_interval: 5s
    unit_of_measurement: "dBm"
    device_class: "signal_strength"
    entity_category: "diagnostic"

  # Reports the WiFi signal strength in %
  - platform: copy 
    name: "Consumption WiFi signal quality"
    icon: "mdi:wifi"
    source_id: consumption_wifi_signal_db
    filters:
      - lambda: return min(max(2 * (x + 100.0), 0.0), 100.0);
    unit_of_measurement: "%"
    device_class: ""
    entity_category: "diagnostic"

  # Reports the SML received total energy (smart meter sends data with an update interval of 2 seconds)
  # More then 3 decimal digits does not make sense because ESPHome has a precision issue with large numbers
  #- platform: sml
  #  name: "Consumption total energy"
  #  icon: mdi:meter-electric
  #  sml_id: mysml
  #  server_id: "0901454d480000725b39"
  #  obis_code: "1-0:1.8.0"
  #  filters:
  #   - multiply: 0.0001
  #  unit_of_measurement: "kWh"
  #  accuracy_decimals: 3
  #  device_class: energy
  #  state_class: total_increasing

  # Reports the SML received total energy (smart meter sends data with an update interval of 2 seconds)
  # We convert here the uint (text) value into a float value. This way we work-around the strange behavior in the sml component
  # that lead to periodically small positive and negative total energy steps.       
  - platform: template
    name: "Consumption total energy"
    icon: mdi:meter-electric
    lambda: |- 
      std::string strEnergy = id(consumption_total_energy_uint_text).state;
      const char * cEnergy = strEnergy.c_str();
      float fEnergy = atof(cEnergy) / 10000.0;
      return fEnergy;
    unit_of_measurement: "kWh"
    accuracy_decimals: 3
    device_class: energy
    state_class: total_increasing
    update_interval: 2s

  # Reports the SML received current power (smart meter sends data with an update interval of 2 seconds)
  - platform: sml
    name: "Consumption current power"
    icon: mdi:meter-electric
    sml_id: mysml
    server_id: "xxxxxxxxxxxxxxxxxxxx"
    obis_code: "1-0:16.7.0"
    filters:
      - multiply: 0.1
    unit_of_measurement: "W"
    accuracy_decimals: 1
    device_class: power
    state_class: measurement

  # Reports the counted pulse of the reed switch for gas consumption measurement
  - platform: pulse_counter
    id: pulse_counter_id
    pin:
      number: GPIO13
      inverted: true
      mode:
        input: true
        pullup: true
    count_mode:
      rising_edge: DISABLE
      falling_edge: INCREMENT
    internal_filter: 500ms
    update_interval: 5s
    total:
      name: "Consumption gas quantity"
      icon: mdi:meter-gas
      id: pulse_counter_id_total
      filters:
        - multiply: 0.1
      unit_of_measurement: "m³"
      accuracy_decimals: 1 
      device_class: gas
      state_class: total_increasing

Interessant ist eventuell auch das Lambda-Konstrukt, mit dem ich ein Gittern der Werte in der SML-Komponente umschiffen konnte. Ich weiß nicht, ob das noch notwendig ist, aber die alte Variante ist ja auch noch auskommentiert vorhanden.

Viel Spaß und viel Erfolg,
Stardust

Das bedeutet du hast einen Syntax Fehler in der /config/esphome/gas-reed.yaml. Zeig doch mal deine Datei…

Danke
jedoch habe ich 2 Fragen,
ich kenn mich mit den ESP geräten nicht so gut aus

Kann ich da auch einen ESP32 nutzen ?
Muss ich dazu auch zusätzliche Libaries inkludieren
oder sollte yaml anpassen und mite espHome bespielen ausreichen

Danke

Hi Zusammen,
ich habe jetzt den Zähler auch mal nachgebaut, da ich meinen Wasserzähler smart werden lassen wollte. An der Stelle vielen dank an imany und alle anderen für die Beiträge.
MCU: verwendet habe ich einen ESP32-S3-Zero (sehr klein und handlich)
Verdrahtung: ich habe den Reedkontakt zwischen GND und GPIO5 geklemmt ohne einen Widerstand aussen.

Vielleicht ist es ja für jemanden Interessant
ESPHome-Code:

globals:
  - id: total_pulses
    type: int
    restore_value: True
    initial_value: '0'  

binary_sensor:
  - platform: gpio
    id: internal_pulse_counter
    pin:
      number: GPIO5
      mode: INPUT_PULLDOWN
    name: "Live-Impuls"
    filters:
      - delayed_on: 10ms
    on_press:
      then:
        - lambda: id(total_pulses) += 1;
        - light.turn_on: 
            id: led
            brightness: 50%
            red: 60%
            green: 10%
            blue: 30%
        
       
    on_release:
      then:
        - light.turn_off: led  

sensor:
  - platform: template
    name: "Wasserverbrauch"
    device_class: water
    unit_of_measurement: "L"
    state_class: "total_increasing"
    icon: "mdi:water"
    accuracy_decimals: 2
    update_interval: 5s
    lambda: |-
      return id(total_pulses) * 0.01;

# Optional: Diese LED soll blinken, sobald ein Signal vom Reedkontakt erkannt wird
light:
  - platform: fastled_clockless
    chipset: WS2811
    pin: GPIO21
    num_leds: 1
    rgb_order: RGB
    name: "RM Wasserimpuls"
    id: 'led'
    default_transition_length:
      milliseconds: 100

dadurch dass “restore_value” auf TRUE gesetzt ist, wird auch der Zählwert über den Reboot nicht auf 0 gesetzt. Wie es sich bei einem Update verhält habeich noch nicht ausprobiert. [UPDATE] Sogar nach nem Update bleibt der Zählwert drin.
da der ESP32-Zero eine RGB LED verbaut hat, sieht der letzte bei mir anders aus.
Bis jetzt hatte ich auch den “Ausreiser zwischendurch” von dem öffter gesprochen wurde, nicht.

Hi,

  1. ich habe dafür den ESP32 benutzt, funktioniert bei mir hervorragend.
  2. normalerweise must du keine Libs inkludieren, diese sind schon im ESPHome includiert. Einfach im HA unter ESPHome “neues Gerät” hinzufügen, gewünschten Code einfügen, und los gehts. Der Simon hat da sehr informative Videos auf seinem Youtube-Kanal. Die Seite von ESPHome ist auch sehr hilfreich.

Auch von mir eine kurze Rückmeldung:
Ich habe den Gaszähler von Metrix und habe mich davor gescheut den teuren Impulsnehmer für fast 40,- € (32,50 € plus Porto/Versand) zu kaufen. Ich habe mit Hallsensensoren, Reedkontakten, Fensterschalter usw. herum probiert. Nichts hat funktioniert.
Jetzt war ich es leid und habe den Impulsnehmer doch noch zähneknirschender Weise gekauft. Und was soll ich sagen? Es hat sofort funktioniert. Ich habe immer mit dem Code vom @oderturm, aus Feb. 23, gearbeitet. Nie Daten / Impluse bekommen. Jetzt funktioniert es sofort ohne irgendeine Code Änderung. Wenn man die vergeudeten Monate bedenkt, dann ärgere ich mich, das ich nicht direkt das Teil gekauft habe.

image

Vielen Dank auch an @oderturm

Edit:
Falls es jemand interessiert: Ich habe den D1 Mini (board: esp01_1m) benutzt.

1 „Gefällt mir“

Danke imany, hat alles gut geklappt. den Wiederstand brauchte ich nicht ist schon auf dem ESP32 verbaut nehme ich an.

Hallo,
ich habe das Problem das der Zähler, wenn ich einen Impuls per Magnet auslöse, zuviel zählt!
Ich habe einen ESP32 WROM mir USB-C und einen Meder Reedkontakt.
Je länger ich den Magneten an den Reedkontakt halte desto mehr Impulse werden gezählt.

[14:30:35][D][sensor:094]: 'hwr-gasverbrauch': Sending state 39459.53125 m³ with 2 decimals of accuracy
[14:31:04][D][binary_sensor:036]: 'Live-Impuls': Sending state ON
[14:31:04][D][binary_sensor:036]: 'Live-Impuls': Sending state OFF
[14:31:35][D][sensor:094]: 'hwr-gasverbrauch': Sending state 39459.53906 m³ with 2 decimals of accuracy

Mein Code lautet:

globals:
  - id: total_pulses
    type: int
    restore_value: false
    initial_value: '3945951'  # mit diesem Wert startet der Gaszählerstand
    
binary_sensor:
  - platform: gpio
    id: internal_pulse_counter
    pin:
      number: GPIO14
      mode: INPUT_PULLUP
      inverted: True
    name: "Live-Impuls"
    filters:
      - delayed_on: 500ms
    on_press:
      then:
        - lambda: id(total_pulses) += 1;
        - output.turn_off: led  # für die LED, zur Anzeige des Schaltvorgangs
    on_release:
      then:
        - output.turn_on: led  # für die LED, zur Anzeige des Schaltvorgangs
        
sensor: 
  - platform: template
    name: "hwr-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;
      
#Diese LED blinkt, wenn ein Signal vom Reedkontakt erkannt wird
output:
  - platform: gpio # Die interne LED auf dem Board
    pin: GPIO2
    id: 'led'

Ich probiere alles aus, aber immer das gleiche Ergebnis :frowning:
Wer kann mir helfen?

Danke und Gruß,

Hi, ich muss mal meinen unqualifizierten Kommentar dazu loswerden. Warum muss alles so kompliziert sein mit einem ESP? Dazu braucht man noch eine Spannungsversorgung und den passenden Halter. Ich verwende schon seit geraumer Zeit einen Fensterkontakt von Aqara, den kann man aus dem Gehäuse nehmen und dann in den passenden Ausschnitt reinstecken. Das ist die billigste und einfachste Methode, wenn man nicht löten kann. Oder man nimmt den Fensterkontakt, lötet den Reedkontakt aus und setzt den in ein gedrucktes Gehäuse was man an den Zähler schrauben kann. Das ganze funktioniert dann mit der internen Batterie und kann über Z2M oder Zigbee in HA verwendet werden.
Die sehen dann so aus:




Das erste ist für den Reedkontakt, das zweite ist für einen Kontakt der auf dem 3. Bild zu sehen ist. Die Kontakte sitzen dann automatisch an der richtigen Stelle. Dazu braucht es auch keinen ESP.

1 „Gefällt mir“

Weil ich vielleicht keinen Fensterkontakt von Aqara habe?
Weil ich keinen 3-D-Drucker habe?
Weil ich kein Zigbee verwende?

Dafür habe ich aber einige ESP’s rum liegen,
auch einige Reedkontakte …
Ich löte gerne und bastel auch sonst ganz gerne herum.

Du hast aber Recht mit Deinem “unqualifizierten” Kommentar :wink:
Den ich aber nicht als solches Empfunden habe.

Viele Grüße Uwe

Mein Kommentar war auch nur als Anregung für die gedacht die sich nicht mit ESP Programmierung auskennen und es eventuell ein wenig einfacher haben wollen. Die passenden Halter hab ich schon für den einen oder anderen gedruckt, ich hab einen 3D Drucker und löten kann ich auch. Nicht so ernst gemeinter Kommentar sonst artet das wieder aus.

Kunststoff-Reed-Schalter
Diesen Reed Kontakt verwende ich. 70ct das Stück.

Für alle die keinen 3D-Drucker haben. Für den BK-G4 / BK4 Gaszähler kann ich nur das hier empfehlen:

Folgende Reedkontakte haben an meinen BK-G4 NICHT funktioniert:
MK 471B Reed-Sensor und MK 1466A Reed-Sensor

Gruß,
Matthias

2 „Gefällt mir“

Hallöchen,

ich habe irgendwie Hardwareprobleme bei dem Projekt. An sich funktioniert alle tadellos und er zählt fein die Impulse und der Gasverbrauch passt auch. Nach etwas mehr als einem tag hört er aber auf zu zählen und es liegt immer am Reedkontakt.
Ich habe einfach die billigsten von Aliexpress bestellt.

Laut Produktbeschreibung mit folgenden Werten
max 300vdc
max 10w
max 0,55a
max 0,45 ms Betriebszeit

Nach etwas mehr als einem Tag hängt der Kontakt und öffnet oder schließt nicht mehr. Ich habe gelesen, dass die Kontakte sich selbst festschweißen können bei zu hoher Last aber an sich liegtr ja nbicht viel an.
Er schaltet von D1 auf GND und ist mit einem 10k Pull-up verbunden.
Es hat mir aber schon 5 Reedkontakte zerschossen.

Was mache ich falsch und wie kriege ich es problemlos zu laufen?

Hallöchen,

Könntest du mir evtl die STL senden?

Habe einen G2,5 zähler und möchte den auch genau so auslesen.

Nimm einfach einen Reed-Kontakt, mit dem die User hier gute Erfahrungen gemacht haben. Ich habe den MK4-1A66B seit einem Jahr erfolgreich im Dauereinsatz an einem BK-G4.

1 „Gefällt mir“

Muss man daran noch irgendetwas anschließen oder nur die 2 kontakte?