Ende August habe ich mir ja einen Verbrauchszähler für Erdgas gebastelt der auf einem Reed-Kontakt basiert und einen kleinen ESP32 Microcontroller enthält. Das ganze schien auch zu funktionieren, doch im Langzeittest traten dann einige Probleme auf.
Ich hatte einmal den Fall, dass der Sensor an einem Tag fast 15m³ Gasverbrauch „zählte“, was eigentlich nicht möglich ist. Dafür konnte ich immer wieder beobachten, dass der Reed-Kontakt manche „Nulldurchgänge“ nicht erfassen konnte. Da ich jetzt eine Weile im Urlaub war habe ich mal den echten Zählerstand vom 1. Oktober genommen und anhand des echten Zählerstandes vom 13. Oktober ausgerechnet, wie viele Kubikmeter verbraucht wurden. Dieser Wert war doppelt so hoch, wie der vom Reed-Kontakt ermittete Wert!
Damit war klar, dass die Lösung mit dem Reed-Kontakt bei mir nicht funktionieren will. Ich habe während der Wochen einige Versuche mit der Justieerung des Kontaktes gemacht und dabei auch einige dieser Kontakte verschlissen, denn wenn man zu oft an den Anschlüssen rumbiegt, dann bricht irgendwann das Glasröhrchen. Am Ende hat alles nichts geholfen, der Sensor zählt schlicht falsch.
Also war es Zeit für mich, der Lösung mit Reed-Kontakt adieu zu sagen und eine Lösung mit Hallsensor zu probieren. Dazu habe ich mir einen Schwung OH49E Hallsensoren besorgt. Dieser Senosr hat 3 Anschlüsse, 2 davon für die Versorgungsspannung und einen Output der eine Spannung entsprechend des Magnetfeldes ausgibt. Die Verkabelung kann man im Datenblatt nachschauen. ich habe einfach and die 3 Pins die Adern eines Flachbandkabels gelötet und dann diese mit Schrumpfschlauch gegeneinander isoliert.
Der VCC-Pin wird mit dem 5V Anschluß am Microcontroller verbunden, GND geht zu GND und der Ausgang des Hallsensors geht auf den A0 Analogeingang. Der Hallsensor passt auch gut an die Stelle wo vorher der Reed-Kontakt war, man plaziert ihn am Besten direkt über der LED.
Der Code für den Sensor muss dann in ESP-Home ein wenig angepasst werden, ein Konfigurationsbeispiel gibt es auf GitHub. Mein Code sieht jetzt so aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
globals: - id: total_pulses type: int restore_value: false initial_value: '0' # vom Gaszaehler der Faktor pro Impuls; bei mir 1 imp = 0,01m³ - id: imp_ratio type: float restore_value: false initial_value: '0.01' output: - platform: gpio pin: GPIO4 id: pulse_led binary_sensor: # Sensor zählt, ob ein "klick" beim Gaszähler erfolgt ist. Auf Basis der Spannung - platform: analog_threshold name: "GasMeterAnalogTreshhold" sensor_id: gasmeteranaloginput threshold: upper: 0.72 lower: 0.71 on_press: then: - lambda: id(total_pulses) += 1; - output.turn_on: pulse_led on_release: then: - output.turn_off: pulse_led sensor: - platform: template name: "GasverbrauchPuls" device_class: gas unit_of_measurement: "m³" state_class: "total_increasing" icon: "mdi:fire" accuracy_decimals: 2 lambda: |- return id(total_pulses) * id(imp_ratio); ESP_LOGD("Gaszähler analog TAG", "Pulse bisher: %d", id(total_pulses)); #analog input connected to the analog sensor output from the hall sensor board - platform: adc internal: True pin: A0 id: gasmeteranaloginput name: "GasMeterAnalogInput" update_interval: 2s |
Das Update kann über einfach über WLAN eingespielt werden. Nach der Installtion kann man sich das Logfile ansehen, in dem dann der Wert des Input-Signals ausgebeben wird.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
[12:09:57][C][mdns:117]: Hostname: gassensor [12:09:57][C][esphome.ota:073]: Over-The-Air updates: [12:09:57][C][esphome.ota:074]: Address: gassensor.local:8266 [12:09:57][C][esphome.ota:075]: Version: 2 [12:09:57][C][esphome.ota:078]: Password configured [12:09:57][C][safe_mode:018]: Safe Mode: [12:09:57][C][safe_mode:019]: Boot considered successful after 60 seconds [12:09:57][C][safe_mode:021]: Invoke after 10 boot attempts [12:09:57][C][safe_mode:022]: Remain in safe mode for 300 seconds [12:09:57][C][api:139]: API Server: [12:09:57][C][api:140]: Address: gassensor.local:6053 [12:09:57][C][api:142]: Using noise encryption: YES [12:09:58][D][sensor:093]: 'GasMeterAnalogInput': Sending state 0.69141 V with 2 decimals of accuracy [12:10:00][D][sensor:093]: 'GasMeterAnalogInput': Sending state 0.69141 V with 2 decimals of accuracy [12:10:02][D][sensor:093]: 'GasMeterAnalogInput': Sending state 0.68945 V with 2 decimals of accuracy [12:10:04][D][sensor:093]: 'GasMeterAnalogInput': Sending state 0.69141 V with 2 decimals of accuracy [12:10:06][D][sensor:093]: 'GasMeterAnalogInput': Sending state 0.69238 V with 2 decimals of accuracy [12:10:08][D][sensor:093]: 'GasMeterAnalogInput': Sending state 0.69531 V with 2 decimals of accuracy [12:10:10][D][sensor:093]: 'GasMeterAnalogInput': Sending state 0.70020 V with 2 decimals of accuracy [12:10:12][D][sensor:093]: 'GasMeterAnalogInput': Sending state 0.70898 V with 2 decimals of accuracy [12:10:14][D][sensor:093]: 'GasMeterAnalogInput': Sending state 0.71973 V with 2 decimals of accuracy [12:10:16][D][sensor:093]: 'GasMeterAnalogInput': Sending state 0.72949 V with 2 decimals of accuracy [12:10:16][D][binary_sensor:036]: 'GasMeterAnalogTreshhold': Sending state ON [12:10:18][D][sensor:093]: 'GasMeterAnalogInput': Sending state 0.73438 V with 2 decimals of accuracy [12:10:20][D][sensor:093]: 'GasMeterAnalogInput': Sending state 0.73633 V with 2 decimals of accuracy [12:10:22][D][sensor:093]: 'GasMeterAnalogInput': Sending state 0.73145 V with 2 decimals of accuracy [12:10:24][D][sensor:093]: 'GasMeterAnalogInput': Sending state 0.72949 V with 2 decimals of accuracy [12:10:26][D][sensor:093]: 'GasMeterAnalogInput': Sending state 0.72266 V with 2 decimals of accuracy [12:10:28][D][sensor:093]: 'GasMeterAnalogInput': Sending state 0.71484 V with 2 decimals of accuracy [12:10:30][D][sensor:093]: 'GasMeterAnalogInput': Sending state 0.70996 V with 2 decimals of accuracy [12:10:30][D][binary_sensor:036]: 'GasMeterAnalogTreshhold': Sending state OFF [12:10:32][D][sensor:093]: 'GasMeterAnalogInput': Sending state 0.70508 V with 2 decimals of accuracy [12:10:34][D][sensor:093]: 'GasMeterAnalogInput': Sending state 0.70117 V with 2 decimals of accuracy |
Das wichtige ist, dass man aus diesen Spannungswerten die Schwellen für treshold ermittelt, in meinem Fall wird beim Überschreiten von 0,72 V angenommen, dass gerade der „Nulldurchgang“ in der letzten Stelle erfolgt, werden 0,71 V unterschritten, dann ist der Impuls also wieder auf „release“ und die LED geht aus.
Das Log zeigt das auch perfekt an:
1 2 |
'GasMeterAnalogInput': Sending state 0.72949 V with 2 decimals of accuracy 'GasMeterAnalogTreshhold': Sending state ON |
Und kurz darauf wieder:
1 2 3 |
'GasMeterAnalogInput': Sending state 0.70996 V with 2 decimals of accuracy 'GasMeterAnalogTreshhold': Sending state OFF |
Dieses Umschalten zum „OFF“-State passiert bei mir dann ungefähr, wenn die letzte Stelle die Ziffer 2 anzeigt.
Das heißt nun, dass dank Hall-Sensor jeder „Nulldurchgang“ der letzten Stelle im Gaszähler erfasst wird. Ich habe mal den Zählerstand von der Intebriebnahme der Version mit Hallsensor notiert und kann bis jetzt keine Abweichung mehr feststellen. Der Wert der mir nun in HomeAssistant angezeigt wird passt exakt zu dem was der Zähler anzeigt, keine Differenz mehr.