Private Website von Niklas Menke

Elektrotechnik und mehr...

Vorwort

Mit diesem Lesekopf soll die optische SML-Schnittstelle einer modernen Messeinrichtung (mME, Smart Meter) ausgelesen werden. Der Lesekopf wird dazu magnetisch am Zähler befestigt. Eingehende SML-Telegramme werden optisch empfangen und anschließend ausgewertet.

Da im Stromverteiler einer Mietwohnung in der Regel weder eine Spannungsversorgung noch geeignete Kabelwege zur Verfügung stehen, musste ein akkubetriebener Lesekopf entwickelt werden. Wegen des vergleichsweise hohen Energiebedarfs ist WLAN dafür ungeeignet. Stattdessen fiel die Wahl auf Zigbee, da das Protokoll energieeffizient arbeitet und sich in eine bereits vorhandene Zigbee-Infrastruktur integrieren lässt.

Schaltplan
Abbildung 1: Schaltplan des Lesekopfes.

Abbildung 1: Schaltplan des Lesekopfes.

Das Herzstück der Schaltung ist der XIAO ESP32-C6 von Seeed Studio (A1). Der kleine SoC überzeugt vor allem durch seine kompakte Bauform und den sehr geringen Energieverbrauch. Besonders praktisch für dieses Projekt ist, dass der SoC ZigBee nativ unterstützt.

Ein weiterer großer Vorteil ist das bereits integrierte Batteriemanagement, sodass der ESP32-C6 problemlos direkt mit einem Akku betrieben werden kann. Damit eignet sich der SoC sehr gut für dieses Projekt. Durch die zahlreichen bereits integrierten Funktionen bleibt der externe Schaltungsaufwand insgesamt überschaubar.

Der Akku ist über einen Steckverbinder (X1) mit der Platine verbunden. Die Akkuspannung wird über einen Spannungsteiler (R3, R4) eingelesen. Darüber wird der Ladezustand des Akkus überwacht und mit Zigbee übertragen.

Natürlich darf auch der Fototransistor (Q1) nicht fehlen, der die optischen SML-Signale der modernen Messeinrichtung empfängt. Auf eine IR-Diode wird zunächst verzichtet.

Zusätzlich wurde ein Taster (S1) vorgesehen, mit dem der Lesekopf zurückgesetzt oder eine manuelle Datenabfrage gestartet werden kann.

Platine

Aufgrund der geringen Anzahl externer Bauteile habe ich die Schaltung zunächst auf einer Lochrasterplatine aufgebaut. Ob ich später noch eine Leiterplatte entwerfe, ist derzeit noch offen.

(Bilder folgen...)

Gehäuse
Abbildung 2: Montierter Lesekopf.

Abbildung 2: Montierter Lesekopf.

Das Gehäuse wird mit einem 3D-Drucker hergestellt. Insgesamt sind vier Teile vorgesehen. Das Hauptgehäuse nimmt den Magneten, die Platine und den Akku auf. Zusätzlich gibt es eine Trennplatte zwischen Magnet und Platine. Außerdem sind zwei Abdeckungen für den Akku und für die Platine vorgesehen. Alle Teile werden mit Schrauben verbunden.

Die USB-C-Schnittstelle des ESP32-C6 ist von außen zugänglich. Auf diese Weise lassen sich Firmware-Updates durchführen, ohne das Gehäuse öffnen zu müssen. Zusätzlich kann der Lesekopf über die USB-C-Schnittstelle extern mit Energie versorgt werden. Weitere Informationen dazu stehen im Abschnitt Firmware.

Der Antennenanschluss des ESP32-C6 ist ebenfalls nach außen geführt. So kann eine Antenne entweder direkt an dem Lesekopf montiert werden, oder außerhalb des Verteilerschranks platziert werden, um den Empfang zu verbessern.

