smartmeter

plugin logo

Das Plugin dient zum Auslesen von Smartmetern, die das DLMS- oder das SML-Protokoll beherrschen.

Die vom SmartMeter übermittelten Datensätze werden mit sogenannten OBIS Kennzahlen den verschiedenen Messungen im Smartmeter zugeordnet werden. Zusätzlich geben die Datensätze noch Metadaten wie Einheit, Zeitstempel etc. an.

Sowohl die Messwerte wie auch die Metadaten können Items zugewiesen werden.

Anforderungen

  • SmartMeter / elektronischer Hauszähler

    • mit DLMS-Protokoll (Device Language Message Specification) gemäß IEC 62056-21

    • mit SML-Protoll (Smart Message Language) gemäß BSI TR-03109-1 Anlage IV Teil b

  • ggf. USB-Schnittstelle mit IR Lesekopf (z.B. von volkszaehler.org )

  • alternativ IP-fähiges SmartMeter (nur SML)

Das Python Module pyserial, SmlLib und (ggf.) pyserial_asyncio werden benötigt. Die Installation erfolgt (ab SmartHomeNG 1.8) automatisch über den Inhalt der mitgelieferten Datei requirements.txt oder manuell auf der Konsole mit

python3 -m pip install pyserial SmlLib pyserial_asyncio

Es muß sichergestellt sein, dass der Benutzer, der SmartHomeNG ausführt, auch die Berechtigung hat, den seriellen Port zu verwenden. Unter Linux sollte dafür der Nutzer Mitglied der Gruppen dialout und/oder tty sein.

Zum einfacheren Handhabung des Zugriffs auf die serielle Schnittstelle kann eine udev-Regel erstellt werden. Dies kann für eine aktuelle Version des Volkszaehler IR-Lesekopfes z.B. wie folgt aussehen:

echo 'SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", ATTRS{serial}=="0092C9FE", MODE="0666", GROUP="dialout" , SYMLINK+="hauszaehler"' > /etc/udev/rules.d/11-dlms.rules
udevadm trigger

Der Symlink erhält dabei einen passenden Namen für die Schnittstelle, der natürlich den eigenen Anforderungen angepasst werden kann. In diesem Beispiel heißt die Gerätedatei /dev/hauszaehler. Die im Beispiel angegebenen Vendor- und Product-IDs sowie die Seriennummer müssen an die eigenen Geräte angepasst werden.

Unterstützte Hardware

  • SmartMeter mit DLMS-Protokollunterstützung

  • SmartMeter mit SML-Protokollunterstützung

Erfolgreich getestet wurden bisher: - EMH eHZB (SML) - ZPA GH302 (SML) - Iskra MT681 (SML) - Landis & Gyr E320 (SML) - efr SGM-D4-A920N (SML) - (wird bei Vorliegen weiterer Testergebnisse ergänzt)

Konfiguration

Die Informationen zur Konfiguration des Plugins sind unter Plugin ‚smartmeter‘ Konfiguration beschrieben.

Beispiele für die plugin.yaml

smartmeter:
    plugin_name: smartmeter
    serialport: /dev/hauszaehler
    cycle: 300

Im Beispiel wird das Plugin alle 300 Sekunden, also alle 5 Minuten, das Smartmeter abfragen. Da cycle nicht zu einem bestimmten Zeitpunkt aufgerufen wird sondern der Abstand zwischen den Abfragen nur entsprechend lang ist, ist auch der Zeitpunkt der Daten recht variabel.

Alternativ kann (derzeit nur bei SML) auch statt zyklischer Abfragen dauerhaft auf Daten vom SmartMeter gewartet werden. Diese Funktion benötigt pyserial_asyncio und kann je nach SmartMeter jede Sekunde Daten liefern:

smartmeter:
   plugin_name: smartmeter
   serialport: /dev/hauszaehler
   poll: false

Einrichtungsverfahren:

Das Plugin unterstützt die Diagnoseabfrage von SML- und DLMS-SmartMetern über die Kommandozeile. Dazu ist aus dem SmartHomeNG-Basisordner das jeweilige Modul des Plugins aufzurufen:

python3 plugins/smartmeter/dlms.py --help

bzw.

python3 plugins/smartmeter/sml.py --help

Die Module geben jeweils die unterstützten Optionen aus.

Eine manuelle Identifizierung ist allerdings normalerweise nicht mehr notwendig. Ohne Angabe des Kommunikationsprotokolls in der plugin.yaml versucht das Plugin automatisch, das korrekte Protokoll zu ermitteln. Sofern dies gelingt, wird es automatisch genutzt und im Web-Interface angezeigt. Sollte die Identifizierung fehlschlagen, wird die Log-Ausgabe im Web-Interface angezeigt.

