From 5fdf4bbba64791282f6db9c31fd63389f9b5165a Mon Sep 17 00:00:00 2001 From: Marc Hoppe Date: Sun, 16 Aug 2020 14:38:16 +0200 Subject: [PATCH] ...setRollSlot, sun und sundir getrennt --- fhem/FHEM/99_MyUtils.pm | 99 +++++++++++++++++++++++++---------------- 1 file changed, 60 insertions(+), 39 deletions(-) diff --git a/fhem/FHEM/99_MyUtils.pm b/fhem/FHEM/99_MyUtils.pm index cc950f9b4..890d53a51 100644 --- a/fhem/FHEM/99_MyUtils.pm +++ b/fhem/FHEM/99_MyUtils.pm @@ -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 } #------------------------------------------