diff --git a/FHEM/00_CUL.pm b/FHEM/00_CUL.pm index 93451f982..a0780b7cd 100755 --- a/FHEM/00_CUL.pm +++ b/FHEM/00_CUL.pm @@ -688,16 +688,12 @@ CUL_Write($$$) Log 5, "$hash->{NAME} sending $fn$msg"; my $bstring = "$fn$msg"; - if($fn eq "F") { + if($fn eq "F" || # FS20 message + $bstring =~ m/^u....F/ || # FS20 messages sent over an RFR + ($fn eq "" && $bstring =~ m/^A/)) { # AskSin/BidCos/HomeMatic CUL_AddFS20Queue($hash, $bstring); - } elsif($bstring =~ m/u....F/) { - # put FS20 messages sent over an RFR in the common queue - - CUL_AddFS20Queue($hash, $bstring); - - } else { CUL_SimpleWrite($hash, $bstring); @@ -712,10 +708,13 @@ CUL_SendFromQueue($$) my ($hash, $bstring) = @_; my $name = $hash->{NAME}; + my $hm = ($bstring =~ m/^A/); + my $to = ($hm ? 0.15 : 0.3); + if($bstring ne "") { - # Is one of the CUL-fellows sending data? - if($attr{$name} && $attr{$name}{sendpool}) { - my @fellows = split(",", $attr{$name}{sendpool}); + my $sp = AttrVal($name, "sendpool", undef); + if($sp) { # Is one of the CUL-fellows sending data? + my @fellows = split(",", $sp); foreach my $f (@fellows) { if($f ne $name && $defs{$f} && @@ -723,12 +722,12 @@ CUL_SendFromQueue($$) $defs{$f}{QUEUE}->[0] ne "") { unshift(@{$hash->{QUEUE}}, ""); - InternalTimer(gettimeofday()+0.3, "CUL_HandleWriteQueue", $hash, 1); + InternalTimer(gettimeofday()+$to, "CUL_HandleWriteQueue", $hash, 1); return; } } } - CUL_XmitLimitCheck($hash,$bstring); + CUL_XmitLimitCheck($hash,$bstring) if(!$hm); CUL_SimpleWrite($hash, $bstring); } @@ -736,7 +735,7 @@ CUL_SendFromQueue($$) # Write the next buffer not earlier than 0.23 seconds # = 3* (12*0.8+1.2+1.0*5*9+0.8+10) = 226.8ms # else it will be sent too early by the CUL, resulting in a collision - InternalTimer(gettimeofday()+0.3, "CUL_HandleWriteQueue", $hash, 1); + InternalTimer(gettimeofday()+$to, "CUL_HandleWriteQueue", $hash, 1); } sub @@ -941,7 +940,11 @@ CUL_SimpleWrite(@) # Prefix $msg with RRBBU and return the corresponding CUL hash. ($hash, $msg) = CUL_RFR_AddPrefix($hash, $msg); } - #Log 1, "SW: $msg"; + + my $name = $hash->{NAME}; + my $ll5 = GetLogLevel($name,5); + Log $ll5, "SW: $msg"; + $msg .= "\n" unless($nonl); $hash->{USBDev}->write($msg) if($hash->{USBDev}); diff --git a/FHEM/00_HMLAN.pm b/FHEM/00_HMLAN.pm index 692f46928..82e27ea87 100755 --- a/FHEM/00_HMLAN.pm +++ b/FHEM/00_HMLAN.pm @@ -266,7 +266,7 @@ HMLAN_Parse($$) my $dmsg = $rmsg; - Log $ll5, "HMLAN $rmsg"; + Log $ll5, "HMLAN_Parse: $name $rmsg"; if($rmsg =~ m/^E(......),(....),(........),(..),(....),(.*)/) { ($src, $status, $msec, $d2, $rssi, $msg) = ($1, $2, $3, $4, $5, $6); @@ -289,6 +289,11 @@ HMLAN_Parse($$) $hash->{firmware} = sprintf("%d.%d", ($vers>>12)&0xf, $vers & 0xffff); $hash->{owner} = $owner; $hash->{uptime} = HMLAN_uptime($msec); + my $myId = AttrVal($name, "hmId", $owner); + if($owner ne $myId && !AttrVal($name, "dummy", 0)) { + Log 1, "HMLAN setting owner to $myId from $owner"; + HMLAN_SimpleWrite($hash, "A$myId"); + } return; } elsif($rmsg =~ m/^I00.*/) { diff --git a/FHEM/10_CUL_HM.pm b/FHEM/10_CUL_HM.pm index b93bd2d6b..3011d4192 100755 --- a/FHEM/10_CUL_HM.pm +++ b/FHEM/10_CUL_HM.pm @@ -131,7 +131,7 @@ CUL_HM_Initialize($) "swi,pushButton,threeStateSensor,motionDetector,". "keyMatic,winMatic,smokeDetector " . "hmClass:receiver,sender serialNr firmware devInfo ". - "rawToReadable unit follow-on-for-timer"; + "rawToReadable unit"; } @@ -238,14 +238,6 @@ CUL_HM_Parse($$) my $name = $shash->{NAME}; my @event; - my $isack; - if($shash->{ackWaiting}) { - delete($shash->{ackWaiting}); - delete($shash->{ackCmdSent}); - RemoveInternalTimer($shash); - $isack = 1; - } - my $st = AttrVal($name, "subType", ""); my $model = AttrVal($name, "model", ""); my $tn = TimeNow(); @@ -565,6 +557,13 @@ CUL_HM_Parse($$) $shash->{CHANGED} = \@changed; $shash->{lastMsg} = $msgX; + + if($shash->{ackWaiting}) { + delete($shash->{ackWaiting}); + delete($shash->{ackCmdSent}); + RemoveInternalTimer($shash); + } + return $name; } @@ -619,12 +618,10 @@ CUL_HM_Set($@) my $cmd = $a[1]; my $dst = $hash->{DEF}; my $chn = "01"; - my $shash = $hash; if(length($dst) == 8) { # shadow switch device for multi-channel switch $chn = substr($dst, 6, 2); $dst = substr($dst, 0, 6); - $shash = $modules{CUL_HM}{defptr}{$dst}; } my $h = $culHmGlobalSets{$cmd}; @@ -655,17 +652,15 @@ CUL_HM_Set($@) } - my $id = CUL_HM_Id($shash->{IODev}); + my $id = CUL_HM_Id($hash->{IODev}); my $sndcmd; my $state = join(" ", @a[1..(int(@a)-1)]); - CommandDelete(undef, $name."_fortimer") if($defs{"${name}_fortimer"}); - if($cmd eq "raw") { ################################################## return "Usage: set $a[0] $cmd data [data ...]" if(@a < 3); $sndcmd = $a[2]; for (my $i = 3; $i < @a; $i++) { - CUL_HM_PushCmdStack($shash, $a[$i]); + CUL_HM_PushCmdStack($hash, $a[$i]); } $state = ""; @@ -676,16 +671,16 @@ CUL_HM_Set($@) my $serialNr = AttrVal($name, "serialNr", undef); return "serialNr is not set" if(!$serialNr); $sndcmd = sprintf("++A401%s000000010A%s", $id, unpack("H*",$serialNr)); - $shash->{hmPairSerial} = $serialNr; + $hash->{hmPairSerial} = $serialNr; } elsif($cmd eq "unpair") { ########################################### - CUL_HM_pushConfig($shash, $id, $dst, 0, 0, "02010A000B000C00"); - $sndcmd = shift @{$shash->{cmdStack}}; + CUL_HM_pushConfig($hash, $id, $dst, 0, 0, "02010A000B000C00"); + $sndcmd = shift @{$hash->{cmdStack}}; } elsif($cmd eq "sign") { ############################################ - CUL_HM_pushConfig($shash, $id, $dst, $chn, $chn, + CUL_HM_pushConfig($hash, $id, $dst, $chn, $chn, "08" . ($a[2] eq "on" ? "01":"02")); - $sndcmd = shift @{$shash->{cmdStack}}; + $sndcmd = shift @{$hash->{cmdStack}}; } elsif($cmd eq "statusRequest") { #################################### $sndcmd = sprintf("++A001%s%s%s0E", $id,$dst, $chn); @@ -700,19 +695,11 @@ CUL_HM_Set($@) ($tval,$ret) = CUL_HM_encodeTime16($a[2]); $sndcmd = sprintf("++A011%s%s02%sC80000%s", $id,$dst, $chn, $tval); - if(AttrVal($name, "follow-on-for-timer", undef)) { - my $val = $a[2]; - my $to = sprintf("%02d:%02d:%02d", $val/3600, ($val%3600)/60, $val%60); - Log 4, "Follow: +$to setstate $name off"; -Log 1, "FOFT: $to"; - CommandDefine(undef, $name . "_fortimer at +$to setstate $name off"); - } - } elsif($cmd eq "toggle") { ########################################### - $shash->{toggleIndex} = 1 if(!$shash->{toggleIndex}); - $shash->{toggleIndex} = (($shash->{toggleIndex}+1) % 128); + $hash->{toggleIndex} = 1 if(!$hash->{toggleIndex}); + $hash->{toggleIndex} = (($hash->{toggleIndex}+1) % 128); $sndcmd = sprintf("++A03E%s%s%s40%s%02X", $id, $dst, - $dst, $chn, $shash->{toggleIndex}); + $dst, $chn, $hash->{toggleIndex}); } elsif($cmd eq "pct") { ############################################## $a[1] = 100 if ($a[1] > 100); @@ -838,19 +825,19 @@ Log 1, "FOFT: $to"; # First the remote for(my $i = 1; $i <= 2; $i++) { my $b = ($i==1 ? $b1 : $b2); - CUL_HM_PushCmdStack($shash, "++A001${id}${dst}${b}03"); - CUL_HM_PushCmdStack($shash, "++A001${id}${dst}${b}01${dst2}${chn2}00"); - CUL_HM_PushCmdStack($shash, "++A001${id}${dst}${b}05${dst2}${chn2}04"); - CUL_HM_PushCmdStack($shash, "++A001${id}${dst}${b}080100"); - CUL_HM_PushCmdStack($shash, "++A001${id}${dst}${b}06"); - CUL_HM_PushCmdStack($shash, "++A001${id}${dst}${b}04${dst2}${chn2}04"); + CUL_HM_PushCmdStack($hash, "++A001${id}${dst}${b}03"); + CUL_HM_PushCmdStack($hash, "++A001${id}${dst}${b}01${dst2}${chn2}00"); + CUL_HM_PushCmdStack($hash, "++A001${id}${dst}${b}05${dst2}${chn2}04"); + CUL_HM_PushCmdStack($hash, "++A001${id}${dst}${b}080100"); + CUL_HM_PushCmdStack($hash, "++A001${id}${dst}${b}06"); + CUL_HM_PushCmdStack($hash, "++A001${id}${dst}${b}04${dst2}${chn2}04"); } # Now the switch. $sndcmd = "++A001${id}${dst2}${chn2}01${dst}${b2}${b1}"; CUL_HM_PushCmdStack($dhash, "++A001${id}${dst2}${chn2}04${dst}${b1}03"); CUL_HM_PushCmdStack($dhash, "++A001${id}${dst2}${chn2}04${dst}${b2}03"); - $shash = $dhash; # Exchange the shash, as the switch is always alive. + $hash = $dhash; # Exchange the hash, as the switch is always alive. } @@ -858,7 +845,7 @@ Log 1, "FOFT: $to"; $hash->{STATE} = $state; $hash->{cmdSent} = $state; } - CUL_HM_SendCmd($shash, $sndcmd, 0, 1) if($sndcmd); + CUL_HM_SendCmd($hash, $sndcmd, 0, 1) if($sndcmd); return $ret; } @@ -984,10 +971,13 @@ CUL_HM_SendCmd($$$$) $cmd = sprintf("As%02X%02X%s", length($cmd2)/2+1, $mn, $cmd2); IOWrite($hash, "", $cmd); if($waitforack) { - if($hash->{IODev} && $hash->{IODev}{TYPE} ne "HMLAN") { + my $iohash = $hash->{IODev}; + if($iohash && $iohash->{TYPE} ne "HMLAN") { $hash->{ackWaiting} = $cmd; $hash->{ackCmdSent} = 1; - InternalTimer(gettimeofday()+0.4, "CUL_HM_Resend", $hash, 0) + my $off = 0.5; + $off += 0.15*int(@{$iohash->{QUEUE}}) if($iohash->{QUEUE}); + InternalTimer(gettimeofday()+$off, "CUL_HM_Resend", $hash, 0); } } $cmd =~ m/As(..)(..)(....)(......)(......)(.*)/; @@ -1002,7 +992,6 @@ CUL_HM_PushCmdStack($$) my @arr = (); $hash->{cmdStack} = \@arr if(!$hash->{cmdStack}); push(@{$hash->{cmdStack}}, $cmd); -Log 1, "PushStack: $hash->{NAME} ". @{$hash->{cmdStack}}; } ################################### @@ -1042,7 +1031,7 @@ CUL_HM_Resend($) IOWrite($hash, "", $hash->{ackWaiting}); $hash->{ackCmdSent}++; DoTrigger($name, "resend nr ".$hash->{ackCmdSent}); - InternalTimer(gettimeofday()+0.4, "CUL_HM_Resend", $hash, 0); + InternalTimer(gettimeofday()+0.5, "CUL_HM_Resend", $hash, 0); } ###################################