Derzeit ist das Gehäuse für einen Geräteakku mit den Abmessungen 60 x 31,4 x 8 mm ausgelegt, siehe dieser Akku. Dieser Akku hat jedoch den Nachteil, dass er zum Laden nicht einfach entnommen werden kann. Stattdessen muss entweder mit einer Powerbank nachgeladen werden, oder der Lesekopf muss während des Ladevorgangs vom Zähler entfernt werden. Um diese Einschränkung zu umgehen, soll das Gehäuse künftig so angepasst werden, dass ein Akku in der Bauform 18650 verwendet werden kann. Ein leerer Akku ließe sich dann einfach gegen einen geladenen austauschen.

(Bilder folgen...)

Firmware

Ursprünglich war geplant, die Firmware auf Basis der Arduino-IDE zu entwickeln. Dabei stellte sich jedoch heraus, dass die Zigbee-Bibliothek für die Arduino-IDE nicht alle Funktionen bereitstellt, die ich für den Lesekopf benötige. Konkret fehlt derzeit das Metering-Cluster, sodass sich Zählerstände nicht ohne Weiteres auf dem offiziellen Weg übertragen lassen. Aus diesem Grund bin ich auf die ESP-IDF von Espressif umgestiegen. Dort steht ein deutlich umfangreicheres Zigbee-SDK zur Verfügung.

Der Lesekopf befindet sich überwiegend im Deep Sleep und verbraucht dabei nur wenige μA. Alle 15 Minuten wird der SoC über einen Timer geweckt. Alternativ kann der Lesekopf manuell über den Taster aktiviert werden.

Nach dem Aufwachen werden zunächst die aktuelle Batteriespannung und der Ladezustand erfasst. Anschließend versucht der Lesekopf, die Zählerstände auszulesen. Insgesamt werden dafür drei Leseversuche durchgeführt.

Grundsätzlich wäre es auch möglich, neben den Zählerständen weitere Daten auszulesen und zu übertragen, beispielsweise die momentane Wirkleistung. Dafür wäre jedoch ein deutlich häufigeres Aufwecken des Lesekopfes erforderlich, um die Leistung direkt zu übertragen oder zumindest einen gleitenden Mittelwert zu bilden. Aus Gründen der Akkulaufzeit habe ich darauf vorerst verzichtet. Prinzipiell ließe sich der Lesekopf aber auch über die USB-C-Schnittstelle extern mit Energie versorgen, sodass der Energieverbrauch eine untergeordnete Rolle spielen würde. Eine entsprechende Anpassung der Firmware zwar vorgesehen, wurde bislang jedoch noch nicht umgesetzt.

Die Firmware wird über GitHub bereitgestellt: (Link folgt...)

Die Firmware kann über die USB-C-Schnittstelle geflasht werden. Ebenso können darüber die Logs ausgelesen werden. Für diese Zwecke steht ein Online-Tool im Abschnitt Flashen & Logs zur Verfügung.

Anbindung an Home-Assistant

Für den Betrieb des Lesekopfes wird ein Zigbee-Netzwerk benötigt. Eine ausführliche Erläuterung des Zigbee-Protokolls erfolgt an dieser Stelle nicht. Für mein Zigbee-Netzwerk verwende ich den SONOFF Dongle Max, den ich als Zigbee Coordinator betreibe. Die erfassten Daten werden anschließend an Home Assistant weitergegeben.

Wie bereits erwähnt, werden derzeit nur die Zählerstände übertragen. Daraus lässt sich in Home Assistant die durchschnittliche Wirkleistung für das Intervall zwischen zwei Zählerständen berechnen. Dazu sind folgende Schritte notwendig:

  1. Einstellungen → Geräte & Dienste → Helfer → Helfer erstellen → Ableitungssensor
  2. Name: Beliebig, z.B. "Wirkleistung bezogen"
  3. Eingangssensor: "Summe verbraucht" oder "Summe eingespeist" von "MENKE Stromzaehler", je nachdem, welche Leistung berechnet werden soll
  4. Genauigkeit: Wenigstens 3, maximal 6
  5. Zeitfenster: 0
  6. Metrischer Präfix: Keiner
  7. Zeitintervall: Stunden
  8. Maximales Teilintervall: 20 Minuten. Intervalle <= 15 Minuten sollten vermieden werden, damit zeitliche Schwankungen bei der Übertragung des Lesekopfes nicht zu einer fehlerhaften Leistungsberechnung führen. Wird innerhalb von 20 Minuten kein neuer Zählerstand übermittelt, fällt die Leistung auf 0.

