From 7649c9cb549ae64d981cd7ddb3981abee16c5d44 Mon Sep 17 00:00:00 2001 From: LeonGaultier Date: Thu, 31 Jan 2019 08:38:39 +0000 Subject: [PATCH] 73_AutoShuttersControl: change blocking handle, add privacy drive git-svn-id: https://svn.fhem.de/fhem/trunk@18468 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 1 + fhem/FHEM/73_AutoShuttersControl.pm | 144 +++++++++++++++++++++------- 2 files changed, 112 insertions(+), 33 deletions(-) diff --git a/fhem/CHANGED b/fhem/CHANGED index de6c02332..1256feca3 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,6 @@ # 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. + - feature: 73_AutoShuttersControl: change blocking handle, add privacy drive - 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 - bugfix: 10_MYSENSORS_DEVICE: fix enqueing method, Forum:#96518 diff --git a/fhem/FHEM/73_AutoShuttersControl.pm b/fhem/FHEM/73_AutoShuttersControl.pm index bd08aeee9..6f667e907 100644 --- a/fhem/FHEM/73_AutoShuttersControl.pm +++ b/fhem/FHEM/73_AutoShuttersControl.pm @@ -2,7 +2,7 @@ # # 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 # # Special thanks goes to: @@ -41,7 +41,7 @@ package main; use strict; use warnings; -my $version = '0.2.3.3'; +my $version = '0.4.0.2'; sub AutoShuttersControl_Initialize($) { my ($hash) = @_; @@ -159,6 +159,8 @@ my %userAttrList = ( 'ASC_Time_Up_WE_Holiday' => '08:30', 'ASC_Time_Down_Early' => '15:30', 'ASC_Time_Down_Late' => '22:30', + 'ASC_PrivacyDownTime_beforNightClose' => -1, + 'ASC_PrivacyDown_Pos' => 50, 'ASC_WindowRec' => 'none', 'ASC_Ventilate_Window_Open:on,off' => 'on', 'ASC_LockOut:soft,hard,off' => 'off', @@ -182,6 +184,7 @@ my %userAttrList = ( # 'ASC_Shading_Fast_Open:on,off' => 'none', # 'ASC_Shading_Fast_Close:on,off' => 'none', 'ASC_Drive_Offset' => -1, + 'ASC_Drive_OffsetStart' => -1, 'ASC_WindowRec_subType:twostate,threestate' => 'twostate', 'ASC_ShuttersPlace:window,terrace' => 'window', 'ASC_Ventilate_Pos:10,20,30,40,50,60,70,80,90,100' => [ '', 70, 30 ], @@ -382,7 +385,7 @@ sub Notify($$) { } elsif ( 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} ) { @@ -455,7 +458,7 @@ m#^DELETEATTR\s(.*)\s(ASC_Roommate_Device|ASC_WindowRec|ASC_residentsDevice|ASC_ DeleteNotifyDev( $hash, $1, $2 ); } 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 ) @@ -766,7 +769,9 @@ sub EventProcessingWindowRec($@) { my ( $hash, $shuttersDev, $events ) = @_; 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); #### Hardware Lock der Rollläden @@ -788,17 +793,18 @@ sub EventProcessingWindowRec($@) { : $shutters->getStatus < $shutters->getComfortOpenPos ); - if ( $shutters->getDelayCmd ne 'none' and $1 eq 'closed' ) - { # Es wird geschaut ob wärend der Fenster offen Phase ein Fahrbefehl über das Modul kam,wenn ja wird dieser aus geführt - $shutters->setLastDrive('delayed drive - window closed'); - ShuttersCommandSet( $hash, $shuttersDev, $shutters->getDelayCmd ); - } - elsif ( $1 eq 'closed' - and IsAfterShuttersTimeBlocking( $hash, $shuttersDev ) - ) # wenn nicht dann wird entsprechend dem Fensterkontakt Event der Rolladen geschlossen +# ## Wird erstmal deaktiviert da es Sinnlos ist in meinen Augen +# if ( $shutters->getDelayCmd ne 'none' and $1 eq 'closed' ) +# { # Es wird geschaut ob wärend der Fenster offen Phase ein Fahrbefehl über das Modul kam,wenn ja wird dieser aus geführt +# $shutters->setLastDrive('delayed drive - window closed'); +# ShuttersCommandSet( $hash, $shuttersDev, $shutters->getDelayCmd ); +# } + if ( $1 eq 'closed' + and IsAfterShuttersTimeBlocking( $hash, $shuttersDev ) ) { if ( $shutters->getStatus == $shutters->getVentilatePos - or $shutters->getStatus == $shutters->getComfortOpenPos ) + or $shutters->getStatus == $shutters->getComfortOpenPos + or $shutters->getStatus == $shutters->getOpenPos ) { my $homemode = $shutters->getRoommatesStatus; $homemode = $ascDev->getResidentsStatus @@ -1340,7 +1346,7 @@ sub ShadingProcessing($@) { if ( not IsDay( $hash, $shuttersDev ) and $shutters->getShading ne 'out' ); - Log3( $name, 3, + Log3( $name, 4, "AutoShuttersControl ($name) - Shading Processing, Rollladen: " . $shuttersDev . " Azimuth: " @@ -1523,19 +1529,29 @@ sub ShuttersCommandSet($$$) { ); if ( - $posValue != $shutters->getShadingPos - and ( $shutters->getPartyMode eq 'on' - and $ascDev->getPartyMode eq 'on' ) - or ( CheckIfShuttersWindowRecOpen($shuttersDev) == 2 - and $shutters->getSubTyp eq 'threestate' - and $ascDev->getAutoShuttersControlComfort eq 'off' - 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 + ( + $posValue != $shutters->getShadingPos + or $shutters->getShuttersPlace eq 'terrace' + ) + and ( + ( + $shutters->getPartyMode eq 'on' + and $ascDev->getPartyMode eq 'on' + ) + or ( + CheckIfShuttersWindowRecOpen($shuttersDev) == 2 + and $shutters->getSubTyp eq 'threestate' + 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 = ( hash => $hash, shuttersdevice => $shuttersDev, + privacyMode => 0, sunsettime => $shuttersSunsetUnixtime, 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 $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, 'AutoShuttersControl::SunSetShuttersAfterTimerFn', \%funcHash ) if ( $ascDev->getAutoShuttersControlEvening eq 'on' ); @@ -1735,8 +1772,22 @@ sub SunSetShuttersAfterTimerFn($) { and IsAfterShuttersManualBlocking($shuttersDev) ) { - $shutters->setLastDrive('night close'); - ShuttersCommandSet( $hash, $shuttersDev, $posValue ); + $shutters->setLastDrive( + ( + $funcHash->{privacyMode} == 1 + ? 'privacy position' + : 'night close' + ) + ); + ShuttersCommandSet( + $hash, + $shuttersDev, + ( + $funcHash->{privacyMode} == 1 + ? $shutters->getPrivacyDownPos + : $posValue + ) + ); } CreateSunRiseSetShuttersTimer( $hash, $shuttersDev ); @@ -2536,7 +2587,8 @@ sub setDriveCmd { $offSet = $shutters->getOffset if ( $shutters->getOffset > 0 ); $offSet = $ascDev->getShuttersOffset if ( $shutters->getOffset == -1 ); - InternalTimer( gettimeofday() + int( rand($offSet) + 3 ), + InternalTimer( + gettimeofday() + int( rand($offSet) + $shutters->getOffsetStart ), 'AutoShuttersControl::SetCmdFn', \%h ) if ( $offSet > 0 and not $shutters->getNoOffset ); AutoShuttersControl::SetCmdFn( \%h ) @@ -2863,6 +2915,19 @@ sub getShuttersPlace { 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 { my $self = shift; @@ -2966,6 +3031,16 @@ sub getOffset { 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 { my $self = shift; @@ -3895,7 +3970,8 @@ sub getRainSensorShuttersClosedPos {
  • 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ä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
  • 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)
  • 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)
  • -
  • ASC_Drive_Offset - maximale zufällige Verzögerung in Sekunden bei der Berechnung der Fahrzeiten, 0 bedeutet keine Verzögerung, -1 bedeutet, dass das gleichwertige Attribut aus dem ASC Device ausgewertet werden soll.
  • +
  • ASC_Drive_Offset - maximaler Wert für einen zufällig ermittelte Verzögerungswert in Sekunden bei der Berechnung der Fahrzeiten, 0 bedeutet keine Verzögerung, -1 bedeutet, dass das gleichwertige Attribut aus dem ASC Device ausgewertet werden soll.
  • +
  • ASC_Drive_OffsetStart - in Sekunden verzögerter Wert ab welchen dann erst das Offset startet und dazu addiert wird. Funktioniert nur wenn gleichzeitig ein Drive_Offset gesetzt wird.
  • ASC_Open_Pos - in 10 Schritten von 0 bis 100, Default ist abhängig vom Attribut ASC
  • 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äden, welche das Attribut auf on haben, zwischengespeichert und später erst ausgeführt
  • 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
  • @@ -3933,7 +4009,9 @@ sub getRainSensorShuttersClosedPos {
  • ASC_Shading_StateChange_Cloudy - Brightness Wert ab welchen die Beschattung aufgehoben werden soll, immer in Abhängikkeit der anderen einbezogenden Sensorwerte
  • ASC_Shading_Min_Elevation - ab welcher Höhe des Sonnenstandes soll beschattet werden, immer in Abhängikkeit der anderen einbezogenden Sensorwerte
  • ASC_Shading_Min_OutsideTemperature - ab welcher Temperatur soll Beschattet werden, immer in Abhängikkeit der anderen einbezogenden Sensorwerte
  • -
  • ASC_Shading_WaitingPeriod - wie viele Sekunden soll gewartet werden bevor eine weitere Auswertung der Sensordaten für die Beschattung statt finden soll
  • +
  • ASC_Shading_WaitingPeriod - wie viele Sekunden soll gewartet werden bevor eine weitere Auswertung der Sensordaten für die Beschattung statt finden soll
  • +
  • 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
  • +
  • ASC_PrivacyDown_Pos - Position den Rollladens für den Sichtschutz