From 896cbf52ad0704bda01a74ebe4d31035a7c07f42 Mon Sep 17 00:00:00 2001
From: kaihs <>
Date: Sun, 18 Aug 2019 14:50:47 +0000
Subject: [PATCH] 36_WMBus: initial support for mode 7 encryption, mostly
untested
git-svn-id: https://svn.fhem.de/fhem/trunk@20012 2b470e98-0d58-463d-a4d8-8e2adae1ed80
---
fhem/CHANGED | 2 ++
fhem/FHEM/36_WMBUS.pm | 49 ++++++++++++++++++++++++++-----------------
2 files changed, 32 insertions(+), 19 deletions(-)
diff --git a/fhem/CHANGED b/fhem/CHANGED
index be5bb3ea3..d8ed52345 100644
--- a/fhem/CHANGED
+++ b/fhem/CHANGED
@@ -1,5 +1,7 @@
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
# Do not insert empty lines here, update check depends on it.
+ - feature: 36_WMBUS: initial support for mode 7 encryption (mostly untested)
+ Digest::CMAC must be installed
- feature: 72_XiaomiDevice: added S1 vacuum states
- bugfix: 73_AutoShuttersControl: fix bug forum #966778
- change: 49_SSCam: commandref revised
diff --git a/fhem/FHEM/36_WMBUS.pm b/fhem/FHEM/36_WMBUS.pm
index 4037fdb50..d80d736e2 100644
--- a/fhem/FHEM/36_WMBUS.pm
+++ b/fhem/FHEM/36_WMBUS.pm
@@ -480,37 +480,37 @@ WMBUS_Attr(@)
every minute.
WMBus messages can be optionally encrypted. In that case the matching AESkey must be specified with attr AESkey. Otherwise the decryption
- will fail and no relevant data will be available.
+ will fail and no relevant data will be available. The module can decrypt messages encrypted according to security profile A or B (mode 5 and 7).
Prerequisites
- This module requires the perl modules Digest::CRC, Crypt::Mode::CBC and Crypt::Mode::CTR (Crypt modules only if encrypted messages should be processed).
+ This module requires the perl modules Digest::CRC, Crypt::Mode::CBC, Crypt::Mode::CTR and Digest::CMAC (last three only if encrypted messages should be processed).
On a debian based system these can be installed with
sudo apt-get install libdigest-crc-perl
- sudo cpan -i Crypt::Mode::CBC Crypt::Mode:CTR
+ sudo cpan -i Crypt::Mode::CBC Crypt::Mode:CTR Digest::CMAC
Define
- define <name> WMBUS [<manufacturer id> <identification number> <version> <type> [<MessageEncoding>]]|<bHexCode>
+ define <name> WMBUS [<manufacturer id> <identification number> <version> <type> [<MessageEncoding>]]|<b[<MessageEncoding>]HexCode>
Normally a WMBus device isn't defined manually but automatically through the autocreate mechanism upon the first reception of a message.
For a manual definition there are two ways.
-
- By specifying a raw WMBus message as received by a CUL. Such a message starts with a lower case 'b' and contains at least 24 hexadecimal digits.
+ By specifying a raw WMBus message as received by an IODev. Such a message starts with a lower case 'b' and contains at least 24 hexadecimal digits.
The WMBUS module extracts all relevant information from such a message.
-
Explictly specify the information that uniquely identifies a WMBus device.
The manufacturer code, which is is a three letter shortcut of the manufacturer name. See
- dlms.com for a list of registered ids.
+ dlms.com for a list of registered ids.
The identification number is the serial no of the meter.
version is the version code of the meter
type is the type of the meter, e.g. water or electricity encoded as a number.
- MessageEncoding is either CUL or AMB, depending on which kind of IODev is used.
+ MessageEncoding is either CUL or AMB, depending on which kind of IODev is used. The default encoding is CUL.
@@ -525,25 +525,31 @@ WMBUS_Attr(@)
Attributes
+
- IODev
Set the IO or physical device which should be used for receiving signals
for this "logical" device. An example for the physical device is a CUL.
- - AESKey
+
+ - AESkey
A 16 byte AES-Key in hexadecimal digits. Used to decrypt messages from meters which have encryption enabled.
-
+
ignore
+
- rawmsg_as_reading
If set to 1, received raw messages will be stored in the reading rawmsg. This can be used to log raw messages to help with debugging.
-
+
+
- ignoreUnknownDataBlocks
If set to 1, datablocks containing unknown/manufacturer specific data will be ignored. This is useful if a meter sends data in different
formats of which some can be interpreted and some not. This prevents the unknown data overwriting the readings of the data that can be
interpreted.
-
- - ignoreMasterMessages
+
+
+ - ignoreMasterMessages
Some devices (e.g. Letrika solar inverters) only send data if they have received a special message from a master device.
The messages sent by the master are ignored unless explictly enabled by this attribute.
@@ -596,20 +602,20 @@ WMBUS_Attr(@)
Minutentakt gesendet werden.
WMBus Nachrichten können optional verschlüsselt werden. Bei verschlüsselten Nachrichten muss der passende Schlüssel mit dem Attribut AESkey angegeben werden.
- Andernfalls wird die Entschlüsselung fehlschlagen und es können keine relevanten Daten ausgelesen werden.
+ Andernfalls wird die Entschlüsselung fehlschlagen und es können keine relevanten Daten ausgelesen werden. Das Modul kann mit Security Profile A oder B (Mode 5 und 7) verschlüsselte Nachrichten entschlüsseln.
Voraussetzungen
- Dieses Modul benötigt die perl Module Digest::CRC, Crypt::Mode::CBC und Crypt::ModeL::CTR (die Crypt Module werden nur benötigt wenn verschlüsselte Nachrichten verarbeitet werden sollen).
+ Dieses Modul benötigt die perl Module Digest::CRC, Crypt::Mode::CBC, Crypt::ModeL::CTR und Digest::CMAC (die letzten drei Module werden nur benötigt wenn verschlüsselte Nachrichten verarbeitet werden sollen).
Bei einem Debian basierten System können diese so installiert werden
sudo apt-get install libdigest-crc-perl
- sudo cpan -i Crypt::Mode::CBC Crypt::Mode::CTR
+ sudo cpan -i Crypt::Mode::CBC Crypt::Mode::CTR Digest::CMAC
Define
- define <name> WMBUS [<manufacturer id> <identification number> <version> <type> [<MessageEncoding>]]|<bHexCode>
+ define <name> WMBUS [<manufacturer id> <identification number> <version> <type> [<MessageEncoding>]]|<b[]HexCode>
Normalerweise wird ein WMBus Device nicht manuell angelegt. Dies geschieht automatisch bem Empfang der ersten Nachrichten eines Gerätes über den
fhem autocreate Mechanismus.
@@ -624,11 +630,11 @@ WMBUS_Attr(@)
-
Durch explizite Angabe der Informationen die ein WMBus Gerät eindeutig identfizieren.
Der Hersteller Code, besteht aus drei Buchstaben als Abkürzung des Herstellernamens. Eine Liste der Abkürzungen findet sich unter
- dlms.com
+ dlms.com
Die Idenitfikationsnummer ist die Seriennummer des Zählers.
Version ist ein Versionscode des Zählers.
Typ ist die Art des Zählers, z. B. Wasser oder Elektrizität, kodiert als Zahl.
- MessageEncoding ist entweder CUL oder AMB, je nachdem welche Art von IODev verwendet wird
+ MessageEncoding ist entweder CUL oder AMB, je nachdem welche Art von IODev verwendet wird. Wird kein Encoding angegeben so wird CUL verwendet.
@@ -643,24 +649,29 @@ WMBUS_Attr(@)
Attributes
+
- IODev
Setzt den IO oder physisches Gerät welches für den Empfang der Signale für dieses 'logische' Gerät verwendet werden soll.
Ein Beispiel für ein solches Gerät ist ein CUL.
+
- AESKey
Ein 16 Bytes langer AES-Schlüssel in hexadezimaler Schreibweise. Wird verwendet um Nachrichten von Zählern zu entschlüsseln bei denen
die Verschlüsselung aktiviert ist.
-
+
ignore
- rawmsg_as_reading
Wenn auf 1 gesetzt so werden empfangene Nachrichten im Reading rawmsg gespeichert. Das kann verwendet werden um Rohnachrichten zu loggen und beim Debugging zu helfen.
-
+
+
- ignoreUnknownDataBlocks
Wenn auf 1 gesetzt so werden Datenblocks die unbekannte/herstellerspezifische Daten enthalten ignoriert. Das ist hilfreich wenn ein Zähler Daten in unterschiedlichen
Formaten sendet von denen einige nicht interpretiert werden können. Es verhindert, dass die unbekannten Daten die Readings der interpretierbaren Daten überschreiben.
-
+
+
- ignoreMasterMessages
Einige Geräte (z. B. Letrika Wechselrichter) senden nur dann Daten wenn sie eine spezielle Nachricht von einem Mastergerät erhalten haben.
Die Nachrichten von dem Master werden ignoriert es sei denn es wird explizit mit diesem Attribut eingeschaltet.