2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-01-31 06:39:11 +00:00

73_AutoShuttersControl: change blocking handle, add privacy drive

git-svn-id: https://svn.fhem.de/fhem/trunk@18468 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
LeonGaultier 2019-01-31 08:38:39 +00:00
parent 41918bcf0d
commit 7649c9cb54
2 changed files with 112 additions and 33 deletions

View File

@ -1,5 +1,6 @@
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
# Do not insert empty lines here, update check depends on it. # Do not insert empty lines here, update check depends on it.
- feature: 73_AutoShuttersControl: change blocking handle, add privacy drive
- bugfix: 49_SSCam: refresh snapgallery device if snap was done by itself - bugfix: 49_SSCam: refresh snapgallery device if snap was done by itself
- feature: 49_SSCam: V8.7.0, send recordings by email is possible now - feature: 49_SSCam: V8.7.0, send recordings by email is possible now
- bugfix: 10_MYSENSORS_DEVICE: fix enqueing method, Forum:#96518 - bugfix: 10_MYSENSORS_DEVICE: fix enqueing method, Forum:#96518

View File

@ -2,7 +2,7 @@
# #
# Developed with Kate # Developed with Kate
# #
# (c) 2018 Copyright: Marko Oldenburg (leongaultier at gmail dot com) # (c) 2018-2019 Copyright: Marko Oldenburg (leongaultier at gmail dot com)
# All rights reserved # All rights reserved
# #
# Special thanks goes to: # Special thanks goes to:
@ -41,7 +41,7 @@ package main;
use strict; use strict;
use warnings; use warnings;
my $version = '0.2.3.3'; my $version = '0.4.0.2';
sub AutoShuttersControl_Initialize($) { sub AutoShuttersControl_Initialize($) {
my ($hash) = @_; my ($hash) = @_;
@ -159,6 +159,8 @@ my %userAttrList = (
'ASC_Time_Up_WE_Holiday' => '08:30', 'ASC_Time_Up_WE_Holiday' => '08:30',
'ASC_Time_Down_Early' => '15:30', 'ASC_Time_Down_Early' => '15:30',
'ASC_Time_Down_Late' => '22:30', 'ASC_Time_Down_Late' => '22:30',
'ASC_PrivacyDownTime_beforNightClose' => -1,
'ASC_PrivacyDown_Pos' => 50,
'ASC_WindowRec' => 'none', 'ASC_WindowRec' => 'none',
'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',
@ -182,6 +184,7 @@ my %userAttrList = (
# 'ASC_Shading_Fast_Open:on,off' => 'none', # 'ASC_Shading_Fast_Open:on,off' => 'none',
# 'ASC_Shading_Fast_Close:on,off' => 'none', # 'ASC_Shading_Fast_Close:on,off' => 'none',
'ASC_Drive_Offset' => -1, 'ASC_Drive_Offset' => -1,
'ASC_Drive_OffsetStart' => -1,
'ASC_WindowRec_subType:twostate,threestate' => 'twostate', 'ASC_WindowRec_subType:twostate,threestate' => 'twostate',
'ASC_ShuttersPlace:window,terrace' => 'window', 'ASC_ShuttersPlace:window,terrace' => 'window',
'ASC_Ventilate_Pos:10,20,30,40,50,60,70,80,90,100' => [ '', 70, 30 ], 'ASC_Ventilate_Pos:10,20,30,40,50,60,70,80,90,100' => [ '', 70, 30 ],
@ -382,7 +385,7 @@ sub Notify($$) {
} }
elsif ( elsif (
grep grep
/^(ATTR|DELETEATTR)\s(.*ASC_Time_Up_WE_Holiday|.*ASC_Up|.*ASC_Down|.*ASC_AutoAstroModeMorning|.*ASC_AutoAstroModeMorningHorizon|.*ASC_AutoAstroModeEvening|.*ASC_AutoAstroModeEveningHorizon|.*ASC_Time_Up_Early|.*ASC_Time_Up_Late|.*ASC_Time_Down_Early|.*ASC_Time_Down_Late|.*ASC_autoAstroModeMorning|.*ASC_autoAstroModeMorningHorizon|.*ASC_autoAstroModeEvening|.*ASC_autoAstroModeEveningHorizon)(\s.*|$)/, /^(ATTR|DELETEATTR)\s(.*ASC_Time_Up_WE_Holiday|.*ASC_Up|.*ASC_Down|.*ASC_AutoAstroModeMorning|.*ASC_AutoAstroModeMorningHorizon|.*ASC_AutoAstroModeEvening|.*ASC_AutoAstroModeEveningHorizon|.*ASC_Time_Up_Early|.*ASC_Time_Up_Late|.*ASC_Time_Down_Early|.*ASC_Time_Down_Late|.*ASC_autoAstroModeMorning|.*ASC_autoAstroModeMorningHorizon|.*ASC_PrivacyDownTime_beforNightClose|.*ASC_autoAstroModeEvening|.*ASC_autoAstroModeEveningHorizon)(\s.*|$)/,
@{$events} @{$events}
) )
{ {
@ -455,7 +458,7 @@ m#^DELETEATTR\s(.*)\s(ASC_Roommate_Device|ASC_WindowRec|ASC_residentsDevice|ASC_
DeleteNotifyDev( $hash, $1, $2 ); DeleteNotifyDev( $hash, $1, $2 );
} }
elsif ( $events =~ elsif ( $events =~
m#^ATTR\s(.*)\s(ASC_Time_Up_WE_Holiday|ASC_Up|ASC_Down|ASC_AutoAstroModeMorning|ASC_AutoAstroModeMorningHorizon|ASC_AutoAstroModeEvening|ASC_AutoAstroModeEveningHorizon|ASC_Time_Up_Early|ASC_Time_Up_Late|ASC_Time_Down_Early|ASC_Time_Down_Late)\s(.*)$# m#^ATTR\s(.*)\s(ASC_Time_Up_WE_Holiday|ASC_Up|ASC_Down|ASC_AutoAstroModeMorning|ASC_AutoAstroModeMorningHorizon|ASC_PrivacyDownTime_beforNightClose|ASC_AutoAstroModeEvening|ASC_AutoAstroModeEveningHorizon|ASC_Time_Up_Early|ASC_Time_Up_Late|ASC_Time_Down_Early|ASC_Time_Down_Late)\s(.*)$#
) )
{ {
CreateSunRiseSetShuttersTimer( $hash, $1 ) CreateSunRiseSetShuttersTimer( $hash, $1 )
@ -766,7 +769,9 @@ sub EventProcessingWindowRec($@) {
my ( $hash, $shuttersDev, $events ) = @_; my ( $hash, $shuttersDev, $events ) = @_;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
if ( $events =~ m#state:\s(open|closed|tilted)# ) { if ( $events =~ m#state:\s(open|closed|tilted)#
and IsAfterShuttersManualBlocking($shuttersDev) )
{
$shutters->setShuttersDev($shuttersDev); $shutters->setShuttersDev($shuttersDev);
#### Hardware Lock der Rollläden #### Hardware Lock der Rollläden
@ -788,17 +793,18 @@ sub EventProcessingWindowRec($@) {
: $shutters->getStatus < $shutters->getComfortOpenPos : $shutters->getStatus < $shutters->getComfortOpenPos
); );
if ( $shutters->getDelayCmd ne 'none' and $1 eq 'closed' ) # ## Wird erstmal deaktiviert da es Sinnlos ist in meinen Augen
{ # Es wird geschaut ob wärend der Fenster offen Phase ein Fahrbefehl über das Modul kam,wenn ja wird dieser aus geführt # if ( $shutters->getDelayCmd ne 'none' and $1 eq 'closed' )
$shutters->setLastDrive('delayed drive - window closed'); # { # Es wird geschaut ob wärend der Fenster offen Phase ein Fahrbefehl über das Modul kam,wenn ja wird dieser aus geführt
ShuttersCommandSet( $hash, $shuttersDev, $shutters->getDelayCmd ); # $shutters->setLastDrive('delayed drive - window closed');
} # ShuttersCommandSet( $hash, $shuttersDev, $shutters->getDelayCmd );
elsif ( $1 eq 'closed' # }
and IsAfterShuttersTimeBlocking( $hash, $shuttersDev ) if ( $1 eq 'closed'
) # wenn nicht dann wird entsprechend dem Fensterkontakt Event der Rolladen geschlossen and IsAfterShuttersTimeBlocking( $hash, $shuttersDev ) )
{ {
if ( $shutters->getStatus == $shutters->getVentilatePos if ( $shutters->getStatus == $shutters->getVentilatePos
or $shutters->getStatus == $shutters->getComfortOpenPos ) or $shutters->getStatus == $shutters->getComfortOpenPos
or $shutters->getStatus == $shutters->getOpenPos )
{ {
my $homemode = $shutters->getRoommatesStatus; my $homemode = $shutters->getRoommatesStatus;
$homemode = $ascDev->getResidentsStatus $homemode = $ascDev->getResidentsStatus
@ -1340,7 +1346,7 @@ sub ShadingProcessing($@) {
if ( not IsDay( $hash, $shuttersDev ) if ( not IsDay( $hash, $shuttersDev )
and $shutters->getShading ne 'out' ); and $shutters->getShading ne 'out' );
Log3( $name, 3, Log3( $name, 4,
"AutoShuttersControl ($name) - Shading Processing, Rollladen: " "AutoShuttersControl ($name) - Shading Processing, Rollladen: "
. $shuttersDev . $shuttersDev
. " Azimuth: " . " Azimuth: "
@ -1523,19 +1529,29 @@ sub ShuttersCommandSet($$$) {
); );
if ( if (
$posValue != $shutters->getShadingPos (
and ( $shutters->getPartyMode eq 'on' $posValue != $shutters->getShadingPos
and $ascDev->getPartyMode eq 'on' ) or $shutters->getShuttersPlace eq 'terrace'
or ( CheckIfShuttersWindowRecOpen($shuttersDev) == 2 )
and $shutters->getSubTyp eq 'threestate' and (
and $ascDev->getAutoShuttersControlComfort eq 'off' (
and $shutters->getVentilateOpen eq 'on' ) $shutters->getPartyMode eq 'on'
or ( and $ascDev->getPartyMode eq 'on'
CheckIfShuttersWindowRecOpen($shuttersDev) == 2 )
and ( $shutters->getLockOut eq 'soft' or (
or $shutters->getLockOut eq 'hard' ) CheckIfShuttersWindowRecOpen($shuttersDev) == 2
and $ascDev->getHardLockOut eq 'on' and $shutters->getSubTyp eq 'threestate'
and not $queryShuttersPosValue and ( $ascDev->getAutoShuttersControlComfort eq 'off'
or $shutters->getComfortOpenPos != $posValue )
and $shutters->getVentilateOpen eq 'on'
)
or (
CheckIfShuttersWindowRecOpen($shuttersDev) == 2
and ( $shutters->getLockOut eq 'soft'
or $shutters->getLockOut eq 'hard' )
and $ascDev->getHardLockOut eq 'on'
and not $queryShuttersPosValue
)
) )
) )
{ {
@ -1622,6 +1638,7 @@ sub CreateSunRiseSetShuttersTimer($$) {
my %funcHash = ( my %funcHash = (
hash => $hash, hash => $hash,
shuttersdevice => $shuttersDev, shuttersdevice => $shuttersDev,
privacyMode => 0,
sunsettime => $shuttersSunsetUnixtime, sunsettime => $shuttersSunsetUnixtime,
sunrisetime => $shuttersSunriseUnixtime sunrisetime => $shuttersSunriseUnixtime
); );
@ -1629,6 +1646,26 @@ sub CreateSunRiseSetShuttersTimer($$) {
## Ich brauche beim löschen des InternalTimer den Hash welchen ich mitgegeben habe,dieser muss gesichert werden ## Ich brauche beim löschen des InternalTimer den Hash welchen ich mitgegeben habe,dieser muss gesichert werden
$shutters->setInTimerFuncHash( \%funcHash ); $shutters->setInTimerFuncHash( \%funcHash );
## Abfrage für die Sichtschutzfahrt am Abend vor dem eigentlichen kompletten schließen
if ( $shutters->getPrivacyDownTime > 0 ) {
if ( ( $shuttersSunsetUnixtime - $shutters->getPrivacyDownTime ) >
( gettimeofday() + 1 ) )
{
$shuttersSunsetUnixtime =
$shuttersSunsetUnixtime - $shutters->getPrivacyDownTime;
readingsSingleUpdate(
$shuttersDevHash,
'ASC_Time_PrivacyDriveUp',
strftime(
"%e.%m.%Y - %H:%M",
localtime($shuttersSunsetUnixtime)
),
0
);
$funcHash{privacyMode} = 1;
}
}
InternalTimer( $shuttersSunsetUnixtime, InternalTimer( $shuttersSunsetUnixtime,
'AutoShuttersControl::SunSetShuttersAfterTimerFn', \%funcHash ) 'AutoShuttersControl::SunSetShuttersAfterTimerFn', \%funcHash )
if ( $ascDev->getAutoShuttersControlEvening eq 'on' ); if ( $ascDev->getAutoShuttersControlEvening eq 'on' );
@ -1735,8 +1772,22 @@ sub SunSetShuttersAfterTimerFn($) {
and IsAfterShuttersManualBlocking($shuttersDev) and IsAfterShuttersManualBlocking($shuttersDev)
) )
{ {
$shutters->setLastDrive('night close'); $shutters->setLastDrive(
ShuttersCommandSet( $hash, $shuttersDev, $posValue ); (
$funcHash->{privacyMode} == 1
? 'privacy position'
: 'night close'
)
);
ShuttersCommandSet(
$hash,
$shuttersDev,
(
$funcHash->{privacyMode} == 1
? $shutters->getPrivacyDownPos
: $posValue
)
);
} }
CreateSunRiseSetShuttersTimer( $hash, $shuttersDev ); CreateSunRiseSetShuttersTimer( $hash, $shuttersDev );
@ -2536,7 +2587,8 @@ sub setDriveCmd {
$offSet = $shutters->getOffset if ( $shutters->getOffset > 0 ); $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) + 3 ), InternalTimer(
gettimeofday() + int( rand($offSet) + $shutters->getOffsetStart ),
'AutoShuttersControl::SetCmdFn', \%h ) 'AutoShuttersControl::SetCmdFn', \%h )
if ( $offSet > 0 and not $shutters->getNoOffset ); if ( $offSet > 0 and not $shutters->getNoOffset );
AutoShuttersControl::SetCmdFn( \%h ) AutoShuttersControl::SetCmdFn( \%h )
@ -2863,6 +2915,19 @@ sub getShuttersPlace {
return AttrVal( $self->{shuttersDev}, 'ASC_ShuttersPlace', 'window' ); return AttrVal( $self->{shuttersDev}, 'ASC_ShuttersPlace', 'window' );
} }
sub getPrivacyDownTime {
my $self = shift;
return AttrVal( $self->{shuttersDev},
'ASC_PrivacyDownTime_beforNightClose', -1 );
}
sub getPrivacyDownPos {
my $self = shift;
return AttrVal( $self->{shuttersDev}, 'ASC_PrivacyDown_Pos', 50 );
}
sub getSelfDefenseExclude { sub getSelfDefenseExclude {
my $self = shift; my $self = shift;
@ -2966,6 +3031,16 @@ sub getOffset {
return AttrVal( $self->{shuttersDev}, 'ASC_Drive_Offset', 0 ); return AttrVal( $self->{shuttersDev}, 'ASC_Drive_Offset', 0 );
} }
sub getOffsetStart {
my $self = shift;
return (
AttrVal( $self->{shuttersDev}, 'ASC_Drive_OffsetStart', 3 ) > 2
? AttrVal( $self->{shuttersDev}, 'ASC_Drive_OffsetStart', 3 )
: 3
);
}
sub getBlockingTimeAfterManual { sub getBlockingTimeAfterManual {
my $self = shift; my $self = shift;
@ -3895,7 +3970,8 @@ sub getRainSensorShuttersClosedPos {
<li>ASC_Down - astro/time/brightness - bei astro wird Sonnenuntergang berechnet, bei time wird der Wert aus ASC_Time_Down_Early als Fahrzeit verwendet und bei brightness muss ASC_Time_Down_Early und ASC_Time_Down_Late korrekt gesetzt werden. Der Timer l&auml;uft dann nach ASC_Time_Down_Late Zeit, es wird aber in der Zeit zwischen ASC_Time_Down_Early und ASC_Time_Down_Late geschaut, ob die als Attribut im Moduldevice hinterlegte ASC_brightnessMinVal erreicht wurde. Wenn ja, wird der Rollladen runter gefahren</li> <li>ASC_Down - astro/time/brightness - bei astro wird Sonnenuntergang berechnet, bei time wird der Wert aus ASC_Time_Down_Early als Fahrzeit verwendet und bei brightness muss ASC_Time_Down_Early und ASC_Time_Down_Late korrekt gesetzt werden. Der Timer l&auml;uft dann nach ASC_Time_Down_Late Zeit, es wird aber in der Zeit zwischen ASC_Time_Down_Early und ASC_Time_Down_Late geschaut, ob die als Attribut im Moduldevice hinterlegte ASC_brightnessMinVal erreicht wurde. Wenn ja, wird der Rollladen runter gefahren</li>
<li>ASC_Mode_Down - always/home/absent/off - Wann darf die Automatik steuern. immer, niemals, bei Abwesenheit des Roommate (ist kein Roommate und absent eingestellt, wird gar nicht gesteuert)</li> <li>ASC_Mode_Down - always/home/absent/off - Wann darf die Automatik steuern. immer, niemals, bei Abwesenheit des Roommate (ist kein Roommate und absent eingestellt, wird gar nicht gesteuert)</li>
<li>ASC_Mode_Up - always/home/absent/off - Wann darf die Automatik steuern. immer, niemals, bei Abwesenheit des Roommate (ist kein Roommate und absent eingestellt, wird gar nicht gesteuert)</li> <li>ASC_Mode_Up - always/home/absent/off - Wann darf die Automatik steuern. immer, niemals, bei Abwesenheit des Roommate (ist kein Roommate und absent eingestellt, wird gar nicht gesteuert)</li>
<li>ASC_Drive_Offset - maximale zuf&auml;llige Verz&ouml;gerung in Sekunden bei der Berechnung der Fahrzeiten, 0 bedeutet keine Verz&ouml;gerung, -1 bedeutet, dass das gleichwertige Attribut aus dem ASC Device ausgewertet werden soll.</li> <li>ASC_Drive_Offset - maximaler Wert f&uuml;r einen zuf&auml;llig ermittelte Verz&ouml;gerungswert in Sekunden bei der Berechnung der Fahrzeiten, 0 bedeutet keine Verz&ouml;gerung, -1 bedeutet, dass das gleichwertige Attribut aus dem ASC Device ausgewertet werden soll.</li>
<li>ASC_Drive_OffsetStart - in Sekunden verz&ouml;gerter Wert ab welchen dann erst das Offset startet und dazu addiert wird. Funktioniert nur wenn gleichzeitig ein Drive_Offset gesetzt wird.</li>
<li>ASC_Open_Pos - in 10 Schritten von 0 bis 100, Default ist abh&auml;ngig vom Attribut ASC</li> <li>ASC_Open_Pos - in 10 Schritten von 0 bis 100, Default ist abh&auml;ngig vom Attribut ASC</li>
<li>ASC_Partymode - on/off - schaltet den Partymodus an oder aus. Wird am ASC Device set ASC-DEVICE partyMode on geschalten, werden alle Fahrbefehle an den Rolll&auml;den, welche das Attribut auf on haben, zwischengespeichert und sp&auml;ter erst ausgef&uuml;hrt</li> <li>ASC_Partymode - on/off - schaltet den Partymodus an oder aus. Wird am ASC Device set ASC-DEVICE partyMode on geschalten, werden alle Fahrbefehle an den Rolll&auml;den, welche das Attribut auf on haben, zwischengespeichert und sp&auml;ter erst ausgef&uuml;hrt</li>
<li>ASC_Pos_Reading - Name des Readings, welches die Position des Rollladen in Prozent an gibt; wird bei unbekannten Device Typen auch als set Befehl zum fahren verwendet</li> <li>ASC_Pos_Reading - Name des Readings, welches die Position des Rollladen in Prozent an gibt; wird bei unbekannten Device Typen auch als set Befehl zum fahren verwendet</li>
@ -3933,7 +4009,9 @@ sub getRainSensorShuttersClosedPos {
<li>ASC_Shading_StateChange_Cloudy - Brightness Wert ab welchen die Beschattung aufgehoben werden soll, immer in Abh&auml;ngikkeit der anderen einbezogenden Sensorwerte</li> <li>ASC_Shading_StateChange_Cloudy - Brightness Wert ab welchen die Beschattung aufgehoben werden soll, immer in Abh&auml;ngikkeit der anderen einbezogenden Sensorwerte</li>
<li>ASC_Shading_Min_Elevation - ab welcher Höhe des Sonnenstandes soll beschattet werden, immer in Abh&auml;ngikkeit der anderen einbezogenden Sensorwerte</li> <li>ASC_Shading_Min_Elevation - ab welcher Höhe des Sonnenstandes soll beschattet werden, immer in Abh&auml;ngikkeit der anderen einbezogenden Sensorwerte</li>
<li>ASC_Shading_Min_OutsideTemperature - ab welcher Temperatur soll Beschattet werden, immer in Abh&auml;ngikkeit der anderen einbezogenden Sensorwerte</li> <li>ASC_Shading_Min_OutsideTemperature - ab welcher Temperatur soll Beschattet werden, immer in Abh&auml;ngikkeit der anderen einbezogenden Sensorwerte</li>
<li>ASC_Shading_WaitingPeriod - wie viele Sekunden soll gewartet werden bevor eine weitere Auswertung der Sensordaten für die Beschattung statt finden soll</li> <li>ASC_Shading_WaitingPeriod - wie viele Sekunden soll gewartet werden bevor eine weitere Auswertung der Sensordaten für die Beschattung statt finden soll</li>
<li>ASC_PrivacyDownTime_beforNightClose - wie viele Sekunden vor dem abendlichen schlie&zlig;en soll der Rollladen in die Sichtschutzposition fahren, -1 bedeutet das diese Funktion unbeachtet bleiben soll</li>
<li>ASC_PrivacyDown_Pos - Position den Rollladens f&uuml;r den Sichtschutz</li>
</ul> </ul>
</ul> </ul>
</ul> </ul>