mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-03-10 09:16:53 +00:00
WMBUS: better error checking and documenation fixes
git-svn-id: https://svn.fhem.de/fhem/trunk@6406 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
cdc166c8f5
commit
80d1e85001
@ -69,20 +69,24 @@ WMBUS_Define($$)
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
# manual specification
|
# manual specification
|
||||||
# $a[2] =~ m/[A-Z]{3}/;
|
if ($a[2] !~ m/[A-Z]{3}/) {
|
||||||
# return "$a[2] is not a valid WMBUS manufacturer id" if( !defined($1) );
|
return "$a[2] is not a valid WMBUS manufacturer id";
|
||||||
|
}
|
||||||
|
|
||||||
# $a[3] =~ m/[0-9]{1,8}/;
|
if ($a[3] !~ m/[0-9]{1,8}/) {
|
||||||
# return "$a[3] is not a valid WMBUS serial number id" if( !defined($1) );
|
return "$a[3] is not a valid WMBUS serial number";
|
||||||
|
}
|
||||||
|
|
||||||
# $a[4] =~ m/[0-9]{1,2}/;
|
if ($a[4] !~ m/[0-9]{1,2}/) {
|
||||||
# return "$a[4] is not a valid WMBUS version" if( !defined($1) );
|
return "$a[4] is not a valid WMBUS version";
|
||||||
|
}
|
||||||
|
|
||||||
# $a[5] =~ m/[0-9]{1,2}/;
|
if ($a[5] !~ m/[0-9]{1,2}/) {
|
||||||
# return "$a[5] is not a valid WMBUS type" if( !defined($1) );
|
return "$a[5] is not a valid WMBUS type";
|
||||||
|
}
|
||||||
|
|
||||||
$hash->{Manufacturer} = $a[2];
|
$hash->{Manufacturer} = $a[2];
|
||||||
$hash->{IdentNumber} = $a[3];
|
$hash->{IdentNumber} = int($a[3]);
|
||||||
$hash->{Version} = $a[4];
|
$hash->{Version} = $a[4];
|
||||||
$hash->{DeviceType} = $a[5];
|
$hash->{DeviceType} = $a[5];
|
||||||
|
|
||||||
@ -402,24 +406,24 @@ WMBUS_Attr(@)
|
|||||||
<a name="WMBUS"></a>
|
<a name="WMBUS"></a>
|
||||||
<h3>WMBUS - Wireless M-Bus</h3>
|
<h3>WMBUS - Wireless M-Bus</h3>
|
||||||
<ul>
|
<ul>
|
||||||
Dieses Modul unterstützt Zähler mit Wireless M-Bus, z. B. für Wasser, Gas oder Elektrizität.
|
Dieses Modul unterstützt Zähler mit Wireless M-Bus, z. B. für Wasser, Gas oder Elektrizität.
|
||||||
Wireless M-Bus ist ein standardisiertes Protokoll das von unterschiedlichen Herstellern unterstützt wird.
|
Wireless M-Bus ist ein standardisiertes Protokoll das von unterschiedlichen Herstellern unterstützt wird.
|
||||||
|
|
||||||
Es verwendet das 868 MHz Band für Radioübertragungen.
|
Es verwendet das 868 MHz Band für Radioübertragungen.
|
||||||
Daher wird ein Gerät benötigt das die Wireless M-Bus Nachrichten empfangen kann, z. B. ein <a href="#CUL">CUL</a> mit culfw >= 1.59.
|
Daher wird ein Gerät benötigt das die Wireless M-Bus Nachrichten empfangen kann, z. B. ein <a href="#CUL">CUL</a> mit culfw >= 1.59.
|
||||||
<br>
|
<br>
|
||||||
WMBus verwendet zwei unterschiedliche Radioprotokolle, T-Mode und S-Mode. Der Empfänger muss daher so konfiguriert werden, dass er das selbe Protokoll
|
WMBus verwendet zwei unterschiedliche Radioprotokolle, T-Mode und S-Mode. Der Empfänger muss daher so konfiguriert werden, dass er das selbe Protokoll
|
||||||
verwendet wie der Sender. Im Falle eines CUL kann das erreicht werden, in dem das Attribut <a href="#rfmode">rfmode</a> auf WMBus_T bzw. WMBus_S gesetzt wird.
|
verwendet wie der Sender. Im Falle eines CUL kann das erreicht werden, in dem das Attribut <a href="#rfmode">rfmode</a> auf WMBus_T bzw. WMBus_S gesetzt wird.
|
||||||
<br>
|
<br>
|
||||||
WMBus Geräte senden Daten periodisch abhängig von ihrer Konfiguration. Es können u. U. Tage zwischen einzelnen Nachrichten vergehen oder sie können im
|
WMBus Geräte senden Daten periodisch abhängig von ihrer Konfiguration. Es können u. U. Tage zwischen einzelnen Nachrichten vergehen oder sie können im
|
||||||
Minutentakt gesendet werden.
|
Minutentakt gesendet werden.
|
||||||
<br>
|
<br>
|
||||||
WMBus Nachrichten können optional verschlüsselt werden. Bei verschlüsselten Nachrichten muss der passende Schlüssel mit dem Attribut AESkey angegeben 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.
|
||||||
<br><br>
|
<br><br>
|
||||||
<b>Voraussetzungen</b><br>
|
<b>Voraussetzungen</b><br>
|
||||||
Dieses Modul benötigt die perl Module Crypt::CBC, Digest::CRC and Crypt::OpenSSL::AES (AES wird nur benötigt wenn verschlüsselte Nachrichten verarbeitet werden sollen).<br>
|
Dieses Modul benötigt die perl Module Crypt::CBC, Digest::CRC and Crypt::OpenSSL::AES (AES wird nur benötigt wenn verschlüsselte Nachrichten verarbeitet werden sollen).<br>
|
||||||
Bei einem Debian basierten System können diese so installiert werden<br>
|
Bei einem Debian basierten System können diese so installiert werden<br>
|
||||||
<code>
|
<code>
|
||||||
sudo apt-get install libcrypt-cbc-perl libdigest-crc-perl libssl-dev<br>
|
sudo apt-get install libcrypt-cbc-perl libdigest-crc-perl libssl-dev<br>
|
||||||
sudo cpan -i Crypt::OpenSSL::AES
|
sudo cpan -i Crypt::OpenSSL::AES
|
||||||
@ -430,23 +434,23 @@ WMBUS_Attr(@)
|
|||||||
<ul>
|
<ul>
|
||||||
<code>define <name> WMBUS [<manufacturer id> <identification number> <version> <type>]|<bHexCode></code> <br>
|
<code>define <name> WMBUS [<manufacturer id> <identification number> <version> <type>]|<bHexCode></code> <br>
|
||||||
<br>
|
<br>
|
||||||
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.
|
fhem autocreate Mechanismus.
|
||||||
<br>
|
<br>
|
||||||
Für eine manuelle Definition gibt es zwei Wege.
|
Für eine manuelle Definition gibt es zwei Wege.
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
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.
|
24 hexadezimale Zeichen.
|
||||||
Das WMBUS Modul extrahiert daraus alle benötigten Informationen.
|
Das WMBUS Modul extrahiert daraus alle benötigten Informationen.
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
Durch explizite Angabe der Informationen die ein WMBus Gerät eindeutig identfizieren.<br>
|
Durch explizite Angabe der Informationen die ein WMBus Gerät eindeutig identfizieren.<br>
|
||||||
Der Hersteller Code, besteht aus drei Buchstaben als Abkürzung des Herstellernamens. Eine Liste der Abkürzungen findet sich unter
|
Der Hersteller Code, besteht aus drei Buchstaben als Abkürzung des Herstellernamens. Eine Liste der Abkürzungen findet sich unter
|
||||||
<a href="http://dlms.com/organization/flagmanufacturesids/index.html">dlms.com</a><br>
|
<a href="http://dlms.com/organization/flagmanufacturesids/index.html">dlms.com</a><br>
|
||||||
Die Idenitfikationsnummer ist die Seriennummer des Zählers.<br>
|
Die Idenitfikationsnummer ist die Seriennummer des Zählers.<br>
|
||||||
Version ist ein Versionscode des Zählers.<br>
|
Version ist ein Versionscode des Zählers.<br>
|
||||||
Typ ist die Art des Zählers, z. B. Wasser oder Elektrizität, kodiert als Zahl.
|
Typ ist die Art des Zählers, z. B. Wasser oder Elektrizität, kodiert als Zahl.
|
||||||
</li>
|
</li>
|
||||||
<br>
|
<br>
|
||||||
</ul>
|
</ul>
|
||||||
@ -462,24 +466,24 @@ WMBUS_Attr(@)
|
|||||||
<b>Attributes</b>
|
<b>Attributes</b>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#IODev">IODev</a><br>
|
<li><a href="#IODev">IODev</a><br>
|
||||||
Setzt den IO oder physisches Gerät welches für den Empfang der Signale für dieses 'logische' Gerät verwendet werden soll.
|
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.
|
Ein Beispiel für ein solches Gerät ist ein CUL.
|
||||||
</li><br>
|
</li><br>
|
||||||
<li>AESKey<br>
|
<li>AESKey<br>
|
||||||
Ein 16 Bytes langer AES-Schlüssel in hexadezimaler Schreibweise. Wird verwendet um Nachrichten von Zählern zu entschlüsseln bei denen
|
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.
|
die Verschlüsselung aktiviert ist.
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<br>
|
<br>
|
||||||
<a name="WMBUSreadings"></a>
|
<a name="WMBUSreadings"></a>
|
||||||
<b>Readings</b><br>
|
<b>Readings</b><br>
|
||||||
<ul>
|
<ul>
|
||||||
Zähler können sehr viele unterschiedliche Informationen senden, abhängig von ihrem Typ. Ein Elektrizitätszähler wird andere Daten senden als ein
|
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
|
Wasserzähler. Die Information hängt auch vom Hersteller des Zählers ab. Für weitere Informationen siehe die WMBus Spezifikation unter
|
||||||
<a href="http://www.oms-group.org">oms-group.org</a>.
|
<a href="http://www.oms-group.org">oms-group.org</a>.
|
||||||
<br><br>
|
<br><br>
|
||||||
Die Readings werden als Blöck dargestellt, beginnend mit Block 1. Ein Zähler kann mehrere Blöcke senden.
|
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<br>
|
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<br>
|
||||||
<ul>
|
<ul>
|
||||||
<code>1:type VIF_ELECTRIC_ENERGY</code><br>
|
<code>1:type VIF_ELECTRIC_ENERGY</code><br>
|
||||||
<code>1:unit Wh</code><br>
|
<code>1:unit Wh</code><br>
|
||||||
@ -488,9 +492,9 @@ WMBUS_Attr(@)
|
|||||||
<br>
|
<br>
|
||||||
Es gibt auch eine Anzahl von festen Readings.
|
Es gibt auch eine Anzahl von festen Readings.
|
||||||
<ul>
|
<ul>
|
||||||
<li><code>is_encrypted</code> ist 1 wenn die empfangene Nachricht verschlüsselt ist.</li>
|
<li><code>is_encrypted</code> ist 1 wenn die empfangene Nachricht verschlüsselt ist.</li>
|
||||||
<li><code>decryption_ok</code> ist 1 wenn die Nachricht entweder erfolgreich entschlüsselt wurde oder gar nicht verschlüsselt war.</li>
|
<li><code>decryption_ok</code> ist 1 wenn die Nachricht entweder erfolgreich entschlüsselt wurde oder gar nicht verschlüsselt war.</li>
|
||||||
<li><code>state</code> enthält den Status des Zählers und kann Fehlermeldungen wie 'battery low' enthalten. Normalerweise ist der Wert 'no error'.</li>
|
<li><code>state</code> enthält den Status des Zählers und kann Fehlermeldungen wie 'battery low' enthalten. Normalerweise ist der Wert 'no error'.</li>
|
||||||
</ul>
|
</ul>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
@ -401,7 +401,8 @@ my %validDeviceTypes = (
|
|||||||
0x19 => 'A/D Converter',
|
0x19 => 'A/D Converter',
|
||||||
0x1a => 'Smokedetector',
|
0x1a => 'Smokedetector',
|
||||||
0x1b => 'Room sensor (e.g. temperature or humidity)',
|
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";
|
#print "Long header\n";
|
||||||
($self->{meter_id}, $self->{meter_man}, $self->{meter_vers}, $self->{meter_dev}, $self->{access_no}, $self->{status}, $self->{cw})
|
($self->{meter_id}, $self->{meter_man}, $self->{meter_vers}, $self->{meter_dev}, $self->{access_no}, $self->{status}, $self->{cw})
|
||||||
= unpack('VvCCCCn', substr($applicationlayer,$offset));
|
= 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});
|
$self->{meter_manufacturer} = $self->manId2ascii($self->{meter_man});
|
||||||
$offset += 12;
|
$offset += 12;
|
||||||
} else {
|
} else {
|
||||||
@ -919,7 +920,7 @@ sub decodeLinkLayer($$)
|
|||||||
}
|
}
|
||||||
|
|
||||||
$self->{manufacturer} = $self->manId2ascii($self->{mfield});
|
$self->{manufacturer} = $self->manId2ascii($self->{mfield});
|
||||||
$self->{typestring} = $validDeviceTypes{$self->{afield_type}};
|
$self->{typestring} = $validDeviceTypes{$self->{afield_type}} || 'unknown';
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user