99_MyUtils.pm bei niedrigen Aussentemp keine Abschattung

This commit is contained in:
Marc Hoppe
2014-11-02 12:57:14 +01:00
parent 29c17c82a6
commit 35c766e3a3

View File

@@ -2,8 +2,9 @@ package main;
use strict; use strict;
use warnings; use warnings;
use POSIX; use POSIX;
sub use feature "state";
MyUtils_Initialize($$)
sub MyUtils_Initialize($$)
{ {
my ($hash) = @_; my ($hash) = @_;
} }
@@ -23,13 +24,19 @@ my @rolls = (
{ roll => "ess.roll", dir=>"S", typ=>"n", temp=>"wohn.fht", tempS=>21, win=>"", state=>STATE_IDLE, }, { roll => "ess.roll", dir=>"S", typ=>"n", temp=>"wohn.fht", tempS=>21, win=>"", state=>STATE_IDLE, },
{ roll => "kuch.rollBar", dir=>"S", typ=>"n", temp=>"wohn.fht", tempS=>21, win=>"", state=>STATE_IDLE, }, { roll => "kuch.rollBar", dir=>"S", typ=>"n", temp=>"wohn.fht", tempS=>21, win=>"", state=>STATE_IDLE, },
{ roll => "kuch.rollStr", dir=>"O", typ=>"n", temp=>"wohn.fht", tempS=>21, win=>"", state=>STATE_IDLE, }, { roll => "kuch.rollStr", dir=>"O", typ=>"n", temp=>"wohn.fht", tempS=>21, win=>"", state=>STATE_IDLE, },
{ roll => "arb.rollTerr", dir=>"W", typ=>"n", temp=>"studio.fht", tempS=>21, win=>"", state=>STATE_IDLE, }, { roll => "arb.rollTerr", dir=>"W", typ=>"n", temp=>"studio.fht", tempS=>21, win=>"wohn.fenTerr", state=>STATE_IDLE, },
{ roll => "arb.rollWeg", dir=>"S", typ=>"n", temp=>"studio.fht", tempS=>21, win=>"", state=>STATE_IDLE, }, { roll => "arb.rollWeg", dir=>"S", typ=>"n", temp=>"studio.fht", tempS=>21, win=>"", state=>STATE_IDLE, },
{ roll => "bad.roll", dir=>"S", typ=>"n", temp=>"bad.fht", tempS=>23, win=>"", state=>STATE_IDLE, }, { roll => "bad.roll", dir=>"S", typ=>"n", temp=>"bad.fht", tempS=>23, win=>"", state=>STATE_IDLE, },
{ roll => "schlaf.rollWeg", dir=>"S", typ=>"s", temp=>"schlaf.fht", tempS=>18, win=>"", state=>STATE_IDLE, }, { roll => "schlaf.rollWeg", dir=>"S", typ=>"s", temp=>"schlaf.fht", tempS=>18, win=>"", state=>STATE_IDLE, },
{ roll => "schlaf.rollStr", dir=>"O", typ=>"s", temp=>"schlaf.fht", tempS=>18, win=>"", state=>STATE_IDLE, }, { roll => "schlaf.rollStr", dir=>"O", typ=>"s", temp=>"schlaf.fht", tempS=>18, win=>"wohn.fenTerr", state=>STATE_IDLE, },
); );
#my %rollStates = (
# lastWeatherCode => 0,
# lastWaetherCodeTime => 0,
# timerNum => 0,
# );
my @rollHoch = ( my @rollHoch = (
"bad.roll", "bad.roll",
@@ -43,6 +50,7 @@ my @rollHoch = (
"wohn.rollTerrR" "wohn.rollTerrR"
); );
my @rollRunter = ( my @rollRunter = (
"wohn.rollTerrR", "wohn.rollTerrR",
"wohn.rollTerrL", "wohn.rollTerrL",
@@ -76,13 +84,13 @@ my @rollArb = (
"arb.rollWeg", "arb.rollWeg",
); );
my $tc=0;
my @blocktime=localtime;
my $blocktimerRunning=0;
sub myfhem($) { sub myfhem($) {
#print "@_\n";
#Log 1, "@_"; #Log 1, "@_";
fhem("@_"); fhem("@_");
} }
sub RollCheckSkip($$) sub RollCheckSkip($$)
@@ -164,78 +172,174 @@ sub RollWeck($) {
# myfhem("set wach 1"); # myfhem("set wach 1");
} }
#------------------------------------------
sub Dbg($) { sub Dbg($) {
Log 1,$_[0]; Log 1,$_[0];
} }
sub RollRunterSchlitz($;$) {
my ($roll, $delay) = @_;
$delay ||= 0;
my @tparts = gmtime($delay);
my $t=sprintf ("%02d:%02d:%02d",@tparts[2,1,0]);
my @tparts2 = gmtime($delay+40);
my $t2=sprintf ("%02d:%02d:%02d",@tparts2[2,1,0]);
my $i=$tc++;
Dbg("RollChg: $roll - runter schlitz($delay)\n");
myfhem("define r".$i." at +".$t." set ".$roll." closes");
myfhem("define ru".$i." at +".$t2." set ".$roll." up 7");
}
sub RollHoch($;$) {
my ($roll, $delay) = @_;
$delay ||= 0;
my @tparts = gmtime($delay);
my $t=sprintf ("%02d:%02d:%02d",@tparts[2,1,0]);
my $i=$tc++;
Dbg("RollChg: $roll - hoch($delay)\n");
myfhem("define r".$i." at +".$t." set ".$roll." opens");
}
sub RollRunter($;$) {
my ($roll, $delay) = @_;
$delay ||= 0;
my @tparts = gmtime($delay);
my $t=sprintf ("%02d:%02d:%02d",@tparts[2,1,0]);
my $i=$tc++;
Dbg("RollChg: $roll - runter($delay)\n");
myfhem("define r".$i." at +".$t." set ".$roll." closes");
}
sub IsSunny($) {
my ($wett)=@_;
if($wett==30 || $wett==31 || $wett==32 || $wett==33 || $wett==34 || $wett==35 || $wett==36) { # sonnig, heiter, heiss
return(1);
}
return(0);
}
sub IsLater($) {
my($t)=@_;
#Dbg("Islater:$t");
my @time = localtime(time);
if ($t =~ /(\d+):(\d+)/ and ($time[2]>=$1) and ($time[1]>=$2) ) {
Dbg("later:$t");
return(1);
}
return(0);
}
sub IsWetterSonneWait($) {
my ($wett)=@_;
state $wettalt=0;
if($wett != $wettalt) {
if(!IsSunny($wett)) {
if(IsSunny($wettalt)) {
@blocktime=localtime;
$blocktime[2]+=2; # +2Std
if($blocktime[2]>23) { $blocktime[2]=23; } # da nachts keine sonne scheint egal
$blocktimerRunning=1;
Dbg("son1");
}
}
else {
}
$wettalt=$wett;
}
if($blocktimerRunning) {
if(!IsLater("$blocktime[2]:$blocktime[1]")) {
return(1);
}
else {
$blocktimerRunning=0;
}
}
return(0);
}
sub RollCheck() { sub RollCheck() {
# Dbg("RollCheck\n"); # Dbg("RollCheck\n");
my $temp=20; my $temp=20;
my $wett;
my $twil;
my $r; my $r;
my $sr;
my $i=0; my $i=0;
my $delay=11; my $delay=11;
my $tag=0;
my $tempOut=ReadingsVal("wetter", "temp_c", 99);
my $twil=Value("twil");
if($twil>=3 && $twil<10) { # civil
$tag=1;
}
my $wett=ReadingsVal("wetter", "code", 99);
my $sr=Value("sonnenrichtung");
my $sonneblock=IsWetterSonneWait($wett);
for $r ( @rolls ) { for $r ( @rolls ) {
my $fen="Closed"; my $fen="Closed";
my $tempH=0; my $tempH=0;
my $sonne=0; my $sonne=0;
my $tag=0;
my $skipRunter=0; my $skipRunter=0;
my $skipHoch=0; my $skipHoch=0;
my @tparts = gmtime($i*$delay+1); my $ndelay=$i*$delay+1;
my $t=sprintf ("%02d:%02d:%02d",@tparts[2,1,0]); #Dbg("--------r:g ".$r->{roll}." / ".$r->{temp});
my @tparts2 = gmtime($i*$delay+40);
my $t2=sprintf ("%02d:%02d:%02d",@tparts2[2,1,0]);
# Dbg("r:g ".$r->{roll}." / ".$r->{temp}."\n");
# Raum zu warm und aussentemp hoch ?
$temp=ReadingsVal($r->{temp},"measured-temp", 99); $temp=ReadingsVal($r->{temp},"measured-temp", 99);
if($temp > $r->{tempS}) { if($temp > $r->{tempS} && $tempOut > ($r->{tempS}-5)) {
$tempH=1; $tempH=1;
} }
$twil=Value("twil");
if($twil>=3 && $twil<10) { # civil
$tag=1;
}
$wett=ReadingsVal("wetter", "code", 99); # Sonne scheint ins Fenster ?
$sr=Value("sonnenrichtung"); if($twil>=5 && $twil<7) { # nur, wenn der Sonnenstand ueber 'weather' liegt
if($twil>=5 && $twil<8) { # indoor # bei hoher Raum- und Aussentemperatur immer unten lassen
if($wett==30 || $wett==32 || $wett==34 || $wett==36) { # sonnig, heiter, heiss if($temp > ($r->{tempS}+2) && $tempOut > $r->{tempS}) {
if (index($sr, $r->{dir}) != -1) { $sonne=1;
}
elsif (index($sr, $r->{dir}) != -1) { # Sonnenrichtung ins Fenster
if($sonneblock) {
$sonne=1;
}
elsif(IsSunny($wett)) {
$sonne=1; $sonne=1;
} }
#Dbg("son3, $sonne");
} }
} }
# Offene Fenster nicht mit Rollaeden verschliessen
if($r->{win} ne "") { if($r->{win} ne "") {
$fen=Value($r->{win}); $fen=Value($r->{win});
Dbg("test win:$r->{roll}-$fen"); #Dbg("test win:$r->{roll}-$fen");
if ($fen eq "Open") { if ($fen eq "Open") {
Dbg("$r->{roll}:skipR"); #Dbg("$r->{roll}:skipR");
$skipRunter=1; $skipRunter=1;
} }
} }
# Zur Schlafzeit nicht oeffnen
if($r->{typ} eq "s") { if($r->{typ} eq "s") {
if(Value("wach") eq "0") { if(Value("wach") eq "0") {
$skipHoch=1; $skipHoch=1;
} }
} }
Dbg("RollCheck:$r->{roll}-tempH:$tempH temp:$temp so:$sonne wett:$wett sr:$sr twil:$twil tag:$tag fen:$fen skipR:$skipRunter skipH:$skipHoch"); Dbg("RollCheck:$r->{roll}-tempH:$tempH temp:$temp tempO:$tempOut so:$sonne wett:$wett sr:$sr twil:$twil tag:$tag fen:$fen skipR:$skipRunter skipH:$skipHoch st:$r->{state}");
if( $tag and $sonne and $tempH) { if( $tag and $sonne and $tempH) {
if($r->{state}!=STATE_SCHLITZ) { if($r->{state}!=STATE_SCHLITZ) {
if(!$skipHoch && !$skipRunter) { if(!$skipHoch && !$skipRunter) {
myfhem("define r".$i." at +".$t." set ".$r->{roll}." closes"); RollRunterSchlitz($r->{roll}, $ndelay);
myfhem("define ru".$i." at +".$t2." set ".$r->{roll}." up 7");
Dbg("RollChg: $r->{roll} - runter schlitz\n");
} }
$r->{state}=STATE_SCHLITZ; $r->{state}=STATE_SCHLITZ;
} }
@@ -243,9 +347,8 @@ sub RollCheck() {
if($tag && !$sonne) { if($tag && !$sonne) {
if($r->{state}!=STATE_HOCH) { if($r->{state}!=STATE_HOCH) {
if(!$skipHoch) { if(!$skipHoch) {
myfhem("define r".$i." at +".$t." set ".$r->{roll}." opens"); RollHoch($r->{roll}, $ndelay);
Dbg("RollChg: $r->{roll} - hoch\n");
$r->{state}=STATE_HOCH; $r->{state}=STATE_HOCH;
} }
} }
@@ -254,8 +357,7 @@ sub RollCheck() {
if(!$tag) { if(!$tag) {
if($r->{state}!=STATE_RUNTER) { if($r->{state}!=STATE_RUNTER) {
if(!$skipRunter) { if(!$skipRunter) {
myfhem("define r".$i." at +".$t." set ".$r->{roll}." closes"); RollRunter($r->{roll}, $ndelay);
Dbg("RollChg: $r->{roll} - runter\n");
} }
$r->{state}=STATE_RUNTER; $r->{state}=STATE_RUNTER;
} }