Contents

Auf Irrwegen: Gaszähler automatisch auszulesen

Smart Home und der mitleidige Blick meiner Ehefrau, wenn ich ihr mal wieder eine Automatisierung oder eine neue Sensorüberwachung präsentiere: Diese beiden Sachen gehen Hand in Hand. Das war auch wieder bei diesem Projekt der Fall: Der automatischen Überwachung des Gaszählers.

Warum das Ganze

Ich erfasse immer schon monatlich unseren Strom- und Gasverbrauch. Bisher händisch: Einmal im Monat ein Foto von beiden Zählern - und bei Zeiten dann in Excel eingepflegt. Fertig. Im Rahmen der Dämmung unseres Hauses sowie der Heizlastberechnung wollte ich aber genauer verstehen, wie (schnell) sich der Erdgasverbauch entwickelt.

Wie so oft: Das Ganze war doch komplizierter als gedacht.

Das Grundprinzip

In einigen Gaszählern - so auch in meinem G4 RF1 - finden sich Magneten in einer Walze der Segmentanzeige. Positioniert man einen Reed-Kontakt an die richtige Position, kann dieser recht zuverlässig detektieren, wenn sich die Walze beispielsweise von 9 nach 0 weiter dreht, weil dann eben auch der Magnet am Kontakt vorbeigeführt wird. Passende Kontakte / Sensoren gibt es direkt vom Hersteller - der lässt sich das mit 50-60€ aber auch gut vergüten. In solchen Fällen ist “selber machen” immer eine gute Option - und auch mindestens eine ebensogute Ausrede, den gleichen Betrag in Zubehör und Werkzeug zur Umsetzung des Projektes zu investieren ;-).

In meinem Fall ist auf dem Gaszähler übrigens vermerkt, dass 1 Impuls 0,1m³ entspricht - demzufolge findet sich der Magnet auf der zweiten Walze nach dem Komma (eine volle Umdrehung der zweiten Nachkommastelle entspricht einem 1er-Inkrement der ersten Nachkommastelle).

Versuch 1: Der Aqara Tür- und Fensterkontakt

Im Netz finden sich verschiedene Berichte, dass ein Aqara Tür- und Fensterkontakt genutzt werden kann, um die Impulse zu messen. Diese Lösung wäre natürlich besonders charmant, da ich (a) solche Kontakte ohnehin zu Hause habe, (b) die Sensoren sehr lange batteriebetrieben laufen und sie (c) sehr einfach über Zigbee in das bestehende Hausautomatisierungssystem eingebunden werden können.

Die Idee ist einfach: Sensor aus der Plastikhülle befreien, an die richtige Stelle auf den Gaszähler platzieren - fertig…

…oder auch nicht.

Trotz aller Bemühungen - und gut 10 abenteuerlichen Klebepositionen: Der Sensor erkennt den Magneten nicht, egal wie oft dieser im Betrieb am Sensor vorüber zieht. Das Problem ist bekannt - nicht jede Kombination aus Gaszählerfabrikat und Aqara-Sensor scheint zu funktionieren.

Versuch 2: IP Webcam

Im nächsten Versuch sollte ein altes Handy als IP Webcam herhalten - ehrlicherweise nur um die Zeit zu überbrücken, bis das Zubehör für Versuch 3 eingetroffen ist. Mit einer entsprechenden App lassen sich alte Android Geräte relativ leicht als IP Webcam betreiben. Die App bietet umfangreiche Konfigurationsoptionen, letztlich benötige ich aber nur folgende Gegebenheiten:

  • Bild lässt sich via URL auslesen
  • LED-Licht lässt sich via HTTP-API ein- und abschalten

So bekomme ich nun stündlich einen aktuellen Zählerstand via Telegram-Nachricht mitgeteilt - dank LED Licht auch in der Nacht gut lesbar. Nur aus Interesse habe ich versucht, die Bilder auch automatisiert auszuwerten - zumindest via SSOCR ist es mir aber nicht gelungen. Würde man so etwas zum Laufen bringen wollen - ein Blick auf AI on the edge wäre sicher lohnenswert: Dort werden Wasserzähler mittels ESP32 und einem neuronalem Netzwerk ausgelesen. Entsprechende Trainingsdaten inklusive…

Eine Erkenntnis ist aber: Alte Handys lassen sich doch sehr gut als IP Webcam umfunktionieren: Bewegungserkennung, Zwei-Wege-Kommunikation, LED-Licht, Video, Automatische Aufnahmen… alles möglich.

Versuch 3: Kompass

Nachdem klar war, dass der Sensor des Aqara-Kontaktes nicht fein genug ist, um den Magneten zu registrieren, habe ich nach Alternativen geschaut. Die Optionen:

  • Reed-Kontakt
  • Hall-Sensor
  • Kompass/Magnetometer