Ein Ableitungssensor sollte für beide Zählerstände erstellt werden, wenn der Zähler beide Zählerstände übermittelt. Ansonsten nur für den Zählerstand, der übermittelt wird.

Eine Einschränkung besteht darin, dass die Leistung getrennt für Bezug und Einspeisung vorliegt und zudem in der Einheit kWh/h angegeben wird. Praktischer ist ein einzelner Leistungswert in Watt. Das lässt sich mit einem Template-Sensor lösen:

  1. Einstellungen → Geräte & Dienste → Helfer → Helfer erstellen → Template → Sensor
  2. Name: Beliebig, z.B. "Wirkleistung"
  3. Zustand: states('sensor.wirkleistung_verbraucht') | float(0) * 1000 - states('sensor.wirkleistung_eingespeist') | float(0) * 1000
  4. Maßeinheit: W
  5. Geräteklasse: Leistung
  6. Zustandsklasse: Messwert
  7. Gerät: Der Lesekopf

Falls nur ein Zählerstand übertragen wird, kann die Formel entsprechend angepasst werden, sodass nur dieser Wert berücksichtigt wird. In der Formel sind die Sensoren einzutragen, die zuvor als Ableitungssensoren angelegt wurden.

In meinem Fall sieht das in Home Assistant aktuell so aus:

Geräteübersicht in Home Assistant mit allgemeinen Geräteinformationen, Sensoren und Diagnose

Der verwendete Zähler ist ein Einrichtungszähler für Strombezug. Nicht benötigte Sensoren des Zählers habe ich deaktiviert. Den Ableitungssensor habe ich ausgeblendet. Wichtig ist, dass dieser nicht deaktiviert wird, da sonst auch der Template-Sensor nicht mehr funktioniert.

Materialliste
(Folgt...)
Downloads

Die Firmware kann über die USB-C-Schnittstelle geflasht werden. Ebenso können darüber die Logs ausgelesen werden. Für diese Zwecke steht ein Online-Tool im Abschnitt Flashen & Logs zur Verfügung.

(Folgt...)
Flashen & Logs

Die Firmware des Lesekopfes kann über die USB-C-Schnittstelle geflasht werden. Dazu wird der Lesekopf mit einem USB-C-Kabel an den Computer angeschlossen. Anschließend kann die Firmware über die folgende Schaltfläche geflasht werden.

Die USB-C-Schnittstelle kann auch zum Auslesen von Logs verwendet werden. Dazu wird der Lesekopf ebenfalls mit einem USB-C-Kabel an den Computer angeschlossen. Anschließend können die Logs über die serielle Schnittstelle ausgelesen werden.

(Folgt...)
Aktualisierungsverlauf & Pendenzenliste
(Folgt...)

Diese Website verwendet zur Darstellung einiger Inhalte externe Dienste und Cookies.

Nachfolgend können Sie die einzelnen Dienste ein- bzw. ausschalten.
Diese Einstellungen können jederzeit im Footer der Website angepasst werden.

Technisch notwendig (Cookie-Präferenzen, Design)
Font Awesome (Symbole)
Google Fonts (Schriftart)
Google reCAPTCHA (Formularschutz)
Sketchfab (3D-Inhalte)

Weitere Informationen finden Sie in der Datenschutzerklärung.

Datenschutzerklärung