Wireless M-Bus für CUL

Begonnen von tostmann, 12 Juni 2014, 17:34:32

Vorheriges Thema - Nächstes Thema

blaxbox

#735
Hy,

was mir aktuell gerade noch aufgefallen ist, weils bei einem Zählertyp (HYD) immer wieder gerne vorkommt: LVAR ASCII-Felder beinhalten manchmal nicht druckbare Zeichen. Ich habe beim mir testweise bei


          #  ASCII string with LVAR characters
         
          $value = unpack('a*',substr($payload, $offset, $lvar));
          if(($value =~ tr/\x20-\x7d//c) == 0)
          { 
           if ($self->{manufacturer} eq 'ESY')
           {   
             # Easymeter stores the string backwards!
             $value = reverse($value);
           }   
          }   
          else
          {   
           $self->{errormsg} = "Not a printable ASCII in LVAR";
           $self->{errorcode} = ERR_UNKNOWN_DATAFIELD;
           return 0;

          }


eingefügt. Ob es sinnvoll ist oder nicht - k.A., aber es führt auf alle Fälle nicht zu Problemen wenn man nicht-druckbare Zeichen auswerten möchte.

In der Funktion valueCalcNumeric habe ich ein paar Überprüfungen hinzugefügt, da es auch hier manchmal bei machen Zählern Probleme gibt:


sub valueCalcNumeric($$) {
  my $value = shift;
  my $dataBlock = shift;

  if(defined($value) && defined($dataBlock->{valueFactor}))
  {
   return $value * $dataBlock->{valueFactor} if(looks_like_number($value));
   return 0;
  }
  return 0;
}


Natürlich mit


use Scalar::Util qw(looks_like_number);


lg


chbla

Zitat von: kaihs am 03 April 2019, 20:37:17
Siehe Anhang. Beide Dateien in einem Verzeichnis ablegen. wmbus_beispiel.pl ausführbar machen (chmod +x wmbus_beispiel.pl ).
Zusätzlich muss noch das CRC Modul installiert werden (sudo apt-get install libdigest-crc-perl). Falls entschlüsselt werden soll noch mehr (sudo cpan -i Crypt::Mode::CBC Crypt::Mode::CTR).
Die auszuwertende Nachricht steht aktuell im Quelltext. Bei Bedarf kannst du dir das ja so umschreiben, dass das z. B. aus einer Datei gelesen wird.

Die zweite Zeile ist wahrscheinlich von so einem Zähler und da gilt leider die selbe Einschränkung wie bei Techem.

So jetzt habe ich endlich mal Zeit da weiter zu machen - die Schatzsuche hat begonnen :)

@kaihs ich teste das ganze jetzt mal bei mir, hier ist ein Wasserzaehler von "Hydrometer" (HYD) installiert, was ich bisher an passenden Paketen gefunden habe ist:
https://gist.github.com/solars/b68149d114e5fdbeb9e2ff2cbde5480f

Das sieht schon ganz gut aus. Die naechsten Schritte waeren dann fuer mich:

1. wie ordne ich die IDs zu, hat die Ident Nummer was mit den Nummern auf dem Zaehler (siehe Anhang) zu tun?
2. wie werte ich den Payload (remaining payload) aus?

Super sache dein Script! Das Hilft mir enorm.

blaxbox

#737
Zitat von: chbla am 17 April 2019, 11:08:07
So jetzt habe ich endlich mal Zeit da weiter zu machen - die Schatzsuche hat begonnen :)

@kaihs ich teste das ganze jetzt mal bei mir, hier ist ein Wasserzaehler von "Hydrometer" (HYD) installiert, was ich bisher an passenden Paketen gefunden habe ist:
https://gist.github.com/solars/b68149d114e5fdbeb9e2ff2cbde5480f

Das sieht schon ganz gut aus. Die naechsten Schritte waeren dann fuer mich:

1. wie ordne ich die IDs zu, hat die Ident Nummer was mit den Nummern auf dem Zaehler (siehe Anhang) zu tun?
2. wie werte ich den Payload (remaining payload) aus?

Super sache dein Script! Das Hilft mir enorm.


Hy,
sieht für mich nach einer alten Hydrometerverschlüsselung aus.
Länge 0x19 u. CI 0xA2 sind die Bedeutung für ein "Standard Radio" Telegramm mit "Standardlänge"
....
Was ich in meiner Sammlung gefunden habe:

