diff --git a/controls_AutoShuttersControl.txt b/controls_AutoShuttersControl.txt index 425c3ba..d7b681d 100644 --- a/controls_AutoShuttersControl.txt +++ b/controls_AutoShuttersControl.txt @@ -1,5 +1,5 @@ -UPD 2020-07-02_12:28:09 96885 FHEM/73_AutoShuttersControl.pm -UPD 2020-06-30_12:47:15 188585 lib/FHEM/Automation/ShuttersControl.pm +UPD 2020-07-02_14:06:51 96885 FHEM/73_AutoShuttersControl.pm +UPD 2020-07-02_14:06:22 177312 lib/FHEM/Automation/ShuttersControl.pm UPD 2020-06-22_09:41:40 2657 lib/FHEM/Automation/ShuttersControl/Dev.pm UPD 2020-06-22_09:41:40 2493 lib/FHEM/Automation/ShuttersControl/Roommate.pm UPD 2020-06-30_12:47:15 30157 lib/FHEM/Automation/ShuttersControl/Shutters.pm diff --git a/lib/FHEM/Automation/ShuttersControl.pm b/lib/FHEM/Automation/ShuttersControl.pm index 78818a6..76b0b62 100644 --- a/lib/FHEM/Automation/ShuttersControl.pm +++ b/lib/FHEM/Automation/ShuttersControl.pm @@ -75,6 +75,7 @@ use Date::Parse; use FHEM::Automation::ShuttersControl::Shutters; use FHEM::Automation::ShuttersControl::Dev; +use FHEM::Automation::ShuttersControl::Shading; require Exporter; our @ISA = qw(Exporter); @@ -1347,7 +1348,7 @@ sub EventProcessingRoommate { && !$shutters->getSelfDefenseState ) { - ShadingProcessingDriveCommand( $hash, $shuttersDev ); + \&FHEM::Automation::ShuttersControl::Shading::ShadingProcessingDriveCommand( $hash, $shuttersDev ); } elsif ( !$shutters->getIsDay @@ -1559,7 +1560,7 @@ sub EventProcessingResidents { && $shutters->getShadingMode eq 'absent' && $shutters->getRoommatesStatus eq 'none' ) { - ShadingProcessingDriveCommand( $hash, $shuttersDev ); + \&FHEM::Automation::ShuttersControl::Shading::ShadingProcessingDriveCommand( $hash, $shuttersDev ); } elsif ( $shutters->getShadingMode eq 'home' @@ -1656,7 +1657,7 @@ sub EventProcessingResidents { && !$shutters->getSelfDefenseState ) { - ShadingProcessingDriveCommand( $hash, $shuttersDev ); + \&FHEM::Automation::ShuttersControl::Shading::ShadingProcessingDriveCommand( $hash, $shuttersDev ); } elsif ( $shutters->getShadingMode eq 'absent' @@ -2372,7 +2373,7 @@ sub EventProcessingShadingBrightness { && $shutters->getRainProtectionStatus eq 'unprotected' && $shutters->getWindProtectionStatus eq 'unprotected' ) { - ShadingProcessing( + \&FHEM::Automation::ShuttersControl::Shading::ShadingProcessing( $hash, $shuttersDev, $ascDev->getAzimuth, @@ -2445,7 +2446,7 @@ sub EventProcessingTwilightDevice { && $shutters->getRainProtectionStatus eq 'unprotected' && $shutters->getWindProtectionStatus eq 'unprotected' ) { - ShadingProcessing( + \&FHEM::Automation::ShuttersControl::Shading::ShadingProcessing( $hash, $shuttersDev, $azimuth, @@ -2466,329 +2467,6 @@ sub EventProcessingTwilightDevice { return; } -sub ShadingProcessing { -### angleMinus ist $shutters->getShadingAzimuthLeft -### anglePlus ist $shutters->getShadingAzimuthRight -### winPos ist die Fensterposition $shutters->getDirection - my ( $hash, $shuttersDev, $azimuth, $elevation, $outTemp, - $azimuthLeft, $azimuthRight ) - = @_; - - my $name = $hash->{NAME}; - $shutters->setShuttersDev($shuttersDev); - my $brightness = $shutters->getBrightnessAverage; - - ASC_Debug( - 'ShadingProcessing: ' - . $shutters->getShuttersDev - . ' - Übergebende Werte - Azimuth:' - . $azimuth - . ', Elevation: ' - . $elevation - . ', Brightness: ' - . $brightness - . ', OutTemp: ' - . $outTemp - . ', Azimut Beschattung: ' - . $azimuthLeft - . ', Azimut Endschattung: ' - . $azimuthRight - . ', Ist es nach der Zeitblockadezeit: ' - . ( IsAfterShuttersTimeBlocking($shuttersDev) ? 'JA' : 'NEIN' ) - . ', Das Rollo ist in der Beschattung und wurde manuell gefahren: ' - . ( $shutters->getShadingManualDriveStatus ? 'JA' : 'NEIN' ) - . ', Ist es nach der Hälfte der Beschattungswartezeit: ' - . ( - ( int( gettimeofday() ) - $shutters->getShadingStatusTimestamp ) < - ( $shutters->getShadingWaitingPeriod / 2 ) ? 'NEIN' : 'JA' - ) - ); - - Log3( $name, 4, - "AutoShuttersControl ($name) - Shading Processing, Rollladen: " - . $shuttersDev - . " Azimuth: " - . $azimuth - . " Elevation: " - . $elevation - . " Brightness: " - . $brightness - . " OutTemp: " - . $outTemp ); - - return - if ( $azimuth == -1 - || $elevation == -1 - || $brightness == -1 - || $outTemp == -100 - || ( int( gettimeofday() ) - $shutters->getShadingStatusTimestamp ) < - ( $shutters->getShadingWaitingPeriod / 2 ) - || $shutters->getShadingMode eq 'off' ); - - Log3( $name, 4, - "AutoShuttersControl ($name) - Shading Processing, Rollladen: " - . $shuttersDev - . " Nach dem return" ); - - my $getShadingPos = $shutters->getShadingPos; - my $getStatus = $shutters->getStatus; - my $oldShadingStatus = $shutters->getShadingStatus; - my $shuttersDevHash = $defs{$shuttersDev}; - - my $getModeUp = $shutters->getModeUp; - my $homemode = $shutters->getHomemode; - - ASC_Debug( 'ShadingProcessing: ' - . $shutters->getShuttersDev - . ' - Alle Werte für die weitere Verarbeitung sind korrekt vorhanden und es wird nun mit der Beschattungsverarbeitung begonnen' - ); - - if ( - ( - $outTemp < $shutters->getShadingMinOutsideTemperature - 4 - || $azimuth < $azimuthLeft - || $azimuth > $azimuthRight - || !$shutters->getIsDay - ) - && $shutters->getShadingStatus ne 'out' - ) - { - # $shutters->setShadingLastStatus('in'); - $shutters->setShadingStatus('out'); - - ASC_Debug( 'ShadingProcessing: ' - . $shutters->getShuttersDev - . ' - Es ist Nacht oder die Aussentemperatur unterhalb der Shading Temperatur. Die Beschattung wird Zwangsbeendet' - ); - - Log3( $name, 4, -"AutoShuttersControl ($name) - Shading Processing - Der Sonnenstand ist ausserhalb der Winkelangaben oder die Aussentemperatur unterhalb der Shading Temperatur " - ); - } - elsif ($azimuth < $azimuthLeft - || $azimuth > $azimuthRight - || $elevation < $shutters->getShadingMinElevation - || $elevation > $shutters->getShadingMaxElevation - || $brightness < $shutters->getShadingStateChangeCloudy - || $outTemp < $shutters->getShadingMinOutsideTemperature - 1 ) - { - $shutters->setShadingStatus('out reserved') - if ( $shutters->getShadingStatus eq 'in' - || $shutters->getShadingStatus eq 'in reserved' ); - - if ( - ( - $shutters->getShadingStatus eq 'out reserved' - and - ( int( gettimeofday() ) - $shutters->getShadingStatusTimestamp ) - ) > $shutters->getShadingWaitingPeriod - ) - { - $shutters->setShadingStatus('out'); - - # $shutters->setShadingLastStatus('in') - # if ( $shutters->getShadingLastStatus eq 'out' ); - } - - Log3( $name, 4, - "AutoShuttersControl ($name) - Shading Processing, Rollladen: " - . $shuttersDev - . " In der Out Abfrage, Shadingwert: " - . $shutters->getShadingStatus - . ", Zeitstempel: " - . $shutters->getShadingStatusTimestamp ); - - ASC_Debug( 'ShadingProcessing: ' - . $shutters->getShuttersDev - . ' - Einer der Beschattungsbedingungen wird nicht mehr erfüllt und somit wird der Beschattungsstatus um eine Stufe reduziert. Alter Status: ' - . $oldShadingStatus - . ' Neuer Status: ' - . $shutters->getShadingStatus ); - } - elsif ($azimuth > $azimuthLeft - && $azimuth < $azimuthRight - && $elevation > $shutters->getShadingMinElevation - && $elevation < $shutters->getShadingMaxElevation - && $brightness > $shutters->getShadingStateChangeSunny - && $outTemp > $shutters->getShadingMinOutsideTemperature ) - { - if ( $shutters->getShadingStatus eq 'out' - || $shutters->getShadingStatus eq 'out reserved' ) - { - $shutters->setShadingStatus('in reserved'); - - } - - if ( $shutters->getShadingStatus eq 'in reserved' - and - ( int( gettimeofday() ) - $shutters->getShadingStatusTimestamp ) > - ( $shutters->getShadingWaitingPeriod / 2 ) ) - { - $shutters->setShadingStatus('in'); - - # $shutters->setShadingLastStatus('out') - # if ( $shutters->getShadingLastStatus eq 'in' ); - } - - Log3( $name, 4, - "AutoShuttersControl ($name) - Shading Processing, Rollladen: " - . $shuttersDev - . " In der In Abfrage, Shadingwert: " - . $shutters->getShadingStatus - . ", Zeitstempel: " - . $shutters->getShadingStatusTimestamp ); - - ASC_Debug( 'ShadingProcessing: ' - . $shutters->getShuttersDev - . ' - Alle Beschattungsbedingungen wurden erfüllt und somit wird der Beschattungsstatus um eine Stufe angehoben. Alter Status: ' - . $oldShadingStatus - . ' Neuer Status: ' - . $shutters->getShadingStatus ); - } - - ShadingProcessingDriveCommand( $hash, $shuttersDev ) - if ( - IsAfterShuttersTimeBlocking($shuttersDev) - && !$shutters->getShadingManualDriveStatus - && $shutters->getRoommatesStatus ne 'gotosleep' - && $shutters->getRoommatesStatus ne 'asleep' - && ( - ( - $shutters->getShadingStatus eq 'out' - && $shutters->getShadingLastStatus eq 'in' - ) - || ( $shutters->getShadingStatus eq 'in' - && $shutters->getShadingLastStatus eq 'out' ) - ) - && ( $shutters->getShadingMode eq 'always' - || $shutters->getShadingMode eq $homemode ) - && ( - $shutters->getModeUp eq 'always' - || $shutters->getModeUp eq $homemode - || $shutters->getModeUp eq 'off' - || $shutters->getModeUp eq 'absent' - || ( $shutters->getModeUp eq 'home' - && $homemode ne 'asleep' ) - ) - && ( - ( - ( - int( gettimeofday() ) - - $shutters->getShadingStatusTimestamp - ) < 2 - && $shutters->getStatus != $shutters->getClosedPos - ) - || ( !$shutters->getQueryShuttersPos( $shutters->getShadingPos ) - && $shutters->getIfInShading ) - || ( !$shutters->getIfInShading - && $shutters->getStatus == $shutters->getShadingPos ) - ) - ); - - readingsBeginUpdate($shuttersDevHash); - readingsBulkUpdate( - $shuttersDevHash, - 'ASC_ShadingMessage', - 'INFO: current shading status is \'' - . $shutters->getShadingStatus . '\'' - . ' - next check in ' - . ( - ( - ( - $shutters->getShadingLastStatus eq 'out reserved' - || $shutters->getShadingLastStatus eq 'out' - ) - ? $shutters->getShadingWaitingPeriod - : $shutters->getShadingWaitingPeriod / 2 - ) - ) / 60 - . 'm' - ); - readingsEndUpdate( $shuttersDevHash, 1 ); - - return; -} - -sub ShadingProcessingDriveCommand { - my $hash = shift; - my $shuttersDev = shift; - - my $name = $hash->{NAME}; - $shutters->setShuttersDev($shuttersDev); - - my $getShadingPos = $shutters->getShadingPos; - my $getStatus = $shutters->getStatus; - - $shutters->setShadingStatus( $shutters->getShadingStatus ); - - if ( - $shutters->getShadingStatus eq 'in' - && $getShadingPos != $getStatus - && ( CheckIfShuttersWindowRecOpen($shuttersDev) != 2 - || $shutters->getShuttersPlace ne 'terrace' ) - ) - { - $shutters->setLastDrive('shading in'); - ShuttersCommandSet( $hash, $shuttersDev, $getShadingPos ); - - ASC_Debug( 'ShadingProcessingDriveCommand: ' - . $shutters->getShuttersDev - . ' - Der aktuelle Beschattungsstatus ist: ' - . $shutters->getShadingStatus - . ' und somit wird nun in die Position: ' - . $getShadingPos - . ' zum Beschatten gefahren' ); - } - elsif ($shutters->getShadingStatus eq 'out' - && $getShadingPos == $getStatus ) - { - $shutters->setLastDrive('shading out'); - - ShuttersCommandSet( - $hash, - $shuttersDev, - ( - $getShadingPos == $shutters->getLastPos - ? $shutters->getOpenPos - : ( - $shutters->getQueryShuttersPos( $shutters->getLastPos ) - ? ( - $shutters->getLastPos == $shutters->getSleepPos - ? $shutters->getOpenPos - : $shutters->getLastPos - ) - : $shutters->getOpenPos - ) - ) - ); - - ASC_Debug( 'ShadingProcessingDriveCommand: ' - . $shutters->getShuttersDev - . ' - Der aktuelle Beschattungsstatus ist: ' - . $shutters->getShadingStatus - . ' und somit wird nun in die Position: ' - . $getShadingPos - . ' zum beenden der Beschattung gefahren' ); - } - - Log3( $name, 4, -"AutoShuttersControl ($name) - Shading Processing - In der Routine zum fahren der Rollläden, Shading Wert: " - . $shutters->getShadingStatus ); - - ASC_Debug( - 'ShadingProcessingDriveCommand: ' - . $shutters->getShuttersDev - . ' - Der aktuelle Beschattungsstatus ist: ' - . $shutters->getShadingStatus - . ', Beschattungsstatus Zeitstempel: ' - . strftime( - "%Y.%m.%e %T", localtime( $shutters->getShadingStatusTimestamp ) - ) - ); - - return; -} - sub EventProcessingPartyMode { my $hash = shift; diff --git a/lib/FHEM/Automation/ShuttersControl/Shading.pm b/lib/FHEM/Automation/ShuttersControl/Shading.pm new file mode 100644 index 0000000..fdb61bc --- /dev/null +++ b/lib/FHEM/Automation/ShuttersControl/Shading.pm @@ -0,0 +1,385 @@ +############################################################################### +# +# Developed with Kate +# +# (c) 2018-2020 Copyright: Marko Oldenburg (fhemsupport@cooltux.net) +# All rights reserved +# +# Special thanks goes to: +# - Bernd (Cluni) this module is based on the logic of his script "Rollladensteuerung für HM/ROLLO inkl. Abschattung und Komfortfunktionen in Perl" (https://forum.fhem.de/index.php/topic,73964.0.html) +# - Beta-User for many tests, many suggestions and good discussions +# - pc1246 write english commandref +# - FunkOdyssey commandref style +# - sledge fix many typo in commandref +# - many User that use with modul and report bugs +# - Christoph (christoph.kaiser.in) Patch that expand RegEx for Window Events +# - Julian (Loredo) expand Residents Events for new Residents functions +# - Christoph (Christoph Morrison) for fix Commandref, many suggestions and good discussions +# +# +# This script is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License,or +# any later version. +# +# The GNU General Public License can be found at +# http://www.gnu.org/copyleft/gpl.html. +# A copy is found in the textfile GPL.txt and important notices to the license +# from the author is found in LICENSE.txt distributed with these scripts. +# +# This script is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# +# $Id$ +# +############################################################################### + +## unserer packagename +package FHEM::Automation::ShuttersControl::Shading; + +use strict; +use warnings; +use POSIX qw(strftime); +use utf8; + +use GPUtils qw(GP_Import); + +## Import der FHEM Funktionen +BEGIN { + GP_Import( + qw( + Log3 + gettimeofday + readingsBeginUpdate + readingsBulkUpdate + readingsEndUpdate + ) + ); +} + + +sub ShadingProcessing { +### angleMinus ist $FHEM::Automation::ShuttersControl::shutters->getShadingAzimuthLeft +### anglePlus ist $FHEM::Automation::ShuttersControl::shutters->getShadingAzimuthRight +### winPos ist die Fensterposition $FHEM::Automation::ShuttersControl::shutters->getDirection + my ( $hash, $shuttersDev, $azimuth, $elevation, $outTemp, + $azimuthLeft, $azimuthRight ) + = @_; + + my $name = $hash->{NAME}; + $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev); + my $brightness = $FHEM::Automation::ShuttersControl::shutters->getBrightnessAverage; + + \&FHEM::Automation::ShuttersControl::ASC_Debug( + 'ShadingProcessing: ' + . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev + . ' - Übergebende Werte - Azimuth:' + . $azimuth + . ', Elevation: ' + . $elevation + . ', Brightness: ' + . $brightness + . ', OutTemp: ' + . $outTemp + . ', Azimut Beschattung: ' + . $azimuthLeft + . ', Azimut Endschattung: ' + . $azimuthRight + . ', Ist es nach der Zeitblockadezeit: ' + . ( IsAfterShuttersTimeBlocking($shuttersDev) ? 'JA' : 'NEIN' ) + . ', Das Rollo ist in der Beschattung und wurde manuell gefahren: ' + . ( $FHEM::Automation::ShuttersControl::shutters->getShadingManualDriveStatus ? 'JA' : 'NEIN' ) + . ', Ist es nach der Hälfte der Beschattungswartezeit: ' + . ( + ( int( gettimeofday() ) - $FHEM::Automation::ShuttersControl::shutters->getShadingStatusTimestamp ) < + ( $FHEM::Automation::ShuttersControl::shutters->getShadingWaitingPeriod / 2 ) ? 'NEIN' : 'JA' + ) + ); + + Log3( $name, 4, + "AutoShuttersControl ($name) - Shading Processing, Rollladen: " + . $shuttersDev + . " Azimuth: " + . $azimuth + . " Elevation: " + . $elevation + . " Brightness: " + . $brightness + . " OutTemp: " + . $outTemp ); + + return + if ( $azimuth == -1 + || $elevation == -1 + || $brightness == -1 + || $outTemp == -100 + || ( int( gettimeofday() ) - $FHEM::Automation::ShuttersControl::shutters->getShadingStatusTimestamp ) < + ( $FHEM::Automation::ShuttersControl::shutters->getShadingWaitingPeriod / 2 ) + || $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq 'off' ); + + Log3( $name, 4, + "AutoShuttersControl ($name) - Shading Processing, Rollladen: " + . $shuttersDev + . " Nach dem return" ); + + my $getShadingPos = $FHEM::Automation::ShuttersControl::shutters->getShadingPos; + my $getStatus = $FHEM::Automation::ShuttersControl::shutters->getStatus; + my $oldShadingStatus = $FHEM::Automation::ShuttersControl::shutters->getShadingStatus; + my $shuttersDevHash = $defs{$shuttersDev}; + + my $getModeUp = $FHEM::Automation::ShuttersControl::shutters->getModeUp; + my $homemode = $FHEM::Automation::ShuttersControl::shutters->getHomemode; + + \&FHEM::Automation::ShuttersControl::ASC_Debug( 'ShadingProcessing: ' + . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev + . ' - Alle Werte für die weitere Verarbeitung sind korrekt vorhanden und es wird nun mit der Beschattungsverarbeitung begonnen' + ); + + if ( + ( + $outTemp < $FHEM::Automation::ShuttersControl::shutters->getShadingMinOutsideTemperature - 4 + || $azimuth < $azimuthLeft + || $azimuth > $azimuthRight + || !$FHEM::Automation::ShuttersControl::shutters->getIsDay + ) + && $FHEM::Automation::ShuttersControl::shutters->getShadingStatus ne 'out' + ) + { + # $FHEM::Automation::ShuttersControl::shutters->setShadingLastStatus('in'); + $FHEM::Automation::ShuttersControl::shutters->setShadingStatus('out'); + + \&FHEM::Automation::ShuttersControl::ASC_Debug( 'ShadingProcessing: ' + . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev + . ' - Es ist Nacht oder die Aussentemperatur unterhalb der Shading Temperatur. Die Beschattung wird Zwangsbeendet' + ); + + Log3( $name, 4, +"AutoShuttersControl ($name) - Shading Processing - Der Sonnenstand ist ausserhalb der Winkelangaben oder die Aussentemperatur unterhalb der Shading Temperatur " + ); + } + elsif ($azimuth < $azimuthLeft + || $azimuth > $azimuthRight + || $elevation < $FHEM::Automation::ShuttersControl::shutters->getShadingMinElevation + || $elevation > $FHEM::Automation::ShuttersControl::shutters->getShadingMaxElevation + || $brightness < $FHEM::Automation::ShuttersControl::shutters->getShadingStateChangeCloudy + || $outTemp < $FHEM::Automation::ShuttersControl::shutters->getShadingMinOutsideTemperature - 1 ) + { + $FHEM::Automation::ShuttersControl::shutters->setShadingStatus('out reserved') + if ( $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq 'in' + || $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq 'in reserved' ); + + if ( + ( + $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq 'out reserved' + and + ( int( gettimeofday() ) - $FHEM::Automation::ShuttersControl::shutters->getShadingStatusTimestamp ) + ) > $FHEM::Automation::ShuttersControl::shutters->getShadingWaitingPeriod + ) + { + $FHEM::Automation::ShuttersControl::shutters->setShadingStatus('out'); + + # $FHEM::Automation::ShuttersControl::shutters->setShadingLastStatus('in') + # if ( $FHEM::Automation::ShuttersControl::shutters->getShadingLastStatus eq 'out' ); + } + + Log3( $name, 4, + "AutoShuttersControl ($name) - Shading Processing, Rollladen: " + . $shuttersDev + . " In der Out Abfrage, Shadingwert: " + . $FHEM::Automation::ShuttersControl::shutters->getShadingStatus + . ", Zeitstempel: " + . $FHEM::Automation::ShuttersControl::shutters->getShadingStatusTimestamp ); + + \&FHEM::Automation::ShuttersControl::ASC_Debug( 'ShadingProcessing: ' + . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev + . ' - Einer der Beschattungsbedingungen wird nicht mehr erfüllt und somit wird der Beschattungsstatus um eine Stufe reduziert. Alter Status: ' + . $oldShadingStatus + . ' Neuer Status: ' + . $FHEM::Automation::ShuttersControl::shutters->getShadingStatus ); + } + elsif ($azimuth > $azimuthLeft + && $azimuth < $azimuthRight + && $elevation > $FHEM::Automation::ShuttersControl::shutters->getShadingMinElevation + && $elevation < $FHEM::Automation::ShuttersControl::shutters->getShadingMaxElevation + && $brightness > $FHEM::Automation::ShuttersControl::shutters->getShadingStateChangeSunny + && $outTemp > $FHEM::Automation::ShuttersControl::shutters->getShadingMinOutsideTemperature ) + { + if ( $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq 'out' + || $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq 'out reserved' ) + { + $FHEM::Automation::ShuttersControl::shutters->setShadingStatus('in reserved'); + + } + + if ( $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq 'in reserved' + and + ( int( gettimeofday() ) - $FHEM::Automation::ShuttersControl::shutters->getShadingStatusTimestamp ) > + ( $FHEM::Automation::ShuttersControl::shutters->getShadingWaitingPeriod / 2 ) ) + { + $FHEM::Automation::ShuttersControl::shutters->setShadingStatus('in'); + + # $FHEM::Automation::ShuttersControl::shutters->setShadingLastStatus('out') + # if ( $FHEM::Automation::ShuttersControl::shutters->getShadingLastStatus eq 'in' ); + } + + Log3( $name, 4, + "AutoShuttersControl ($name) - Shading Processing, Rollladen: " + . $shuttersDev + . " In der In Abfrage, Shadingwert: " + . $FHEM::Automation::ShuttersControl::shutters->getShadingStatus + . ", Zeitstempel: " + . $FHEM::Automation::ShuttersControl::shutters->getShadingStatusTimestamp ); + + \&FHEM::Automation::ShuttersControl::ASC_Debug( 'ShadingProcessing: ' + . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev + . ' - Alle Beschattungsbedingungen wurden erfüllt und somit wird der Beschattungsstatus um eine Stufe angehoben. Alter Status: ' + . $oldShadingStatus + . ' Neuer Status: ' + . $FHEM::Automation::ShuttersControl::shutters->getShadingStatus ); + } + + ShadingProcessingDriveCommand( $hash, $shuttersDev ) + if ( + \&FHEM::Automation::ShuttersControl::IsAfterShuttersTimeBlocking($shuttersDev) + && !$FHEM::Automation::ShuttersControl::shutters->getShadingManualDriveStatus + && $FHEM::Automation::ShuttersControl::shutters->getRoommatesStatus ne 'gotosleep' + && $FHEM::Automation::ShuttersControl::shutters->getRoommatesStatus ne 'asleep' + && ( + ( + $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq 'out' + && $FHEM::Automation::ShuttersControl::shutters->getShadingLastStatus eq 'in' + ) + || ( $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq 'in' + && $FHEM::Automation::ShuttersControl::shutters->getShadingLastStatus eq 'out' ) + ) + && ( $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq 'always' + || $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq $homemode ) + && ( + $FHEM::Automation::ShuttersControl::shutters->getModeUp eq 'always' + || $FHEM::Automation::ShuttersControl::shutters->getModeUp eq $homemode + || $FHEM::Automation::ShuttersControl::shutters->getModeUp eq 'off' + || $FHEM::Automation::ShuttersControl::shutters->getModeUp eq 'absent' + || ( $FHEM::Automation::ShuttersControl::shutters->getModeUp eq 'home' + && $homemode ne 'asleep' ) + ) + && ( + ( + ( + int( gettimeofday() ) - + $FHEM::Automation::ShuttersControl::shutters->getShadingStatusTimestamp + ) < 2 + && $FHEM::Automation::ShuttersControl::shutters->getStatus != $FHEM::Automation::ShuttersControl::shutters->getClosedPos + ) + || ( !$FHEM::Automation::ShuttersControl::shutters->getQueryShuttersPos( $FHEM::Automation::ShuttersControl::shutters->getShadingPos ) + && $FHEM::Automation::ShuttersControl::shutters->getIfInShading ) + || ( !$FHEM::Automation::ShuttersControl::shutters->getIfInShading + && $FHEM::Automation::ShuttersControl::shutters->getStatus == $FHEM::Automation::ShuttersControl::shutters->getShadingPos ) + ) + ); + + readingsBeginUpdate($shuttersDevHash); + readingsBulkUpdate( + $shuttersDevHash, + 'ASC_ShadingMessage', + 'INFO: current shading status is \'' + . $FHEM::Automation::ShuttersControl::shutters->getShadingStatus . '\'' + . ' - next check in ' + . ( + ( + ( + $FHEM::Automation::ShuttersControl::shutters->getShadingLastStatus eq 'out reserved' + || $FHEM::Automation::ShuttersControl::shutters->getShadingLastStatus eq 'out' + ) + ? $FHEM::Automation::ShuttersControl::shutters->getShadingWaitingPeriod + : $FHEM::Automation::ShuttersControl::shutters->getShadingWaitingPeriod / 2 + ) + ) / 60 + . 'm' + ); + readingsEndUpdate( $shuttersDevHash, 1 ); + + return; +} + +sub ShadingProcessingDriveCommand { + my $hash = shift; + my $shuttersDev = shift; + + my $name = $hash->{NAME}; + $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev); + + my $getShadingPos = $FHEM::Automation::ShuttersControl::shutters->getShadingPos; + my $getStatus = $FHEM::Automation::ShuttersControl::shutters->getStatus; + + $FHEM::Automation::ShuttersControl::shutters->setShadingStatus( $FHEM::Automation::ShuttersControl::shutters->getShadingStatus ); + + if ( + $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq 'in' + && $getShadingPos != $getStatus + && ( \&FHEM::Automation::ShuttersControl::CheckIfShuttersWindowRecOpen($shuttersDev) != 2 + || $FHEM::Automation::ShuttersControl::shutters->getShuttersPlace ne 'terrace' ) + ) + { + $FHEM::Automation::ShuttersControl::shutters->setLastDrive('shading in'); + ShuttersCommandSet( $hash, $shuttersDev, $getShadingPos ); + + \&FHEM::Automation::ShuttersControl::ASC_Debug( 'ShadingProcessingDriveCommand: ' + . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev + . ' - Der aktuelle Beschattungsstatus ist: ' + . $FHEM::Automation::ShuttersControl::shutters->getShadingStatus + . ' und somit wird nun in die Position: ' + . $getShadingPos + . ' zum Beschatten gefahren' ); + } + elsif ($FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq 'out' + && $getShadingPos == $getStatus ) + { + $FHEM::Automation::ShuttersControl::shutters->setLastDrive('shading out'); + + \&FHEM::Automation::ShuttersControl::ShuttersCommandSet( + $hash, + $shuttersDev, + ( + $getShadingPos == $FHEM::Automation::ShuttersControl::shutters->getLastPos + ? $FHEM::Automation::ShuttersControl::shutters->getOpenPos + : ( + $FHEM::Automation::ShuttersControl::shutters->getQueryShuttersPos( $FHEM::Automation::ShuttersControl::shutters->getLastPos ) + ? ( + $FHEM::Automation::ShuttersControl::shutters->getLastPos == $FHEM::Automation::ShuttersControl::shutters->getSleepPos + ? $FHEM::Automation::ShuttersControl::shutters->getOpenPos + : $FHEM::Automation::ShuttersControl::shutters->getLastPos + ) + : $FHEM::Automation::ShuttersControl::shutters->getOpenPos + ) + ) + ); + + \&FHEM::Automation::ShuttersControl::ASC_Debug( 'ShadingProcessingDriveCommand: ' + . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev + . ' - Der aktuelle Beschattungsstatus ist: ' + . $FHEM::Automation::ShuttersControl::shutters->getShadingStatus + . ' und somit wird nun in die Position: ' + . $getShadingPos + . ' zum beenden der Beschattung gefahren' ); + } + + Log3( $name, 4, +"AutoShuttersControl ($name) - Shading Processing - In der Routine zum fahren der Rollläden, Shading Wert: " + . $FHEM::Automation::ShuttersControl::shutters->getShadingStatus ); + + \&FHEM::Automation::ShuttersControl::ASC_Debug( + 'ShadingProcessingDriveCommand: ' + . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev + . ' - Der aktuelle Beschattungsstatus ist: ' + . $FHEM::Automation::ShuttersControl::shutters->getShadingStatus + . ', Beschattungsstatus Zeitstempel: ' + . strftime( + "%Y.%m.%e %T", localtime( $FHEM::Automation::ShuttersControl::shutters->getShadingStatusTimestamp ) + ) + ); + + return; +}