ESP Home - Stromzähler auslesen mit PoE - Homeassistant
Einleitung
Seit nunmehr zwei Jahren lebe ich in meiner aktuellen Wohnung. Bereits ab dem ersten Tag hatte ich Home Assistant im Einsatz, und meine Installation ist seitdem kontinuierlich gewachsen (ein Ende dieser Entwicklung sehe ich bisher nicht ^^). Um meinen Energieverbrauch zu tracken, habe ich bisher einen Zwischenzähler mit Modbus verwendet.
Letzte Woche habe ich mir nun einen kleinen Wunsch erfüllt und mir ein E-Auto zugelegt. Das Problem dabei war, dass der Verbrauch der Wallbox nicht mehr erfasst werden konnte, da mein Modbus-Zwischenzähler in der UVT (Unterverteilung) innerhalb der Wohnung installiert ist. Die Wallbox wird jedoch direkt im HVT (Hauptverteiler) im Keller angeschlossen. Entsprechend konnte ich meinen Gesamtverbrauch nicht mehr vollständig erfassen. Dieses Problem – zusammen mit der Tatsache, dass ich bisher keine Möglichkeit hatte, negative Verbräuche zu tracken (mein Balkonkraftwerk speist ins öffentliche Netz ein) – hat mich schließlich dazu bewegt, meinen Hauptzähler auslesen zu wollen. Damit begann meine Reise …
Hauptteil
Voraussetzungen damit alles funktioniert - Energie und Netzwerk...
Ich habe leider nicht den Luxus eines Eigenheims, daher muss ich mich den Gegebenheiten des Zählerraums mehr oder weniger anpassen. In meinem Fall bedeutet das, dass ich – anders als in meiner Wohnung – keine Wände öffnen darf, um Kabel zu verlegen. Das führte dazu, dass ich zu Beginn mit folgenden Herausforderungen konfrontiert war:
Keine Netzwerkverbindung jeglicher Art.
Kein Strom (ironischerweise direkt an der HVT^^).
Beides musste ich zuerst lösen, weshalb ich mich schnell auf die Suche nach einer geeigneten Lösung gemacht habe. In meinem Fall bestand diese in der zweckentfremdeten Nutzung eines vorhandenen Leerrohrs, das eigentlich dafür vorgesehen war, Lichtwellenleiter (LWL) in die Wohnung zu führen. Allerdings gibt es bis heute kein LWL bis zum Haus, und ich gehe auch nicht davon aus, dass sich das in naher Zukunft ändern wird.
Das eröffnete mir die Möglichkeit, mein erstes PoE-Projekt (Power over Ethernet) zu starten – eine Gelegenheit, die ich natürlich direkt ergriffen habe.
Ich habe also ein Netzwerkkabel von meinem Hauswirtschaftsraum (HWR) in der Wohnung in den Keller verlegt. Damit hatte ich nun endlich sowohl Energie als auch Netzwerk zur Verfügung. Der nächste Schritt bestand darin, die passende Hardware auszuwählen.
Hardwareauswahl Mikrocontroller
Wie so oft hat man bei der Auswahl der Hardware die Qual der Wahl. Meine Anforderungen an die Hardware sind denkbar bescheiden. Ich benötige einen Mikrocontroller, der irgendwie PoE nach 802.3af oder ähnlich macht, mit ESPHome kompatibel ist und angenehm zu verstauen ist. Also erstmal nichts besonderes und entsprechend ist die Auswahl.
Meine Favoriten waren dabei erstmal:
- Selfbuilt (Erstellen einer Platine mit genau meinen Wünschen)
- ESP32-POE-ISO
- LilyGo T-Internet POE
Schlussendlich wurde es für mich der LilyGo T-Internet POE. Kleiner Tipp am Rande: Wenn du auch so ein PoE Modul kaufen möchtest, nnutze die verlinkten Herstellerseiten (keine Provision). Diese sind bedeutend günstiger, als zum Beispiel von Amazon.
Ein wenig über Stromzähler aka. Moderne Messeinrichtungen...
Ich bewohne ein recht neues Gebäude aus dem Jahr 2021, und daher habe ich das Glück, dass mein Zähler bereits eine sogenannte "moderne Messeinrichtung" ist. In meinem Fall handelt es sich um einen Zähler der Marke EMH, genauer gesagt um den EMH eHZB. Dieser Zähler verfügt über zwei Schnittstellen, die für mich zugänglich sind (zumeist gibt es auf der Rückseite noch eine weitere, leistungsfähigere Schnittstelle, die deutlich mehr Daten übertragen kann).
- IR-Puls-LED – Dieses charmante kleine Loch auf der Vorderseite meines Zählers gibt eine Anzahl von n Impulsen pro kWh an (in meinem Fall 10.000). Damit kann ich potenziell meinen Verbrauch anhand der Impulse tracken und so Zählerstand und Leistung ermitteln. Das Problem: ungenaue Messungen – Es gibt viele Lösungen, aber die meisten haben Schwierigkeiten und überspringen gelegentlich einen oder zwei Impulse, was zu Driftfehlern über eine mittlere bis längere Zeitspanne führt. Diese Schnittstelle ist daher für ein Smart Home eher unbrauchbar.
- Die "optische Schnittstelle" – Diese Schnittstelle besteht (fast) immer aus zwei Komponenten. Die erste ist ein Lichtsensor bzw. ein "optisches Bedienelement", mit dem man den Stromzähler steuern kann. Das bedeutet, man kann zum Beispiel Verbrauchswerte der letzten Tage, Monate oder des Jahres einsehen, einen PIN eingeben oder (für mich am wichtigsten) die Datenkommunikationsmodi anpassen. Weitere Infos dazu findest du in der Anleitung deines Zählers. Die zweite Komponente ist die "optische Datenschnittstelle" oder auch "Kundenschnittstelle". Diese ermöglicht es dem Kunden (also dir als Abnehmer), die Daten des Zählers auszulesen. Die optische Datenschnittstelle verwendet ein Protokoll namens SML (Smart Meter Language). SML ist das Protokoll, das wir letztlich auslesen werden, um unsere Daten zu erhalten. Der Vorteil von SML ist, dass es ein vorhersehbares Protokoll ist, das Daten sendet – sogar mit der Möglichkeit zur Prüfziffernprüfung. Aber das ist vorerst nicht der Fokus und soll hier nicht weiter vertieft werden.
Als nächstes sollten wir den Begriff OBIS-Kennzahlen einführen. OBIS-Kennzahlen kategorisieren die gesendeten Daten und ermöglichen eine einfache, standardisierte Zuordnung. Die Codes 1.8.0 und 2.8.0 sind Beispiele für solche OBIS-Kennzahlen. Wichtig ist, dass OBIS-Kennzahlen zwar standardisiert sind, aber nicht jeder Hersteller bzw. jede Messeinrichtung alle OBIS-Codes unterstützt (was auch nicht per Standard möglich ist, da diese Codes in mehreren Branchen verwendet werden). Es gibt mehrere Kennungen, die immer vorhanden sind, aber 1. sind nicht alle auf der Kundenschnittstelle verfügbar, und 2. muss der Zähler eventuell zuerst konfiguriert werden, um alle relevanten Werte zu erhalten. Aber dazu später mehr...
Mit dem zweiten Ansatz haben wir also eine ziemlich coole Möglichkeit, unsere Daten auszulesen, ohne viele Probleme zu haben. Aber wie stellen wir das nun an?
Hardwareauswahl - Stromzähler auslesen...
Wir haben nun bereits einen passenden Mikrocontroller, aber irgendwie müssen die Daten vom Zähler zum Mikrocontroller und dafür müssen wir etwas an die optische Datenschnittstelle bauen… die Frage ist, wie geht das? - Die Lösung dazu ist überraschenderweise recht simpel. Wie es scheint, haben alle Messeinrichtungen um die Schnittstelle herum einen recht starken Magneten verbaut. Das hat für uns den Vorteil, dass die Befestigung absolut simpel ist. Auch die Hardwareauswahl ist recht simpel, denn es gibt mehr oder weniger einen „Industrie Standard“ in der Maker Szene und das ist der Hichi TTL. Hier ist es wieder bedeutend günstiger, wenn ihr den Hichi über den „Hersteller“ kauft. In dem Fall spart ihr ca. 50 %, wenn man den hier kauft (Keine Provision... Es ist einfach günstiger ^^).
Implementieren
Nun zum spaßigen Teil: die Implementierung der gesamten Lösung. Dazu fügen wir alle Teile zusammen, was letztlich bedeutet, dass wir vier Kabel an das ESP-Board anschließen: Spannung (3,3 V und GND) sowie Daten (TX und RX).
Sobald alles zusammengebaut ist, sollte man zunächst herausfinden, was der eigene Zähler alles kann. Bei mir war es (und bei dir wahrscheinlich auch) notwendig, den PIN der Messeinrichtung einzugeben. Den PIN erhältst du von deinem Netzbetreiber bzw. Messstellenbetreiber (Wichtig: Das kann jemand anderes sein als dein Stromanbieter!). Sobald der PIN eingegeben wurde, sollte man ihn im besten Fall im Hauptmenü des Zählers deaktivieren. In meinem Fall war das so: Ich hielt die optische Schnittstelle für etwa eine Sekunde lang an die Lampe, dann wiederholt kurz, bis „PIN“ im Display erschien, und bestätigte dies.
Es kann zudem notwendig sein, den „vollständigen Datensatz“ zu aktivieren. Standardmäßig senden Zähler einen „reduzierten Datensatz“, der keine momentane Wirkleistung enthält, sondern nur die Herstellerkennung, das Modell und die Verbräuche (1.8.0 und 2.8.0). Um den „vollständigen Datensatz“ zu erhalten, musst du im Menü weitergehen, bis „Inf“ angezeigt wird (bei anderen Modellen kann die Einstellung auch anders benannt sein) und diese Option auf „On“ setzen.
Jetzt können wir mit der Konfiguration der Software des ESP beginnen. Mein Wunsch war es, ESPHome so umfassend wie möglich zu nutzen, um eine homogene Softwarelandschaft mit vereinfachter Wartung aufzubauen. Daher erschien mir die Verwendung von Tasmota, wie sie in vielen anderen Blogbeiträgen beschrieben wird, nicht sinnvoll...
ESPHome konfigurieren...
Die Konfiguration von ESP Home kann sich je nach Umgebung unterscheiden. Im folgenden zeige ich daher einfach nur meine Konfiguration und diese kann entsprechend angepasst werden.
Für den ersten Versuch und um heruaszufinden, was der Zähler alles kann, sollte nur der Part bis vor "sensor" kopiert werden!
esphome:
name: stromzaehler-main
friendly_name: Stromzaehler_Main
esp32:
board: esp32dev
framework:
type: arduino
# Enable logging
logger:
# Enable Home Assistant API
api:
encryption:
key: "<<key>>"
ota:
- platform: esphome
password: "<<password>>"
ethernet:
type: LAN8720
mdc_pin: GPIO23
mdio_pin: GPIO18
clk_mode: GPIO17_OUT
phy_addr: 0
manual_ip:
static_ip: <<ip>>
gateway: <<gateway>>
dns1: <<dns>> (optional)
subnet: <<subnet -> meistens: 255.255.255.0)
uart:
#Hier müssen die PINs (GPIO) eingetragen werden, die zum Lesekopf gehen...
id: uart_bus
tx_pin: 14
rx_pin: 12
#Die Baudrate bestimmt der Zähler. In meinem Fall 9600 baud
baud_rate: 9600
# Der Debug Mode zeigt später was der Zähler alles kann.
debug:
sml:
id: mysml
uart_id: uart_bus
sensor:
- platform: sml
name: "Total energy In"
sml_id: mysml
obis_code: "1-0:1.8.0"
unit_of_measurement: kWh
accuracy_decimals: 3
device_class: energy
state_class: total_increasing
filters:
- multiply: 0.0001
- throttle_average: 300s
- platform: sml
name: "Total energy Out"
sml_id: mysml
obis_code: "1-0:2.8.0"
unit_of_measurement: kWh
accuracy_decimals: 3
device_class: energy
state_class: total_increasing
filters:
- multiply: 0.0001
- throttle_average: 300s
- platform: sml
name: "Current Power"
sml_id: mysml
obis_code: "1-0:16.7.0"
unit_of_measurement: W
accuracy_decimals: 0
device_class: power
state_class: measurement
- platform: sml
name: "Current "
sml_id: mysml
obis_code: "1-0:31.7.0"
unit_of_measurement: A
accuracy_decimals: 2
device_class: current
state_class: measurement
filters:
- multiply: 0.01
- platform: sml
name: "Current Frequency"
sml_id: mysml
obis_code: "1-0:14.7.0"
unit_of_measurement: Hz
accuracy_decimals: 3
device_class: frequency
state_class: measurement
filters:
- multiply: 0.1
Den ersten Teil (bis "sensor:") kann man jetzt erstmal auf den ESP flashen, damit können wir jetzt herausfinden, was der Zähler alles senden kann, da sich das von Hersteller zu Hersteller unterscheiden kann.
Sollte der Lesekopf bereits richtig liegen, sollte der Output ungeführ folgendes beinhalten:
[...]
[18:34:31][D][sml:078]: OBIS info:
[18:34:31][D][sml:084]: (0a01454d480000aae351) 1-0:96.50.1 [0x------]
[18:34:31][D][sml:084]: (0a01454d480000aae351) 1-0:96.1.0 [0x----------------]
[18:34:31][D][sml:084]: (0a01454d480000aae351) 1-0:1.8.0 [0x-----------------]
[18:34:31][D][sml:084]: (0a01454d480000aae351) 1-0:2.8.0 [0x-----------------]
[18:34:31][D][sml:084]: (0a01454d480000aae351) 1-0:16.7.0 [0x-------]
[...]
Was hier zu sehen ist, sind die Daten, die der Stromzähler sendet. Die Codes können nachgeschaut werden. Hier kurz was meiner sendet (und wenn du die selben Zahlen hinter dem ":" siehst, auch deiner...
- 96.50.1 -> Herstellerkennung
- 96.1.0 -> Gerädeidentifikation
- 1.8.0 -> Zählerstand Import (Netzbezug) -> Tariflos (Wenn du einen Tarifzähler hast, gibt es ggf. auch 1.8.1 und 1.8.2
- 2.8.0 -> Zählerstand export (Netzimport, z.B. von einer PV Anlage mit Überschusseinspeisung)
- 16.7.0 -> Derzeitige Wirkleistung
Hier findest du ein Dokument des Netzbetreiber "Avavcon", das sind mit Abstand nicht alle Codes, aber das Dokument ist wirklich sehr gut aufgebaut und verständlich.
Von hier an ist die restliche Konfiguration recht simpel. Jetzt kann der zweite Teil der Konfiguration kopiert bzw. angepasst werden. Als Beispiel:
- platform: sml
name: "Current "
sml_id: mysml
obis_code: "1-0:31.7.0"
unit_of_measurement: A
accuracy_decimals: 2
device_class: current
state_class: measurement
filters:
- multiply: 0.01
Zuerst muss ESPHome gesagt werden, dass wir gerne das Smart Language Protokoll nutzen möchten (platform: sml).
Den Obis Code entnimmt man dem Dump von vorher.
Die Accuracy wird auf Basis der Zähleranleitung definiert und kann ggf. variieren.
Zuletzt den Filter, dieser ist entweder durch try and error oder ebenfalls aus der Anleitung zu entnehmen.
Zum Schluss muss die aktualisierte Konfiguration geflashed werden und dann kann es losgehen...
Schluss
Innerhalb von ca. 30 Minuten ist es mit ESPHome möglich einen Stromzähler ziemlich zuverlässig auszulesen. Wichtig ist, dass man prüft ob die Pin eingegeben ist und ob es einen erweiterten Modus gibt, falls man auch die Momentanleistung haben möchte. Überraschenderweise, hat letzteres kein Blogbeitrag bisher erwähnt und erst mit der Anleitung habe ich diese Information finden könnnen ^^.
Zum Schluss gibt es noch ein 3D Druck Gehäuse und jetzt arbeitet der ESP bei mir im Anschlussraum. Durch PoE habe ich keine weitere Wartung mehr.
Bei Fragen, kannst du mir gerne eine Mail an mail@pure-smart.de senden.
Back…