chbla

Super, Danke!

Das ist mir nur teilweise klar, insbesondere wie man die 4 Felder der Tabelle, A,B,C,D herausbekommt.
A2 bedeutet demnach A: current value, B: e.o.m value, C,D: e.o.m date

Die Zaehler ID kann ich noch nicht ganz zuordnen..

blaxbox

Hy,

also die ZählerID ist bei den HYD verdreht drinnen, d.h. es sind die 8 BCD-Stellen vor dem A2 (siehe meinen Anhang 1.png), Generation u. Medium stehen vor der Seriennummer - lt. Norm sollte das umgekehrt sein.
Leider kann ich auch keinen Zusammenhang zu der auf deinem Zähler aufgedrucken Seriennummer sehen - warum auch immer. Du dürftest aber verschiedene Zähler empfangen, die Daten sind allerdings verschlüsselt - das Control-field (nach dem VIF) muss (nach erfolgreichem entschlüsseln) 0x4B sein.

$msg = '19442423 85 07 21250617 A2 41 19 00 13 51 E464AF01185D43580761';
Medium = 0x07 == WATER
Generation = 0x85
SerNr: 17062521
VIF: 0x13 = Volume [l]

$msg = '19442423 85 07 79350917 A2 51 1A 00 13 F4 43FCC4C88BA13F1F0A5C';
Medium = 0x07 == WATER
Generation = 0x85
SerNr: 17093579
VIF: 0x13 = Volume [l]

$msg = '19442423 85 07 71469716 A2 51 17 00 13 B4 C4B27BC0D22429DE9F5A';
Medium = 0x07 == WATER
Generation = 0x85
SerNr: 16974671
VIF: 0x13 = Volume [l]

$msg = '19442423 85 07 65834418 A2 01 5B 00 13 26 7DE25132735A3BE4A83E';
Medium = 0x07 == WATER
Generation = 0x85
SerNr: 18448365
VIF: 0x13 = Volume [l]




chbla

#740
Danke für die Erklärung!
Dann sammel ich mal fleißig weiter und schaue, ob mein Zähler mal auftaucht.

Danach ist dann wohl die Frage wie man das entschlüsselt.

Wo in der Tabelle hast du jetzt das 0x13 gesehen? Dachte bei A2 ist das dann e.o.m date?
Edit: Falsch gelesen, das VIF decoding fehlt aber in den Bildern oder?

chbla

ok ich habe jetzt den oben erwaehnten Zaehler gefunden, die gehoeren wohl dazu:


  # 29442423850721581115A2410700131A4A91B4305585F47F824750CA2BB347452FF21EC0B4287FD9C303
  # 29442423850721581115A2310700131A2F5D4861B0BEF97ECD4A50AFE74F16A014FF1F8FB9308DD9E26F
  # 29442423850721581115A2310700131A275D4861B0BEF97ECD4A50AFE74F16A014FF1F8FB9308DD9E26F
  # 29442423850721581115A2310700131A275D4861B0BEF97ECD4A50AFE74F16A014FF1F8FB9308DD9E26F
  # 29442423850721581115A2110700131A0D03DB37F3194AC8FF4F5081B9DC40E3B34CA9BDBC561AB44F2A


Da ist die ID vom Zaehler selber (nicht vom Funkmodul), Rueckwaerts drin (siehe Bild): 21581115

Das Script spuckt leider nur folgendes aus:


rc = 0
Manufacturer 2324 HYD
IdentNumber 58210785
Version 17
Type 15 Hot water (> 90 °C)
IsEncrypted 0
Status: 0
Error:Unsupported CI Field a2, remaining payload is 410700131a4a91b4305585f47f824750ca2bb347452ff21ec0b4287fd9c303


Wie mache ich da weiter? Ist das jetzt noch encrypted?

blaxbox

#742
Zitat von: chbla am 17 April 2019, 13:54:48
Danke für die Erklärung!
Dann sammel ich mal fleißig weiter und schaue, ob mein Zähler mal auftaucht.

Danach ist dann wohl die Frage wie man das entschlüsselt.

Wo in der Tabelle hast du jetzt das 0x13 gesehen? Dachte bei A2 ist das dann e.o.m date?
Edit: Falsch gelesen, das VIF decoding fehlt aber in den Bildern oder?

ja, sind aber konform gem. OMS bzw. EN 13757-3

blaxbox