Das manuelle Eintragen des Protokolls in die plugin.yaml kann beim Start von SmartHomeNG den Start des Plugins beschleunigen, da nicht jedesmal automatisch das Protokoll identifiziert werden muss.

Optional

Mit dem Python-Skript get_manufacturer_ids.py im Plugin-Ordner kann eine Liste von Herstellern von DLMS-SmartMetern im Excel-Format geladen werden. Aus dieser Liste wird die YAML-Datei manufacturer.yaml erstellt. Wenn das Plugin ein DLMS-SmartMeter ausliest, für das entsprechende Informationen vorliegen, werden die Ausgabedaten entsprechend angereichert. Wenn diese Datei nicht vorhanden ist, werden die gelesenen Daten 1:1 ausgegeben.

Dieses Skript benötigt das Python Modul openpyxl dieses ist nicht in der requirements.txt aufgeführt, weil es nur für dieses Skript benötigt wird.

Item-Konfiguration / Ermittlung von OBIS-Codes

Hintergrundinformationen zu OBIS-Codes

OBIS-Kennzahlen werden zur Datenübertragung in der Energiewirtschaft verwendet, und können universell verschiedene Daten übertragen (u.a. elektrische oder thermische Daten). Diese sind im Standard IEC 62056-6-1 für elektrische Energie spezifiziert.

Im Umfeld von SmartMetern werden sie hauptsächlich genutzt, um Bezug und Einspeisung elektrischer Energie, Energieflüsse und Leistungswerte zu übertragen.

Sie bestehen aus einer Kombination von sechs Wertgruppen, die die genaue Bedeutung jedes Datenelements beschreiben:

Eine einzelne Zeile kann so aussehen:

A-B:C.D.E*F(Wert*Einheit)(anderer Wert)

Die Wertegruppen A und B sind optional, ebenso E und F. Der „andere Wert“ kann weggelassen werden, ebenso die Einheit des ersten Wertes.

Die Bedeutung der einzelnen Codes ist im Prinzip festgelegt, kann aber in verschiedenen SmartMetern unterschied verwendet werden. Details lassen sich der Spezifikation des jeweiligen SmartMeters entnehmen.

Im Folgenden werden die Bedeutungen in Bezug auf Elektrizität angegeben.

A

Grundlegende Eigenschaft des Datenelements (abstrakte Daten, Strom-, Gas-, Wärme-, wasserbezogene Daten)

  • 0 Abstrakte Objekte

  • 1 Objekte mit Bezug auf Elektrizität

B

Kanalnummer, d.h. die Nummer des Eingangs bei Geräten mit mehreren Eingängen

C

Messgröße (Wirk-, Blind-, Scheinleistung, Strom, Spannung, …)

D

Messart (Maximum, aktueller Wert, Energie, …)

E

Tarifstufe (0 bei Eintarifzähler oder Summe aus den anderen Tarifen)

F

wird im deutschen Energiemarkt nicht verwendet.

OBIS-Codebeispiele

Zunächst zwei Codebeispiele von unterschiedlichen Smartmetern, um eine Vorstellung von den Unterschieden zu bekommen:

OBIS-Codebeispiel A

Einige erste Zeilen einer beispielhaften OBIS-Code-Auslesung für einen Landis & Gyr ZMD 310 SmartMeter für industrielle Zwecke

1-1:F.F(00000000)
1-1:0.0.0(50871031)
1-1:0.0.1(50871031)
1-1:0.9.1(155420)
1-1:0.9.2(170214)
1-1:0.1.2(0000)
1-1:0.1.3(170201)
1-1:0.1.0(18)
1-1:1.2.1(0451.17*kW)
1-1:1.2.2(0451.17*kW)
1-1:2.2.1(0060.24*kW)
1-1:2.2.2(0060.24*kW)
1-1:1.6.1(27.19*kW)(1702090945)
1-1:1.6.1*18(28.74)(1701121445)
1-1:1.6.1*17(28.95)(1612081030)
1-1:1.6.1*16(25.82)(1611291230)
1-1:1.8.0(00051206*kWh)
1-1:1.8.0*18(00049555)
1-1:1.8.0*17(00045862)
...

OBIS-Codebeispiel B

Beispiel für das Auslesen eines OBIS-Codes von einem relativ einfachen Pafal 12EC3g SmartMeter:

