Verbrauchs- und Strommessung an der s0-Schnittstelle mit ESP8266

Im Fablab haben wir einen B+G E-Tech DRT751DE Stromzähler, welcher eine s0-Schnittstelle bietet. Diese lesen wir nun mit einem ESP8266-Board aus.

Die s0-Schnittstelle

Die s0-Schnittstelle kann man sich grob gesprochen als einen Schalter sehen der pro zu zählende Einheit (kWh/m³/…) einmal geschlossen wird.

ESP8266

Der ESP8266-Chip ist ein sehr günstiger Mikrocontroller mit eingebauter WLAN-Schnittstelle. Da dieser mit 80MHz läuft und er 96kB Data-RAM hat, kann man ihn auch gut mit Skriptsprachen nutzen.

InfluxDB

InfluxDB ist eine Zeitseriendatenbank d.h. sie ist besonders zum Speichern von einer grossen Anzahl an (Mess-)Werten mit zugehörigen Zeitstempeln gedacht. Die Datenbank lässt sich über verschiedene Arten mit Daten befüllen wir haben uns dafür entschieden das einfach zu bedienende HTTP-Interface zu nutzen, da dies auf dem ESP8266 mit nodemcu leicht umzusetzen ist.

Grafana

Die InfluxDB lässt sich auch leicht abfragen. Zum grafischen Darstellen der Ergebnisse nutzen wir Grafana eine Webapplikation die Daten aus verschiedenen Quellen (unter anderem InfluxDB) grafisch darstellen kann.

s0-Schnittstelle mit dem ESP8266 auslesen

Wie oben beschrieben schliesst die s0-Schnittstelle einen „Schalter“ für mindestens 30ms wenn eine Wattstunde verbraucht wurde. Um diesen Impuls am ESP8266 zu erkennen haben wir die „-“ Seite der Schnittstelle mit GND und die „+“ Seite mit einem durch einen internen Pullup auf +3.3V gezogenen Interrupt-Pin des ESPs verbunden. Wenn nun ein Impuls kommt wird der Pin auf GND gezogen und ein Interrupt wird erkannt.

Wir haben uns für eine Umsetzung mit NodeMCU entschieden, einer Umgebung die das Programmieren des ESPs mit lua erlaubt (wie in „Probleme und Verbesserungsmöglichkeiten“ angesprochen ist das wohl nicht die ideale Wahl gewesen…) . Die jetzige Firmware erstellt für einen erhaltenen Impuls zwei Datenpunkte in der InfluxDB: einen Datenpunkt, der angibt, dass ein Impuls überhaupt stattgefunden hat und einen mit dem Zeitabstand zum letzten Impuls. Der erste Datenpunkt dient zum Zählen der Wattstunden um z.B. den Tagesverbrauch anzeigen zu können. Mit dem Zeitabstand kann man den Verbrauch seit dem vorhergehenden Datenpunkt sehen und erhält so eine Abschätzung des Momentanverbrauchs.

Weiterhin zeigt die Firmware an wenn sie neu gestartet wurde um zu erkennen wie (in-)stabil das System läuft.

Die Anzeige erfolgt dann über das Fablab Power Dashboard auf dem Grafana-Server im Fablab.

Probleme und Verbesserungsmöglichkeiten

Das Auslesen nur über den Pullup des ESPs ist auf die lange Strecke (~3m Kabel) nicht ideal und führt manchmal zu Doppelpulsen die bisher über die Software abgefangen werden. Diese sollte bald durch eine Schaltung mit einem Optokoppler verbessert werden.. Das Einbauen eines Optokopplers hat für ein bisschen Verbesserung gesorgt aber auch dann kommen Doppelpulse noch vor. Es wäre möglich diese über Hardware auszufiltern aber da eh zwischen den Pulsen mindesten 300ms liegen (~11kW maximal wenn alle drei Phasen genutzt werden) wird weiterhin über Software gefiltert.

Wie man im Dashboard erkennen kann startet das ESP-Modul recht häufig neu, nach unseren Erkenntnissen liegt das wohl an der darunterliegenden NodeMCU-Firmware. Eine Neuentwicklung direkt in C auf Basis des SDKs wäre ein möglicher Lösungsansatz. Die Instabilität lag hauptsächlich daran, dass der Reset-Pin floating war. Dieser wird nun auf 3.3V gezogen (und die Software vereinfacht und verbessert)und das Board läuft ohne Probleme durch.