add blockAscDrivesAfterManual for complet blocking ASC drive

This commit is contained in:
Marko Oldenburg 2019-03-27 11:22:06 +01:00
parent e865c8741f
commit a17543eaa2

View File

@ -42,7 +42,7 @@ use strict;
use warnings;
use FHEM::Meta;
my $version = '0.4.0.11beta47';
my $version = '0.4.0.11beta48';
sub AutoShuttersControl_Initialize($) {
my ($hash) = @_;
@ -85,6 +85,7 @@ sub AutoShuttersControl_Initialize($) {
. 'ASC_twilightDevice '
. 'ASC_windSensor '
. 'ASC_expert:1 '
. 'ASC_blockAscDrivesAfterManual:0,1 '
. $oldAttr
. $readingFnAttributes;
$hash->{NotifyOrderPrefix} = '51-'; # Order Nummer für NotifyFn
@ -909,7 +910,7 @@ sub EventProcessingRoommate($@) {
or $getModeUp eq 'always'
or $getModeDown eq 'home'
or $getModeDown eq 'always' )
)
and IsAfterShuttersManualBlocking($shuttersDev) )
{
Log3( $name, 4,
"AutoShuttersControl ($name) - EventProcessingRoommate_1: $shuttersDev und Events $events"
@ -983,6 +984,7 @@ sub EventProcessingRoommate($@) {
)
and ( $1 eq 'gotosleep' or $1 eq 'asleep' )
and $ascDev->getAutoShuttersControlEvening eq 'on'
and IsAfterShuttersManualBlocking($shuttersDev)
)
{
my $position;
@ -1148,7 +1150,8 @@ sub EventProcessingRain($@) {
$shutters->setShuttersDev($shuttersDev);
if ( $val > $triggerMax
and $shutters->getStatus !=
$closedPos )
$closedPos
and IsAfterShuttersManualBlocking($shuttersDev) )
{
$shutters->setLastDrive('rain protection');
$shutters->setDriveCmd(
@ -1156,7 +1159,8 @@ sub EventProcessingRain($@) {
}
elsif ( ($val == 0 or $val < $triggerMax)
and $shutters->getStatus ==
$closedPos )
$closedPos
and IsAfterShuttersManualBlocking($shuttersDev) )
{
$shutters->setLastDrive('rain un-protection');
$shutters->setDriveCmd( $shutters->getLastPos );
@ -1244,6 +1248,7 @@ sub EventProcessingBrightness($@) {
)
and $1 > $brightnessMaxVal
and $shutters->getUp eq 'brightness'
and not $shutters->getSunrise
)
{
Log3( $name, 4,
@ -1274,6 +1279,8 @@ sub EventProcessingBrightness($@) {
and CheckIfShuttersWindowRecOpen($shuttersDev) == 0 )
)
{
$shutters->setSunrise(1);
$shutters->setSunset(0);
ShuttersCommandSet( $hash, $shuttersDev,
$shutters->getOpenPos );
}
@ -1292,6 +1299,7 @@ sub EventProcessingBrightness($@) {
)
and $1 < $brightnessMinVal
and $shutters->getDown eq 'brightness'
and not $shutters->getSunset
and IsAfterShuttersManualBlocking($shuttersDev)
)
{
@ -1325,6 +1333,8 @@ sub EventProcessingBrightness($@) {
or $shutters->getModeDown eq 'always'
)
{
$shutters->setSunrise(0);
$shutters->setSunset(1);
ShuttersCommandSet( $hash, $shuttersDev, $posValue );
}
else {
@ -1458,7 +1468,8 @@ sub ShadingProcessing($@) {
or $outTemp == -100
or ( int( gettimeofday() ) - $shutters->getShadingTimestamp ) <
( $shutters->getShadingWaitingPeriod / 2 )
or not IsAfterShuttersTimeBlocking( $hash, $shuttersDev ) );
or not IsAfterShuttersTimeBlocking( $hash, $shuttersDev )
or not IsAfterShuttersManualBlocking($shuttersDev) );
Log3( $name, 4,
"AutoShuttersControl ($name) - Shading Processing, Rollladen: "
@ -1563,7 +1574,8 @@ sub EventProcessingPartyMode($) {
foreach my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
$shutters->setShuttersDev($shuttersDev);
if ( not IsDay( $hash, $shuttersDev )
and $shutters->getModeDown ne 'off' )
and $shutters->getModeDown ne 'off'
and IsAfterShuttersManualBlocking($shuttersDev) )
{
if ( CheckIfShuttersWindowRecOpen($shuttersDev) == 2
and $shutters->getSubTyp eq 'threestate' )
@ -1592,7 +1604,8 @@ sub EventProcessingPartyMode($) {
);
}
}
elsif ( IsDay( $hash, $shuttersDev ) ) {
elsif ( IsDay( $hash, $shuttersDev )
and IsAfterShuttersManualBlocking($shuttersDev) ) {
$shutters->setLastDrive('drive after party mode');
ShuttersCommandSet( $hash, $shuttersDev, $shutters->getDelayCmd );
}
@ -1893,6 +1906,7 @@ sub SunSetShuttersAfterTimerFn($) {
: 'night close'
)
);
$shutters->setSunset(1);
ShuttersCommandSet(
$hash,
$shuttersDev,
@ -1940,6 +1954,7 @@ sub SunRiseShuttersAfterTimerFn($) {
)
{
$shutters->setLastDrive('day open');
$shutters->setSunrise(1);
ShuttersCommandSet( $hash, $shuttersDev, $shutters->getOpenPos );
}
}
@ -2181,10 +2196,10 @@ sub IsDay($$) {
ShuttersSunset( $hash, $shuttersDev, 'unix' ) ? 1 : 0 );
my $respIsDay = $isday;
$respIsDay = ( ($shutters->getBrightness > $shutters->getBrightnessMinVal and $isday) ? 1 : 0 )
$respIsDay = ( (($shutters->getBrightness > $shutters->getBrightnessMinVal and $isday) or $shutters->getSunset) ? 1 : 0 )
if ( $shutters->getDown eq 'brightness' );
$respIsDay = ( (($shutters->getBrightness > $shutters->getBrightnessMaxVal and not $isday) or $respIsDay) ? 1 : 0 )
$respIsDay = ( (($shutters->getBrightness > $shutters->getBrightnessMaxVal and not $isday) or $respIsDay or $shutters->getSunrise) ? 1 : 0 )
if ( $shutters->getUp eq 'brightness' );
return $respIsDay;
@ -2293,6 +2308,7 @@ sub ShuttersSunrise($$$) {
)
) + 1
);
$shuttersSunriseUnixtime += 86400 if ($shutters->getSunrise);
}
}
else {
@ -2429,7 +2445,20 @@ sub IsAfterShuttersManualBlocking($) {
my $shuttersDev = shift;
$shutters->setShuttersDev($shuttersDev);
if ( ( int( gettimeofday() ) - $shutters->getLastManPosTimestamp ) <
if ( $ascDev->getblockAscDrivesAfterManual
and $shutters->getStatus != $shutters->getOpenPos
and $shutters->getStatus != $shutters->getClosedPos
and $shutters->getStatus != $shutters->getWindPos
and $shutters->getStatus != $shutters->getShadingPos
and $shutters->getStatus != $shutters->getComfortOpenPos
and $shutters->getStatus != $shutters->getVentilatePos
and $shutters->getStatus != $shutters->getAntiFreezePos
and $shutters->getLastDrive eq 'manual'
)
{
return 0;
}
elsif ( ( int( gettimeofday() ) - $shutters->getLastManPosTimestamp ) <
$shutters->getBlockingTimeAfterManual )
{
return 0;
@ -2734,6 +2763,13 @@ sub setSunsetUnixTime {
return 0;
}
sub setSunset {
my ( $self, $value ) = @_;
$self->{ $self->{shuttersDev} }{sunset} = $value;
return 0;
}
sub setSunriseUnixTime {
my ( $self, $unixtime ) = @_;
@ -2741,6 +2777,13 @@ sub setSunriseUnixTime {
return 0;
}
sub setSunrise {
my ( $self, $value ) = @_;
$self->{ $self->{shuttersDev} }{sunrise} = $value;
return 0;
}
sub setDelayCmd {
my ( $self, $posValue ) = @_;
@ -2922,12 +2965,24 @@ sub getSunsetUnixTime {
return $self->{ $self->{shuttersDev} }{sunsettime};
}
sub getSunset {
my $self = shift;
return ( defined($self->{ $self->{shuttersDev} }{sunset}) ? $self->{ $self->{shuttersDev} }{sunset} : 0 );
}
sub getSunriseUnixTime {
my $self = shift;
return $self->{ $self->{shuttersDev} }{sunrisetime};
}
sub getSunrise {
my $self = shift;
return ( defined($self->{ $self->{shuttersDev} }{sunrise}) ? $self->{ $self->{shuttersDev} }{sunrise} : 0 );
}
sub getRoommatesStatus {
my $self = shift;
my $loop = 0;
@ -4009,6 +4064,13 @@ sub getWindSensorReading {
return ( defined($self->{ASC_windSensor}->{reading}) ? $self->{ASC_windSensor}->{reading} : 'wind' );
}
sub getblockAscDrivesAfterManual {
my $self = shift;
my $name = $self->{name};
return AttrVal( $name, 'ASC_blockAscDrivesAfterManual', 0 );
}
1;
=pod