0.0.0(72044837)(72044837)
0.0.1(PAF)(PAF)
F.F(00)(00)
0.2.0(1.29)(1.29)
1.8.0*00(000783.16)(000783.16)
2.8.0*00(000045.38)(000045.38)
C.2.1(000000000000)(                                                )(000000000000)(                                                )
0.2.2(:::::G11)!(:::::G11)(!)

Werte aus den Codezeilen ermitteln

Im Vergleich der Beispiele wird offensichtlich das der grundsätzlich gleiche OBIS Code leicht unterschiedlich erscheint:

Beispiel A

Beispiel B

1-1:F.F(00000000)

F.F(00)(00)

1-1:1.8.0(00051206*kWh)

1.8.0*00(000783.16)(000783.16)

Um den Wert von 1-1:1.8.0(00051206*kWh) in ein Item zu bekommen, bekommt das Item folgende Attribute:

zaehler:
   type: num
   obis_code: '1-1:1.8.0'

Um den Wert von 1.8.0*00(000783.16)(000783.16) in ein Item zu bekommen, bekommt das Item folgende Attribute:

zaehler:
   type: num
   obis_code: '1.8.0*00'

Um die Einheit von 1-1:1.8.0(00051206*kWh) in ein Item zu bekommen, bekommt das Item folgende Attribute:

zaehler_unit:
   type: str
   obis_code: '1-1:1.8.0'
   obis_property: unit

Item-Konfiguration

Eine Beispielhafte item.yaml für die OBIS Codes aus Beispiel A könnte wie folgt aussehen:

Stromzaehler:
    Auslesung:
        type: str
        obis_readout: true

    Seriennummer:
        type: str
        obis_code: '1-1:0.0.0'

    Ablesung:
        # Datum und Uhrzeit der letzten Ablesung
        Uhrzeit:
            type: foo
            obis_code: '1-1:0.9.1'
        Datum:
            type: foo
            obis_code: '1-1:0.9.2'
        Datum_Aktueller_Abrechnungsmonat:
            type: foo
            obis_code: '1-1:0.1.3'
        Monatszaehler:
            # Billing period counter
            type: num
            obis_code: '1-1:0.1.0'

    Bezug:
        Energie:
            type: num
            sqlite: yes
            obis_code: '1-1:1.8.1'

        Energie_Einheit:
            type: str
            sqlite: yes
            obis_code: '1-1:1.8.1'
            obis_property: unit

    Lieferung:
        Energie:
            type: num
            sqlite: yes
            obis_code: '1-1:2.8.1'

        Energie_Einheit:
            type: str
            sqlite: yes
            obis_code: '1-1:2.8.1'
            obis_property: unit

Alternativ kann die automatische Item-Konfiguration im Web-Interface verwendet werden.

Web Interface

Das smartmeter Plugin verfügt über ein Webinterface, mit dessen Hilfe die Items, die das Plugin nutzen, sowie die roh ausgelesenen Werte übersichtlich dargestellt werden.

Item-Konfiguration automatisch erstellen

Weiterhin gibt es die Funktion, alle gelesenen Werte so in eine Datei zu schreiben, dass diese für die Item-Konfiguration für SmartHomeNG verwendet werden kann.

Wenn der Button Items erstellen gedrückt wird, erstellt das Plugin die Datei smartmeter-<Serialnummer vom Zähler>.yaml im items-Verzeichnis von SmartHomeNG. Beim nächsten Start wird diese automatisch eingebunden. Das Stammitem erhält als Namen die Seriennummer des Zählers, alle einzelnen Werte und ihre Einheiten werden unterhalb des Stammitems angelegt.

Wenn eine strukturiertere Itemkonfiguration gewünscht wird, müssen diese Daten von Hand an anderer Stelle in die Itemkonfiguration eingefügt werden. Die Arbeit, für jedes einzelne Item die OBIS-Codes und die Einheiten auszulesen, ist dabei aber schon erledigt.

Aufruf des Webinterfaces

Das Plugin kann aus dem backend aufgerufen werden. Dazu auf der Seite Plugins in der entsprechenden Zeile das Icon in der Spalte Web Interface anklicken.

Beispiele

Folgende Informationen können im Webinterface angezeigt werden:

  • Oben rechts werden allgemeine Parameter zum Plugin angezeigt.

  • Im ersten Tab werden alle Items aufgelistet, die für dieses Plugin konfiguriert sind.

  • Im zweiten Tab werden alle Datenpunkte der letzten Auslesung mit ihren OBIS-Codes und ggf. Properties aufgelistet. Das können Einheiten und/oder Bezeichnungen des Datenpunkts im Klartext sein.

  • Im dritten Tab werden detaillierte Statusinformationen über den Zähler angezeigt.