From e3f38508ed5cbcc266395adca92508e59ed89542 Mon Sep 17 00:00:00 2001
From: sidey79 sudo apt-get install libjson-perl
";
+ }
+
+ my $channel=AttrVal($name,"updateChannelFW","stable");
+ my $hardware=AttrVal($name,"hardware",undef);
+
+ my ($validHw) = $modules{$hash->{TYPE}}{AttrList} =~ /.*hardware:(.*?)\s/;
+ SIGNALduino_Log3 $name, 1, "$name: $validHw";
+
+ if (!defined($hardware) || $validHw !~ /$hardware(?:,|$)/ )
+ {
+ SIGNALduino_Log3 $name, 1, "$name: get $a[1] failed. Please set attribute hardware first";
+ return "$a[1]: \n\n$name: get $a[1] failed. Please choose one of $validHw attribute hardware";
+ }
+
+ SIGNALduino_querygithubreleases($hash);
+
+ return "$a[1]: \n\nFetching $channel firmware versions for $hardware from github\n";
+
+ }
+
+ if (IsDummy($name) && $a[1] ne "protocolIDs")
{
- if ($arg =~ /^M[CSU];.*/)
+ if ($arg =~ /^M[CcSU];.*/)
{
$arg="\002$arg\003"; ## Add start end end marker if not already there
- Log3 $name, 5, "$name/msg adding start and endmarker to message";
+ SIGNALduino_Log3 $name, 5, "$name/msg adding start and endmarker to message";
}
if ($arg =~ /\002M.;.*;\003$/)
{
- Log3 $name, 4, "$name/msg get raw: $arg";
+ SIGNALduino_Log3 $name, 4, "$name/msg get raw: $arg";
return SIGNALduino_Parse($hash, $hash, $hash->{NAME}, $arg);
}
else {
@@ -2056,7 +927,7 @@ SIGNALduino_Get($@)
if (!defined($fileRegexp) || $row =~ m/$fileRegexp/) {
$n += 1;
$row="\002$row\003";
- Log3 $name, 4, "$name/msg fileGetRaw: $row";
+ SIGNALduino_Log3 $name, 4, "$name/msg fileGetRaw: $row";
SIGNALduino_Parse($hash, $hash, $hash->{NAME}, $row);
}
}
@@ -2078,15 +949,15 @@ SIGNALduino_Get($@)
return $ret;
}
else {
- Log3 $name, 4, "$name/msg get dispatch: $arg";
+ SIGNALduino_Log3 $name, 4, "$name/msg get dispatch: $arg";
Dispatch($hash, $arg, undef);
}
return "";
}
}
- return "No $a[1] for dummies" if(IsDummy($name));
+ #return "No $a[1] for dummies" if(IsDummy($name));
- Log3 $name, 5, "$name: command for gets: " . $gets{$a[1]}[0] . " " . $arg;
+ SIGNALduino_Log3 $name, 5, "$name: command for gets: " . $gets{$a[1]}[0] . " " . $arg;
if ($a[1] eq "raw")
{
@@ -2094,7 +965,7 @@ SIGNALduino_Get($@)
if ($arg =~ /^is.*/ && length($arg) == 34)
{
# Arctec protocol
- Log3 $name, 5, "$name: calling set :sendmsg P17;R6#".substr($arg,2);
+ SIGNALduino_Log3 $name, 5, "$name: calling set :sendmsg P17;R6#".substr($arg,2);
SIGNALduino_Set($hash,$name,"sendMsg","P17#",substr($arg,2),"#R6");
return "$a[0] $a[1] => $arg";
@@ -2103,71 +974,12 @@ SIGNALduino_Get($@)
}
elsif ($a[1] eq "protocolIDs")
{
- my $id;
- my $ret;
- my $s;
- my $moduleId;
- my @IdList = ();
+ return SIGNALduino_FW_getProtocolList($name);
- foreach $id (keys %ProtocolListSIGNALduino)
- {
- next if ($id eq 'id');
- push (@IdList, $id);
- }
- @IdList = sort { $a <=> $b } @IdList;
- $ret = " ID modulname protocolname # comment\n\n";
-
- foreach $id (@IdList)
- {
- $ret .= sprintf("%3s",$id) . " ";
-
- if (exists ($ProtocolListSIGNALduino{$id}{format}) && $ProtocolListSIGNALduino{$id}{format} eq "manchester")
- {
- $ret .= "MC";
- }
- elsif (exists $ProtocolListSIGNALduino{$id}{sync})
- {
- $ret .= "MS";
- }
- elsif (exists ($ProtocolListSIGNALduino{$id}{clockabs}))
- {
- $ret .= "MU";
- }
-
- if (exists ($ProtocolListSIGNALduino{$id}{clientmodule}))
- {
- $moduleId .= "$id,";
- $s = $ProtocolListSIGNALduino{$id}{clientmodule};
- if (length($s) < 15)
- {
- $s .= substr(" ",length($s) - 15);
- }
- $ret .= " $s";
- }
- else
- {
- $ret .= " ";
- }
-
- if (exists ($ProtocolListSIGNALduino{$id}{name}))
- {
- $ret .= " $ProtocolListSIGNALduino{$id}{name}";
- }
-
- if (exists ($ProtocolListSIGNALduino{$id}{comment}))
- {
- $ret .= " # $ProtocolListSIGNALduino{$id}{comment}";
- }
-
- $ret .= "\n";
- }
- #$moduleId =~ s/,$//;
-
- return "$a[1]: \n\n$ret\n";
#return "$a[1]: \n\n$ret\nIds with modules: $moduleId";
- }
-
+ }
+
#SIGNALduino_SimpleWrite($hash, $gets{$a[1]}[0] . $arg);
SIGNALduino_AddSendQueue($hash, $gets{$a[1]}[0] . $arg);
$hash->{getcmd}->{cmd}=$a[1];
@@ -2237,7 +1049,7 @@ sub SIGNALduino_parseResponse($$$)
$ob = sprintf("%02x", $ob+$bits);
$msg = "Setting MDMCFG4 (10) to $ob = $bw KHz";
- Log3 $name, 3, "$name/msg parseResponse bWidth: Setting MDMCFG4 (10) to $ob = $bw KHz";
+ SIGNALduino_Log3 $name, 3, "$name/msg parseResponse bWidth: Setting MDMCFG4 (10) to $ob = $bw KHz";
delete($hash->{getcmd});
SIGNALduino_AddSendQueue($hash,"W12$ob");
SIGNALduino_WriteInit($hash);
@@ -2248,10 +1060,10 @@ sub SIGNALduino_parseResponse($$$)
$CC1101Frequency = $hash->{cc1101_frequency};
}
my $dBn = substr($msg,9,2);
- Log3 $name, 3, "$name/msg parseResponse patable: $dBn";
+ SIGNALduino_Log3 $name, 3, "$name/msg parseResponse patable: $dBn";
foreach my $dB (keys %{ $patable{$CC1101Frequency} }) {
if ($dBn eq $patable{$CC1101Frequency}{$dB}) {
- Log3 $name, 5, "$name/msg parseResponse patable: $dB";
+ SIGNALduino_Log3 $name, 5, "$name/msg parseResponse patable: $dB";
$msg .= " => $dB";
last;
}
@@ -2274,7 +1086,7 @@ SIGNALduino_ResetDevice($)
my ($hash) = @_;
my $name = $hash->{NAME};
- Log3 $hash, 3, "$name reset";
+ SIGNALduino_Log3 $hash, 3, "$name reset";
DevIo_CloseDev($hash);
my $ret = DevIo_OpenDev($hash, 0, "SIGNALduino_DoInit", 'SIGNALduino_Connect');
@@ -2288,7 +1100,7 @@ SIGNALduino_CloseDevice($)
my ($hash) = @_;
my $name = $hash->{NAME};
- Log3 $hash, 2, "$name closed";
+ SIGNALduino_Log3 $hash, 2, "$name closed";
RemoveInternalTimer($hash);
DevIo_CloseDev($hash);
readingsSingleUpdate($hash, "state", "closed", 1);
@@ -2307,7 +1119,7 @@ SIGNALduino_DoInit($)
my ($ver, $try) = ("", 0);
#Dirty hack to allow initialisation of DirectIO Device for some debugging and tesing
- Log3 $hash, 1, "$name/define: ".$hash->{DEF};
+ SIGNALduino_Log3 $hash, 1, "$name/define: ".$hash->{DEF};
delete($hash->{disConnFlag}) if defined($hash->{disConnFlag});
@@ -2315,10 +1127,9 @@ SIGNALduino_DoInit($)
@{$hash->{QUEUE}} = ();
$hash->{sendworking} = 0;
- # if (($hash->{DEF} !~ m/\@DirectIO/) and ($hash->{DEF} !~ m/none/) )
- if (($hash->{DEF} !~ m/\@directio/) and ($hash->{DEF} !~ m/none/) )
+ if (($hash->{DEF} !~ m/\@directio/) and ($hash->{DEF} !~ m/none/) )
{
- Log3 $hash, 1, "$name/init: ".$hash->{DEF};
+ SIGNALduino_Log3 $hash, 1, "$name/init: ".$hash->{DEF};
$hash->{initretry} = 0;
RemoveInternalTimer($hash);
@@ -2330,16 +1141,25 @@ SIGNALduino_DoInit($)
# Reset the counter
delete($hash->{XMIT_TIME});
delete($hash->{NR_CMD_LAST_H});
+
+
+
+
+
+
+
return;
return undef;
}
+
+
# Disable receiver
sub SIGNALduino_SimpleWrite_XQ($) {
my ($hash) = @_;
my $name = $hash->{NAME};
- Log3 $hash, 3, "$name/init: disable receiver (XQ)";
+ SIGNALduino_Log3 $hash, 3, "$name/init: disable receiver (XQ)";
SIGNALduino_SimpleWrite($hash, "XQ");
#DevIo_SimpleWrite($hash, "XQ\n",2);
}
@@ -2351,16 +1171,16 @@ sub SIGNALduino_StartInit($)
my $name = $hash->{NAME};
$hash->{version} = undef;
- Log3 $name,3 , "$name/init: get version, retry = " . $hash->{initretry};
+ SIGNALduino_Log3 $name,3 , "$name/init: get version, retry = " . $hash->{initretry};
if ($hash->{initretry} >= SDUINO_INIT_MAXRETRY) {
$hash->{DevState} = 'INACTIVE';
# einmaliger reset, wenn danach immer noch 'init retry count reached', dann SIGNALduino_CloseDevice()
if (!defined($hash->{initResetFlag})) {
- Log3 $name,2 , "$name/init retry count reached. Reset";
+ SIGNALduino_Log3 $name,2 , "$name/init retry count reached. Reset";
$hash->{initResetFlag} = 1;
SIGNALduino_ResetDevice($hash);
} else {
- Log3 $name,2 , "$name/init retry count reached. Closed";
+ SIGNALduino_Log3 $name,2 , "$name/init retry count reached. Closed";
SIGNALduino_CloseDevice($hash);
}
return;
@@ -2388,7 +1208,7 @@ sub SIGNALduino_CheckCmdResp($)
$ver = $hash->{version};
if ($ver !~ m/SIGNAL(duino|ESP)/) {
$msg = "$name: Not an SIGNALduino device, setting attribute dummy=1 got for V: $ver";
- Log3 $hash, 1, $msg;
+ SIGNALduino_Log3 $hash, 1, $msg;
readingsSingleUpdate($hash, "state", "no SIGNALduino found", 1);
$hash->{DevState} = 'INACTIVE';
SIGNALduino_CloseDevice($hash);
@@ -2396,23 +1216,24 @@ sub SIGNALduino_CheckCmdResp($)
elsif($ver =~ m/^V 3\.1\./) {
$msg = "$name: Version of your arduino is not compatible, pleas flash new firmware. (device closed) Got for V: $ver";
readingsSingleUpdate($hash, "state", "unsupported firmware found", 1);
- Log3 $hash, 1, $msg;
+ SIGNALduino_Log3 $hash, 1, $msg;
$hash->{DevState} = 'INACTIVE';
SIGNALduino_CloseDevice($hash);
}
else {
readingsSingleUpdate($hash, "state", "opened", 1);
- Log3 $name, 2, "$name: initialized. " . SDUINO_VERSION;
+ SIGNALduino_Log3 $name, 2, "$name: initialized. " . SDUINO_VERSION;
$hash->{DevState} = 'initialized';
delete($hash->{initResetFlag}) if defined($hash->{initResetFlag});
SIGNALduino_SimpleWrite($hash, "XE"); # Enable receiver
#DevIo_SimpleWrite($hash, "XE\n",2);
- Log3 $hash, 3, "$name/init: enable receiver (XE)";
+ SIGNALduino_Log3 $hash, 3, "$name/init: enable receiver (XE)";
delete($hash->{initretry});
# initialize keepalive
$hash->{keepalive}{ok} = 0;
$hash->{keepalive}{retry} = 0;
InternalTimer(gettimeofday() + SDUINO_KEEPALIVE_TIMEOUT, "SIGNALduino_KeepAlive", $hash, 0);
+
}
}
else {
@@ -2424,6 +1245,8 @@ sub SIGNALduino_CheckCmdResp($)
}
+
+
#####################################
# Check if the 1% limit is reached and trigger notifies
sub
@@ -2449,7 +1272,7 @@ SIGNALduino_XmitLimitCheck($$)
if(@b > 163) { # Maximum nr of transmissions per hour (unconfirmed).
my $name = $hash->{NAME};
- Log3 $name, 2, "SIGNALduino TRANSMIT LIMIT EXCEEDED";
+ SIGNALduino_Log3 $name, 2, "SIGNALduino TRANSMIT LIMIT EXCEEDED";
DoTrigger($name, "TRANSMIT LIMIT EXCEEDED");
} else {
@@ -2469,15 +1292,22 @@ SIGNALduino_Write($$$)
my ($hash,$fn,$msg) = @_;
my $name = $hash->{NAME};
- $fn="RAW" if $fn eq "";
-
- Log3 $name, 5, "$name/write: adding to queue $fn $msg";
-
- #SIGNALduino_SimpleWrite($hash, $bstring);
+ if ($fn eq "") {
+ $fn="RAW" ;
+ }
+ elsif($fn eq "04" && substr($msg,0,6) eq "010101") { # FS20
+ $fn="sendMsg";
+ $msg = substr($msg,6);
+ $msg = SIGNALduino_PreparingSend_FS20_FHT(74, 6, $msg);
+ }
+ elsif($fn eq "04" && substr($msg,0,6) eq "020183") { # FHT
+ $fn="sendMsg";
+ $msg = substr($msg,6,4) . substr($msg,10); # was ist der Unterschied zu "$msg = substr($msg,6);" ?
+ $msg = SIGNALduino_PreparingSend_FS20_FHT(73, 12, $msg);
+ }
+ SIGNALduino_Log3 $name, 5, "$name/write: sending via Set $fn $msg";
SIGNALduino_Set($hash,$name,$fn,$msg);
- #SIGNALduino_AddSendQueue($hash,$bstring);
-
}
@@ -2488,9 +1318,9 @@ sub SIGNALduino_AddSendQueue($$)
push(@{$hash->{QUEUE}}, $msg);
- #Log3 $hash , 5, Dumper($hash->{QUEUE});
+ #SIGNALduino_Log3 $hash , 5, Dumper($hash->{QUEUE});
- Log3 $hash, 5,"AddSendQueue: " . $hash->{NAME} . ": $msg (" . @{$hash->{QUEUE}} . ")";
+ SIGNALduino_Log3 $hash, 5,"AddSendQueue: " . $hash->{NAME} . ": $msg (" . @{$hash->{QUEUE}} . ")";
InternalTimer(gettimeofday() + 0.1, "SIGNALduino_HandleWriteQueue", "HandleWriteQueue:$name") if (@{$hash->{QUEUE}} == 1 && $hash->{sendworking} == 0);
}
@@ -2508,7 +1338,7 @@ SIGNALduino_SendFromQueue($$)
SIGNALduino_SimpleWrite($hash,$msg);
if ($msg =~ m/^S(R|C|M);/) {
$hash->{getcmd}->{cmd} = 'sendraw';
- Log3 $hash, 4, "$name SendrawFromQueue: msg=$msg"; # zu testen der Queue, kann wenn es funktioniert auskommentiert werden
+ SIGNALduino_Log3 $hash, 4, "$name SendrawFromQueue: msg=$msg"; # zu testen der Queue, kann wenn es funktioniert auskommentiert werden
}
elsif ($msg eq "C99") {
$hash->{getcmd}->{cmd} = 'ccregAll';
@@ -2539,7 +1369,7 @@ SIGNALduino_HandleWriteQueue($)
$hash->{sendworking} = 0; # es wurde gesendet
if (defined($hash->{getcmd}->{cmd}) && $hash->{getcmd}->{cmd} eq 'sendraw') {
- Log3 $name, 4, "$name/HandleWriteQueue: sendraw no answer (timeout)";
+ SIGNALduino_Log3 $name, 4, "$name/HandleWriteQueue: sendraw no answer (timeout)";
delete($hash->{getcmd});
}
@@ -2552,7 +1382,7 @@ SIGNALduino_HandleWriteQueue($)
SIGNALduino_SendFromQueue($hash, $msg);
}
} else {
- Log3 $name, 4, "$name/HandleWriteQueue: nothing to send, stopping timer";
+ SIGNALduino_Log3 $name, 4, "$name/HandleWriteQueue: nothing to send, stopping timer";
RemoveInternalTimer("HandleWriteQueue:$name");
}
}
@@ -2570,7 +1400,7 @@ SIGNALduino_Read($)
my $debug = AttrVal($name,"debug",0);
my $SIGNALduinodata = $hash->{PARTIAL};
- Log3 $name, 5, "$name/RAW READ: $SIGNALduinodata/$buf" if ($debug);
+ SIGNALduino_Log3 $name, 5, "$name/RAW READ: $SIGNALduinodata/$buf" if ($debug);
$SIGNALduinodata .= $buf;
while($SIGNALduinodata =~ m/\n/) {
@@ -2578,7 +1408,7 @@ SIGNALduino_Read($)
($rmsg,$SIGNALduinodata) = split("\n", $SIGNALduinodata, 2);
$rmsg =~ s/\r//;
- if ($rmsg =~ m/^\002(M(s|u);.*;)\003/) {
+ if ($rmsg =~ m/^\002(M(s|u|o);.*;)\003/) {
$rmsg =~ s/^\002//; # \002 am Anfang entfernen
my @msg_parts = split(";",$rmsg);
my $m0;
@@ -2588,8 +1418,10 @@ SIGNALduino_Read($)
my $mH;
my $part = "";
my $partD;
+ SIGNALduino_Log3 $name, 5, "$name/RAW rmsg: $rmsg";
foreach my $msgPart (@msg_parts) {
+ next if ($msgPart eq "");
$m0 = substr($msgPart,0,1);
$mnr0 = ord($m0);
$m1 = substr($msgPart,1);
@@ -2620,17 +1452,20 @@ SIGNALduino_Read($)
$mL = ord($D) & 7;
$partD .= "$mH$mL";
}
- #Log3 $name, 3, "$name/msg READredu1$m0: $partD";
+ #SIGNALduino_Log3 $name, 3, "$name/msg READredu1$m0: $partD";
if ($m0 eq "d") {
$partD =~ s/.$//; # letzte Ziffer entfernen wenn Anzahl der Ziffern ungerade
}
$partD =~ s/^8//; # 8 am Anfang entfernen
- #Log3 $name, 3, "$name/msg READredu2$m0: $partD";
+ #SIGNALduino_Log3 $name, 3, "$name/msg READredu2$m0: $partD";
$part = $part . $partD . ';';
}
elsif (($m0 eq "C" || $m0 eq "S") && length($m1) == 1) {
$part .= "$m0" . "P=$m1;";
}
+ elsif ($m0 eq "o" || $m0 eq "m") {
+ $part .= "$m0$m1;";
+ }
elsif ($m1 =~ m/^[0-9A-Z]{1,2}$/) { # bei 1 oder 2 Hex Ziffern nach Dez wandeln
$part .= "$m0=" . hex($m1) . ";";
}
@@ -2642,18 +1477,18 @@ SIGNALduino_Read($)
$part .= ";";
}
}
- Log3 $name, 4, "$name/msg READredu: $part";
+ SIGNALduino_Log3 $name, 4, "$name/msg READredu: $part";
$rmsg = "\002$part\003";
}
else {
- Log3 $name, 4, "$name/msg READ: $rmsg";
+ SIGNALduino_Log3 $name, 4, "$name/msg READ: $rmsg";
}
if ( $rmsg && !SIGNALduino_Parse($hash, $hash, $name, $rmsg) && defined($hash->{getcmd}) && defined($hash->{getcmd}->{cmd}))
{
my $regexp;
if ($hash->{getcmd}->{cmd} eq 'sendraw') {
- $regexp = '^S(R|C|M);';
+ $regexp = '^S(?:R|C|M);.';
}
elsif ($hash->{getcmd}->{cmd} eq 'ccregAll') {
$regexp = '^ccreg 00:';
@@ -2669,13 +1504,13 @@ SIGNALduino_Read($)
$hash->{keepalive}{ok} = 1;
$hash->{keepalive}{retry} = 0;
}
- Log3 $name, 5, "$name/msg READ: regexp=$regexp cmd=$hash->{getcmd}->{cmd} msg=$rmsg";
+ SIGNALduino_Log3 $name, 5, "$name/msg READ: regexp=$regexp cmd=$hash->{getcmd}->{cmd} msg=$rmsg";
if ($hash->{getcmd}->{cmd} eq 'version') {
my $msg_start = index($rmsg, 'V 3.');
if ($msg_start > 0) {
$rmsg = substr($rmsg, $msg_start);
- Log3 $name, 4, "$name/read: cut chars at begin. msgstart = $msg_start msg = $rmsg";
+ SIGNALduino_Log3 $name, 4, "$name/read: cut chars at begin. msgstart = $msg_start msg = $rmsg";
}
$hash->{version} = $rmsg;
if (defined($hash->{DevState}) && $hash->{DevState} eq 'waitInit') {
@@ -2685,7 +1520,7 @@ SIGNALduino_Read($)
}
if ($hash->{getcmd}->{cmd} eq 'sendraw') {
# zu testen der sendeQueue, kann wenn es funktioniert auf verbose 5
- Log3 $name, 4, "$name/read sendraw answer: $rmsg";
+ SIGNALduino_Log3 $name, 4, "$name/read sendraw answer: $rmsg";
delete($hash->{getcmd});
RemoveInternalTimer("HandleWriteQueue:$name");
SIGNALduino_HandleWriteQueue("x:$name");
@@ -2696,13 +1531,13 @@ SIGNALduino_Read($)
readingsSingleUpdate($hash, $hash->{getcmd}->{cmd}, $rmsg, 0);
}
if (defined($hash->{getcmd}->{asyncOut})) {
- #Log3 $name, 4, "$name/msg READ: asyncOutput";
+ #SIGNALduino_Log3 $name, 4, "$name/msg READ: asyncOutput";
my $ao = asyncOutput( $hash->{getcmd}->{asyncOut}, $hash->{getcmd}->{cmd}.": " . $rmsg );
}
delete($hash->{getcmd});
}
} else {
- Log3 $name, 4, "$name/msg READ: Received answer ($rmsg) for ". $hash->{getcmd}->{cmd}." does not match $regexp";
+ SIGNALduino_Log3 $name, 4, "$name/msg READ: Received answer ($rmsg) for ". $hash->{getcmd}->{cmd}." does not match $regexp";
}
}
}
@@ -2717,11 +1552,11 @@ sub SIGNALduino_KeepAlive($){
return if ($hash->{DevState} eq 'disconnected');
- #Log3 $name,4 , "$name/KeepAliveOk: " . $hash->{keepalive}{ok};
+ #SIGNALduino_Log3 $name,4 , "$name/KeepAliveOk: " . $hash->{keepalive}{ok};
if (!$hash->{keepalive}{ok}) {
delete($hash->{getcmd});
if ($hash->{keepalive}{retry} >= SDUINO_KEEPALIVE_MAXRETRY) {
- Log3 $name,3 , "$name/keepalive not ok, retry count reached. Reset";
+ SIGNALduino_Log3 $name,3 , "$name/keepalive not ok, retry count reached. Reset";
$hash->{DevState} = 'INACTIVE';
SIGNALduino_ResetDevice($hash);
return;
@@ -2732,14 +1567,14 @@ sub SIGNALduino_KeepAlive($){
if ($hash->{keepalive}{retry} == 1) {
$logLevel = 4;
}
- Log3 $name, $logLevel, "$name/KeepAlive not ok, retry = " . $hash->{keepalive}{retry} . " -> get ping";
+ SIGNALduino_Log3 $name, $logLevel, "$name/KeepAlive not ok, retry = " . $hash->{keepalive}{retry} . " -> get ping";
$hash->{getcmd}->{cmd} = "ping";
SIGNALduino_AddSendQueue($hash, "P");
#SIGNALduino_SimpleWrite($hash, "P");
}
}
else {
- Log3 $name,4 , "$name/keepalive ok, retry = " . $hash->{keepalive}{retry};
+ SIGNALduino_Log3 $name,4 , "$name/keepalive ok, retry = " . $hash->{keepalive}{retry};
}
$hash->{keepalive}{ok} = 0;
@@ -2760,12 +1595,12 @@ sub SIGNALduino_ParseHttpResponse
if($err ne "") # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist
{
- Log3 $name, 3, "error while requesting ".$param->{url}." - $err"; # Eintrag fürs Log
+ SIGNALduino_Log3 $name, 3, "$name: error while requesting ".$param->{url}." - $err"; # Eintrag fuers Log
}
- elsif($param->{code} eq "200" && $data ne "") # wenn die Abfrage erfolgreich war ($data enthält die Ergebnisdaten des HTTP Aufrufes)
+ elsif($param->{code} eq "200" && $data ne "") # wenn die Abfrage erfolgreich war ($data enthaelt die Ergebnisdaten des HTTP Aufrufes)
{
- Log3 $name, 3, "url ".$param->{url}." returned: ".length($data)." bytes Data"; # Eintrag fürs Log
+ SIGNALduino_Log3 $name, 3, "url ".$param->{url}." returned: ".length($data)." bytes Data"; # Eintrag fuers Log
if ($param->{command} eq "flash")
{
@@ -2778,8 +1613,8 @@ sub SIGNALduino_ParseHttpResponse
($filename = $param->{path}) =~s/.*\///;
}
- Log3 $name, 3, "$name: Downloaded $filename firmware from ".$param->{host};
- Log3 $name, 5, "$name: Header = ".$param->{httpheader};
+ SIGNALduino_Log3 $name, 3, "$name: Downloaded $filename firmware from ".$param->{host};
+ SIGNALduino_Log3 $name, 5, "$name: Header = ".$param->{httpheader};
$filename = "FHEM/firmware/" . $filename;
@@ -2787,14 +1622,19 @@ sub SIGNALduino_ParseHttpResponse
print $file $data;
close $file;
- # Den Flash Befehl mit der soebene heruntergeladenen Datei ausführen
- #Log3 $name, 3, "calling set ".$param->{command}." $filename"; # Eintrag fürs Log
+ # Den Flash Befehl mit der soebene heruntergeladenen Datei ausfuehren
+ #SIGNALduino_Log3 $name, 3, "calling set ".$param->{command}." $filename"; # Eintrag fuers Log
- SIGNALduino_Set($hash,$name,$param->{command},$filename); # $hash->{SetFn}
-
+ my $set_return = SIGNALduino_Set($hash,$name,$param->{command},$filename); # $hash->{SetFn}
+ if (defined($set_return))
+ {
+ SIGNALduino_Log3 $name ,3, "$name: Error while flashing: $set_return";
+ } else {
+ SIGNALduino_Log3 $name ,3, "$name: Firmware update was succesfull";
+ }
}
} else {
- Log3 $name, 3, "undefined error while requesting ".$param->{url}." - $err - code=".$param->{code}; # Eintrag fürs Log
+ SIGNALduino_Log3 $name, 3, "$name: undefined error while requesting ".$param->{url}." - $err - code=".$param->{code}; # Eintrag fuers Log
}
}
@@ -2993,7 +1833,8 @@ sub SIGNALduino_Split_Message($$)
{
#Debug "$name: checking msg part:( $_ )" if ($debug);
- if ($_ =~ m/^MS/ or $_ =~ m/^MC/ or $_ =~ m/^MU/) #### Synced Message start
+ #if ($_ =~ m/^MS/ or $_ =~ m/^MC/ or $_ =~ m/^Mc/ or $_ =~ m/^MU/) #### Synced Message start
+ if ($_ =~ m/^M./)
{
$ret{messagetype} = $_;
}
@@ -3069,22 +1910,22 @@ sub SIGNALduno_Dispatch($$$$$)
if (!defined($dmsg))
{
- Log3 $name, 5, "$name Dispatch: dmsg is undef. Skipping dispatch call";
+ SIGNALduino_Log3 $name, 5, "$name Dispatch: dmsg is undef. Skipping dispatch call";
return;
}
- #Log3 $name, 5, "$name: Dispatch DMSG: $dmsg";
+ #SIGNALduino_Log3 $name, 5, "$name: Dispatch DMSG: $dmsg";
my $DMSGgleich = 1;
if ($dmsg eq $hash->{LASTDMSG}) {
- Log3 $name, SDUINO_DISPATCH_VERBOSE, "$name Dispatch: $dmsg, test gleich";
+ SIGNALduino_Log3 $name, SDUINO_DISPATCH_VERBOSE, "$name Dispatch: $dmsg, test gleich";
} else {
if (defined($hash->{DoubleMsgIDs}{$id})) {
$DMSGgleich = 0;
- Log3 $name, SDUINO_DISPATCH_VERBOSE, "$name Dispatch: $dmsg, test ungleich";
+ SIGNALduino_Log3 $name, SDUINO_DISPATCH_VERBOSE, "$name Dispatch: $dmsg, test ungleich";
}
else {
- Log3 $name, SDUINO_DISPATCH_VERBOSE, "$name Dispatch: $dmsg, test ungleich: disabled";
+ SIGNALduino_Log3 $name, SDUINO_DISPATCH_VERBOSE, "$name Dispatch: $dmsg, test ungleich: disabled";
}
$hash->{LASTDMSG} = $dmsg;
}
@@ -3096,9 +1937,10 @@ sub SIGNALduno_Dispatch($$$$$)
$hash->{TIME} = time();
$hash->{DMSG} = $dmsg;
#my $event = 0;
- if (substr(ucfirst($dmsg),0,1) eq 'U') {
+ if (substr(ucfirst($dmsg),0,1) eq 'U') { # u oder U
#$event = 1;
DoTrigger($name, "DMSG " . $dmsg);
+ return if (substr($dmsg,0,1) eq 'U'); # Fuer $dmsg die mit U anfangen ist kein Dispatch notwendig, da es dafuer kein Modul gibt klein u wird dagegen dispatcht
}
#readingsSingleUpdate($hash, "state", $hash->{READINGS}{state}{VAL}, $event);
@@ -3115,15 +1957,44 @@ sub SIGNALduno_Dispatch($$$$$)
else {
$rssi = "";
}
- Log3 $name, SDUINO_DISPATCH_VERBOSE, "$name Dispatch: $dmsg, $rssi dispatch";
+ $dmsg = lc($dmsg) if ($id eq '74');
+ SIGNALduino_Log3 $name, SDUINO_DISPATCH_VERBOSE, "$name Dispatch: $dmsg, $rssi dispatch";
Dispatch($hash, $dmsg, \%addvals); ## Dispatch to other Modules
} else {
- Log3 $name, 4, "$name Dispatch: $dmsg, Dropped due to short time or equal msg";
+ SIGNALduino_Log3 $name, 4, "$name Dispatch: $dmsg, Dropped due to short time or equal msg";
}
}
}
+# param #1 is name of definition
+# param #2 is protocol id
+# param #3 is dispatched message to check against
+#
+# returns 1 if message matches modulematch + development attribute/whitelistIDs
+# returns 0 if message does not match modulematch
+# return -1 if message is not activated via whitelistIDs but has developID=m flag
+sub SIGNALduino_moduleMatch
+{
+ my $name = shift;
+ my $id = shift;
+ my $dmsg = shift;
+ my $debug = AttrVal($name,"debug",0);
+ my $modMatchRegex=SIGNALduino_getProtoProp($id,"modulematch",undef);
+
+ if (!defined($modMatchRegex) || $dmsg =~ m/$modMatchRegex/) {
+ Debug "$name: modmatch passed for: $dmsg" if ($debug);
+ my $developID = SIGNALduino_getProtoProp($id,"developId","");
+ my $IDsNoDispatch = "," . InternalVal($name,"IDsNoDispatch","") . ",";
+ if ($IDsNoDispatch ne ",," && index($IDsNoDispatch, ",$id,") >= 0) { # kein dispatch wenn die Id im Internal IDsNoDispatch steht
+ SIGNALduino_Log3 $name, 3, "$name: ID=$id skipped dispatch (developId=m). To use, please add $id to the attr whitelist_IDs";
+ return -1;
+ }
+ return 1; # return 1 da modulematch gefunden wurde
+ }
+ return 0;
+}
+
sub
SIGNALduino_Parse_MS($$$$%)
{
@@ -3224,7 +2095,14 @@ SIGNALduino_Parse_MS($$$$%)
Debug "Found matched zero with indexes: ($pstr)" if ($debug && $valid);
$patternLookupHash{$pstr}="0" if ($valid); ## Append Sync to our lookuptable
Debug "zero pattern not found" if ($debug && !$valid);
-
+
+ if (defined($ProtocolListSIGNALduino{$id}{float}))
+ {
+ my $floatValid = ($pstr=SIGNALduino_PatternExists($hash,\@{$ProtocolListSIGNALduino{$id}{float}},\%patternList,\$rawData)) >=0;
+ Debug "Found matched float with indexes: ($pstr)" if ($debug && $floatValid);
+ $patternLookupHash{$pstr}="F" if ($floatValid); ## Append Sync to our lookuptable
+ Debug "float pattern not found" if ($debug && !$floatValid);
+ }
#Debug "added $pstr " if ($debug && $valid);
next if (!$valid) ;
@@ -3234,7 +2112,7 @@ SIGNALduino_Parse_MS($$$$%)
#Anything seems to be valid, we can start decoding this.
- Log3 $name, 4, "$name: Matched MS Protocol id $id -> $ProtocolListSIGNALduino{$id}{name}" if ($valid);
+ SIGNALduino_Log3 $name, 4, "$name: Matched MS Protocol id $id -> $ProtocolListSIGNALduino{$id}{name}" if ($valid);
my $signal_width= @{$ProtocolListSIGNALduino{$id}{one}};
#Debug $signal_width;
@@ -3244,30 +2122,23 @@ SIGNALduino_Parse_MS($$$$%)
#for (my $i=index($rawData,SIGNALduino_PatternExists($hash,\@{$ProtocolListSIGNALduino{$id}{sync}}))+$signal_width;$i
+
";
+
+
+ if (-s AttrVal("global", "logdir", "./log/") .$fn)
+ {
+ my $flashlogurl="$FW_ME/FileLog_logWrapper?dev=$lfn&type=text&file=$fn";
+
+ $ret .= " ";
+ $ret .= "Last Flashlog<\/a>";
+ $ret .= " ";
+ #return $ret;
+ }
+
+ my $protocolURL="$FW_ME/FileLog_logWrapper?dev=$lfn&type=text&file=$fn";
+
+ $ret.="Display protocollist ";
+ $ret .= '";
+
+ $ret .="
";
+ return $ret;
+}
+
+
+sub SIGNALduino_querygithubreleases
+{
+ my ($hash) = @_;
+ my $name = $hash->{NAME};
+ my $param = {
+ url => "https://api.github.com/repos/RFD-FHEM/SIGNALDuino/releases",
+ timeout => 5,
+ hash => $hash, # Muss gesetzt werden, damit die Callback funktion wieder $hash hat
+ method => "GET", # Lesen von Inhalten
+ header => "User-Agent: perl_fhem\r\nAccept: application/json", # Den Header gemaess abzufragender Daten aendern
+ callback => \&SIGNALduino_githubParseHttpResponse, # Diese Funktion soll das Ergebnis dieser HTTP Anfrage bearbeiten
+ command => "queryReleases"
+
+ };
+ HttpUtils_NonblockingGet($param); # Starten der HTTP Abfrage. Es gibt keinen Return-Code.
+}
+
+
+#return -10 = hardeware attribute is not set
+sub SIGNALduino_githubParseHttpResponse($$$)
+{
+ my ($param, $err, $data) = @_;
+ my $hash = $param->{hash};
+ my $name = $hash->{NAME};
+ my $hardware=AttrVal($name,"hardware",undef);
+
+ if($err ne "") # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist
+ {
+ Log3 $name, 3, "error while requesting ".$param->{url}." - $err (command: $param->{command}"; # Eintrag fuers Log
+ #readingsSingleUpdate($hash, "fullResponse", "ERROR"); # Readings erzeugen
+ }
+ elsif($data ne "" && defined($hardware)) # wenn die Abfrage erfolgreich war ($data enthaelt die Ergebnisdaten des HTTP Aufrufes)
+ {
+
+ my $json_array = decode_json($data);
+ #print Dumper($json_array);
+ if ($param->{command} eq "queryReleases") {
+ #Log3 $name, 3, "url ".$param->{url}." returned: $data"; # Eintrag fuers Log
+
+ my $releaselist="";
+ if (ref($json_array) eq "ARRAY") {
+ foreach my $item( @$json_array ) {
+ next if (AttrVal($name,"updateChannelFW","stable") eq "stable" && $item->{prerelease});
+
+ #Debug " item = ".Dumper($item);
+
+ foreach my $asset (@{$item->{assets}})
+ {
+ next if ($asset->{name} !~ m/$hardware/i);
+ $releaselist.=$item->{tag_name}."," ;
+ last;
+ }
+
+ }
+ }
+
+ $releaselist =~ s/,$//;
+ $hash->{additionalSets}{flash} = $releaselist;
+ } elsif ($param->{command} eq "getReleaseByTag" && defined($hardware)) {
+ #Debug " json response = ".Dumper($json_array);
+
+ my @fwfiles;
+ foreach my $asset (@{$json_array->{assets}})
+ {
+ my %fileinfo;
+ if ( $asset->{name} =~ m/$hardware/i)
+ {
+ $fileinfo{filename} = $asset->{name};
+ $fileinfo{dlurl} = $asset->{browser_download_url};
+ $fileinfo{create_date} = $asset->{created_at};
+ #Debug " firmwarefiles = ".Dumper(@fwfiles);
+ push @fwfiles, \%fileinfo;
+
+ my $set_return = SIGNALduino_Set($hash,$name,"flash",$asset->{browser_download_url}); # $hash->{SetFn
+ if(defined($set_return))
+ {
+ SIGNALduino_Log3 $name, 3, "$name: Error while trying to download firmware: $set_return";
+ }
+ last;
+
+ }
+ }
+
+ }
+ } elsif (!defined($hardware)) {
+ SIGNALduino_Log3 $name, 5, "$name: SIGNALduino_githubParseHttpResponse hardware is not defined";
+ } # wenn
+ # Damit ist die Abfrage zuende.
+ # Evtl. einen InternalTimer neu schedulen
+ FW_directNotify("#FHEMWEB:$FW_wname", "location.reload('true')", "");
+ return 0;
+}
1;
=pod
=item summary supports the same low-cost receiver for digital signals
-=item summary_DE Unterstützt den gleichnamigen Low-Cost Empfänger fuer digitale Signale
+=item summary_DE Unterstuetzt den gleichnamigen Low-Cost Empfänger fuer digitale Signale
=begin html
@@ -5168,118 +4542,296 @@ sub SIGNALduino_Log3($$$)
act. dev ID Msg Type modulname protocolname # comment ";
+ $ret .="";
+ my $oddeven="odd";
+ my $checked;
+ my $checkAll;
+
+ foreach $id (@IdList)
+ {
+ my $msgtype = "";
+ my $chkbox;
+
+ if (exists ($ProtocolListSIGNALduino{$id}{format}) && $ProtocolListSIGNALduino{$id}{format} eq "manchester")
+ {
+ $msgtype = "MC";
+ }
+ elsif (exists $ProtocolListSIGNALduino{$id}{sync})
+ {
+ $msgtype = "MS";
+ }
+ elsif (exists ($ProtocolListSIGNALduino{$id}{clockabs}))
+ {
+ $msgtype = "MU";
+ }
+
+ $checked="";
+
+ if (substr($whitelist,0,1) ne "#") { # whitelist aktiv, dann ermitteln welche ids bei select all nicht checked sein sollen
+ $checkAll = "SDcheck";
+ if (exists($BlacklistIDs{$id})) {
+ $checkAll = "SDnotCheck";
+ }
+ elsif (exists($ProtocolListSIGNALduino{$id}{developId})) {
+ if ($devFlag == 1 && $ProtocolListSIGNALduino{$id}{developId} eq "p") {
+ $checkAll = "SDnotCheck";
+ }
+ elsif ($devFlag == 0 && $ProtocolListSIGNALduino{$id}{developId} eq "y" && $develop !~ m/y$id/) {
+ $checkAll = "SDnotCheck";
+ }
+ elsif ($devFlag == 0 && $ProtocolListSIGNALduino{$id}{developId} eq "m") {
+ $checkAll = "SDnotCheck";
+ }
+ }
+ }
+ else {
+ $checkAll = "SDnotCheck";
+ }
+
+ if (exists($activeIdHash{$id}))
+ {
+ $checked="checked";
+ if (substr($whitelist,0,1) eq "#") { # whitelist nicht aktiv, dann entspricht select all dem $activeIdHash
+ $checkAll = "SDcheck";
+ }
+ }
+
+ if ($devFlag == 0 && exists($ProtocolListSIGNALduino{$id}{developId}) && $ProtocolListSIGNALduino{$id}{developId} eq "p") {
+ $chkbox=" ",$oddeven,$chkbox,SIGNALduino_getProtoProp($id,"developId",""),$id,$msgtype,SIGNALduino_getProtoProp($id,"clientmodule",""),SIGNALduino_getProtoProp($id,"name",""),$comment);
+ $oddeven= $oddeven eq "odd" ? "even" : "odd" ;
+
+ $ret .= "\n";
+ }
+ $ret .= "%s
- The SIGNALduino ia based on an idea from mdorenka published at FHEM Forum.
-
- With the opensource firmware (see this link) it is capable
- to receive and send different protocols over different medias. Currently are 433Mhz protocols implemented.
-
-
- The following device support is currently available:
-
-
-
- Wireless switches
- ITv1 & ITv3/Elro and other brands using pt2263 or arctech protocol--> uses IT.pm
-
- In the ITv1 protocol is used to sent a default ITclock from 250 and it may be necessary in the IT-Modul to define the attribute ITclock
-
- Temperatur / humidity senso
+ The SIGNALduino ia based on an idea from mdorenka published at FHEM Forum. With the opensource firmware (see this link) it is capable to receive and send different protocols over different medias. Currently are 433Mhz protocols implemented.
+ The following device support is currently available:
+ Wireless switches
-
-
In the ITv1 protocol is used to sent a default ITclock from 250 and it may be necessary in the IT-Modul to define the attribute ITclock
-
- It is possible to attach more than one device in order to get better
- reception, fhem will filter out duplicate messages.
-
- Note: this module require the Device::SerialPort or Win32::SerialPort
- module. It can currently only attatched via USB.
-
+
+ Temperature / humidity sensors
+
+
+
+ It is possible to attach more than one device in order to get better reception, fhem will filter out duplicate messages. See more at the global section with attribute dupTimeout
+ Note: this module require the Device::SerialPort or Win32::SerialPort module. It can currently only attatched via USB.
- Define
- define <name> SIGNALduino <device>
-
+ Define
+
USB-connected devices (SIGNALduino):define <name> SIGNALduino <device>
-
- modprobe usbserial
- vendor=0x03eb
- product=0x204b
-
In this case the device is most probably
- /dev/ttyUSB0.
-
- You can also specify a baudrate if the device name contains the @
- character, e.g.: /dev/ttyACM0@57600
This is also the default baudrate
-
- It is recommended to specify the device via a name which does not change:
- e.g. via by-id devicename: /dev/serial/by-id/usb-1a86_USB2.0-Serial-if00-port0@57600
-
- If the baudrate is "directio" (e.g.: /dev/ttyACM0@directio), then the
- perl module Device::SerialPort is not needed, and fhem opens the device
- with simple file io. This might work if the operating system uses sane
- defaults for the serial parameters, e.g. some Linux distributions and
- OSX.
+
+
+
+ Internals
+
+
+ In this case the device is most probably /dev/ttyUSB0.
+ You can also specify a baudrate if the device name contains the @ character, e.g.: /dev/ttyACM0@57600
This is also the default baudrate.
+ It is recommended to specify the device via a name which does not change:
+ e.g. via by-id devicename: /dev/serial/by-id/usb-1a86_USB2.0-Serial-if00-port0@57600
+ If the baudrate is "directio" (e.g.: /dev/ttyACM0@directio), then the perl module Device::SerialPort is not needed, and fhem opens the device with simple file io. This might work if the operating system uses sane defaults for the serial parameters, e.g. some Linux distributions and OSX.
+
+
+
+ Set
+
+
+
+ Only with CC1101 receiver.
+ Set the sduino frequency / bandwidth / PA table / receiver-amplitude / sensitivity
+
+ Use it with care, it may destroy your hardware and it even may be
+ illegal to do so. Note: The parameters used for RFR transmission are
+ not affected.
+
+
+
+ cc1101_freq
sets both the reception and transmission frequency. Note: Although the CC1101 can be set to frequencies between 315 and 915 MHz, the antenna interface and the antenna is tuned for exactly one frequency. Default is 433.920 MHz (or 868.350 MHz). If not set, frequency from cc1101_frequency
attribute will be set.cc1101_bWidth
can be set to values between 58 kHz and 812 kHz. Large values are susceptible to interference, but make possible to receive inaccurately calibrated transmitters. It affects tranmission too. Default is 325 kHz.cc1101_patable
change the PA table (power amplification for RF sending)cc1101_rAmpl
is receiver amplification, with values between 24 and 42 dB. Bigger values allow reception of weak signals. Default is 42.cc1101_sens
is the decision boundary between the on and off values, and it is 4, 8, 12 or 16 dB. Smaller values allow reception of less clear signals. Default is 4 dB.
+
+
+ Closes the connection to the device.
+
+
+
+ Allows you to disable the message processing for
+
+
+ The new state will be saved into the eeprom of your arduino.
+
+
+
+ Allows you to enable the message processing for
+
+
+ The new state will be saved into the eeprom of your arduino.
+
+
+
+ The SIGNALduino needs the right firmware to be able to receive and deliver the sensor data to fhem. In addition to the way using the arduino IDE to flash the firmware into the SIGNALduino this provides a way to flash it directly from FHEM. You can specify a file on your fhem server or specify a url from which the firmware is downloaded There are some requirements:
+
+
+ Example:
+
On a Raspberry PI this can be done with: sudo apt-get install avrdude
This attribute defines the command, that gets sent to avrdude to flash the uC.
+
+ note model radino:
+ set sduino flash ./FHEM/firmware/SIGNALduino_mega2560.hex
set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC7/SIGNALDuino_nanocc1101.hex
+
+
+
+
+
+
+
+ If the bootloader is enabled, it signals with a flashing LED. Then you have 8 seconds to flash.
+
+
+
+ This will do a reset of the usb port and normaly causes to reset the uC connected.
+
+
+
+ Issue a SIGNALduino firmware command, without waiting data returned by
+ the SIGNALduino. See the SIGNALduino firmware code for details on SIGNALduino
+ commands. With this line, you can send almost any signal via a transmitter connected
+ To send some raw data look at these examples:
+ P
+
Example 1: set sduino raw SR;R=3;P0=500;P1=-9000;P2=-4000;P3=-2000;D=0302030 sends the data in raw mode 3 times repeated
+
Example 2: set sduino raw SM;R=3;P0=500;C=250;D=A4F7FDDE sends the data manchester encoded with a clock of 250uS
+
Example 3: set sduino raw SC;R=3;SR;P0=5000;SM;P0=500;C=250;D=A4F7FDDE sends a combined message of raw and manchester encoded repeated 3 times
+
+
set sduino sendMsg P0#0101#R3#C500
+ set sduino sendMsg P29#0xF7E#R4
+ MS=1;MU=1;MC=1;Mred=0
+ avrdude -c arduino -b [BAUDRATE] -P [PORT] -p atmega328p -vv -U flash:w:[HEXFILE] 2>[LOGFILE]
avrdude -c avr109 -b [BAUDRATE] -P [PORT] -p atmega32u4 -vv -D -U flash:w:[HEXFILE] 2>[LOGFILE]
dev
, are under development
+
+ Der SIGNALduino ist basierend auf einer Idee von "mdorenka" und veröffentlicht im FHEM Forum. + + Mit der OpenSource-Firmware (SIGNALDuino und SIGNALESP) ist dieser fähig zum Empfangen und Senden verschiedener Protokolle auf 433 und 868 Mhz. + + Folgende Geräte werden zur Zeit unterstützt: + + Funk-Schalter +
+ Es ist möglich, mehr als ein Gerät anzuschließen, um beispielsweise besseren Empfang zu erhalten. FHEM wird doppelte Nachrichten herausfiltern. + Mehr dazu im dem global Abschnitt unter dem Attribut dupTimeout + Hinweis: Dieses Modul erfordert das Device::SerialPort oder Win32::SerialPort + Modul. Es kann derzeit nur über USB angeschlossen werden. + |
+
define <name> SIGNALduino <device>
+ USB-connected devices (SIGNALduino):cdc_acm
Kernel_Modul dafür verantwortlich und es wird ein /dev/ttyACM0
oder /dev/ttyUSB0
Gerät angelegt. Wenn deine Distribution kein cdc_acm
Module besitzt, kannst du usbserial nutzen um den SIGNALduino zu betreiben mit folgenden Kommandos:
+ /dev/ttyUSB0
./dev/ttyACM0@57600
/dev/serial/by-id/usb-1a86_USB2.0-Serial-if00-port0@57600
/dev/ttyACM0@directio
), dann benutzt das Perl Modul nicht Device::SerialPort und FHEM öffnet das Gerät mit einem file io. Dies kann funktionieren, wenn das Betriebssystem die Standardwerte für die seriellen Parameter verwendet. Bsp: einige Linux Distributionen und
+ OSX.
- P
Example: P0#0101#R3#C500
-
Will generate the raw send command for the message 0101 with protocol 0 and instruct the arduino to send this three times and the clock is 500.
-
SR;R=3;P0=500;P1=-9000;P2=-4000;P3=-2000;D=03020302;
-
cc1101_freq
, legt sowohl die Empfangsfrequenz als auch die Übertragungsfrequenz fest.cc1101_frequency
geholt.cc1101_bWidth
, kann auf Werte zwischen 58 kHz und 812 kHz eingestellt werden. Große Werte sind störanfällig, ermöglichen jedoch den Empfang von ungenau kalibrierten Sendern. Es wirkt sich auch auf die Übertragung aus. Standard ist 325 kHz.cc1101_patable
, Änderung der PA-Tabelle (Leistungsverstärkung für HF-Senden)cc1101_rAmpl
, ist die Empfängerverstärkung mit Werten zwischen 24 und 42 dB. Größere Werte erlauben den Empfang schwacher Signale. Der Standardwert ist 42.cc1101_sens
, ist die Entscheidungsgrenze zwischen den Ein- und Aus-Werten und beträgt 4, 8, 12 oder 16 dB. Kleinere Werte erlauben den Empfang von weniger klaren Signalen. Standard ist 4 dB.avrdude
muss auf dem Host installiert sein. Auf einem Raspberry PI kann dies getan werden mit: sudo apt-get install avrdude
set sduino flash ./FHEM/firmware/SIGNALduino_mega2560.hex
set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC7/SIGNALDuino_nanocc1101.hex
set sduino raw SR;R=3;P0=500;P1=-9000;P2=-4000;P3=-2000;D=0302030
, sendet die Daten im Raw-Modus dreimal wiederholtset sduino raw SM;R=3;P0=500;C=250;D=A4F7FDDE
, sendet die Daten Manchester codiert mit einem clock von 250µSset sduino raw SC;R=3;SR;P0=5000;SM;P0=500;C=250;D=A4F7FDDE
, sendet eine kombinierte Nachricht von Raw und Manchester codiert 3 mal wiederholt+
set sduino sendMsg P0#0101#R3#C500
+ set sduino sendMsg P29#0xF7E#R4
+ set flash
Befehl auswählbar.
+ MS=1;MU=1;MC=1;Mred=0
+ avrdude -c arduino -b [BAUDRATE] -P [PORT] -p atmega328p -vv -U flash:w:[HEXFILE] 2>[LOGFILE]
avrdude -c avr109 -b [BAUDRATE] -P [PORT] -p atmega32u4 -vv -D -U flash:w:[HEXFILE] 2>[LOGFILE]
set SIGNALduino flash
als erstes Argument übergebenflash
. Hier sollten Sie angeben, welche Hardware Sie mit dem usbport verbunden haben. Andernfalls kann es zu Fehlfunktionen des Geräts kommen. Wichtig ist auch das Attribut updateChannelFW
+ # Keine langen IDs verwenden (Default Einstellung): + attr sduino longids 0 + # Immer lange IDs verwenden: + attr sduino longids 1 + # Verwende lange IDs für SD_WS07 Devices. + # Device Namen sehen z.B. so aus: SD_WS07_TH_3. + attr sduino longids SD_WS07 +
flash
zum Flashen an. Mit dem Attribut kann festgelegt werden, ob nur stabile Versionen ("Latest Release") angezeigt werden oder auch Vorabversionen ("Pre-release") einer neuen Firmware.get availableFirmware
neu geladen werden.
+
+ flash
. Hier sollten Sie angeben, welche Hardware Sie mit dem USB-Port verbunden haben. Andernfalls kann es zu Fehlfunktionen des Geräts kommen. dev
markiert sind, befinden sich in Entwicklung.
+ ".int(@a)
- if(int(@a) < 3 || int(@a) > 5);
+ return " wrong syntax: define SIGNALduino_un (".int(@a).")" if(int(@a) < 3 || int(@a) > 4);
- $hash->{CODE} = $a[2];
- $hash->{minsecs} = ((int(@a) > 3) ? $a[3] : 30);
- $hash->{equalMSG} = ((int(@a) > 4) ? $a[4] : 0);
$hash->{lastMSG} = "";
$hash->{bitMSG} = "";
-
- $modules{SIGNALduino_un}{defptr}{$a[2]} = $hash;
$hash->{STATE} = "Defined";
-
- AssignIoPort($hash);
- return undef;
+ my $name = $hash->{NAME};
+
+ my $iodevice = $a[3] if($a[3]);
+ $modules{SIGNALduino_un}{defptr}{$a[2]} = $hash;
+
+ my $ioname = $modules{SIGNALduino_un}{defptr}{ioname} if (exists $modules{SIGNALduino_un}{defptr}{ioname} && not $iodevice);
+ $iodevice = $ioname if not $iodevice;
+
+ ### Attributes ###
+ if ( $init_done == 1 ) {
+ $attr{$name}{stateFormat} = "{ReadingsVal('$name', 'state', '').' | '.ReadingsTimestamp('$name', 'state', '-');}" if( not defined( $attr{$name}{stateformat} ) );
+ }
+
+ AssignIoPort($hash, $iodevice);
}
#####################################
@@ -57,10 +65,12 @@ sub
SIGNALduino_un_Undef($$)
{
my ($hash, $name) = @_;
- delete($modules{SIGNALduino_un}{defptr}{$hash->{CODE}}) if($hash && $hash->{CODE});
+ delete($modules{SIGNALduino_un}{defptr}{$hash->{DEF}}) if($hash && $hash->{DEF});
+ delete($modules{SIGNALduino_un}{defptr}{ioname}) if (exists $modules{SIGNALduino_un}{defptr}{ioname});
return undef;
}
+#####################################
sub SIGNALduino_un_hex2bin {
my $h = shift;
my $hlen = length($h);
@@ -68,7 +78,6 @@ sub SIGNALduino_un_hex2bin {
return unpack("B$blen", pack("H$hlen", $h));
}
-
#####################################
sub
SIGNALduino_un_Parse($$)
@@ -76,6 +85,7 @@ SIGNALduino_un_Parse($$)
my ($hash,$msg) = @_;
my @a = split("", $msg);
my $name = "SIGNALduino_unknown";# $hash->{NAME};
+ my $ioname = $hash->{NAME};
Log3 $hash, 4, "$name incomming msg: $msg";
#my $rawData=substr($msg,2);
@@ -92,50 +102,7 @@ SIGNALduino_un_Parse($$)
my $bitData= unpack("B$blen", pack("H$hlen", $rawData));
Log3 $hash, 4, "$name converted to bits: $bitData";
- if ($protocol == "7" && length($bitData)>=36) ## Unknown Proto 7
- {
-
-
- ## Try TX70DTH Decoding
- my $SensorTyp = "TX70DTH";
- my $channel = SIGNALduino_un_bin2dec(substr($bitData,9,3));
- my $bin = substr($bitData,0,8);
- my $id = sprintf('%X', oct("0b$bin"));
- my $bat = int(substr($bitData,8,1)) eq "1" ? "ok" : "critical";
- my $trend = "";
- my $sendMode = "";
- my $temp = SIGNALduino_un_bin2dec(substr($bitData,16,8));
- if (substr($bitData,14,1) eq "1") {
- $temp = $temp - 1024;
- }
- $temp = $temp / 10;
- my $hum = SIGNALduino_un_bin2dec(substr($bitData,29,7));
- my $val = "T: $temp H: $hum B: $bat";
- Log3 $hash, 4, "$name decoded protocolid: 7 ($SensorTyp) sensor id=$id, channel=$channel, temp=$temp, hum=$hum, bat=$bat\n" ;
-
-
- # Try Eurochron EAS 800
- # 4 8 12 24 28 36
- # 0011 0110 1010 000100000010 1111 00111000 0000 Kanal 3, 25.8 Grad, 56%
- # 0011 0110 1010 000011110011 1111 00111000 0000 Kanal 3, 24.3 Grad, 56%
- # 0011 0001 1001 000100001001 1111 00111101 0000 Kanal 2, 26.5 Grad, 61%
- # 0011 1000 1000 000100000011 1111 01000000 0000 Kanal 1
-
- # ID? CHN TMP ?? HUM
- $SensorTyp = "EAS800z";
- $id = oct ("0b".substr($bitData,4,4));
- $channel = SIGNALduino_un_bin2dec(substr($bitData,9,3))+1;
- $temp = oct ("0b".substr($bitData,12,12))/10;
- $bat = int(substr($bitData,8,1)) eq "1" ? "ok" : "critical"; # Eventuell falsch!
- $hum = SIGNALduino_un_bin2dec(substr($bitData,28,8));
- $sendMode = int(substr($bitData,4,1)) eq "1" ? "auto" : "manual"; # Eventuell falsch!
- my $type = SIGNALduino_un_bin2dec(substr($bitData,0,4));
-
- Log3 $hash, 4, "$name decoded protocolid: 7 ($SensorTyp / type=$type) mode=$sendMode, sensor id=$id, channel=$channel, temp=$temp, hum=$hum, bat=$bat\n" ;
-
-
-
- } elsif ($protocol == "6" && length($bitData)>=36) ## Eurochron
+ if ($protocol == "6" && length($bitData)>=36) ## Eurochron
{
# EuroChron / Tchibo
@@ -166,78 +133,14 @@ SIGNALduino_un_Parse($$)
my $val = "T: $temp H: $hum B: $bat";
Log3 $hash, 4, "$name decoded protocolid: 6 $SensorTyp, sensor id=$id, channel=$channel, temp=$temp\n" ;
- } elsif ($protocol == "9" && length($bitData)>=70) ## Unknown Proto 9
- { #http://nupo-artworks.de/media/report.pdf
-
- my $syncpos= index($bitData,"11111110"); #7x1 1x0 preamble
-
- if ($syncpos ==-1 || length($bitData)-$syncpos < 68)
- {
- Log3 $hash, 4, "$name ctw600 not found, aborting";
- return undef;
- }
- my $sensdata = substr($bitData,$syncpos+8);
-
- my $bat = substr($sensdata,0,3);
- my $id = substr($sensdata,4,6);
- my $temp = substr($sensdata,12,10);
- my $hum = substr($sensdata,22,8);
- my $wind = substr($sensdata,30,16);
- my $rain = substr($sensdata,46,16);
- my $winddir = substr($sensdata,66,4);
-
- Log3 $hash, 4, "$name found ctw600 syncpos at $syncpos message is: $sensdata - sensor id:$id, bat:$bat, temp=$temp, hum=$hum, wind=$wind, rain=$rain, winddir=$winddir";
-
- } elsif ($protocol == "13" && length($bitData)>=14) ## RF21 Protocol
- {
- #my $model=$a[3];
- #my $deviceCode = $a[5].$a[6].$a[7].$a[8].$a[9];
- #my $Freq = $a[10].$a[11].$a[12].$a[13].$a[14];
- my $deviceCode = substr($bitData,0,23);
- my $unit= substr($bitData,23,1);
-
-
- Log3 $hash, 4, "$name found RF21 protocol. devicecode=$deviceCode, unit=$unit";
- }
- elsif ($protocol == "14" && length($bitData)>=12) ## Heidman HX
- {
-
- my $bin = substr($bitData,0,4);
- my $deviceCode = sprintf('%X', oct("0b$bin"));
- my $sound = substr($bitData,7,5);
-
- Log3 $hash, 4, "$name found Heidman HX doorbell. devicecode=$deviceCode, sound=$sound";
-
- }
- elsif ($protocol == "15" && length($bitData)>=64) ## TCM
+ } elsif ($protocol == "15" && length($bitData)>=64) ## TCM
{
my $deviceCode = $a[4].$a[5].$a[6].$a[7].$a[8];
Log3 $hash, 4, "$name found TCM doorbell. devicecode=$deviceCode";
- }
- elsif ($protocol == "16" && length($bitData)>=36) ##Rohrmotor24
- {
- Log3 $hash, 4, "$name / shutter Dooya $bitData received";
-
- Log3 $hash,4, substr($bitData,0,23)." ".substr($bitData,24,4)." ".substr($bitData,28,4)." ".substr($bitData,32,4)." ".substr($bitData,36,4);
- my $id = SIGNALduino_un_binaryToNumber($bitData,0,23);
- my $remote = SIGNALduino_un_binaryToNumber($bitData,24,27);
- my $channel = SIGNALduino_un_binaryToNumber($bitData,28,31);
-
- my $all = ($channel == 0) ? "true" : "false";
- my $commandcode = SIGNALduino_un_binaryToNumber($bitData,32,35);
- my $direction="";
-
- if ($commandcode == 0b0001) {$direction="up";}
- elsif ($commandcode == 0b0011) {$direction="down";}
- elsif ($commandcode == 0b0101) {$direction="stop";}
- elsif ($commandcode == 0b1100) {$direction="learn";}
- else { $direction="unknown";}
- Log3 $hash, 4, "$name found shutter from Dooya. id=$id, remotetype=$remote, channel=$channel, direction=$direction, all_shutters=$all";
- }
- elsif ($protocol == "21" && length($bitData)>=32) ##Einhell doorshutter
+ } elsif ($protocol == "21" && length($bitData)>=32) ##Einhell doorshutter
{
Log3 $hash, 4, "$name / Einhell doorshutter received";
@@ -263,62 +166,152 @@ SIGNALduino_un_Parse($$)
Log3 $hash, 4, "$name decoded protocolid: 7 ($SensorTyp / type=$type) mode=$sendMode, sensor id=$id, channel=$channel, temp=$temp, bat=$bat\n" ;
- } elsif ($protocol == "33" && length($bitData)>=42) ## S014 or tcm sensor
+ } elsif ($protocol == "78" && length($bitData)>=14) ## geiger rohrmotor
{
- my $SensorTyp = "s014/TFA 30.3200/TCM/Conrad";
+ my %bintotristate=(
+ "00" => "0",
+ "10" => "F",
+ "11" => "1"
+ );
+
+ my $tscode;
+ for (my $n=0; $n=40) ## Bresser 7009993
- {
-
- # 0 7 8 9 10 12 22 25 31
- # 01011010 0 0 01 01100001110 10 0111101 11001010
- # ID B? T Kan Temp ?? Hum Pruefsumme?
- #
-
- my $SensorTyp = "Bresser 7009994";
-
- my $id = SIGNALduino_un_binaryToNumber($bitData,0,7);
- my $channel = SIGNALduino_un_binaryToNumber($bitData,10,11);
- my $hum=SIGNALduino_un_binaryToNumber($bitData,25,31);
- my $rawTemp = SIGNALduino_un_binaryToNumber($bitData,12,22);
- my $temp = ($rawTemp - 609.93) / 9.014;
- $temp = sprintf("%.2f", $temp);
-
- my $bitData2 = substr($bitData,0,8) . ' ' . substr($bitData,8,4) . ' ' . substr($bitData,12,11);
- $bitData2 = $bitData2 . ' ' . substr($bitData,23,2) . ' ' . substr($bitData,25,7) . ' ' . substr($bitData,32,8);
- Log3 $hash, 4, "$name converted to bits: " . $bitData2;
- Log3 $hash, 4, "$name decoded protocolid: $protocol ($SensorTyp) sensor id=$id, channel=$channel, rawTemp=$rawTemp, temp=$temp, hum=$hum";
+ Log3 $hash, 4, "geiger message converted to tristate code: " . $tscode;
+ #Dispatch($hash, $tscode,undef);
-
- } else {
- Log3 $hash, 4, $dummyreturnvalue;
- return undef;
+ } elsif ($protocol == "88" && length($rawData) == 17) {
+ my $serial = substr($bitData,32,28);
+ my $buttonbits = substr($bitData,60,4);
+
+ my %buttons = (
+ "0010" => "hoch",
+ "1001" => "runter",
+ "1000" => "stop"
+ );
+
+ Log3 $hash, 4, "$name: Roto shutter - Serialbits=$serial Serial=".oct( "0b$serial" )." Buttonbits=$buttonbits Button=$buttons{$buttonbits}";
}
+
+ ##############################################################################################
+ # version 1) message with u..# without development y attribut -> Unknown code u..# , help me!
+ # version 2) message with u..# and development y attribut -> no message for Unknown code
+ ##############################################################################################
+
+ my $value = AttrVal($ioname, "development", "");
+ my @delevopmentargs = split (",",$value);
+ if ($value =~ m/([umyp]$protocol|1)/g) { # check for u|m|y|p|1 development (u|m|y|p downwards compatibility)
+ ### Help Device + Logfile ###
+ Log3 $hash, 5, "$name: $ioname Protocol $1$protocol found in AttrVal development!";
+
+ my $def;
+ my $devicedef = $name."_".$protocol;
+ $def = $modules{SIGNALduino_un}{defptr}{$devicedef} if(!$def);
+ $modules{SIGNALduino_un}{defptr}{ioname} = $ioname;
+
+ if(!$def) {
+ Log3 $ioname, 1, "$ioname: $name UNDEFINED sensor " . $devicedef . " detected";
+ return "UNDEFINED $devicedef SIGNALduino_un $devicedef";
+ }
+
+ my $hash = $def;
+ my $name = $hash->{NAME};
+
+ $hash->{lastMSG} = $rawData;
+ $hash->{bitMSG} = $bitData;
+
+ my $bitcount = length($bitData);
+
+ $bitcountlength[1] = $bitcount if ($bitcountlength[1] == 0); # to first receive
+
+ if ($bitcount != $bitcountlength[1]) { # comparison
+ if ($bitcount gt $bitcountlength[1]) {
+ $bitcountlength[2] = $bitcount;
+ $bitcountlength[0] = $bitcountlength[1];
+ }
+
+ if ($bitcount lt $bitcountlength[1]) {
+ $bitcountlength[0] = $bitcount;
+ $bitcountlength[2] = $bitcountlength[1];
+ }
+
+ $bitcountlength[1] = $bitcount;
+ readingsSingleUpdate($hash, "bitCountLength", "$bitcountlength[0] to $bitcountlength[2]" ,0);
+ }
+
+ my $hexcount = length($rawData);
+ my $bitDataInvert = $bitData;
+ $bitDataInvert =~ tr/01/10/; # invert message and check if it is possible to deocde now
+ my $rawDataInvert = SIGNALduino_b2h($bitDataInvert);
+
+ readingsBeginUpdate($hash);
+ readingsBulkUpdate($hash, "state", $rawData,0);
+ readingsBulkUpdate($hash, "bitMsg", $bitData);
+ readingsBulkUpdate($hash, "bitMsg_invert", $bitDataInvert);
+ readingsBulkUpdate($hash, "bitCount", $bitcount);
+ readingsBulkUpdate($hash, "hexMsg", $rawData);
+ readingsBulkUpdate($hash, "hexMsg_invert", $rawDataInvert);
+ readingsBulkUpdate($hash, "hexCount_or_nibble", $hexcount);
+ readingsBulkUpdate($hash, "lastInputDev", $ioname);
+ readingsEndUpdate($hash, 1); # Notify is done by Dispatch
+
+ ### Example Logfile ###
+ # 2018-09-24_17:32:53 SIGNALduino_unknown_85 UserInfo: Temp 22.4 Hum 52
+ # 2018-09-24_17:34:25 SIGNALduino_unknown_85 bitMsg: 11110011101110100011100111111110110110111110111110100110001100101000
+ # 2018-09-24_17:34:25 SIGNALduino_unknown_85 bitMsg_invert: 00001100010001011100011000000001001001000001000001011001110011010111
+ # 2018-09-24_17:34:25 SIGNALduino_unknown_85 bitCount: 68
+ # 2018-09-24_17:34:25 SIGNALduino_unknown_85 hexMsg: F3BA39FEDBEFA6328
+ # 2018-09-24_17:34:25 SIGNALduino_unknown_85 hexMsg_invert: 0C45C601241059CD7
+ # 2018-09-24_17:34:25 SIGNALduino_unknown_85 hexCount or nibble: 17
+ # 2018-09-24_17:34:25 SIGNALduino_unknown_85 lastInputDev: sduino_dummy
+
+ return $name;
+ } else {
+ ### nothing - Info ###
+ my $value = AttrVal($ioname, "development", ""); # read attr development from IODev
+
+ if ($value ne "") {
+ $value .= ","; # some definitions already exist, so prepend a new one
+ }
+ $value .= "u$protocol";
+ Log3 $hash, 4, "$name $ioname Protocol:$protocol | To help decode or debug, please add u$protocol! (attr $ioname development $value)" if ($protocol); # To help decode or debug, please add u84! (attr sduino_dummy development u84)
+ }
+ ############################
+
+
Log3 $hash, 4, $dummyreturnvalue;
return undef;
}
+#####################################
+sub
+SIGNALduino_un_Set($$$@)
+{
+ my ( $hash, $name, @a ) = @_;
+ my $ret = "UserInfo";
+ if ($a[0] ne "?") {
+ my $input = join " ", @a[1 .. (scalar(@a)-1)]; # Teile der Eingabe zusammenfassen
+ return "wrong argument! please use $ret argument and one comment." if($a[0] ne "UserInfo" || not $a[1]);
+
+ readingsBeginUpdate($hash);
+ readingsBulkUpdate($hash, "state" , "UserMSG",0);
+ readingsBulkUpdate($hash, "UserMSG", $input) if (defined($input));
+ readingsEndUpdate($hash, 1); # Notify is done by Dispatch
+
+ return undef; # undef because user is in same windows without message, better to use
+ #return "Thanks";
+ }
+
+ return $ret;
+}
+#####################################
sub
SIGNALduino_un_Attr(@)
{
@@ -329,15 +322,14 @@ SIGNALduino_un_Attr(@)
return if($a[0] ne "set" || $a[2] ne "IODev");
my $hash = $defs{$a[1]};
my $iohash = $defs{$a[3]};
- my $cde = $hash->{CODE};
- delete($modules{SIGNALduino_un}{defptr}{$cde});
- $modules{SIGNALduino_un}{defptr}{$iohash->{NAME} . "." . $cde} = $hash;
+ my $cde = $hash->{DEF};
+
+ #delete($modules{SIGNALduino_un}{defptr}{$cde});
+ #$modules{SIGNALduino_un}{defptr}{$iohash->{NAME} . "." . $cde} = $hash;
return undef;
}
-
-# binary string, fistbit #, lastbit #
-
+#####################################
sub
SIGNALduino_un_binaryToNumber
{
@@ -351,14 +343,14 @@ SIGNALduino_un_binaryToNumber
}
-
+#####################################
sub
SIGNALduino_un_binaryToBoolean
{
return int(SIGNALduino_un_binaryToNumber(@_));
}
-
+#####################################
sub
SIGNALduino_un_bin2dec($)
{
@@ -366,6 +358,8 @@ SIGNALduino_un_bin2dec($)
my $int = unpack("N", pack("B32",substr("0" x 32 . $h, -32)));
return sprintf("%d", $int);
}
+
+#####################################
sub
SIGNALduino_un_binflip($)
{
@@ -391,25 +385,30 @@ SIGNALduino_un_binflip($)
SIGNALduino_un
- The SIGNALduino_un module is a testing and debugging module to decode some devices, it will not create any devices, it will catch only all messages from the signalduino which can't be send to another module
+ The SIGNALduino_un module is a testing and debugging module to decode some devices, it will catch only all messages from the signalduino which can't be send to another module.
+ It can create one help devices after define development attribute on SIGNALduino device. You get a hint from Verbose 4 in the FHEM Log.
+ example: SIGNALduino_unknown sduino_dummy Protocol:40 | To help decode or debug, please add u40! (attr sduino_dummy development u40)
Define
- define <name> SIGNALduino_un <code> ]
+ define <name> SIGNALduino_un <code>
You can define a Device, but currently you can do nothing with it.
- Autocreate is also not enabled for this module.
- The function of this module is only to output some logging at verbose 4 or higher. May some data is decoded correctly but it's also possible that this does not work.
- The Module will try to process all messages, which where not handled by other modules.
+ The function of this module is only to output some logging at verbose 4 or higher at FHEM-logfile or logging to help device. May some data is decoded correctly but it's also possible that this does not work.
+ The Module will try to process all messages, which where not handled by other modules.
+ Created devices / logfiles must be deleted manually after removing the protocol from the attribute development
. (example: u40, y84)
- Set N/A
+ Set
+ write "comment" - the user can put comments in the logfile which are arranged to his bits of the device
+ (example: to write off the digital display of the thermometer at the time of reception or states of switches ...)
+
Get N/A
@@ -417,9 +416,23 @@ SIGNALduino_un_binflip($)
Attributes
- - Verbose
+ - ignore
+ - stateFormat
+ - verbose
+
+
+
+ Generated readings
+
+ - bitCount (Length of the signal, binary)
+ - bitCountLength (Length range of all received signals of the protocol)
+ - bitMsg
+ - bitMsg_invert (Message binary, inverted)
+ - hexCount_or_nibble (Length of the signal, hexadecimal)
+ - hexMsg
+ - hexMsg_invert (Message hexadecimal, inverted)
+ - lastInputDev (Device at the last reception)
-
=end html
@@ -429,22 +442,31 @@ SIGNALduino_un_binflip($)
SIGNALduino_un
- Das SIGNALduino_un module ist ein Hilfsmodul um unbekannte Nachrichten debuggen und analysieren zu koennen.
- Das Modul legt keinerlei Geräte oder ähnliches an.
+ Das SIGNALduino_un Modul ist ein Hilfsmodul um unbekannte Nachrichten zu debuggen und analysieren zu können.
+ Das Modul legt nur eine Hilfsgerät an mit Logfile der Bits sobald man das Attribut development
im Empfänger Device auf das entsprechende unbekannte Protokoll setzt.
+ Einen entsprechenden Hinweis erhalten Sie ab Verbose 4 im FHEM Log.
+ Beispiel: SIGNALduino_unknown sduino_dummy Protocol:40 | To help decode or debug, please add u40! (attr sduino_dummy development u40)
Define
+
define <name> SIGNALduino_un <code>
- Es ist moeglich ein Geraet manuell zu definieren, aber damit passiert ueberhaupt nichts.
- Autocreate wird auch keinerlei Geraete aus diesem Modul anlegen.
+ Es ist möglich ein Gerät manuell zu definieren, aber damit passiert überhaupt nichts.
- Die einzgeste Funktion dieses Modules ist, ab Verbose 4 Logmeldungen über die Empfangene Nachricht ins Log zu schreiben. Dabei kann man sich leider nicht darauf verlassen, dass die Nachricht korrekt dekodiert wurde.
- Dieses Modul wird alle Nachrichten verarbeiten, welche von anderen Modulen nicht verarbeitet wurden.
+ Die einzigste Funktion dieses Modules ist, ab Verbose 4 Logmeldungen über die Empfangene Nachricht ins FHEM-Log zu schreiben oder in das Logfile des Hilfsgerätes.
+ Dabei kann man sich leider nicht darauf verlassen, dass die Nachricht korrekt dekodiert wurde. Dieses Modul wird alle Nachrichten verarbeiten, welche von anderen Modulen nicht verarbeitet werden.
+
+ Angelegte Geräte / Logfiles müssen manuell gelöscht werden nachdem aus dem Attribut development
des SIGNALduinos das zu untersuchende Protokoll entfernt wurde. (Beispiel: u40,y84)
+
+
- Set N/A
+ Set
+ write "Kommentar" - somit kann der User in das Logfile des Hilfsgerät Kommentare setzen welche zeitlich zu seinen Bits des Gerätes eingeordnet werden
+ (Beispiel: um die Digitalanzeige des Thermometers abzuschreiben zum Zeitpunkt des Empfangs oder Zustände von Schaltern ...)
+
Get N/A
@@ -452,9 +474,23 @@ SIGNALduino_un_binflip($)
Attributes
- - Verbose
+ - ignore
+ - stateFormat
+ - verbose
+
+
+
+ Generierte Readings
+
+ - bitCount (Länge des Signals, binär)
+ - bitCountLength (Längenbereich aller empfangen Signale des Protokolles)
+ - bitMsg
+ - bitMsg_invert (Nachricht binär, invertiert)
+ - hexCount_or_nibble (Länge des Signals, hexadezimal)
+ - hexMsg
+ - hexMsg_invert (Nachricht hexadezimal, invertiert)
+ - lastInputDev (Device beim letzten Empfang)
-
=end html_DE
diff --git a/fhem/FHEM/lib/signalduino_protocols.hash b/fhem/FHEM/lib/signalduino_protocols.hash
new file mode 100644
index 000000000..0dcc989ff
--- /dev/null
+++ b/fhem/FHEM/lib/signalduino_protocols.hash
@@ -0,0 +1,2191 @@
+################################################################################
+# The file is part of the SIGNALduino project
+#
+# !!! useful hints !!!
+# --------------------
+# name => ' ' # name of device or group of all devices
+# comment => ' ' # exact description or example of devices
+# id => ' ' # number of the protocol definition, each number only once use (accepted no .)
+# knownFreqs => ' ' # known receiver frequency 433.92 | 868.35 (some sensor families or remote send on more frequencies)
+#
+# Time for one, zero, start, sync, float and pause are calculated by clockabs * value = result in microseconds, positive value stands for high signal, negative value stands for low signal
+# clockrange => [ , ] # only MC signals | min , max of pulse / pause times in microseconds
+# clockabs => ' ' # only MU + MS signals | value for calculation of pulse / pause times in microseconds
+# clockabs => '-1' # only MS signals | value pulse / pause times is automatically
+# one => [ , ] # only MU + MS signals | value pair for a one bit, must be always a positive and negative factor of clockabs (accepted . | example 1.5)
+# zero => [ , ] # only MU + MS signals | value pair for a zero bit, must be always a positive and negative factor of clockabs (accepted . | example -1.5)
+# start => [ , ] # only MU - value pair or more for start message
+# preSync => [ , ] # only MU + MS - value pair or more for preamble pulse of signal
+# sync => [ , ] # only MS - value pair or more for sync pulse of signal
+# float => [ , ] # only MU + MS signals | Convert 0F -> 01 (F) to be compatible with CUL
+# pause => [ ] # delay when sending between two signals (clockabs * pause must be < 32768
+#
+# length_min => ' ' # minimum number of bits of message length
+# length_max => ' ' # maximum number of bits of message length
+# paddingbits => ' ' # pad up to x bits before call module, default is 4.
+# paddingbits => '1' # will disable padding, use this setting when using dispatchBin
+# paddingbits => '2' # is padded to an even number, that is a maximum of 1 bit
+# remove_zero => 1 # removes leading zeros from output
+#
+# developId => 'm' # logical module is under development
+# developId => 'p' # protocol is under development or to reserve IDs, the ID in the development attribute with developId => 'p' are only used without the other entries
+# developId => 'y' # protocol is under development, all IDs in the development attribute with developId => 'y' are used
+#
+# preamble => ' ' # prepend to converted message
+# preamble => 'u..' # message is unknown and without module, forwarding SIGNALduino_un or FHEM DOIF
+# preamble => 'U..' # message can be unknown and without module, no forwarding SIGNALduino_un but forwarding can FHEM DOIF
+# postamble => ' ' # appends a string to the demodulated signal
+#
+# clientmodule => ' ' # FHEM module for processing
+# filterfunc => ' ' # SIGNALduino_filterSign | SIGNALduino_compPattern --> SIGNALduino internal filter function, it remove the sign from the pattern, and compress message and pattern
+# # SIGNALduino_filterMC --> SIGNALduino internal filter function, it will decode MU data via Manchester encoding
+# dispatchBin => 1, # If set to 1, data will be dispatched in binary representation to other logcial modules.
+# If not set (default) or set to 0, data will be dispatched in hex mode to other logical modules.
+# postDemodulation => \& # only MU - SIGNALduino internal sub for processing before dispatching to a logical module
+# method => \& # call to process this message
+# format => ' ' # twostate | pwm | manchester --> modulation type of the signal, only manchester use SIGNALduino internal, other types only comment
+# modulematch => ' ' # RegEx on the exact message including preamble | if defined, it will be evaluated
+# polarity => 'invert' # only MC signals | invert bits of the signal
+#
+##### notice #### or #### info ############################################################################################################
+# !!! Between the keys and values no tabs not equal to a width of 8 or please use spaces !!!
+# !!! Please use first unused id for new protocols !!!
+# ID´s are currently unused: 20 | 38 | 68
+# ID´s need to be revised (preamble u): 5|6|19|20|21|22|23|24|25|26|27|28|31|36|40|42|52|56|59|63|78|87|88
+###########################################################################################################################################
+# Please provide at least three messages for each new MU/MC/MS protocol and a URL of issue in GitHub or discussion in FHEM Forum
+# https://forum.fhem.de/index.php/topic,58396.975.html | https://github.com/RFD-FHEM/RFFHEM
+###########################################################################################################################################
+
+(
+ "0" => ## various weather sensors (500 | 9100)
+ # CUL_TCM97001 Typ - Prologue
+ # MS;P0=-4152;P1=643;P2=-2068;P3=-9066;D=1310121210121212101210101212121212121212121212121010121012121212121012101212;CP=1;SP=3;R=220;O;m2;
+ # MS;P0=-4149;P2=-9098;P3=628;P4=-2076;D=3230343430343434303430303434343434343434343434343030343030343434343034303434;CP=3;SP=2;R=218;O;m2;
+ # CUL_TCM97001 Typ - AURIOL / Mebus / TCM...
+ # MS;P0=-9298;P1=495;P2=-1980;P3=-4239;D=1012121312131313121313121312121212121212131212131312131212;CP=1;SP=0;R=223;O;m2;
+ {
+ name => 'weather (v1)',
+ comment => 'temperature / humidity or other sensors',
+ id => '0',
+ knownFreqs => '433.92',
+ one => [1,-7],
+ zero => [1,-3],
+ sync => [1,-16],
+ clockabs => -1,
+ format => 'twostate', # not used now
+ preamble => 's', # prepend to converted message
+ postamble => '00', # Append to converted message
+ clientmodule => 'CUL_TCM97001',
+ #modulematch => '^s[A-Fa-f0-9]+',
+ length_min => '24',
+ length_max => '40',
+ paddingbits => '8', # pad up to 8 bits, default is 4
+ },
+ "0.1" => ## other Sensors (380 | 9650)
+ # CUL_TCM97001 Typ - AURIOL | Mebus
+ # MS;P1=416;P2=-9618;P3=-4610;P4=-2036;D=1213141313131313141313141314141414141414141313141314131414;CP=1;SP=2;R=220;O;m0;
+ # MS;P1=397;P2=-2033;P3=-4627;P4=-9630;D=1413121313131313121313121312121212121212121313121312131212;CP=1;SP=4;R=221;
+ # MS;P0=-9690;P3=354;P4=-4662;P5=-2107;D=3034343434343535343534343435353535353535353434353535343535;CP=3;SP=0;R=209;O;m2;
+ ## LIDL Wetterstation
+ # https://github.com/RFD-FHEM/RFFHEM/issues/63
+ # MS;P1=367;P2=-2077;P4=-9415;P5=-4014;D=141515151515151515121512121212121212121212121212121212121212121212;CP=1;SP=4;O;
+ {
+ name => 'weather (v2)',
+ comment => 'temperature / humidity or other sensors',
+ id => '0.1',
+ knownFreqs => '433.92',
+ one => [1,-12],
+ zero => [1,-6],
+ sync => [1,-26],
+ clockabs => -1,
+ format => 'twostate', # not used now
+ preamble => 's', # prepend to converted message
+ postamble => '00', # Append to converted message
+ clientmodule => 'CUL_TCM97001',
+ #modulematch => '^s[A-Fa-f0-9]+',
+ length_min => '24',
+ length_max => '32',
+ paddingbits => '8',
+ },
+ "0.2" => ## other Sensors | for sensors how tol is runaway (260+tol | 9650)
+ # MS;P1=-2140;P2=309;P3=-4690;P4=-9695;D=2421232323232121232123232321212121212121212123212121232121;CP=2;SP=4;R=211;m1;
+ # MS;P0=-9703;P1=304;P2=-2133;P3=-4689;D=1012131312131212131213131312121212121212121212131312131212;CP=1;SP=0;R=208;
+ # MS;P0=138;P1=-2140;P2=315;P3=-9704;P4=-4713;P5=234;D=2321212421242454210424212421512121215121512124212121542121;CP=2;SP=3;R=210;
+ {
+ name => 'weather (v3)',
+ comment => 'temperature / humidity or other sensors',
+ id => '0.2',
+ knownFreqs => '433.92',
+ one => [1,-18],
+ zero => [1,-9],
+ sync => [1,-37],
+ clockabs => -1,
+ format => 'twostate', # not used now
+ preamble => 's', # prepend to converted message
+ postamble => '00', # Append to converted message
+ clientmodule => 'CUL_TCM97001',
+ #modulematch => '^s[A-Fa-f0-9]+',
+ length_min => '24',
+ length_max => '32',
+ paddingbits => '8',
+ },
+ "0.3" => ## Pollin PFR-130
+ # CUL_TCM97001 Typ - AURIOL | W174
+ # MS;P0=-3890;P1=386;P2=-2191;P3=-8184;D=1312121212121012121212121012121212101012101010121012121210121210101210101012;CP=1;SP=3;R=20;O;
+ # MS;P0=-2189;P1=371;P2=-3901;P3=-8158;D=1310101010101210101010101210101010121210121212101210101012101012121012121210;CP=1;SP=3;R=20;O;
+ # Ventus W174
+ # MS;P3=-2009;P4=479;P5=-9066;P6=-4047;D=45434343464343434643464643464643434643464646434346464343434343434346464643;CP=4;SP=5;R=55;O;m2;
+ {
+ name => 'weather (v4)',
+ comment => 'temperature / humidity or other sensors | Pollin PFR-130, Ventus W174 ...',
+ id => '0.3',
+ knownFreqs => '433.92',
+ one => [1,-10],
+ zero => [1,-5],
+ sync => [1,-21],
+ clockabs => -1,
+ preamble => 's', # prepend to converted message
+ postamble => '00', # Append to converted message
+ clientmodule => 'CUL_TCM97001',
+ length_min => '36',
+ length_max => '42',
+ paddingbits => '8', # pad up to 8 bits, default is 4
+ },
+ "0.4" => ## Auriol Z31092 (450 | 9200)
+ # CUL_TCM97001 Typ - AURIOL
+ # MS;P0=443;P3=-9169;P4=-1993;P5=-3954;D=030405040505050505050404040404040404040505050504050405050504040405;CP=0;SP=3;R=14;O;m0;
+ # MS;P0=-9102;P1=446;P2=-3956;P3=-2008;D=10121312121212121312131213131313131313131212121313121213121213121314;CP=1;SP=0;R=212;O;m2;
+ {
+ name => 'weather (v5)',
+ comment => 'temperature / humidity or other sensors | Auriol Z31092',
+ id => '0.4',
+ knownFreqs => '433.92',
+ one => [1,-9],
+ zero => [1,-4],
+ sync => [1,-20],
+ clockabs => 450,
+ preamble => 's', # prepend to converted message
+ postamble => '00', # Append to converted message
+ clientmodule => 'CUL_TCM97001',
+ length_min => '32',
+ length_max => '36',
+ paddingbits => '8', # pad up to 8 bits, default is 4
+ },
+ "1" => ## Conrad RSL
+ # MS;P1=1138;P2=-723;P3=583;P4=-1285;P5=-7166;D=351234341234341212341212123412343412341234341234343434343434343434;CP=3;SP=5;R=247;O;m2;
+ # MS;P1=1154;P2=-697;P3=559;P4=-1303;P5=-7173;D=351234341234341212341212123412343412341234341234343434343434343434;CP=3;SP=5;R=247;O;
+ # MS;P0=561;P1=-1291;P2=-7158;P3=1174;P4=-688;D=023401013401013434013434340134010134013401013401010101010101010101;CP=0;SP=2;R=248;m1;
+ {
+ name => 'Conrad RSL v1',
+ comment => 'remotes and switches',
+ id => '1',
+ knownFreqs => '',
+ one => [2,-1],
+ zero => [1,-2],
+ sync => [1,-12],
+ clockabs => '560',
+ format => 'twostate', # not used now
+ preamble => 'P1#', # prepend to converted message
+ postamble => '', # Append to converted message
+ clientmodule => 'SD_RSL',
+ modulematch => '^P1#[A-Fa-f0-9]{8}',
+ length_min => '20', # 23 | userMSG 32 ?
+ length_max => '40', # 24 | userMSG 32 ?
+ },
+ "2" => ## Self build arduino sensor
+ {
+ name => 'Arduino',
+ comment => 'self build arduino sensor (developModule. SD_AS module only in github)',
+ developId => 'm',
+ id => '2',
+ knownFreqs => '',
+ one => [1,-2],
+ zero => [1,-1],
+ sync => [1,-20],
+ clockabs => '500',
+ format => 'twostate',
+ preamble => 'P2#', # prepend to converted message
+ clientmodule => 'SD_AS',
+ modulematch => '^P2#.{7,8}',
+ length_min => '32',
+ length_max => '34', # Don't know maximal lenth of a valid message
+ paddingbits => '8', # pad up to 8 bits, default is 4
+ },
+ "3" => ## itv1 - remote like WOFI Lamp | Intertek Modell 1946518 // ELRO
+ # need more Device Infos / User Message
+ {
+ name => 'itv1',
+ comment => 'remote for WOFI | Intertek',
+ id => '3',
+ knownFreqs => '',
+ one => [3,-1],
+ zero => [1,-3],
+ #float => [-1,3], # not full supported now later use
+ sync => [1,-31],
+ clockabs => -1, # -1=auto
+ format => 'twostate', # not used now
+ preamble => 'i',
+ clientmodule => 'IT',
+ modulematch => '^i......',
+ length_min => '24',
+ length_max => '24', # Don't know maximal lenth of a valid message
+ },
+ "3.1" => ## itv1_sync40 | Intertek Modell 1946518 // ELRO
+ # MS;P0=-11440;P1=-1121;P2=-416;P5=309;P6=1017;D=150516251515162516251625162516251515151516251625151;CP=5;SP=0;R=66;
+ # MS;P1=309;P2=-1130;P3=1011;P4=-429;P5=-11466;D=15123412121234123412141214121412141212123412341234;CP=1;SP=5;R=38; Gruppentaste, siehe Kommentar in sub SIGNALduino_bit2itv1
+ # need more Device Infos / User Message
+ {
+ name => 'itv1_sync40',
+ comment => 'IT remote control PAR 1000, ITS-150, AB440R',
+ id => '3',
+ knownFreqs => '',
+ one => [3.5,-1],
+ zero => [1,-3.8],
+ float => [1,-1], # fuer Gruppentaste (nur bei ITS-150,ITR-3500 und ITR-300), siehe Kommentar in sub SIGNALduino_bit2itv1
+ sync => [1,-44],
+ clockabs => -1, # -1=auto
+ format => 'twostate', # not used now
+ preamble => 'i',
+ clientmodule => 'IT',
+ modulematch => '^i......',
+ length_min => '24',
+ length_max => '24', # Don't know maximal lenth of a valid message
+ postDemodulation => \&SIGNALduino_bit2itv1,
+ },
+ "4" => ## arctech2
+ # need more Device Infos / User Message
+ {
+ name => 'arctech2',
+ id => '4',
+ knownFreqs => '',
+ #one => [1,-5,1,-1],
+ #zero => [1,-1,1,-5],
+ one => [1,-5],
+ zero => [1,-1],
+ #float => [-1,3], # not full supported now, for later use
+ sync => [1,-14],
+ clockabs => -1, # -1 = auto
+ format => 'twostate', # tristate can't be migrated from bin into hex!
+ preamble => 'i', # Append to converted message
+ postamble => '00', # Append to converted message
+ clientmodule => 'IT',
+ modulematch => '^i......',
+ length_min => '39',
+ length_max => '44', # Don't know maximal lenth of a valid message
+ },
+ "5" => # Unitec, Modellnummer 6899/45108
+ # https://github.com/RFD-FHEM/RFFHEM/pull/389#discussion_r237232347 | https://github.com/RFD-FHEM/RFFHEM/pull/389#discussion_r237245943
+ # MU;P0=-31960;P1=660;P2=401;P3=-1749;P5=276;D=232353232323232323232323232353535353232323535353535353535353535010;CP=5;R=38;
+ # MU;P0=-1757;P1=124;P2=218;P3=282;P5=-31972;P6=644;P7=-9624;D=010201020303030202030303020303030202020202020203030303035670;CP=2;R=32;
+ # MU;P0=-1850;P1=172;P3=-136;P5=468;P6=236;D=010101010101310506010101010101010101010101010101010101010;CP=1;R=30;
+ # A AN:
+ # MU;P0=132;P1=-4680;P2=508;P3=-1775;P4=287;P6=192;D=123434343434343634343436363434343636343434363634343036363434343;CP=4;R=2;
+ # A AUS:
+ # MU;P0=-1692;P1=132;P2=194;P4=355;P5=474;P7=-31892;D=010202040505050505050404040404040404040470;CP=4;R=27;
+ {
+ name => 'Unitec',
+ comment => 'remote control model 6899/45108',
+ id => '5',
+ knownFreqs => '',
+ one => [3,-1], # ?
+ zero => [1,-3], # ?
+ clockabs => 500, # ?
+ developId => 'y',
+ format => 'twostate',
+ preamble => 'u5#',
+ #clientmodule => '',
+ #modulematch => '',
+ length_min => '24', # ?
+ length_max => '24', # ?
+ },
+ "6" => ## Eurochron Protocol
+ # MS;P1=-7982;P2=262;P3=-1949;P4=-948;D=21232423232424242324242424242424242424232424232323242424242424232424242324;CP=2;SP=1;R=249;O;m2;
+ # MS;P0=254;P1=-7990;P2=-1935;P3=-950;D=01020302020303030203030303030303030303020302030203030303030303020303030203;CP=0;SP=1;R=248;O;m2;
+ {
+ name => 'weather',
+ comment => 'unknown sensor is under development',
+ id => '6',
+ knownFreqs => '',
+ one => [1,-10],
+ zero => [1,-5],
+ sync => [1,-36], # This special device has no sync
+ clockabs => 220, # -1 = auto
+ format => 'twostate', # tristate can't be migrated from bin into hex!
+ preamble => 'u6#', # Append to converted message
+ #clientmodule => '',
+ #modulematch => '^u......',
+ length_min => '24',
+ #length_max => '36', # missing
+ },
+ "7" => ## weather sensors like EAS800z
+ # MS;P1=-3882;P2=504;P3=-957;P4=-1949;D=21232424232323242423232323232323232424232323242423242424242323232324232424;CP=2;SP=1;R=249;m=2;
+ {
+ name => 'weather',
+ comment => 'EAS800z, FreeTec NC-7344, HAMA TS34A',
+ id => '7',
+ knownFreqs => '433.92',
+ one => [1,-4],
+ zero => [1,-2],
+ sync => [1,-8],
+ clockabs => 484,
+ format => 'twostate',
+ preamble => 'P7#', # prepend to converted message
+ clientmodule => 'SD_WS07',
+ modulematch => '^P7#.{6}F.{2}',
+ length_min => '35',
+ length_max => '40',
+ },
+ "8" => ## TX3 (ITTX) Protocol
+ # MU;P0=-1046;P1=1339;P2=524;P3=-28696;D=010201010101010202010101010202010202020102010101020101010202020102010101010202310101010201020101010101020201010101020201020202010201010102010101020202010201010101020;CP=2;R=4;
+ {
+ name => 'TX3 Protocol',
+ id => '8',
+ knownFreqs => '',
+ one => [1,-2],
+ zero => [2,-2],
+ #sync => [1,-8], #
+ clockabs => 470,
+ format => 'pwm', #
+ preamble => 'TX', # prepend to converted message
+ clientmodule => 'CUL_TX',
+ modulematch => '^TX......',
+ length_min => '43',
+ length_max => '44',
+ remove_zero => 1, # Removes leading zeros from output
+ },
+ "9" => ## Funk Wetterstation CTW600
+ {
+ name => 'CTW 600',
+ comment => 'FunkWS WH1080/WH3080/CTW600',
+ id => '9',
+ knownFreqs => '',
+ zero => [3,-2],
+ one => [1,-2],
+ #float => [-1,3], # not full supported now, for later use
+ #sync => [1,-8], #
+ clockabs => 480, # -1 = auto undef=noclock
+ format => 'pwm', # tristate can't be migrated from bin into hex!
+ preamble => 'P9#', # prepend to converted message
+ clientmodule => 'SD_WS09',
+ #modulematch => '^u9#.....',
+ length_min => '60',
+ length_max => '120',
+ },
+ "10" => ## Oregon Scientific 2
+ {
+ name => 'Oregon Scientific v2|v3',
+ comment => 'temperature / humidity or other sensors',
+ id => '10',
+ knownFreqs => '',
+ clockrange => [300,520], # min , max
+ format => 'manchester', # tristate can't be migrated from bin into hex!
+ clientmodule => 'OREGON',
+ modulematch => '^(3[8-9A-F]|[4-6][0-9A-F]|7[0-8]).*',
+ length_min => '64',
+ length_max => '220',
+ method => \&SIGNALduino_OSV2, # Call to process this message
+ polarity => 'invert',
+ },
+ "11" => ## Arduino Sensor
+ {
+ name => 'Arduino',
+ comment => 'for Arduino based sensors',
+ id => '11',
+ knownFreqs => '',
+ clockrange => [380,425], # min , max
+ format => 'manchester', # tristate can't be migrated from bin into hex!
+ preamble => 'P2#', # prepend to converted message
+ clientmodule => 'SD_AS',
+ modulematch => '^P2#.{7,8}',
+ length_min => '52',
+ length_max => '56',
+ method => \&SIGNALduino_AS # Call to process this message
+ },
+ "12" => ## Hideki
+ # MC;LL=-1040;LH=904;SL=-542;SH=426;D=A8C233B53A3E0A0783;C=485;L=72;R=213;
+ {
+ name => 'Hideki',
+ comment => 'temperature / humidity or other sensors',
+ id => '12',
+ knownFreqs => '433.92',
+ clockrange => [420,510], # min, max better for Bresser Sensors, OK for hideki/Hideki/TFA too
+ format => 'manchester',
+ preamble => 'P12#', # prepend to converted message
+ clientmodule => 'hideki',
+ modulematch => '^P12#75.+',
+ length_min => '71',
+ length_max => '128',
+ method => \&SIGNALduino_Hideki, # Call to process this message
+ #polarity => 'invert',
+ },
+ "13" => ## FLAMINGO FA21
+ # https://github.com/RFD-FHEM/RFFHEM/issues/21
+ # https://github.com/RFD-FHEM/RFFHEM/issues/233
+ # MS;P0=-1413;P1=757;P2=-2779;P3=-16079;P4=8093;P5=-954;D=1345121210101212101210101012121012121210121210101010;CP=1;SP=3;R=33;O;
+ {
+ name => 'FLAMINGO FA21',
+ comment => 'FLAMINGO FA21 smoke detector (message decode as MS)',
+ id => '13',
+ knownFreqs => '433.92',
+ one => [1,-2],
+ zero => [1,-4],
+ sync => [1,-20,10,-1],
+ clockabs => 800,
+ format => 'twostate',
+ preamble => 'P13#', # prepend to converted message
+ clientmodule => 'FLAMINGO',
+ #modulematch => 'P13#.*',
+ length_min => '24',
+ length_max => '26',
+ },
+ "13.1" => ## FLAMINGO FA20RF
+ # MU;P0=-1384;P1=815;P2=-2725;P3=-20001;P4=8159;P5=-891;D=01010121212121010101210101345101210101210101212101010101012121212101010121010134510121010121010121210101010101212121210101012101013451012101012101012121010101010121212121010101210101345101210101210101212101010101012121212101010121010134510121010121010121;CP=1;O;
+ # MU;P0=-17201;P1=112;P2=-1419;P3=-28056;P4=8092;P5=-942;P6=777;P7=-2755;D=12134567676762626762626762626767676762626762626267626260456767676262676262676262676767676262676262626762626045676767626267626267626267676767626267626262676262604567676762626762626762626767676762626762626267626260456767676262676262676262676767676262676262;CP=6;O;
+ ## FLAMINGO FA22RF (only MU Message)
+ # MU;P0=-5684;P1=8149;P2=-887;P3=798;P4=-1393;P5=-2746;P6=-19956;D=0123434353534353434343434343435343534343534353534353612343435353435343434343434343534353434353435353435361234343535343534343434343434353435343435343535343536123434353534353434343434343435343534343534353534353612343435353435343434343434343534353434353435;CP=3;R=0;
+ # Times measured
+ # Sync 8100 microSec, 900 microSec | Bit1 2700 microSec low - 800 microSec high | Bit0 1400 microSec low - 800 microSec high | Pause Repeat 20000 microSec | 1 Sync + 24Bit, Totaltime 65550 microSec without Sync
+ {
+ name => 'FLAMINGO FA22RF / FA21RF / LM-101LD',
+ comment => 'FLAMINGO | Unitec smoke detector (message decode as MU)',
+ id => '13.1',
+ knownFreqs => '433.92',
+ one => [1,-1.8],
+ zero => [1,-3.5],
+ start => [10,-1],
+ pause => [-25],
+ clockabs => 800,
+ format => 'twostate',
+ preamble => 'P13.1#', # prepend to converted message
+ clientmodule => 'FLAMINGO',
+ #modulematch => '^P13\.?1?#[A-Fa-f0-9]+',
+ length_min => '24',
+ length_max => '24',
+ },
+ "13.2" => ## LM-101LD Rauchm
+ # MS;P1=-2708;P2=796;P3=-1387;P4=-8477;P5=8136;P6=-904;D=2456212321212323232321212121212121212123212321212121;CP=2;SP=4;
+ {
+ name => 'LM-101LD',
+ comment => 'Unitec smoke detector (message decode as MS)',
+ id => '13',
+ knownFreqs => '433.92',
+ zero => [1,-1.8],
+ one => [1,-3.5],
+ sync => [1,-11,10,-1.2],
+ clockabs => 790,
+ format => 'twostate',
+ preamble => 'P13#', # prepend to converted message
+ clientmodule => 'FLAMINGO',
+ #modulematch => '',
+ length_min => '24',
+ length_max => '24',
+ },
+ "14" => ## LED X-MAS Chilitec model 22640
+ # https://github.com/RFD-FHEM/RFFHEM/issues/421 | https://forum.fhem.de/index.php/topic,94211.msg869214.html#msg869214
+ # MS;P0=988;P1=-384;P2=346;P3=-1026;P4=-4923;D=240123012301230123012323232323232301232323;CP=2;SP=4;R=0;O;m=1;
+ # MS;P0=-398;P1=974;P3=338;P4=-1034;P6=-4939;D=361034103410341034103434343434343410103434;CP=3;SP=6;R=0;
+ {
+ name => 'LED X-MAS',
+ comment => 'Chilitec model 22640',
+ id => '14',
+ knownFreqs => '433.92',
+ one => [3,-1],
+ zero => [1,-3],
+ sync => [1,-14],
+ clockabs => 350,
+ format => 'twostate',
+ preamble => 'P14#', # prepend to converted message
+ clientmodule => 'SD_UT',
+ #modulematch => '^P14#.*',
+ length_min => '20',
+ length_max => '20',
+ },
+ "15" => ## TCM 234759
+ {
+ name => 'TCM 234759 Bell',
+ comment => 'wireless doorbell TCM 234759 Tchibo',
+ id => '15',
+ knownFreqs => '',
+ one => [1,-1],
+ zero => [1,-2],
+ sync => [1,-45],
+ clockabs => 700,
+ format => 'twostate',
+ preamble => 'P15#', # prepend to converted message
+ clientmodule => 'SD_BELL',
+ modulematch => '^P15#.*',
+ length_min => '10',
+ length_max => '20',
+ },
+ "16" => ## Rohrmotor24 und andere Funk Rolladen / Markisen Motoren
+ # ! same definition how ID 72 !
+ # https://forum.fhem.de/index.php/topic,49523.0.html
+ # MU;P0=-1608;P1=-785;P2=288;P3=650;P4=-419;P5=4676;D=1212121213434212134213434212121343434212121213421213434212134345021213434213434342121212121343421213421343421212134343421212121342121343421213432;CP=2;
+ # MU;P0=-1562;P1=-411;P2=297;P3=-773;P4=668;P5=4754;D=1232341234141234141234141414123414123232341232341412323414150234123234123232323232323234123414123414123414141412341412323234123234141232341415023412323412323232323232323412341412341412341414141234141232323412323414123234142;CP=2;
+ {
+ name => 'Dooya',
+ comment => 'Rohrmotor24 and other radio shutters / awnings motors',
+ id => '16',
+ knownFreqs => '',
+ one => [2,-1],
+ zero => [1,-3],
+ start => [17,-5],
+ clockabs => 280,
+ format => 'twostate',
+ preamble => 'P16#', # prepend to converted message
+ clientmodule => 'Dooya',
+ #modulematch => '',
+ length_min => '39',
+ length_max => '40',
+ },
+ "17" => ## arctech / intertechno
+ # need more Device Infos / User Message
+ {
+ name => 'arctech / Intertechno',
+ id => '17',
+ knownFreqs => '',
+ one => [1,-5,1,-1],
+ zero => [1,-1,1,-5],
+ #one => [1,-5],
+ #zero => [1,-1],
+ sync => [1,-10],
+ float => [1,-1,1,-1],
+ end => [1,-40],
+ clockabs => -1, # -1 = auto
+ format => 'twostate', # tristate can't be migrated from bin into hex!
+ preamble => 'i', # Append to converted message
+ postamble => '00', # Append to converted message
+ clientmodule => 'IT',
+ modulematch => '^i......',
+ length_min => '32',
+ length_max => '34', # Don't know maximal lenth of a valid message
+ postDemodulation => \&SIGNALduino_bit2Arctec,
+ },
+ "17.1" => ## intertechno --> MU anstatt sonst MS (ID 17)
+ # MU;P0=344;P1=-1230;P2=-200;D=01020201020101020102020102010102010201020102010201020201020102010201020101020102020102010201020102010201010200;CP=0;R=0;
+ # MU;P0=346;P1=-1227;P2=-190;P4=-10224;P5=-2580;D=0102010102020101020201020101020102020102010102010201020102010201020201020102010201020101020102020102010102020102010201020104050201020102010102020101020201020101020102020102010102010201020102010201020201020102010201020101020102020102010102020102010201020;CP=0;R=0;
+ # MU;P0=351;P1=-1220;P2=-185;D=01 0201 0102 020101020201020101020102020102010102010201020102010201020201020102010201020101020102020102010201020102010201020100;CP=0;R=0;
+ # MU;P0=355;P1=-189;P2=-1222;P3=-10252;P4=-2604;D=01020201010201020201020101020102020102010201020102010201010201020102010201020201020101020102010201020102010201020 304 0102 01020102020101020201010201020201020101020102020102010201020102010201010201020102010201020201020101020102010201020102010201020 304 01020;CP=0;R=0;
+ # https://www.sweetpi.de/blog/329/ein-ueberblick-ueber-433mhz-funksteckdosen-und-deren-protokolle
+ {
+ name => 'Intertechno',
+ comment => 'PIR-1000 | ITT-1500',
+ id => '17.1',
+ knownFreqs => '433.92',
+ one => [1,-5,1,-1],
+ zero => [1,-1,1,-5],
+ clockabs => 230, # -1 = auto
+ format => 'twostate', # tristate can't be migrated from bin into hex!
+ preamble => 'i', # Append to converted message
+ postamble => '00', # Append to converted message
+ clientmodule => 'IT',
+ modulematch => '^i......',
+ length_min => '32',
+ length_max => '34', # Don't know maximal lenth of a valid message
+ postDemodulation => \&SIGNALduino_bit2Arctec,
+ },
+ "18" => ## Oregon Scientific v1
+ # MC;LL=-2721;LH=3139;SL=-1246;SH=1677;D=1A51FF47;C=1463;L=32;R=12;
+ {
+ name => 'Oregon Scientific v1',
+ comment => 'temperature / humidity or other sensors',
+ id => '18',
+ knownFreqs => '',
+ clockrange => [1400,1500], # min , max
+ format => 'manchester', # tristate can't be migrated from bin into hex!
+ preamble => '',
+ clientmodule => 'OREGON',
+ modulematch => '^[0-9A-F].*',
+ length_min => '32',
+ length_max => '32',
+ polarity => 'invert', # invert bits
+ method => \&SIGNALduino_OSV1 # Call to process this message
+ },
+ "19" => ## minify Funksteckdose
+ # https://github.com/RFD-FHEM/RFFHEM/issues/114
+ # MU;P0=293;P1=-887;P2=-312;P6=-1900;P7=872;D=6727272010101720172720101720172010172727272720;CP=0;
+ # MU;P0=9078;P1=-308;P2=180;P3=-835;P4=881;P5=309;P6=-1316;D=0123414141535353415341415353415341535341414141415603;CP=5;
+ {
+ name => 'minify',
+ comment => 'remote control RC202',
+ id => '19',
+ knownFreqs => '',
+ one => [3,-1],
+ zero => [1,-3],
+ clockabs => 300,
+ format => 'twostate',
+ preamble => 'u19#', # prepend to converted message
+ #clientmodule => '',
+ #modulematch => '',
+ length_min => '19',
+ length_max => '23', # not confirmed, length one more as MU Message
+ },
+ # "20" => ## Livolo
+ # # https://github.com/RFD-FHEM/RFFHEM/issues/29
+ # # MU;P0=-195;P1=151;P2=475;P3=-333;D=0101010101 02 01010101010101310101310101010101310101 02 01010101010101010101010101010101010101 02 01010101010101010101010101010101010101 02 010101010101013101013101;CP=1;
+ # #
+ # # protocol sends 24 to 47 pulses per message.
+ # # First pulse is the header and is 595 μs long. All subsequent pulses are either 170 μs (short pulse) or 340 μs (long pulse) long.
+ # # Two subsequent short pulses correspond to bit 0, one long pulse corresponds to bit 1. There is no footer. The message is repeated for about 1 second.
+ # # _____________ ___ _______
+ # # Start bit: | |___| bit 0: | |___| bit 1: | |___|
+ # {
+ # name => 'Livolo',
+ # comment => 'remote control / dimmmer / switch ...',
+ # id => '20',
+ # knownFreqs => '',
+ # one => [3],
+ # zero => [1],
+ # start => [5],
+ # clockabs => 110, #can be 90-140
+ # format => 'twostate',
+ # preamble => 'u20#', # prepend to converted message
+ # #clientmodule => '',
+ # #modulematch => '',
+ # length_min => '16',
+ # #length_max => '', # missing
+ # filterfunc => 'SIGNALduino_filterSign',
+ # },
+ "21" => ## Einhell Garagentor
+ # https://forum.fhem.de/index.php?topic=42373.0 | user have no RAWMSG
+ # static adress: Bit 1-28 | channel remote Bit 29-32 | repeats 31 | pause 20 ms
+ # Channelvalues dez
+ # 1 left 1x kurz | 2 left 2x kurz | 3 left 3x kurz | 5 right 1x kurz | 6 right 2x kurz | 7 right 3x kurz ... gedrückt
+ {
+ name => 'Einhell Garagedoor',
+ comment => 'remote control ISC HS 434/6',
+ id => '21',
+ knownFreqs => '',
+ one => [-3,1],
+ zero => [-1,3],
+ #sync => [-50,1],
+ start => [-50,1],
+ clockabs => 400, #ca 400us
+ format => 'twostate',
+ preamble => 'u21#', # prepend to converted message
+ #clientmodule => '',
+ #modulematch => '',
+ length_min => '32',
+ length_max => '32',
+ paddingbits => '1', # This will disable padding
+ },
+ "22" => ## HAMULiGHT LED Trafo
+ # https://forum.fhem.de/index.php?topic=89301.0
+ # MU;P0=-589;P1=209;P2=-336;P3=32001;P4=-204;P5=1194;P6=-1200;P7=602;D=0123414145610747474101010101074741010747410741074101010101074741010741074741414141456107474741010101010747410107474107410741010101010747410107410747414141414561074747410101010107474101074741074107410101010107474101074107474141414145610747474101010101074;CP=1;R=25;
+ # MU;P0=204;P1=-596;P2=598;P3=-206;P4=1199;P5=-1197;D=0123230123012301010101012323010123012323030303034501232323010101010123230101232301230123010101010123230101230123230303030345012323230101010101232301012323012301230101010101232301012301232303030303450123232301010101012323010123230123012301010101012323010;CP=0;R=25;
+ {
+ name => 'HAMULiGHT',
+ comment => 'remote control for LED Transformator',
+ id => '22',
+ knownFreqs => '433.92',
+ one => [1,-3],
+ zero => [3,-1],
+ start => [6,-6],
+ clockabs => 200, # ca 200us
+ format => 'twostate',
+ preamble => 'u22#', # prepend to converted message
+ #clientmodule => '',
+ #modulematch => '',
+ length_min => '32',
+ length_max => '32',
+ },
+ "23" => ## Pearl Sensor
+ {
+ name => 'Pearl',
+ comment => 'unknown sensortyp',
+ id => '23',
+ knownFreqs => '',
+ one => [1,-6],
+ zero => [1,-1],
+ sync => [1,-50],
+ clockabs => 200, #ca 200us
+ format => 'twostate',
+ preamble => 'u23#', # prepend to converted message
+ #clientmodule => '',
+ #modulematch => '',
+ length_min => '36',
+ length_max => '44',
+ },
+ "24" => ## visivon
+ # https://github.com/RFD-FHEM/RFFHEM/issues/39
+ # MU;P0=132;P1=500;P2=-233;P3=-598;P4=-980;P5=4526;D=012120303030303120303030453120303121212121203121212121203121212121212030303030312030312031203030303030312031203031212120303030303120303030453120303121212121203121212121203121212121212030303030312030312031203030303030312031203031212120303030;CP=0;O;
+ {
+ name => 'visivon remote',
+ id => '24',
+ knownFreqs => '',
+ one => [3,-2],
+ zero => [1,-5],
+ #one => [3,-2],
+ #zero => [1,-1],
+ start => [30,-5],
+ clockabs => 150, #ca 150us
+ format => 'twostate',
+ preamble => 'u24#', # prepend to converted message
+ #clientmodule => '',
+ #modulematch => '',
+ length_min => '54',
+ length_max => '58',
+ },
+ "25" => ## LES remote for led lamp
+ # https://github.com/RFD-FHEM/RFFHEM/issues/40
+ # MS;P0=-376;P1=697;P2=-726;P3=322;P4=-13188;P5=-15982;D=3530123010101230123230123010101010101232301230123234301230101012301232301230101010101012323012301232;CP=3;SP=5;O;
+ {
+ name => 'les led remote',
+ id => '25',
+ knownFreqs => '',
+ one => [-2,1],
+ zero => [-1,2],
+ sync => [-46,1], # this is a end marker, but we use this as a start marker
+ clockabs => 350, #ca 350us
+ format => 'twostate',
+ preamble => 'u25#', # prepend to converted message
+ #clientmodule => '',
+ #modulematch => '',
+ length_min => '24',
+ length_max => '50', # message has only 24 bit, but we get more than one message, calculation has to be corrected
+ },
+ "26" => ## some remote code send by flamingo style remote controls
+ # https://forum.fhem.de/index.php/topic,43292.msg352982.html#msg352982
+ # MU;P0=1086;P1=-433;P2=327;P3=-1194;P4=-2318;P5=2988;D=01012323010123010101230123012323232323010101232324010123230101230101012301230123232323230101012323240101232301012301010123012301232323232301010123232401012323010123010101230123012323232323010101232353;CP=2;
+ {
+ name => 'remote',
+ id => '26',
+ knownFreqs => '',
+ one => [1,-3],
+ zero => [3,-1],
+ # sync => [1,-6], # Message is not provided as MS, due to small fact
+ start => [1,-6], # Message is not provided as MS, due to small fact
+ clockabs => 380, #ca 380
+ format => 'twostate',
+ preamble => 'u26#', # prepend to converted message
+ #clientmodule => '',
+ #modulematch => '',
+ length_min => '24',
+ length_max => '24', # message has only 24 bit, but we get more than one message, calculation has to be corrected
+ },
+ "27" => ## some remote code, send by flamingo style remote controls
+ # https://forum.fhem.de/index.php/topic,43292.msg352982.html#msg352982
+ # MU;P0=963;P1=-559;P2=393;P3=-1134;P4=2990;P5=-7172;D=01012323010123010101230123012323232323010101232345010123230101230101012301230123232323230101012323450101232301012301010123012301232323232301010123234501012323010123010101230123012323232323010101232323;CP=2;
+ {
+ name => 'remote',
+ id => '27',
+ knownFreqs => '',
+ one => [1,-2],
+ zero => [2,-1],
+ start => [6,-15], # Message is not provided as MS, worakround is start
+ clockabs => 480, #ca 480
+ format => 'twostate',
+ preamble => 'u27#', # prepend to converted message
+ #clientmodule => '',
+ #modulematch => '',
+ length_min => '24',
+ length_max => '24',
+ },
+ "28" => ## some remote code, send by aldi IC Ledspots
+ {
+ name => 'IC Ledspot',
+ id => '28',
+ knownFreqs => '',
+ one => [1,-1],
+ zero => [1,-2],
+ start => [4,-5],
+ clockabs => 600, #ca 600
+ format => 'twostate',
+ preamble => 'u28#', # prepend to converted message
+ #clientmodule => '',
+ #modulematch => '',
+ length_min => '8',
+ length_max => '8',
+ },
+ "29" => ## example remote control with HT12E chip
+ # MU;P0=250;P1=-492;P2=166;P3=-255;P4=491;P5=-8588;D=052121212121234121212121234521212121212341212121212345212121212123412121212123452121212121234121212121234;CP=0;
+ # https://forum.fhem.de/index.php/topic,58397.960.html
+ {
+ name => 'HT12e',
+ comment => 'remote control for example Westinghouse airfan with 5 buttons',
+ id => '29',
+ knownFreqs => '',
+ one => [-2,1],
+ zero => [-1,2],
+ start => [-35,1], # Message is not provided as MS, worakround is start
+ clockabs => 235, # ca 220
+ format => 'twostate', # there is a pause puls between words
+ preamble => 'P29#', # prepend to converted message
+ clientmodule => 'SD_UT',
+ modulematch => '^P29#.{3}',
+ length_min => '12',
+ length_max => '12',
+ },
+ "30" => ## a unitec remote door reed switch
+ # https://forum.fhem.de/index.php?topic=43346.0
+ # MU;P0=-10026;P1=-924;P2=309;P3=-688;P4=-361;P5=637;D=123245453245324532453245320232454532453245324532453202324545324532453245324532023245453245324532453245320232454532453245324532453202324545324532453245324532023245453245324532453245320232454532453245324532453202324545324532453245324532023240;CP=2;O;
+ # MU;P0=307;P1=-10027;P2=-691;P3=-365;P4=635;D=0102034342034203420342034201020343420342034203420342010203434203420342034203420102034342034203420342034201020343420342034203420342010203434203420342034203420102034342034203420342034201;CP=0;
+ {
+ name => 'diverse',
+ comment => 'remote control unitec | door reed switch 47031',
+ id => '30',
+ knownFreqs => '',
+ one => [-2,1],
+ zero => [-1,2],
+ start => [-30,1], # Message is not provided as MS, worakround is start
+ clockabs => 330, # ca 300 us
+ format => 'twostate', # there is a pause puls between words
+ preamble => 'P30#', # prepend to converted message
+ clientmodule => 'SD_UT',
+ modulematch => '^P30#.{3}',
+ length_min => '12',
+ length_max => '12', # message has only 10 bit but is paddet to 12
+ },
+ "31" => ## Pollin ISOTRONIC - 12 Tasten remote
+ # remote basicadresse with 12bit -> changed if push reset behind battery cover
+ # https://github.com/RFD-FHEM/RFFHEM/issues/44
+ # MU;P0=-9584;P1=592;P2=-665;P3=1223;P4=-1311;D=01234141412341412341414123232323412323234;CP=1;R=0;
+ # MU;P0=-12724;P1=597;P2=-667;P3=1253;P4=-1331;D=01234141412341412341414123232323232323232;CP=1;R=0;
+ # MU;P0=-9588;P1=600;P2=-664;P3=1254;P4=-1325;D=01234141412341412341414123232323232323232;CP=1;R=0;
+ {
+ name => 'Pollin ISOTRONIC',
+ comment => 'remote control model 58608 with 12 buttons',
+ id => '31',
+ knownFreqs => '',
+ one => [-1,2],
+ zero => [-2,1],
+ start => [-18,1],
+ clockabs => 600,
+ format => 'twostate',
+ preamble => 'u31#', # prepend to converted message
+ #clientmodule => '',
+ #modulematch => '',
+ length_min => '19',
+ length_max => '20',
+ },
+ "32" => ## FreeTec PE-6946 -> http://www.free-tec.de/Funkklingel-mit-Voic-PE-6946-919.shtml
+ # OLD
+ # https://github.com/RFD-FHEM/RFFHEM/issues/49
+ # MS;P0=-266;P1=160;P3=-690;P4=580;P5=-6628;D=15131313401340134013401313404040404040404040404040;CP=1;SP=5;O;
+ # NEW
+ # https://github.com/RFD-FHEM/RFFHEM/issues/315
+ # MU;P0=-6676;P1=578;P2=-278;P4=-680;P5=176;P6=-184;D=541654165412545412121212121212121212121250545454125412541254125454121212121212121212121212;CP=1;R=0;
+ # MU;P0=146;P1=245;P3=571;P4=-708;P5=-284;P7=-6689;D=14351435143514143535353535353535353535350704040435043504350435040435353535353535353535353507040404350435043504350404353535353535353535353535070404043504350435043504043535353535353535353535350704040435043504350435040435353535353535353535353507040404350435;CP=3;R=0;O;
+ # MU;P0=-6680;P1=162;P2=-298;P4=253;P5=-699;P6=555;D=45624562456245456262626262626262626262621015151562156215621562151562626262626262626262626210151515621562156215621515626262626262626262626262;CP=6;R=0;
+ {
+ name => 'FreeTec PE-6946',
+ comment => 'wireless doorbell',
+ id => '32',
+ knownFreqs => '',
+ one => [4,-2],
+ zero => [1,-5],
+ start => [1,-45], # neuerdings MU Erknnung
+ #sync => [1,-49], # old MS Erkennung
+ clockabs => 150,
+ format => 'twostate',
+ preamble => 'P32#', # prepend to converted message
+ clientmodule => 'SD_BELL',
+ modulematch => '^P32#.*',
+ length_min => '24',
+ length_max => '24',
+ },
+ "33" => ## Thermo-/Hygrosensor S014, renkforce E0001PA, Conrad S522, TX-EZ6 (Weatherstation TZS First Austria)
+ # https://forum.fhem.de/index.php?topic=35844.0
+ # MS;P0=-7871;P2=-1960;P3=578;P4=-3954;D=030323232323434343434323232323234343434323234343234343234343232323432323232323232343234;CP=3;SP=0;R=0;m=0;
+ # sensor id=62, channel=1, temp=21.1, hum=76, bat=ok
+ # !! ToDo Tx-EZ6 neues Attribut ins Modul bauen um Trend + CRC auszuwerten !!
+ {
+ name => 'weather',
+ comment => 'S014, TFA 30.3200, TCM, Conrad S522, renkforce E0001PA, TX-EZ6',
+ id => '33',
+ knownFreqs => '433.92',
+ one => [1,-8],
+ zero => [1,-4],
+ sync => [1,-16],
+ clockabs => '500',
+ format => 'twostate', # not used now
+ preamble => 'W33#', # prepend to converted message
+ postamble => '', # Append to converted message
+ clientmodule => 'SD_WS',
+ #modulematch => '',
+ length_min => '42',
+ length_max => '44',
+ },
+ "34" => ## QUIGG GT-7000 Funk-Steckdosendimmer | transmitter DMV-7000 - receiver DMV-7009AS
+ # https://github.com/RFD-FHEM/RFFHEM/issues/195 | https://forum.fhem.de/index.php/topic,38831.msg361341.html#msg361341
+ # MU;P0=-5284;P1=583;P2=-681;P3=1216;P4=-1319;D=012341412323232341412341412323234123232341;CP=1;R=16; | MU;P0=-9812;P1=589;P2=-671;P3=1261;P4=-1320;D=012341412323232341412341412323232323232323;CP=3;R=19;
+ # MU;P0=-9832;P1=577;P2=-670;P3=1219;P4=-1331;D=012341412323232341412341414123234123234141;CP=1;R=16; | MU;P0=-8816;P1=594;P2=-662;P3=1263;P4=-1330;D=012341412323232341412341414123232323234123;CP=1;R=16;
+ # MU;P0=-677;P1=581;P2=1250;P3=-1319;D=010231310202020231310231310231023102020202;CP=1;R=18; | MU;P0=-29120;P1=603;P2=-666;P3=1235;P4=-1307;D=012341412323232341412341412341232323232341;CP=1;R=16;
+ {
+ name => 'QUIGG_GT-7000',
+ comment => 'remote control DMV-7000',
+ id => '34',
+ knownFreqs => '',
+ one => [-1,2],
+ zero => [-2,1],
+ start => [1],
+ pause => [-15], # 9900
+ clockabs => '660',
+ format => 'twostate',
+ preamble => 'P34#',
+ clientmodule => 'SD_UT',
+ #modulematch => '',
+ length_min => '20',
+ length_max => '20',
+ },
+ "35" => ## Homeeasy
+ # MS;P0=907;P1=-376;P2=266;P3=-1001;P6=-4860;D=2601010123230123012323230101012301230101010101230123012301;CP=2;SP=6;
+ {
+ name => 'HomeEasy HE800',
+ id => '35',
+ knownFreqs => '',
+ one => [1,-4],
+ zero => [3.4,-1],
+ sync => [1,-18],
+ clockabs => '280',
+ format => 'twostate', # not used now
+ preamble => 'ih', # prepend to converted message
+ postamble => '', # Append to converted message
+ clientmodule => 'IT',
+ #modulematch => '',
+ length_min => '28',
+ length_max => '40',
+ postDemodulation => \&SIGNALduino_HE800,
+ },
+ "36" => ## remote - cheap wireless dimmer
+ # https://forum.fhem.de/index.php/topic,38831.msg394238.html#msg394238
+ # MU;P0=499;P1=-1523;P2=-522;P3=10220;P4=-10047;D=01020202020202020134010102020101010201020202020102010202020202020201340101020201010102010202020201020102020202020202013401010202010101020102020202010201020202020202020134010102020101010201020202020102010202020202020201340101020201010102010;CP=0;O;
+ # MU;P0=-520;P1=500;P2=-1523;P3=10220;P4=-10043;D=01010101210121010101010101012341212101012121210121010101012101210101010101010123412121010121212101210101010121012101010101010101234121210101212121012101010101210121010101010101012341212101012121210121010101012101210101010101010123412121010;CP=1;O;
+ # MU;P0=498;P1=-1524;P2=-521;P3=10212;P4=-10047;D=01010102010202020201020102020202020202013401010202010101020102020202010201020202020202020134010102020101010201020202020102010202020202020201340101020201010102010202020201020102020202020202013401010202010101020102020202010201020202020202020;CP=0;O;
+ {
+ name => 'remote',
+ comment => 'cheap wireless dimmer',
+ id => '36',
+ knownFreqs => '433.92',
+ one => [1,-3],
+ zero => [1,-1],
+ start => [20,-20],
+ clockabs => '500',
+ format => 'twostate', # not used now
+ preamble => 'u36#', # prepend to converted message
+ postamble => '', # Append to converted message
+ #clientmodule => '',
+ #modulematch => '',
+ length_min => '24',
+ length_max => '24',
+ },
+ "37" => ## Bresser 7009994
+ # MU;P0=729;P1=-736;P2=483;P3=-251;P4=238;P5=-491;D=010101012323452323454523454545234523234545234523232345454545232345454545452323232345232340;CP=4;
+ # MU;P0=-790;P1=-255;P2=474;P4=226;P6=722;P7=-510;D=721060606060474747472121212147472121472147212121214747212147474721214747212147214721212147214060606060474747472121212140;CP=4;R=216;
+ # short pulse of 250 us followed by a 500 us gap is a 0 bit
+ # long pulse of 500 us followed by a 250 us gap is a 1 bit
+ # sync preamble of pulse, gap, 750 us each, repeated 4 times
+ {
+ name => 'Bresser 7009994',
+ comment => 'temperature / humidity sensor',
+ id => '37',
+ knownFreqs => '',
+ one => [2,-1],
+ zero => [1,-2],
+ start => [3,-3,3,-3],
+ clockabs => '250',
+ format => 'twostate', # not used now
+ preamble => 'W37#', # prepend to converted message
+ clientmodule => 'SD_WS',
+ length_min => '40',
+ length_max => '41',
+ },
+ "38" => ## Rosenstein & Söhne / PEARL - NC-3911-675 / NC-3912-675 | refrigerator thermometer - 2 channels
+ # https://github.com/RFD-FHEM/RFFHEM/issues/504 | https://forum.fhem.de/index.php/topic,96827.msg901158.html#msg901158
+ # MU;P0=252;P1=-478;P2=497;P3=-237;P4=-960;P5=737;P6=-727;CP=0;D=01232323232323012301010123012323010101012323010101232323010123230101 0456565656 012301232323232323012301010123012323010101012323010101232323010123230101 0456565656 012301232323232323012301010123012323010101012323010101232323010123230101 04565656560123012323232323230123010101230123230101010123230101012323230101232301010456565656012301232323232323012301010123012323010101012323010101232323010123230101045656565601230123232323232301230101012301232301010101232301010123232301012323010104565656560123012323232323230123010101230123230101010123230101012323230101232301010456565656012301232323232323012301010123012323010101012323010101232323010123230101045656565601230123232323232301230101012301232301010101232301010123232301012323010104565656560123012323232323230123010101230123230101010123230101012323230101232301010456565656012301232323232323012301010123012323010101012323010101232323010123230101045656565601230123232323232301230101012301232301010101232301010123232301012323010104565656560123012323232323230123010101;o3;�
+ {
+ name => 'NC-3911-675',
+ comment => 'refrigerator thermometer',
+ id => '38',
+ knownFreqs => '433.92',
+ one => [2,-1],
+ zero => [1,-2],
+ start => [3,-3,3,-3,3,-3,3,-3],
+ clockabs => 250,
+ format => 'twostate',
+ preamble => 'u38#',
+ length_min => '36',
+ length_max => '36',
+ #clientmodule => '',
+ #modulematch => '^P38#.*',
+ #developId => 'y',
+ },
+ "39" => ## X10 Protocol
+ # https://github.com/RFD-FHEM/RFFHEM/issues/65
+ # MU;P0=10530;P1=-2908;P2=533;P3=-598;P4=-1733;P5=767;D=0123242323232423242324232324232423242323232324232323242424242324242424232423242424232501232423232324232423242323242324232423232323242323232424242423242424242324232424242325012324232323242324232423232423242324232323232423232324242424232424242423242324242;CP=2;O;
+ {
+ name => 'X10 Protocol',
+ id => '39',
+ knownFreqs => '',
+ one => [1,-3],
+ zero => [1,-1],
+ start => [17,-7],
+ clockabs => 560,
+ format => 'twostate',
+ preamble => '', # prepend to converted message
+ clientmodule => 'RFXX10REC',
+ #modulematch => '^TX......',
+ length_min => '32',
+ length_max => '44',
+ paddingbits => '8',
+ postDemodulation => \&SIGNALduino_lengtnPrefix,
+ filterfunc => 'SIGNALduino_compPattern',
+ },
+ "40" => ## Romotec
+ # https://github.com/RFD-FHEM/RFFHEM/issues/71
+ # MU;P0=300;P1=-772;P2=674;P3=-397;P4=4756;P5=-1512;D=4501232301230123230101232301010123230101230103;CP=0;
+ # MU;P0=-132;P1=-388;P2=675;P4=271;P5=-762;D=012145212145452121454545212145452145214545454521454545452145454541;CP=4;
+ {
+ name => 'Romotec ',
+ comment => 'Tubular motor',
+ id => '40',
+ knownFreqs => '',
+ one => [3,-2],
+ zero => [1,-3],
+ start => [1,-2],
+ clockabs => 270,
+ preamble => 'u40#', # prepend to converted message
+ #clientmodule => '',
+ #modulematch => '',
+ length_min => '12',
+ #length_max => '', # missing
+ },
+ "41" => ## Elro (Smartwares) Doorbell DB200 / 16 melodies
+ # https://github.com/RFD-FHEM/RFFHEM/issues/70
+ # MS;P0=-526;P1=1450;P2=467;P3=-6949;P4=-1519;D=231010101010242424242424102424101010102410241024101024241024241010;CP=2;SP=3;O;
+ # MS;P0=468;P1=-1516;P2=1450;P3=-533;P4=-7291;D=040101230101010123230101232323012323010101012301232323012301012323;CP=0;SP=4;O;
+ # unitec Modell:98156+98YK / 36 melodies
+ # repeats 15, change two codes every 15 repeats --> one button push, 2 codes
+ # MS;P0=1474;P1=-521;P2=495;P3=-1508;P4=-6996;D=242323232301232323010101230123232301012301230123010123230123230101;CP=2;SP=4;R=51;m=0;
+ # MS;P1=-7005;P2=482;P3=-1511;P4=1487;P5=-510;D=212345454523452345234523232345232345232323234523454545234523234545;CP=2;SP=1;R=47;m=2;
+ ## KANGTAI Doorbell (Pollin 94-550405)
+ # https://github.com/RFD-FHEM/RFFHEM/issues/365
+ # The bell button alternately sends two different codes
+ # P41#BA2885D3: MS;P0=1390;P1=-600;P2=409;P3=-1600;P4=-7083;D=240123010101230123232301230123232301232323230123010101230123230101;CP=2;SP=4;R=248;O;m0;
+ # P41#BA2885D3: MS;P0=1399;P1=-604;P2=397;P3=-1602;P4=-7090;D=240123010101230123232301230123232301232323230123010101230123230101;CP=2;SP=4;R=248;O;m1;
+ # P41#1791D593: MS;P1=403;P2=-7102;P3=-1608;P4=1378;P5=-620;D=121313134513454545451313451313134545451345134513454513134513134545;CP=1;SP=2;R=5;O;m0;
+ {
+ name => 'wireless doorbell',
+ comment => 'Elro (DB200) / KANGTAI (Pollin 94-550405) / unitec',
+ id => '41',
+ knownFreqs => '433.92',
+ zero => [1,-3],
+ one => [3,-1],
+ sync => [1,-14],
+ clockabs => 500,
+ format => 'twostate',
+ preamble => 'P41#', # prepend to converted message
+ clientmodule => 'SD_BELL',
+ modulematch => '^P41#.*',
+ length_min => '32',
+ length_max => '32',
+ },
+ "42" => ## Pollin 551227
+ # https://github.com/RFD-FHEM/RFFHEM/issues/390
+ # MU;P0=1446;P1=-487;P2=477;D=0101012121212121212121212101010101212121212121212121210101010121212121212121212121010101012121212121212121212101010101212121212121212121210101010121212121212121212121010101012121212121212121212101010101212121212121212121210101010121212121212121212121010;CP=2;R=93;O;
+ # MU;P0=-112;P1=1075;P2=-511;P3=452;P5=1418;D=01212121232323232323232323232525252523232323232323232323252525252323232323232323232325252525;CP=3;R=77;
+ {
+ name => 'wireless doorbell',
+ comment => 'Pollin 551227',
+ id => '42',
+ knownFreqs => '433.92',
+ one => [1,-1],
+ zero => [3,-1],
+ start => [1,-1,1,-1,1,-1,],
+ clockabs => 500,
+ format => 'twostate',
+ preamble => 'P42#',
+ clientmodule => 'SD_Bell',
+ #modulematch => '^P42#.*',
+ length_min => '28',
+ length_max => '120',
+ },
+ "43" => ## Somfy RTS
+ # MC;LL=-1405;LH=1269;SL=-723;SH=620;D=98DBD153D631BB;C=669;L=56;R=229;
+ {
+ name => 'Somfy RTS',
+ id => '43',
+ knownFreqs => '',
+ clockrange => [610,680], # min , max
+ format => 'manchester',
+ preamble => 'Ys',
+ clientmodule => 'SOMFY', # not used now
+ modulematch => '^Ys[0-9A-F]{14}',
+ length_min => '56',
+ length_max => '57',
+ method => \&SIGNALduino_SomfyRTS, # Call to process this message
+ msgIntro => 'SR;P0=-2560;P1=2560;P3=-640;D=10101010101010113;',
+ #msgOutro => 'SR;P0=-30415;D=0;',
+ frequency => '10AB85550A',
+ },
+ "44" => ## Bresser Temeo Trend
+ {
+ name => 'BresserTemeo',
+ comment => 'temperature / humidity sensor',
+ id => '44',
+ knownFreqs => '',
+ clockabs => 500,
+ zero => [4,-4],
+ one => [4,-8],
+ start => [8,-8],
+ preamble => 'W44#',
+ clientmodule => 'SD_WS',
+ modulematch => '^W44#[A-F0-9]{18}',
+ length_min => '64',
+ length_max => '72',
+ },
+ "44.1" => ## Bresser Temeo Trend
+ {
+ name => 'BresserTemeo',
+ comment => 'temperature / humidity sensor',
+ id => '44',
+ knownFreqs => '',
+ clockabs => 500,
+ zero => [4,-4],
+ one => [4,-8],
+ start => [8,-12],
+ preamble => 'W44x#',
+ clientmodule => 'SD_WS',
+ modulematch => '^W44x#[A-F0-9]{18}',
+ length_min => '64',
+ length_max => '72',
+ },
+ "45" => ## Revolt
+ # MU;P0=-8320;P1=9972;P2=-376;P3=117;P4=-251;P5=232;D=012345434345434345454545434345454545454543454343434343434343434343434543434345434343434545434345434343434343454343454545454345434343454345434343434343434345454543434343434345434345454543454343434543454345434545;CP=3;R=2
+ {
+ name => 'Revolt',
+ id => '45',
+ knownFreqs => '',
+ one => [2,-2],
+ zero => [1,-2],
+ start => [83,-3],
+ clockabs => 120,
+ preamble => 'r', # prepend to converted message
+ clientmodule => 'Revolt',
+ modulematch => '^r[A-Fa-f0-9]{22}',
+ length_min => '84',
+ length_max => '120',
+ postDemodulation => sub { my ($name, @bit_msg) = @_; my @new_bitmsg = splice @bit_msg, 0,88; return 1,@new_bitmsg; },
+ },
+ "46" => ## Berner Garagentorantrieb GA401
+ # remote TEDSEN SKX1MD 433.92 MHz - 1 button | settings via 9 switch on battery compartment
+ # compatible with doors: BERNER SKX1MD, ELKA SKX1MD, TEDSEN SKX1LC, TEDSEN SKX1
+ # https://github.com/RFD-FHEM/RFFHEM/issues/91
+ # door open
+ # MU;P0=-15829;P1=-3580;P2=1962;P3=-330;P4=245;P5=-2051;D=1234523232345234523232323234523234540023452323234523452323232323452323454023452323234523452323232323452323454023452323234523452323232323452323454023452323234523452323232323452323454023452323234523452323;CP=2;
+ # door close
+ # MU;P0=-1943;P1=1966;P2=-327;P3=247;P5=-15810;D=01230121212301230121212121230121230351230121212301230121212121230121230351230121212301230121212121230121230351230121212301230121212121230121230351230121212301230121212121230121230351230;CP=1;
+ {
+ name => 'Berner Garagedoor GA401',
+ comment => 'remote control TEDSEN SKX1MD',
+ id => '46',
+ knownFreqs => '',
+ one => [1,-8],
+ zero => [8,-1],
+ start => [1,-63],
+ clockabs => 250, # -1=auto
+ format => 'twostate', # not used now
+ preamble => 'P46#',
+ clientmodule => 'SD_UT',
+ modulematch => '^P46#.*',
+ length_min => '16',
+ length_max => '18',
+ },
+ "47" => ## Maverick
+ # MC;LL=-507;LH=490;SL=-258;SH=239;D=AA9995599599A959996699A969;C=248;L=104;
+ {
+ name => 'Maverick',
+ comment => 'BBQ / food thermometer',
+ id => '47',
+ knownFreqs => '',
+ clockrange => [180,260],
+ format => 'manchester',
+ preamble => 'P47#', # prepend to converted message
+ clientmodule => 'SD_WS_Maverick',
+ modulematch => '^P47#[569A]{12}.*',
+ length_min => '100',
+ length_max => '108',
+ method => \&SIGNALduino_Maverick, # Call to process this message
+ #polarity => 'invert'
+ },
+ "48" => ## Joker Dostmann TFA 30.3055.01
+ # https://github.com/RFD-FHEM/RFFHEM/issues/92
+ # MU;P0=591;P1=-1488;P2=-3736;P3=1338;P4=-372;P6=-988;D=23406060606063606363606363606060636363636363606060606363606060606060606060606060636060636360106060606060606063606363606363606060636363636363606060606363606060606060606060606060636060636360106060606060606063606363606363606060636363636363606060606363606060;CP=0;O;
+ # MU;P0=96;P1=-244;P2=510;P3=-1000;P4=1520;P5=-1506;D=01232323232343234343232343234323434343434343234323434343232323232323232323232323234343234325232323232323232343234343232343234323434343434343234323434343232323232323232323232323234343234325232323232323232343234343232343234323434343434343234323434343232323;CP=2;O;
+ {
+ name => 'TFA Dostmann',
+ comment => 'Funk-Thermometer Joker TFA 30.3055.01',
+ id => '48',
+ knownFreqs => '',
+ clockabs => 250, # In real it is 500 but this leads to unprceise demodulation
+ one => [-4,6],
+ zero => [-4,2],
+ start => [-6,2],
+ format => 'twostate',
+ preamble => 'U48#', # prepend to converted message
+ #clientmodule => '',
+ modulematch => '^U48#.*',
+ length_min => '47',
+ length_max => '48',
+ },
+ "49" => ## QUIGG / ALDI GT-9000
+ # https://github.com/RFD-FHEM/RFFHEM/issues/93
+ # MU;P0=-563;P1=479;P2=991;P3=-423;P4=361;P5=-1053;P6=3008;P7=-7110;D=2345454523452323454523452323452323452323454545456720151515201520201515201520201520201520201515151567201515152015202015152015202015202015202015151515672015151520152020151520152020152020152020151515156720151515201520201515201520201520201520201515151;CP=1;R=21;
+ {
+ name => 'QUIGG_GT-9000',
+ comment => 'remote control',
+ id => '49',
+ knownFreqs => '',
+ clockabs => 400,
+ one => [2,-1.2],
+ zero => [1,-3],
+ start => [6,-15],
+ format => 'twostate',
+ preamble => 'U49#', # prepend to converted message
+ #clientmodule => '',
+ modulematch => '^U49#.*',
+ length_min => '22',
+ length_max => '28',
+ },
+ "50" => ## Opus XT300
+ # https://github.com/RFD-FHEM/RFFHEM/issues/99
+ # MU;P0=248;P1=-21400;P2=545;P3=-925;P4=1368;P5=-12308;D=01232323232323232343234323432343234343434343234323432343434343432323232323232323232343432323432345232323232323232343234323432343234343434343234323432343434343432323232323232323232343432323432345232323232323232343234323432343234343434343234323432343434343;CP=2;O;
+ {
+ name => 'Opus_XT300',
+ comment => 'sensor for ground humidity',
+ id => '50',
+ knownFreqs => '',
+ clockabs => 500,
+ zero => [3,-2],
+ one => [1,-2],
+ # start => [1,-25], # Wenn das startsignal empfangen wird, fehlt das 1 bit
+ format => 'twostate',
+ preamble => 'W50#', # prepend to converted message
+ clientmodule => 'SD_WS',
+ modulematch => '^W50#.*',
+ length_min => '47',
+ length_max => '48',
+ },
+ "51" => ## weather sensors
+ # MS;P0=-16046;P1=552;P2=-1039;P3=983;P5=-7907;P6=-1841;P7=-4129;D=15161716171616161717171716161616161617161717171717171617171617161716161616161616171032323232;CP=1;SP=5;O;
+ # https://github.com/RFD-FHEM/RFFHEM/issues/118
+ {
+ name => 'weather',
+ comment => 'IAN 275901 Wetterstation Lidl',
+ id => '51',
+ knownFreqs => '',
+ one => [1,-8],
+ zero => [1,-4],
+ sync => [1,-13],
+ clockabs => '560',
+ format => 'twostate', # not used now
+ preamble => 'W51#', # prepend to converted message
+ postamble => '', # Append to converted message
+ clientmodule => 'SD_WS',
+ modulematch => '^W51#.*',
+ length_min => '40',
+ length_max => '45',
+ },
+ "52" => ## Oregon Scientific PIR Protocol
+ # https://forum.fhem.de/index.php/topic,63604.msg548256.html#msg548256
+ # MC;LL=-1045;LH=1153;SL=-494;SH=606;D=FFFED518;C=549;L=30;
+ #
+ # FFFED5 = Adresse, die per DIP einstellt wird, FFF ändert sich nie
+ # 1 = Kanal, per gesondertem DIP, bei mir bei beiden 1 (CH 1) oder 3 (CH 2)
+ # C = wechselt, 0, 4, 8, C - dann fängt es wieder mit 0 an und wiederholt sich bei jeder Bewegung
+ {
+ name => 'Oregon Scientific PIR',
+ id => '52',
+ knownFreqs => '',
+ clockrange => [470,640], # min , max
+ format => 'manchester', # tristate can't be migrated from bin into hex!
+ clientmodule => 'OREGON',
+ modulematch => '^u52#F{3}|0{3}.*',
+ preamble => 'u52#',
+ length_min => '30',
+ length_max => '30',
+ method => \&SIGNALduino_OSPIR, # Call to process this message
+ polarity => 'invert',
+ },
+ "55" => ## QUIGG GT-1000
+ {
+ name => 'QUIGG_GT-1000',
+ comment => 'remote control',
+ id => '55',
+ knownFreqs => '',
+ clockabs => 300,
+ zero => [1,-4],
+ one => [4,-2],
+ sync => [1,-8],
+ format => 'twostate',
+ preamble => 'i', # prepend to converted message
+ clientmodule => 'IT',
+ modulematch => '^i.*',
+ length_min => '24',
+ length_max => '24',
+ },
+ "56" => ## Celexon
+ {
+ name => 'Celexon',
+ id => '56',
+ knownFreqs => '',
+ clockabs => 200,
+ zero => [1,-3],
+ one => [3,-1],
+ start => [25,-3],
+ format => 'twostate',
+ preamble => 'u56#', # prepend to converted message
+ #clientmodule => '',
+ modulematch => '',
+ length_min => '56',
+ length_max => '68',
+ },
+ "57" => ## m-e doorbell fuer FG- und Basic-Serie
+ # https://forum.fhem.de/index.php/topic,64251.0.html
+ # MC;LL=-653;LH=665;SL=-317;SH=348;D=D55B58;C=330;L=21;
+ # MC;LL=-654;LH=678;SL=-314;SH=351;D=D55B58;C=332;L=21;
+ # MC;LL=-653;LH=679;SL=-310;SH=351;D=D55B58;C=332;L=21;
+ {
+ name => 'm-e',
+ comment => 'radio gong transmitter for FG- and Basic-Serie',
+ id => '57',
+ knownFreqs => '',
+ clockrange => [300,360], # min , max
+ format => 'manchester', # tristate can't be migrated from bin into hex!
+ clientmodule => 'SD_BELL',
+ modulematch => '^P57#.*',
+ preamble => 'P57#',
+ length_min => '21',
+ length_max => '24',
+ method => \&SIGNALduino_MCRAW, # Call to process this message
+ polarity => 'invert',
+ },
+ "58" => ## TFA 30.3208.0
+ # MC;LL=-981;LH=964;SL=-480;SH=520;D=002BA37EBDBBA24F0015D1BF5EDDD127800AE8DFAF6EE893C;C=486;L=194;
+ {
+ name => 'TFA 30.3208.0',
+ comment => 'temperature / humidity sensor',
+ id => '58',
+ #knownFreqs => '',
+ clockrange => [460,520], # min , max
+ format => 'manchester', # tristate can't be migrated from bin into hex!
+ clientmodule => 'SD_WS',
+ modulematch => '^W58*',
+ preamble => 'W58#',
+ length_min => '52', # 54
+ length_max => '52', # 136
+ method => \&SIGNALduino_MCTFA, # Call to process this message
+ polarity => 'invert',
+ },
+ "59" => ## AK-HD-4 remote | 4 Buttons
+ # https://github.com/RFD-FHEM/RFFHEM/issues/133
+ # MU;P0=819;P1=-919;P2=234;P3=-320;P4=8602;P6=156;D=01230301230301230303012123012301230303030301230303412303012303012303030121230123012303030303012303034123030123030123030301212301230123030303030123030341230301230301230303012123012301230303030301230303412303012303012303030121230123012303030303012303034163;CP=0;O;
+ # MU;P0=-334;P2=8581;P3=237;P4=-516;P5=782;P6=-883;D=23456305056305050563630563056305050505056305050263050563050563050505636305630563050505050563050502630505630505630505056363056305630505050505630505026305056305056305050563630563056305050505056305050263050563050563050505636305630563050505050563050502630505;CP=5;O;
+ {
+ name => 'AK-HD-4',
+ comment => 'remote control with 4 buttons',
+ id => '59',
+ knownFreqs => '',
+ clockabs => 230,
+ zero => [-4,1],
+ one => [-1,4],
+ start => [-1,37],
+ format => 'twostate', # tristate can't be migrated from bin into hex!
+ preamble => 'u59#', # Append to converted message
+ postamble => '', # Append to converted message
+ #clientmodule => '',
+ modulematch => '',
+ length_min => '24',
+ length_max => '24',
+ },
+ "60" => ## ELV, LA CROSSE (WS2000/WS7000)
+ # MU;P0=32001;P1=-381;P2=835;P3=354;P4=-857;D=01212121212121212121343421212134342121213434342121343421212134213421213421212121342121212134212121213421212121343421343430;CP=2;R=53;
+ # tested sensors: WS-7000-20, AS2000, ASH2000, S2000, S2000I, S2001A, S2001IA,
+ # ASH2200, S300IA, S2001I, S2000ID, S2001ID, S2500H
+ # not tested: AS3, S2000W, S2000R, WS7000-15, WS7000-16, WS2500-19, S300TH, S555TH
+ # das letzte Bit (1) und mehrere Bit (0) Preambel fehlen meistens
+ # ___ _
+ # | |_ | |___
+ # Bit 0 Bit 1
+ # kurz 366 mikroSek / lang 854 mikroSek / gesamt 1220 mikroSek - Sollzeiten
+ {
+ name => 'WS2000',
+ comment => 'Series WS2000/WS7000 of various sensors',
+ id => '60',
+ knownFreqs => '',
+ one => [3,-7],
+ zero => [7,-3],
+ clockabs => 122,
+ preamble => 'K', # prepend to converted message
+ postamble => '', # Append to converted message
+ clientmodule => 'CUL_WS',
+ length_min => '38', # 46, letztes Bit fehlt = 45, 10 Bit Preambel = 35 Bit Daten
+ length_max => '82',
+ postDemodulation => \&SIGNALduino_postDemo_WS2000,
+ },
+ "61" => ## ELV FS10
+ # tested transmitter: FS10-S8, FS10-S4, FS10-ZE
+ # tested receiver: FS10-ST, FS10-MS, WS3000-TV, PC-Wettersensor-Empfaenger
+ # sends 2 messages with 43 or 48 bits in distance of 100 mS (on/off) , last bit 1 is missing
+ # sends x messages with 43 or 48 bits in distance of 200 mS (dimm) , repeats second message
+ # MU;P0=1776;P1=-410;P2=383;P3=-820;D=01212121212121212121212123212121232323212323232121212323232121212321212123232123212120;CP=2;R=74;
+ # __ __
+ # | |__ | |____
+ # Bit 0 Bit 1
+ # kurz 400 mikroSek / lang 800 mikroSek / gesamt 800 mikroSek = 0, gesamt 1200 mikroSek = 1 - Sollzeiten
+ {
+ name => 'FS10',
+ comment => 'remote control',
+ id => '61',
+ knownFreqs => '433.92',
+ one => [1,-2],
+ zero => [1,-1],
+ clockabs => 400,
+ pause => [-81], # 400*81=32400*6=194400 - pause between repeats of send messages (clockabs*pause must be < 32768)
+ format => 'twostate',
+ preamble => 'P61#', # prepend to converted message
+ postamble => '', # Append to converted message
+ clientmodule => 'FS10',
+ #modulematch => '',
+ length_min => '38', # eigentlich 41 oder 46 (Pruefsumme nicht bei allen)
+ length_max => '48', # eigentlich 46
+ },
+ "62" => ## Clarus_Switch
+ # MU;P0=-5893;P4=-634;P5=498;P6=-257;P7=116;D=45656567474747474745656707456747474747456745674567456565674747474747456567074567474747474567456745674565656747474747474565670745674747474745674567456745656567474747474745656707456747474747456745674567456565674747474747456567074567474747474567456745674567;CP=7;O;
+ {
+ name => 'Clarus_Switch',
+ id => '62',
+ knownFreqs => '',
+ one => [3,-1],
+ zero => [1,-3],
+ start => [1,-35], # ca 30-40
+ clockabs => 189,
+ preamble => 'i', # prepend to converted message
+ clientmodule => 'IT',
+ #modulematch => '',
+ length_min => '24',
+ length_max => '24',
+ },
+ "63" => ## Warema MU
+ # https://forum.fhem.de/index.php/topic,38831.msg395978/topicseen.html#msg395978 | https://www.mikrocontroller.net/topic/264063
+ # MU;P0=-2988;P1=1762;P2=-1781;P3=-902;P4=871;P5=6762;P6=5012;D=0121342434343434352434313434243521342134343436;
+ # MU;P0=6324;P1=-1789;P2=864;P3=-910;P4=1756;D=0123234143212323232323032321234141032323232323232323;CP=2;
+ {
+ name => 'Warema',
+ comment => 'radio shutter switch (is still experimental)',
+ id => '63',
+ knownFreqs => '',
+ developId => 'y',
+ one => [1],
+ zero => [0],
+ clockabs => 800,
+ syncabs => '6700', # Special field for filterMC function
+ preamble => 'u63#', # prepend to converted message
+ #clientmodule => '',
+ #modulematch => '',
+ length_min => '24',
+ #length_max => '', # missing
+ filterfunc => 'SIGNALduino_filterMC',
+ },
+ "64" => ## WH2 #############################################################################
+ # MU;P0=-32001;P1=457;P2=-1064;P3=1438;D=0123232323212121232123232321212121212121212323212121232321;CP=1;R=63;
+ # MU;P0=-32001;P1=473;P2=-1058;P3=1454;D=0123232323212121232123232121212121212121212121232321212321;CP=1;R=51;
+ # MU;P0=134;P1=-113;P3=412;P4=-1062;P5=1379;D=01010101013434343434343454345454345454545454345454545454343434545434345454345454545454543454543454345454545434545454345;CP=3;
+ {
+ name => 'WH2',
+ comment => 'temperature / humidity sensor',
+ id => '64',
+ knownFreqs => '',
+ one => [1,-2],
+ zero => [3,-2],
+ clockabs => 490,
+ clientmodule => 'SD_WS',
+ modulematch => '^W64*',
+ preamble => 'W64#', # prepend to converted message
+ postamble => '', # Append to converted message
+ #clientmodule => '',
+ length_min => '48',
+ length_max => '54',
+ },
+ "65" => ## Homeeasy
+ # MS;P1=231;P2=-1336;P4=-312;P5=-8920;D=15121214141412121212141414121212121414121214121214141212141212141212121414121414141212121214141214121212141412141212;CP=1;SP=5;
+ {
+ name => 'HomeEasy HE_EU',
+ id => '65',
+ knownFreqs => '',
+ one => [1,-5.5],
+ zero => [1,-1.2],
+ sync => [1,-38],
+ clockabs => 230,
+ format => 'twostate', # not used now
+ preamble => 'ih',
+ clientmodule => 'IT',
+ length_min => '57',
+ length_max => '72',
+ postDemodulation => \&SIGNALduino_HE_EU,
+ },
+ "66" => ## TX2 Protocol (Remote Temp Transmitter & Remote Thermo Model 7035)
+ # https://github.com/RFD-FHEM/RFFHEM/issues/160
+ # MU;P0=13312;P1=-2785;P2=4985;P3=1124;P4=-6442;P5=3181;P6=-31980;D=0121345434545454545434545454543454545434343454543434545434545454545454343434545434343434545621213454345454545454345454545434545454343434545434345454345454545454543434345454343434345456212134543454545454543454545454345454543434345454343454543454545454545;CP=3;R=73;O;
+ {
+ name => 'WS7035',
+ comment => 'temperature sensor',
+ id => '66',
+ knownFreqs => '',
+ one => [10,-52],
+ zero => [27,-52],
+ start => [-21,42,-21],
+ clockabs => 122,
+ format => 'pwm', # not used now
+ preamble => 'TX',
+ clientmodule => 'CUL_TX',
+ modulematch => '^TX......',
+ length_min => '43',
+ length_max => '44',
+ postDemodulation => \&SIGNALduino_postDemo_WS7035,
+ },
+ "67" => ## TX2 Protocol (Remote Datalink & Remote Thermo Model 7053, 7054)
+ # https://github.com/RFD-FHEM/RFFHEM/issues/162
+ # MU;P0=3381;P1=-672;P2=-4628;P3=1142;P4=-30768;D=010 2320232020202020232020232020202320232323202323202020202020202020 4 010 2320232020202020232020232020202320232323202323202020202020202020 0;CP=0;R=45;
+ # MU;P0=1148;P1=3421;P6=-664;P7=-4631;D=161 7071707171717171707171707171717171707070717071717171707071717171 0;CP=1;R=29;
+ # Message repeats 4 x with pause of ca. 30-34 mS
+ # __ ____
+ # ________| | ________| |
+ # Bit 1 Bit 0
+ # 4630 1220 4630 3420 mikroSek - mit Oszi gemessene Zeiten
+ {
+ name => 'WS7053',
+ comment => 'temperature sensor',
+ id => '67',
+ knownFreqs => '',
+ one => [-38,10], # -4636, 1220
+ zero => [-38,28], # -4636, 3416
+ clockabs => 122,
+ preamble => 'TX', # prepend to converted message
+ clientmodule => 'CUL_TX',
+ modulematch => '^TX......',
+ length_min => '32',
+ length_max => '34',
+ postDemodulation => \&SIGNALduino_postDemo_WS7053,
+ },
+
+ # "68" => can use
+
+ "69" => ## Hoermann HSM2, HSM4, HS1-868-BS (868 MHz)
+ # https://github.com/RFD-FHEM/RFFHEM/issues/149
+ # MU;P0=-508;P1=1029;P2=503;P3=-1023;P4=12388;D=01010232323232310104010101010101010102323231010232310231023232323231023101023101010231010101010232323232310104010101010101010102323231010232310231023232323231023101023101010231010101010232323232310104010101010101010102323231010232310231023232323231023101;CP=2;R=37;O;
+ # Remote control HS1-868-BS (one button):
+ # https://github.com/RFD-FHEM/RFFHEM/issues/344
+ # MU;P0=-578;P1=1033;P2=506;P3=-1110;P4=13632;D=0101010232323101040101010101010101023232323102323101010231023102310231010232323101010101010101010232323101040101010101010101023232323102323101010231023102310231010232323101010101010101010232323101040101010101010101023232323102323101010231023102310231010;CP=2;R=77;
+ # MU;P0=-547;P1=1067;P2=553;P3=-1066;P4=13449;D=0101010101010232323101040101010101010101023232323102323101010231023102310231010232323101010101010101010232323101040101010101010101023232323102323101010231023102310231010232323101010101010101010232323101040101010101010101023232323102323101010231023102310;CP=2;R=71;
+ # https://forum.fhem.de/index.php/topic,71877.msg642879.html (HSM4, Taste 1-4)
+ # MU;P0=-332;P1=92;P2=-1028;P3=12269;P4=-510;P5=1014;P6=517;D=01234545454545454545462626254546262546254626262626254625454625454546254545454546262626262545434545454545454545462626254546262546254626262626254625454625454546254545454546262626262545434545454545454545462626254546262546254626262626254625454625454546254545;CP=6;R=37;O;
+ # MU;P0=509;P1=-10128;P2=1340;P3=-517;P4=1019;P5=-1019;P6=12372;D=01234343434343434343050505434305054305430505050505430543430543434305434343430543050505054343634343434343434343050505434305054305430505050505430543430543434305434343430543050505054343634343434343434343050505434305054305430505050505430543430543434305434343;CP=0;R=52;O;
+ # MU;P0=12376;P1=360;P2=-10284;P3=1016;P4=-507;P6=521;P7=-1012;D=01234343434343434343467676734346767346734676767676734673434673434346734343434676767346767343404343434343434343467676734346767346734676767676734673434673434346734343434676767346767343404343434343434343467676734346767346734676767676734673434673434346734343;CP=6;R=55;O;
+ # MU;P0=-3656;P1=12248;P2=-519;P3=1008;P4=506;P5=-1033;D=01232323232323232324545453232454532453245454545453245323245323232453232323245453245454532321232323232323232324545453232454532453245454545453245323245323232453232323245453245454532321232323232323232324545453232454532453245454545453245323245323232453232323;CP=4;R=48;O;
+ {
+ name => 'Hoermann',
+ comment => 'remote control HS1-868-BS, HSM4',
+ id => '69',
+ knownFreqs => '',
+ zero => [2,-1], # 1020,510
+ one => [1,-2], # 510,1020
+ start => [25,-1], # 12750,510
+ clockabs => 510,
+ format => 'twostate',
+ clientmodule => 'SD_UT',
+ modulematch => '^P69#.{11}',
+ preamble => 'P69#',
+ length_min => '44',
+ length_max => '44',
+ },
+ "70" => ## FHT80TF (Funk-Tuer-Fenster-Melder FHT 80TF und FHT 80TF-2)
+ # https://github.com/RFD-FHEM/RFFHEM/issues/171
+ # closed MU;P0=-24396;P1=417;P2=-376;P3=610;P4=-582;D=012121212121212121212121234123434121234341212343434121234123434343412343434121234341212121212341212341234341234123434;CP=1;R=35;
+ # open MU;P0=-21652;P1=429;P2=-367;P4=634;P5=-555;D=012121212121212121212121245124545121245451212454545121245124545454512454545121245451212121212124512451245451245121212;CP=1;R=38;
+ {
+ name => 'FHT80TF',
+ comment => 'door/window switch',
+ id => '70',
+ knownFreqs => '868.35',
+ one => [1.5,-1.5], # 600
+ zero => [1,-1], # 400
+ clockabs => 400,
+ format => 'twostate', # not used now
+ clientmodule => 'CUL_FHTTK',
+ preamble => 'T',
+ length_min => '50',
+ length_max => '58',
+ postDemodulation => \&SIGNALduino_postDemo_FHT80TF,
+ },
+ "71" => ## PEARL infactory Poolthermometer (PV-8644)
+ # MU;P0=1735;P1=-1160;P2=591;P3=-876;D=0123012323010101230101232301230123010101010123012301012323232323232301232323232323232323012301012;CP=2;R=97;
+ {
+ name => 'PEARL',
+ comment => 'infactory Poolthermometer (PV-8644)',
+ id => '71',
+ knownFreqs => '433.92',
+ clockabs => 580,
+ zero => [3,-2],
+ one => [1,-1.5],
+ format => 'twostate',
+ preamble => 'W71#', # prepend to converted message
+ clientmodule => 'SD_WS',
+ #modulematch => '^W71#.*'
+ length_min => '48',
+ length_max => '48',
+ },
+ "72" => ## Siro blinds MU @Dr. Smag
+ # ! same definition how ID 16 !
+ # https://forum.fhem.de/index.php?topic=77167.0
+ # MU;P0=-760;P1=334;P2=693;P3=-399;P4=-8942;P5=4796;P6=-1540;D=01010102310232310101010102310232323101010102310101010101023102323102323102323102310101010102310232323101010102310101010101023102310231023102456102310232310232310231010101010231023232310101010231010101010102310231023102310245610231023231023231023101010101;CP=1;R=45;O;
+ # MU;P0=-8848;P1=4804;P2=-1512;P3=336;P4=-757;P5=695;P6=-402;D=0123456345656345656345634343434345634565656343434345634343434343456345634563456345;CP=3;R=49;
+ {
+ name => 'Siro shutter',
+ comment => 'message decode as MU',
+ id => '72',
+ knownFreqs => '',
+ dispatchequals => 'true',
+ one => [2,-1.2], # 680, -400
+ zero => [1,-2.2], # 340, -750
+ start => [14,-4.4], # 4800,-1520
+ clockabs => 340,
+ format => 'twostate',
+ preamble => 'P72#', # prepend to converted message
+ clientmodule => 'Siro',
+ #modulematch => '',
+ length_min => '39',
+ length_max => '40',
+ msgOutro => 'SR;P0=-8500;D=0;',
+ },
+ "72.1" => ## Siro blinds MS @Dr. Smag
+ # MS;P0=4803;P1=-1522;P2=333;P3=-769;P4=699;P5=-393;P6=-9190;D=2601234523454523454523452323232323452345454523232323452323232323234523232345454545;CP=2;SP=6;R=61;
+ {
+ name => 'Siro shutter',
+ comment => 'message decode as MS',
+ id => '72',
+ knownFreqs => '',
+ developId => 'm',
+ dispatchequals => 'true',
+ one => [2,-1.2], # 680, -400
+ zero => [1,-2.2], # 340, -750
+ sync => [14,-4.4], # 4800,-1520
+ clockabs => 340,
+ format => 'twostate',
+ preamble => 'P72#', # prepend to converted message
+ clientmodule => 'Siro',
+ #modulematch => '',
+ length_min => '39',
+ length_max => '40',
+ #msgOutro => 'SR;P0=-8500;D=0;',
+ },
+ "73" => ## FHT80 - Raumthermostat (868Mhz), @HomeAutoUser
+ # MU;P0=136;P1=-112;P2=631;P3=-392;P4=402;P5=-592;P6=-8952;D=0123434343434343434343434325434343254325252543432543434343434325434343434343434343254325252543254325434343434343434343434343252525432543464343434343434343434343432543434325432525254343254343434343432543434343434343434325432525254325432543434343434343434;CP=4;R=250;
+ {
+ name => 'FHT80',
+ comment => 'roomthermostat (only receive)',
+ id => '73',
+ knownFreqs => '868.35',
+ developId => 'y',
+ one => [1.5,-1.5], # 600
+ zero => [1,-1], # 400
+ pause => [-25],
+ clockabs => 400,
+ format => 'twostate', # not used now
+ clientmodule => 'FHT',
+ preamble => '810c04xx0909a001',
+ length_min => '59',
+ length_max => '67',
+ postDemodulation => \&SIGNALduino_postDemo_FHT80,
+ },
+ "74" => ## FS20 - 'Remote Control (868Mhz), @HomeAutoUser
+ # MU;P0=-10420;P1=-92;P2=398;P3=-417;P5=596;P6=-592;D=1232323232323232323232323562323235656232323232356232356232623232323232323232323232323235623232323562356565623565623562023232323232323232323232356232323565623232323235623235623232323232323232323232323232323562323232356235656562356562356202323232323232323;CP=2;R=72;
+ {
+ name => 'FS20',
+ comment => 'remote control',
+ id => '74',
+ knownFreqs => '868.35',
+ one => [1.5,-1.5], # 600
+ zero => [1,-1], # 400
+ pause => [-25],
+ clockabs => 400,
+ format => 'twostate', # not used now
+ clientmodule => 'FS20',
+ preamble => '810b04f70101a001',
+ length_min => '50',
+ length_max => '67',
+ postDemodulation => \&SIGNALduino_postDemo_FS20,
+ },
+ "75" => ## Conrad RSL (Erweiterung v2) @litronics https://github.com/RFD-FHEM/SIGNALDuino/issues/69
+ # ! same definition how ID 5, but other length !
+ # !! protocol needed revision - start or sync failed !! https://github.com/RFD-FHEM/SIGNALDuino/issues/69#issuecomment-440349328
+ # MU;P0=-1365;P1=477;P2=1145;P3=-734;P4=-6332;D=01023202310102323102423102323102323101023232323101010232323231023102323102310102323102423102323102323101023232323101010232323231023102323102310102323102;CP=1;R=12;
+ {
+ name => 'Conrad RSL v2',
+ comment => 'remotes and switches',
+ id => '75',
+ knownFreqs => '',
+ one => [3,-1],
+ zero => [1,-3],
+ clockabs => 500,
+ format => 'twostate',
+ developId => 'y',
+ clientmodule => 'SD_RSL',
+ preamble => 'P1#',
+ modulematch => '^P1#[A-Fa-f0-9]{8}',
+ length_min => '32',
+ length_max => '40',
+ },
+ "76" => ## Kabellose LED-Weihnachtskerzen XM21-0
+ # MU;P0=-205;P1=113;P3=406;D=010101010101010101010101010101010101010101010101010101010101030303030101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010103030303010101010101010101010100;CP=1;R=69;
+ # MU;P0=-198;P1=115;P4=424;D=0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010404040401010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101040404040;CP=1;R=60;O;
+ # MU;P0=114;P1=-197;P2=419;D=0121212121010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101012121212101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010;CP=0;R=54;O;
+ # ON -> P76#FFFFFFFFFFFFFFFF
+ # MU;P0=-189;P1=115;P4=422;D=0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101040404040101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010104040404010101010;CP=1;R=73;O;
+ # MU;P0=-203;P1=412;P2=114;D=01010101020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020101010102020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200;CP=2;R=74;
+ # MU;P0=-210;P1=106;P3=413;D=0101010101010101010303030301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101030303030100;CP=1;R=80;
+ # OFF -> P76#FFFFFFFFFFFFFFC
+ {
+ name => 'LED XM21',
+ comment => 'remote with 2-buttons for LED X-MAS light string',
+ id => '76',
+ knownFreqs => '433.92',
+ one => [1.2,-2], # 120,-200
+ zero => [], # existiert nicht
+ start => [4.5,-2,4.5,-2,4.5,-2,4.5,-2], # 450,-200 Starsequenz
+ clockabs => 100,
+ format => 'twostate', # not used now
+ clientmodule => 'SD_UT',
+ preamble => 'P76#',
+ length_min => 58,
+ length_max => 64,
+ },
+ "77" => ## https://github.com/juergs/NANO_DS1820_4Fach
+ # MU;P0=102;P1=236;P2=-2192;P3=971;P6=-21542;D=01230303030103010303030303010103010303010303010101030301030103030303010101030301030303010163030303010301030303030301010301030301030301010103030103010303030301010103030103030301016303030301030103030303030101030103030103030101010303010301030303030101010303;CP=0;O;
+ # MU;P0=-1483;P1=239;P2=970;P3=-21544;D=01020202010132020202010201020202020201010201020201020201010102020102010202020201010102020102020201013202020201020102020202020101020102020102020101010202010201020202020101010202010202020101;CP=1;
+ # MU;P0=-168;P1=420;P2=-416;P3=968;P4=-1491;P5=242;P6=-21536;D=01234343434543454343434343454543454345434543454345434343434343434343454345434343434345454363434343454345434343434345454345434543454345434543434343434343434345434543434343434545436343434345434543434343434545434543454345434543454343434343434343434543454343;CP=3;O;
+ # MU;P0=-1483;P1=969;P2=236;P3=-21542;D=01010102020131010101020102010101010102020102010201020102010201010101010101010102010201010101010202013101010102010201010101010202010201020102010201020101010101010101010201020101010101020201;CP=1;
+ # MU;P0=-32001;P1=112;P2=-8408;P3=968;P4=-1490;P5=239;P6=-21542;D=01234343434543454343434343454543454345454343454345434343434343434343454345434343434345454563434343454345434343434345454345434545434345434543434343434343434345434543434343434545456343434345434543434343434545434543454543434543454343434343434343434543454343;CP=3;O;
+ # MU;P0=-1483;P1=968;P2=240;P3=-21542;D=01010102020231010101020102010101010102020102010202010102010201010101010101010102010201010101010202023101010102010201010101010202010201020201010201020101010101010101010201020101010101020202;CP=1;
+ # MU;P0=-32001;P1=969;P2=-1483;P3=237;P4=-21542;D=01212121232123212121212123232123232121232123212321212121212121212123212321212121232123214121212123212321212121212323212323212123212321232121212121212121212321232121212123212321412121212321232121212121232321232321212321232123212121212121212121232123212121;CP=1;O;
+ # MU;P0=-1485;P1=967;P2=236;P3=-21536;D=010201020131010101020102010101010102020102020101020102010201010101010101010102010201010101020102013101010102010201010101010202010202010102010201020101010101010101010201020101010102010201;CP=1;
+ {
+ name => 'NANO_DS1820_4Fach',
+ comment => 'self build sensor',
+ id => '77',
+ knownFreqs => '',
+ developId => 'y',
+ zero => [4,-6],
+ one => [1,-6],
+ clockabs => 250,
+ format => 'pwm', #
+ preamble => 'TX', # prepend to converted message
+ clientmodule => 'CUL_TX',
+ modulematch => '^TX......',
+ length_min => '43',
+ length_max => '44',
+ remove_zero => 1, # Removes leading zeros from output
+ },
+ "78" => ## geiger blind motors
+ # MU;P0=313;P1=1212;P2=-309;P4=-2024;P5=-16091;P6=2014;D=01204040562620404626204040404040462046204040562620404626204040404040462046204040562620404626204040404040462046204040562620404626204040404040462046204040;CP=0;R=236;)
+ # https://forum.fhem.de/index.php/topic,39153.0.html
+ {
+ name => 'geiger',
+ comment => 'geiger blind motors',
+ id => '78',
+ knownFreqs => '',
+ developId => 'y',
+ zero => [1,-6.6],
+ one => [6.6,-1],
+ start => [-53],
+ clockabs => 300,
+ format => 'twostate',
+ preamble => 'u78#', # prepend to converted message
+ clientmodule => 'SIGNALduino_un',
+ #modulematch => '^TX......',
+ length_min => '14',
+ length_max => '18',
+ paddingbits => '2' # pad 1 bit, default is 4
+ },
+ "79" => ## Heidemann | Heidemann HX | VTX-BELL
+ # https://github.com/RFD-FHEM/SIGNALDuino/issues/84
+ # MU;P0=656;P1=-656;P2=335;P3=-326;P4=-5024;D=0123012123012303030301 24 230123012123012303030301 24 230123012123012303030301 24 2301230121230123030303012423012301212301230303030124230123012123012303030301242301230121230123030303012423012301212301230303030124230123012123012303030301242301230121230123030303;CP=2;O;
+ # https://forum.fhem.de/index.php/topic,64251.0.html
+ # MU;P0=540;P1=-421;P2=-703;P3=268;P4=-4948;D=4 323102323101010101010232 34 323102323101010101010232 34 323102323101010101010232 34 3231023231010101010102323432310232310101010101023234323102323101010101010232343231023231010101010102323432310232310101010101023234323102323101010101010232343231023231010101010;CP=3;O;
+ # https://github.com/RFD-FHEM/RFFHEM/issues/252
+ # MU;P0=-24096;P1=314;P2=-303;P3=615;P4=-603;P5=220;P6=-4672;D=0123456123412341414141412323234 16 123412341414141412323234 16 12341234141414141232323416123412341414141412323234161234123414141414123232341612341234141414141232323416123412341414141412323234161234123414141414123232341612341234141414141232323416123412341414;CP=1;R=26;O;
+ # MU;P0=-10692;P1=602;P2=-608;P3=311;P4=-305;P5=-4666;D=01234123232323234141412 35 341234123232323234141412 35 341234123232323234141412 35 34123412323232323414141235341234123232323234141412353412341232323232341414123534123412323232323414141235341234123232323234141412353412341232323232341414123534123412323232323414;CP=3;R=47;O;
+ # MU;P0=-7152;P1=872;P2=-593;P3=323;P4=-296;P5=622;P6=-4650;D=01234523232323234545452 36 345234523232323234545452 36 345234523232323234545452 36 34523452323232323454545236345234523232323234545452363452345232323232345454523634523452323232323454545236345234523232323234545452363452345232323232345454523634523452323232323454;CP=3;R=26;O;
+ # https://forum.fhem.de/index.php/topic,58397.msg879878.html#msg879878
+ # MU;P0=-421;P1=344;P2=-699;P4=659;P6=-5203;P7=259;D=1612121040404040404040421216121210404040404040404212161212104040404040404042121612121040404040404040421216121210404040404040404272761212104040404040404042121612121040404040404040421216121210404040404040404212167272104040404040404042721612127040404040404;CP=4;R=0;O;
+ {
+ name => 'wireless doorbell',
+ comment => 'Heidemann | Heidemann HX | VTX-BELL',
+ id => '79',
+ knownFreqs => '',
+ zero => [-2,1],
+ one => [-1,2],
+ start => [-15,1],
+ clockabs => 330,
+ format => 'twostate', #
+ preamble => 'P79#', # prepend to converted message
+ clientmodule => 'SD_BELL',
+ modulematch => '^P79#.*',
+ length_min => '12',
+ length_max => '12',
+ },
+ "80" => ## EM1000WZ (Energy-Monitor) Funkprotokoll (868Mhz), @HomeAutoUser | Derwelcherichbin
+ # https://github.com/RFD-FHEM/RFFHEM/issues/253
+ # MU;P1=-417;P2=385;P3=-815;P4=-12058;D=42121212121212121212121212121212121232321212121212121232321212121212121232323212323212321232121212321212123232121212321212121232323212121212121232121212121212121232323212121212123232321232121212121232123232323212321;CP=2;R=87;
+ {
+ name => 'EM1000WZ',
+ comment => 'EM (Energy-Monitor)',
+ id => '80',
+ knownFreqs => '868.35',
+ one => [1,-2], # 800
+ zero => [1,-1], # 400
+ clockabs => 400,
+ format => 'twostate', # not used now
+ clientmodule => 'CUL_EM',
+ preamble => 'E',
+ length_min => '104',
+ length_max => '114',
+ postDemodulation => \&SIGNALduino_postDemo_EM,
+ },
+ "81" => ## Remote control SA-434-1 based on HT12E @ elektron-bbs
+ # MU;P0=-485;P1=188;P2=-6784;P3=508;P5=1010;P6=-974;P7=-17172;D=0123050505630505056305630563730505056305050563056305637305050563050505630563056373050505630505056305630563730505056305050563056305637305050563050505630563056373050505630505056305630563730505056305050563056305637305050563050505630563056373050505630505056;CP=3;R=0;
+ # MU;P0=-1756;P1=112;P2=-11752;P3=496;P4=-495;P5=998;P6=-988;P7=-17183;D=0123454545634545456345634563734545456345454563456345637345454563454545634563456373454545634545456345634563734545456345454563456345637345454563454545634563456373454545634545456345634563734545456345454563456345637345454563454545634563456373454545634545456;CP=3;R=0;
+ # __ ____
+ # ____| | __| |
+ # Bit 1 Bit 0
+ # short 500 microSec / long 1000 microSec / bittime 1500 mikroSek / pilot 12 * bittime, from that 1/3 bitlength high
+ {
+ name => 'SA-434-1',
+ comment => 'remote control SA-434-1 mini 923301 based on HT12E',
+ id => '81',
+ knownFreqs => '433.92',
+ one => [-2,1], # i.O.
+ zero => [-1,2], # i.O.
+ start => [-35,1], # Message is not provided as MS, worakround is start
+ clockabs => 500,
+ format => 'twostate',
+ preamble => 'P81#', # prepend to converted message
+ modulematch => '^P81#.{3}',
+ clientmodule => 'SD_UT',
+ length_min => '12',
+ length_max => '12',
+ },
+ "82" => ## Fernotron shutters and light switches
+ # https://github.com/RFD-FHEM/RFFHEM/issues/257
+ # MU;P0=-32001;P1=435;P2=-379;P4=-3201;P5=831;P6=-778;D=01212121212121214525252525252521652161452525252525252161652141652521652521652521614165252165252165216521416521616165216525216141652161616521652165214165252161616521652161416525216161652161652141616525252165252521614161652525216525216521452165252525252525;CP=1;O;
+ # the messages received are usual missing 12 bits at the end for some reason. So the checksum byte is missing.
+ # Fernotron protocol is unidirectional. Here we can only receive messages from controllers send to receivers.
+ {
+ name => 'Fernotron',
+ comment => 'shutters and light switches',
+ id => '82', # protocol number
+ knownFreqs => '',
+ developId => 'm',
+ dispatchBin => '1',
+ paddingbits => '1', # disable padding
+ one => [1,-2], # on=400us, off=800us
+ zero => [2,-1], # on=800us, off=400us
+ float => [1,-8], # on=400us, off=3200us. the preamble and each 10bit word has one [1,-8] in front
+ pause => [1,-1], # preamble (5x)
+ clockabs => 400, # 400us
+ format => 'twostate',
+ preamble => 'P82#', # prepend our protocol number to converted message
+ clientmodule => 'Fernotron',
+ length_min => '100', # actual 120 bit (12 x 10bit words to decode 6 bytes data), but last 20 are for checksum
+ length_max => '3360', # 3360 bit (336 x 10bit words to decode 168 bytes data) for full timer message
+ },
+ "83" => ## Remote control RH787T based on MOSDESIGN SEMICONDUCTOR CORP (CMOS ASIC encoder) M1EN compatible HT12E
+ # for example Westinghouse Deckenventilator Delancey, 6 speed buttons, @zwiebelxxl
+ # https://github.com/RFD-FHEM/RFFHEM/issues/250
+ # Taste 1 MU;P0=388;P1=-112;P2=267;P3=-378;P5=585;P6=-693;P7=-11234;D=0123035353535356262623562626272353535353562626235626262723535353535626262356262627235353535356262623562626272353535353562626235626262723535353535626262356262627235353535356262623562626272353535353562626235626262723535353535626262356262627235353535356262;CP=2;R=43;O;
+ # Taste 2 MU;P0=-176;P1=262;P2=-11240;P3=112;P5=-367;P6=591;P7=-695;D=0123215656565656717171567156712156565656567171715671567121565656565671717156715671215656565656717171567156712156565656567171715671567121565656565671717156715671215656565656717171567156712156565656567171715671567121565656565671717171717171215656565656717;CP=1;R=19;O;
+ # Taste 3 MU;P0=564;P1=-392;P2=-713;P3=245;P4=-11247;D=0101010101023231023232323431010101010232310232323234310101010102323102323232343101010101023231023232323431010101010232310232323234310101010102323102323232343101010101023231023232323431010101010232310232323234310101010102323102323232343101010101023231023;CP=3;R=40;O;
+ {
+ name => 'RH787T',
+ comment => 'remote control for example Westinghouse Delancey 7800140',
+ id => '83',
+ knownFreqs => '',
+ one => [-2,1],
+ zero => [-1,2],
+ start => [-35,1], # calculated 12126,31579 µS
+ clockabs => 335, # calculated ca 336,8421053 µS short - 673,6842105µS long
+ format => 'twostate', # there is a pause puls between words
+ preamble => 'P83#', # prepend to converted message
+ clientmodule => 'SD_UT',
+ modulematch => '^P83#.{3}',
+ length_min => '12',
+ length_max => '12',
+ },
+ "84" => ## Funk Wetterstation Auriol IAN 283582 Version 06/2017 (Lidl), Modell-Nr.: HG02832D, 09/2018@roobbb
+ # https://github.com/RFD-FHEM/RFFHEM/issues/263
+ # MU;P0=-28796;P1=376;P2=-875;P3=834;P4=220;P5=-632;P6=592;P7=-268;D=0123232324545454545456767454567674567456745674545454545456767676767674567674567676767456;CP=4;R=22;
+ # MU;P0=-28784;P1=340;P2=-903;P3=814;P4=223;P5=-632;P6=604;P7=-248;D=0123232324545454545456767456745456767674545674567454545456745454545456767454545456745676;CP=4;R=22;
+ # MU;P0=-21520;P1=235;P2=-855;P3=846;P4=620;P5=-236;P7=-614;D=012323232454545454545451717451717171745171717171717171717174517171745174517174517174545;CP=1;R=217;
+ ## Sempre 92596/65395, Hofer/Aldi, WS97210-1, WS97230-1, WS97210-2, WS97230-2
+ # https://github.com/RFD-FHEM/RFFHEM/issues/223
+ # MU;P0=11916;P1=-852;P2=856;P3=610;P4=-240;P5=237;P6=-610;D=01212134563456563434565634565634343456565634565656565634345634565656563434563456343430;CP=5;R=254;
+ # MU;P0=-30004;P1=815;P2=-910;P3=599;P4=-263;P5=234;P6=-621;D=0121212345634565634345656345656343456345656345656565656343456345634563456343434565656;CP=5;R=5;
+ {
+ name => 'IAN 283582',
+ comment => 'Weatherstation Auriol IAN 283582 / Sempre 92596/65395',
+ id => '84',
+ knownFreqs => '',
+ one => [3,-1],
+ zero => [1,-3],
+ start => [4,-4,4,-4,4,-4],
+ clockabs => 215,
+ format => 'twostate',
+ preamble => 'W84#', # prepend to converted message
+ postamble => '', # append to converted message
+ clientmodule => 'SD_WS',
+ length_min => '39', # das letzte Bit fehlt meistens
+ length_max => '40',
+ },
+ "85" => ## Funk Wetterstation TFA 35.1140.01 mit Temperatur-/Feuchte- und Windsensor TFA 30.3222.02 09/2018@Iron-R
+ # https://github.com/RFD-FHEM/RFFHEM/issues/266
+ # MU;P0=-509;P1=474;P2=-260;P3=228;P4=718;P5=-745;D=01212303030303012301230123012301230301212121230454545453030303012123030301230303012301212123030301212303030303030303012303012303012303012301212303030303012301230123012301230301212121212454545453030303012123030301230303012301212123030301212303030303030303;CP=3;R=46;O;
+ # MU;P0=-504;P1=481;P2=-254;P3=227;P4=723;P5=-739;P6=-1848;D=01230121212303030121230303030303030453030303012123030301230303012301212303030303030304530303030121230303012303030123012121230303012123030303030303030123030123030123030123012123030303030123012301230123012303012121212364545454530303030121230303012303030123;CP=3;R=45;O;
+ # MU;P0=7944;P1=-724;P2=742;P3=241;P4=-495;P5=483;P6=-248;D=01212121343434345656343434563434345634565656343434565634343434343434345634345634345634343434343434343434345634565634345656345634343456563421212121343434345656343434563434345634565656343434565634343434343434345634345634345634343434343434343434345634565634;CP=3;R=47;O;�
+ {
+ name => 'TFA 30.3222.02',
+ comment => 'Combisensor for Weatherstation TFA 35.1140.01',
+ id => '85',
+ knownFreqs => '',
+ one => [2,-1],
+ zero => [1,-2],
+ start => [3,-3,3,-3,3,-3],
+ clockabs => 250,
+ format => 'twostate',
+ preamble => 'W85#', # prepend to converted message
+ postamble => '', # append to converted message
+ clientmodule => 'SD_WS',
+ length_min => '64',
+ length_max => '68',
+ },
+ "86" => ### for remote controls: Novy 840029, CAME TOP 432EV, OSCH & Neff Transmitter SF01 01319004
+ ### CAME TOP 432EV 433,92 MHz für z.B. Drehtor Antrieb:
+ # https://forum.fhem.de/index.php/topic,63370.msg849400.html#msg849400
+ # https://github.com/RFD-FHEM/RFFHEM/issues/151
+ # MU;P0=711;P1=-15288;P4=132;P5=-712;P6=316;P7=-313;D=4565656705656567056567056 16 565656705656567056567056 16 56565670565656705656705616565656705656567056567056165656567056565670565670561656565670565656705656705616565656705656567056567056165656567056565670565670561656565670565656705656705616565656705656567056;CP=6;R=52;
+ # MU;P0=-322;P1=136;P2=-15241;P3=288;P4=-735;P6=723;D=012343434306434343064343430623434343064343430643434306 2343434306434343064343430 623434343064343430643434306234343430643434306434343062343434306434343064343430623434343064343430643434306234343430643434306434343062343434306434343064343430;CP=3;R=27;
+ # MU;P0=-15281;P1=293;P2=-745;P3=-319;P4=703;P5=212;P6=152;P7=-428;D=0 1212121342121213421213421 01 212121342121213421213421 01 21212134212121342121342101212121342121213421213421012121213421212134212134210121243134212121342121342101252526742121213425213421012121213421212134212134210121212134212;CP=1;R=23;
+ # rechteTaste: 0x112 (000100010010), linkeTaste: 0x111 (000100010001), the least significant bits distinguish the keys
+ ### remote control Novy 840029 for Novy Pureline 6830 kitchen hood:
+ # https://github.com/RFD-FHEM/RFFHEM/issues/331
+ # light on/off button # MU;P0=710;P1=353;P2=-403;P4=-761;P6=-16071;D=20204161204120412041204120414141204120202041612041204120412041204141412041202020416120412041204120412041414120412020204161204120412041204120414141204120202041;CP=1;R=40;
+ # plus button # MU;P0=22808;P1=-24232;P2=701;P3=-765;P4=357;P5=-15970;P7=-406;D=012345472347234723472347234723454723472347234723472347234547234723472347234723472345472347234723472347234723454723472347234723472347234;CP=4;R=39;
+ # minus button # MU;P0=-8032;P1=364;P2=-398;P3=700;P4=-760;P5=-15980;D=0123412341234123412341412351234123412341234123414123512341234123412341234141235123412341234123412341412351234123412341234123414123;CP=1;R=40;
+ # power button # MU;P0=-756;P1=718;P2=354;P3=-395;P4=-16056;D=01020202310231310202 42 310231023102310231020202310231310202 42 31023102310231023102020231023131020242310231023102310231020202310231310202;CP=2;R=41;
+ # novy button # MU;P0=706;P1=-763;P2=370;P3=-405;P4=-15980;D=0123012301230304230123012301230123012303042;CP=2;R=42;
+ ### Neff Transmitter SF01 01319004 (SF01_01319004) 433,92 MHz
+ # https://github.com/RFD-FHEM/RFFHEM/issues/376
+ # MU;P0=-707;P1=332;P2=-376;P3=670;P5=-15243;D=01012301232323230123012301232301010123510123012323232301230123012323010101235101230123232323012301230123230101012351012301232323230123012301232301010123510123012323232301230123012323010101235101230123232323012301230123230101012351012301232323230123012301;CP=1;R=3;O;
+ # MU;P0=-32001;P1=348;P2=-704;P3=-374;P4=664;P5=-15255;D=01213421343434342134213421343421213434512134213434343421342134213434212134345121342134343434213421342134342121343451213421343434342134213421343421213434512134213434343421342134213434212134345121342134343434213421342134342121343451213421343434342134213421;CP=1;R=15;O;
+ # MU;P0=-32001;P1=326;P2=-721;P3=-385;P4=656;P5=-15267;D=01213421343434342134213421343421342134512134213434343421342134213434213421345121342134343434213421342134342134213451213421343434342134213421343421342134512134213434343421342134213434213421345121342134343434213421342134342134213451213421343434342134213421;CP=1;R=10;O;
+ # MU;P0=-372;P1=330;P2=684;P3=-699;P4=-14178;D=010231020202023102310231020231310231413102310202020231023102310202313102314;CP=1;R=253;
+ # MU;P0=-710;P1=329;P2=-388;P3=661;P4=-14766;D=01232301410123012323232301230123012323012323014;CP=1;R=1;
+ ### BOSCH Transmitter SF01 01319004 (SF01_01319004_Typ2) 433,92 MHz
+ # MU;P0=706;P1=-160;P2=140;P3=-335;P4=-664;P5=385;P6=-15226;P7=248;D=01210103045303045453030304545453030454530653030453030454530303045454530304747306530304530304545303030454545303045453065303045303045453030304545453030454530653030453030454530303045454530304545306530304530304545303030454545303045453065303045303045453030304;CP=5;O;
+ # MU;P0=-15222;P1=379;P2=-329;P3=712;P6=-661;D=30123236123236161232323616161232361232301232361232361612323236161612323612323012323612323616123232361616123236123230123236123236161232323616161232361232301232361232361612323236161612323612323012323612323616123232361616123236123230123236123236161232323616;CP=1;O;
+ # MU;P0=705;P1=-140;P2=-336;P3=-667;P4=377;P5=-15230;P6=248;D=01020342020343420202034343420202020345420203420203434202020343434202020203654202034202034342020203434342020202034542020342020343420202034343420202020345420203420203434202020343434202020203454202034202034342020203434342020202034542020342020343420202034343;CP=4;O;
+ # MU;P0=704;P1=-338;P2=-670;P3=378;P4=-15227;P5=244;D=01023231010102323231010102310431010231010232310101023232310101025104310102310102323101010232323101010231043101023101023231010102323231010102310431010231010232310101023232310101023104310102310102323101010232323101010231043101023101023231010102323231010102;CP=3;O;
+ # MU;P0=-334;P1=709;P2=-152;P3=-663;P4=379;P5=-15226;P6=250;D=01210134010134340101013434340101340134540101340101343401010134343401013601365401013401013434010101343434010134013454010134010134340101013434340101340134540101340101343401010134343401013401345401013401013434010101343434010134013454010134010134340101013434;CP=4;O;
+ {
+ name => 'BOSCH | CAME | Novy | Neff',
+ comment => 'remote control CAME TOP 432EV, Novy 840029, BOSCH or Neff SF01 01319004',
+ id => '86',
+ knownFreqs => '',
+ one => [-2,1],
+ zero => [-1,2],
+ start => [-44,1],
+ clockabs => 350,
+ format => 'twostate',
+ preamble => 'P86#', # prepend to converted message
+ clientmodule => 'SD_UT',
+ #modulematch => '^P86#.*',
+ length_min => '12',
+ length_max => '18',
+ },
+ "87" => ## JAROLIFT Funkwandsender TDRC 16W / TDRCT 04W
+ # https://github.com/RFD-FHEM/RFFHEM/issues/380
+ # MS;P1=1524;P2=-413;P3=388;P4=-3970;P5=-815;P6=778;P7=-16024;D=34353535623562626262626235626262353562623535623562626235356235626262623562626262626262626262626262623535626235623535353535626262356262626262626267123232323232323232323232;CP=3;SP=4;R=226;O;m2;
+ # MS;P0=-15967;P1=1530;P2=-450;P3=368;P4=-3977;P5=-835;P6=754;D=34353562623535623562623562356262626235353562623562623562626235353562623562626262626262626262626262623535626235623535353535626262356262626262626260123232323232323232323232;CP=3;SP=4;R=229;O;
+ {
+ name => 'JAROLIFT',
+ comment => 'remote control JAROLIFT TDRC_16W / TDRCT_04W',
+ id => '87',
+ knownFreqs => '433.92',
+ one => [1,-2],
+ zero => [2,-1],
+ preSync => [3.8,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1],
+ sync => [1,-10], # this is a end marker, but we use this as a start marker
+ pause => [-40],
+ clockabs => 400, # ca 400us
+ developId => 'y',
+ format => 'twostate',
+ preamble => 'u87#', # prepend to converted message
+ #clientmodule => '',
+ #modulematch => '',
+ length_min => '72', # 72
+ length_max => '85', # 85
+ },
+ "88" => ## Roto Dachfensterrolladen | Aurel Fernbedienung "TX-nM-HCS" (HCS301 Chip) | three buttons -> up, Stop, down
+ # https://forum.fhem.de/index.php/topic,91244.0.html
+ # MS;P1=361;P2=-435;P4=-4018;P5=-829;P6=759;P7=-16210;D=141562156215156262626215151562626215626215621562151515621562151515156262156262626215151562156215621515151515151562151515156262156215171212121212121212121212;CP=1;SP=4;R=66;O;m0;
+ # MS;P0=-16052;P1=363;P2=-437;P3=-4001;P4=-829;P5=755;D=131452521452145252521452145252521414141452521452145214141414525252145252145252525214141452145214521414141414141452141414145252145252101212121212121212121212;CP=1;SP=3;R=51;O;m1;
+ {
+ name => 'Roto shutter',
+ comment => 'remote control Aurel TX-nM-HCS',
+ id => '88',
+ knownFreqs => '',
+ one => [1,-2],
+ zero => [2,-1],
+ sync => [1,-10], # this is a end marker, but we use this as a start marker
+ clockabs => 400, # ca 400us
+ developId => 'y',
+ format => 'twostate',
+ preamble => 'u88#', # prepend to converted message
+ #clientmodule => '',
+ #modulematch => '',
+ length_min => '65',
+ length_max => '78',
+ },
+ "89" => ## Funk Wetterstation TFA 35.1140.01 mit Temperatur-/Feuchtesensor TFA 30.3221.02 12/2018@Iron-R
+ # https://github.com/RFD-FHEM/RFFHEM/issues/266
+ # MU;P0=-900;P1=390;P2=-499;P3=-288;P4=193;P7=772;D=1213424213131342134242424213134242137070707013424213134242131342134242421342424213421342131342421313134213424242421313424213707070701342421313424213134213424242134242421342134213134242131313421342424242131342421;CP=4;R=43;
+ # MU;P0=-491;P1=382;P2=-270;P3=179;P4=112;P5=778;P6=-878;D=01212304012123012303030123030301230123012303030121212301230301230121212121256565656123030121230301212301230303012303030123012301230303012121230123030123012121212125656565612303012123030121230123030301230303012301230123030301212123012303012301212121212565;CP=3;R=43;O;
+ # MU;P0=-299;P1=384;P2=169;P3=-513;P5=761;P6=-915;D=01023232310101010101023565656561023231010232310102310232323102323231023231010232323101010102323231010101010102356565656102323101023231010231023232310232323102323101023232310101010232323101010101010235656565610232310102323101023102323231023232310232310102;CP=2;R=43;O;
+ # MU;P0=-32001;P1=412;P2=-289;P3=173;P4=-529;P5=777;P6=-899;D=01234345656541212341234123434121212121234123412343412343456565656121212123434343434343412343412343434121234123412343412121212123412341234341234345656565612121212343434343434341234341234343412123412341234341212121212341234123434123434565656561212121234343;CP=3;R=22;O;
+ # MU;P0=22960;P1=-893;P2=775;P3=409;P4=-296;P5=182;P6=-513;D=01212121343434345656565656565634565634565656343456563434565634343434345656565656565656342121212134343434565656565656563456563456565634345656343456563434343434565656565656565634212121213434343456565656565656345656345656563434565634345656343434343456565656;CP=5;R=22;O;
+ # MU;P0=172;P1=-533;P2=401;P3=-296;P5=773;P6=-895;D=01230101230101012323010101230123010101010101230101230101012323010101230123010301230101010101012301012301010123230101012301230101010123010101010101012301565656562323232301010101010101230101230101012323010101230123010101012301010101010101230156565656232323;CP=0;R=23;O;
+ {
+ name => 'TFA 30.3221.02',
+ comment => 'temperature / humidity sensor for weatherstation TFA 35.1140.01',
+ id => '89',
+ knownFreqs => '433.92',
+ one => [2,-1],
+ zero => [1,-2],
+ start => [3,-3,3,-3,3,-3],
+ clockabs => 250,
+ format => 'twostate',
+ preamble => 'W89#',
+ postamble => '',
+ clientmodule => 'SD_WS',
+ length_min => '40',
+ length_max => '40',
+ },
+ "90" => ## mumbi m-FS300 / manax MX-RCS250 (CP 258-298)
+ # https://forum.fhem.de/index.php/topic,94327.15.html
+ # MS;P0=-9964;P1=273;P4=-866;P5=792;P6=-343;D=10145614141414565656561414561456561414141456565656561456141414145614;CP=1;SP=0;R=35;O;m2; //A AN
+ # MS;P0=300;P1=-330;P2=-10160;P3=804;P7=-840;D=02073107070707313131310707310731310707070731313107310731070707070707;CP=0;SP=2;R=23;O;m1; //A AUS
+ # MS;P1=260;P2=-873;P3=788;P4=-351;P6=-10157;D=16123412121212343434341212341234341212121234341234341234121212341212;CP=1;SP=6;R=21;O;m2; //B AN
+ # MS;P1=268;P3=793;P4=-337;P6=-871;P7=-10159;D=17163416161616343434341616341634341616161634341616341634161616343416;CP=1;SP=7;R=24;O;m2; //B AUS
+ {
+ name => 'mumbi | MANAX',
+ comment => 'remote control mumbi FS300, MANAX MX-RCS250 (only receive)',
+ id => '90',
+ knownFreqs => '433.92',
+ one => [3,-1],
+ zero => [1,-3],
+ sync => [1,-36],
+ clockabs => 280, # -1=auto
+ format => 'twostate',
+ preamble => 'P90#',
+ length_min => '33',
+ length_max => '36',
+ clientmodule => 'SD_UT',
+ modulematch => '^P90#.*',
+ },
+ "91" => ## Atlantic Security / Focus Security China Devices
+ # https://forum.fhem.de/index.php/topic,58397.msg876862.html#msg876862
+ # MU;P0=800;P1=-813;P2=394;P3=-410;P4=-3992;D=0123030303030303012121230301212304230301212301230301212123012301212303012301230303030303030121212303012123042303012123012303012121230123012123030123012303030303030301212123030121230;CP=2;R=46;
+ # MU;P0=406;P1=-402;P2=802;P3=-805;P4=-3994;D=012123012301212121212121230303012123030124012123030123012123030301230123030121230123012121212121212303030121230301240121230301230121230303012301230301212301230121212121212123030301212303012;CP=0;R=52;
+ # MU;P0=14292;P1=-10684;P2=398;P3=-803;P4=-406;P5=806;P6=-4001;D=01232324532453232454532453245454532324545323232453245324562454532324532454532323245324532324545324532454545323245453232324532453245624545323245324545323232453245323245453245324545453232454532323245324532456245453232453245453232324532453232454532453245454;CP=2;R=50;O;
+ {
+ name => 'Atlantic security',
+ comment => 'example sensor MD-210R | MD-2018R | MD-2003R (MU decode)',
+ id => '91',
+ knownFreqs => '433.92 | 868.35',
+ one => [-2,1],
+ zero => [-1,2],
+ start => [-10,1],
+ clockabs => 400,
+ format => 'twostate', #
+ preamble => 'P91#', # prepend to converted message
+ length_min => '36',
+ length_max => '36',
+ clientmodule => 'SD_UT',
+ #modulematch => '^P91#.*',
+ developID => 'y',
+ },
+ "91.1" => ## Atlantic Security / Focus Security China Devices
+ # https://forum.fhem.de/index.php/topic,58397.msg878008.html#msg878008
+ # MS;P0=-399;P1=407;P2=820;P3=-816;P4=-4017;D=14131020231020202313131023131313131023102023131313131310202313131020202313;CP=1;SP=4;O;m0;
+ # MS;P1=392;P2=-824;P3=-416;P4=804;P5=-4034;D=15121343421343434212121342121212121342134342121212121213434212121343434212;CP=1;SP=5;e;m2;
+ {
+ name => 'Atlantic security',
+ comment => 'example sensor MD-210R | MD-2018R | MD-2003R (MS decode)',
+ id => '91.1',
+ knownFreqs => '433.92 | 868.35',
+ one => [-2,1],
+ zero => [-1,2],
+ sync => [-10,1],
+ clockabs => 400,
+ format => 'twostate', #
+ preamble => 'P91.1#', # prepend to converted message
+ length_min => '32',
+ length_max => '36',
+ clientmodule => 'SD_UT',
+ #modulematch => '^P91.1#.*',
+ developID => 'y',
+
+ },
+ "92" => ## KRINNER Lumix - LED X-MAS
+ # https://github.com/RFD-FHEM/RFFHEM/issues/452 | https://forum.fhem.de/index.php/topic,94873.msg876477.html?PHPSESSID=khp4ja64pcqa5gsf6gb63l1es5#msg876477
+ # MU;P0=24188;P1=-16308;P2=993;P3=-402;P4=416;P5=-967;P6=-10162;D=0123234545454523234523234545454545454545232623452345454545454523234523234545454523234523234545454545454545232623452345454545454523234523234545454523234523234545454545454545232623452345454545454523234523234545454523234523234545454545454545232;CP=4;R=25;
+ # MU;P0=11076;P1=-20524;P2=281;P3=-980;P4=982;P5=-411;P6=408;P7=-10156;D=0123232345456345456363636363636363634745634563636363636345456345456363636345456345456363636363636363634745634563636363636345456345456363636345456345456363636363636363634745634563636363636345456345456363636345456345456363636363636363634;CP=6;R=38;
+ {
+ name => 'KRINNER Lumix',
+ comment => 'remote control LED X-MAS',
+ id => '92',
+ knownFreqs => '433.92',
+ zero => [1,-2],
+ one => [2,-1],
+ start => [2,-24],
+ clockabs => 420,
+ format => 'twostate', #
+ preamble => 'P92#', # prepend to converted message
+ length_min => '32',
+ length_max => '32',
+ clientmodule => 'SD_UT',
+ #modulematch => '^P92#.*',
+ },
+ "93" => ## ESTO Lighting GmbH | remote control KL-RF01 with 9 buttons (CP 375-395)
+ # https://github.com/RFD-FHEM/RFFHEM/issues/449
+ # MS;P1=376;P4=-1200;P5=1170;P6=-409;P7=-12224;D=17141414561456561456565656145656141414145614141414565656145656565614;CP=1;SP=7;R=231;e;m0;
+ # MS;P1=393;P2=-1174;P4=1180;P5=-401;P6=-12222;D=16121212451245451245454545124545124545451212121212121212454545454512;CP=1;SP=6;R=243;e;m0;
+ # MS;P0=397;P1=-385;P2=-1178;P3=1191;P4=-12230;D=04020202310231310231313131023131023131020202020202020231313131313102;CP=0;SP=4;R=250;e;m0;
+ {
+ name => 'ESTO Lighting GmbH',
+ comment => 'remote control KL-RF01',
+ id => '93',
+ knownFreqs => '433.92',
+ one => [3,-1],
+ zero => [1,-3],
+ sync => [1,-32],
+ clockabs => 385, # -1=auto
+ format => 'twostate',
+ preamble => 'u93#',
+ length_min => '32', # 2. MSG: 32 Bit, bleibt so
+ length_max => '36', # 1. MSG: 33 Bit, wird verlängert auf 36 Bit
+ #clientmodule => 'SD_UT',
+ #modulematch => '^P93#.*',
+ developId => 'y',
+ },
+);