2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-09 20:57:11 +00:00

threestate sensor devicepair, HMLAN prepare for improvement with wakeup

git-svn-id: https://svn.fhem.de/fhem/trunk@2350 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
martinp876 2012-12-21 22:01:53 +00:00
parent 964ca01eb6
commit 10885385a4
2 changed files with 33 additions and 32 deletions

View File

@ -132,7 +132,8 @@ HMLAN_Set($@)
$hash->{hmPair} = 1;
InternalTimer(gettimeofday()+$arg, "HMLAN_RemoveHMPair", "hmPairForSec:".$hash, 1);
} elsif($type eq "hmPairSerial") { ################################
}
elsif($type eq "hmPairSerial") { ################################
return "Usage: set $name hmPairSerial <10-character-serialnumber>"
if(!$arg || $arg !~ m/^.{10}$/);
@ -194,7 +195,7 @@ HMLAN_ReadAnswer($$$)
}
}
my %lhash;
my %lhash = ""; # remember which ID is assigned to this HMLAN
#####################################
sub
@ -221,8 +222,10 @@ HMLAN_Write($$$)
my $IDadd = '+'.$dst; # guess: add ID?
my $IDsub = '-'.$dst; # guess: ID remove?
HMLAN_SimpleWrite($hash, $IDadd) if (!$lhash{$dst} && $dst ne "000000");
$lhash{$dst} = 1;
if (!$lhash{$dst} && $dst ne "000000"){
HMLAN_SimpleWrite($hash, $IDadd);
$lhash{$dst} = 1;
}
my $tm = int(gettimeofday()*1000) % 0xffffffff;
$msg = sprintf("S%08X,00,00000000,01,%08X,%s",$tm, $tm, substr($msg, 4));
@ -317,7 +320,7 @@ HMLAN_Parse($$)
# HMLAN_SimpleWrite($hash, '-'.$src);
# HMLAN_SimpleWrite($hash, '+'.$src);
# }
$dmsg .= "NACK" if($mFld[1] !~ m/00(01|02|21)/ && $letter eq 'R');
$dmsg .= ":NACK" if($mFld[1] !~ m/00(01|02|21)/ && $letter eq 'R');
$hash->{uptime} = HMLAN_uptime($mFld[2]);
$hash->{RSSI} = hex($mFld[4])-65536;
@ -335,7 +338,7 @@ HMLAN_Parse($$)
$hash->{helper}{keepAliveRec} = 1;
Log $ll5, 'HMLAN_Parse: '.$name. ' V:'.$mFld[1]
.' sNo:'.$mFld[2].' d:'.$mFld[3]
.' O:' .$mFld[4].' m:'.$mFld[5].' d2:'.$mFld[6];
.' O:' .$mFld[4].' m:'.$mFld[5].' IDcnt:'.$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];
@ -436,7 +439,8 @@ HMLAN_DoInit($)
HMLAN_SimpleWrite($hash, "Y03,00,");
HMLAN_SimpleWrite($hash, "Y03,00,");
HMLAN_SimpleWrite($hash, "T$s2000,04,00,00000000");
%lhash = '';# clear IDs - HMLAN might have a reset
$hash->{helper}{keepAliveRec} = 1; # ok for first time
RemoveInternalTimer( "keepAlive:".$name);# avoid duplicate timer
InternalTimer(gettimeofday()+25, "HMLAN_KeepAlive", "keepAlive:".$name, 0);

View File

