add many code for shading
This commit is contained in:
parent
b386fadd44
commit
8ab9c46b12
@ -41,7 +41,7 @@ package main;
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
my $version = '0.2.0.12';
|
my $version = '0.2.1.30';
|
||||||
|
|
||||||
sub AutoShuttersControl_Initialize($) {
|
sub AutoShuttersControl_Initialize($) {
|
||||||
my ($hash) = @_;
|
my ($hash) = @_;
|
||||||
@ -150,10 +150,10 @@ my %userAttrList = (
|
|||||||
'ASC_Up:time,astro,brightness' => 'astro',
|
'ASC_Up:time,astro,brightness' => 'astro',
|
||||||
'ASC_Down:time,astro,brightness' => 'astro',
|
'ASC_Down:time,astro,brightness' => 'astro',
|
||||||
'ASC_AutoAstroModeMorning:REAL,CIVIL,NAUTIC,ASTRONOMIC,HORIZON' => 'none',
|
'ASC_AutoAstroModeMorning:REAL,CIVIL,NAUTIC,ASTRONOMIC,HORIZON' => 'none',
|
||||||
'ASC_AutoAstroModeMorningHorizon:-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9'
|
'ASC_AutoAstroModeMorningHorizon:-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9'
|
||||||
=> 'none',
|
=> 'none',
|
||||||
'ASC_AutoAstroModeEvening:REAL,CIVIL,NAUTIC,ASTRONOMIC,HORIZON' => 'none',
|
'ASC_AutoAstroModeEvening:REAL,CIVIL,NAUTIC,ASTRONOMIC,HORIZON' => 'none',
|
||||||
'ASC_AutoAstroModeEveningHorizon:-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9'
|
'ASC_AutoAstroModeEveningHorizon:-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9'
|
||||||
=> 'none',
|
=> 'none',
|
||||||
'ASC_Open_Pos:0,10,20,30,40,50,60,70,80,90,100' => [ '', 0, 100 ],
|
'ASC_Open_Pos:0,10,20,30,40,50,60,70,80,90,100' => [ '', 0, 100 ],
|
||||||
'ASC_Closed_Pos:0,10,20,30,40,50,60,70,80,90,100' => [ '', 100, 0 ],
|
'ASC_Closed_Pos:0,10,20,30,40,50,60,70,80,90,100' => [ '', 100, 0 ],
|
||||||
@ -167,26 +167,25 @@ my %userAttrList = (
|
|||||||
'ASC_Ventilate_Window_Open:on,off' => 'on',
|
'ASC_Ventilate_Window_Open:on,off' => 'on',
|
||||||
'ASC_LockOut:soft,hard,off' => 'off',
|
'ASC_LockOut:soft,hard,off' => 'off',
|
||||||
'ASC_LockOut_Cmd:inhibit,blocked,protection' => 'none',
|
'ASC_LockOut_Cmd:inhibit,blocked,protection' => 'none',
|
||||||
|
'ASC_BlockingTime_beforNightClose' => 3600,
|
||||||
# 'ASC_Shading_Direction' => 178,
|
'ASC_BlockingTime_beforDayOpen' => 3600,
|
||||||
# 'ASC_Shading_Pos:10,20,30,40,50,60,70,80,90,100' => [ '', 70, 30 ],
|
'ASC_Shading_Direction' => 178,
|
||||||
# 'ASC_Shading_Mode:on,off,home,absent' => 'off',
|
'ASC_Shading_Pos:10,20,30,40,50,60,70,80,90,100' => [ '', 70, 30 ],
|
||||||
# 'ASC_Shading_Angle_Left:0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90'
|
'ASC_Shading_Mode:on,off,home,absent' => 'off',
|
||||||
# => 85,
|
'ASC_Shading_Angle_Left:0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90'
|
||||||
# 'ASC_Shading_Angle_Right:0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90'
|
=> 85,
|
||||||
# => 85,
|
'ASC_Shading_Angle_Right:0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90'
|
||||||
|
=> 85,
|
||||||
'ASC_Shading_Brightness_Sensor' => 'none',
|
'ASC_Shading_Brightness_Sensor' => 'none',
|
||||||
'ASC_Shading_Brightness_Reading' => 'brightness',
|
'ASC_Shading_Brightness_Reading' => 'brightness',
|
||||||
#
|
'ASC_Shading_StateChange_Sunny' => 6000,
|
||||||
# 'ASC_Shading_StateChange_Sunny' => '6000',
|
'ASC_Shading_StateChange_Cloudy' => 4000,
|
||||||
# 'ASC_Shading_StateChange_Cloudy' => '4000',
|
'ASC_Shading_Min_Elevation' => 10.0,
|
||||||
# 'ASC_Shading_WaitingPeriod' => 20,
|
'ASC_Shading_Min_OutsideTemperature' => 18,
|
||||||
# 'ASC_Shading_Min_Elevation' => 'none',
|
'ASC_Shading_WaitingPeriod' => 1200,
|
||||||
# 'ASC_Shading_Min_OutsideTemperature' => 18,
|
'ASC_Shading_BlockingTime_afterManual' => 1200,
|
||||||
# 'ASC_Shading_BlockingTime_After_Manual' => 20,
|
# 'ASC_Shading_Fast_Open:on,off' => 'none',
|
||||||
# 'ASC_Shading_BlockingTime_Twilight' => 45,
|
# 'ASC_Shading_Fast_Close:on,off' => 'none',
|
||||||
# 'ASC_Shading_Fast_Open:on,off' => 'none',
|
|
||||||
# 'ASC_Shading_Fast_Close:on,off' => 'none',
|
|
||||||
'ASC_Drive_Offset' => -1,
|
'ASC_Drive_Offset' => -1,
|
||||||
'ASC_WindowRec_subType:twostate,threestate' => 'twostate',
|
'ASC_WindowRec_subType:twostate,threestate' => 'twostate',
|
||||||
'ASC_ShuttersPlace:window,terrace' => 'window',
|
'ASC_ShuttersPlace:window,terrace' => 'window',
|
||||||
@ -194,7 +193,7 @@ my %userAttrList = (
|
|||||||
'ASC_ComfortOpen_Pos:0,10,20,30,40,50,60,70,80,90,100' => [ '', 20, 80 ],
|
'ASC_ComfortOpen_Pos:0,10,20,30,40,50,60,70,80,90,100' => [ '', 20, 80 ],
|
||||||
'ASC_GuestRoom:on,off' => 'none',
|
'ASC_GuestRoom:on,off' => 'none',
|
||||||
'ASC_Antifreeze:off,soft,hard,am,pm' => 'off',
|
'ASC_Antifreeze:off,soft,hard,am,pm' => 'off',
|
||||||
'ASC_Antifreeze_Pos:5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100'
|
'ASC_Antifreeze_Pos:5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100'
|
||||||
=> [ '', 85, 15 ],
|
=> [ '', 85, 15 ],
|
||||||
'ASC_Partymode:on,off' => 'off',
|
'ASC_Partymode:on,off' => 'off',
|
||||||
'ASC_Roommate_Device' => 'none',
|
'ASC_Roommate_Device' => 'none',
|
||||||
@ -632,6 +631,7 @@ sub ShuttersDeviceScan($) {
|
|||||||
$shutters->setDelayCmd('none');
|
$shutters->setDelayCmd('none');
|
||||||
$shutters->setNoOffset(0);
|
$shutters->setNoOffset(0);
|
||||||
$shutters->setPosSetCmd( $posSetCmds{ $defs{$_}->{TYPE} } );
|
$shutters->setPosSetCmd( $posSetCmds{ $defs{$_}->{TYPE} } );
|
||||||
|
$shutters->setShading('out');
|
||||||
}
|
}
|
||||||
|
|
||||||
# $hash->{NOTIFYDEV} = $hash->{NOTIFYDEV} . $shuttersList;
|
# $hash->{NOTIFYDEV} = $hash->{NOTIFYDEV} . $shuttersList;
|
||||||
@ -1253,6 +1253,9 @@ sub EventProcessingShadingBrightness($@) {
|
|||||||
my $reading = $shutters->getShadingBrightnessReading;
|
my $reading = $shutters->getShadingBrightnessReading;
|
||||||
|
|
||||||
if ( $events =~ m#$reading:\s(\d+)# ) {
|
if ( $events =~ m#$reading:\s(\d+)# ) {
|
||||||
|
my $homemode = $shutters->getRoommatesStatus;
|
||||||
|
$homemode = $ascDev->getResidentsStatus if ( $homemode eq 'none' );
|
||||||
|
|
||||||
ShadingProcessing(
|
ShadingProcessing(
|
||||||
$hash, $shuttersDev,
|
$hash, $shuttersDev,
|
||||||
$ascDev->getAzimuth, $ascDev->getElevation,
|
$ascDev->getAzimuth, $ascDev->getElevation,
|
||||||
@ -1260,8 +1263,8 @@ sub EventProcessingShadingBrightness($@) {
|
|||||||
$shutters->getDirection, $shutters->getShadingAngleLeft,
|
$shutters->getDirection, $shutters->getShadingAngleLeft,
|
||||||
$shutters->getShadingAngleRight
|
$shutters->getShadingAngleRight
|
||||||
)
|
)
|
||||||
if ( $shutters->getShadingMode eq 'on'
|
if ( ( $shutters->getShadingMode eq 'on'
|
||||||
or $shutters->getShadingMode eq $ascDev->getResidentsStatus
|
or $shutters->getShadingMode eq $homemode)
|
||||||
and IsDay( $hash, $shuttersDev ) );
|
and IsDay( $hash, $shuttersDev ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1269,17 +1272,17 @@ sub EventProcessingShadingBrightness($@) {
|
|||||||
sub EventProcessingTwilightDevice($@) {
|
sub EventProcessingTwilightDevice($@) {
|
||||||
my ( $hash, $device, $events ) = @_;
|
my ( $hash, $device, $events ) = @_;
|
||||||
|
|
||||||
# Twilight
|
# Twilight
|
||||||
# azimuth = azimuth = Sonnenwinkel
|
# azimuth = azimuth = Sonnenwinkel
|
||||||
# elevation = elevation = Sonnenhöhe
|
# elevation = elevation = Sonnenhöhe
|
||||||
#
|
#
|
||||||
# Astro
|
# Astro
|
||||||
# SunAz = azimuth = Sonnenwinkel
|
# SunAz = azimuth = Sonnenwinkel
|
||||||
# SunAlt = evaluation = Sonnenhöhe
|
# SunAlt = evaluation = Sonnenhöhe
|
||||||
|
|
||||||
if ( $events =~ m#(azimuth|evaluation|SunAz|SunAlt):\s(\d+.\d+)# ) {
|
if ( $events =~ m#(azimuth|evaluation|SunAz|SunAlt):\s(\d+.\d+)# ) {
|
||||||
my $name = $device;
|
my $name = $device;
|
||||||
my ( $azimuth, $elevation, $outTemp, $brightness );
|
my ( $azimuth, $elevation );
|
||||||
|
|
||||||
$azimuth = $2 if ( $1 eq 'azimuth' or $1 eq 'SunAz' );
|
$azimuth = $2 if ( $1 eq 'azimuth' or $1 eq 'SunAz' );
|
||||||
$elevation = $2 if ( $1 eq 'evaluation' or $1 eq 'SunAlt' );
|
$elevation = $2 if ( $1 eq 'evaluation' or $1 eq 'SunAlt' );
|
||||||
@ -1291,6 +1294,10 @@ sub EventProcessingTwilightDevice($@) {
|
|||||||
|
|
||||||
foreach my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
|
foreach my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
|
||||||
$shutters->setShuttersDev($shuttersDev);
|
$shutters->setShuttersDev($shuttersDev);
|
||||||
|
|
||||||
|
my $homemode = $shutters->getRoommatesStatus;
|
||||||
|
$homemode = $ascDev->getResidentsStatus if ( $homemode eq 'none' );
|
||||||
|
|
||||||
ShadingProcessing(
|
ShadingProcessing(
|
||||||
$hash,
|
$hash,
|
||||||
$shuttersDev,
|
$shuttersDev,
|
||||||
@ -1305,7 +1312,7 @@ sub EventProcessingTwilightDevice($@) {
|
|||||||
if (
|
if (
|
||||||
(
|
(
|
||||||
$shutters->getShadingMode eq 'on'
|
$shutters->getShadingMode eq 'on'
|
||||||
or $shutters->getShadingMode eq $ascDev->getResidentsStatus
|
or $shutters->getShadingMode eq $homemode
|
||||||
)
|
)
|
||||||
and IsDay( $hash, $shuttersDev )
|
and IsDay( $hash, $shuttersDev )
|
||||||
);
|
);
|
||||||
@ -1314,32 +1321,56 @@ sub EventProcessingTwilightDevice($@) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub ShadingProcessing($@) {
|
sub ShadingProcessing($@) {
|
||||||
|
### angleMinus ist $shutters->getShadingAngleLeft
|
||||||
|
### anglePlus ist $shutters->getShadingAngleRight
|
||||||
|
### winPos ist die Fensterposition $shutters->getDirection
|
||||||
my (
|
my (
|
||||||
$hash, $shuttersDev,
|
$hash, $shuttersDev,
|
||||||
$azimuth, $elevation,
|
$azimuth, $elevation,
|
||||||
$brightness, $outTemp,
|
$brightness, $outTemp,
|
||||||
$shuttersDirection, $shuttersShadingAngleLeft,
|
$winPos, $angleMinus,
|
||||||
$shuttersShadingAngleRight
|
$anglePlus
|
||||||
) = @_;
|
) = @_;
|
||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
|
$shutters->setShuttersDev($shuttersDev);
|
||||||
|
|
||||||
# Log3( $name, 1,
|
Log3( $name, 1,
|
||||||
# "AutoShuttersControl ($name) - Shading Processing, Rollladen: " . $shuttersDev . " Azimuth: " . $azimuth . " Elevation: " . $elevation . " Brightness: " . $brightness . " OutTemp: " . $outTemp
|
"AutoShuttersControl ($name) - Shading Processing, Rollladen: " . $shuttersDev . " Azimuth: " . $azimuth . " Elevation: " . $elevation . " Brightness: " . $brightness . " OutTemp: " . $outTemp
|
||||||
# );
|
);
|
||||||
#
|
|
||||||
# return
|
|
||||||
# if ( $azimuth == -1 or $elevation == -1 or $brightness == -1 or $outTemp == -100 );
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# # brightness -1
|
|
||||||
# # outTemp -100
|
|
||||||
# # azimuth -1
|
|
||||||
# # elevation -1
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# Log3( $name, 1,
|
|
||||||
# "AutoShuttersControl ($name) - Shading Processing hinter dem return");
|
|
||||||
|
|
||||||
|
return
|
||||||
|
if ( $azimuth == -1 or $elevation == -1 or $brightness == -1 or $outTemp == -100 or $outTemp < $shutters->getShadingMinOutsideTemperature );
|
||||||
|
|
||||||
|
# minimalen und maximalen Winkel des Fensters bestimmen. wenn die aktuelle Sonnenposition z.B. bei 205° läge und der Wert für angleMin/Max 85° wäre, dann würden zwischen 120° und 290° beschattet.
|
||||||
|
my $winPosMin = $winPos - $angleMinus;
|
||||||
|
my $winPosMax = $winPos + $anglePlus;
|
||||||
|
|
||||||
|
if ( $azimuth < $winPosMin
|
||||||
|
or $azimuth > $winPosMax
|
||||||
|
or $elevation < $shutters->getShadingMinElevation
|
||||||
|
or $brightness < $shutters->getShadingStateChangeSunny )
|
||||||
|
{
|
||||||
|
$shutters->setShading('out reserved');
|
||||||
|
$shutters->setShading('out')
|
||||||
|
if ( $shutters->getShading eq 'out reserved'
|
||||||
|
and (int(gettimeofday()) - $shutters->getShadingTimestamp) > $shutters->getShadingWaitingPeriod );
|
||||||
|
}
|
||||||
|
elsif ( $azimuth >= $winPosMin
|
||||||
|
and $azimuth <= $winPosMax
|
||||||
|
and $elevation >= $shutters->getShadingMinElevation
|
||||||
|
and $brightness >= $shutters->getShadingStateChangeSunny )
|
||||||
|
{
|
||||||
|
$shutters->setShading('in reserved') if ($shutters->getShading eq 'out');
|
||||||
|
$shutters->setShading('in')
|
||||||
|
if ( $shutters->getShading eq 'in reserved'
|
||||||
|
and (int(gettimeofday()) - $shutters->getShadingTimestamp) > $shutters->getShadingWaitingPeriod );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( $shutters->getShading eq 'out' or $shutters->getShading eq 'in' ) {
|
||||||
|
|
||||||
|
Log3( $name, 1,
|
||||||
|
"AutoShuttersControl ($name) - Shading Processing - Shading Wert :" . $shutters->getShading );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub EventProcessingPartyMode($) {
|
sub EventProcessingPartyMode($) {
|
||||||
@ -2642,6 +2673,37 @@ sub getRoommatesLastStatus {
|
|||||||
return $revStatePrio{$minPrio};
|
return $revStatePrio{$minPrio};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
### Begin Beschattung Objekt mit Daten befüllen
|
||||||
|
sub setShading {
|
||||||
|
my ( $self, $value ) = @_;
|
||||||
|
### Werte für value = in, out, in reserved, out reserved
|
||||||
|
|
||||||
|
$self->{ $self->{shuttersDev} }{Shading}{VAL} = $value
|
||||||
|
if ( defined($value) );
|
||||||
|
$self->{ $self->{shuttersDev} }{Shading}{TIME} = int( gettimeofday() )
|
||||||
|
if ( defined( $self->{ $self->{shuttersDev} }{Shading} ) );
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub getShading
|
||||||
|
{ # Werte für value = in, out, in reserved, out reserved
|
||||||
|
my $self = shift;
|
||||||
|
|
||||||
|
return $self->{ $self->{shuttersDev} }{Shading}{VAL}
|
||||||
|
if ( defined( $self->{ $self->{shuttersDev} }{Shading} )
|
||||||
|
and defined( $self->{ $self->{shuttersDev} }{Shading}{VAL} ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
sub getShadingTimestamp {
|
||||||
|
my $self = shift;
|
||||||
|
|
||||||
|
return $self->{ $self->{shuttersDev} }{Shading}{TIME}
|
||||||
|
if ( defined( $self->{ $self->{shuttersDev} } )
|
||||||
|
and defined( $self->{ $self->{shuttersDev} }{Shading} )
|
||||||
|
and defined( $self->{ $self->{shuttersDev} }{Shading}{TIME} ) );
|
||||||
|
}
|
||||||
|
### Ende Beschattung
|
||||||
|
|
||||||
## Subklasse Attr von ASC_Shutters##
|
## Subklasse Attr von ASC_Shutters##
|
||||||
package ASC_Shutters::Attr;
|
package ASC_Shutters::Attr;
|
||||||
|
|
||||||
@ -2689,6 +2751,7 @@ sub getWiggleValue {
|
|||||||
return AttrVal( $self->{shuttersDev}, 'ASC_WiggleValue', 5 );
|
return AttrVal( $self->{shuttersDev}, 'ASC_WiggleValue', 5 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
### Begin Beschattung
|
||||||
sub getShadingPos {
|
sub getShadingPos {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $default = $self->{defaultarg};
|
my $default = $self->{defaultarg};
|
||||||
@ -2741,12 +2804,55 @@ sub getShadingAngleRight {
|
|||||||
return AttrVal( $self->{shuttersDev}, 'ASC_Shading_Angle_Right', -1 );
|
return AttrVal( $self->{shuttersDev}, 'ASC_Shading_Angle_Right', -1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub getShadingMinOutsideTemperature {
|
||||||
|
my $self = shift;
|
||||||
|
|
||||||
|
return AttrVal( $self->{shuttersDev}, 'ASC_Shading_Min_OutsideTemperature', 2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
sub getShadingMinElevation {
|
||||||
|
my $self = shift;
|
||||||
|
|
||||||
|
return AttrVal( $self->{shuttersDev}, 'ASC_Shading_Min_Elevation', 15.0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
sub getShadingStateChangeSunny {
|
||||||
|
my $self = shift;
|
||||||
|
|
||||||
|
return AttrVal( $self->{shuttersDev}, 'ASC_Shading_StateChange_Sunny', 5000 );
|
||||||
|
}
|
||||||
|
|
||||||
|
sub getShadingStateChangeCloudy {
|
||||||
|
my $self = shift;
|
||||||
|
|
||||||
|
return AttrVal( $self->{shuttersDev}, 'ASC_Shading_StateChange_Cloudy', 2000 );
|
||||||
|
}
|
||||||
|
|
||||||
|
sub getShadingWaitingPeriod {
|
||||||
|
my $self = shift;
|
||||||
|
|
||||||
|
return AttrVal( $self->{shuttersDev}, 'ASC_Shading_WaitingPeriod', 1200 );
|
||||||
|
}
|
||||||
|
### Ende Beschattung
|
||||||
|
|
||||||
sub getOffset {
|
sub getOffset {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_Drive_Offset', 0 );
|
return AttrVal( $self->{shuttersDev}, 'ASC_Drive_Offset', 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub getBlockingTimeBeforNightClose {
|
||||||
|
my $self = shift;
|
||||||
|
|
||||||
|
return AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_beforNightClose', 3600 );
|
||||||
|
}
|
||||||
|
|
||||||
|
sub getBlockingTimeBeforDayOpen {
|
||||||
|
my $self = shift;
|
||||||
|
|
||||||
|
return AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_beforDayOpen', 3600 );
|
||||||
|
}
|
||||||
|
|
||||||
sub getPosCmd {
|
sub getPosCmd {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user