dlms

plugin logo

Das Plugin dient zum Auslesen von Smartmetern die das DLMS Protokoll beherrschen.

Anforderungen

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

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

Das Python Modul pyserial wird benötigt. Die Installation ab SmartHomeNG 1.8 erfolgt automatisch über den Inhalt der mitgelieferten Datei requirements.txt oder manuell auf der Konsole mit

python3 -m pip install pyserial --user

Es muß sichergestellt sein, das der Benutzer der SmartHomeNG ausführt auch die Berechtigung hat den seriellen Port zu verwenden. Möglicherweise muß eine udev-Regel erstellt werden.

Ein Beispiel für eine aktuelle Version des Volkszaehler IR-Lesekopfes bei der jeweils Vendor- und Product-ID für den eigenen Lesekopf angepaßt werden müssen:

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

Der Symlink erstellt dabei einen passenden Namen der Schnittstelle der natürlich den eigenen Anforderungen angepasst werden kann.

Unterstützte Hardware

Smart Meter mit DLMS (Device Language Message Specification) IEC 62056-21

Erfolgreich getestet wurden bisher: - Landis & Gyr ZMD120 - Landis & Gyr E350 - Landis & Gyr ZMD310CT - Elster AS 1440 - Elster AS 3000 - Pafal 12EC3g - itron ACE3000

Nicht unterstütze Hardware

Die folgenden Smartmeter werden nicht unterstützt, da sie das SML Protokoll unterstützen, nicht aber DLMS:

  • Landis & Gyr E220

  • Easymeter Q3BA1022 SML

  • Easymeter Q3MA3120 SML

  • EMH ED300L

  • Hager 363W5

  • Hager EHZ363WA

  • Holley DTZ541 (Achtung: Implementierung von SML in einigen Modellen fehlerbehaftet)

  • Iskra MT681

Konfiguration

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

Beispiele für die plugin.yaml

dlms:
    plugin_name: dlms
    serialport: /dev/dlms0
    update_cycle: 900

Im ersten Beispiel wird das Plugin alle 900 Sekunden also alle 15 Minuten den 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 dazu lässt sich ein crontab für die Abfrage definieren um zu genauen Zeitpunkten eine Zählerauswertung zu haben. Im nachfolgenden Beispiel wird alle 60 Sekunden eine Zählerabfrage gestartet. Dabei muß die Abfragedauer und Systemauslastung berücksichtigt werden sowie die Notwendigkeit von kurzen Abfragezyklen.

dlms:
   plugin_name: dlms
   serialport: /dev/dlms0
   update_crontab: 0 * * * * *

Einrichtungsverfahren:

Das Plugin kann im Standalone-Modus mit einer Shell aus dem Plugin Verzeichnis z.B. /usr/local/smarthome/plugins/dlms gestartet werden mit python3 dlms.py <serieller Port>

Eine Hilfe zu verfügbaren Parametern wird mit python3 dlms.py -h angezeigt.

Wichtig ist es zunächst zu wissen ob ein Smartmeter nur auf Anforderung Daten sendet oder von sich aus Daten sendet ohne einen Anstoss zu benötigen.

Sendet ein Smartmeter von sich aus, so gibt dessen Bedienungsanleitung Auskunft mit welcher Geschwindigkeit die Schnittstelle betrieben werden kann. Im folgenden wird die Kommunikation mit einem Easymeter der Q3D Serie abgefragt der keine Checksumme der Daten unterstützt, und ohne Aufforderung mit 9600 Baud sendet:

python3 dlms.py <serieller Port> -c -l -s 9600

Das Ergebnis der Auslesung wird auf der Konsole ausgegeben, siehe Codebeispiele A und B. Aus den aufgelisten Obis Codes lassen sich die Einstellungen für die Itemdefinition ableiten.

Die gewählten Parameter für den Standalone Modus finden sich in den Einstellungen für die plugin.yaml von SmartHomeNG wieder. Alternativ kann die Einstellung auch über das Admin Interface vorgenommen werden.

Optional

Mit dem Python Skript get_manufacturer_ids.py im Ordner des Plugins kann eine Liste von Herstellern als Exceldatei geladen werden.

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

Wird dieses Skript im Ordner des Plugins plugins/dlms ausgeführt, so lädt diese eine Excel Datei mit einer Liste bekannter Hersteller aus https://www.dlms.com/srv/lib/Export_Flagids.php. Daraus wird eine YAML Datei manufacturer.yaml erstellt mit den ids und den entsprechenden Herstellern.

Das Plugin wird die Datei manufacturer.yaml verwenden wenn sie existiert um die Ausgabeinformationen damit anzureichern.

Einige Hintergrundinformationen zu OBIS-Codes

OBIS-Codes sind eine Kombination aus 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 zweite Wert kann weggelassen werden, ebenso die Einheit des ersten Wertes. Jede Smartmeter-Anzeige sieht anders aus. Eine direkte Vorschrift wie die Werte zu interpretieren sind gibt es nicht. In jeder Smartmeter Spezifikation wird beschrieben welche Werte geliefert werden und welche Wertegruppen belegt sind. Allerdings sind die Zeile sehr ähnlich von Smartmeter und daher kann leicht geraten werden welche Wertezusammensetzung wie zu interpretieren ist.

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 einer Messung Geräte mit mehreren Eingängen zur Messung der Energie von gleiche oder unterschiedliche Typen (z.B. in Datenkonzentratoren, Registrierungseinheiten). Daten von verschiedene Quellen können somit identifiziert werden. Die Definitionen für diese Wertegruppe ist unabhängig aus der Wertegruppe A.

C