Zitat von: chbla am 17 April 2019, 18:17:19
ok ich habe jetzt den oben erwaehnten Zaehler gefunden, die gehoeren wohl dazu:


  # 29442423850721581115A2410700131A4A91B4305585F47F824750CA2BB347452FF21EC0B4287FD9C303
  # 29442423850721581115A2310700131A2F5D4861B0BEF97ECD4A50AFE74F16A014FF1F8FB9308DD9E26F
  # 29442423850721581115A2310700131A275D4861B0BEF97ECD4A50AFE74F16A014FF1F8FB9308DD9E26F
  # 29442423850721581115A2310700131A275D4861B0BEF97ECD4A50AFE74F16A014FF1F8FB9308DD9E26F
  # 29442423850721581115A2110700131A0D03DB37F3194AC8FF4F5081B9DC40E3B34CA9BDBC561AB44F2A


Da ist die ID vom Zaehler selber (nicht vom Funkmodul), Rueckwaerts drin (siehe Bild): 21581115

Das Script spuckt leider nur folgendes aus:


rc = 0
Manufacturer 2324 HYD
IdentNumber 58210785
Version 17
Type 15 Hot water (> 90 °C)
IsEncrypted 0
Status: 0
Error:Unsupported CI Field a2, remaining payload is 410700131a4a91b4305585f47f824750ca2bb347452ff21ec0b4287fd9c303


Wie mache ich da weiter? Ist das jetzt noch encrypted?

Hy,

ja ist noch encrypted....
Das mit der encryption ist so eine Sache. Im Prinzip ist sie extrem simple mit ein paar XORs der Daten + ein 32 Bit Schlüssel (an dem sich nach meiner Erfahrung aber nur 16 Bit ändern, der Rest scheint fix drinnen zu sein).
Aber diese "simple" decryption führt auch dazu, dass man nicht einfach alle Möglichkeiten per script durchlaufen lassen kann, bis das "control-field" 0x4b ist....hier kommt man dann alle paar iterationen drauf.

ich habe mir ein script geschrieben, welches ein paar mehr Dinge überprüft, bzw. wenn man den zählerstand kennt, kann man dann dadrauf triggern.
Wenn ich nicht ganz falsch liege, sind deine Daten (für 1 Telegramm wenn ich mir dein Bild mit dem Zählerstand ansehe u. schätze dass das Volumen zum Zeitpunkt des Empfangs nicht unbedingt dem im Telegramm gleich ist, d.h. es zwischen 441,2 und 441,3 m³ liegt):

ORIGINAL:
29  44  24 23  85  07 | 21 58 11 15 | A2 | 41 07 00  13 | 1A | 4A 91 B4 30 55 85 F4 7F 82 47 50 CA 2B B3 47 45 2F F2 1E C0 B4 28 7F D9 C3 03

DECRYPT
29  44  24 23  85  07 | 21 58 11 15 | A2 | 41 07 00  13 | 4B | 81 BB 06 00 95 AC 06 00 61 24 01 01 01 01 77 85 06 00 61 23 D7 5F 06 00 61 22
...was folgendes bedeutet:

len: *0x29* (*41*)
cfield: *0x44*
man: *0x2324*
ver: *0x85*
med: *0x07*
ident: *15115821*
ci: *0xa2*
General alarm: *0*
randomgenerator: *4*
radio telegram emmitting interval: *8* seconds
there is currently a leak: *0*
there was a leak: *0*
meter blocked: *0*
remaining battery lifetime *3.5* years
reverse flow detected: *0*
constant unterflow detected: *0*
excess flow detected: *0*
there is currently a magnetic fraud: *0*
there was a magnetic: *0*
there is currently a mechanic fraud: *0*
there was a machanic fraud: *0*
VIF: *0x13* (Volume [l])

d.h. im A- Block steht 81 BB 06 00, was 0x0006bb81 entspricht, d.h. in dezimal: 441217, d.h. (mit 0x13 als VIF): 441,217 m³.

Die decryption ist bei mir über Nacht gelaufen, d.h. nicht unbedingt eine flotte Variante....

chbla

@blaxbox, wow, das sieht ja super aus!

Nur ein paar Verstaendnisfragen:

- bekommt man da dann auch den Schlüssel heraus?
- Falls ja, Ist das dann derselbe den die Stadt/Wasserwerke verwenden?
- Werden diese Schlüssel pro Zähler vergeben oder sind das allgemeine Schlüssel für best. Zählertypen?
- Ist das was verschlüsselt wird bzw. werden kann generell der gesamte hintere teil? Bin etwas irritiert weil ja das Script erstmal ausgibt Encrypted: 0

Ich frage mich, wie ich da weitermache, wenn wir mehrere Zähler haben, da ist das decrypten wie oben ja dann ziemlich
umständlich..

blaxbox

Hy,

naja, den bekommt man schon heraus - habs ja durchlaufen lassen u. den Schlüssel dann erhalten. Wollte ihn nur hier nicht posten, da ich nicht weiß wie hier diverse Hersteller/Betreiber darauf reagieren, da dies offenbar ein häufig verwendeter Schlüssel ist (ich habe das mit etlichen in diesem Forum geposteten Telegrammen versucht u. habe sie entschlüsseln können).

Nach einer Suche in diesem Forum musste ich feststellen, dass dies scheinbar schon wer gemacht hat (nur halt für den AES-KEY bei Encryptionmode 5):

https://forum.fhem.de/index.php/topic,33068.msg737335.html#msg737335

Da ein "standard radio telegram" und "real data radio telegram" nur mit 64 Bit u. nicht mit 128 Bit "verschlüsselt" sind ist der in diesem Beitrag angegebene Schlüssel einfach nur die "Hälfte" (bei dem in diesem Beitrag angegebene Schlüssel sind die ersten 64 Bit (offensichtlich) einfach nochmals eingefügt worden, damit der Schlüssel 128 Bit hat).

Die Entschlüsselung funktioniert allerdings nicht mit dem WMBus.pm, da dies ja wie gesagt (scheinbar) ein wenig Herstellerspezifisch ist u. einige Dinge (wie die Seriennummer + version + medium) verdreht drinnen sind.
Ich habe das gestern schnell ein kleines perl-script geschrieben, mit welchem Du den Schlüssel ausprobieren kannst (geht aber nur für "standard radio telegram", also alles was im CI-Feld 0xA0 - 0xA7 stehen hat, für "real data radio telegramm" (CI=0x7A) sieht das einwenig anders aus).

Einfach mit "-s <TELEGRAM> -k <KEY>" aufrufen.


#!/usr/bin/perl -w

use strict;
use Getopt::Std;

my $g_input_string;
my %options    = ();
my $enckey;

if( ! getopts('s:k:',\%options))
{
exit 1;
}

if (defined $options{s})
{
$g_input_string = ($options{s});
printf("g_input_string1: *".$g_input_string."*\n");
}

if (defined $options{k})
{
$enckey = pack("H*",$options{k});
printf("enckey: *".unpack("H*",$enckey)."*\n");
}

my $msg = pack("H*",$g_input_string);
my ($len,$cfield,$man,$ver,$med,$ident,$ci,$f1,$f2,$f3,$vif) = unpack("CCvCCVCCCCC",$msg);

printf("len: *0x%.2x* (*%d*)\ncfield: *0x%.2x*\nman: *0x%.4x*\nver: *0x%.2x*\nmed: *0x%.2x*\nident: *%.8x*\nci: *0x%.2x*\n",$len,$len,$cfield,$man,$ver,$med,$ident,$ci);

my $g_alarm = ($f1 & 0b10000000) >> 7;
my $random_g = ($f1 & 0b01110000) >> 4;
my $radio_emmiting = ($f1 & 0b00001111);
printf("General alarm: *%d*\nrandomgenerator: *%d*\nradio telegram emmitting interval: *%d* seconds\n",$g_alarm,$random_g,(4*(1 << $radio_emmiting)));

my $leak = ($f2 & 0b10000000) >> 7;
my $was_leak = ($f2 & 0b01000000) >> 6;
my $m_blocked = ($f2 & 0b00100000) >> 5;
my $battery_lifetime = ($f2 & 0b00011111);

printf("there is currently a leak: *%d*\nthere was a leak: *%d*\nmeter blocked: *%d*\nremaining battery lifetime *%.1f* years\n",$leak,$was_leak,$m_blocked,$battery_lifetime/2);


my $reverse_flow = ($f3 & 0b10000000) >> 7;
my $under_flow = ($f3 & 0b01000000) >> 6;
my $excess_flow = ($f3 & 0b00100000) >> 5;
my $mag_is = ($f3 & 0b00001000) >> 3;
my $mag_was = ($f3 & 0b00000100) >> 2;
my $mech_is = ($f3 & 0b00000010) >> 1;
my $mech_was = ($f3 & 0b00000001);

