smlx
Anforderungen
Normalerweise sendet die Hardware eines Smartmeter alle paar Sekunden Statusinformationen, die über eine Schnittstelle ausgelesen werden können.
Für diese Plugin wird je nach Schnittstelle des Smartmeter entweder ein IR Lesekopf an einer USB Schnittstelle oder ein RS485 zu USB Konverter benötigt.
Die vom Smartmeter gesendeten Daten werden entsprechend dem SML Protokoll (Smart Message Language) codiert und übertragen. Nähere Informationen finden sich hier
Unter den übermittelten Daten befinden sich Statusinformationen die mittels OBIS Kennzahlen den verschiedenen Messungen im Smartmeter zugeordnet werden können. 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.
Die implementierten Algorithmen um die Checksummen zu berechnen wurden von PyCRC verwendet.
Notwendige Software
Es wird das Paket pyserial benötigt das in requirements.txt aufgeführt ist und ab SHNG 1.8 automatisch beim Start installiert wird.
Benutzer berichten davon, das es unter Linux notwendig ist den User smarthome den Gruppen dialout und tty hinzuzufügen. Weiterhin kann es notwendig sein eine Regel zur automatischen Zuordnung der Schnittstelle zu einem festen Port einzurichten. Die Vorgehensweise ist beim DLMS Plugin beschrieben
Unterstützte Geräte
Folgende Zähler wurden mit dem Plugin bisher ausgelesen:
Hager EHZ363Z5
Hager EHZ363W5
EHM eHZ-GW8 E2A 500 AL1
EHM eHZ-ED300L
Holley DTZ541 (2018 Modell mit fehlerhafter CRC Implementation)
Landis & Gyr E220
Konfiguration
plugin.yaml
Bitte die Dokumentation lesen, die aus den Metadaten der plugin.yaml erzeugt wurde.
smlx:
class_name: Smlx
class_path: plugins.smlx
serialport: /dev/ttyUSB0
# host: 192.168.2.1
# port: 1234
# device: raw | hex | <known-device>
# for CRC generation
# poly: 0x1021
# reflect_in: True
# xor_in: 0xffff
# reflect_out: True
# xor_in: 0xffff
# swap_crc_bytes: False
# date_offset: 0
Das date_offset Attribut definiert den Zeitpunkt des ersten Starts des
Smartmeter nach dem dieser installiert wurde. Es ist ein Integer und repräsentiert
die Sekunden nach Unix Epoch (1.1.1970, 0:00 Uhr, UTC)
Es wird vom Plugin benutzt um den tatsächlichen Zeitpunkt eines OBIS Datenpunktes zu berechnen.
Wenn man Datum und Zeit nicht kennt kann wie folgt vorgegangen werden:
Konfigurieren des Loggings von SmartHomeNG so, das das smlx Plugin Debug Informationen ausgibt.
Die Logs dann auf DEBUG plugins.smlx zeilen prüfen.
Suchen nach Entry Zeilen die valTime enthalten.
Wenn sich ein Eintrag valTime findet der aussieht wie z.B. [None, 8210754],
dann notieren der Integerzahl (hier: 8210754).
Ganz links im Logeintrag findet sich Uhrzeit und Datum des Logging Eintrags.
Über einen Unix Zeit Konverter dann diese Uhrzeit und Datum in einen Unix Zeitstempel umwandeln.
Daraus lässt sich date_offset berechnen als Unix timestamp - valTime.
Beispiel Eintrag aus dem Log:
„2019-10-18 09:34:35 DEBUG plugins.smlx Entry {‚objName‘: ‚1-0:1.8.0*255‘, ‚status‘: 1839364, ‚valTime‘: [None, 8210754], ‚unit‘: 30, ‚scaler‘: -1, ‚value‘: 560445, ‚signature‘: None, ‚obis‘: ‚1-0:1.8.0*255‘, ‚valueReal‘: 56044.5, ‚unitName‘: ‚Wh‘, ‚realTime‘: ‚Fri Oct 18 09:34:21 2019‘}“
Umwandeln von ‚2019-10-18 09:34:35‘ in einen Unix Zeitstempel liefert das Ergebnis 1571384075.
Mit valTime = 8210754 aus dem Log ergibt sich date_offset = 1571384075 - 8210754 = 1563173321.
Wenn ein SmartMeter für valTime keinen gültigen Wert liefert (valTime: None),
dann ist date_offset nutzlos und kann weggelassen werden.
items.yaml
Bitte die Dokumentation lesen, die aus den Metadaten der plugin.yaml erzeugt wurde.
Items können mit Hilfe einer OBIS-Kennung einen vom Plugin abgerufenen Wert oder eine Eigenschaft zuweisen.
Folgend eine Liste von nützlichen OBIS Codes die mit dem Attribut sml_obis verwendet werden können:
129-129:199.130.3*255 - Hersteller
1-0:0.0.9*255 - ServerId / Seriennummer
1-0:1.8.0*255 - Total Bezug [kWh]
1-0:1.8.1*255 - Tarif 1 Bezug [kWh]
1-0:1.8.2*255 - Tarif 2 Bezug [kWh]
1-0:2.8.0*255 - Total Einspeisung [kWh]
1-0:2.8.1*255 - Tarif 1 Einspeisung [kWh]
1-0:2.8.2*255 - Tarif 2 Einspeisung [kWh]
1-0:16.7.0*255 - Momentane Leistung [W]
Anstatt den (Mess-) Wert für einen bestimmten OBIS-Code zuzuweisen, kann auch eine weitere Eigenschaft
des Datenpunktes zugewiesen werden. Das kann durch ein zusätzliches Attribut sml_prop
erreicht werden.
Hat ein Item ein Attribut sml_obis zugewiesen, aber kein Attribut sml_prop, so wird
Die folgenden Eigenschaften für sml_prop können verwendet werden:
objName- der OBIS Code als Zeichenkette / binäre Datenstatus- Ein StatuswertvalTime- die Zeit entsprechend dem Wert (als Sekunden der Einheit start oder als Zeitstempel)unit- Identifiziert die Einheit des entsprechenden Wertes (z.B. W, kWh, V, A, …)scaler- der Skalierungsfaktor (10-factor shift) der benutzt wird um den echten Wert zu berechnenvalue- der Wertsignature- Die Signatur um die Daten zu schützen
Zusätzlich können die folgenden Eigenschaften für sml_prop verwendet werden, die bei Bedarf berechnet werden:
obis- Der OBIS Code als ZeichenkettevalueReal- Der echte Wert, der sich unter Berücksichtigung des Skalierungsfaktors errechnetunitName- Die Bezeichnung der EinheitactualTime- ein String mit Datum und Zeit der tatsächlichen Zeit (z.B. ‚Fri Oct 18 09:34:21 2019‘)
Der Status des Smartmeter ist ein String mit binären Daten. Die ersten 8 Bits sind immer 0000 0100 Alle anderen Bits haben eine spezielle Bedeutung und werden in folgende Attribute dekodiert:
statRun- True: Smartmeter zählt, False: StillstandstatFraudMagnet- True: Manipulation mit Magneten entdeckt, False: Alles okstatFraudCover- True: Manipulation der Abdeckung entdeckt, False: Alles okstatEnergyTotal- Energiefluss total. True: -A, False: +AstatEnergyL1- Energiefluss L1. True: -A, False: +AstatEnergyL2- Energiefluss L2. True: -A, False: +AstatEnergyL3- Energiefluss L3. True: -A, False: +AstatRotaryField- True Drehfeld nicht L1->L2->L3, False: Alles okstatBackstop- True backstop aktiv, False: backstop nicht aktivestatCalFault- True Kalibrationsfehler, False: okstatVoltageL1- True Spannung L1 vorhanden, False: nicht vorhandenstatVoltageL2- True Spannung L2 vorhanden, False: nicht vorhandenstatVoltageL3- True Spannung L3 vorhanden, False: nicht vorhanden
Beispiel
power:
home:
total:
type: num
sml_obis: 1-0:1.8.0*255
current:
type: num
sml_obis: 1-0:16.7.0*255
unit:
type: num
sml_obis: 1-0:16.7.0*255
sml_prop: unitName
logic.yaml
Bitte die Dokumentation lesen, die aus den Metadaten der plugin.yaml erzeugt wurde.
Funktionen
Bitte die Dokumentation lesen, die aus den Metadaten der plugin.yaml erzeugt wurde.
Beispiele
Hier ist noch was zu tun
Web Interface
iefert eine Reihe Komponenten von Drittherstellern mit, die für die Gestaltung des Webinterfaces genutzt werden können. Erweiterungen dieser Komponenten usw. finden sich im Ordner /modules/http/webif/gstatic.
Wenn das Plugin darüber hinaus noch Komponenten benötigt, werden diese im Ordner webif/static des Plugins abgelegt.
Besonderheiten bestimmter Hardware
Holley DTZ541
Normalerweise sollte es nicht notwendig sein die CRC Prüfsummenbildung zu ändern.
Aber zumindest das Holley DTZ541 nutzt falsche Parameter. Daher sind folgende Einstellungen
für dieses Gerät in der plugin.yaml vorzunehmen
HolleyDTZ541:
plugin_name: smlx
serialport: /dev/ttyUSB0
buffersize: 1500
poly: 0x1021
reflect_in: true
xor_in: 0x0000
reflect_out: true
xor_out: 0x0000
swap_crc_bytes: True
date_offset: 1563173307
Die Werte für serialport, buffersize und date_offset müssen dabei auf die lokalen Gegebenheiten angepasst werden