diff --git a/fhem/FHEM/36_WMBUS.pm b/fhem/FHEM/36_WMBUS.pm index 7d3e108a9..5114698df 100644 --- a/fhem/FHEM/36_WMBUS.pm +++ b/fhem/FHEM/36_WMBUS.pm @@ -69,20 +69,24 @@ WMBUS_Define($$) } else { # manual specification -# $a[2] =~ m/[A-Z]{3}/; -# return "$a[2] is not a valid WMBUS manufacturer id" if( !defined($1) ); + if ($a[2] !~ m/[A-Z]{3}/) { + return "$a[2] is not a valid WMBUS manufacturer id"; + } -# $a[3] =~ m/[0-9]{1,8}/; -# return "$a[3] is not a valid WMBUS serial number id" if( !defined($1) ); + if ($a[3] !~ m/[0-9]{1,8}/) { + return "$a[3] is not a valid WMBUS serial number"; + } -# $a[4] =~ m/[0-9]{1,2}/; -# return "$a[4] is not a valid WMBUS version" if( !defined($1) ); + if ($a[4] !~ m/[0-9]{1,2}/) { + return "$a[4] is not a valid WMBUS version"; + } -# $a[5] =~ m/[0-9]{1,2}/; -# return "$a[5] is not a valid WMBUS type" if( !defined($1) ); + if ($a[5] !~ m/[0-9]{1,2}/) { + return "$a[5] is not a valid WMBUS type"; + } $hash->{Manufacturer} = $a[2]; - $hash->{IdentNumber} = $a[3]; + $hash->{IdentNumber} = int($a[3]); $hash->{Version} = $a[4]; $hash->{DeviceType} = $a[5]; @@ -402,24 +406,24 @@ WMBUS_Attr(@)
sudo apt-get install libcrypt-cbc-perl libdigest-crc-perl libssl-dev
sudo cpan -i Crypt::OpenSSL::AES
@@ -430,23 +434,23 @@ WMBUS_Attr(@)
define <name> WMBUS [<manufacturer id> <identification number> <version> <type>]|<bHexCode>
- Normalerweise wird ein WMBus Device nicht manuell angelegt. Dies geschieht automatisch bem Empfang der ersten Nachrichten eines Gerätes über den
+ Normalerweise wird ein WMBus Device nicht manuell angelegt. Dies geschieht automatisch bem Empfang der ersten Nachrichten eines Gerätes über den
fhem autocreate Mechanismus.
- Für eine manuelle Definition gibt es zwei Wege.
+ Für eine manuelle Definition gibt es zwei Wege.
-
- Durch Verwendung einer WMBus Rohnachricht wie sie vom CUL empfangen wurde. So eine Nachricht beginnt mit einem kleinen 'b' und enthält mindestens
+ Durch Verwendung einer WMBus Rohnachricht wie sie vom CUL empfangen wurde. So eine Nachricht beginnt mit einem kleinen 'b' und enthält mindestens
24 hexadezimale Zeichen.
- Das WMBUS Modul extrahiert daraus alle benötigten Informationen.
+ Das WMBUS Modul extrahiert daraus alle benötigten Informationen.
-
- 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
+ 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
- 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.
+ 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.
@@ -462,24 +466,24 @@ 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.
+ 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.
+ 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.
Readings
- Zähler können sehr viele unterschiedliche Informationen senden, abhängig von ihrem Typ. Ein Elektrizitätszähler wird andere Daten senden als ein
- Wasserzähler. Die Information hängt auch vom Hersteller des Zählers ab. Für weitere Informationen siehe die WMBus Spezifikation unter
+ Zähler können sehr viele unterschiedliche Informationen senden, abhängig von ihrem Typ. Ein Elektrizitätszähler wird andere Daten senden als ein
+ Wasserzähler. Die Information hängt auch vom Hersteller des Zählers ab. Für weitere Informationen siehe die WMBus Spezifikation unter
oms-group.org.
- Die Readings werden als Blöck dargestellt, beginnend mit Block 1. Ein Zähler kann mehrere Blöcke senden.
- Jeder Block enthält zumindest einen Typ, einen Wert und eine Einheit. Für einen Elektrizitätszähler könnte das z. B. so aussehen
+ Die Readings werden als Block dargestellt, beginnend mit Block 1. Ein Zähler kann mehrere Blöcke senden.
+ Jeder Block enthält zumindest einen Typ, einen Wert und eine Einheit. Für einen Elektrizitätszähler könnte das z. B. so aussehen
1:type VIF_ELECTRIC_ENERGY
1:unit Wh
@@ -488,9 +492,9 @@ WMBUS_Attr(@)
Es gibt auch eine Anzahl von festen Readings.
- is_encrypted
ist 1 wenn die empfangene Nachricht verschlüsselt ist.
- decryption_ok
ist 1 wenn die Nachricht entweder erfolgreich entschlüsselt wurde oder gar nicht verschlüsselt war.
- state
enthält den Status des Zählers und kann Fehlermeldungen wie 'battery low' enthalten. Normalerweise ist der Wert 'no error'.
+ is_encrypted
ist 1 wenn die empfangene Nachricht verschlüsselt ist.
+ decryption_ok
ist 1 wenn die Nachricht entweder erfolgreich entschlüsselt wurde oder gar nicht verschlüsselt war.
+ state
enthält den Status des Zählers und kann Fehlermeldungen wie 'battery low' enthalten. Normalerweise ist der Wert 'no error'.
diff --git a/fhem/FHEM/WMBus.pm b/fhem/FHEM/WMBus.pm
index 975b023eb..cb7395ad9 100644
--- a/fhem/FHEM/WMBus.pm
+++ b/fhem/FHEM/WMBus.pm
@@ -401,7 +401,8 @@ my %validDeviceTypes = (
0x19 => 'A/D Converter',
0x1a => 'Smokedetector',
0x1b => 'Room sensor (e.g. temperature or humidity)',
- 0x1c => 'Gasdetector'
+ 0x1c => 'Gasdetector',
+ 0x28 => 'Waste water',
);
@@ -838,7 +839,7 @@ sub decodeApplicationLayer($) {
#print "Long header\n";
($self->{meter_id}, $self->{meter_man}, $self->{meter_vers}, $self->{meter_dev}, $self->{access_no}, $self->{status}, $self->{cw})
= unpack('VvCCCCn', substr($applicationlayer,$offset));
- $self->{meter_devtypestring} = $validDeviceTypes{$self->{meter_dev}};
+ $self->{meter_devtypestring} = $validDeviceTypes{$self->{meter_dev}} || 'unknown';
$self->{meter_manufacturer} = $self->manId2ascii($self->{meter_man});
$offset += 12;
} else {
@@ -919,7 +920,7 @@ sub decodeLinkLayer($$)
}
$self->{manufacturer} = $self->manId2ascii($self->{mfield});
- $self->{typestring} = $validDeviceTypes{$self->{afield_type}};
+ $self->{typestring} = $validDeviceTypes{$self->{afield_type}} || 'unknown';
return 1;
}