2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-20 07:16:03 +00:00

enhance rain sensor

git-svn-id: https://svn.fhem.de/fhem/trunk@3566 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
martinp876 2013-08-01 06:54:49 +00:00
parent f3622e85f2
commit 12eb3bffb9
3 changed files with 50 additions and 45 deletions

View File

@ -420,16 +420,16 @@ sub CUL_HM_Attr(@) {#################################
#+++++++++++++++++ msg receive, parsing++++++++++++++++++++++++++++++++++++++++
# translate level to readable
my %lvlStr = ( md =>{ "HM-SEC-WDS" =>{"00"=>"dry" ,"64"=>"damp" ,"C8"=>"wet" }
,"HM-CC-SCD" =>{"00"=>"normal" ,"64"=>"added" ,"C8"=>"addedStrong"}
,"HM-Sen-RD-O" =>{"00"=>"dry" ,"C8"=>"rain"}
}
my %lvlStr = ( md =>{ "HM-SEC-WDS" =>{"00"=>"dry" ,"64"=>"damp" ,"C8"=>"wet" }
,"HM-CC-SCD" =>{"00"=>"normal" ,"64"=>"added" ,"C8"=>"addedStrong"}
,"HM-Sen-RD-O" =>{"00"=>"dry" ,"C8"=>"rain"}
}
,mdCh=>{ "HM-Sen-RD-O01" =>{"00"=>"dry" ,"C8"=>"rain"}
,"HM-Sen-RD-O02" =>{"00"=>"on" ,"C8"=>"off"}
}
,st =>{ "smokeDetector" =>{"01"=>"no alarm","C7"=>"tone off","C8"=>"Smoke Alarm"}
,"threeStateSensor"=>{"00"=>"closed" ,"64"=>"tilted" ,"C8"=>"open"}
}
}
,st =>{ "smokeDetector" =>{"01"=>"no alarm","C7"=>"tone off","C8"=>"Smoke Alarm"}
,"threeStateSensor"=>{"00"=>"closed" ,"64"=>"tilted" ,"C8"=>"open"}
}
);
sub CUL_HM_Parse($$) {##############################
my ($iohash, $msgIn) = @_;
@ -457,11 +457,11 @@ sub CUL_HM_Parse($$) {##############################
if(!$shash) { # Unknown source
# Generate an UNKNOWN event for pairing requests, ignore everything else
if($mTp eq "00") {
my $model = substr($p, 2, 4);
$model = $culHmModel{$model}{name} ?
$culHmModel{$model}{name} :
"ID_".$model;
my $sname = "CUL_HM_".$model."_$src";
my $md = substr($p, 2, 4);
$md = $culHmModel{$md}{name} ?
$culHmModel{$md}{name} :
"ID_".$md;
my $sname = "CUL_HM_".$md."_$src";
$sname =~ s/-/_/g;
Log 3, "CUL_HM Unknown device $sname, please define it";
return "UNDEFINED $sname CUL_HM $src $msg";
@ -477,8 +477,8 @@ sub CUL_HM_Parse($$) {##############################
my $target = " (to $dname)";
my @event; #events to be posted for main entity
my @entities; #additional entities with events to be notifies
my $st = AttrVal($name, "subType", "");
my $model = AttrVal($name, "model" , "");
my $st = AttrVal($name, "subType", "");
my $md = AttrVal($name, "model" , "");
my $tn = TimeNow();
CUL_HM_storeRssi($name,
"at_".((hex($mFlg)&0x40)?"rpt_":"").$ioName,# repeater?
@ -512,7 +512,7 @@ sub CUL_HM_Parse($$) {##############################
CUL_HM_DumpProtocol("RCV",$iohash,$len,$mNo,$mFlg,$mTp,$src,$dst,$p);
#----------start valid messages parsing ---------
my $parse = CUL_HM_parseCommon($mNo,$mFlg,$mTp,$src,$dst,$p,$st,$model);
my $parse = CUL_HM_parseCommon($mNo,$mFlg,$mTp,$src,$dst,$p,$st,$md);
push @event, "powerOn" if($parse eq "powerOn");
if ($parse =~ s/entities://){#common generated trigger for some entities
push @entities,split(",",$parse);
@ -530,7 +530,7 @@ sub CUL_HM_Parse($$) {##############################
elsif($mTp eq "12") {#$lcm eq "09A112" Another fhem request (HAVE_DATA)
;
}
elsif($model =~ m/^(KS550|HM-WDS100-C6-O)$/) { ##############################
elsif($md =~ m/^(KS550|HM-WDS100-C6-O)$/) { ##############################
if($mTp eq "70" && $p =~ m/^(....)(..)(....)(....)(..)(..)(..)/) {
@ -561,7 +561,7 @@ sub CUL_HM_Parse($$) {##############################
push @event, "unknown:$p";
}
}
elsif($model eq "HM-CC-TC") { ###############################################
elsif($md eq "HM-CC-TC") { ###############################################
my ($sType,$chn) = ($1,$2) if($p && $p =~ m/^(..)(..)/);
if($mTp eq "70" && $p =~ m/^(....)(..)/) { # weather event
$chn = '01'; # fix definition
@ -728,7 +728,7 @@ sub CUL_HM_Parse($$) {##############################
push @event, "time-request";
}
}
elsif($model eq "HM-CC-VD") { ###############################################
elsif($md eq "HM-CC-VD") { ###############################################
if($mTp eq "02" && $p =~ m/^(..)(..)(..)(..)/) {#subtype+chn+value+err
my ($chn,$vp, $err) = (hex($2),hex($3), hex($4));
$chn = sprintf("%02X",$chn&0x3f);
@ -766,22 +766,22 @@ sub CUL_HM_Parse($$) {##############################
}
}
}
elsif($model =~ m/^(HM-Sen-Wa-Od|HM-CC-SCD)$/){ #############################
elsif($md =~ m/^(HM-Sen-Wa-Od|HM-CC-SCD)$/){ #############################
if (($mTp eq "02" && $p =~ m/^01/) || # handle Ack_Status
($mTp eq "10" && $p =~ m/^06/) || #or Info_Status message here
($mTp eq "41")) {
my $lvl = substr($p,4,2);
my $err = hex(substr($p,6,2));
if ($lvlStr{md}{$model}){$lvl = $lvlStr{md}{$model}{$lvl}}
if ($lvlStr{md}{$md}){$lvl = $lvlStr{md}{$md}{$lvl}}
elsif ($lvlStr{st}{$st}) {$lvl = $lvlStr{st}{$st}{$lvl} }
else {$lvl = hex($lvl)/2}
push @event, "level:$lvl %" if($model eq "HM-Sen-Wa-Od");
push @event, "level:$lvl %" if($md eq "HM-Sen-Wa-Od");
push @event, "state:$lvl %";
push @event, "battery:".($err&0x80?"low":"ok") if (defined $err);
}
}
elsif($st eq "KFM100" && $model eq "KFM-Sensor") { ########################
elsif($st eq "KFM100" && $md eq "KFM-Sensor") { ########################
if ($mTp eq "53"){
if($p =~ m/.14(.)0200(..)(..)(..)/) {
my ($seq, $k_v1, $k_v2, $k_v3) = (hex($1),$2,hex($3),hex($4));
@ -817,11 +817,11 @@ sub CUL_HM_Parse($$) {##############################
$t = sprintf("%0.1f", $t/10);
my $statemsg = "state:T: $t";
push @event, "temperature:$t";#temp is always there
if ($model !~ m/^(S550IA|HM-WDS30-T-O)$/){#ignore only-temp sensors
if ($md !~ m/^(S550IA|HM-WDS30-T-O)$/){#ignore only-temp sensors
my $h = hex(substr($p,4,2));
$statemsg .= " H: $h";
push @event, "humidity:$h";
if ($model eq "HM-WDC7000"){#airpressure sensor
if ($md eq "HM-WDC7000"){#airpressure sensor
my $ap = hex(substr($p,6,4));
$statemsg .= " AP: $ap";
push @event, "airpress:$ap";
@ -850,7 +850,7 @@ sub CUL_HM_Parse($$) {##############################
my $chId = $src.$chn;
$shash = $modules{CUL_HM}{defptr}{$chId}
if($modules{CUL_HM}{defptr}{$chId});
my $mdCh = $model.$chn;
my $mdCh = $md.$chn;
if($lvlStr{mdCh}{$mdCh} && $lvlStr{mdCh}{$mdCh}{$val}){
$val = $lvlStr{mdCh}{$mdCh}{$val};
}
@ -860,12 +860,13 @@ sub CUL_HM_Parse($$) {##############################
push @event, "state:$val";
}
elsif ($mTp eq "41") { #event
my ($chn,$bno) = (hex($1),hex($2)) if($p =~ m/^(..)(..)/);
$chn = sprintf("%02X",$chn&0x3f);
my ($chn,$bno,$val) = unpack('(A2)*',$p);
my $mdCh = $md.$chn;
$chn = sprintf("%02X",hex($chn)&0x3f);
my $chId = $src.$chn;
$shash = $modules{CUL_HM}{defptr}{$chId}
if($modules{CUL_HM}{defptr}{$chId});
push @event,"trigger:$bno";
push @event,"trigger:".hex($bno).":".$lvlStr{mdCh}{$mdCh}{$val}.$target;
}
}
elsif($st =~ m /^(switch|dimmer|blindActuator)$/) {##########################
@ -934,14 +935,14 @@ sub CUL_HM_Parse($$) {##############################
# info from it is likely a power on!
push @event,"powerOn" if($chn eq "03");
}
elsif ($model eq "HM-SEC-SFA-SM"){ # && $chn eq "00")
elsif ($md eq "HM-SEC-SFA-SM"){ # && $chn eq "00")
push @entities,
CUL_HM_UpdtReadBulk(CUL_HM_getDeviceHash($shash),1,
"powerError:" .(($err&0x02) ? "on":"off"),
"sabotageError:".(($err&0x04) ? "on":"off"),
"battery:".(($err&0x08)?"critical":($err&0x80?"low":"ok")));
}
elsif ($model eq "HM-LC-SW1-BA-PCB"){
elsif ($md eq "HM-LC-SW1-BA-PCB"){
push @event,"battery:" . (($err&0x80) ? "low" : "ok" );
}
}
@ -1025,7 +1026,7 @@ sub CUL_HM_Parse($$) {##############################
($mTp eq "10" && $mI[0] eq "06")){ # or Info_Status message
my ($msgChn,$msgState) = ((hex($mI[1])&0x1f),$mI[2]) if (@mI > 2);
my $chnHash = $modules{CUL_HM}{defptr}{$src.sprintf("%02X",$msgChn)};
if ($model eq "HM-OU-LED16") {
if ($md eq "HM-OU-LED16") {
#special: all LEDs map to device state
my $devState = ReadingsVal($name,"color","00000000");
if($parse eq "powerOn"){# reset LEDs after power on
@ -1068,7 +1069,7 @@ sub CUL_HM_Parse($$) {##############################
}
}
}
elsif ($model eq "HM-OU-CFM-PL"){
elsif ($md eq "HM-OU-CFM-PL"){
if ($chnHash){
$shash = $chnHash;
my $val = hex($mI[2])/2;
@ -1086,7 +1087,7 @@ sub CUL_HM_Parse($$) {##############################
($state, $err) = ($1, hex($2));
my $bright = hex($state);
push @event, "brightness:".$bright;
if ($model eq "HM-Sec-MDIR"){
if ($md eq "HM-Sec-MDIR"){
push @event, "sabotageError:".(($err&0x0E)?"on":"off");
}
else{
@ -1202,9 +1203,9 @@ sub CUL_HM_Parse($$) {##############################
if($modules{CUL_HM}{defptr}{"$src$chn"});
push @event, "alive:yes";
push @event, "battery:". (($err&0x80)?"low" :"ok" );
if ( $model eq "HM-SEC-SC" ||
$model eq "HM-Sec-RHS"){push @event, "sabotageError:".(($err&0x0E)?"on":"off");
}elsif($model ne "HM-SEC-WDS"){push @event, "cover:" .(($err&0x0E)?"open" :"closed");
if ( $md eq "HM-SEC-SC" ||
$md eq "HM-Sec-RHS"){push @event, "sabotageError:".(($err&0x0E)?"on":"off");
}elsif($md ne "HM-SEC-WDS"){push @event, "cover:" .(($err&0x0E)?"open" :"closed");
}
}
elsif($mTp eq "41"){
@ -1215,7 +1216,7 @@ sub CUL_HM_Parse($$) {##############################
}
if (defined($state)){# if state was detected post events
my $txt;
if ($lvlStr{md}{$model}){$txt = $lvlStr{md}{$model}{$state}}
if ($lvlStr{md}{$md}){$txt = $lvlStr{md}{$md}{$state}}
elsif ($lvlStr{st}{$st}) {$txt = $lvlStr{st}{$st}{$state} }
else {$txt = "unknown:$state"}
@ -2217,6 +2218,9 @@ sub CUL_HM_Set($@) {
if($st eq "blindActuator") { # need to stop blind to protect relais
CUL_HM_PushCmdStack($hash,'++'.$flag.'11'.$id.$dst.'03'.$chn)
}
elsif ($md eq "HM-Sen-RD-O"){# on<->off for this sensor...
$lvl = ($lvl eq "00")?"C8":"00";
}
CUL_HM_PushCmdStack($hash,"++$flag"."11$id$dst"."02$chn$lvl".'0000');
$hash = $chnHash; # report to channel if defined
}
@ -2234,7 +2238,8 @@ sub CUL_HM_Set($@) {
return "please enter the duration in seconds"
if (!defined $duration || $duration !~ m/^[+-]?\d+(\.\d+)?$/);
my $tval = CUL_HM_encodeTime16($duration);# onTime 0.0..85825945.6, 0=forever
CUL_HM_PushCmdStack($hash,'++'.$flag.'11'.$id.$dst.'02'.$chn.'C80000'.$tval);
my $lvl = ($md eq "HM-Sen-RD-O")?"00":"C8";
CUL_HM_PushCmdStack($hash,"++$flag"."11$id$dst"."02$chn$lvl"."C80000$tval");
$hash = $chnHash; # report to channel if defined
}
elsif($cmd eq "lock") { #####################################################
@ -2765,8 +2770,8 @@ sub CUL_HM_infoUpdtDevData($$$) {#autoread config
my($name,$hash,$p) = @_;
my($fw,$mId,$serNo,$stc,$devInfo) = ($1,$2,$3,$4,$5)
if($p =~ m/(..)(.{4})(.{20})(.{2})(.*)/);
my $model = $culHmModel{$mId}{name} ? $culHmModel{$mId}{name}:"unknown";
$attr{$name}{model} = $model;
my $md = $culHmModel{$mId}{name} ? $culHmModel{$mId}{name}:"unknown";
$attr{$name}{model} = $md;
$attr{$name}{subType} = $culHmModel{$mId}{st};
$attr{$name}{serialNr} = pack('H*',$serNo);
#expert level attributes
@ -2791,9 +2796,9 @@ sub CUL_HM_infoUpdtDevData($$$) {#autoread config
my $chnName = $name."_".$chnTpName.(($chnStart == $chnEnd)?
'':'_'.sprintf("%02d",$chnNoTyp));
InternalTimer($startime++,"CUL_HM_infoUpdtChanData",
"$chnName,$chnId,$model",0);
"$chnName,$chnId,$md",0);
}
$attr{CUL_HM_id2Name($chnId)}{model} = $model;
$attr{CUL_HM_id2Name($chnId)}{model} = $md;
$chnNoTyp++;
}
}

View File

@ -591,7 +591,7 @@ sub HMinfo_status($){##########################################################
}
}
#====== collection finished - start data preparation======
delete $hash->{$_} foreach (grep(/^(ERR|W_sum_)/,keys%{$hash}));# remove old
delete $hash->{$_} foreach (grep(/^(ERR|W_)/,keys%{$hash}));# remove old
foreach my $read(grep {defined $sum{$_}} @crit){ #--- disp crt count
$hash->{"W_sum_".$read} = "";

View File

@ -195,7 +195,7 @@ my %culHmModel=(
"00A4" => {name=>"HM-LC-Dim1T-Pl-2" ,st=>'dimmer' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"",},
"00A5" => {name=>"HM-RC-Sec4-2" ,st=>'remote' ,cyc=>'' ,rxt=>'c:l' ,lst=>'1,4' ,chn=>"Btn:1:2,BTN_T:3:1,BTN_A:4:1",},#only 1 and 2 canbe peered???
"00A6" => {name=>"HM-RC-Key4-2" ,st=>'remote' ,cyc=>'' ,rxt=>'c:l' ,lst=>'1,4' ,chn=>"Btn:1:2,BTN_T:3:1,BTN_A:4:1",},#only 1 and 2 canbe peered???
"00A7" => {name=>"HM-Sen-RD-O" ,st=>'sensRain' ,cyc=>'' ,rxt=>'' ,lst=>'1:1,4:1' ,chn=>"Rain:1:1,Heating:2:2",},
"00A7" => {name=>"HM-Sen-RD-O" ,st=>'sensRain' ,cyc=>'' ,rxt=>'' ,lst=>'1:1,4:1' ,chn=>"Rain:1:1,Heating:2:2",},#stc:70 THSensor
"00A8" => {name=>"HM-WDS30-OT2-SM" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'p' ,chn=>"Th:1:4,Weather:5:5",},
"00A9" => {name=>"HM-PB-6-WM55" ,st=>'remote' ,cyc=>'' ,rxt=>'c' ,lst=>'1,4' ,chn=>"Btn:1:6",},
"00AB" => {name=>"HM-LC-SW4-BA-PCB" ,st=>'switch' ,cyc=>'' ,rxt=>'b' ,lst=>'1,3' ,chn=>"Sw:1:4",},