printf("reverse flow detected: *$reverse_flow*\n");
printf("constant unterflow detected: *$under_flow*\n");
printf("excess flow detected: *$excess_flow*\n");
printf("there is currently a magnetic fraud: *$mag_is*\n");
printf("there was a magnetic: *$mag_was*\n");
printf("there is currently a mechanic fraud: *$mech_is*\n");
printf("there was a machanic fraud: *$mech_was*\n");
#### a.s.o

my $fkt_name = "-";

printf("VIF: *0x%.2x*\n",$vif);

my $s_reg0 = substr($msg,2,4) ^ substr($msg,6,4) ^ substr($msg,10,4);
my $key_high = substr($enckey,0,4);
my $key_low = substr($enckey,4,4);
my $s_reg;
my $w_reg;
my $bo;
my $bytepad;
my $payload;
 
$s_reg = $s_reg0 ^ $key_high ^ $key_low;
$w_reg = unpack("N",$s_reg) & 0xFFFFFFFF;
$payload = '';

for (my $i1 = 15; $i1 <= $len; ++$i1)
{
if( ($i1 >= 26) && ((($i1 - 26) % 16) == 0) ) # First Block is 10 Bytes long, following 16 bytes
{   
  $w_reg = unpack("N",$s_reg);
}

$bo = 0;

for(my $i2 = 0; $i2 < 8; ++$i2)
{
  my $c = 0;
 
  $c = ($c ^ 0x01) if ( $w_reg & 0x00000002 );
  $c = ($c ^ 0x01) if ( $w_reg & 0x00000004 );
  $c = ($c ^ 0x01) if ( $w_reg & 0x00000800 );
  $c = ($c ^ 0x01) if ( $w_reg & 0x80000000 );
 
  $w_reg = (($w_reg << 1) + ($c & 0xFFFFFFFF));
  $bo = (($bo << 1) + $c);
}
$bytepad = unpack("C",substr($msg,$i1,1)) ^ $bo;
$payload = $payload.pack("C",$bytepad);
}
if( unpack("C",$payload) == 0x4b )
{
my $value = unpack("V",substr($payload,1,4));

if( $value >= 441200 && $value <= 441300) # expected counter value
{
  printf("********************************************************************************\n");
  printf("* possible key: *0x%.8x%.8x*, value at A-Block: *%i*\n",unpack("N",$key_high),unpack("N",$key_low),unpack("V",substr($payload,1,4)));
  printf("* full (decrypted) message: *0x".unpack("H*",substr($msg,0,15)).unpack("H*",$payload)."*\n");
  printf("* payload  : *0x".unpack("H*",substr($payload,1))."*\n");
  printf("********************************************************************************\n");
}
}
else
{
printf("********************************************************************************\n");
printf("* DECRYPTION FAILED\n");
printf("********************************************************************************\n");

}


kaihs

Zitat von: blaxbox am 16 April 2019, 14:41:09
Hy,

kann es sein, dass es in manchen Bereich Probleme mit dem shiften gibt?


Danke für diese und die weiteren Korrekturen. Ich habe sie mit nur kleinen Anpassungen übernommen und eingecheckt.
Banana Pi, Add-On Board mit 1.8" TFT LCD und IR-Sender, CULFW V1.61, div. Homematic Komponenten, Pollin Funksteckdosen, Selbstbau CUL433 MHz, Jeelink Clone, EC3000
Selbstbau CUL868MHz für Wireless M-Bus, SIGNALduino mit Logilink Temp.-sensoren und Auriol Wetterstation

kaihs

Zitat von: blaxbox am 17 April 2019, 11:22:41
Was ich in meiner Sammlung gefunden habe:

Du scheinst dich mit WMBus ja sehr gut auszukennen und hast ja auch herstellerspezifische Informationen. Hast du beruflich damit zu tun?

