2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-05-01 06:28:32 +00:00

HM-CC-TC changes by Oskar

git-svn-id: https://svn.fhem.de/fhem/trunk@1242 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig 2012-02-08 07:54:44 +00:00
parent 16f00f5f3a
commit 24a49f083e
2 changed files with 276 additions and 11 deletions

View File

@ -367,9 +367,9 @@ CUL_HM_Parse($$)
my $msg; my $msg;
if($plist == 5) { if($plist == 5) {
if($o1 eq "05") { if($o1 eq "05") {
$msg = sprintf("windowopen-temp-%d: %.1f (sensor:%s)", $msg = sprintf("windowopen-temp-%d: %.1f (sensor:%s)",
$tchan, $v1/2, $tdev); $tchan, $v1/2, $tdev);
} }
} }
push @event, $msg if $msg; push @event, $msg if $msg;
} }
@ -396,7 +396,7 @@ CUL_HM_Parse($$)
my $dayidx = int($idx/48); my $dayidx = int($idx/48);
if($idx % 4 == 0 && $dayidx < $maxdays) { if($idx % 4 == 0 && $dayidx < $maxdays) {
$idx -= 48*$dayidx; $idx -= 48*$dayidx;
$idx /= 2; $idx /= 2;
my $ptr = $shash->{TEMPLIST}{$days[$dayidx+$dayoff]}; my $ptr = $shash->{TEMPLIST}{$days[$dayidx+$dayoff]};
$ptr->{$idx}{HOUR} = int($v1/6); $ptr->{$idx}{HOUR} = int($v1/6);
$ptr->{$idx}{MINUTE} = ($v1 - int($v1/6)*6)*10; $ptr->{$idx}{MINUTE} = ($v1 - int($v1/6)*6)*10;
@ -408,25 +408,60 @@ CUL_HM_Parse($$)
} }
foreach my $wd (@days) { foreach my $wd (@days) {
my $twentyfour = 0; my $twentyfour = 0;
my $msg = sprintf("tempList%s:", $wd); my $msg = sprintf("tempList%s:", $wd);
foreach(my $idx=0; $idx<24; $idx+=1) { foreach(my $idx=0; $idx<24; $idx+=1) {
my $ptr = $shash->{TEMPLIST}{$wd}{$idx}; my $ptr = $shash->{TEMPLIST}{$wd}{$idx};
if(defined ($ptr->{TEMP}) && $ptr->{TEMP} ne "") { if(defined ($ptr->{TEMP}) && $ptr->{TEMP} ne "") {
if($twentyfour == 0) { if($twentyfour == 0) {
$msg .= sprintf(" %02d:%02d %.1f", $msg .= sprintf(" %02d:%02d %.1f",
$ptr->{HOUR}, $ptr->{MINUTE}, $ptr->{TEMP}); $ptr->{HOUR}, $ptr->{MINUTE}, $ptr->{TEMP});
} else { } else {
$ptr->{HOUR} = $ptr->{MINUTE} = $ptr->{TEMP} = ""; $ptr->{HOUR} = $ptr->{MINUTE} = $ptr->{TEMP} = "";
} }
} }
if(defined ($ptr->{HOUR}) && 0+$ptr->{HOUR} == 24) { if(defined ($ptr->{HOUR}) && 0+$ptr->{HOUR} == 24) {
$twentyfour = 1; # next value uninteresting, only first counts. $twentyfour = 1; # next value uninteresting, only first counts.
} }
} }
push @event, $msg if($msg); push @event, $msg if($msg);
} }
# 0402000000000501090000
} elsif($cmd eq "A410" && $p =~ m/^0402000000000(.)(..)(..)/) {
my ($plist, $o1, $v1) =
(hex($1),hex($2),hex($3));
my $msg;
my @days = ("Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri");
if($plist == 5) {
$msg = sprintf("param-change: offset=%s, value=%s", $o1, $v1);
if($o1 == 1) { ### bitfield containing multiple values...
$msg = "displayMode:temperature only" if ($v1 & 1) == 0;
$msg = "displayMode:temperature and humidity" if ($v1 & 1) == 1;
push @event, $msg if $msg;
$msg = "displayTemp:actual" if ($v1 & 2) == 0;
$msg = "displayTemp:setpoint" if ($v1 & 2) == 2;
push @event, $msg if $msg;
$msg = "displayTempUnit:celsius" if ($v1 & 4) == 0;
$msg = "displayTempUnit:fahrenheit" if ($v1 & 4) == 4;
push @event, $msg if $msg;
$msg = "controlMode:manual" if ($v1 & 0x18) == 0;
$msg = "controlMode:auto" if ($v1 & 0x18) == 8;
$msg = "controlMode:central" if ($v1 & 0x18) == 0x10;
$msg = "controlMode:party" if ($v1 & 0x18) == 0x18;
push @event, $msg if $msg;
my $day = $days[($v1 & 0xE0) - 0xD9 + 1];
$msg = sprintf("decalcDay:%s", $day);
# remember state for subsequent set operations
$shash->{helper}{state251} = $v1;
} elsif($o1 == 2) {
$msg = "tempValveMode:Auto" if ($v1 & 0xC0) == 0;
$msg = "tempValveMode:Closed" if ($v1 & 0xC0) == 0x40;
$msg = "tempValveMode:Open" if ($v1 & 0xC0) == 0x80;
}
}
push @event, $msg if $msg;
} }
if($cmd eq "A001" && $p =~ m/^01080900(..)(..)/) { if($cmd eq "A001" && $p =~ m/^01080900(..)(..)/) {
@ -444,6 +479,10 @@ CUL_HM_Parse($$)
push @event, "desired-temp:" .hex($1)/2; push @event, "desired-temp:" .hex($1)/2;
} }
if($cmd eq "8002" && $p =~ m/^0102(..)(....)/) { # Ack for fhem-command
push @event, "desired-temp:" .hex($1)/2;
}
CUL_HM_SendCmd($shash, "++8002$id${src}00",1,0) # Send Ack CUL_HM_SendCmd($shash, "++8002$id${src}00",1,0) # Send Ack
if($id eq $dst && $cmd ne "8002"); if($id eq $dst && $cmd ne "8002");
@ -717,6 +756,7 @@ CUL_HM_Parse($$)
} }
#push @event, "unknownMsg:$p" if(!@event); #push @event, "unknownMsg:$p" if(!@event);
push @event, "unknownMsg:($cmd) $p" if(!@event);
my @changed; my @changed;
for(my $i = 0; $i < int(@event); $i++) { for(my $i = 0; $i < int(@event); $i++) {
@ -760,6 +800,23 @@ CUL_HM_Parse($$)
return $name; return $name;
} }
###################################
sub
CUL_HM_TC_missing($)
{
#
# find out missing configuration parameters
#
my ($hash) = @_ ;
my $missingSettings = "please complete settings for ";
$missingSettings .= "displayTemp " unless($hash->{READINGS}{displayTemp}{VAL});
$missingSettings .= "displayTempUnit " unless($hash->{READINGS}{displayTempUnit}{VAL});
$missingSettings .= "displayMode " unless($hash->{READINGS}{displayMode}{VAL});
$missingSettings .= "controlMode " unless($hash->{READINGS}{controlMode}{VAL});
$missingSettings .= "decalcDay " unless($hash->{READINGS}{decalcDay}{VAL});
return $missingSettings;
}
my %culHmGlobalSets = ( my %culHmGlobalSets = (
raw => "data ...", raw => "data ...",
reset => "", reset => "",
@ -797,6 +854,11 @@ my %culHmModelSets = (
"tempListThu"=> "HH:MM temp ...", "tempListThu"=> "HH:MM temp ...",
"tempListWed"=> "HH:MM temp ...", "tempListWed"=> "HH:MM temp ...",
"tempListFri"=> "HH:MM temp ...", "tempListFri"=> "HH:MM temp ...",
"displayMode" => "[temp-only|temp-hum]",
"displayTemp" => "[actual|setpoint]",
"displayTempUnit" => "[celsius|fahrenheit]",
"controlMode" => "[manual|auto|central|party]",
"decalcDay" => "day",
}, },
); );
@ -829,6 +891,10 @@ CUL_HM_Set($@)
my $isSender = (AttrVal($name,"hmClass","") eq "sender" || $md eq "HM-CC-TC"); my $isSender = (AttrVal($name,"hmClass","") eq "sender" || $md eq "HM-CC-TC");
# HM-CC-TC control mode bits for day encoding
my %tc_day2bits = ( "Sat"=>"0", "Sun"=>"0x20", "Mon"=>"0x40",
"Tue"=>"0x60", "Wed"=>"0x80", "Thu"=>"0xA0",
"Fri"=>"0xC0");
if(!defined($h) && defined($culHmSubTypeSets{$st}{pct}) && $cmd =~ m/^\d+/) { if(!defined($h) && defined($culHmSubTypeSets{$st}{pct}) && $cmd =~ m/^\d+/) {
$cmd = "pct"; $cmd = "pct";
@ -939,6 +1005,198 @@ CUL_HM_Set($@)
CUL_HM_pushConfig($hash, $id, $dst, $bn, 1, $l1); CUL_HM_pushConfig($hash, $id, $dst, $bn, 1, $l1);
} elsif($cmd =~ m/^displayMode$/) { ###############################
my $tcnf;
if($hash->{helper}{state251}) {
$tcnf = $hash->{helper}{state251};
if($a[2] eq "temp-only") {
$tcnf &= 0xFE;
} else {
$tcnf |= 0x1;
}
} else {
# look if index 1 subfields are complete, construct state251,
# if incomplete, issue errormessage, set reading and wait for
# completion of state251
if($hash->{READINGS}{displayTemp}{VAL} &&
$hash->{READINGS}{displayTempUnit}{VAL} &&
$hash->{READINGS}{controlMode}{VAL} &&
$hash->{READINGS}{decalcDay}{VAL}) {
$tcnf = 0;
$tcnf |= 1 if($a[2] ne "temp-only"); # the parameter actually to be changed
$tcnf |= 2 if($hash->{READINGS}{displayTemp}{VAL} eq "setpoint");
$tcnf |= 4 if($hash->{READINGS}{displayTempUnit}{VAL} eq "fahrenheit");
$tcnf |= 8 if($hash->{READINGS}{controlMode}{VAL} eq "auto");
$tcnf |= 0x10 if($hash->{READINGS}{controlMode}{VAL} eq "central");
$tcnf |= 0x18 if($hash->{READINGS}{controlMode}{VAL} eq "party");
my $dbit = $tc_day2bits{$hash->{READINGS}{decalcDay}{VAL}};
$tcnf |= $dbit;
} else {
$hash->{READINGS}{$cmd}{TIME} = TimeNow();
$hash->{READINGS}{$cmd}{VAL} = sprintf("%s", $a[2]);
return CUL_HM_TC_missing($hash);
}
}
CUL_HM_pushConfig($hash, $id, $dst, 2, 5, "01$tcnf");
$hash->{helper}{state251} = $tcnf;
$hash->{READINGS}{$cmd}{TIME} = TimeNow();
$hash->{READINGS}{$cmd}{VAL} = sprintf("%s", $a[2]);
return;
} elsif($cmd =~ m/^displayTemp$/) { ###############################
my $tcnf;
if($hash->{helper}{state251}) {
$tcnf = $hash->{helper}{state251};
if($a[2] eq "setpoint") {
$tcnf &= 0xFD;
} else {
$tcnf |= 0x2;
}
} else {
# look if index 1 subfields are complete, construct state251,
# if incomplete, issue errormessage, set reading and wait for
# completion of state251
if($hash->{READINGS}{displayMode}{VAL} &&
$hash->{READINGS}{displayTempUnit}{VAL} &&
$hash->{READINGS}{controlMode}{VAL} &&
$hash->{READINGS}{decalcDay}{VAL}) {
$tcnf = 0;
$tcnf |= 1 if($hash->{READINGS}{displayMode}{VAL} ne "temp-only");
$tcnf |= 2 if($a[2] ne "setpoint"); # the parameter actually to be changed
$tcnf |= 4 if($hash->{READINGS}{displayTempUnit}{VAL} eq "fahrenheit");
$tcnf |= 8 if($hash->{READINGS}{controlMode}{VAL} eq "auto");
$tcnf |= 0x10 if($hash->{READINGS}{controlMode}{VAL} eq "central");
$tcnf |= 0x18 if($hash->{READINGS}{controlMode}{VAL} eq "party");
my $dbit = $tc_day2bits{$hash->{READINGS}{decalcDay}{VAL}};
$tcnf |= $dbit;
} else {
$hash->{READINGS}{$cmd}{TIME} = TimeNow();
$hash->{READINGS}{$cmd}{VAL} = sprintf("%s", $a[2]);
return CUL_HM_TC_missing($hash);
}
}
CUL_HM_pushConfig($hash, $id, $dst, 2, 5, "01$tcnf");
$hash->{helper}{state251} = $tcnf;
$hash->{READINGS}{$cmd}{TIME} = TimeNow();
$hash->{READINGS}{$cmd}{VAL} = sprintf("%s", $a[2]);
return;
} elsif($cmd =~ m/^displayTempUnit$/) { ###############################
my $tcnf;
if($hash->{helper}{state251}) {
$tcnf = $hash->{helper}{state251};
if($a[2] eq "celsius") {
$tcnf &= 0xFD;
} else {
$tcnf |= 0xFB;
}
} else {
# look if index 1 subfields are complete, construct state251,
# if incomplete, issue errormessage, set reading and wait for
# completion of state251
if($hash->{READINGS}{displayTemp}{VAL} &&
$hash->{READINGS}{displayMode}{VAL} &&
$hash->{READINGS}{controlMode}{VAL} &&
$hash->{READINGS}{decalcDay}{VAL}) {
$tcnf = 0;
$tcnf |= 1 if($hash->{READINGS}{displayMode}{VAL} ne "temp-only");
$tcnf |= 2 if($hash->{READINGS}{displayTemp}{VAL} eq "setpoint");
$tcnf |= 4 if($a[2] ne "fahrenheit"); # the parameter actually to be changed
$tcnf |= 8 if($hash->{READINGS}{controlMode}{VAL} eq "auto");
$tcnf |= 0x10 if($hash->{READINGS}{controlMode}{VAL} eq "central");
$tcnf |= 0x18 if($hash->{READINGS}{controlMode}{VAL} eq "party");
my $dbit = $tc_day2bits{$hash->{READINGS}{decalcDay}{VAL}};
$tcnf |= $dbit;
} else {
$hash->{READINGS}{$cmd}{TIME} = TimeNow();
$hash->{READINGS}{$cmd}{VAL} = sprintf("%s", $a[2]);
return CUL_HM_TC_missing($hash);
}
}
CUL_HM_pushConfig($hash, $id, $dst, 2, 5, "01$tcnf");
$hash->{helper}{state251} = $tcnf;
$hash->{READINGS}{$cmd}{TIME} = TimeNow();
$hash->{READINGS}{$cmd}{VAL} = sprintf("%s", $a[2]);
return;
} elsif($cmd =~ m/^controlMode$/) { ###############################
my $tcnf;
if($hash->{helper}{state251}) {
$tcnf = $hash->{helper}{state251};
$tcnf &= 0xE7; # blank out the control mode bits (equals mode manual)
$tcnf |= 0x08 if($a[2] eq "auto");
$tcnf |= 0x10 if($a[2] eq "central");
$tcnf |= 0x18 if($a[2] eq "party");
} else {
# look if index 1 subfields are complete, construct state251,
# if incomplete, issue errormessage, set reading and wait for
# completion of state251
if($hash->{READINGS}{displayTemp}{VAL} &&
$hash->{READINGS}{displayMode}{VAL} &&
$hash->{READINGS}{displayTempUnit}{VAL} &&
$hash->{READINGS}{decalcDay}{VAL}) {
$tcnf = 0;
$tcnf |= 1 if($hash->{READINGS}{displayMode}{VAL} ne "temp-only");
$tcnf |= 2 if($hash->{READINGS}{displayTemp}{VAL} eq "setpoint");
$tcnf |= 4 if($hash->{READINGS}{displayTempUnit}{VAL} eq "fahrenheit");
$tcnf |= 8 if($a[2] eq "auto"); # the parameter actually to be changed
$tcnf |= 0x10 if($a[2] eq "central");
$tcnf |= 0x18 if($a[2] eq "party");
my $dbit = $tc_day2bits{$hash->{READINGS}{decalcDay}{VAL}};
$tcnf |= $dbit;
} else {
$hash->{READINGS}{$cmd}{TIME} = TimeNow();
$hash->{READINGS}{$cmd}{VAL} = sprintf("%s", $a[2]);
return CUL_HM_TC_missing($hash);
}
}
CUL_HM_pushConfig($hash, $id, $dst, 2, 5, "01$tcnf");
$hash->{helper}{state251} = $tcnf;
$hash->{READINGS}{$cmd}{TIME} = TimeNow();
$hash->{READINGS}{$cmd}{VAL} = sprintf("%s", $a[2]);
return;
} elsif($cmd =~ m/^decalcDay$/) { ###############################
my $tcnf;
my $dbit = $tc_day2bits{$a[2]};
if($hash->{helper}{state251}) {
$tcnf = $hash->{helper}{state251};
$tcnf &= 0x1F; # blank out the decalc day bits (equals Sat)
$tcnf |= $dbit;
} else {
# look if index 1 subfields are complete, construct state251,
# if incomplete, issue errormessage, set reading and wait for
# completion of state251
if($hash->{READINGS}{displayTemp}{VAL} &&
$hash->{READINGS}{displayMode}{VAL} &&
$hash->{READINGS}{displayTempUnit}{VAL} &&
$hash->{READINGS}{controlMode}{VAL}) {
$tcnf = 0;
$tcnf |= 1 if($hash->{READINGS}{displayMode}{VAL} ne "temp-only");
$tcnf |= 2 if($hash->{READINGS}{displayTemp}{VAL} eq "setpoint");
$tcnf |= 4 if($hash->{READINGS}{displayTempUnit}{VAL} eq "fahrenheit");
$tcnf |= 8 if($hash->{READINGS}{controlMode}{VAL} eq "auto");
$tcnf |= 0x10 if($hash->{READINGS}{controlMode}{VAL} eq "central");
$tcnf |= 0x18 if($hash->{READINGS}{controlMode}{VAL} eq "party");
$tcnf |= $dbit; # the parameter actually to be changed
} else {
$hash->{READINGS}{$cmd}{TIME} = TimeNow();
$hash->{READINGS}{$cmd}{VAL} = sprintf("%s", $a[2]);
return CUL_HM_TC_missing($hash);
}
}
CUL_HM_pushConfig($hash, $id, $dst, 2, 5, "01$tcnf");
$hash->{helper}{state251} = $tcnf;
$hash->{READINGS}{$cmd}{TIME} = TimeNow();
$hash->{READINGS}{$cmd}{VAL} = sprintf("%s", $a[2]);
return;
} elsif($cmd =~ m/^desired-temp$/) { ################## } elsif($cmd =~ m/^desired-temp$/) { ##################
my $temp = CUL_HM_convTemp($a[2]); my $temp = CUL_HM_convTemp($a[2]);
return $temp if(length($temp) > 2); return $temp if(length($temp) > 2);

View File

@ -2949,7 +2949,7 @@ A line ending with \ will be concatenated with the next one, so long lines
party-temp &lt;tmp&gt;<br> party-temp &lt;tmp&gt;<br>
desired-temp &lt;tmp&gt;<br> desired-temp &lt;tmp&gt;<br>
Set different temperatures. Temp must be between 6 and 30 Set different temperatures. Temp must be between 6 and 30
Celsius, and precision is half a degree. Celsius, and precision is half a degree.</li>
<li>tempListSat HH:MM temp ... 24:00 temp<br> <li>tempListSat HH:MM temp ... 24:00 temp<br>
tempListSun HH:MM temp ... 24:00 temp<br> tempListSun HH:MM temp ... 24:00 temp<br>
tempListMon HH:MM temp ... 24:00 temp<br> tempListMon HH:MM temp ... 24:00 temp<br>
@ -2961,6 +2961,13 @@ A line ending with \ will be concatenated with the next one, so long lines
specified for each week day, the resolution is 10 Minutes. The specified for each week day, the resolution is 10 Minutes. The
last time spec must always be 24:00.<br> last time spec must always be 24:00.<br>
Example: set th tempListSat 06:00 19 23:00 22.5 24:00 19<br> Example: set th tempListSat 06:00 19 23:00 22.5 24:00 19<br>
Meaning: until 6:00 temperature shall be 19, from then until 23:00 temperature shall be
22.5, thereafter until midnight, 19 degrees celsius is desired.</li>
<li>displayMode [temp-only|temp-hum]<br>
displayTemp [actual|setpoint]<br>
displayTempUnit [celsius|fahrenheit]<br>
controlMode [manual|auto|central|party]<br>
decalcDay &lt;day&gt;</li>
</ul></li> </ul></li>
</ul> </ul>
<br> <br>