2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-19 06:36:04 +00:00

HMLAN improvement for normal messging(should not be final!), winmatic read remove-duplicate,WinmaticRegister others

git-svn-id: https://svn.fhem.de/fhem/trunk@2018 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
martinp876 2012-10-25 20:42:40 +00:00
parent 1195ea6763
commit ede70b5150
2 changed files with 504 additions and 449 deletions

View File

@ -45,7 +45,6 @@ HMLAN_Initialize($)
"loglevel:0,1,2,3,4,5,6 addvaltrigger " . "loglevel:0,1,2,3,4,5,6 addvaltrigger " .
"hmId hmKey " . "hmId hmKey " .
"hmProtocolEvents:0_off,1_dump,2_dumpFull,3_dumpTrigger"; "hmProtocolEvents:0_off,1_dump,2_dumpFull,3_dumpTrigger";
} }
##################################### #####################################
@ -199,18 +198,27 @@ sub
HMLAN_Write($$$) HMLAN_Write($$$)
{ {
my ($hash,$fn,$msg) = @_; my ($hash,$fn,$msg) = @_;
my $dst = substr($msg, 16, 6); my $dst = substr($msg, 16, 6);
{ # occationally necessary. Works fine if we do it always
HMLAN_SimpleWrite($hash, "+$dst,00,00,"); # my $IDHM = '+'.$dst.',01,00,F1EF'; #used by HMconfig - meanning??
HMLAN_SimpleWrite($hash, "+$dst,00,00,"); my $IDadd = '+'.$dst.',00,00,'; # guess: add ID?
HMLAN_SimpleWrite($hash, "+$dst,00,00,"); my $IDsub = '-'.$dst; # guess: ID remove?
HMLAN_SimpleWrite($hash, "-$dst"); # my $IDact = '+'.$dst; # guess: ID recover? Different to IDadd?
HMLAN_SimpleWrite($hash, "+$dst,00,00,"); # my $IDack = '+'.$dst.',02,00,'; # guess: ID acknowledge
HMLAN_SimpleWrite($hash, "+$dst,00,00,");
HMLAN_SimpleWrite($hash, "+$dst,00,00,"); HMLAN_SimpleWrite($hash, $IDadd) if (!$lhash{$dst});
HMLAN_SimpleWrite($hash, "+$dst,00,00,"); $lhash{$dst} = 1;
$lhash{$dst} = 1;
if(hex(substr($msg, 6, 2))&0x01){ # wakeup sequence for TC... hmmm
HMLAN_SimpleWrite($hash, $IDadd);
HMLAN_SimpleWrite($hash, $IDadd);
HMLAN_SimpleWrite($hash, $IDadd);
HMLAN_SimpleWrite($hash, $IDsub);
HMLAN_SimpleWrite($hash, $IDadd);
HMLAN_SimpleWrite($hash, $IDadd);
HMLAN_SimpleWrite($hash, $IDadd);
HMLAN_SimpleWrite($hash, $IDadd);
#HMLAN_SimpleWrite($hash, "+$dst,01,00,F1EF\x0d\x0a");
} }
my $tm = int(gettimeofday()*1000) % 0xffffffff; my $tm = int(gettimeofday()*1000) % 0xffffffff;
$msg = sprintf("S%08X,00,00000000,01,%08X,%s",$tm, $tm, substr($msg, 4)); $msg = sprintf("S%08X,00,00000000,01,%08X,%s",$tm, $tm, substr($msg, 4));
@ -218,7 +226,6 @@ HMLAN_Write($$$)
# Avoid problems with structure set # Avoid problems with structure set
# TODO: rewrite it to use a queue+internaltimer like the CUL # TODO: rewrite it to use a queue+internaltimer like the CUL
select(undef, undef, undef, 0.01); # needed for structure set by meesus.
} }
##################################### #####################################
@ -233,7 +240,7 @@ HMLAN_Read($)
my $name = $hash->{NAME}; my $name = $hash->{NAME};
my $hmdata = $hash->{PARTIAL}; my $hmdata = $hash->{PARTIAL};
Log 5, "HMLAN/RAW: $hmdata/$buf"; # Log 5, "HMLAN/RAW: $hmdata/$buf";
$hmdata .= $buf; $hmdata .= $buf;
while($hmdata =~ m/\n/) { while($hmdata =~ m/\n/) {
@ -263,61 +270,65 @@ HMLAN_Parse($$)
my ($hash, $rmsg) = @_; my ($hash, $rmsg) = @_;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
my $ll5 = GetLogLevel($name,5); my $ll5 = GetLogLevel($name,5);
my ($src, $status, $msec, $d2, $rssi, $msg); my @mFld = split(',', $rmsg);
my $letter = substr($mFld[0],0,1); # get leading char
my $dmsg = $rmsg; if ($letter =~ m/^[ER]/){#@mFld=($src, $status, $msec, $d2, $rssi, $msg)
Log $ll5, 'HMLAN_Parse: '.$name.' S:'.$mFld[0]
# .(if($mFld[0] =~ m/^E/)?' ':'')
.' stat:'.$mFld[1]
.' t:'.$mFld[2].' d:'.$mFld[3]
.' r:'.$mFld[4].
'm:'.$mFld[5];
# ' m:'.substr($mFld[5],0,2).
# ' '.substr($mFld[5],2,4).
# ' '.substr($mFld[5],6,6).
# ' '.substr($mFld[5],12,6).
# ' '.substr($mFld[5],18);
Log $ll5, "HMLAN_Parse: $name $rmsg"; my $dmsg = sprintf("A%02X%s", length($mFld[5])/2, uc($mFld[5]));
if($rmsg =~ m/^E(......),(....),(........),(..),(....),(.*)/) {
($src, $status, $msec, $d2, $rssi, $msg) =
($1, $2, $3, $4, $5, $6);
$dmsg = sprintf("A%02X%s", length($msg)/2, uc($msg));
$hash->{uptime} = HMLAN_uptime($msec);
} elsif($rmsg =~ m/^R(........),(....),(........),(..),(....),(.*)/) { my $src = substr($mFld[5],6,6);
($src, $status, $msec, $d2, $rssi, $msg) = my $dst = substr($mFld[5],12,6);
($1, $2, $3, $4, $5, $6); my $flg = hex(substr($mFld[5],2,2));
# handle status. 1-ack,8=nack,21=?,02=? 81=open
$dmsg = sprintf("A%02X%s", length($msg)/2, uc($msg)); HMLAN_SimpleWrite($hash, '+'.$src) if (($letter eq 'R')); #ok
$dmsg .= "NACK" if($status !~ m/00(01|02|21)/);
$hash->{uptime} = HMLAN_uptime($msec); if (!($flg & 0x25)){#rule out other messages
HMLAN_SimpleWrite($hash, '-'.$src);
HMLAN_SimpleWrite($hash, '+'.$src);
}
$dmsg .= "NACK" if($mFld[1] !~ m/00(01|02|21)/ && $letter eq 'R');
} elsif($rmsg =~ $hash->{uptime} = HMLAN_uptime($mFld[2]);
m/^HHM-LAN-IF,(....),(..........),(......),(......),(........),(....)/) { $hash->{RSSI} = hex($mFld[4]);
my ($vers, $serno, $d1, $owner, $msec, $d2) = $hash->{RAWMSG} = $rmsg;
(hex($1), $2, $3, $4, $5, $6); $hash->{"${name}_MSGCNT"}++;
$hash->{serialNr} = $serno; $hash->{"${name}_TIME"} = TimeNow();
$hash->{firmware} = sprintf("%d.%d", ($vers>>12)&0xf, $vers & 0xffff); my %addvals = (RAWMSG => $rmsg, RSSI => hex($mFld[4]));
$hash->{owner} = $owner; Dispatch($hash, $dmsg, \%addvals);
$hash->{uptime} = HMLAN_uptime($msec); }
my $myId = AttrVal($name, "hmId", $owner); elsif($mFld[0] eq 'HHM-LAN-IF'){#@mFld=(undef,$vers,$serno,$d1,$owner,$msec,$d2)
if(lc($owner) ne lc($myId) && !AttrVal($name, "dummy", 0)) { $hash->{serialNr} = $mFld[2];
Log 1, "HMLAN setting owner to $myId from $owner"; $hash->{firmware} = sprintf("%d.%d", (hex($mFld[1])>>12)&0xf, hex($mFld[1]) & 0xffff);
$hash->{owner} = $mFld[4];
$hash->{uptime} = HMLAN_uptime($mFld[5]);
Log $ll5, 'HMLAN_Parse: '.$name. ' V:'.$mFld[1]
.' sNo:'.$mFld[2].' d:'.$mFld[3]
.' O:' .$mFld[4].' m:'.$mFld[5].' d2:'.$mFld[6];
my $myId = AttrVal($name, "hmId", $mFld[4]);
if(lc($mFld[4]) ne lc($myId) && !AttrVal($name, "dummy", 0)) {
Log 1, 'HMLAN setting owner to '.$myId.' from '.$mFld[4];
HMLAN_SimpleWrite($hash, "A$myId"); HMLAN_SimpleWrite($hash, "A$myId");
} }
return; }
elsif($rmsg =~ m/^I00.*/) {;
} elsif($rmsg =~ m/^I00.*/) {
# Ack from the HMLAN # Ack from the HMLAN
return; }
else {
} else {
Log $ll5, "$name Unknown msg >$rmsg<"; Log $ll5, "$name Unknown msg >$rmsg<";
return;
} }
$hash->{"${name}_MSGCNT"}++;
$hash->{"${name}_TIME"} = TimeNow();
$hash->{RAWMSG} = $rmsg;
my %addvals = (RAWMSG => $rmsg);
if(defined($rssi)) {
$rssi = hex($rssi)-65536;
$hash->{RSSI} = $rssi;
$addvals{RSSI} = $rssi;
}
Dispatch($hash, $dmsg, \%addvals);
} }
@ -338,8 +349,25 @@ HMLAN_SimpleWrite(@)
my $name = $hash->{NAME}; my $name = $hash->{NAME};
return if(!$hash || AttrVal($hash->{NAME}, "dummy", undef)); return if(!$hash || AttrVal($hash->{NAME}, "dummy", undef));
select(undef, undef, undef, 0.01); select(undef, undef, undef, 0.01); # todo check necessity
Log GetLogLevel($name,5), "SW: $msg"; #---------- confort trace--------------
# Log GetLogLevel($name,5), 'HMLAN_Send: S:'.
# substr($msg,0,9).
# ' stat: '.substr($msg,10,2).
# ' t:' .substr($msg,13,8).
# ' d:' .substr($msg,22,2).
# ' r:' .substr($msg,25,8).
# ' m:' .substr($msg,34)
# ' m:' .substr($msg,34,2).
# ' ' .substr($msg,36,4).
# ' ' .substr($msg,40,6).
# ' ' .substr($msg,46,6).
# ' ' .substr($msg,52)
# if (length($msg )>19);
# Log GetLogLevel($name,5), 'HMLAN_Send: '.$msg if (length($msg) <=19);
#----------- normal trace,better speed-----------
Log GetLogLevel($name,5), 'HMLAN_Send: '.$msg; #normal trace
$msg .= "\r\n" unless($nonl); $msg .= "\r\n" unless($nonl);
syswrite($hash->{TCPDev}, $msg) if($hash->{TCPDev}); syswrite($hash->{TCPDev}, $msg) if($hash->{TCPDev});

