...setRollSlot, sun und sundir getrennt
This commit is contained in:
@@ -25,9 +25,9 @@ use constant {
|
||||
TEMP_HIGH => 3,
|
||||
TEMP_HOT => 4,
|
||||
};
|
||||
my $tempIn_offset=0;
|
||||
my $tempOut_offset=+5;
|
||||
my $tempOutForecastLimit=28;
|
||||
my $tempIn_offset = +0;
|
||||
my $tempOut_offset = +5;
|
||||
my $tempOutForecastLimit = 27;
|
||||
|
||||
# CheckSkip
|
||||
use constant {
|
||||
@@ -63,11 +63,8 @@ my @rolls = (
|
||||
my $tc=0;
|
||||
my @blocktime=localtime;
|
||||
my $blocktimerRunning=0;
|
||||
#my @schlitzblocktime=localtime;
|
||||
#my $schlitzBlocktimerRunning=0;
|
||||
my $delaySec=11;
|
||||
|
||||
#------------------------------------------
|
||||
|
||||
sub myfhem($)
|
||||
{
|
||||
@@ -77,6 +74,14 @@ sub myfhem($)
|
||||
|
||||
#------------------------------------------
|
||||
|
||||
sub Dbg($) {
|
||||
if(Value("DebugRoll") eq "1") {
|
||||
Log 1,$_[0];
|
||||
}
|
||||
}
|
||||
|
||||
#------------------------------------------
|
||||
|
||||
sub findRoll($)
|
||||
{
|
||||
my($name) = @_;
|
||||
@@ -89,11 +94,16 @@ sub findRoll($)
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
#------------------------------------------
|
||||
|
||||
sub Dbg($) {
|
||||
if(Value("DebugRoll") eq "1") {
|
||||
Log 1,$_[0];
|
||||
sub SetRollSlot($) {
|
||||
my($name) = @_;
|
||||
Dbg("SetRollSlot $name");
|
||||
my $r = findRoll($name);
|
||||
if (defined $r) {
|
||||
Dbg("found $r->{name}");
|
||||
RollRunterSchlitz($r, SKIP_NO);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -121,7 +131,6 @@ sub RollRunterSchlitz($$$)
|
||||
my $i=$tc++;
|
||||
|
||||
Dbg("RollChg: $r->{roll} - runter schlitz($ndelay)\n");
|
||||
SchlitzBlockStart($r);
|
||||
myfhem("define rc".$i." at +".$t1." set ".$r->{roll}." closes");
|
||||
myfhem("define ru".$i." at +".$t2." set ".$r->{roll}." up 6");
|
||||
$r->{state}=STATE_SCHLITZ;
|
||||
@@ -256,6 +265,7 @@ sub SchlitzBlockCheck($)
|
||||
|
||||
#------------------------------------------
|
||||
|
||||
# fhem-Variablen 'tag' und 'hell' abhängig vom Sonnenstand setzen
|
||||
sub setTagHell($$)
|
||||
{
|
||||
my ($twil, $light) = @_;
|
||||
@@ -274,7 +284,7 @@ sub setTagHell($$)
|
||||
#------------------------------------------
|
||||
|
||||
# Die maximal für den aktuellen Tag verhergesagte Temperatur bestimmen
|
||||
OBsub getTempMaxForecast()
|
||||
sub getTempMaxForecast()
|
||||
{
|
||||
# aktuellen Wert auch einbeziehen
|
||||
my $max=ReadingsVal("wetter", "tempHigh", 20);
|
||||
@@ -288,10 +298,10 @@ OBsub getTempMaxForecast()
|
||||
|
||||
#------------------------------------------
|
||||
|
||||
# Raum zu warm und aussentemp hoch ?
|
||||
# Temperaturen klassifizieren
|
||||
sub checkTemps($$$)
|
||||
{
|
||||
my($temp, $tempOut, $tempSoll)=@_;
|
||||
my ($temp, $tempOut, $tempSoll)=@_;
|
||||
my $tempI=TEMP_OK; my $tempO=TEMP_OK;
|
||||
|
||||
if ($temp > $tempSoll+$tempIn_offset+3.0) { $tempI=TEMP_HOT; }
|
||||
@@ -307,21 +317,30 @@ sub checkTemps($$$)
|
||||
#------------------------------------------
|
||||
|
||||
# Sonne scheint ins Fenster ?
|
||||
sub checkSunIn($$$$$)
|
||||
sub checkSunDir($$$)
|
||||
{
|
||||
my($twil, $sun_dir, $win_dir, $sunblock, $sunny)=@_;
|
||||
# Sonne scheint ins Fenster ?
|
||||
my $sun_in=0;
|
||||
my($twil, $sun_dir, $win_dir)=@_;
|
||||
# Sonnenrichtung scheint ins Fenster ?
|
||||
my $dir_in=0;
|
||||
if($twil>=5 && $twil<7) { # nur, wenn der Sonnenstand ueber 'weather' liegt
|
||||
if($twil>=5 && $twil<7) { # nur, wenn der Sonnenstand über 'weather' liegt
|
||||
if (index($sun_dir, $win_dir) != -1) { # Sonnenrichtung ins Fenster
|
||||
$dir_in=1;
|
||||
if ($sunblock) { $sun_in=1; }
|
||||
if ($sunny) { $sun_in=1; }
|
||||
#Dbg("son3, $sonne");
|
||||
}
|
||||
}
|
||||
return ($sun_in, $dir_in);
|
||||
return $dir_in;
|
||||
}
|
||||
|
||||
# Sonne scheint ?
|
||||
sub checkSun($$$)
|
||||
{
|
||||
my($twil, $sunblock, $sunny)=@_;
|
||||
my $sun=0;
|
||||
if($twil>=5 && $twil<7) { # nur, wenn der Sonnenstand ueber 'weather' liegt
|
||||
if ($sunblock) { $sun=1; }
|
||||
if ($sunny) { $sun=1; }
|
||||
#Dbg("son3, $sonne");
|
||||
}
|
||||
return $sun;
|
||||
}
|
||||
|
||||
#------------------------------------------
|
||||
@@ -344,13 +363,12 @@ sub checkSkip($)
|
||||
# Offene Fenster nicht mit Rollaeden verschliessen
|
||||
$skipRunter=SKIP_ALL;
|
||||
} elsif (index($typ, "o") != -1) {
|
||||
#Dbg("Skip0: t:$typ w:$winstate r:$skipRunter h:$skipHoch");
|
||||
|
||||
# bei typ o nur auf schlitz schliessen
|
||||
#Dbg("Skip0: t:$typ w:$winstate r:$skipRunter h:$skipHoch");
|
||||
$skipRunter=SKIP_DOWN;
|
||||
}
|
||||
# Zur Schlafzeit nicht oeffnen
|
||||
if (index($typ, "s") != -1) {
|
||||
# Typ s: zur Schlafzeit nicht oeffnen
|
||||
#Dbg("Skip1: t:$typ w:winstate r:$skipRunter h:$skipHoch");
|
||||
if($wach eq "0") {
|
||||
#Dbg("Skip2: t:$typ w:winstate r:$skipRunter h:$skipHoch");
|
||||
@@ -392,19 +410,20 @@ sub RollCheck()
|
||||
for $r ( @rolls ) {
|
||||
#Dbg("--------r:g ".$r->{roll}." / ".$r->{temp});
|
||||
my $run=0;
|
||||
my $tempIn=ReadingsVal($r->{temp},"temperature", 99);
|
||||
my($tempI, $tempO)=checkTemps($tempIn, $tempOut, $r->{tempSoll}); # Temperatur klassifizieren
|
||||
my($sunIn, $sunDir) =checkSunIn($twil, $sr, $r->{dir}, $sonneblock, $sunny); # Sonne scheint ins Fenster ?
|
||||
# Offene Fenster nicht mit Rollaeden verschliessen, zur Schlafenszeit nicht öffnen
|
||||
my $tempIn = ReadingsVal($r->{temp},"temperature", 99);
|
||||
my($tempI, $tempO) = checkTemps($tempIn, $tempOut, $r->{tempSoll}); # Temperatur klassifizieren
|
||||
my $sun = checkSun($twil,$sonneblock, $sunny); # Sonne scheint (bleibt true für best. Zeit) ?
|
||||
my $sunDir =checkSunDir($twil, $sr, $r->{dir}); # Sonne scheint ins Fenster ?
|
||||
# Offene Fenster nicht mit Rollaeden verschliessen, zur Schlafenszeit nicht öffnen
|
||||
my ($skipRunter, $skipHoch)=checkSkip($r);
|
||||
# Bedingungen zum Fahren
|
||||
my $Hot = $tempO>=TEMP_HOT;
|
||||
my $WarmSun = $sunIn && $tempO>=TEMP_HIGH;
|
||||
my $WarmHotIn = $sunDir && $tempO>=TEMP_HIGH && $tempI>=TEMP_HOT;
|
||||
my $ForecastHotSun = $sunIn && $tempOutMaxForecast>=$tempOutForecastLimit;
|
||||
my $ForecastHotWarmIn = $sunDir && $tempOutMaxForecast>=$tempOutForecastLimit && $tempI>=TEMP_HIGH;
|
||||
my $Cold = $tempO<=TEMP_COLD;
|
||||
my $NoSunNotHot = !$sunIn && ($tempO<=TEMP_LOW || $tempI<=TEMP_OK);
|
||||
my $Hot = $tempO>=TEMP_HOT;
|
||||
my $WarmSun = $sun && $sunDir && $tempO>=TEMP_HIGH;
|
||||
my $WarmHotIn = $sunDir && $tempO>=TEMP_HIGH && $tempI>=TEMP_HOT;
|
||||
my $ForecastHotSun = $sun && $sunDir && $tempOutMaxForecast>=$tempOutForecastLimit;
|
||||
my $ForecastHotWarmIn = $sunDir && $tempOutMaxForecast>=$tempOutForecastLimit && $tempI>=TEMP_HIGH;
|
||||
my $Cold = $tempO<=TEMP_COLD;
|
||||
my $NoSunNotHot = !$sunDir && ($tempO<=TEMP_LOW || $tempI<=TEMP_OK);
|
||||
|
||||
if (!$tag) {
|
||||
$run=RollRunter($r, $skipRunter, $ndelay++);
|
||||
@@ -412,20 +431,22 @@ sub RollCheck()
|
||||
$run=RollHoch($r, $skipHoch, $ndelay++);
|
||||
} elsif ($Hot || $WarmSun || $WarmHotIn || $ForecastHotSun || $ForecastHotWarmIn) {
|
||||
$run=RollRunterSchlitz($r, $skipRunter, $ndelay++);
|
||||
if ($run) { SchlitzBlockStart($r); }
|
||||
} elsif ( $Cold || $NoSunNotHot ) {
|
||||
if(!SchlitzBlockCheck($r)) { $run=RollHoch($r, $skipHoch, $ndelay++); }
|
||||
} elsif ( ($tag && !$tagalt) || ($wach && !$wachalt) ) { # bei Tagesbeginn hoch
|
||||
$run=RollHoch($r, $skipHoch, $ndelay++);
|
||||
}
|
||||
# if ($run) {
|
||||
if ($run) {
|
||||
Dbg("RollCheck: H:$Hot WS:$WarmSun WHI:$WarmHotIn FHS:$ForecastHotSun FHI:$ForecastHotWarmIn C:$Cold NSNH:$NoSunNotHot "
|
||||
. "to:$tempOut twil:$twil light:$light wett:$wett sr:$sr block:$sonneblock tomax:$tempOutMaxForecast "
|
||||
. "$r->{roll}-tempLevI,O:$tempI,$tempO tempI,O:$tempIn,$tempOut sun:$sunIn/$sunDir wett:$wett sr:$sr "
|
||||
. "$r->{roll}-tempLevI,O:$tempI,$tempO tempI,O:$tempIn,$tempOut sun:$sun/$sunDir wett:$wett sr:$sr "
|
||||
. "twil:$twil tag:$tag/$tagalt wach:$wach/$wachalt skipR,H:$skipRunter,$skipHoch st:$r->{state}");
|
||||
# }
|
||||
}
|
||||
} # for $r
|
||||
$tagalt=$tag;
|
||||
$wachalt=$wach;
|
||||
#$sunDiralt=$sunDir
|
||||
}
|
||||
|
||||
#------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user