@ -8,7 +8,6 @@ package main;
# the lines can be removed after some soak time - around version 2600
use strict;
use warnings;
#use Time::HiRes qw(gettimeofday);
sub CUL_HM_Initialize($);
sub CUL_HM_Define($$);
@ -354,8 +353,9 @@ CUL_HM_Parse($$)
($dst eq "000000" ? "broadcast" :
($dst eq $id ? $iohash->{NAME} : $dst));
my $target = " (to $dname)";
return "" if($p =~ m/NACK$/);#discard TCP errors from HMlan. Resend will cover it
my $msgStat;
($p,$msgStat) = split(":",$p,2);
return "" if($msgStat && $msgStat eq 'NACK');#discard TCP errors from HMlan. Resend will cover it
return "" if($src eq $id);#discard mirrored messages
$respRemoved = 0; #set to 'no response in this message' at start
@ -366,7 +366,7 @@ CUL_HM_Parse($$)
# prefer subType over model to make autocreate easier
# model names are quite cryptic anyway
my $model = substr($p, 2, 4);
my $stc = substr($p, 26, 2); # subTypeCode
my $stc = substr($p, 26, 2); # subTypeCode
if($culHmDevProps{$stc}) {
$sname = "CUL_HM_".$culHmDevProps{$stc}{st} . "_" . $src;
}
@ -391,7 +391,7 @@ CUL_HM_Parse($$)
if($shash->{lastMsg} && $shash->{lastMsg} eq $msgX) {
Log GetLogLevel($name,4), "CUL_HM $name dup mesg";
if(($id eq $dst)&& (hex($msgFlag)&0x20)){
CUL_HM_SndCmd($shash, $msgcnt."8002".$id.$src."0101C800"); # Send Ack
# CUL_HM_SndCmd($shash, $msgcnt."8002".$id.$src."00"); # Send Ack
Log GetLogLevel($name,4), "CUL_HM $name dup mesg - ack and ignore";
}
else{
@ -1623,6 +1623,8 @@ my %culHmSubTypeSets = (
{ devicepair => "<btnNumber> device ... [single|dual] [set|unset] [actor|remote|both]",},
pushButton =>
{ devicepair => "<btnNumber> device ... [single|dual] [set|unset] [actor|remote|both]",},
threeStateSensor =>
{ devicepair => "<btnNumber> device ... single [set|unset] [actor|remote|both]",},
virtual =>
{ raw => "data ...",
devicepair => "<btnNumber> device ... [single|dual] [set|unset] [actor|remote|both]",
@ -1639,37 +1641,32 @@ my %culHmSubTypeSets = (
keyMatic =>{lock =>"",
unlock =>"[sec] ...",
open =>"[sec] ...",
inhibit=>"[on|off]",
},
inhibit=>"[on|off]"},
);
my %culHmModelSets = (
"HM-CC-VD"=>{
valvePos => "position",},
valvePos => "position"},
"HM-RC-19"=> {
service => "<count>",
alarm => "<count>",
display => "<text> [comma,no] [unit] [off|1|2|3] [off|on|slow|fast] <symbol>",},
display => "<text> [comma,no] [unit] [off|1|2|3] [off|on|slow|fast] <symbol>"},
"HM-RC-19-B"=> {
service => "<count>",
alarm => "<count>",
display => "<text> [comma,no] [unit] [off|1|2|3] [off|on|slow|fast] <symbol>",},
display => "<text> [comma,no] [unit] [off|1|2|3] [off|on|slow|fast] <symbol>"},
"HM-RC-19-SW"=> {
service => "<count>",
alarm => "<count>",
display => "<text> [comma,no] [unit] [off|1|2|3] [off|on|slow|fast] <symbol>",},
display => "<text> [comma,no] [unit] [off|1|2|3] [off|on|slow|fast] <symbol>"},
"HM-PB-4DIS-WM"=>{
text => "<btn> [on|off] <txt1> <txt2>",},
text => "<btn> [on|off] <txt1> <txt2>"},
"HM-OU-LED16" =>{
led =>"[off|red|green|orange]" ,
ilum =>"[0-15] [0-127]" },
"HM-OU-CFM-PL"=>{
led => "<color>[,<color>..]",
playTone => "<MP3No>[,<MP3No>..]",},
"ROTO_ZEL-STG-RM-FDK"=>{
devicepair => "<btnNumber> device ... single [set|unset] [actor|remote|both]",},
"HM-SEC-RHS"=>{
devicepair => "<btnNumber> device ... single [set|unset] [actor|remote|both]",},
playTone => "<MP3No>[,<MP3No>..]"},
);
my %culHmChanSets = (
@ -2416,10 +2413,8 @@ CUL_HM_Set($@)
return "$target must be [actor|remote|both]" if(defined($target) && (($target ne"actor") &&
($target ne"remote")&&($target ne"both")));
return "use climate chan to pair TC" if($md eq "HM-CC-TC" &&$chn ne "02");
return "use - single [set|unset] actor - for smoke detector" if($st eq "smokeDetector" &&
(!$single || $single ne "single" || $target ne "actor"));
return "use - single - for this sensor" if(($md eq "ROTO_ZEL-STG-RM-FDK" || $md eq "HM-SEC-RHS") &&
(!$single || $single ne "single"));
return "use - single [set|unset] actor - for smoke detector" if($st eq "smokeDetector" && (!$single || $single ne "single" || $target ne "actor"));
return "use - single - for threeStateSensor" if($st eq "threeStateSensor" && (!$single || $single ne "single"));
$single = ($single eq "single")?1:"";#default to dual
$set = ($set eq "unset")?0:1;
@ -2427,9 +2422,10 @@ CUL_HM_Set($@)
my ($b1,$b2,$nrCh2Pair);
$b1 = ($isChannel) ? hex($chn):(!$bNo?"01":sprintf("%02X",$bNo));
$b1 = $b1*2 - 1 if(!$single && !$isChannel);
if ($single){
$b2 = $b1;
$nrCh2Pair = 1;
if ($single){
$b2 = $b1;
$b1 = 0 if ($st eq "smokeDetector");
$nrCh2Pair = 1;
}
else{
$b2 = $b1 + 1;
@ -2458,7 +2454,8 @@ CUL_HM_Set($@)
}
if (!$target || $target eq "actor" || $target eq "both"){
if (AttrVal( CUL_HM_id2Name($peerDst), "subType", "") eq "virtual"){
CUL_HM_ID2PeerList ($peerN,$dst.sprintf("%02X",$b1),$set); #update peerlist
CUL_HM_ID2PeerList ($peerN,$dst.sprintf("%02X",$b2),$set); #update peerlist
CUL_HM_ID2PeerList ($peerN,$dst.sprintf("%02X",$b1),$set) if ($b1 & !$single); #update peerlist
}
else{
my $peerFlag = CUL_HM_getFlag($peerHash);