export shading function in seperated file
This commit is contained in:
		| @@ -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 | ||||
|   | ||||
| @@ -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; | ||||
|  | ||||
|   | ||||
							
								
								
									
										385
									
								
								lib/FHEM/Automation/ShuttersControl/Shading.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										385
									
								
								lib/FHEM/Automation/ShuttersControl/Shading.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -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; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user