Leider ist es ja so, dass viele Hersteller sich eine eigene Kodierung ausdenken. Ich möchte die zwar prinzipiell im WMBus Modul unterstützen, allerdings wird der Code durch die ganzen Sonderfälle schnell (noch) unübersichtlicher.
Die herstellerspezifischen Teile würde ich daher gerne von der Implementierung des Standards trennen. Lohn sich aber nur, wenn ein paar Hersteller zusammenkommen.
Bisher ist das hauptsächlich Kamstrup und mit deinen Informationen vielleicht Hydrometer.
Hast du noch Informationen zu anderen herstellerspezifischen Protokollen?
Banana Pi, Add-On Board mit 1.8" TFT LCD und IR-Sender, CULFW V1.61, div. Homematic Komponenten, Pollin Funksteckdosen, Selbstbau CUL433 MHz, Jeelink Clone, EC3000
Selbstbau CUL868MHz für Wireless M-Bus, SIGNALduino mit Logilink Temp.-sensoren und Auriol Wetterstation

Mihca

Nach dem heutigen (22.04.2019) update von "Wmbus.pm" zeigt meine FastForward EnergyCam den Fehler "decryption failed" und es werden keine Daten mehr geloggt. Zurückspielen der vorherigen "Wmbus.pm" Version beseitigt das Problem. Anbei das Raw-Listing des Devices.


defmod Stromzaehler WMBUS FFD 11822566 1 2
attr Stromzaehler IODev CUL_1
attr Stromzaehler icon measure_power_meter
attr Stromzaehler ignoreUnknownDataBlocks 1
attr Stromzaehler room Energie
attr Stromzaehler userReadings power:energy.* differential {ReadingsVal("Stromzaehler","energy",0)*3600;;}
attr Stromzaehler verbose 3

setstate Stromzaehler decryption failed
setstate Stromzaehler 2019-04-22 08:20:16 1_storage_no 0
setstate Stromzaehler 2019-04-22 08:20:16 1_type VIF_ENERGY_WATT
setstate Stromzaehler 2019-04-22 08:20:16 1_unit Wh
setstate Stromzaehler 2019-04-22 08:20:16 1_value 516800
setstate Stromzaehler 2019-04-22 08:20:16 1_value_type Instantaneous value
setstate Stromzaehler 2019-04-22 08:20:16 2_storage_no 0
setstate Stromzaehler 2019-04-22 08:20:16 2_type VIF_ACCESS_NO
setstate Stromzaehler 2019-04-22 08:20:16 2_unit
setstate Stromzaehler 2019-04-22 08:20:16 2_value 57241
setstate Stromzaehler 2019-04-22 08:20:16 2_value_type Instantaneous value
setstate Stromzaehler 2019-04-22 13:05:16 LQI 128
setstate Stromzaehler 2019-04-22 13:05:16 RSSI -29.5
setstate Stromzaehler 2019-04-22 08:20:16 batteryState ok
setstate Stromzaehler 2019-04-22 08:20:16 decryption_ok 1
setstate Stromzaehler 2019-04-22 08:20:16 energy 516.8
setstate Stromzaehler 2019-04-22 13:05:16 is_encrypted 0
setstate Stromzaehler 2019-04-22 08:20:16 power 1.50001313131622
setstate Stromzaehler 2019-04-22 13:05:16 state decryption failed
setstate Stromzaehler 2019-04-22 08:20:16 unit kWh


Vielen Dank vorab.
Achim
Viele Grüße
Achim
__________
Kein Fehler ist so dumm, dass man ihn nicht machen könnte.
Raspi Ubuntu 22.04 Perl 5.34, Rollo-, Sonnen-, Licht-, Heizungs-, Poolsteuerung, Energiebilanzen -- HomeMatic, FS20, ESP/Tasmota/ESPEasy, CUL868v3 USB, MAX! Cube LAN mit CUL-Firmware HomeMatic

kaihs

Zitat von: Mihca am 22 April 2019, 14:59:17
Nach dem heutigen (22.04.2019) update von "Wmbus.pm" zeigt meine FastForward EnergyCam den Fehler "decryption failed" und es werden keine Daten mehr geloggt. Zurückspielen der vorherigen "Wmbus.pm" Version beseitigt das Problem. Anbei das Raw-Listing des Devices.

[

Sorry, ist jetzt gefixed. Morgen dann per update erhältlich.
Banana Pi, Add-On Board mit 1.8" TFT LCD und IR-Sender, CULFW V1.61, div. Homematic Komponenten, Pollin Funksteckdosen, Selbstbau CUL433 MHz, Jeelink Clone, EC3000
Selbstbau CUL868MHz für Wireless M-Bus, SIGNALduino mit Logilink Temp.-sensoren und Auriol Wetterstation