add delay for absent self defense

This commit is contained in:
Marko Oldenburg 2019-06-25 12:24:25 +02:00
parent 11d3942916
commit f9f84f07d4

View File

@ -242,6 +242,7 @@ my %userAttrList = (
'ASC_Roommate_Reading' => '-', 'ASC_Roommate_Reading' => '-',
'ASC_Self_Defense_Exclude:on,off' => '-', 'ASC_Self_Defense_Exclude:on,off' => '-',
'ASC_Self_Defense_Mode:absent,gone' => '-', 'ASC_Self_Defense_Mode:absent,gone' => '-',
'ASC_Self_Defense_AbsentDelay' => '-',
'ASC_WiggleValue' => '-', 'ASC_WiggleValue' => '-',
'ASC_WindParameters' => '-', 'ASC_WindParameters' => '-',
'ASC_DriveUpMaxDuration' => '-', 'ASC_DriveUpMaxDuration' => '-',
@ -717,6 +718,7 @@ sub ShuttersDeviceScan($) {
$shutters->setLastPos( $shutters->getStatus ); $shutters->setLastPos( $shutters->getStatus );
$shutters->setDelayCmd('none'); $shutters->setDelayCmd('none');
$shutters->setNoOffset(0); $shutters->setNoOffset(0);
$shutters->setSelfDefenseAbsent(0,0);
$shutters->setPosSetCmd( $posSetCmds{ $defs{$_}->{TYPE} } ); $shutters->setPosSetCmd( $posSetCmds{ $defs{$_}->{TYPE} } );
$shutters->setShadingStatus( $shutters->setShadingStatus(
( $shutters->getStatus != $shutters->getShadingPos ? 'out' : 'in' ) ( $shutters->getStatus != $shutters->getShadingPos ? 'out' : 'in' )
@ -1226,6 +1228,9 @@ sub EventProcessingResidents($@) {
and $shutters->getSelfDefenseExclude eq 'off' ) and $shutters->getSelfDefenseExclude eq 'off' )
{ {
$shutters->setLastDrive('selfDefense active'); $shutters->setLastDrive('selfDefense active');
$shutters->setSelfDefenseAbsent(0,1) # der erste Wert ist ob der timer schon läuft, der zweite ist ob self defense aktiv ist durch die Bedingungen
if ( CheckIfShuttersWindowRecOpen($shuttersDev) == 0
and $shutters->getSelfDefenseMode eq 'absent' );
} }
else { $shutters->setLastDrive('residents absent'); } else { $shutters->setLastDrive('residents absent'); }
@ -1300,28 +1305,41 @@ sub EventProcessingResidents($@) {
$shutters->setLastDrive('shading out'); $shutters->setLastDrive('shading out');
$shutters->setDriveCmd( $shutters->getLastPos ); $shutters->setDriveCmd( $shutters->getLastPos );
} }
elsif ( elsif ( (
$ascDev->getSelfDefense eq 'on' $ascDev->getSelfDefense eq 'on'
and CheckIfShuttersWindowRecOpen($shuttersDev) != 0 and $shutters->getSelfDefenseExclude eq 'off'
and $shutters->getSelfDefenseExclude eq 'off' or ( $getResidentsLastStatus eq 'gone'
or ( $getResidentsLastStatus eq 'gone' and $shutters->getShuttersPlace eq 'terrace' ) )
and $shutters->getShuttersPlace eq 'terrace' )
and ( $getModeUp eq 'absent'
or $getModeUp eq 'off' )
and not $shutters->getIfInShading and not $shutters->getIfInShading
and ( $getResidentsLastStatus eq 'gone'
or $getResidentsLastStatus eq 'absent' )
) )
{ {
$shutters->setLastDrive('selfDefense inactive'); RemoveInternalTimer($shutters->getSelfDefenseAbsentTimerhash)
$shutters->setDriveCmd( if ( $getResidentsLastStatus eq 'absent'
( and $ascDev->getSelfDefense eq 'on'
$shutters->getPrivacyDownStatus and $shutters->getSelfDefenseExclude eq 'off'
? $shutters->getPrivacyDownPos and CheckIfShuttersWindowRecOpen($shuttersDev) == 0
: $shutters->getLastPos and not $shutters->getSelfDefenseAbsent
) and $shutters->getSelfDefenseAbsentTimerrun);
);
$shutters->setHardLockOut('on') if ( $shutters->getStatus == $shutters->getClosedPos ) {
if ( CheckIfShuttersWindowRecOpen($shuttersDev) == 2 $shutters->setHardLockOut('on')
and $shutters->getShuttersPlace eq 'terrace' ); if ( CheckIfShuttersWindowRecOpen($shuttersDev) == 2
and $shutters->getShuttersPlace eq 'terrace'
and ($getModeUp eq 'absent'
or $getModeUp eq 'off')
and CheckIfShuttersWindowRecOpen($shuttersDev) != 0);
$shutters->setLastDrive('selfDefense inactive');
$shutters->setDriveCmd(
(
$shutters->getPrivacyDownStatus
? $shutters->getPrivacyDownPos
: $shutters->getOpenPos
)
);
}
} }
elsif ( elsif (
$shutters->getStatus == $shutters->getClosedPos $shutters->getStatus == $shutters->getClosedPos
@ -3491,6 +3509,10 @@ sub SetCmdFn($) {
. $posValue . ' ' . $posValue . ' '
. $shutters->getPosSetCmd . ' ' . $shutters->getPosSetCmd . ' '
. $posValue ); . $posValue );
$shutters->setSelfDefenseAbsent(0,0)
if ( not $shutters->getSelfDefenseAbsent
and $shutters->getSelfDefenseAbsentTimerrun );
} }
sub ASC_Debug($) { sub ASC_Debug($) {
@ -3585,6 +3607,16 @@ sub setNoOffset {
return 0; return 0;
} }
sub setSelfDefenseAbsent {
my ( $self, $timerrun, $active, $timerhash ) = @_;
$self->{ $self->{shuttersDev} }{selfDefenseAbsent}{timerrun} = $timerrun;
$self->{ $self->{shuttersDev} }{selfDefenseAbsent}{active} = $active;
$self->{ $self->{shuttersDev} }{selfDefenseAbsent}{timerhash} = $timerhash
if ( defined($timerhash) );
return 0;
}
sub setDriveCmd { sub setDriveCmd {
my ( $self, $posValue ) = @_; my ( $self, $posValue ) = @_;
my $offSet; my $offSet;
@ -3615,7 +3647,18 @@ sub setDriveCmd {
$offSet = $ascDev->getShuttersOffset if ( $shutters->getOffset < 0 ); $offSet = $ascDev->getShuttersOffset if ( $shutters->getOffset < 0 );
$offSetStart = $shutters->getOffsetStart; $offSetStart = $shutters->getOffsetStart;
if ( $offSetStart > 0 and not $shutters->getNoOffset ) { if ( $shutters->getSelfDefenseAbsent
and not $shutters->getSelfDefenseAbsentTimerrun
and $shutters->getSelfDefenseExclude eq 'off'
and $shutters->getLastDrive eq 'selfDefense active'
and $ascDev->getSelfDefense eq 'on' )
{
InternalTimer(
gettimeofday() + $shutters->getSelfDefenseAbsentDelay,
'FHEM::AutoShuttersControl::SetCmdFn', \%h );
$shutters->setSelfDefenseAbsent(1,0,\%h);
}
elsif ( $offSetStart > 0 and not $shutters->getNoOffset ) {
InternalTimer( InternalTimer(
gettimeofday() + int( rand($offSet) + $shutters->getOffsetStart ), gettimeofday() + int( rand($offSet) + $shutters->getOffsetStart ),
'FHEM::AutoShuttersControl::SetCmdFn', \%h ); 'FHEM::AutoShuttersControl::SetCmdFn', \%h );
@ -3822,6 +3865,25 @@ sub getNoOffset {
return $self->{ $self->{shuttersDev} }{noOffset}; return $self->{ $self->{shuttersDev} }{noOffset};
} }
sub getSelfDefenseAbsent {
my $self = shift;
return $self->{ $self->{shuttersDev} }{selfDefenseAbsent}{active};
}
sub getSelfDefenseAbsentTimerrun {
my $self = shift;
return $self->{ $self->{shuttersDev} }{selfDefenseAbsent}{timerrun};
}
sub getSelfDefenseAbsentTimerhash {
my $self = shift;
return $self->{ $self->{shuttersDev} }{selfDefenseAbsent}{timerhash}
if ( defined($self->{ $self->{shuttersDev} }{selfDefenseAbsent}{timerhash}) );
}
sub getLastDrive { sub getLastDrive {
my $self = shift; my $self = shift;
@ -4126,6 +4188,12 @@ sub getSelfDefenseMode {
return AttrVal( $self->{shuttersDev}, 'ASC_Self_Defense_Mode', 'gone' ); return AttrVal( $self->{shuttersDev}, 'ASC_Self_Defense_Mode', 'gone' );
} }
sub getSelfDefenseAbsentDelay {
my $self = shift;
return AttrVal( $self->{shuttersDev}, 'ASC_Self_Defense_AbsentDelay', 1 );
}
sub getWiggleValue { sub getWiggleValue {
my $self = shift; my $self = shift;
@ -5724,6 +5792,12 @@ sub getblockAscDrivesAfterManual {
<li><strong>ASC_Self_Defense_Exclude on|off</strong> - If set to on, the shutter will not be closed <li><strong>ASC_Self_Defense_Exclude on|off</strong> - If set to on, the shutter will not be closed
if the self defense mode is activated and residents are absent. Defaults to off. if the self defense mode is activated and residents are absent. Defaults to off.
</li> </li>
<li><strong>ASC_Self_Defense_Mode - absent/gone</strong> - ab welchen Residents Status soll Selfdefense
aktiv werden ohne das Fenster auf sind. (default: gone)
</li>
<li><strong>ASC_Self_Defense_AbsentDelay - um wie viele Sekunden soll das fahren in Selfdefense bei
Residents absent verz&ouml;gert werden. (default: 1)
</li>
<li><strong>ASC_ShuttersPlace window|terrace</strong> - If set to <em>terrace</em>, and the <li><strong>ASC_ShuttersPlace window|terrace</strong> - If set to <em>terrace</em>, and the
residents device is set to <em>gone</em>, and <em>selfDefense</em> is activated, the shutter will residents device is set to <em>gone</em>, and <em>selfDefense</em> is activated, the shutter will
be closed. If set to window, will not. Defaults to window. be closed. If set to window, will not. Defaults to window.
@ -6165,6 +6239,9 @@ sub getblockAscDrivesAfterManual {
<li><strong>ASC_WindProtection - on/off</strong> - soll der Rollladen beim Regenschutz beachtet werden. on=JA, off=NEIN.</li> <li><strong>ASC_WindProtection - on/off</strong> - soll der Rollladen beim Regenschutz beachtet werden. on=JA, off=NEIN.</li>
<li><strong>ASC_Roommate_Device</strong> - mit Komma getrennte Namen des/der Roommate Device/s, welche den/die Bewohner des Raumes vom Rollladen wiedergibt. Es macht nur Sinn in Schlaf- oder Kinderzimmern (default: none)</li> <li><strong>ASC_Roommate_Device</strong> - mit Komma getrennte Namen des/der Roommate Device/s, welche den/die Bewohner des Raumes vom Rollladen wiedergibt. Es macht nur Sinn in Schlaf- oder Kinderzimmern (default: none)</li>
<li><strong>ASC_Roommate_Reading</strong> - das Reading zum Roommate Device, welches den Status wieder gibt (default: state)</li> <li><strong>ASC_Roommate_Reading</strong> - das Reading zum Roommate Device, welches den Status wieder gibt (default: state)</li>
<li><strong>ASC_Self_Defense_Exclude - on/off</strong> - bei on Wert wird dieser Rollladen bei aktiven Self Defense und offenen Fenster nicht runter gefahren, wenn Residents absent ist. (default: off)</li>
<li><strong>ASC_Self_Defense_Mode - absent/gone</strong> - ab welchen Residents Status soll Selfdefense aktiv werden ohne das Fenster auf sind. (default: gone)</li>
<li><strong>ASC_Self_Defense_AbsentDelay - um wie viele Sekunden soll das fahren in Selfdefense bei Residents absent verz&ouml;gert werden. (default: 1)</li>
<li><strong>ASC_Self_Defense_Exclude - on/off</strong> - bei on Wert wird dieser Rollladen bei aktiven Self Defense und offenen Fenster nicht runter gefahren, wenn Residents absent ist. (default: off)</li></p> <li><strong>ASC_Self_Defense_Exclude - on/off</strong> - bei on Wert wird dieser Rollladen bei aktiven Self Defense und offenen Fenster nicht runter gefahren, wenn Residents absent ist. (default: off)</li></p>
<ul> <ul>
<strong><u>Beschreibung der Beschattungsfunktion</u></strong> <strong><u>Beschreibung der Beschattungsfunktion</u></strong>
@ -6271,7 +6348,7 @@ sub getblockAscDrivesAfterManual {
"release_status": "under develop", "release_status": "under develop",
"license": "GPL_2", "license": "GPL_2",
"version": "v0.6.19", "version": "v0.6.19",
"x_developmentversion": "v0.6.19.14", "x_developmentversion": "v0.6.19.15",
"author": [ "author": [
"Marko Oldenburg <leongaultier@gmail.com>" "Marko Oldenburg <leongaultier@gmail.com>"
], ],