From 3fc70eb26aa8b0ab9a7facc76bf4ad361c0ce8d9 Mon Sep 17 00:00:00 2001 From: Marc Hoppe Date: Mon, 17 Jul 2017 23:25:21 +0200 Subject: [PATCH] RollCheck --- fhem/FHEM/99_MyUtils.pm | 75 ++++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 30 deletions(-) diff --git a/fhem/FHEM/99_MyUtils.pm b/fhem/FHEM/99_MyUtils.pm index ee3e09da6..5e5c1db9c 100644 --- a/fhem/FHEM/99_MyUtils.pm +++ b/fhem/FHEM/99_MyUtils.pm @@ -24,11 +24,11 @@ my @rolls = ( { roll => "ess.roll", dir=>"S", typ=>"n", temp=>"tempWohn", tempSoll=>20, win=>"", state=>STATE_IDLE, }, { roll => "kuch.rollBar", dir=>"S", typ=>"n", temp=>"tempKueche", tempSoll=>20, win=>"", state=>STATE_IDLE, }, { roll => "kuch.rollStr", dir=>"O", typ=>"n", temp=>"tempKueche", tempSoll=>20, win=>"", state=>STATE_IDLE, }, - { roll => "arb.rollTerr", dir=>"W", typ=>"n", temp=>"tempStudio", tempSoll=>20, win=>"wohn.fenTerr", state=>STATE_IDLE, }, + { roll => "arb.rollTerr", dir=>"W", typ=>"n", temp=>"tempStudio", tempSoll=>20, win=>"", state=>STATE_IDLE, }, { roll => "arb.rollWeg", dir=>"S", typ=>"n", temp=>"tempStudio", tempSoll=>20, win=>"", state=>STATE_IDLE, }, { roll => "bad.roll", dir=>"S", typ=>"n", temp=>"tempBad", tempSoll=>22, win=>"", state=>STATE_IDLE, }, { roll => "schlaf.rollWeg", dir=>"S", typ=>"s", temp=>"tempSchlaf", tempSoll=>18, win=>"", state=>STATE_IDLE, }, - { roll => "schlaf.rollStr", dir=>"O", typ=>"s", temp=>"tempSchlaf", tempSoll=>18, win=>"wohn.fenTerr", state=>STATE_IDLE, }, + { roll => "schlaf.rollStr", dir=>"O", typ=>"s", temp=>"tempSchlaf", tempSoll=>18, win=>"", state=>STATE_IDLE, }, ); @@ -84,11 +84,12 @@ my $blocktimerRunning=0; my $delaySec=11; my $tempIn_offset=0; -my $tempOut_offset=+1; +my $tempOut_offset=+2; #------------------------------------------ -sub myfhem($) { +sub myfhem($) +{ #Log 1, "@_"; fhem("@_"); } @@ -187,61 +188,71 @@ sub Dbg($) { #------------------------------------------ -sub RollRunterSchlitz($$) { +sub getDelayTime($) +{ + my ($delay_sec) = @_; + my @tparts = gmtime($delay_sec); + my $t=sprintf ("%02d:%02d:%02d",@tparts[2,1,0]); + return($t); +} + +#------------------------------------------ + +sub RollRunterSchlitz($$) +{ my ($r, $ndelay) = @_; $ndelay ||= 0; if ($r->{state}!=STATE_SCHLITZ) { - my @tparts = gmtime($ndelay*$delaySec); - my $t=sprintf ("%02d:%02d:%02d",@tparts[2,1,0]); - my @tparts2 = gmtime($ndelay*$delaySec+40); - my $t2=sprintf ("%02d:%02d:%02d",@tparts2[2,1,0]); + my $t1=getDelayTime($ndelay*$delaySec); + my $t2=getDelayTime($ndelay*$delaySec+39); my $i=$tc++; Dbg("RollChg: $r->{roll} - runter schlitz($ndelay)\n"); - myfhem("define r".$i." at +".$t." set ".$r->{roll}." closes"); - myfhem("define ru".$i." at +".$t2." set ".$r->{roll}." up 6"); + myfhem("define rc".$i." at +".$t1." set ".$r->{roll}." closes"); + myfhem("define ru".$i." at +".$t2." set ".$r->{roll}." up 5"); $r->{state}=STATE_SCHLITZ; } } #------------------------------------------ -sub RollHoch($$) { +sub RollHoch($$) +{ my ($r, $ndelay) = @_; $ndelay ||= 0; if ($r->{state}!=STATE_HOCH) { - my @tparts = gmtime($ndelay*$delaySec); - my $t=sprintf ("%02d:%02d:%02d",@tparts[2,1,0]); + my $t1=getDelayTime($ndelay*$delaySec); my $i=$tc++; Dbg("RollChg: $r->{roll} - hoch($ndelay)\n"); - myfhem("define r".$i." at +".$t." set ". $r->{roll} ." opens"); + myfhem("define ro".$i." at +".$t1." set ". $r->{roll} ." opens"); $r->{state}=STATE_HOCH; } } #------------------------------------------ -sub RollRunter($$) { +sub RollRunter($$) +{ my ($r, $ndelay) = @_; $ndelay ||= 0; if ($r->{state}!=STATE_RUNTER) { - my @tparts = gmtime($ndelay*$delaySec); - my $t=sprintf ("%02d:%02d:%02d",@tparts[2,1,0]); + my $t1=getDelayTime($ndelay*$delaySec); my $i=$tc++; Dbg("RollChg: $r->{roll} - runter($ndelay)\n"); - myfhem("define r".$i." at +".$t." set ".$r->roll." closes"); + myfhem("define rc".$i." at +".$t1." set ".$r->{roll}." closes"); $r->{state}=STATE_RUNTER; } } #------------------------------------------ -sub IsSunny($) { +sub IsSunny($) +{ my ($wett)=@_; if($wett==30 || $wett==31 || $wett==32 || $wett==33 || $wett==34 || $wett==35 || $wett==36) { # sonnig, heiter, heiss return(1); @@ -251,7 +262,8 @@ sub IsSunny($) { #------------------------------------------ -sub IsLater($) { +sub IsLater($) +{ my($t)=@_; #Dbg("Islater:$t"); my @time = localtime(time); @@ -367,9 +379,11 @@ sub checkSkip($$$) #------------------------------------------ -sub RollCheck() { +sub RollCheck() +{ + state $tagalt=0; my $r; - my $ndelay =1; + my $ndelay =0; my $tempOut=ReadingsVal("myWH1080", "Temp-outside", 99); my $twil =Value("twil"); my $light =ReadingsVal("twil", "light", 0); @@ -396,25 +410,26 @@ sub RollCheck() { Dbg("RollCheck:$r->{roll}-tempH,OH,L,OL:$tempH,$tempOH,$tempL,$tempOL tempI,O:$temp,$tempOut so:$sonne wett:$wett sr:$sr twil:$twil tag:$tag skipR,H:$skipRunter,$skipHoch st:$r->{state}"); - if (!$tag) { - Dbg(" runter"); if (!$skipRunter) { RollRunter($r, $ndelay++); } } - elsif ($tag && $tempH && ($sonne || $tempOH)) { - Dbg(" schl"); + elsif ($tag && $tempH && (($sonne && !$tempOL) || $tempOH)) { if (!$skipHoch && !$skipRunter) { RollRunterSchlitz($r, $ndelay++); } } - elsif ($tag && ($tempL || (!$sonne && $tempOL)) ) { - Dbg(" hoch"); + elsif ($tag && $tempL && $tempOL) { + if (!$skipHoch) { RollHoch($r, $ndelay++); } + } + elsif ($tag && !$tagalt) { # bei Tagesbeginn und im Temp-hysteresebereich -> hoch if (!$skipHoch) { RollHoch($r, $ndelay++); } } } # for + $tagalt=$tag; } #------------------------------------------ -sub Untoggle($) { +sub Untoggle($) +{ my ($obj) = @_; if (Value($obj) eq "toggle"){ if (OldValue($obj) eq "off") {