View File

@ -130,7 +130,7 @@ my %culHmModel=(
"003F" => {name=>"HM-WDS40-TH-I" ,cyc=>'' ,rxt=>'c:w' ,lst=>'' ,chn=>"",}, "003F" => {name=>"HM-WDS40-TH-I" ,cyc=>'' ,rxt=>'c:w' ,lst=>'' ,chn=>"",},
"0040" => {name=>"HM-WDS100-C6-O" ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'1' ,chn=>"",}, "0040" => {name=>"HM-WDS100-C6-O" ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'1' ,chn=>"",},
"0041" => {name=>"HM-WDC7000" ,cyc=>'' ,rxt=>'' ,lst=>'1,4' ,chn=>"",}, "0041" => {name=>"HM-WDC7000" ,cyc=>'' ,rxt=>'' ,lst=>'1,4' ,chn=>"",},
"0042" => {name=>"HM-SEC-SD" ,cyc=>'28:00' ,rxt=>'b' ,lst=>'' ,chn=>"",}, "0042" => {name=>"HM-SEC-SD" ,cyc=>'90:00' ,rxt=>'b' ,lst=>'' ,chn=>"",},
"0043" => {name=>"HM-SEC-TIS" ,cyc=>'28:00' ,rxt=>'c:w' ,lst=>'1,4' ,chn=>"",}, "0043" => {name=>"HM-SEC-TIS" ,cyc=>'28:00' ,rxt=>'c:w' ,lst=>'1,4' ,chn=>"",},
"0044" => {name=>"HM-SEN-EP" ,cyc=>'' ,rxt=>'c:w' ,lst=>'1,4' ,chn=>"",}, "0044" => {name=>"HM-SEN-EP" ,cyc=>'' ,rxt=>'c:w' ,lst=>'1,4' ,chn=>"",},
"0045" => {name=>"HM-SEC-WDS" ,cyc=>'28:00' ,rxt=>'c:w' ,lst=>'1,4' ,chn=>"",}, "0045" => {name=>"HM-SEC-WDS" ,cyc=>'28:00' ,rxt=>'c:w' ,lst=>'1,4' ,chn=>"",},
@ -529,8 +529,12 @@ CUL_HM_Parse($$)
# channel is in sType for this message # channel is in sType for this message
my ( $of, $vep) = my ( $of, $vep) =
(hex($1), hex($2)); (hex($1), hex($2));
push @event, "ValveErrorPosition $dname: $vep %"; push @event, "ValveErrorPosition for $dname: $vep %";
push @event, "ValveOffset $dname: $of %"; push @event, "ValveOffset for $dname: $of %";
#set the condition in destination
DoTrigger($dname,'ValveErrorPosition: changeTo '.$vep.'%');
DoTrigger($dname,'ValveOffset: changeTo '.$of.'%');
push @event,""; # nothing to report for TC
} }
# ($cmd eq "A112" && $p =~ m/^0202(..)$/)) { # Set desired temp # ($cmd eq "A112" && $p =~ m/^0202(..)$/)) { # Set desired temp
elsif(($msgType eq '02' &&$sType eq '01')|| # ackStatus elsif(($msgType eq '02' &&$sType eq '01')|| # ackStatus
@ -589,8 +593,8 @@ CUL_HM_Parse($$)
# => Link discriminator (00000000) is fixed # => Link discriminator (00000000) is fixed
elsif($msgType eq "10" && $p =~ m/^0401000000000509(..)0A(..)/) { elsif($msgType eq "10" && $p =~ m/^0401000000000509(..)0A(..)/) {
my ( $of, $vep) = (hex($1), hex($2)); my ( $of, $vep) = (hex($1), hex($2));
push @event, "valve error position:$vep %"; push @event, "ValveErrorPosition: $vep%";
push @event, "ValveOffset $dname: $of %"; push @event, "ValveOffset: $of%";
} }
} }
@ -741,7 +745,7 @@ CUL_HM_Parse($$)
push @event, "state:Btn$btn on$target"; push @event, "state:Btn$btn on$target";
} }
elsif(($msgType eq "02" && $p =~ m/^01/) || # handle Ack_Status elsif(($msgType eq "02" && $p =~ m/^01/) || # handle Ack_Status
($msgType eq "10" && $p =~ m/^06/)){ # or Info_Status message ($msgType eq "10" && $p =~ m/^06/)){ # or Info_Status message
my ($msgChn,$msgState) = ($1,$2) if ($p =~ m/..(..)(..)/); my ($msgChn,$msgState) = ($1,$2) if ($p =~ m/..(..)(..)/);
my $chnHash = $modules{CUL_HM}{defptr}{$src.$msgChn}; my $chnHash = $modules{CUL_HM}{defptr}{$src.$msgChn};
if ($model eq "HM-OU-LED16") { if ($model eq "HM-OU-LED16") {
@ -854,7 +858,7 @@ CUL_HM_Parse($$)
push @event, "alive:yes"; push @event, "alive:yes";
push @event, "battery:". (($err&0x80)?"low" :"ok" ) if($cmpVal&0x80); push @event, "battery:". (($err&0x80)?"low" :"ok" ) if($cmpVal&0x80);
if (!$model eq "HM-SEC-WDS"){ if ($model ne "HM-SEC-WDS"){
push @event, "cover:". (($err&0x0E)?"open" :"closed")if($cmpVal&0x0E); push @event, "cover:". (($err&0x0E)?"open" :"closed")if($cmpVal&0x0E);
} }
} }
@ -892,34 +896,31 @@ CUL_HM_Parse($$)
} }
elsif($st eq "winMatic") { #################################### elsif($st eq "winMatic") { ####################################
if($msgType eq "10" && $p =~ m/^0601(..)(..)/) { if($msgType eq "10"){
my ($lst, $flg) = ($1, $2); if ($p =~ m/^0601(..)(..)/) {
if($lst eq "C8" && $flg eq "00") { push @event, "contact:tilted"; my ($lst, $flg) = ($1, $2);
} elsif($lst eq "FF" && $flg eq "00") { push @event, "contact:closed"; if($lst eq "C8" && $flg eq "00") { push @event, "contact:tilted";
} elsif($lst eq "FF" && $flg eq "10") { push @event, "contact:lock_on"; } elsif($lst eq "FF" && $flg eq "00") { push @event, "contact:closed";
} elsif($lst eq "00" && $flg eq "10") { push @event, "contact:movement_tilted"; } elsif($lst eq "FF" && $flg eq "10") { push @event, "contact:lock_on";
} elsif($lst eq "00" && $flg eq "20") { push @event, "contact:movement_closed"; } elsif($lst eq "00" && $flg eq "10") { push @event, "contact:movement_tilted";
} elsif($lst eq "00" && $flg eq "30") { push @event, "contact:open"; } elsif($lst eq "00" && $flg eq "20") { push @event, "contact:movement_closed";
} } elsif($lst eq "00" && $flg eq "30") { push @event, "contact:open";
CUL_HM_SendCmd($shash, $msgcnt."8002".$id.$src."0101".$lst."00",1,0) }
if($id eq $dst);# Send AckStatus CUL_HM_SendCmd($shash, $msgcnt."8002".$id.$src."0101".$lst."00",1,0)
$sendAck = ""; if($id eq $dst);# Send AckStatus
} $sendAck = "";
}
if($msgType eq "10" && $p =~ m/^0287(..)89(..)8B(..)/) { elsif ($p =~ m/^0287(..)89(..)8B(..)/) {
my ($air, undef, $course) = ($1, $2, $3); my ($air, undef, $course) = ($1, $2, $3);
push @event, "airing:". push @event, "airing:".($air eq "FF" ? "inactiv" : CUL_HM_decodeTime8($air));
($air eq "FF" ? "inactiv" : CUL_HM_decodeTime8($air)); push @event, "course:".($course eq "FF" ? "tilt" : "close");
push @event, "course:".($course eq "FF" ? "tilt" : "close"); }
} elsif($p =~ m/^0201(..)03(..)04(..)05(..)07(..)09(..)0B(..)0D(..)/) {
my ($flg1, $flg2, $flg3, $flg4, $flg5, $flg6, $flg7, $flg8) =
if($msgType eq "10" && ($1, $2, $3, $4, $5, $6, $7, $8);
$p =~ m/^0201(..)03(..)04(..)05(..)07(..)09(..)0B(..)0D(..)/) { push @event, "airing:".($flg5 eq "FF" ? "inactiv" : CUL_HM_decodeTime8($flg5));
push @event, "contact:tesed";
my ($flg1, $flg2, $flg3, $flg4, $flg5, $flg6, $flg7, $flg8) = }
($1, $2, $3, $4, $5, $6, $7, $8);
push @event, "airing:".($flg5 eq "FF" ? "inactiv" : CUL_HM_decodeTime8($flg5));
push @event, "contact:tesed";
} }
} }
@ -1039,6 +1040,11 @@ my %culHmRegDefine = (
OnMinLevelSh =>{a=> 16.0,s=>1.0,l=>3,min=>0 ,max=>100 ,c=>'factor' ,f=>2 ,u=>'%' ,t=>"Short:minimum PowerLevel"}, OnMinLevelSh =>{a=> 16.0,s=>1.0,l=>3,min=>0 ,max=>100 ,c=>'factor' ,f=>2 ,u=>'%' ,t=>"Short:minimum PowerLevel"},
OnLevelSh =>{a=> 17.0,s=>1.0,l=>3,min=>0 ,max=>100 ,c=>'factor' ,f=>2 ,u=>'%' ,t=>"Short:PowerLevel on"}, OnLevelSh =>{a=> 17.0,s=>1.0,l=>3,min=>0 ,max=>100 ,c=>'factor' ,f=>2 ,u=>'%' ,t=>"Short:PowerLevel on"},
OffLevelKmSh =>{a=> 15.0,s=>1.0,l=>3,min=>0 ,max=>127.5 ,c=>'factor' ,f=>2 ,u=>'%' ,t=>"Short:OnLevel 127.5=locked"},
OnLevelKmSh =>{a=> 17.0,s=>1.0,l=>3,min=>0 ,max=>127.5 ,c=>'factor' ,f=>2 ,u=>'%' ,t=>"Short:OnLevel 127.5=locked"},
OnRampOnSpSh =>{a=> 34.0,s=>1.0,l=>3,min=>0 ,max=>1 ,c=>'factor' ,f=>200 ,u=>'s' ,t=>"Short:Ramp On speed"},
OnRampOffSpSh=>{a=> 35.0,s=>1.0,l=>3,min=>0 ,max=>1 ,c=>'factor' ,f=>200 ,u=>'s' ,t=>"Short:Ramp Off speed"},
rampSstepSh =>{a=> 18.0,s=>1.0,l=>3,min=>0 ,max=>100 ,c=>'factor' ,f=>2 ,u=>'%' ,t=>"Short:rampStartStep"}, rampSstepSh =>{a=> 18.0,s=>1.0,l=>3,min=>0 ,max=>100 ,c=>'factor' ,f=>2 ,u=>'%' ,t=>"Short:rampStartStep"},
rampOnTimeSh =>{a=> 19.0,s=>1.0,l=>3,min=>0 ,max=>111600,c=>'fltCvT' ,f=>'' ,u=>'s' ,t=>"Short:rampOnTime"}, rampOnTimeSh =>{a=> 19.0,s=>1.0,l=>3,min=>0 ,max=>111600,c=>'fltCvT' ,f=>'' ,u=>'s' ,t=>"Short:rampOnTime"},
rampOffTimeSh=>{a=> 20.0,s=>1.0,l=>3,min=>0 ,max=>111600,c=>'fltCvT' ,f=>'' ,u=>'s' ,t=>"Short:rampOffTime"}, rampOffTimeSh=>{a=> 20.0,s=>1.0,l=>3,min=>0 ,max=>111600,c=>'fltCvT' ,f=>'' ,u=>'s' ,t=>"Short:rampOffTime"},
@ -1061,6 +1067,11 @@ my %culHmRegDefine = (
dimMinLvlLg =>{a=>149.0,s=>1.0,l=>3,min=>0 ,max=>100 ,c=>'factor' ,f=>2 ,u=>'%' ,t=>"Long:dimMinLevel"}, dimMinLvlLg =>{a=>149.0,s=>1.0,l=>3,min=>0 ,max=>100 ,c=>'factor' ,f=>2 ,u=>'%' ,t=>"Long:dimMinLevel"},
dimMaxLvlLg =>{a=>150.0,s=>1.0,l=>3,min=>0 ,max=>100 ,c=>'factor' ,f=>2 ,u=>'%' ,t=>"Long:dimMaxLevel"}, dimMaxLvlLg =>{a=>150.0,s=>1.0,l=>3,min=>0 ,max=>100 ,c=>'factor' ,f=>2 ,u=>'%' ,t=>"Long:dimMaxLevel"},
dimStepLg =>{a=>151.0,s=>1.0,l=>3,min=>0 ,max=>100 ,c=>'factor' ,f=>2 ,u=>'%' ,t=>"Long:dimStep"}, dimStepLg =>{a=>151.0,s=>1.0,l=>3,min=>0 ,max=>100 ,c=>'factor' ,f=>2 ,u=>'%' ,t=>"Long:dimStep"},
OffLevelKmLg =>{a=>143.0,s=>1.0,l=>3,min=>0 ,max=>127.5 ,c=>'factor' ,f=>2 ,u=>'%' ,t=>"Long:OnLevel 127.5=locked"},
OnLevelKmLg =>{a=>145.0,s=>1.0,l=>3,min=>0 ,max=>127.5 ,c=>'factor' ,f=>2 ,u=>'%' ,t=>"Long:OnLevel 127.5=locked"},
OnRampOnSpLg =>{a=>162.0,s=>1.0,l=>3,min=>0 ,max=>1 ,c=>'factor' ,f=>200 ,u=>'s' ,t=>"Long:Ramp On speed"},
OnRampOffSpLg=>{a=>163.0,s=>1.0,l=>3,min=>0 ,max=>1 ,c=>'factor' ,f=>200 ,u=>'s' ,t=>"Long:Ramp Off speed"},
#tc #tc
BacklOnTime =>{a=>5.0 ,s=>0.6,l=>0,min=>1 ,max=>25 ,c=>"" ,f=>'' ,u=>'s' ,t=>"Backlight ontime"}, BacklOnTime =>{a=>5.0 ,s=>0.6,l=>0,min=>1 ,max=>25 ,c=>"" ,f=>'' ,u=>'s' ,t=>"Backlight ontime"},
BacklOnMode =>{a=>5.6 ,s=>0.2,l=>0,min=>0 ,max=>1 ,c=>'factor' ,f=>2 ,u=>'bool',t=>"Backlight mode 0=OFF, 1=AUTO"}, BacklOnMode =>{a=>5.6 ,s=>0.2,l=>0,min=>0 ,max=>1 ,c=>'factor' ,f=>2 ,u=>'bool',t=>"Backlight mode 0=OFF, 1=AUTO"},
@ -1149,6 +1160,12 @@ my %culHmRegSupported = (
ActTypeSh =>1,ActNumSh =>1,IntenseSh =>1, ActTypeSh =>1,ActNumSh =>1,IntenseSh =>1,
ActTypeLg =>1,ActNumLg =>1,IntenseLg =>1, ActTypeLg =>1,ActNumLg =>1,IntenseLg =>1,
}, },
winMatic=>{
OnTimeSh =>1,OffTimeSh =>1,OffLevelKmSh =>1,
OnLevelKmSh =>1,OnRampOnSpSh =>1,OnRampOffSpSh =>1,
OnTimeLg =>1,OffTimeLg =>1,OffLevelKmLg =>1,
OnLevelKmLg =>1,OnRampOnSpLg =>1,OnRampOffSpLg =>1,
},
keyMatic=>{ keyMatic=>{
signal =>1,signalTone=>1,keypressSignal=>1, signal =>1,signalTone=>1,keypressSignal=>1,
holdTime =>1,setupDir =>1,setupPosition =>1, holdTime =>1,setupDir =>1,setupPosition =>1,
@ -1158,8 +1175,9 @@ my %culHmRegSupported = (
dis4=> {language => 1,stbyTime => 1, #todo insert correct name dis4=> {language => 1,stbyTime => 1, #todo insert correct name
}, },
motionDetector=>{ motionDetector=>{
evtFltrPeriod =>1,evtFltrNum =>1,minInterval =>1, evtFltrPeriod =>1,evtFltrNum =>1,minInterval =>1,
captInInterval=>1,brightFilter =>1,ledOnTime =>1}, captInInterval=>1,brightFilter =>1,ledOnTime =>1,
},
); );
##--------------- Conversion routines for register settings ##--------------- Conversion routines for register settings
my %fltCvT = (0.1=>3.1,1=>31,5=>155,10=>310,60=>1860,300=>9300, my %fltCvT = (0.1=>3.1,1=>31,5=>155,10=>310,60=>1860,300=>9300,
@ -1584,8 +1602,12 @@ CUL_HM_Set($@)
# as of now only hex value allowed check range and convert # as of now only hex value allowed check range and convert
$chn = "00" if ($list eq "00"); $chn = "00" if ($list eq "00");
my $pSc = substr($peerID,0,4); #helper for shortcut spread
$peerID = ($peerID eq 'all')?'all': CUL_HM_Name2Id($peerID,$hash); #todo add self if ($pSc eq 'self'){$peerID=$dst.sprintf("%02X",'0'.substr($peerID,4));
}elsif ($pSc eq 'fhem'){$peerID=$id .sprintf("%02X",'0'.substr($peerID,4));
}elsif($peerID eq 'all'){;# keep all
}else {$peerID = CUL_HM_Name2Id($peerID);
}
$peerID = $peerID.((length($peerID) == 6)?"01":"");# default chn 1, if none $peerID = $peerID.((length($peerID) == 6)?"01":"");# default chn 1, if none
$peerID = "00000000" if (length($peerID) != 8 && $peerID ne 'all');# none? $peerID = "00000000" if (length($peerID) != 8 && $peerID ne 'all');# none?
@ -1662,9 +1684,14 @@ CUL_HM_Set($@)
my ($lChn,$peerID,$peerChn) = ($chn,"000000","00"); my ($lChn,$peerID,$peerChn) = ($chn,"000000","00");
if (($list == 3) ||($list == 4)){ # peer is necessary for list 3/4 if (($list == 3) ||($list == 4)){ # peer is necessary for list 3/4
return "Peer not specified" if (!$peerChnIn); return "Peer not specified" if (!$peerChnIn);
$peerID = ($peerChnIn =~ m/^self(.*)/)?$dst:CUL_HM_Name2Id($peerChnIn);
$peerChn = ($1)?sprintf("%02X",$1):""; my $pSc = substr($peerID,0,4); #helper for shortcut spread
$peerChn = ((length($peerID) == 8)?substr($peerID,6,2):"01") if (!$peerChn); if ($pSc eq 'self'){$peerID=$dst.sprintf("%02X",'0'.substr($peerID,4));
}elsif ($pSc eq 'fhem'){$peerID=$id .sprintf("%02X",'0'.substr($peerID,4));
}else {$peerID = CUL_HM_Name2Id($peerID);
}
$peerChn = ((length($peerID) == 8)?substr($peerID,6,2):"01");
$peerID = substr($peerID,0,6); $peerID = substr($peerID,0,6);
return "Peer not specified" if (!$peerID); return "Peer not specified" if (!$peerID);
} }
@ -1960,22 +1987,22 @@ CUL_HM_Set($@)
sprintf("++%s01%s%s0101%s%02X%s",$flag,$id, $dst, $id, $a[2], $chn)); sprintf("++%s01%s%s0101%s%02X%s",$flag,$id, $dst, $id, $a[2], $chn));
CUL_HM_PushCmdStack($hash, CUL_HM_PushCmdStack($hash,
sprintf("++A001%s%s0104%s%02X%s", $id, $dst, $id, $a[2], $chn)); sprintf("++A001%s%s0104%s%02X%s", $id, $dst, $id, $a[2], $chn));
} }
elsif($cmd eq "read") { ################################### elsif($cmd eq "read") { ###################################
CUL_HM_PushCmdStack($hash, return "read is discontinued since duplicate.\n".
sprintf("++%s01%s%s0104%s%02X03",$flag,$id, $dst, $id, $a[2])); "please use getRegRaw instead. Syntax getRegRaw List3 fhem<btn> \n".
"or getConfig for a complete configuratin list";
} }
elsif($cmd eq "keydef") { ##################################### elsif($cmd eq "keydef") { #####################################
if ( $a[3] eq "tilt") {CUL_HM_pushConfig($hash,$id,$dst,1,$id,$a[2],3,"0B220D838B228D83"); if ( $a[3] eq "tilt") {CUL_HM_pushConfig($hash,$id,$dst,1,$id,$a[2],3,"0B220D838B228D83");#JT_ON/OFF/RAMPON/RAMPOFF short and long
} elsif ($a[3] eq "close") {CUL_HM_pushConfig($hash,$id,$dst,1,$id,$a[2],3,"0B550D838B558D83"); } elsif ($a[3] eq "close") {CUL_HM_pushConfig($hash,$id,$dst,1,$id,$a[2],3,"0B550D838B558D83");#JT_ON/OFF/RAMPON/RAMPOFF short and long
} elsif ($a[3] eq "closed") {CUL_HM_pushConfig($hash,$id,$dst,1,$id,$a[2],3,"0F008F00"); } elsif ($a[3] eq "closed") {CUL_HM_pushConfig($hash,$id,$dst,1,$id,$a[2],3,"0F008F00"); #offLevel (also thru register)
} elsif ($a[3] eq "bolt") {CUL_HM_pushConfig($hash,$id,$dst,1,$id,$a[2],3,"0FFF8FFF"); } elsif ($a[3] eq "bolt") {CUL_HM_pushConfig($hash,$id,$dst,1,$id,$a[2],3,"0FFF8FFF"); #offLevel (also thru register)
} elsif ($a[3] eq "speedclose"){CUL_HM_pushConfig($hash,$id,$dst,1,$id,$a[2],3,sprintf("23%02XA3%02X", $a[4]*2, $a[4]*2)); } elsif ($a[3] eq "speedclose"){CUL_HM_pushConfig($hash,$id,$dst,1,$id,$a[2],3,sprintf("23%02XA3%02X",$a[4]*2,$a[4]*2));#RAMPOFFspeed (also in reg)
} elsif ($a[3] eq "speedtilt") {CUL_HM_pushConfig($hash,$id,$dst,1,$id,$a[2],3,sprintf("22%02XA2%02X", $a[4]*2, $a[4]*2)); } elsif ($a[3] eq "speedtilt") {CUL_HM_pushConfig($hash,$id,$dst,1,$id,$a[2],3,sprintf("22%02XA2%02X",$a[4]*2,$a[4]*2));#RAMPOFFspeed (also in reg)
} elsif ($a[3] eq "delete") {CUL_HM_PushCmdStack($hash,sprintf("++%s01%s%s0102%s%02X%s",$flag,$id, $dst, $id, $a[2], $chn)); } elsif ($a[3] eq "delete") {CUL_HM_PushCmdStack($hash,sprintf("++%s01%s%s0102%s%02X%s",$flag,$id, $dst, $id, $a[2], $chn));#unlearn key
} else { } else {
return "unknown argument $a[3]"; return 'unknown argument '.$a[3];
} }
} }
elsif($cmd eq "test") { ##################################################### elsif($cmd eq "test") { #####################################################
@ -2307,7 +2334,7 @@ CUL_HM_responseSetup($$$)
$hash->{helper}{respWait}{forPeer}= $peerID;# this is the HMid + channel $hash->{helper}{respWait}{forPeer}= $peerID;# this is the HMid + channel
# define timeout - holdup cmdStack until response complete or timeout # define timeout - holdup cmdStack until response complete or timeout
InternalTimer(gettimeofday()+$rTo,"CUL_HM_respPendTout","respPend:$dst", 0); InternalTimer(gettimeofday()+$rTo,"CUL_HM_respPendTout","respPend:$dst", 0);#todo General change timer to 1.5
#--- remove channel entries that will be replaced #--- remove channel entries that will be replaced
my $chnhash = $modules{CUL_HM}{defptr}{"$dst$chn"}; my $chnhash = $modules{CUL_HM}{defptr}{"$dst$chn"};
$chnhash = $hash if(!$chnhash); $chnhash = $hash if(!$chnhash);
@ -2523,7 +2550,7 @@ CUL_HM_id2Name($)
} }
my $defPtr = $modules{CUL_HM}{defptr}; my $defPtr = $modules{CUL_HM}{defptr};
return $defPtr->{$chnId}{NAME} if($chnId && $defPtr->{$chnId}); return $defPtr->{$chnId}{NAME} if($chnId && $defPtr->{$chnId});
return $defPtr->{$devId}{NAME}.(defined($chn)?'_chn:'.$chn:'') if($defPtr->{$devId}); return $defPtr->{$devId}{NAME} if($defPtr->{$devId});
return $devId. ($chn ? ("_chn:".$chn):""); return $devId. ($chn ? ("_chn:".$chn):"");
} }
################################### ###################################