change drive code

This commit is contained in:
Marko Oldenburg 2018-10-30 19:10:50 +01:00
parent f504135628
commit c92e592270

View File

@ -38,7 +38,7 @@ package main;
use strict; use strict;
use warnings; use warnings;
my $version = "0.1.84"; my $version = "0.1.85";
sub AutoShuttersControl_Initialize($) { sub AutoShuttersControl_Initialize($) {
my ($hash) = @_; my ($hash) = @_;
@ -826,30 +826,39 @@ sub RoommateEventProcessing($@) {
); );
if ( if (
( $1 eq 'home' or $1 eq 'awoken' ) ( $1 eq 'home' or $1 eq 'awoken' )
and ( $shutters->getRoommatesStatus eq 'home' and ( $shutters->getRoommatesStatus eq 'home'
or $shutters->getRoommatesStatus eq 'awoken') or $shutters->getRoommatesStatus eq 'awoken' )
and $ascDev->getAutoShuttersControlMorning eq 'on' and $ascDev->getAutoShuttersControlMorning eq 'on'
and ($shutters->getModeUp eq 'always' and ( $shutters->getModeUp eq 'always'
or $shutters->getModeUp eq 'home' ) or $shutters->getModeUp eq 'home' )
) )
{ {
if ( ($shutters->getRoommatesLastStatus eq 'asleep' if (
or $shutters->getRoommatesLastStatus eq 'awoken') (
and $shutters->getModeUp eq 'home' $shutters->getRoommatesLastStatus eq 'asleep'
and IsDay( $hash, $shuttersDev ) ) or $shutters->getRoommatesLastStatus eq 'awoken'
)
and $shutters->getModeUp eq 'home'
and IsDay( $hash, $shuttersDev )
)
{ {
$shutters->setLastDrive('roommate awoken'); $shutters->setLastDrive('roommate awoken');
ShuttersCommandSet( $hash, $shuttersDev, $shutters->getOpenPos ); ShuttersCommandSet( $hash, $shuttersDev,
$shutters->getOpenPos );
} }
if ( ($shutters->getRoommatesLastStatus eq 'absent' if (
or $shutters->getRoommatesLastStatus eq 'gone' (
or $shutters->getRoommatesLastStatus eq 'home') $shutters->getRoommatesLastStatus eq 'absent'
and $shutters->getModeUp eq 'home' or $shutters->getRoommatesLastStatus eq 'gone'
and $shutters->getRoommatesStatus eq 'home' ) or $shutters->getRoommatesLastStatus eq 'home'
)
and $shutters->getModeUp eq 'home'
and $shutters->getRoommatesStatus eq 'home'
)
{ {
if ( not IsDay( $hash, $shuttersDev ) ) { if ( not IsDay( $hash, $shuttersDev ) ) {
my $position; my $position;
@ -864,16 +873,22 @@ sub RoommateEventProcessing($@) {
ShuttersCommandSet( $hash, $shuttersDev, $position ); ShuttersCommandSet( $hash, $shuttersDev, $position );
} }
elsif ( IsDay( $hash, $shuttersDev ) elsif ( IsDay( $hash, $shuttersDev )
and $shutters->getStatus == $shutters->getClosedPos) { and $shutters->getStatus == $shutters->getClosedPos )
{
$shutters->setLastDrive('roommate home'); $shutters->setLastDrive('roommate home');
ShuttersCommandSet( $hash, $shuttersDev, $shutters->getOpenPos ); ShuttersCommandSet( $hash, $shuttersDev,
$shutters->getOpenPos );
} }
} }
} }
elsif ( ($shutters->getModeDown eq 'always' elsif (
or $shutters->getModeUp eq 'home' ) (
and ( $1 eq 'gotosleep' or $1 eq 'asleep' ) $shutters->getModeDown eq 'always'
and $ascDev->getAutoShuttersControlEvening eq 'on' ) or $shutters->getModeUp eq 'home'
)
and ( $1 eq 'gotosleep' or $1 eq 'asleep' )
and $ascDev->getAutoShuttersControlEvening eq 'on'
)
{ {
my $position; my $position;
if ( CheckIfShuttersWindowRecOpen($shuttersDev) == 0 if ( CheckIfShuttersWindowRecOpen($shuttersDev) == 0
@ -886,8 +901,8 @@ sub RoommateEventProcessing($@) {
$shutters->setLastDrive('roommate asleep'); $shutters->setLastDrive('roommate asleep');
ShuttersCommandSet( $hash, $shuttersDev, $position ); ShuttersCommandSet( $hash, $shuttersDev, $position );
} }
elsif ($shutters->getModeDown eq 'absent' elsif ( $shutters->getModeDown eq 'absent'
and $1 eq 'absent' ) and $1 eq 'absent' )
{ {
$shutters->setLastDrive('roommate absent'); $shutters->setLastDrive('roommate absent');
ShuttersCommandSet( $hash, $shuttersDev, $shutters->getClosedPos ); ShuttersCommandSet( $hash, $shuttersDev, $shutters->getClosedPos );
@ -907,10 +922,12 @@ sub ResidentsEventProcessing($@) {
foreach my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { foreach my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
$shutters->setShuttersDev($shuttersDev); $shutters->setShuttersDev($shuttersDev);
if ( CheckIfShuttersWindowRecOpen($shuttersDev) != 0 if (
and $shutters->getSelfDefenseExclude eq 'off' CheckIfShuttersWindowRecOpen($shuttersDev) != 0
or ($shutters->getUpMode eq 'absent' and $shutters->getSelfDefenseExclude eq 'off'
and not IsDay( $hash, $shuttersDev )) ) or ( $shutters->getUpMode eq 'absent'
and not IsDay( $hash, $shuttersDev ) )
)
{ {
$shutters->setLastDrive('selfeDefense active'); $shutters->setLastDrive('selfeDefense active');
$shutters->setDriveCmd( $shutters->getClosedPos ); $shutters->setDriveCmd( $shutters->getClosedPos );
@ -930,7 +947,7 @@ sub ResidentsEventProcessing($@) {
} }
} }
elsif ( elsif (
$events =~ m#$reading:\s(home)# $events =~ m#$reading:\s(home)#
and ( $ascDev->getResidentsLastStatus eq 'absent' and ( $ascDev->getResidentsLastStatus eq 'absent'
or $ascDev->getResidentsLastStatus eq 'gone' ) or $ascDev->getResidentsLastStatus eq 'gone' )
) )
@ -938,21 +955,22 @@ sub ResidentsEventProcessing($@) {
foreach my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { foreach my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
$shutters->setShuttersDev($shuttersDev); $shutters->setShuttersDev($shuttersDev);
if ( $shutters->getStatus != $shutters->getClosedPos if ( $shutters->getStatus != $shutters->getClosedPos
and not IsDay( $hash, $shuttersDev ) and not IsDay( $hash, $shuttersDev )
and $shutters->getRoommatesStatus eq 'none') and $shutters->getRoommatesStatus eq 'none' )
{ {
$shutters->setLastDrive('residents home'); $shutters->setLastDrive('residents home');
$shutters->setDriveCmd( $shutters->getClosedPos ); $shutters->setDriveCmd( $shutters->getClosedPos );
} }
elsif ( $shutters->getStatus == $shutters->getClosedPos elsif ( $shutters->getStatus == $shutters->getClosedPos
and IsDay( $hash, $shuttersDev ) and IsDay( $hash, $shuttersDev )
and $shutters->getRoommatesStatus eq 'none') and $shutters->getRoommatesStatus eq 'none' )
{ {
$shutters->setLastDrive('residents home'); $shutters->setLastDrive('residents home');
$shutters->setDriveCmd( $shutters->getOpenPos ); $shutters->setDriveCmd( $shutters->getOpenPos );
} }
elsif ( $ascDev->getSelfDefense eq 'on' elsif (
$ascDev->getSelfDefense eq 'on'
and CheckIfShuttersWindowRecOpen($shuttersDev) != 0 and CheckIfShuttersWindowRecOpen($shuttersDev) != 0
and $shutters->getSelfDefenseExclude eq 'off' and $shutters->getSelfDefenseExclude eq 'off'
or ( $ascDev->getResidentsLastStatus eq 'gone' or ( $ascDev->getResidentsLastStatus eq 'gone'
@ -1158,7 +1176,8 @@ sub ShuttersCommandSet($$$) {
$ascDev->setName($name); $ascDev->setName($name);
$shutters->setShuttersDev($shuttersDev); $shutters->setShuttersDev($shuttersDev);
# readingsBeginUpdate($hash);
# readingsBeginUpdate($hash);
if ( if (
( $shutters->getPartyMode eq 'on' and $ascDev->getPartyMode eq 'on' ) ( $shutters->getPartyMode eq 'on' and $ascDev->getPartyMode eq 'on' )
@ -1186,7 +1205,8 @@ sub ShuttersCommandSet($$$) {
; # setzt den Wert auf none da der Rolladen nun gesteuert werden kann. ; # setzt den Wert auf none da der Rolladen nun gesteuert werden kann.
$ascDev->setLastPosReading; $ascDev->setLastPosReading;
} }
# readingsEndUpdate( $hash, 1 );
# readingsEndUpdate( $hash, 1 );
} }
## Sub welche die InternalTimer nach entsprechenden Sunset oder Sunrise zusammen stellt ## Sub welche die InternalTimer nach entsprechenden Sunset oder Sunrise zusammen stellt
@ -1198,7 +1218,8 @@ sub CreateSunRiseSetShuttersTimer($$) {
$ascDev->setName($name); $ascDev->setName($name);
return if ( IsDisabled($name) ); return if ( IsDisabled($name) );
my $shuttersSunriseUnixtime = ShuttersSunrise( $hash, $shuttersDev, 'unix' ); my $shuttersSunriseUnixtime =
ShuttersSunrise( $hash, $shuttersDev, 'unix' );
my $shuttersSunsetUnixtime = ShuttersSunset( $hash, $shuttersDev, 'unix' ); my $shuttersSunsetUnixtime = ShuttersSunset( $hash, $shuttersDev, 'unix' );
$shutters->setSunriseUnixTime($shuttersSunriseUnixtime); $shutters->setSunriseUnixTime($shuttersSunriseUnixtime);
@ -1329,7 +1350,6 @@ sub SunSetShuttersAfterTimerFn($) {
my $hash = $funcHash->{hash}; my $hash = $funcHash->{hash};
my $shuttersDev = $funcHash->{shuttersdevice}; my $shuttersDev = $funcHash->{shuttersdevice};
$shutters->setShuttersDev($shuttersDev); $shutters->setShuttersDev($shuttersDev);
$shutters->setLastDrive('night close');
$ascDev->setName( $hash->{NAME} ); $ascDev->setName( $hash->{NAME} );
my $posValue; my $posValue;
@ -1343,10 +1363,12 @@ sub SunSetShuttersAfterTimerFn($) {
my $homemode = $shutters->getRoommatesStatus; my $homemode = $shutters->getRoommatesStatus;
$homemode = $ascDev->getResidentsStatus if ( $homemode eq 'none' ); $homemode = $ascDev->getResidentsStatus if ( $homemode eq 'none' );
ShuttersCommandSet( $hash, $shuttersDev, $posValue ) if ( $shutters->getModeDown eq $homemode
if ( $shutters->getModeDown eq $homemode or $homemode eq 'none'
or $homemode eq 'none' or $shutters->getModeDown eq 'always' ) {
or $shutters->getModeDown eq 'always' ); $shutters->setLastDrive('night close');
ShuttersCommandSet( $hash, $shuttersDev, $posValue );
}
CreateSunRiseSetShuttersTimer( $hash, $shuttersDev ); CreateSunRiseSetShuttersTimer( $hash, $shuttersDev );
} }
@ -1357,7 +1379,6 @@ sub SunRiseShuttersAfterTimerFn($) {
my $hash = $funcHash->{hash}; my $hash = $funcHash->{hash};
my $shuttersDev = $funcHash->{shuttersdevice}; my $shuttersDev = $funcHash->{shuttersdevice};
$shutters->setShuttersDev($shuttersDev); $shutters->setShuttersDev($shuttersDev);
$shutters->setLastDrive('day open');
$ascDev->setName( $hash->{NAME} ); $ascDev->setName( $hash->{NAME} );
my $homemode = $shutters->getRoommatesStatus; my $homemode = $shutters->getRoommatesStatus;
@ -1367,19 +1388,22 @@ sub SunRiseShuttersAfterTimerFn($) {
or $homemode eq 'none' or $homemode eq 'none'
or $shutters->getModeUp eq 'always' ) or $shutters->getModeUp eq 'always' )
{ {
ShuttersCommandSet( $hash, $shuttersDev, $shutters->getOpenPos ) if (
if ( (
( $shutters->getRoommatesStatus eq 'home'
$shutters->getRoommatesStatus eq 'home' or $shutters->getRoommatesStatus eq 'awoken'
or $shutters->getRoommatesStatus eq 'awoken' or $shutters->getRoommatesStatus eq 'absent'
or $shutters->getRoommatesStatus eq 'absent' or $shutters->getRoommatesStatus eq 'gone'
or $shutters->getRoommatesStatus eq 'gone' or $shutters->getRoommatesStatus eq 'none'
or $shutters->getRoommatesStatus eq 'none' )
) and $ascDev->getSelfDefense eq 'off'
and $ascDev->getSelfDefense eq 'off' or ( $ascDev->getSelfDefense eq 'on'
or ( $ascDev->getSelfDefense eq 'on' and CheckIfShuttersWindowRecOpen($shuttersDev) == 0 )
and CheckIfShuttersWindowRecOpen($shuttersDev) == 0 ) )
); {
$shutters->setLastDrive('day open');
ShuttersCommandSet( $hash, $shuttersDev, $shutters->getOpenPos );
}
} }
CreateSunRiseSetShuttersTimer( $hash, $shuttersDev ); CreateSunRiseSetShuttersTimer( $hash, $shuttersDev );
} }
@ -1898,7 +1922,7 @@ sub IsHoliday($) {
} }
sub SetCmdFn($) { sub SetCmdFn($) {
my $h = shift; my $h = shift;
my $shuttersDev = $h->{shuttersDev}; my $shuttersDev = $h->{shuttersDev};
my $posValue = $h->{posValue}; my $posValue = $h->{posValue};
@ -1913,7 +1937,9 @@ sub SetCmdFn($) {
. $posValue ); . $posValue );
$shutters->setLastDriveReading if ( $shutters->getLastPos != $posValue ); $shutters->setLastDriveReading if ( $shutters->getLastPos != $posValue );
$shutters->setLastDrive(ReadingsVal($shuttersDev,'ASC_ShuttersLastDrive','none')) if ( $shutters->getLastPos == $posValue ); $shutters->setLastDrive(
ReadingsVal( $shuttersDev, 'ASC_ShuttersLastDrive', 'none' ) )
if ( $shutters->getLastPos == $posValue );
} }
########## Begin der Klassendeklarierungen für OOP (Objektorientierte Programmierung) ######################### ########## Begin der Klassendeklarierungen für OOP (Objektorientierte Programmierung) #########################
@ -1968,18 +1994,19 @@ sub getShuttersDev {
sub setDriveCmd { sub setDriveCmd {
my ( $self, $posValue ) = @_; my ( $self, $posValue ) = @_;
my $offSet = 0; my $offSet = 0;
my %h = (shuttersDev => $self->{shuttersDev}, my %h = (
posValue => $posValue,); shuttersDev => $self->{shuttersDev},
$offSet = $shutters->getOffset if ( $shutters->getOffset > 0 ); posValue => $posValue,
);
$offSet = $shutters->getOffset if ( $shutters->getOffset > 0 );
$offSet = $ascDev->getShuttersOffset if ( $shutters->getOffset == -1 ); $offSet = $ascDev->getShuttersOffset if ( $shutters->getOffset == -1 );
InternalTimer( gettimeofday() + int( rand( $offSet ) ), InternalTimer( gettimeofday() + int( rand($offSet) ),
'AutoShuttersControl::SetCmdFn', 'AutoShuttersControl::SetCmdFn', \%h )
\%h ) if ( $offSet > 0 );
if ( $offSet > 0 ); AutoShuttersControl::SetCmdFn( \%h ) if ( $offSet == 0 );
AutoShuttersControl::SetCmdFn(\%h) if ( $offSet == 0 );
return 0 return 0;
} }
sub setSunsetUnixTime { sub setSunsetUnixTime {
@ -2677,8 +2704,8 @@ BEGIN {
} }
sub getShuttersOffset { sub getShuttersOffset {
my $self = shift; my $self = shift;
my $name = $self->{name}; my $name = $self->{name};
return AttrVal( $name, 'ASC_shuttersDriveOffset', 0 ); return AttrVal( $name, 'ASC_shuttersDriveOffset', 0 );
} }