abstrakte oder physische Datenelemente bezogen auf die Informationsquelle betroffen, z.B. Strom, Spannung, Leistung, Lautstärke, Temperatur. Die Definitionen hängen vom Wert der Wertegruppe A ab. Vermessung, Tarifabwicklung und Datenspeicherungsmethoden dieser Mengen werden durch den Wert definiert Gruppen D, E und F Für abstrakte Daten, die hierarchische Struktur der 6 Codefelder ist nicht zutreffend.

D

Typen oder das Ergebnis der Verarbeitung physikalischer Größen identifiziert mit den Wertegruppen A und C, nach verschiedenen speziellen Algorithmen. Die Algorithmen können Energie liefern und Bedarfsmengen sowie andere physikalische Größen.

E

Weiterverarbeitung der Messung Ergebnisse identifiziert mit Wert Gruppen A bis D zum Tarif registriert, nach dem Tarif(e) im Einsatz. Für abstrakte Daten oder für Messergebnisse für die Tarife nicht relevant, diese Wertegruppe kann zur weiteren Klassifizierung verwendet.

F

die Speicherung von Daten, identifiziert nach Wertegruppen A bis E, zu unterschiedlichen Abrechnungszeiträumen. Wo dies nicht relevant ist, kann diese Wertegruppe für weitere Klassifizierung verwendet werden.

Im folgenden zwei Beispiele um eine Vorstellung von den Unterschieden zu bekommen:

Werte aus Codezeilen ermitteln

Zunächst zwei Codebeispiele von unterschiedlichen Smartmetern.

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
   dlms_obis_code:
      - '1-1:1.8.0'
      - 0
      - 'Value'
      - 'num'

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
   dlms_obis_code:
      - '1.8.0*00'
      - 0
      - 'Value'
      - 'num'

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
   dlms_obis_code:
      - '1-1:1.8.0'
      - 0
      - 'Unit'
      - 'str'

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

Stromzaehler:
    Auslesung:
        type: str
        dlms_obis_readout: yes
    Seriennummer:
        type: str
        dlms_obis_code:
            - '1-1:0.0.0
            - 0
            - 'Value'
            - 'str'

    Ablesung:
        # Datum und Uhrzeit der letzten Ablesung
        Uhrzeit:
            type: foo
            dlms_obis_code:
              - '1-1:0.9.1'
              - 0
              - 'Value'
              - 'Z6'
        Datum:
            type: foo
            dlms_obis_code:
              - '1-1:0.9.2'
              - 0
              - 'Value'
              - 'D6'
        Datum_Aktueller_Abrechnungsmonat:
            type: foo
            dlms_obis_code:
              - '1-1:0.1.3'
              - 0
              - 'Value'
              - 'D6'
        Monatszaehler:
            # Billing period counter
            type: num
            dlms_obis_code:
              - '1-1:0.1.0'
              - 0
              - 'Value'
              - 'num'

    Bezug:
        Energie:
            type: num
            sqlite: yes
            dlms_obis_code:
              - '1-1:1.8.1'
              - 0
              - 'Value'
              - 'num'

        Energie_Einheit:
            type: str
            sqlite: yes
            dlms_obis_code:
              - '1-1:1.8.1'
              - 0
              - 'Unit'
              - 'str'

    Lieferung:
        Energie:
            type: num
            sqlite: yes
            dlms_obis_code:
              - '1-1:2.8.1'
              - 0
              - 'Value'
              - 'num'

        Energie_Einheit:
            type: str
            sqlite: yes
            dlms_obis_code:
              - '1-1:2.8.1'
              - 0
              - 'Unit'
              - 'str'

Die Syntax für das Item Attribut dlms_obis_code ist wie folgt:

my_item:
   dlms_obis_code:
      - 1-1:1.6.2*01
      - Index
      - 'Value' or 'Unit'
      - Value Type

dabei ist

  • Index die Nummer der Wertegruppe die gelesen werden soll

  • Value oder Unit je nachdem ob der Wert (meistens) oder die Einheit (z.B. ‚kWh‘ zugewiesen werden soll

  • Value Type die Beschreibung des Wertetyps um damit die Konvertierung für das Item vorzunehmen

    • Z6 (Zeit codiert mit hhmmss),

    • Z4 (Zeit codiert mit hhmm),

    • D6 (Datum codiert mit YYMMDD),

    • ZST10 (Datum und zeit codiert mit YYMMDDhhmm),

    • ZST12 (Datum und zeit codiert mit YYMMDDhhmmss),

    • str eine Zeichenkette

    • float eine Fließkommazahl

    • int eine ganze Zahl

    • num eine beliebige Zahl

Für einen Wertetyp mit time oder date wird für das Item ein Python datetime erstellt. Das impliziert, das das Item einen Typ foo in der Definition in der entsprechenden item.yaml bekommt.

Web Interface

Das dlms Plugin verfügt über ein Webinterface, mit dessen Hilfe die Items die das Plugin nutzen übersichtlich dargestellt werden.

Wichtig

Das Webinterface des Plugins kann mit SmartHomeNG v1.4.2 und davor nicht genutzt werden. Es wird dann nicht geladen. Diese Einschränkung gilt nur für das Webinterface. Ansonsten gilt für das Plugin die in den Metadaten angegebene minimale SmartHomeNG Version.

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.

Außerdem kann das Webinterface direkt über http://smarthome.local:8383/dlms bzw. http://smarthome.local:8383/dlms_<Instanz> aufgerufen werden.

Beispiele

Folgende Informationen können im Webinterface angezeigt werden:

Oben rechts werden allgemeine Parameter zum Plugin angezeigt.

Im ersten Tab wird das Ergebnis der letzten Auslesung angezeigt:

../../_images/webif1.png

Im zweiten Tab werden items aufgelistet, die mit Informationen aus der letzten Auslesung befüllt werden:

../../_images/webif2.png