mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-04-24 21:29:21 +00:00
bug fixin peer list, virtual actor, regdisplay, add valve simulator
git-svn-id: https://svn.fhem.de/fhem/trunk@2195 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
c3a3049e63
commit
58623bd7ec
@ -456,7 +456,7 @@ CUL_HM_Parse($$)
|
|||||||
$vp = int($vp/2.56+0.5); # valve position in %
|
$vp = int($vp/2.56+0.5); # valve position in %
|
||||||
my $chnHash = $modules{CUL_HM}{defptr}{$src.$chn};
|
my $chnHash = $modules{CUL_HM}{defptr}{$src.$chn};
|
||||||
readingsSingleUpdate($chnHash,"state","$vp %",1) if($chnHash);
|
readingsSingleUpdate($chnHash,"state","$vp %",1) if($chnHash);
|
||||||
push @event, "actuator:$vp %";
|
push @event, "actuator:$vp%";
|
||||||
|
|
||||||
# Set the valve state too, without an extra trigger
|
# Set the valve state too, without an extra trigger
|
||||||
readingsSingleUpdate($dhash,"state","set_$vp %",1) if($dhash);
|
readingsSingleUpdate($dhash,"state","set_$vp %",1) if($dhash);
|
||||||
@ -554,10 +554,10 @@ CUL_HM_Parse($$)
|
|||||||
elsif($msgType eq "01"){ # status reports
|
elsif($msgType eq "01"){ # status reports
|
||||||
if($p =~ m/^010809(..)0A(..)/) { # TC set valve for VD => post events to VD
|
if($p =~ m/^010809(..)0A(..)/) { # TC set valve for VD => post events to VD
|
||||||
my ( $of, $vep) = (hex($1), hex($2));
|
my ( $of, $vep) = (hex($1), hex($2));
|
||||||
push @event, "ValveErrorPosition_for_$dname: $vep %";
|
push @event, "ValveErrorPosition_for_$dname: $vep%";
|
||||||
push @event, "ValveOffset_for_$dname: $of %";
|
push @event, "ValveOffset_for_$dname: $of%";
|
||||||
CUL_HM_UpdtReadBulk($dhash,1,'ValveErrorPosition:set_'.$vep.' %',
|
CUL_HM_UpdtReadBulk($dhash,1,'ValveErrorPosition:set_'.$vep.'%',
|
||||||
'ValveOffset:set_'.$of.' %');
|
'ValveOffset:set_'.$of.'%');
|
||||||
}
|
}
|
||||||
elsif($p =~ m/^010[56]/){ # 'prepare to set' or 'end set'
|
elsif($p =~ m/^010[56]/){ # 'prepare to set' or 'end set'
|
||||||
push @event,""; #
|
push @event,""; #
|
||||||
@ -735,7 +735,7 @@ CUL_HM_Parse($$)
|
|||||||
elsif($st eq "virtual"){#####################################################
|
elsif($st eq "virtual"){#####################################################
|
||||||
# possibly add code to count all acks that are paired.
|
# possibly add code to count all acks that are paired.
|
||||||
if($msgType eq "02") {
|
if($msgType eq "02") {
|
||||||
push @event, "ackFrom ".$name;
|
push @event, "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
elsif($st eq "outputUnit"){##################################################
|
elsif($st eq "outputUnit"){##################################################
|
||||||
@ -1041,6 +1041,16 @@ CUL_HM_Parse($$)
|
|||||||
CUL_HM_SndCmd($chnHash,$msgcnt."8002".$dst.$src.'0101'.
|
CUL_HM_SndCmd($chnHash,$msgcnt."8002".$dst.$src.'0101'.
|
||||||
sprintf("%02X",$vp*2)."0000");#$vp, $err,$??
|
sprintf("%02X",$vp*2)."0000");#$vp, $err,$??
|
||||||
}
|
}
|
||||||
|
elsif($msgType eq "02"){
|
||||||
|
if ($dhash->{helper}{respWait}{msgId} &&
|
||||||
|
$dhash->{helper}{respWait}{msgId} eq $msgcnt ){
|
||||||
|
#ack we waited for - stop Waiting
|
||||||
|
CUL_HM_respPendRm($dhash);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (hex($msgFlag)&0x20){
|
||||||
|
CUL_HM_SndCmd($dhash, $msgcnt."8002".$dst.$src."00");#virtual must ack
|
||||||
|
}
|
||||||
}
|
}
|
||||||
elsif($id eq $dst){# if fhem is destination check if we need to react
|
elsif($id eq $dst){# if fhem is destination check if we need to react
|
||||||
if($msgType =~ m/^4./ && $p =~ m/^(..)/ && #Push Button event
|
if($msgType =~ m/^4./ && $p =~ m/^(..)/ && #Push Button event
|
||||||
@ -1553,7 +1563,7 @@ my %culHmSubTypeSets = (
|
|||||||
{ raw => "data ...",
|
{ raw => "data ...",
|
||||||
devicepair => "<btnNumber> device ... [single|dual] [set|unset] [actor|remote|both]",
|
devicepair => "<btnNumber> device ... [single|dual] [set|unset] [actor|remote|both]",
|
||||||
press => "[long|short]...",
|
press => "[long|short]...",
|
||||||
# valvePos => "position",#acting as TC
|
valvePos => "position",#acting as TC
|
||||||
virtual =>"<noButtons>",}, #redef necessary for virtual
|
virtual =>"<noButtons>",}, #redef necessary for virtual
|
||||||
smokeDetector =>
|
smokeDetector =>
|
||||||
{ test => "", "alarmOn"=>"", "alarmOff"=>"",
|
{ test => "", "alarmOn"=>"", "alarmOff"=>"",
|
||||||
@ -2187,14 +2197,16 @@ CUL_HM_Set($@)
|
|||||||
elsif($cmd eq "valvePos") { ##################
|
elsif($cmd eq "valvePos") { ##################
|
||||||
return "only number <= 100 or 'off' allowed"
|
return "only number <= 100 or 'off' allowed"
|
||||||
if (!($a[2] eq "off" ||$a[2]+0 ne $a[2] ||$a[2] <100 ));
|
if (!($a[2] eq "off" ||$a[2]+0 ne $a[2] ||$a[2] <100 ));
|
||||||
RemoveInternalTimer("valvePos:$dst");# remove responsePending timer
|
|
||||||
if ($a[2] eq "off"){
|
if ($a[2] eq "off"){
|
||||||
$state = "ValveAdjust:stopped";
|
$state = "ValveAdjust:stopped";
|
||||||
|
RemoveInternalTimer("valvePos:$dst$chn");# remove responsePending timer
|
||||||
|
delete($hash->{helper}{virtTC});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
my $vp = $a[2];
|
my $vp = $a[2];
|
||||||
readingsSingleUpdate($hash,"valvePosTC","$vp%",0);
|
readingsSingleUpdate($hash,"valvePosTC","$vp%",0);
|
||||||
CUL_HM_valvePosUpdt("valvePos:$dst$chn");
|
CUL_HM_valvePosUpdt("valvePos:$dst$chn") if (!$hash->{helper}{virtTC});
|
||||||
|
$hash->{helper}{virtTC} = "03";
|
||||||
$state = "ValveAdjust:$vp%";
|
$state = "ValveAdjust:$vp%";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2380,24 +2392,35 @@ CUL_HM_Set($@)
|
|||||||
}
|
}
|
||||||
|
|
||||||
###################################
|
###################################
|
||||||
|
my $updtValveCnt = 0;
|
||||||
|
|
||||||
sub
|
sub
|
||||||
CUL_HM_valvePosUpdt(@)
|
CUL_HM_valvePosUpdt(@)
|
||||||
{# update valve position periodically to please valve
|
{# update valve position periodically to please valve
|
||||||
my($in ) = @_;
|
my($in ) = @_;
|
||||||
my(undef,$vId) = split(':',$in);
|
my(undef,$vId) = split(':',$in);
|
||||||
my $hash = CUL_HM_id2Hash($vId);
|
my $hash = CUL_HM_id2Hash($vId);
|
||||||
my $name = $hash->{NAME};
|
|
||||||
my $ioId = CUL_HM_Id($hash->{IODev});
|
|
||||||
my $vDevId = substr($vId,0,6);
|
my $vDevId = substr($vId,0,6);
|
||||||
my $vp = ReadingsVal($name,"valvePosTC","15 %");
|
my $nextTimer = 150;
|
||||||
$vp =~ s/%//;
|
|
||||||
$vp *=2;
|
# if ($updtValveCnt++ %2){
|
||||||
foreach my $peer (sort(split(',',AttrVal($name,"peerIDs","")))) {
|
# $nextTimer = 20;
|
||||||
next if (length($peer) != 8);
|
# CUL_HM_PushCmdStack($hash,"++8670".$vDevId."00000000D036");# some weather event -
|
||||||
$peer = substr($peer,0,6);
|
# }
|
||||||
CUL_HM_PushCmdStack($hash,sprintf("++A258%s%s00%02X",$vDevId,$peer,$vp));
|
# else{
|
||||||
}
|
my $name = $hash->{NAME};
|
||||||
InternalTimer(gettimeofday()+150,"CUL_HM_valvePosUpdt","valvePos:$vId",0);
|
my $vp = ReadingsVal($name,"valvePosTC","15 %");
|
||||||
|
$vp =~ s/%//;
|
||||||
|
$vp *=2.56;
|
||||||
|
foreach my $peer (sort(split(',',AttrVal($name,"peerIDs","")))) {
|
||||||
|
next if (length($peer) != 8);
|
||||||
|
$peer = substr($peer,0,6);
|
||||||
|
CUL_HM_PushCmdStack($hash,sprintf("++A258%s%s%s%02X",$vDevId,$peer,$hash->{helper}{virtTC},$vp));
|
||||||
|
}
|
||||||
|
# }
|
||||||
|
$hash->{helper}{virtTC} = "00";
|
||||||
|
CUL_HM_ProcessCmdStack($hash);
|
||||||
|
InternalTimer(gettimeofday()+$nextTimer,"CUL_HM_valvePosUpdt","valvePos:$vId",0);
|
||||||
}
|
}
|
||||||
sub
|
sub
|
||||||
CUL_HM_infoUpdtDevData($$$){
|
CUL_HM_infoUpdtDevData($$$){
|
||||||
@ -3204,15 +3227,14 @@ CUL_HM_parseCommon(@){
|
|||||||
if($list eq "00"){
|
if($list eq "00"){
|
||||||
my $name = CUL_HM_id2Name($src);
|
my $name = CUL_HM_id2Name($src);
|
||||||
readingsSingleUpdate($shash,"PairedTo",
|
readingsSingleUpdate($shash,"PairedTo",
|
||||||
sprintf("%02X%02X%02X",
|
CUL_HM_getRegFromStore($name,"pairCentral",0,"00000000"),0);
|
||||||
CUL_HM_getRegFromStore($name,10,0,"00000000"),
|
|
||||||
CUL_HM_getRegFromStore($name,11,0,"00000000"),
|
|
||||||
CUL_HM_getRegFromStore($name,12,0,"00000000")),0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CUL_HM_respPendRm($shash);
|
CUL_HM_respPendRm($shash);
|
||||||
delete $chnHash->{helper}{shadowReg}{$regLN};#remove shadowhash
|
delete $chnHash->{helper}{shadowReg}{$regLN};#remove shadowhash
|
||||||
CUL_HM_updtRegDisp($chnHash,$list,CUL_HM_name2Id($peerName));
|
# peer Channel name from/for user entry. <IDorName> <deviceID> <ioID>
|
||||||
|
CUL_HM_updtRegDisp($chnHash,$list,
|
||||||
|
CUL_HM_peerChId($peerName,
|
||||||
|
substr(CUL_HM_hash2Id($chnHash),0,6),"000000"));
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
CUL_HM_respPendToutProlong($shash);#wasn't last - reschedule timer
|
CUL_HM_respPendToutProlong($shash);#wasn't last - reschedule timer
|
||||||
@ -3290,7 +3312,7 @@ CUL_HM_getRegFromStore($$$$)
|
|||||||
$unit = $reg->{u};
|
$unit = $reg->{u};
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
# return "invalid";
|
;# use address instead of
|
||||||
}
|
}
|
||||||
$peerId = CUL_HM_peerChId(($peerId?$peerId:"00000000"),$dId,$iId);
|
$peerId = CUL_HM_peerChId(($peerId?$peerId:"00000000"),$dId,$iId);
|
||||||
|
|
||||||
@ -3334,9 +3356,11 @@ CUL_HM_getRegFromStore($$$$)
|
|||||||
sub
|
sub
|
||||||
CUL_HM_updtRegDisp($$$)
|
CUL_HM_updtRegDisp($$$)
|
||||||
{
|
{
|
||||||
|
my $starttime = gettimeofday();
|
||||||
my($hash,$list,$peerId)=@_;
|
my($hash,$list,$peerId)=@_;
|
||||||
|
my $listNo = $list+0;
|
||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
my $peer = ($peerId)?CUL_HM_id2Name($peerId)."-":"";
|
my $peer = ($peerId)?CUL_HM_peerChName($peerId,substr($hash->{DEF},0,6),"")."-":"";
|
||||||
$peer=~s/:/-/;
|
$peer=~s/:/-/;
|
||||||
my $devName =CUL_HM_getDeviceHash($hash)->{NAME};# devName as protocol entity
|
my $devName =CUL_HM_getDeviceHash($hash)->{NAME};# devName as protocol entity
|
||||||
my $st = AttrVal($devName, "subType", "");
|
my $st = AttrVal($devName, "subType", "");
|
||||||
@ -3349,9 +3373,10 @@ CUL_HM_updtRegDisp($$$)
|
|||||||
push @regArr, keys %{$culHmRegChan{$md.$chn}} if($culHmRegChan{$md.$chn});
|
push @regArr, keys %{$culHmRegChan{$md.$chn}} if($culHmRegChan{$md.$chn});
|
||||||
my @changedRead;
|
my @changedRead;
|
||||||
foreach my $regName (@regArr){
|
foreach my $regName (@regArr){
|
||||||
next if (!$culHmRegDefine{$regName}->{d});
|
next if (!$culHmRegDefine{$regName}->{d} ||
|
||||||
|
($culHmRegDefine{$regName}->{l} != $listNo));
|
||||||
my $rgVal = CUL_HM_getRegFromStore($name,$regName,$list,$peerId);
|
my $rgVal = CUL_HM_getRegFromStore($name,$regName,$list,$peerId);
|
||||||
next if (!$rgVal || $rgVal eq "unknown");#todo General -delete this reading?
|
next if (!$rgVal || $rgVal eq "invalid");
|
||||||
my $readName = "R-".$peer.$regName;
|
my $readName = "R-".$peer.$regName;
|
||||||
push (@changedRead,$readName.":".$rgVal)
|
push (@changedRead,$readName.":".$rgVal)
|
||||||
if (ReadingsVal($name,$readName,"") ne $rgVal);
|
if (ReadingsVal($name,$readName,"") ne $rgVal);
|
||||||
@ -3392,19 +3417,18 @@ sub
|
|||||||
CUL_HM_encodeTime16($)
|
CUL_HM_encodeTime16($)
|
||||||
{
|
{
|
||||||
my $v = shift;
|
my $v = shift;
|
||||||
my $ret = "FFFF";
|
|
||||||
my $mul = 20;
|
|
||||||
|
|
||||||
return "0000" if($v < 0.05);
|
return "0000" if($v < 0.05);
|
||||||
for(my $i = 0; $i < 16; $i++) {
|
|
||||||
if($v*$mul < 0xfff) {
|
my $ret = "FFFF";
|
||||||
$ret=sprintf("%03X%X", $v*$mul, $i);
|
my $mul = 10;
|
||||||
|
for(my $i = 0; $i < 32; $i++) {
|
||||||
|
if($v*$mul < 0x7ff) {
|
||||||
|
$ret=sprintf("%04X", ((($v*$mul)<<5)+$i));
|
||||||
last;
|
last;
|
||||||
}
|
}
|
||||||
$mul /= 2;
|
$mul /= 2;
|
||||||
}
|
}
|
||||||
my $v2 = CUL_HM_decodeTime16($ret);
|
my $v2 = CUL_HM_decodeTime16($ret);
|
||||||
Log 2, "Timeout $v rounded to $v2" if($v != $v2);
|
|
||||||
return ($ret);
|
return ($ret);
|
||||||
}
|
}
|
||||||
sub
|
sub
|
||||||
@ -3427,13 +3451,10 @@ sub
|
|||||||
CUL_HM_decodeTime16($)
|
CUL_HM_decodeTime16($)
|
||||||
{
|
{
|
||||||
my $v = hex(shift);
|
my $v = hex(shift);
|
||||||
my $m = int($v/16);
|
my $m = int($v>>5);
|
||||||
my $e = $v % 16;
|
my $e = $v & 0x1f;
|
||||||
my $mul = 0.05;
|
my $mul = 0.1;
|
||||||
while($e--) {
|
return 2^$e*$m*0.1;
|
||||||
$mul *= 2;
|
|
||||||
}
|
|
||||||
return $mul*$m;
|
|
||||||
}
|
}
|
||||||
#############################
|
#############################
|
||||||
sub
|
sub
|
||||||
@ -4303,19 +4324,19 @@ CUL_HM_setAttrIfCh($$$$)
|
|||||||
T: $t H: $h<br>
|
T: $t H: $h<br>
|
||||||
temperature $t<br>
|
temperature $t<br>
|
||||||
humidity $h<br>
|
humidity $h<br>
|
||||||
actuator $vp %<br>
|
actuator $vp%<br>
|
||||||
desired-temp $t<br>
|
desired-temp $t<br>
|
||||||
desired-temp-ack $t<br>
|
desired-temp-ack $t<br>
|
||||||
tempList$wd hh:mm $t hh:mm $t ...<br>
|
tempList$wd hh:mm $t hh:mm $t ...<br>
|
||||||
ValveErrorPosition $dname $vep %<br>
|
ValveErrorPosition $dname $vep%<br>
|
||||||
ValveOffset $dname $of %<br>
|
ValveOffset $dname $of%<br>
|
||||||
windowopentemp-$tchan $t (sensor:$tdev)<br>
|
windowopentemp-$tchan $t (sensor:$tdev)<br>
|
||||||
<li>HM-CC-VD:<br>
|
<li>HM-CC-VD:<br>
|
||||||
actuator $vp %<br>
|
actuator $vp%<br>
|
||||||
motor [opening|closing|blocked|loose|adjusting range too small|ok]<br>
|
motor [opening|closing|blocked|loose|adjusting range too small|ok]<br>
|
||||||
battery [low|ok]<br>
|
battery [low|ok]<br>
|
||||||
ValveErrorPosition $vep %<br>
|
ValveErrorPosition $vep%<br>
|
||||||
ValveOffset $dname $of %<br>
|
ValveOffset $dname $of%<br>
|
||||||
<li>KFM100:<br>
|
<li>KFM100:<br>
|
||||||
rawValue $v<br>
|
rawValue $v<br>
|
||||||
Sequence $s<br>
|
Sequence $s<br>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user