mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-03-10 09:16:53 +00:00
HM Multi-channel device tuning
git-svn-id: https://svn.fhem.de/fhem/trunk@986 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
d453466a54
commit
7820a39cb5
@ -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});
|
||||
|
@ -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.*/) {
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
###################################
|
||||
|
Loading…
x
Reference in New Issue
Block a user