Nachdem ich mit dem Reed-Kontakt im Aqara-Sensor schon auf die Nase gefallen war, habe ich zunächst in Richtung Hall-Sensor überlegt. Auch hier finden sich aber unterschiedliche Berichte, welcher Sensor für diesen Zweck jetzt empflindlich genug ist. Zu guter Letzt habe ich aber ein Projekt gefunden, wo ein Magnetometer HMC5883 mit Raspberry Pi die Aufgabe übernimmt. Die Überlegung, dass ein Sensor, der das Erdmagnetfelt detektieren kann, auch den Magneten im Gaszähler detektieren können sollte, fand ich plausibel.

Der Sensor QMC5883 wird mit Stifleisten versehen

Nachdem ich den ersten Sensor beim Anlöten der Stiftleisten frittiert hatte und die Ersatzlieferung eingetroffen war, konnte das Projekt umgesetzt werden.

Material:

  • ESP32 Microprozessor
  • QMC5833 Kompass
  • Breadboard
  • Jumperkabel

Werkzeug:

  • Lötkolben

Die Idee: Der ESP32 wählt sich ins Wifi ein und übermittelt die Impulse via MQTT an meine Iobroker-Instanz, wo bei jedem Impuls der Zählerstand um 0,1m³ erhöht wird.

Springt die zweite Nachkommastelle von 6 auf 7 (rechts im Video), erkennt der Kompass einen starken Ausschlag (links im Video). So lassen sich wiederum Inkremente der ersten Nachkommastelle detektieren

Nachdem die grundlegende Funktionsweise sichergestellt wurde (etwas Malerkrepp hält den Sensor an Ort und Stelle), habe ich noch einen kleinen Halter 3d-gedruckt, dessen Modell auf Thingiverse abrufbar ist: https://www.thingiverse.com/thing:5581975

Mittels eines 3d-gedruckten Halters wird der Sensor genau über die zweite Nachkommastelle der Segmentanzeige positioniert.
Das Modell in der Rundumansicht

Das Sketch für das Projekt ist relativ simpel: Im Wesentlichen werden 10 Sekunden lang Messwerte des Magnetfeldes gesammelt. Da der Sensor relativ empfindlich ist und die Werte bei Erkennung des Magneten überlaufen können, wird die Signalstärke auf 4000 beschränkt. Ist der Durchschnittswert der letzten 10 Sekunden > 2000, wird das high Flag gesetzt. Ist der Durchschnittswert der letzten 10 Sekunden kleiner 300 und das High-Flag ist gesetzt, wurde eine Rotation erkannt, das high Flag wird entfernt und das Ganze via MQTT publiziert. Die Erkennung basiert also auf Anstieg und anschließendem Fall der gemessenen Feldstärke. Dieses Vorgehen erscheint mir relativ robust, weil es wenig Fehlauslösungen gibt - selbst wenn der Magnet längere Zeit direkt unter dem Sensor stehen bleibt. Das wäre anders, wenn der Trigger für high und der Trigger für low identisch wären - bei ungünstiger Positionierung des Magneten könnte der Sensor zwischen den Auslösewerten hin- und herspringen.



void loop()
{
  loopMqtt();

  sVector_t mag = compass.readRaw();

  // calculate field strength & store for average calculation
  fieldStrength = sqrt(mag.XAxis ^ 2 + mag.YAxis ^ 2 + mag.ZAxis ^ 2);
  avg = avgFieldStrength.reading(fieldStrength > 4000 ? 4000 : fieldStrength);
  
  Serial.print("Arrow: "); Serial.println(fieldStrength);  

  // every 10 seconds: evaluate if signall falls from high (magnet detected) to low (no magnet)
  if ((unsigned long)(millis() - timer) > 10000) {
    if (avg < 300 and isHigh) {
      isHigh = false;
      client.publish("mqtt.0.gas_meter.tick", itoa(millis(), charBuf, 10));
    }
    
    if (avg > 2000) {
      isHigh = true;
    }

    timer = millis();
  }

  delay(500);
}

Das komplette Skript findet sich auf Github.

Fazit

Insgesamt bin ich ziemlich zufrieden mit dem Ergebnis: Nach etwas Feinjustierung gibt es auch über mehrere Tage keine Abweichung, der erfasste Zählerstand entspricht (bis auf die erste Nachkommastelle) genau dem tatsächlichen Zählerstand. Und via Iobroker/Jarvis kann ich den Tagesverbauch auch sehr leicht graphisch visualisieren lassen.

Nach 24 Stunden hat der Sensor alle 16 Ticks korrekt erfasst