diff --git a/controls_AutoShuttersControl.txt b/controls_AutoShuttersControl.txt index 9d80b92..2bddb75 100644 --- a/controls_AutoShuttersControl.txt +++ b/controls_AutoShuttersControl.txt @@ -1,9 +1,9 @@ UPD 2020-07-08_22:02:31 97041 FHEM/73_AutoShuttersControl.pm -UPD 2020-07-08_22:06:53 143748 lib/FHEM/Automation/ShuttersControl.pm +UPD 2020-07-09_08:21:08 74284 lib/FHEM/Automation/ShuttersControl.pm UPD 2020-06-22_09:41:40 2657 lib/FHEM/Automation/ShuttersControl/Dev.pm UPD 2020-07-07_14:49:19 2496 lib/FHEM/Automation/ShuttersControl/Roommate.pm UPD 2020-07-08_22:06:53 30760 lib/FHEM/Automation/ShuttersControl/Shutters.pm -UPD 2020-07-09_07:37:23 21703 lib/FHEM/Automation/ShuttersControl/Shading.pm +UPD 2020-07-09_08:19:25 23216 lib/FHEM/Automation/ShuttersControl/Shading.pm UPD 2020-06-22_09:41:40 2175 lib/FHEM/Automation/ShuttersControl/Window.pm UPD 2020-07-08_22:06:53 11569 lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm UPD 2020-07-03_11:29:10 7251 lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm diff --git a/lib/FHEM/Automation/ShuttersControl.pm b/lib/FHEM/Automation/ShuttersControl.pm index 4a83676..4f93ae7 100644 --- a/lib/FHEM/Automation/ShuttersControl.pm +++ b/lib/FHEM/Automation/ShuttersControl.pm @@ -286,9 +286,9 @@ our $shutters = FHEM::Automation::ShuttersControl::Shutters->new(); our $ascDev = FHEM::Automation::ShuttersControl::Dev->new(); sub ascAPIget { - my $getCommand = shift; - my $shutterDev = shift; - my $value = shift; + my $getCommand = shift; + my $shutterDev = shift; + my $value = shift; my $getter = 'get' . $getCommand; @@ -308,9 +308,9 @@ sub ascAPIget { } sub ascAPIset { - my $setCommand = shift; - my $shutterDev = shift; - my $value = shift; + my $setCommand = shift; + my $shutterDev = shift; + my $value = shift; my $setter = 'set' . $setCommand; @@ -494,7 +494,8 @@ sub Notify { } } elsif ( grep m{^partyMode:.off$}xms, @{$events} ) { - EventProcessingPartyMode($hash); + FHEM::Automation::ShuttersControl::EventProcessingFunctions::EventProcessingPartyMode( + $hash); } elsif ( grep m{^sunriseTimeWeHoliday:.(on|off)$}xms, @{$events} ) { RenewSunRiseSetShuttersTimer($hash); @@ -508,7 +509,8 @@ m{^(ATTR|DELETEATTR)\s(.*ASC_Time_Up_WE_Holiday|.*ASC_Up|.*ASC_Down|.*ASC_AutoAs @{$events} ) { - EventProcessingGeneral( $hash, undef, join( ' ', @{$events} ) ); + FHEM::Automation::ShuttersControl::EventProcessingFunctions::EventProcessingGeneral( + $hash, undef, join( ' ', @{$events} ) ); } } elsif ( grep m{^($posReading):\s\d{1,3}$}xms, @{$events} ) { @@ -516,141 +518,18 @@ m{^(ATTR|DELETEATTR)\s(.*ASC_Time_Up_WE_Holiday|.*ASC_Up|.*ASC_Down|.*ASC_AutoAs . ' ASC_Pos_Reading Event vom Rollo wurde erkannt ' . ' - RECEIVED EVENT: ' . Dumper $events); - EventProcessingShutters( $hash, $devname, join( ' ', @{$events} ) ); + FHEM::Automation::ShuttersControl::EventProcessingFunctions::EventProcessingShutters( + $hash, $devname, join( ' ', @{$events} ) ); } else { - EventProcessingGeneral( $hash, $devname, join( ' ', @{$events} ) ) + FHEM::Automation::ShuttersControl::EventProcessingFunctions::EventProcessingGeneral( + $hash, $devname, join( ' ', @{$events} ) ) ; # bei allen anderen Events wird die entsprechende Funktion zur Verarbeitung aufgerufen } return; } -sub EventProcessingGeneral { - my $hash = shift; - my $devname = shift; - my $events = shift; - - my $name = $hash->{NAME}; - - if ( defined($devname) && ($devname) ) - { # es wird lediglich der Devicename der Funktion mitgegeben wenn es sich nicht um global handelt daher hier die Unterscheidung - my $windReading = $ascDev->getWindSensorReading // 'none'; - my $rainReading = $ascDev->getRainSensorReading // 'none'; - - while ( my ( $device, $deviceAttr ) = - each %{ $hash->{monitoredDevs}{$devname} } ) - { - if ( $device eq $name ) { - EventProcessingResidents( $hash, $device, $events ) - if ( $deviceAttr eq 'ASC_residentsDev' ); - EventProcessingRain( $hash, $device, $events ) - if ( $events =~ m{$rainReading}xms ); - EventProcessingWind( $hash, $device, $events ) - if ( $events =~ m{$windReading}xms ); - - EventProcessingTwilightDevice( $hash, $device, $events ) - if ( $deviceAttr eq 'ASC_twilightDevice' ); - } - - EventProcessingWindowRec( $hash, $device, $events ) - if ( $deviceAttr eq 'ASC_WindowRec' ) - ; # ist es ein Fensterdevice wird die Funktion gestartet - EventProcessingRoommate( $hash, $device, $events ) - if ( $deviceAttr eq 'ASC_Roommate_Device' ) - ; # ist es ein Bewohner Device wird diese Funktion gestartet - - EventProcessingExternalTriggerDevice( $hash, $device, $events ) - if ( $deviceAttr eq 'ASC_ExternalTrigger' ); - - $shutters->setShuttersDev($device) - if ( $deviceAttr eq 'ASC_BrightnessSensor' ); - - if ( - $deviceAttr eq 'ASC_BrightnessSensor' - && ( $shutters->getDown eq 'brightness' - || $shutters->getUp eq 'brightness' ) - ) - { - EventProcessingBrightness( $hash, $device, $events ); - } - elsif ( $deviceAttr eq 'ASC_BrightnessSensor' ) { - EventProcessingShadingBrightness( $hash, $device, $events ); - } - } - } - else { # alles was kein Devicenamen mit übergeben hat landet hier - if ( - $events =~ m{^ATTR\s(.*) - \s(ASC_Roommate_Device|ASC_WindowRec|ASC_residentsDev|ASC_rainSensor - |ASC_windSensor|ASC_BrightnessSensor|ASC_ExternalTrigger - |ASC_twilightDevice) - \s(.*)$}xms - ) - { # wurde den Attributen unserer Rolläden ein Wert zugewiesen ? - AddNotifyDev( $hash, $3, $1, $2 ) if ( $3 ne 'none' ); - Log3( $name, 4, - "AutoShuttersControl ($name) - EventProcessing: ATTR" ); - } - elsif ( - $events =~ m{^DELETEATTR - \s(.*)\s(ASC_Roommate_Device - |ASC_WindowRec|ASC_residentsDev|ASC_rainSensor - |ASC_windSensor|ASC_BrightnessSensor|ASC_ExternalTrigger - |ASC_twilightDevice) - $}xms - ) - { # wurde das Attribut unserer Rolläden gelöscht ? - Log3( $name, 4, - "AutoShuttersControl ($name) - EventProcessing: DELETEATTR" ); - DeleteNotifyDev( $hash, $1, $2 ); - } - elsif ( - $events =~ m{^(DELETEATTR|ATTR) - \s(.*)\s(ASC_Time_Up_WE_Holiday|ASC_Up|ASC_Down - |ASC_AutoAstroModeMorning|ASC_AutoAstroModeMorningHorizon - |ASC_PrivacyDownValue_beforeNightClose - |ASC_PrivacyUpValue_beforeDayOpen|ASC_AutoAstroModeEvening - |ASC_AutoAstroModeEveningHorizon|ASC_Time_Up_Early - |ASC_Time_Up_Late|ASC_Time_Down_Early|ASC_Time_Down_Late) - (.*)?}xms - ) - { - CreateSunRiseSetShuttersTimer( $hash, $2 ) - if ( - $3 ne 'ASC_Time_Up_WE_Holiday' - || ( $3 eq 'ASC_Time_Up_WE_Holiday' - && $ascDev->getSunriseTimeWeHoliday eq 'on' ) - ); - } - elsif ( - $events =~ m{^(DELETEATTR|ATTR) - \s(.*)\s(ASC_autoAstroModeMorning|ASC_autoAstroModeMorningHorizon - |ASC_autoAstroModeEvening|ASC_autoAstroModeEveningHorizon) - (.*)?}xms - ) - { - RenewSunRiseSetShuttersTimer($hash); - } - - if ( - $events =~ -m{^(DELETEATTR|ATTR) #global ATTR myASC ASC_tempSensor Cellar - \s(.*)\s(ASC_tempSensor - |ASC_Shading_Mode - |ASC_BrightnessSensor - |ASC_TempSensor) - (.*)?}xms - ) - { - CommandSet( undef, $name . ' controlShading on' ) - if ( ReadingsVal( $name, 'controlShading', 'off' ) ne 'off' ); - } - } - - return; -} - sub Set { my $hash = shift // return; my $aArg = shift // return; @@ -715,7 +594,8 @@ sub Set { } elsif ( lc $cmd eq 'advdrivedown' ) { return "usage: $cmd" if ( scalar( @{$aArg} ) != 0 ); - EventProcessingAdvShuttersClose($hash); + FHEM::Automation::ShuttersControl::EventProcessingFunctions::EventProcessingAdvShuttersClose( + $hash); } elsif ( lc $cmd eq 'shutterascenabletoggle' ) { return "usage: $cmd" if ( scalar( @{$aArg} ) > 1 ); @@ -1060,9 +940,9 @@ sub AddNotifyDev { ## entfernt aus dem NOTIFYDEV Hash Devices welche als Wert in Attributen steckten sub DeleteNotifyDev { - my $hash = shift; - my $shuttersDev = shift; - my $shuttersAttr = shift; + my $hash = shift; + my $shuttersDev = shift; + my $shuttersAttr = shift; my $name = $hash->{NAME}; @@ -1093,1645 +973,6 @@ sub DeleteNotifyDev { return; } -## Sub zum steuern der Rolläden bei einem Fenster Event -sub EventProcessingWindowRec { - my $hash = shift; - my $shuttersDev = shift; - my $events = shift; - - my $name = $hash->{NAME}; - - my $reading = $shutters->getWinDevReading; - - if ( $events =~ - m{.*$reading:.*?([Oo]pen(?>ed)?|[Cc]losed?|tilt(?>ed)?|true|false)}xms - && IsAfterShuttersManualBlocking($shuttersDev) ) - { - my $match = $1; - - ASC_Debug( 'EventProcessingWindowRec: ' - . $shutters->getShuttersDev - . ' - RECEIVED EVENT: ' - . $events - . ' - IDENTIFIED EVENT: ' - . $1 - . ' - STORED EVENT: ' - . $match ); - - $shutters->setShuttersDev($shuttersDev); - my $homemode = $shutters->getRoommatesStatus; - $homemode = $ascDev->getResidentsStatus if ( $homemode eq 'none' ); - - #### Hardware Lock der Rollläden - $shutters->setHardLockOut('off') - if ( $match =~ m{[Cc]lose|true}xms - && $shutters->getShuttersPlace eq 'terrace' ); - $shutters->setHardLockOut('on') - if ( $match =~ m{[Oo]pen|false}xms - && $shutters->getShuttersPlace eq 'terrace' ); - - ASC_Debug( 'EventProcessingWindowRec: ' - . $shutters->getShuttersDev - . ' - HOMEMODE: ' - . $homemode - . ' QueryShuttersPosWinRecTilted:' - . $shutters->getQueryShuttersPos( $shutters->getVentilatePos ) - . ' QueryShuttersPosWinRecComfort: ' - . $shutters->getQueryShuttersPos( $shutters->getComfortOpenPos ) - ); - - if ( - $match =~ m{[Cc]lose|true}xms - && IsAfterShuttersTimeBlocking($shuttersDev) - && ( - $shutters->getStatus == $shutters->getVentilatePos - || $shutters->getStatus == $shutters->getComfortOpenPos - || $shutters->getStatus == $shutters->getOpenPos - || ( $shutters->getStatus == $shutters->getPrivacyDownPos - && $shutters->getPrivacyDownStatus == 1 - && !$shutters->getIsDay ) - ) - && ( $shutters->getVentilateOpen eq 'on' - || $ascDev->getAutoShuttersControlComfort eq 'on' ) - ) - { - ASC_Debug( 'EventProcessingWindowRec: ' - . $shutters->getShuttersDev - . ' Event Closed' ); - - if ( - $shutters->getIsDay - && ( ( $homemode ne 'asleep' && $homemode ne 'gotosleep' ) - || $homemode eq 'none' ) - && $shutters->getModeUp ne 'absent' - && $shutters->getModeUp ne 'off' - ) - { - if ( $shutters->getIfInShading - && $shutters->getShadingPos != $shutters->getStatus - && $shutters->getShadingMode ne 'absent' ) - { - $shutters->setLastDrive('shading in'); - $shutters->setNoDelay(1); - $shutters->setDriveCmd( $shutters->getShadingPos ); - } - elsif ( - !$shutters->getIfInShading - && ( $shutters->getStatus != $shutters->getOpenPos - || $shutters->getStatus != $shutters->getLastManPos ) - ) - { - if ( $shutters->getPrivacyDownStatus == 2 ) { - $shutters->setLastDrive( - 'window closed at privacy night close'); - $shutters->setNoDelay(1); - $shutters->setDriveCmd( $shutters->getPrivacyDownPos ); - } - else { - $shutters->setLastDrive('window closed at day'); - $shutters->setNoDelay(1); - $shutters->setDriveCmd( - ( - $shutters->getVentilatePosAfterDayClosed eq - 'open' - ? $shutters->getOpenPos - : $shutters->getLastManPos - ) - ); - } - } - } - elsif ( - $shutters->getModeDown ne 'absent' - && $shutters->getModeDown ne 'off' - && ( - ( - !$shutters->getIsDay - && $shutters->getModeDown ne 'roommate' - ) - || $homemode eq 'asleep' - || $homemode eq 'gotosleep' - ) - && $ascDev->getAutoShuttersControlEvening eq 'on' - ) - { - if ( $shutters->getPrivacyUpStatus == 2 ) { - $shutters->setLastDrive( - 'window closed at privacy day open'); - $shutters->setNoDelay(1); - $shutters->setDriveCmd( $shutters->getPrivacyDownPos ); - } - else { - $shutters->setLastDrive('window closed at night'); - $shutters->setNoDelay(1); - $shutters->setDriveCmd( - ( - $shutters->getSleepPos > 0 - ? $shutters->getSleepPos - : $shutters->getClosedPos - ) - ); - } - } - } - elsif ( - ( - $match =~ m{tilt}xms || ( $match =~ m{[Oo]pen|false}xms - && $shutters->getSubTyp eq 'twostate' ) - ) - && $shutters->getVentilateOpen eq 'on' - && $shutters->getQueryShuttersPos( $shutters->getVentilatePos ) - ) - { - $shutters->setLastDrive('ventilate - window open'); - $shutters->setNoDelay(1); - $shutters->setDriveCmd( - ( - ( - $shutters->getShuttersPlace eq 'terrace' - && $shutters->getSubTyp eq 'twostate' - ) ? $shutters->getOpenPos : $shutters->getVentilatePos - ) - ); - } - elsif ($match =~ m{[Oo]pen|false}xms - && $shutters->getSubTyp eq 'threestate' ) - { - my $posValue = $shutters->getStatus; - my $setLastDrive; - if ( $ascDev->getAutoShuttersControlComfort eq 'on' - and - $shutters->getQueryShuttersPos( $shutters->getComfortOpenPos ) ) - { - $posValue = $shutters->getComfortOpenPos; - $setLastDrive = 'comfort - window open'; - } - elsif ($shutters->getQueryShuttersPos( $shutters->getVentilatePos ) - && $shutters->getVentilateOpen eq 'on' ) - { - $posValue = $shutters->getVentilatePos; - $setLastDrive = 'ventilate - window open'; - } - - if ( defined($posValue) && $posValue ) { - $shutters->setLastDrive($setLastDrive); - $shutters->setNoDelay(1); - $shutters->setDriveCmd($posValue); - } - } - } - - return; -} - -## Sub zum steuern der Rolladen bei einem Bewohner/Roommate Event -sub EventProcessingRoommate { - my $hash = shift; - my $shuttersDev = shift; - my $events = shift; - - my $name = $hash->{NAME}; - - $shutters->setShuttersDev($shuttersDev); - my $reading = $shutters->getRoommatesReading; - - if ( $events =~ m{$reading:\s(absent|gotosleep|asleep|awoken|home)}xms ) { - Log3( $name, 4, - "AutoShuttersControl ($name) - EventProcessingRoommate: " - . $shutters->getRoommatesReading ); - Log3( $name, 4, -"AutoShuttersControl ($name) - EventProcessingRoommate: $shuttersDev und Events $events" - ); - - my $getModeUp = $shutters->getModeUp; - my $getModeDown = $shutters->getModeDown; - my $getRoommatesStatus = $shutters->getRoommatesStatus; - my $getRoommatesLastStatus = $shutters->getRoommatesLastStatus; - my $event = $1; - my $posValue = $shutters->getStatus; - - if ( - ( $event eq 'home' || $event eq 'awoken' ) - && ( $getRoommatesStatus eq 'home' - || $getRoommatesStatus eq 'awoken' ) - && ( $ascDev->getAutoShuttersControlMorning eq 'on' - || $shutters->getUp eq 'roommate' ) - && IsAfterShuttersManualBlocking($shuttersDev) - ) - { - Log3( $name, 4, -"AutoShuttersControl ($name) - EventProcessingRoommate_1: $shuttersDev und Events $events" - ); - if ( - ( - ( - $getRoommatesLastStatus eq 'asleep' - && ( $shutters->getModeUp eq 'always' - or $shutters->getModeUp eq $event ) - ) - || ( - $getRoommatesLastStatus eq 'awoken' - && ( $shutters->getModeUp eq 'always' - or $shutters->getModeUp eq $event ) - ) - ) - && ( $shutters->getIsDay - || $shutters->getUp eq 'roommate' ) - && ( IsAfterShuttersTimeBlocking($shuttersDev) - || $shutters->getUp eq 'roommate' ) - ) - { - Log3( $name, 4, -"AutoShuttersControl ($name) - EventProcessingRoommate_2: $shuttersDev und Events $events" - ); - - if ( $shutters->getIfInShading - && !$shutters->getShadingManualDriveStatus - && $shutters->getStatus != $shutters->getShadingPos ) - { - $shutters->setLastDrive('shading in'); - $posValue = $shutters->getShadingPos; - } - elsif ( !$shutters->getIfInShading ) { - $shutters->setLastDrive('roommate awoken'); - $posValue = $shutters->getOpenPos; - } - - ShuttersCommandSet( $hash, $shuttersDev, $posValue ); - } - elsif ( - ( - $getRoommatesLastStatus eq 'absent' - || $getRoommatesLastStatus eq 'gone' - ) - && $getRoommatesStatus eq 'home' - ) - { - if ( - $shutters->getIsDay - && $shutters->getIfInShading - && $shutters->getStatus != $shutters->getShadingPos - && !$shutters->getShadingManualDriveStatus - && !( - CheckIfShuttersWindowRecOpen($shuttersDev) == 2 - && $shutters->getShuttersPlace eq 'terrace' - ) - && !$shutters->getSelfDefenseState - ) - { - FHEM::Automation::ShuttersControl::Shading::ShadingProcessingDriveCommand( $hash, $shuttersDev ); - } - elsif ( - !$shutters->getIsDay - && IsAfterShuttersTimeBlocking($shuttersDev) - && ( $getModeDown eq 'home' - || $getModeDown eq 'always' ) - && $shutters->getDown ne 'roommate' - ) - { - $shutters->setLastDrive('roommate come home'); - - if ( CheckIfShuttersWindowRecOpen($shuttersDev) == 0 - || $shutters->getVentilateOpen eq 'off' ) - { - $posValue = ( - $shutters->getSleepPos > 0 ? $shutters->getSleepPos - : ( - $shutters->getSleepPos > 0 - ? $shutters->getSleepPos - : $shutters->getClosedPos - ) - ); - } - else { - $posValue = $shutters->getVentilatePos; - $shutters->setLastDrive( - $shutters->getLastDrive . ' - ventilate mode' ); - } - - ShuttersCommandSet( $hash, $shuttersDev, $posValue ); - } - elsif ( - ( $shutters->getIsDay || $shutters->getUp eq 'roommate' ) - && IsAfterShuttersTimeBlocking($shuttersDev) - && ( $getModeUp eq 'home' - || $getModeUp eq 'always' ) - && !$shutters->getIfInShading - ) - { - if ( $shutters->getIfInShading - && !$shutters->getShadingManualDriveStatus - && $shutters->getStatus == $shutters->getOpenPos - && $shutters->getShadingMode eq 'home' ) - { - $shutters->setLastDrive('shading in'); - ShuttersCommandSet( $hash, $shuttersDev, - $shutters->getShadingPos ); - } - elsif ( - ( - !$shutters->getIfInShading - || $shutters->getShadingMode eq 'absent' - ) - && ( $shutters->getStatus == $shutters->getClosedPos - || $shutters->getStatus == $shutters->getSleepPos - || $shutters->getStatus == - $shutters->getShadingPos ) - ) - { - $shutters->setLastDrive( - ( - ( - $shutters->getStatus == - $shutters->getClosedPos - || $shutters->getStatus == - $shutters->getSleepPos - ) - ? 'roommate come home' - : 'shading out' - ) - ); - - ShuttersCommandSet( $hash, $shuttersDev, - $shutters->getOpenPos ); - } - } - } - } - elsif ( - ( $event eq 'gotosleep' || $event eq 'asleep' ) - && ( $ascDev->getAutoShuttersControlEvening eq 'on' - || $shutters->getDown eq 'roommate' ) - && ( IsAfterShuttersManualBlocking($shuttersDev) - || $shutters->getDown eq 'roommate' ) - ) - { - $shutters->setLastDrive('roommate asleep'); - - if ( CheckIfShuttersWindowRecOpen($shuttersDev) == 0 - || $shutters->getVentilateOpen eq 'off' ) - { - $posValue = ( - $shutters->getSleepPos > 0 - ? $shutters->getSleepPos - : $shutters->getClosedPos - ); - } - else { - $posValue = $shutters->getVentilatePos; - $shutters->setLastDrive( - $shutters->getLastDrive . ' - ventilate mode' ); - } - - ShuttersCommandSet( $hash, $shuttersDev, $posValue ); - } - elsif ( - $event eq 'absent' - && ( !$shutters->getIsDay - || $shutters->getDown eq 'roommate' - || $shutters->getShadingMode eq 'absent' - || $shutters->getModeUp eq 'absent' - || $shutters->getModeDown eq 'absent' ) - ) - { - Log3( $name, 4, -"AutoShuttersControl ($name) - EventProcessingRoommate absent: $shuttersDev" - ); - - if ( ( $shutters->getIsDay || $shutters->getUp eq 'roommate' ) - && $shutters->getIfInShading - && !$shutters->getQueryShuttersPos( $shutters->getShadingPos ) - && $shutters->getShadingMode eq 'absent' ) - { - Log3( $name, 4, -"AutoShuttersControl ($name) - EventProcessingRoommate Shading: $shuttersDev" - ); - - $shutters->setLastDrive('shading in'); - ShuttersCommandSet( $hash, $shuttersDev, - $shutters->getShadingPos ); - } - elsif (( !$shutters->getIsDay || $shutters->getDown eq 'roommate' ) - && $getModeDown eq 'absent' - && $getRoommatesStatus eq 'absent' ) - { - Log3( $name, 4, -"AutoShuttersControl ($name) - EventProcessingRoommate Down: $shuttersDev" - ); - - $shutters->setLastDrive('roommate absent'); - ShuttersCommandSet( $hash, $shuttersDev, - $shutters->getClosedPos ); - } - elsif ($shutters->getIsDay - && $shutters->getModeUp eq 'absent' - && $getRoommatesStatus eq 'absent' ) - { - Log3( $name, 4, -"AutoShuttersControl ($name) - EventProcessingRoommate Up: $shuttersDev" - ); - - $shutters->setLastDrive('roommate absent'); - ShuttersCommandSet( $hash, $shuttersDev, - $shutters->getOpenPos ); - } - - Log3( $name, 4, -"AutoShuttersControl ($name) - EventProcessingRoommate NICHTS: $shuttersDev" - ); - } - } - - return; -} - -sub EventProcessingResidents { - my $hash = shift; - my $device = shift; - my $events = shift; - - my $name = $device; - my $reading = $ascDev->getResidentsReading; - my $getResidentsLastStatus = $ascDev->getResidentsLastStatus; - - if ( $events =~ m{$reading:\s((?:pet_[a-z]+)|(?:absent))}xms ) { - for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { - $shutters->setShuttersDev($shuttersDev); - my $getModeUp = $shutters->getModeUp; - my $getModeDown = $shutters->getModeDown; - $shutters->setHardLockOut('off'); - if ( - $ascDev->getSelfDefense eq 'on' - && $shutters->getSelfDefenseMode ne 'off' - || ( $getModeDown eq 'absent' - || $getModeDown eq 'always' ) - || ( $shutters->getShadingMode eq 'absent' - && $shutters->getRoommatesStatus eq 'none' ) - || ( $shutters->getShadingMode eq 'home' - && $shutters->getRoommatesStatus eq 'none' ) - ) - { - if ( - $ascDev->getSelfDefense eq 'on' - && ( - $shutters->getSelfDefenseMode eq 'absent' - || ( CheckIfShuttersWindowRecOpen($shuttersDev) == 2 - && $shutters->getSelfDefenseMode eq 'gone' - && $shutters->getShuttersPlace eq 'terrace' - && $shutters->getSelfDefenseMode ne 'off' ) - ) - ) - { - $shutters->setLastDrive('selfDefense absent active'); - $shutters->setSelfDefenseAbsent( 0, 1 ) - ; # der erste Wert ist ob der timer schon läuft, der zweite ist ob self defense aktiv ist durch die Bedingungen - $shutters->setSelfDefenseState(1); - $shutters->setDriveCmd( $shutters->getClosedPos ); - } - elsif ($shutters->getIsDay - && $shutters->getIfInShading - && $shutters->getShadingMode eq 'absent' - && $shutters->getRoommatesStatus eq 'none' ) - { - FHEM::Automation::ShuttersControl::Shading::ShadingProcessingDriveCommand( $hash, $shuttersDev ); - } - elsif ( - $shutters->getShadingMode eq 'home' - && $shutters->getIsDay - && $shutters->getIfInShading - && $shutters->getStatus == $shutters->getShadingPos - && $shutters->getRoommatesStatus eq 'none' - && !( - CheckIfShuttersWindowRecOpen($shuttersDev) == 2 - && $shutters->getShuttersPlace eq 'terrace' - ) - && !$shutters->getSelfDefenseState - ) - { - $shutters->setLastDrive('shading out'); - $shutters->setDriveCmd( $shutters->getLastPos ); - } - elsif (( $getModeDown eq 'absent' || $getModeDown eq 'always' ) - && !$shutters->getIsDay - && IsAfterShuttersTimeBlocking($shuttersDev) - && $shutters->getRoommatesStatus eq 'none' ) - { - $shutters->setLastDrive('residents absent'); - $shutters->setDriveCmd( $shutters->getClosedPos ); - } - } - } - } - elsif ($events =~ m{$reading:\s(gone)}xms - && $ascDev->getSelfDefense eq 'on' ) - { - for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { - $shutters->setShuttersDev($shuttersDev); - $shutters->setHardLockOut('off'); - if ( $shutters->getSelfDefenseMode ne 'off' ) { - - $shutters->setLastDrive('selfDefense gone active'); - $shutters->setSelfDefenseState(1); - $shutters->setDriveCmd( $shutters->getClosedPos ); - } - } - } - elsif ( - $events =~ m{$reading:\s((?:[a-z]+_)?home)}xms - && ( $getResidentsLastStatus eq 'absent' - || $getResidentsLastStatus eq 'gone' - || $getResidentsLastStatus eq 'asleep' - || $getResidentsLastStatus eq 'awoken' ) - ) - { - for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { - $shutters->setShuttersDev($shuttersDev); - my $getModeUp = $shutters->getModeUp; - my $getModeDown = $shutters->getModeDown; - - if ( - ( - $shutters->getStatus != $shutters->getClosedPos - || $shutters->getStatus != $shutters->getSleepPos - ) - && !$shutters->getIsDay - && $shutters->getRoommatesStatus eq 'none' - && ( $getModeDown eq 'home' - || $getModeDown eq 'always' ) - && $getResidentsLastStatus ne 'asleep' - && $getResidentsLastStatus ne 'awoken' - && IsAfterShuttersTimeBlocking($shuttersDev) - && !$shutters->getSelfDefenseState - ) - { - $shutters->setLastDrive('residents come home'); - $shutters->setDriveCmd( - ( - $shutters->getSleepPos > 0 - ? $shutters->getSleepPos - : $shutters->getClosedPos - ) - ); - } - elsif ( - ( - $shutters->getShadingMode eq 'home' - || $shutters->getShadingMode eq 'always' - ) - && $shutters->getIsDay - && $shutters->getIfInShading - && $shutters->getRoommatesStatus eq 'none' - && $shutters->getStatus != $shutters->getShadingPos - && !$shutters->getShadingManualDriveStatus - && !( - CheckIfShuttersWindowRecOpen($shuttersDev) == 2 - && $shutters->getShuttersPlace eq 'terrace' - ) - && !$shutters->getSelfDefenseState - ) - { - FHEM::Automation::ShuttersControl::Shading::ShadingProcessingDriveCommand( $hash, $shuttersDev ); - } - elsif ( - $shutters->getShadingMode eq 'absent' - && $shutters->getIsDay - && $shutters->getIfInShading - && $shutters->getStatus == $shutters->getShadingPos - && $shutters->getRoommatesStatus eq 'none' - && !$shutters->getShadingManualDriveStatus - && !( - CheckIfShuttersWindowRecOpen($shuttersDev) == 2 - && $shutters->getShuttersPlace eq 'terrace' - ) - && !$shutters->getSelfDefenseState - ) - { - $shutters->setLastDrive('shading out'); - $shutters->setDriveCmd( $shutters->getLastPos ); - } - elsif ( - $ascDev->getSelfDefense eq 'on' - && $shutters->getSelfDefenseMode ne 'off' - && !$shutters->getIfInShading - && ( $getResidentsLastStatus eq 'gone' - || $getResidentsLastStatus eq 'absent' ) - && $shutters->getSelfDefenseState - ) - { - RemoveInternalTimer( $shutters->getSelfDefenseAbsentTimerhash ) - if ( $getResidentsLastStatus eq 'absent' - && $ascDev->getSelfDefense eq 'on' - && $shutters->getSelfDefenseMode ne 'off' - && !$shutters->getSelfDefenseAbsent - && $shutters->getSelfDefenseAbsentTimerrun ); - - if ( - ( - $shutters->getStatus == $shutters->getClosedPos - || $shutters->getStatus == $shutters->getSleepPos - ) - && $shutters->getIsDay - ) - { - $shutters->setHardLockOut('on') - if ( - CheckIfShuttersWindowRecOpen($shuttersDev) == 2 - && $shutters->getShuttersPlace eq 'terrace' - && ( $getModeUp eq 'absent' - || $getModeUp eq 'off' ) - ); - - $shutters->setSelfDefenseState(0); - $shutters->setLastDrive('selfDefense inactive'); - $shutters->setDriveCmd( - ( - $shutters->getPrivacyDownStatus == 2 - ? $shutters->getPrivacyDownPos - : $shutters->getOpenPos - ) - ); - } - } - elsif ( - ( - $shutters->getStatus == $shutters->getClosedPos - || $shutters->getStatus == $shutters->getSleepPos - ) - && $shutters->getIsDay - && $shutters->getRoommatesStatus eq 'none' - && ( $getModeUp eq 'home' - || $getModeUp eq 'always' ) - && IsAfterShuttersTimeBlocking($shuttersDev) - && !$shutters->getIfInShading - && !$shutters->getSelfDefenseState - ) - { - if ( $getResidentsLastStatus eq 'asleep' - || $getResidentsLastStatus eq 'awoken' ) - { - $shutters->setLastDrive('residents awoken'); - } - else { $shutters->setLastDrive('residents home'); } - $shutters->setDriveCmd( $shutters->getOpenPos ); - } - } - } - - return; -} - -sub EventProcessingRain { - - #### Ist noch nicht fertig, es fehlt noch das verzögerte Prüfen auf erhalten bleiben des getriggerten Wertes. - - my $hash = shift; - my $device = shift; - my $events = shift; - - my $name = $device; - my $reading = $ascDev->getRainSensorReading // 'none'; - - if ( $events =~ m{$reading:\s(\d+(\.\d+)?|rain|dry)}xms ) { - my $val; - my $triggerMax = $ascDev->getRainTriggerMax; - my $triggerMin = $ascDev->getRainTriggerMin; - my $closedPos = $ascDev->getRainSensorShuttersClosedPos; - - if ( $1 eq 'rain' ) { $val = $triggerMax + 1 } - elsif ( $1 eq 'dry' ) { $val = $triggerMin } - else { $val = $1 } - - RainProtection( $hash, $val, $triggerMax, $triggerMin, $closedPos ); - } - - return; -} - -sub RainProtection { - my ( $hash, $val, $triggerMax, $triggerMin, $closedPos ) = @_; - - for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { - $shutters->setShuttersDev($shuttersDev); - - next - if ( $shutters->getRainProtection eq 'off' ); - - if ( $val > $triggerMax - && $shutters->getStatus != $closedPos - && $shutters->getRainProtectionStatus eq 'unprotected' ) - { - $shutters->setLastDrive('rain protected'); - $shutters->setDriveCmd($closedPos); - $shutters->setRainProtectionStatus('protected'); - } - elsif (( $val == 0 || $val < $triggerMin ) - && $shutters->getStatus == $closedPos - && IsAfterShuttersManualBlocking($shuttersDev) - && $shutters->getRainProtectionStatus eq 'protected' ) - { - $shutters->setLastDrive('rain un-protected'); - $shutters->setDriveCmd( - ( - $shutters->getIsDay ? $shutters->getLastPos - : ( - $shutters->getPrivacyDownStatus == 2 - ? $shutters->getPrivacyDownPos - : $shutters->getClosedPos - ) - ) - ); - $shutters->setRainProtectionStatus('unprotected'); - } - } - - return; -} - -sub EventProcessingWind { - my $hash = shift; - my $shuttersDev = shift; - my $events = shift; - - my $name = $hash->{NAME}; - $shutters->setShuttersDev($shuttersDev); - - my $reading = $ascDev->getWindSensorReading // 'none'; - if ( $events =~ m{$reading:\s(\d+(\.\d+)?)}xms ) { - for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { - $shutters->setShuttersDev($shuttersDev); - - ASC_Debug( 'EventProcessingWind: ' - . $shutters->getShuttersDev - . ' - WindProtection1: ' - . $shutters->getWindProtectionStatus - . ' WindMax1: ' - . $shutters->getWindMax - . ' WindMin1: ' - . $shutters->getWindMin - . ' Bekommender Wert1: ' - . $1 ); - - next - if ( - ( - CheckIfShuttersWindowRecOpen($shuttersDev) != 0 - && $shutters->getShuttersPlace eq 'terrace' - ) - || $shutters->getWindProtection eq 'off' - ); - - if ( $1 > $shutters->getWindMax - && $shutters->getWindProtectionStatus eq 'unprotected' ) - { - $shutters->setLastDrive('wind protected'); - $shutters->setDriveCmd( $shutters->getWindPos ); - $shutters->setWindProtectionStatus('protected'); - } - elsif ($1 < $shutters->getWindMin - && $shutters->getWindProtectionStatus eq 'protected' ) - { - $shutters->setLastDrive('wind un-protected'); - $shutters->setDriveCmd( - ( - $shutters->getIsDay ? $shutters->getLastPos - : ( - $shutters->getPrivacyDownStatus == 2 - ? $shutters->getPrivacyDownPos - : ( - $shutters->getSleepPos > 0 - ? $shutters->getSleepPos - : $shutters->getClosedPos - ) - ) - ) - ); - $shutters->setWindProtectionStatus('unprotected'); - } - - ASC_Debug( 'EventProcessingWind: ' - . $shutters->getShuttersDev - . ' - WindProtection2: ' - . $shutters->getWindProtectionStatus - . ' WindMax2: ' - . $shutters->getWindMax - . ' WindMin2: ' - . $shutters->getWindMin - . ' Bekommender Wert2: ' - . $1 ); - } - } - - return; -} -########## - -sub EventProcessingBrightness { - my $hash = shift; - my $shuttersDev = shift; - my $events = shift; - - my $name = $hash->{NAME}; - $shutters->setShuttersDev($shuttersDev); - - ASC_Debug( 'EventProcessingBrightness: ' - . $shutters->getShuttersDev - . ' - Event von einem Helligkeitssensor erkannt. Verarbeitung läuft. Sollten keine weitere Meldungen aus der Funktion kommen, so befindet sich die aktuelle Zeit nicht innerhalb der Verarbeitungszeit für Sunset oder Sunrise' - ); - - return EventProcessingShadingBrightness( $hash, $shuttersDev, $events ) - if ( - ( - $shutters->getDown ne 'brightness' - && $shutters->getUp ne 'brightness' - ) - || ( - ( - $shutters->getDown eq 'brightness' - || $shutters->getUp eq 'brightness' - ) - && ( - ( - ( - ( - int( gettimeofday() / 86400 ) == int( - computeAlignTime( '24:00', - $shutters->getTimeUpEarly ) / 86400 - ) - && ( - !IsWe() - || ( - IsWe() - && $ascDev->getSunriseTimeWeHoliday eq 'off' - || ( - $ascDev->getSunriseTimeWeHoliday eq 'on' - && $shutters->getTimeUpWeHoliday eq - '01:25' ) - ) - ) - ) - || ( - int( gettimeofday() / 86400 ) == int( - computeAlignTime( '24:00', - $shutters->getTimeUpWeHoliday ) / 86400 - ) - && IsWe() - && $ascDev->getSunriseTimeWeHoliday eq 'on' - && $shutters->getTimeUpWeHoliday ne '01:25' - ) - ) - && int( gettimeofday() / 86400 ) == int( - computeAlignTime( '24:00', $shutters->getTimeUpLate ) / - 86400 - ) - - || ( - ( - int( gettimeofday() / 86400 ) != int( - computeAlignTime( '24:00', - $shutters->getTimeUpEarly ) / 86400 - ) - && ( - !IsWe() - || ( - IsWe() - && $ascDev->getSunriseTimeWeHoliday eq 'off' - || ( - $ascDev->getSunriseTimeWeHoliday eq 'on' - && $shutters->getTimeUpWeHoliday eq - '01:25' ) - ) - ) - ) - || ( - int( gettimeofday() / 86400 ) != int( - computeAlignTime( '24:00', - $shutters->getTimeUpWeHoliday ) / 86400 - ) - && IsWe() - && $ascDev->getSunriseTimeWeHoliday eq 'on' - && $shutters->getTimeUpWeHoliday ne '01:25' - ) - ) - && int( gettimeofday() / 86400 ) != int( - computeAlignTime( '24:00', $shutters->getTimeUpLate ) / - 86400 - ) - ) - && ( - ( - int( gettimeofday() / 86400 ) == int( - computeAlignTime( - '24:00', $shutters->getTimeDownEarly - ) / 86400 - ) - && int( gettimeofday() / 86400 ) == int( - computeAlignTime( '24:00', $shutters->getTimeDownLate - ) / 86400 - ) - ) - || ( - int( gettimeofday() / 86400 ) != int( - computeAlignTime( - '24:00', $shutters->getTimeDownEarly - ) / 86400 - ) - && int( gettimeofday() / 86400 ) != int( - computeAlignTime( '24:00', $shutters->getTimeDownLate - ) / 86400 - ) - ) - ) - ) - ) - ); - - ASC_Debug( 'EventProcessingBrightness: ' - . $shutters->getShuttersDev - . ' - Die aktuelle Zeit befindet sich innerhalb der Sunset/Sunrise Brightness Verarbeitungszeit. Also zwischen Time Early und Time Late' - ); - - my $reading = $shutters->getBrightnessReading; - if ( $events =~ m{$reading:\s(\d+(\.\d+)?)}xms ) { - my $brightnessMinVal; - if ( $shutters->getBrightnessMinVal > -1 ) { - $brightnessMinVal = $shutters->getBrightnessMinVal; - } - else { - $brightnessMinVal = $ascDev->getBrightnessMinVal; - } - - my $brightnessMaxVal; - if ( $shutters->getBrightnessMaxVal > -1 ) { - $brightnessMaxVal = $shutters->getBrightnessMaxVal; - } - else { - $brightnessMaxVal = $ascDev->getBrightnessMaxVal; - } - - my $brightnessPrivacyUpVal = $shutters->getPrivacyUpBrightnessVal; - my $brightnessPrivacyDownVal = $shutters->getPrivacyDownBrightnessVal; - - ASC_Debug( 'EventProcessingBrightness: ' - . $shutters->getShuttersDev - . ' - Es wird geprüft ob Sunset oder Sunrise gefahren werden soll und der aktuelle übergebene Brightness-Wert: ' - . $1 - . ' Größer dem eingestellten Sunrise-Wert: ' - . $brightnessMaxVal - . ' oder kleiner dem eingestellten Sunset-Wert: ' - . $brightnessMinVal - . ' ist. Werte für weitere Parameter - getUp ist: ' - . $shutters->getUp - . ' getDown ist: ' - . $shutters->getDown - . ' getSunrise ist: ' - . $shutters->getSunrise - . ' getSunset ist: ' - . $shutters->getSunset ); - - if ( - ( - ( - ( - int( gettimeofday() / 86400 ) != int( - computeAlignTime( '24:00', - $shutters->getTimeUpEarly ) / 86400 - ) - && ( - !IsWe() - || ( - IsWe() - && $ascDev->getSunriseTimeWeHoliday eq 'off' - || ( $ascDev->getSunriseTimeWeHoliday eq 'on' - && $shutters->getTimeUpWeHoliday eq - '01:25' ) - ) - ) - ) - || ( - int( gettimeofday() / 86400 ) != int( - computeAlignTime( '24:00', - $shutters->getTimeUpWeHoliday ) / 86400 - ) - && IsWe() - && $ascDev->getSunriseTimeWeHoliday eq 'on' - && $shutters->getTimeUpWeHoliday ne '01:25' - ) - ) - && int( gettimeofday() / 86400 ) == int( - computeAlignTime( '24:00', $shutters->getTimeUpLate ) / - 86400 - ) - ) - && ( - $1 > $brightnessMaxVal - || ( $1 > $brightnessPrivacyUpVal - && $shutters->getPrivacyUpStatus == 1 ) - ) - && $shutters->getUp eq 'brightness' - && !$shutters->getSunrise - && $ascDev->getAutoShuttersControlMorning eq 'on' - && ( - $ascDev->getSelfDefense eq 'off' - || $shutters->getSelfDefenseMode eq 'off' - || ( $ascDev->getSelfDefense eq 'on' - && $ascDev->getResidentsStatus ne 'gone' ) - ) - ) - { - Log3( $name, 4, -"AutoShuttersControl ($shuttersDev) - EventProcessingBrightness: Steuerung für Morgens" - ); - - ASC_Debug( 'EventProcessingBrightness: ' - . $shutters->getShuttersDev - . ' - Verarbeitungszeit für Sunrise wurd erkannt. Prüfe Status der Roommates' - ); - - my $homemode = $shutters->getRoommatesStatus; - $homemode = $ascDev->getResidentsStatus - if ( $homemode eq 'none' ); - - if ( - $shutters->getModeUp eq $homemode - || ( $shutters->getModeUp eq 'absent' - && $homemode eq 'gone' ) - || $shutters->getModeUp eq 'always' - ) - { - my $roommatestatus = $shutters->getRoommatesStatus; - - if ( - $roommatestatus eq 'home' - || $roommatestatus eq 'awoken' - || $roommatestatus eq 'absent' - || $roommatestatus eq 'gone' - || $roommatestatus eq 'none' - && ( - $ascDev->getSelfDefense eq 'off' - || ( $ascDev->getSelfDefense eq 'on' - && CheckIfShuttersWindowRecOpen($shuttersDev) == 0 ) - || ( $ascDev->getSelfDefense eq 'on' - && CheckIfShuttersWindowRecOpen($shuttersDev) != 0 - && $ascDev->getResidentsStatus eq 'home' ) - ) - ) - { - - if ( $brightnessPrivacyUpVal > 0 - && $1 < $brightnessMaxVal - && $1 > $brightnessPrivacyUpVal ) - { - $shutters->setPrivacyUpStatus(2); - $shutters->setLastDrive('brightness privacy day open'); - ShuttersCommandSet( $hash, $shuttersDev, - $shutters->getPrivacyUpPos ) - if ( - $shutters->getQueryShuttersPos( - $shutters->getPrivacyUpPos - ) - ); - - ASC_Debug( 'EventProcessingBrightness: ' - . $shutters->getShuttersDev - . ' - Verarbeitung für Sunrise Privacy Down. Roommatestatus korrekt zum fahren. Fahrbefehl wird an die Funktion FnShuttersCommandSet gesendet. Grund des fahrens: ' - . $shutters->getLastDrive ); - - CreateSunRiseSetShuttersTimer( $hash, $shuttersDev ); - } - else { - $shutters->setLastDrive( - 'maximum brightness threshold exceeded'); - $shutters->setSunrise(1); - $shutters->setSunset(0); - $shutters->setPrivacyUpStatus(0) - if ( $shutters->getPrivacyUpStatus == 2 ); - ShuttersCommandSet( $hash, $shuttersDev, - $shutters->getOpenPos ); - - ASC_Debug( 'EventProcessingBrightness: ' - . $shutters->getShuttersDev - . ' - Verarbeitung für Sunrise. Roommatestatus korrekt zum fahren. Fahrbefehl wird an die Funktion FnShuttersCommandSet gesendet. Grund des fahrens: ' - . $shutters->getLastDrive ); - } - } - else { - EventProcessingShadingBrightness( $hash, $shuttersDev, - $events ); - ASC_Debug( 'EventProcessingBrightness: ' - . $shutters->getShuttersDev - . ' - Verarbeitung für Sunrise. Roommatestatus nicht zum hochfahren oder Fenster sind offen. Fahrbebehl bleibt aus!!! Es wird an die Event verarbeitende Beschattungsfunktion weiter gereicht' - ); - } - } - } - elsif ( - int( gettimeofday() / 86400 ) != int( - computeAlignTime( '24:00', $shutters->getTimeDownEarly ) / 86400 - ) - && int( gettimeofday() / 86400 ) == int( - computeAlignTime( '24:00', $shutters->getTimeDownLate ) / 86400 - ) - && ( - $1 < $brightnessMinVal - || ( $1 < $brightnessPrivacyDownVal - && $shutters->getPrivacyDownStatus == 1 ) - ) - && $shutters->getDown eq 'brightness' - && !$shutters->getSunset - && IsAfterShuttersManualBlocking($shuttersDev) - && $ascDev->getAutoShuttersControlEvening eq 'on' - ) - { - Log3( $name, 4, -"AutoShuttersControl ($shuttersDev) - EventProcessingBrightness: Steuerung für Abends" - ); - - ASC_Debug( 'EventProcessingBrightness: ' - . $shutters->getShuttersDev - . ' - Verarbeitungszeit für Sunset wurd erkannt. Prüfe Status der Roommates' - ); - - my $homemode = $shutters->getRoommatesStatus; - $homemode = $ascDev->getResidentsStatus - if ( $homemode eq 'none' ); - - if ( - $shutters->getModeDown eq $homemode - || ( $shutters->getModeDown eq 'absent' - && $homemode eq 'gone' ) - || $shutters->getModeDown eq 'always' - ) - { - my $posValue = $shutters->getStatus; - my $lastDrive; - - ## Setzt den PrivacyDown Modus für die Sichtschutzfahrt auf den Status 0 - ## 1 bedeutet das PrivacyDown Timer aktiviert wurde, 2 beudet das er im privacyDown ist - ## also das Rollo in privacyDown Position steht und VOR der endgültigen Nachfahrt - - if ( $brightnessPrivacyDownVal > 0 - && $1 > $brightnessMinVal - && $1 < $brightnessPrivacyDownVal ) - { - $lastDrive = 'brightness privacy night close'; - $posValue = ( - ( - !$shutters->getQueryShuttersPos( - $shutters->getPrivacyDownPos - ) - ) ? $shutters->getPrivacyDownPos : $shutters->getStatus - ); - $shutters->setPrivacyDownStatus(2); - - ASC_Debug( 'EventProcessingBrightness: ' - . $shutters->getShuttersDev - . ' - Verarbeitung für Sunset Privacy Down. Roommatestatus korrekt zum fahren. Fahrbefehl wird an die Funktion FnShuttersCommandSet gesendet. Grund des fahrens: ' - . $shutters->getLastDrive ); - } - elsif (CheckIfShuttersWindowRecOpen($shuttersDev) == 2 - && $shutters->getSubTyp eq 'threestate' - && $ascDev->getAutoShuttersControlComfort eq 'on' ) - { - $posValue = $shutters->getComfortOpenPos; - $lastDrive = 'minimum brightness threshold fell below'; - $shutters->setPrivacyDownStatus(0) - if ( $shutters->getPrivacyDownStatus == 2 ); - } - elsif ( CheckIfShuttersWindowRecOpen($shuttersDev) == 0 - || $shutters->getVentilateOpen eq 'off' ) - { - $posValue = ( - $shutters->getSleepPos > 0 - ? $shutters->getSleepPos - : $shutters->getClosedPos - ); - $lastDrive = 'minimum brightness threshold fell below'; - $shutters->setPrivacyDownStatus(0) - if ( $shutters->getPrivacyDownStatus == 2 ); - } - else { - $posValue = $shutters->getVentilatePos; - $lastDrive = 'minimum brightness threshold fell below'; - $shutters->setPrivacyDownStatus(0) - if ( $shutters->getPrivacyDownStatus == 2 ); - } - - $shutters->setLastDrive($lastDrive); - - if ( - $shutters->getPrivacyDownStatus != 2 -# && ( $posValue != $shutters->getStatus -# || $shutters->getSelfDefenseState ) - ) - { - $shutters->setSunrise(0); - $shutters->setSunset(1); - } - - ShuttersCommandSet( $hash, $shuttersDev, $posValue ); - - ASC_Debug( 'EventProcessingBrightness: ' - . $shutters->getShuttersDev - . ' - Verarbeitung für Sunset. Roommatestatus korrekt zum fahren. Fahrbefehl wird an die Funktion FnShuttersCommandSet gesendet. Zielposition: ' - . $posValue - . ' Grund des fahrens: ' - . $shutters->getLastDrive ); - } - else { - EventProcessingShadingBrightness( $hash, $shuttersDev, $events ) - if ( $shutters->getPrivacyDownStatus != 2 ); - - ASC_Debug( 'EventProcessingBrightness: ' - . $shutters->getShuttersDev - . ' - Verarbeitung für Sunset. Roommatestatus nicht zum runter fahren. Fahrbebehl bleibt aus!!! Es wird an die Event verarbeitende Beschattungsfunktion weiter gereicht' - ); - } - } - else { - EventProcessingShadingBrightness( $hash, $shuttersDev, $events ) - if ( $shutters->getPrivacyDownStatus != 2 ); - - ASC_Debug( 'EventProcessingBrightness: ' - . $shutters->getShuttersDev - . ' - Brightness Event kam nicht innerhalb der Verarbeitungszeit für Sunset oder Sunris oder aber für beide wurden die entsprechendne Verarbeitungsschwellen nicht erreicht.' - ); - } - } - else { - ASC_Debug( 'EventProcessingBrightness: ' - . $shutters->getShuttersDev - . ' - Leider konnte kein Korrekter Brightnesswert aus dem Event erkannt werden. Entweder passt das Reading oder der tatsächliche nummerishce Wert des Events nicht' - ); - } - - return; -} - -sub EventProcessingShadingBrightness { - my $hash = shift; - my $shuttersDev = shift; - my $events = shift; - - my $name = $hash->{NAME}; - $shutters->setShuttersDev($shuttersDev); - my $reading = $shutters->getBrightnessReading; - my $outTemp = ( - $shutters->getOutTemp != -100 - ? $shutters->getOutTemp - : $ascDev->getOutTemp - ); - - Log3( $name, 4, - "AutoShuttersControl ($shuttersDev) - EventProcessingShadingBrightness" - ); - - ASC_Debug( 'EventProcessingShadingBrightness: ' - . $shutters->getShuttersDev - . ' - Es wird nun geprüft ob der übergebene Event ein nummerischer Wert vom Brightnessreading ist.' - ); - - if ( $events =~ m{$reading:\s(\d+(\.\d+)?)}xms ) { - Log3( - $name, 4, -"AutoShuttersControl ($shuttersDev) - EventProcessingShadingBrightness - Brightness: " . $1 - ); - - ## Brightness Wert in ein Array schieben zur Berechnung eines Average Wertes - $shutters->setPushBrightnessInArray($1); - - ASC_Debug( 'EventProcessingShadingBrightness: ' - . $shutters->getShuttersDev - . ' - Nummerischer Brightness-Wert wurde erkannt. Der Brightness Average Wert ist: ' - . $shutters->getBrightnessAverage - . ' RainProtection: ' - . $shutters->getRainProtectionStatus - . ' WindProtection: ' - . $shutters->getWindProtectionStatus ); - - if ( $ascDev->getAutoShuttersControlShading eq 'on' - && $shutters->getRainProtectionStatus eq 'unprotected' - && $shutters->getWindProtectionStatus eq 'unprotected' ) - { - FHEM::Automation::ShuttersControl::Shading::ShadingProcessing( - $hash, - $shuttersDev, - $ascDev->getAzimuth, - $ascDev->getElevation, - $outTemp, - $shutters->getShadingAzimuthLeft, - $shutters->getShadingAzimuthRight - ); - - ASC_Debug( 'EventProcessingShadingBrightness: ' - . $shutters->getShuttersDev - . ' - Alle Bedingungen zur weiteren Beschattungsverarbeitung sind erfüllt. Es wird nun die eigentliche Beschattungsfunktion aufgerufen' - ); - } - } - - return; -} - -sub EventProcessingTwilightDevice { - my $hash = shift; - my $device = shift; - my $events = shift; - - # Twilight - # azimuth = azimuth = Sonnenwinkel - # elevation = elevation = Sonnenhöhe - # - # Astro - # SunAz = azimuth = Sonnenwinkel - # SunAlt = elevation = Sonnenhöhe - - ASC_Debug( 'EventProcessingTwilightDevice: ' - . $shutters->getShuttersDev - . ' - Event vom Astro oder Twilight Device wurde erkannt. Event wird verarbeitet' - ); - - if ( $events =~ m{(azimuth|elevation|SunAz|SunAlt):\s(\d+.\d+)}xms ) { - my $name = $device; - my $outTemp = $ascDev->getOutTemp; - my ( $azimuth, $elevation ); - - $azimuth = $2 if ( $1 eq 'azimuth' || $1 eq 'SunAz' ); - $elevation = $2 if ( $1 eq 'elevation' || $1 eq 'SunAlt' ); - - $azimuth = $ascDev->getAzimuth - if ( !defined($azimuth) && !$azimuth ); - $elevation = $ascDev->getElevation - if ( !defined($elevation) && !$elevation ); - - ASC_Debug( 'EventProcessingTwilightDevice: ' - . $name - . ' - Passendes Event wurde erkannt. Verarbeitung über alle Rollos beginnt' - ); - - for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { - $shutters->setShuttersDev($shuttersDev); - - my $homemode = $shutters->getRoommatesStatus; - $homemode = $ascDev->getResidentsStatus if ( $homemode eq 'none' ); - $outTemp = $shutters->getOutTemp - if ( $shutters->getOutTemp != -100 ); - - ASC_Debug( 'EventProcessingTwilightDevice: ' - . $shutters->getShuttersDev - . ' RainProtection: ' - . $shutters->getRainProtectionStatus - . ' WindProtection: ' - . $shutters->getWindProtectionStatus ); - - if ( $ascDev->getAutoShuttersControlShading eq 'on' - && $shutters->getRainProtectionStatus eq 'unprotected' - && $shutters->getWindProtectionStatus eq 'unprotected' ) - { - FHEM::Automation::ShuttersControl::Shading::ShadingProcessing( - $hash, - $shuttersDev, - $azimuth, - $elevation, - $outTemp, - $shutters->getShadingAzimuthLeft, - $shutters->getShadingAzimuthRight - ); - - ASC_Debug( 'EventProcessingTwilightDevice: ' - . $shutters->getShuttersDev - . ' - Alle Bedingungen zur weiteren Beschattungsverarbeitung sind erfüllt. Es wird nun die Beschattungsfunktion ausgeführt' - ); - } - } - } - - return; -} - -sub EventProcessingPartyMode { - my $hash = shift; - - my $name = $hash->{NAME}; - - for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { - $shutters->setShuttersDev($shuttersDev); - next - if ( $shutters->getPartyMode eq 'off' ); - - if ( !$shutters->getIsDay - && $shutters->getModeDown ne 'off' - && IsAfterShuttersManualBlocking($shuttersDev) ) - { - if ( CheckIfShuttersWindowRecOpen($shuttersDev) == 2 - && $shutters->getSubTyp eq 'threestate' ) - { - Log3( $name, 4, -"AutoShuttersControl ($name) - EventProcessingPartyMode Fenster offen" - ); - $shutters->setDelayCmd( $shutters->getClosedPos ); - Log3( $name, 4, -"AutoShuttersControl ($name) - EventProcessingPartyMode - Spring in ShuttersCommandDelaySet" - ); - } - else { - Log3( $name, 4, -"AutoShuttersControl ($name) - EventProcessingPartyMode Fenster nicht offen" - ); - $shutters->setLastDrive('drive after party mode'); - ShuttersCommandSet( - $hash, - $shuttersDev, - ( - CheckIfShuttersWindowRecOpen($shuttersDev) == 0 - ? $shutters->getClosedPos - : $shutters->getVentilatePos - ) - ); - } - } - elsif ($shutters->getDelayCmd ne 'none' - && $shutters->getIsDay - && IsAfterShuttersManualBlocking($shuttersDev) ) - { - $shutters->setLastDrive('drive after party mode'); - ShuttersCommandSet( $hash, $shuttersDev, $shutters->getDelayCmd ); - } - } - - return; -} - -sub EventProcessingAdvShuttersClose { - my $hash = shift; - - my $name = $hash->{NAME}; - - for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { - $shutters->setShuttersDev($shuttersDev); - next - if ( !$shutters->getAdv - && !$shutters->getAdvDelay ); - - $shutters->setLastDrive('adv delay close'); - $shutters->setAdvDelay(1); - ShuttersCommandSet( - $hash, - $shuttersDev, - ( - $shutters->getDelayCmd ne 'none' - ? $shutters->getDelayCmd - : $shutters->getClosedPos - ) - ); - } - - return; -} - -sub EventProcessingShutters { - my $hash = shift; - my $shuttersDev = shift; - my $events = shift; - - my $name = $hash->{NAME}; - - ASC_Debug( 'EventProcessingShutters: ' - . ' Fn wurde durch Notify aufgerufen da ASC_Pos_Reading Event erkannt wurde ' - . ' - RECEIVED EVENT: ' - . Dumper $events); - - if ( $events =~ m{.*:\s(\d+)}xms ) { - $shutters->setShuttersDev($shuttersDev); - $ascDev->setPosReading; - - ASC_Debug( 'EventProcessingShutters: ' - . $shutters->getShuttersDev - . ' - Event vom Rollo erkannt. Es wird nun eine etwaige manuelle Fahrt ausgewertet.' - . ' Int von gettimeofday: ' - . int( gettimeofday() ) - . ' Last Position Timestamp: ' - . $shutters->getLastPosTimestamp - . ' Drive Up Max Duration: ' - . $shutters->getDriveUpMaxDuration - . ' Last Position: ' - . $shutters->getLastPos - . ' aktuelle Position: ' - . $shutters->getStatus ); - - if ( ( int( gettimeofday() ) - $shutters->getLastPosTimestamp ) > - $shutters->getDriveUpMaxDuration - && ( int( gettimeofday() ) - $shutters->getLastManPosTimestamp ) > - $shutters->getDriveUpMaxDuration ) - { - $shutters->setLastDrive('manual'); - $shutters->setLastDriveReading; - $ascDev->setStateReading; - $shutters->setLastManPos($1); - - $shutters->setShadingManualDriveStatus(1) - if ( $shutters->getIsDay - && $shutters->getIfInShading ); - - ASC_Debug( - 'EventProcessingShutters: eine manualle Fahrt wurde erkannt!'); - } - else { - $shutters->setLastDriveReading; - $ascDev->setStateReading; - - ASC_Debug( -'EventProcessingShutters: eine automatisierte Fahrt durch ASC wurde erkannt! Es werden nun die LastDriveReading und StateReading Werte gesetzt!' - ); - } - } - - ASC_Debug( 'EventProcessingShutters: ' - . ' Fn wurde durlaufen und es sollten Debugausgaben gekommen sein. ' - . ' !!!Wenn nicht!!! wurde der Event nicht korrekt als Nummerisch erkannt. ' - ); - - return; -} - -sub EventProcessingExternalTriggerDevice { - my $hash = shift; - my $shuttersDev = shift; - my $events = shift; - - my $name = $hash->{NAME}; - - $shutters->setShuttersDev($shuttersDev); - - ASC_Debug( 'EventProcessingExternalTriggerDevice: ' - . ' Fn wurde durch Notify ' - . ' - RECEIVED EVENT: ' - . Dumper $events); - - my $reading = $shutters->getExternalTriggerReading; - my $triggerValActive = $shutters->getExternalTriggerValueActive; - my $triggerValActive2 = $shutters->getExternalTriggerValueActive2; - my $triggerValInactive = $shutters->getExternalTriggerValueInactive; - my $triggerPosActive = $shutters->getExternalTriggerPosActive; - my $triggerPosActive2 = $shutters->getExternalTriggerPosActive2; - my $triggerPosInactive = $shutters->getExternalTriggerPosInactive; - - if ( $events =~ m{$reading:\s($triggerValActive|$triggerValActive2)}xms ) { - - # && !$shutters->getQueryShuttersPos($triggerPosActive) - - ASC_Debug( 'EventProcessingExternalTriggerDevice: ' - . ' In der RegEx Schleife Trigger Val Aktiv' - . ' - TriggerVal: ' - . $triggerValActive - . ' - TriggerVal2: ' - . $triggerValActive2 ); - - if ( $1 eq $triggerValActive2 ) { - $shutters->setLastDrive('external trigger2 device active'); - $shutters->setNoDelay(1); - $shutters->setExternalTriggerStatus(1); - ShuttersCommandSet( $hash, $shuttersDev, $triggerPosActive2 ); - } - else { - $shutters->setLastDrive('external trigger device active'); - $shutters->setNoDelay(1); - $shutters->setExternalTriggerStatus(1); - ShuttersCommandSet( $hash, $shuttersDev, $triggerPosActive ); - } - } - elsif ( - $events =~ m{$reading:\s($triggerValInactive)}xms - && ( $shutters->getPrivacyDownStatus != 2 - || $shutters->getPrivacyUpStatus != 2 ) - && !$shutters->getIfInShading - ) - { - ASC_Debug( 'EventProcessingExternalTriggerDevice: ' - . ' In der RegEx Schleife Trigger Val Inaktiv' - . ' - TriggerVal: ' - . $triggerValInactive ); - - $shutters->setLastDrive('external trigger device inactive'); - $shutters->setNoDelay(1); - $shutters->setExternalTriggerStatus(1); - ShuttersCommandSet( - $hash, - $shuttersDev, - ( - $shutters->getIsDay - ? $triggerPosInactive - : $shutters->getClosedPos - ) - ); - } - - ASC_Debug( - 'EventProcessingExternalTriggerDevice: ' . ' Funktion durchlaufen' ); - - return; -} - # Sub für das Zusammensetzen der Rolläden Steuerbefehle sub ShuttersCommandSet { my $hash = shift; @@ -2743,7 +984,7 @@ sub ShuttersCommandSet { if ( ( - CheckIfShuttersWindowRecOpen($shuttersDev) == 2 + CheckIfShuttersWindowRecOpen($shuttersDev) == 2 && $shutters->getShuttersPlace eq 'terrace' && ( $shutters->getLockOut eq 'soft' || $shutters->getLockOut eq 'hard' ) @@ -3500,11 +1741,9 @@ sub _SetCmdFn { my $idleDetection = $shutters->getIdleDetection; return - if ( - $shutters->getASCenable eq 'off' - || $ascDev->getASCenable eq 'off' - || $idleDetection !~ m{^$idleDetectionValue$}xms - ); + if ( $shutters->getASCenable eq 'off' + || $ascDev->getASCenable eq 'off' + || $idleDetection !~ m{^$idleDetectionValue$}xms ); if ( $shutters->getStatus != $posValue ) { $shutters->setLastPos( $shutters->getStatus ); @@ -3584,10 +1823,10 @@ sub _SetCmdFn { CommandSet( undef, $shuttersDev - . ':FILTER=' - . $shutters->getPosCmd . '!=' - . $posValue . ' ' - . $driveCommand ); + . ':FILTER=' + . $shutters->getPosCmd . '!=' + . $posValue . ' ' + . $driveCommand ); InternalTimer( gettimeofday() + 3, @@ -3595,18 +1834,18 @@ sub _SetCmdFn { CommandSet( undef, ( - $shutters->getSlatDevice ne 'none' + $shutters->getSlatDevice ne 'none' ? $shutters->getSlatDevice : $shuttersDev - ) - . ' ' - . $shutters->getSlatPosCmd . ' ' - . $slatPos + ) + . ' ' + . $shutters->getSlatPosCmd . ' ' + . $slatPos ); }, $shuttersDev - ) - if ( $slatPos > -1 + ) + if ( $slatPos > -1 && $shutters->getSlatPosCmd ne 'none' ); $shutters->setSelfDefenseAbsent( 0, 0 ) @@ -3795,7 +2034,7 @@ sub DevStateIcon { } sub RemoveShuttersTimer { - my $hash = shift; + my $hash = shift; for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { $shutters->setShuttersDev($shuttersDev); @@ -3807,7 +2046,4 @@ sub RemoveShuttersTimer { return; } - - - 1; diff --git a/lib/FHEM/Automation/ShuttersControl/EventProcessingFunctions.pm b/lib/FHEM/Automation/ShuttersControl/EventProcessingFunctions.pm new file mode 100644 index 0000000..33b6f64 --- /dev/null +++ b/lib/FHEM/Automation/ShuttersControl/EventProcessingFunctions.pm @@ -0,0 +1,2428 @@ +############################################################################### +# +# 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::EventProcessingFunctions; + +use strict; +use warnings; +use POSIX qw(strftime); +use utf8; + +use FHEM::Automation::ShuttersControl::Helper qw (:ALL); + +use GPUtils qw(GP_Import); +## Import der FHEM Funktionen +BEGIN { + GP_Import( + qw( + Log3 + gettimeofday + computeAlignTime + ) + ); +} + +sub EventProcessingGeneral { + my $hash = shift; + my $devname = shift; + my $events = shift; + + my $name = $hash->{NAME}; + + if ( defined($devname) && ($devname) ) + { # es wird lediglich der Devicename der Funktion mitgegeben wenn es sich nicht um global handelt daher hier die Unterscheidung + my $windReading = $ascDev->getWindSensorReading // 'none'; + my $rainReading = $ascDev->getRainSensorReading // 'none'; + + while ( my ( $device, $deviceAttr ) = + each %{ $hash->{monitoredDevs}{$devname} } ) + { + if ( $device eq $name ) { + EventProcessingResidents( $hash, $device, $events ) + if ( $deviceAttr eq 'ASC_residentsDev' ); + EventProcessingRain( $hash, $device, $events ) + if ( $events =~ m{$rainReading}xms ); + EventProcessingWind( $hash, $device, $events ) + if ( $events =~ m{$windReading}xms ); + + EventProcessingTwilightDevice( $hash, $device, $events ) + if ( $deviceAttr eq 'ASC_twilightDevice' ); + } + + EventProcessingWindowRec( $hash, $device, $events ) + if ( $deviceAttr eq 'ASC_WindowRec' ) + ; # ist es ein Fensterdevice wird die Funktion gestartet + EventProcessingRoommate( $hash, $device, $events ) + if ( $deviceAttr eq 'ASC_Roommate_Device' ) + ; # ist es ein Bewohner Device wird diese Funktion gestartet + + EventProcessingExternalTriggerDevice( $hash, $device, $events ) + if ( $deviceAttr eq 'ASC_ExternalTrigger' ); + + $shutters->setShuttersDev($device) + if ( $deviceAttr eq 'ASC_BrightnessSensor' ); + + if ( + $deviceAttr eq 'ASC_BrightnessSensor' + && ( $shutters->getDown eq 'brightness' + || $shutters->getUp eq 'brightness' ) + ) + { + EventProcessingBrightness( $hash, $device, $events ); + } + elsif ( $deviceAttr eq 'ASC_BrightnessSensor' ) { + EventProcessingShadingBrightness( $hash, $device, $events ); + } + } + } + else { # alles was kein Devicenamen mit übergeben hat landet hier + if ( + $events =~ m{^ATTR\s(.*) + \s(ASC_Roommate_Device|ASC_WindowRec|ASC_residentsDev|ASC_rainSensor + |ASC_windSensor|ASC_BrightnessSensor|ASC_ExternalTrigger + |ASC_twilightDevice) + \s(.*)$}xms + ) + { # wurde den Attributen unserer Rolläden ein Wert zugewiesen ? + AddNotifyDev( $hash, $3, $1, $2 ) if ( $3 ne 'none' ); + Log3( $name, 4, + "AutoShuttersControl ($name) - EventProcessing: ATTR" ); + } + elsif ( + $events =~ m{^DELETEATTR + \s(.*)\s(ASC_Roommate_Device + |ASC_WindowRec|ASC_residentsDev|ASC_rainSensor + |ASC_windSensor|ASC_BrightnessSensor|ASC_ExternalTrigger + |ASC_twilightDevice) + $}xms + ) + { # wurde das Attribut unserer Rolläden gelöscht ? + Log3( $name, 4, + "AutoShuttersControl ($name) - EventProcessing: DELETEATTR" ); + DeleteNotifyDev( $hash, $1, $2 ); + } + elsif ( + $events =~ m{^(DELETEATTR|ATTR) + \s(.*)\s(ASC_Time_Up_WE_Holiday|ASC_Up|ASC_Down + |ASC_AutoAstroModeMorning|ASC_AutoAstroModeMorningHorizon + |ASC_PrivacyDownValue_beforeNightClose + |ASC_PrivacyUpValue_beforeDayOpen|ASC_AutoAstroModeEvening + |ASC_AutoAstroModeEveningHorizon|ASC_Time_Up_Early + |ASC_Time_Up_Late|ASC_Time_Down_Early|ASC_Time_Down_Late) + (.*)?}xms + ) + { + CreateSunRiseSetShuttersTimer( $hash, $2 ) + if ( + $3 ne 'ASC_Time_Up_WE_Holiday' + || ( $3 eq 'ASC_Time_Up_WE_Holiday' + && $ascDev->getSunriseTimeWeHoliday eq 'on' ) + ); + } + elsif ( + $events =~ m{^(DELETEATTR|ATTR) + \s(.*)\s(ASC_autoAstroModeMorning|ASC_autoAstroModeMorningHorizon + |ASC_autoAstroModeEvening|ASC_autoAstroModeEveningHorizon) + (.*)?}xms + ) + { + RenewSunRiseSetShuttersTimer($hash); + } + + if ( + $events =~ +m{^(DELETEATTR|ATTR) #global ATTR myASC ASC_tempSensor Cellar + \s(.*)\s(ASC_tempSensor + |ASC_Shading_Mode + |ASC_BrightnessSensor + |ASC_TempSensor) + (.*)?}xms + ) + { + CommandSet( undef, $name . ' controlShading on' ) + if ( ReadingsVal( $name, 'controlShading', 'off' ) ne 'off' ); + } + } + + return; +} + +## Sub zum steuern der Rolläden bei einem Fenster Event +sub EventProcessingWindowRec { + my $hash = shift; + my $shuttersDev = shift; + my $events = shift; + + my $name = $hash->{NAME}; + + my $reading = + $FHEM::Automation::ShuttersControl::shutters->getWinDevReading; + + if ( $events =~ + m{.*$reading:.*?([Oo]pen(?>ed)?|[Cc]losed?|tilt(?>ed)?|true|false)}xms + && IsAfterShuttersManualBlocking($shuttersDev) ) + { + my $match = $1; + + FHEM::Automation::ShuttersControl::ASC_Debug( + 'EventProcessingWindowRec: ' + . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev + . ' - RECEIVED EVENT: ' + . $events + . ' - IDENTIFIED EVENT: ' + . $1 + . ' - STORED EVENT: ' + . $match ); + + $FHEM::Automation::ShuttersControl::shutters->setShuttersDev( + $shuttersDev); + my $homemode = + $FHEM::Automation::ShuttersControl::shutters->getRoommatesStatus; + $homemode = + $FHEM::Automation::ShuttersControl::ascDev->getResidentsStatus + if ( $homemode eq 'none' ); + + #### Hardware Lock der Rollläden + $FHEM::Automation::ShuttersControl::shutters->setHardLockOut('off') + if ( $match =~ m{[Cc]lose|true}xms + && $FHEM::Automation::ShuttersControl::shutters->getShuttersPlace + eq 'terrace' ); + $FHEM::Automation::ShuttersControl::shutters->setHardLockOut('on') + if ( $match =~ m{[Oo]pen|false}xms + && $FHEM::Automation::ShuttersControl::shutters->getShuttersPlace + eq 'terrace' ); + + FHEM::Automation::ShuttersControl::ASC_Debug( + 'EventProcessingWindowRec: ' + . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev + . ' - HOMEMODE: ' + . $homemode + . ' QueryShuttersPosWinRecTilted:' + . $FHEM::Automation::ShuttersControl::shutters + ->getQueryShuttersPos( + $FHEM::Automation::ShuttersControl::shutters->getVentilatePos + ) + . ' QueryShuttersPosWinRecComfort: ' + . $FHEM::Automation::ShuttersControl::shutters + ->getQueryShuttersPos( + $FHEM::Automation::ShuttersControl::shutters->getComfortOpenPos + ) + ); + + if ( + $match =~ m{[Cc]lose|true}xms + && IsAfterShuttersTimeBlocking($shuttersDev) + && ( + $FHEM::Automation::ShuttersControl::shutters->getStatus == + $FHEM::Automation::ShuttersControl::shutters->getVentilatePos + || $FHEM::Automation::ShuttersControl::shutters->getStatus == + $FHEM::Automation::ShuttersControl::shutters->getComfortOpenPos + || $FHEM::Automation::ShuttersControl::shutters->getStatus == + $FHEM::Automation::ShuttersControl::shutters->getOpenPos + || ( $FHEM::Automation::ShuttersControl::shutters->getStatus == + $FHEM::Automation::ShuttersControl::shutters + ->getPrivacyDownPos + && $FHEM::Automation::ShuttersControl::shutters + ->getPrivacyDownStatus == 1 + && !$FHEM::Automation::ShuttersControl::shutters->getIsDay ) + ) + && ( $FHEM::Automation::ShuttersControl::shutters->getVentilateOpen + eq 'on' + || $FHEM::Automation::ShuttersControl::ascDev + ->getAutoShuttersControlComfort eq 'on' ) + ) + { + FHEM::Automation::ShuttersControl::ASC_Debug( + 'EventProcessingWindowRec: ' + . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev + . ' Event Closed' ); + + if ( + $FHEM::Automation::ShuttersControl::shutters->getIsDay + && ( ( $homemode ne 'asleep' && $homemode ne 'gotosleep' ) + || $homemode eq 'none' ) + && $FHEM::Automation::ShuttersControl::shutters->getModeUp ne + 'absent' + && $FHEM::Automation::ShuttersControl::shutters->getModeUp ne + 'off' + ) + { + if ( + $FHEM::Automation::ShuttersControl::shutters->getIfInShading + && $FHEM::Automation::ShuttersControl::shutters + ->getShadingPos != + $FHEM::Automation::ShuttersControl::shutters->getStatus + && $FHEM::Automation::ShuttersControl::shutters + ->getShadingMode ne 'absent' ) + { + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'shading in'); + $FHEM::Automation::ShuttersControl::shutters->setNoDelay(1); + $FHEM::Automation::ShuttersControl::shutters->setDriveCmd( + $FHEM::Automation::ShuttersControl::shutters + ->getShadingPos ); + } + elsif ( + !$FHEM::Automation::ShuttersControl::shutters + ->getIfInShading + && ( $FHEM::Automation::ShuttersControl::shutters->getStatus + != $FHEM::Automation::ShuttersControl::shutters + ->getOpenPos + || $FHEM::Automation::ShuttersControl::shutters + ->getStatus != + $FHEM::Automation::ShuttersControl::shutters + ->getLastManPos ) + ) + { + if ( $FHEM::Automation::ShuttersControl::shutters + ->getPrivacyDownStatus == 2 ) + { + $FHEM::Automation::ShuttersControl::shutters + ->setLastDrive( + 'window closed at privacy night close'); + $FHEM::Automation::ShuttersControl::shutters + ->setNoDelay(1); + $FHEM::Automation::ShuttersControl::shutters + ->setDriveCmd( + $FHEM::Automation::ShuttersControl::shutters + ->getPrivacyDownPos ); + } + else { + $FHEM::Automation::ShuttersControl::shutters + ->setLastDrive('window closed at day'); + $FHEM::Automation::ShuttersControl::shutters + ->setNoDelay(1); + $FHEM::Automation::ShuttersControl::shutters + ->setDriveCmd( + ( + $FHEM::Automation::ShuttersControl::shutters + ->getVentilatePosAfterDayClosed eq 'open' + ? $FHEM::Automation::ShuttersControl::shutters + ->getOpenPos + : $FHEM::Automation::ShuttersControl::shutters + ->getLastManPos + ) + ); + } + } + } + elsif ( + $FHEM::Automation::ShuttersControl::shutters->getModeDown ne + 'absent' + && $FHEM::Automation::ShuttersControl::shutters->getModeDown ne + 'off' + && ( + ( + !$FHEM::Automation::ShuttersControl::shutters->getIsDay + && $FHEM::Automation::ShuttersControl::shutters + ->getModeDown ne 'roommate' + ) + || $homemode eq 'asleep' + || $homemode eq 'gotosleep' + ) + && $FHEM::Automation::ShuttersControl::ascDev + ->getAutoShuttersControlEvening eq 'on' + ) + { + if ( $FHEM::Automation::ShuttersControl::shutters + ->getPrivacyUpStatus == 2 ) + { + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'window closed at privacy day open'); + $FHEM::Automation::ShuttersControl::shutters->setNoDelay(1); + $FHEM::Automation::ShuttersControl::shutters->setDriveCmd( + $FHEM::Automation::ShuttersControl::shutters + ->getPrivacyDownPos ); + } + else { + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'window closed at night'); + $FHEM::Automation::ShuttersControl::shutters->setNoDelay(1); + $FHEM::Automation::ShuttersControl::shutters->setDriveCmd( + ( + $FHEM::Automation::ShuttersControl::shutters + ->getSleepPos > 0 + ? $FHEM::Automation::ShuttersControl::shutters + ->getSleepPos + : $FHEM::Automation::ShuttersControl::shutters + ->getClosedPos + ) + ); + } + } + } + elsif ( + ( + $match =~ m{tilt}xms || ( $match =~ m{[Oo]pen|false}xms + && $FHEM::Automation::ShuttersControl::shutters->getSubTyp + eq 'twostate' ) + ) + && $FHEM::Automation::ShuttersControl::shutters->getVentilateOpen + eq 'on' + && $FHEM::Automation::ShuttersControl::shutters + ->getQueryShuttersPos( + $FHEM::Automation::ShuttersControl::shutters->getVentilatePos + ) + ) + { + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'ventilate - window open'); + $FHEM::Automation::ShuttersControl::shutters->setNoDelay(1); + $FHEM::Automation::ShuttersControl::shutters->setDriveCmd( + ( + ( + $FHEM::Automation::ShuttersControl::shutters + ->getShuttersPlace eq 'terrace' + && $FHEM::Automation::ShuttersControl::shutters + ->getSubTyp eq 'twostate' + ) + ? $FHEM::Automation::ShuttersControl::shutters->getOpenPos + : $FHEM::Automation::ShuttersControl::shutters + ->getVentilatePos + ) + ); + } + elsif ($match =~ m{[Oo]pen|false}xms + && $FHEM::Automation::ShuttersControl::shutters->getSubTyp eq + 'threestate' ) + { + my $posValue = + $FHEM::Automation::ShuttersControl::shutters->getStatus; + my $setLastDrive; + if ( + $FHEM::Automation::ShuttersControl::ascDev + ->getAutoShuttersControlComfort eq 'on' + and $FHEM::Automation::ShuttersControl::shutters + ->getQueryShuttersPos( + $FHEM::Automation::ShuttersControl::shutters + ->getComfortOpenPos + ) + ) + { + $posValue = $FHEM::Automation::ShuttersControl::shutters + ->getComfortOpenPos; + $setLastDrive = 'comfort - window open'; + } + elsif ( + $FHEM::Automation::ShuttersControl::shutters + ->getQueryShuttersPos( + $FHEM::Automation::ShuttersControl::shutters + ->getVentilatePos + ) + && $FHEM::Automation::ShuttersControl::shutters + ->getVentilateOpen eq 'on' + ) + { + $posValue = + $FHEM::Automation::ShuttersControl::shutters->getVentilatePos; + $setLastDrive = 'ventilate - window open'; + } + + if ( defined($posValue) && $posValue ) { + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + $setLastDrive); + $FHEM::Automation::ShuttersControl::shutters->setNoDelay(1); + $FHEM::Automation::ShuttersControl::shutters->setDriveCmd( + $posValue); + } + } + } + + return; +} + +## Sub zum steuern der Rolladen bei einem Bewohner/Roommate Event +sub EventProcessingRoommate { + my $hash = shift; + my $shuttersDev = shift; + my $events = shift; + + my $name = $hash->{NAME}; + + $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev); + my $reading = + $FHEM::Automation::ShuttersControl::shutters->getRoommatesReading; + + if ( $events =~ m{$reading:\s(absent|gotosleep|asleep|awoken|home)}xms ) { + Log3( $name, 4, + "AutoShuttersControl ($name) - EventProcessingRoommate: " + . $FHEM::Automation::ShuttersControl::shutters + ->getRoommatesReading ); + Log3( $name, 4, +"AutoShuttersControl ($name) - EventProcessingRoommate: $shuttersDev und Events $events" + ); + + my $getModeUp = $FHEM::Automation::ShuttersControl::shutters->getModeUp; + my $getModeDown = + $FHEM::Automation::ShuttersControl::shutters->getModeDown; + my $getRoommatesStatus = + $FHEM::Automation::ShuttersControl::shutters->getRoommatesStatus; + my $getRoommatesLastStatus = + $FHEM::Automation::ShuttersControl::shutters->getRoommatesLastStatus; + my $event = $1; + my $posValue = $FHEM::Automation::ShuttersControl::shutters->getStatus; + + if ( + ( $event eq 'home' || $event eq 'awoken' ) + && ( $getRoommatesStatus eq 'home' + || $getRoommatesStatus eq 'awoken' ) + && ( $FHEM::Automation::ShuttersControl::ascDev + ->getAutoShuttersControlMorning eq 'on' + || $FHEM::Automation::ShuttersControl::shutters->getUp eq + 'roommate' ) + && IsAfterShuttersManualBlocking($shuttersDev) + ) + { + Log3( $name, 4, +"AutoShuttersControl ($name) - EventProcessingRoommate_1: $shuttersDev und Events $events" + ); + if ( + ( + ( + $getRoommatesLastStatus eq 'asleep' + && ( $FHEM::Automation::ShuttersControl::shutters + ->getModeUp eq 'always' + or $FHEM::Automation::ShuttersControl::shutters + ->getModeUp eq $event ) + ) + || ( + $getRoommatesLastStatus eq 'awoken' + && ( $FHEM::Automation::ShuttersControl::shutters + ->getModeUp eq 'always' + or $FHEM::Automation::ShuttersControl::shutters + ->getModeUp eq $event ) + ) + ) + && ( $FHEM::Automation::ShuttersControl::shutters->getIsDay + || $FHEM::Automation::ShuttersControl::shutters->getUp eq + 'roommate' ) + && ( IsAfterShuttersTimeBlocking($shuttersDev) + || $FHEM::Automation::ShuttersControl::shutters->getUp eq + 'roommate' ) + ) + { + Log3( $name, 4, +"AutoShuttersControl ($name) - EventProcessingRoommate_2: $shuttersDev und Events $events" + ); + + if ( + $FHEM::Automation::ShuttersControl::shutters->getIfInShading + && !$FHEM::Automation::ShuttersControl::shutters + ->getShadingManualDriveStatus + && $FHEM::Automation::ShuttersControl::shutters->getStatus + != $FHEM::Automation::ShuttersControl::shutters + ->getShadingPos ) + { + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'shading in'); + $posValue = $FHEM::Automation::ShuttersControl::shutters + ->getShadingPos; + } + elsif ( !$FHEM::Automation::ShuttersControl::shutters + ->getIfInShading ) + { + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'roommate awoken'); + $posValue = + $FHEM::Automation::ShuttersControl::shutters->getOpenPos; + } + + FHEM::Automation::ShuttersControl::ShuttersCommandSet( $hash, + $shuttersDev, $posValue ); + } + elsif ( + ( + $getRoommatesLastStatus eq 'absent' + || $getRoommatesLastStatus eq 'gone' + ) + && $getRoommatesStatus eq 'home' + ) + { + if ( + $FHEM::Automation::ShuttersControl::shutters->getIsDay + && $FHEM::Automation::ShuttersControl::shutters + ->getIfInShading + && $FHEM::Automation::ShuttersControl::shutters->getStatus + != $FHEM::Automation::ShuttersControl::shutters + ->getShadingPos + && !$FHEM::Automation::ShuttersControl::shutters + ->getShadingManualDriveStatus + && !( + CheckIfShuttersWindowRecOpen($shuttersDev) == 2 + && $FHEM::Automation::ShuttersControl::shutters + ->getShuttersPlace eq 'terrace' + ) + && !$FHEM::Automation::ShuttersControl::shutters + ->getSelfDefenseState + ) + { + ShadingProcessingDriveCommand( $hash, $shuttersDev ); + } + elsif ( + !$FHEM::Automation::ShuttersControl::shutters->getIsDay + && IsAfterShuttersTimeBlocking($shuttersDev) + && ( $getModeDown eq 'home' + || $getModeDown eq 'always' ) + && $FHEM::Automation::ShuttersControl::shutters->getDown ne + 'roommate' + ) + { + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'roommate come home'); + + if ( CheckIfShuttersWindowRecOpen($shuttersDev) == 0 + || $FHEM::Automation::ShuttersControl::shutters + ->getVentilateOpen eq 'off' ) + { + $posValue = ( + $FHEM::Automation::ShuttersControl::shutters + ->getSleepPos > 0 + ? $FHEM::Automation::ShuttersControl::shutters + ->getSleepPos + : ( + $FHEM::Automation::ShuttersControl::shutters + ->getSleepPos > 0 + ? $FHEM::Automation::ShuttersControl::shutters + ->getSleepPos + : $FHEM::Automation::ShuttersControl::shutters + ->getClosedPos + ) + ); + } + else { + $posValue = $FHEM::Automation::ShuttersControl::shutters + ->getVentilatePos; + $FHEM::Automation::ShuttersControl::shutters + ->setLastDrive( + $FHEM::Automation::ShuttersControl::shutters + ->getLastDrive . ' - ventilate mode' ); + } + + FHEM::Automation::ShuttersControl::ShuttersCommandSet( + $hash, $shuttersDev, $posValue ); + } + elsif ( + ( + $FHEM::Automation::ShuttersControl::shutters->getIsDay + || $FHEM::Automation::ShuttersControl::shutters->getUp + eq 'roommate' + ) + && IsAfterShuttersTimeBlocking($shuttersDev) + && ( $getModeUp eq 'home' + || $getModeUp eq 'always' ) + && !$FHEM::Automation::ShuttersControl::shutters + ->getIfInShading + ) + { + if ( $FHEM::Automation::ShuttersControl::shutters + ->getIfInShading + && !$FHEM::Automation::ShuttersControl::shutters + ->getShadingManualDriveStatus + && $FHEM::Automation::ShuttersControl::shutters + ->getStatus == + $FHEM::Automation::ShuttersControl::shutters->getOpenPos + && $FHEM::Automation::ShuttersControl::shutters + ->getShadingMode eq 'home' ) + { + $FHEM::Automation::ShuttersControl::shutters + ->setLastDrive('shading in'); + FHEM::Automation::ShuttersControl::ShuttersCommandSet( + $hash, + $shuttersDev, + $FHEM::Automation::ShuttersControl::shutters + ->getShadingPos + ); + } + elsif ( + ( + !$FHEM::Automation::ShuttersControl::shutters + ->getIfInShading + || $FHEM::Automation::ShuttersControl::shutters + ->getShadingMode eq 'absent' + ) + && ( $FHEM::Automation::ShuttersControl::shutters + ->getStatus == + $FHEM::Automation::ShuttersControl::shutters + ->getClosedPos + || $FHEM::Automation::ShuttersControl::shutters + ->getStatus == + $FHEM::Automation::ShuttersControl::shutters + ->getSleepPos + || $FHEM::Automation::ShuttersControl::shutters + ->getStatus == + $FHEM::Automation::ShuttersControl::shutters + ->getShadingPos ) + ) + { + $FHEM::Automation::ShuttersControl::shutters + ->setLastDrive( + ( + ( + $FHEM::Automation::ShuttersControl::shutters + ->getStatus == + $FHEM::Automation::ShuttersControl::shutters + ->getClosedPos + || $FHEM::Automation::ShuttersControl::shutters + ->getStatus == + $FHEM::Automation::ShuttersControl::shutters + ->getSleepPos + ) + ? 'roommate come home' + : 'shading out' + ) + ); + + FHEM::Automation::ShuttersControl::ShuttersCommandSet( + $hash, + $shuttersDev, + $FHEM::Automation::ShuttersControl::shutters + ->getOpenPos + ); + } + } + } + } + elsif ( + ( $event eq 'gotosleep' || $event eq 'asleep' ) + && ( $FHEM::Automation::ShuttersControl::ascDev + ->getAutoShuttersControlEvening eq 'on' + || $FHEM::Automation::ShuttersControl::shutters->getDown eq + 'roommate' ) + && ( IsAfterShuttersManualBlocking($shuttersDev) + || $FHEM::Automation::ShuttersControl::shutters->getDown eq + 'roommate' ) + ) + { + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'roommate asleep'); + + if ( CheckIfShuttersWindowRecOpen($shuttersDev) == 0 + || $FHEM::Automation::ShuttersControl::shutters + ->getVentilateOpen eq 'off' ) + { + $posValue = ( + $FHEM::Automation::ShuttersControl::shutters->getSleepPos > + 0 + ? $FHEM::Automation::ShuttersControl::shutters->getSleepPos + : $FHEM::Automation::ShuttersControl::shutters->getClosedPos + ); + } + else { + $posValue = + $FHEM::Automation::ShuttersControl::shutters->getVentilatePos; + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + $FHEM::Automation::ShuttersControl::shutters->getLastDrive + . ' - ventilate mode' ); + } + + FHEM::Automation::ShuttersControl::ShuttersCommandSet( $hash, + $shuttersDev, $posValue ); + } + elsif ( + $event eq 'absent' + && ( !$FHEM::Automation::ShuttersControl::shutters->getIsDay + || $FHEM::Automation::ShuttersControl::shutters->getDown eq + 'roommate' + || $FHEM::Automation::ShuttersControl::shutters->getShadingMode + eq 'absent' + || $FHEM::Automation::ShuttersControl::shutters->getModeUp eq + 'absent' + || $FHEM::Automation::ShuttersControl::shutters->getModeDown eq + 'absent' ) + ) + { + Log3( $name, 4, +"AutoShuttersControl ($name) - EventProcessingRoommate absent: $shuttersDev" + ); + + if ( + ( + $FHEM::Automation::ShuttersControl::shutters->getIsDay + || $FHEM::Automation::ShuttersControl::shutters->getUp eq + 'roommate' + ) + && $FHEM::Automation::ShuttersControl::shutters->getIfInShading + && !$FHEM::Automation::ShuttersControl::shutters + ->getQueryShuttersPos( + $FHEM::Automation::ShuttersControl::shutters->getShadingPos + ) + && $FHEM::Automation::ShuttersControl::shutters->getShadingMode + eq 'absent' + ) + { + Log3( $name, 4, +"AutoShuttersControl ($name) - EventProcessingRoommate Shading: $shuttersDev" + ); + + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'shading in'); + FHEM::Automation::ShuttersControl::ShuttersCommandSet( + $hash, + $shuttersDev, + $FHEM::Automation::ShuttersControl::shutters->getShadingPos + ); + } + elsif ( + ( + !$FHEM::Automation::ShuttersControl::shutters->getIsDay + || $FHEM::Automation::ShuttersControl::shutters->getDown eq + 'roommate' + ) + && $getModeDown eq 'absent' + && $getRoommatesStatus eq 'absent' + ) + { + Log3( $name, 4, +"AutoShuttersControl ($name) - EventProcessingRoommate Down: $shuttersDev" + ); + + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'roommate absent'); + FHEM::Automation::ShuttersControl::ShuttersCommandSet( + $hash, + $shuttersDev, + $FHEM::Automation::ShuttersControl::shutters->getClosedPos + ); + } + elsif ($FHEM::Automation::ShuttersControl::shutters->getIsDay + && $FHEM::Automation::ShuttersControl::shutters->getModeUp eq + 'absent' + && $getRoommatesStatus eq 'absent' ) + { + Log3( $name, 4, +"AutoShuttersControl ($name) - EventProcessingRoommate Up: $shuttersDev" + ); + + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'roommate absent'); + FHEM::Automation::ShuttersControl::ShuttersCommandSet( $hash, + $shuttersDev, + $FHEM::Automation::ShuttersControl::shutters->getOpenPos ); + } + + Log3( $name, 4, +"AutoShuttersControl ($name) - EventProcessingRoommate NICHTS: $shuttersDev" + ); + } + } + + return; +} + +sub EventProcessingResidents { + my $hash = shift; + my $device = shift; + my $events = shift; + + my $name = $device; + my $reading = + $FHEM::Automation::ShuttersControl::ascDev->getResidentsReading; + my $getResidentsLastStatus = + $FHEM::Automation::ShuttersControl::ascDev->getResidentsLastStatus; + + if ( $events =~ m{$reading:\s((?:pet_[a-z]+)|(?:absent))}xms ) { + for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { + $FHEM::Automation::ShuttersControl::shutters->setShuttersDev( + $shuttersDev); + my $getModeUp = + $FHEM::Automation::ShuttersControl::shutters->getModeUp; + my $getModeDown = + $FHEM::Automation::ShuttersControl::shutters->getModeDown; + $FHEM::Automation::ShuttersControl::shutters->setHardLockOut('off'); + if ( + $FHEM::Automation::ShuttersControl::ascDev->getSelfDefense eq + 'on' + && $FHEM::Automation::ShuttersControl::shutters + ->getSelfDefenseMode ne 'off' + || ( $getModeDown eq 'absent' + || $getModeDown eq 'always' ) + || ( $FHEM::Automation::ShuttersControl::shutters + ->getShadingMode eq 'absent' + && $FHEM::Automation::ShuttersControl::shutters + ->getRoommatesStatus eq 'none' ) + || ( $FHEM::Automation::ShuttersControl::shutters + ->getShadingMode eq 'home' + && $FHEM::Automation::ShuttersControl::shutters + ->getRoommatesStatus eq 'none' ) + ) + { + if ( + $FHEM::Automation::ShuttersControl::ascDev->getSelfDefense + eq 'on' + && ( + $FHEM::Automation::ShuttersControl::shutters + ->getSelfDefenseMode eq 'absent' + || ( CheckIfShuttersWindowRecOpen($shuttersDev) == 2 + && $FHEM::Automation::ShuttersControl::shutters + ->getSelfDefenseMode eq 'gone' + && $FHEM::Automation::ShuttersControl::shutters + ->getShuttersPlace eq 'terrace' + && $FHEM::Automation::ShuttersControl::shutters + ->getSelfDefenseMode ne 'off' ) + ) + ) + { + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'selfDefense absent active'); + $FHEM::Automation::ShuttersControl::shutters + ->setSelfDefenseAbsent( 0, 1 ) + ; # der erste Wert ist ob der timer schon läuft, der zweite ist ob self defense aktiv ist durch die Bedingungen + $FHEM::Automation::ShuttersControl::shutters + ->setSelfDefenseState(1); + $FHEM::Automation::ShuttersControl::shutters->setDriveCmd( + $FHEM::Automation::ShuttersControl::shutters + ->getClosedPos ); + } + elsif ($FHEM::Automation::ShuttersControl::shutters->getIsDay + && $FHEM::Automation::ShuttersControl::shutters + ->getIfInShading + && $FHEM::Automation::ShuttersControl::shutters + ->getShadingMode eq 'absent' + && $FHEM::Automation::ShuttersControl::shutters + ->getRoommatesStatus eq 'none' ) + { + ShadingProcessingDriveCommand( $hash, $shuttersDev ); + } + elsif ( + $FHEM::Automation::ShuttersControl::shutters + ->getShadingMode eq 'home' + && $FHEM::Automation::ShuttersControl::shutters->getIsDay + && $FHEM::Automation::ShuttersControl::shutters + ->getIfInShading + && $FHEM::Automation::ShuttersControl::shutters->getStatus + == $FHEM::Automation::ShuttersControl::shutters + ->getShadingPos + && $FHEM::Automation::ShuttersControl::shutters + ->getRoommatesStatus eq 'none' + && !( + CheckIfShuttersWindowRecOpen($shuttersDev) == 2 + && $FHEM::Automation::ShuttersControl::shutters + ->getShuttersPlace eq 'terrace' + ) + && !$FHEM::Automation::ShuttersControl::shutters + ->getSelfDefenseState + ) + { + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'shading out'); + $FHEM::Automation::ShuttersControl::shutters->setDriveCmd( + $FHEM::Automation::ShuttersControl::shutters + ->getLastPos ); + } + elsif (( $getModeDown eq 'absent' || $getModeDown eq 'always' ) + && !$FHEM::Automation::ShuttersControl::shutters->getIsDay + && IsAfterShuttersTimeBlocking($shuttersDev) + && $FHEM::Automation::ShuttersControl::shutters + ->getRoommatesStatus eq 'none' ) + { + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'residents absent'); + $FHEM::Automation::ShuttersControl::shutters->setDriveCmd( + $FHEM::Automation::ShuttersControl::shutters + ->getClosedPos ); + } + } + } + } + elsif ($events =~ m{$reading:\s(gone)}xms + && $FHEM::Automation::ShuttersControl::ascDev->getSelfDefense eq 'on' ) + { + for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { + $FHEM::Automation::ShuttersControl::shutters->setShuttersDev( + $shuttersDev); + $FHEM::Automation::ShuttersControl::shutters->setHardLockOut('off'); + if ( $FHEM::Automation::ShuttersControl::shutters + ->getSelfDefenseMode ne 'off' ) + { + + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'selfDefense gone active'); + $FHEM::Automation::ShuttersControl::shutters + ->setSelfDefenseState(1); + $FHEM::Automation::ShuttersControl::shutters->setDriveCmd( + $FHEM::Automation::ShuttersControl::shutters->getClosedPos + ); + } + } + } + elsif ( + $events =~ m{$reading:\s((?:[a-z]+_)?home)}xms + && ( $getResidentsLastStatus eq 'absent' + || $getResidentsLastStatus eq 'gone' + || $getResidentsLastStatus eq 'asleep' + || $getResidentsLastStatus eq 'awoken' ) + ) + { + for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { + $FHEM::Automation::ShuttersControl::shutters->setShuttersDev( + $shuttersDev); + my $getModeUp = + $FHEM::Automation::ShuttersControl::shutters->getModeUp; + my $getModeDown = + $FHEM::Automation::ShuttersControl::shutters->getModeDown; + + if ( + ( + $FHEM::Automation::ShuttersControl::shutters->getStatus != + $FHEM::Automation::ShuttersControl::shutters->getClosedPos + || $FHEM::Automation::ShuttersControl::shutters->getStatus + != $FHEM::Automation::ShuttersControl::shutters->getSleepPos + ) + && !$FHEM::Automation::ShuttersControl::shutters->getIsDay + && $FHEM::Automation::ShuttersControl::shutters + ->getRoommatesStatus eq 'none' + && ( $getModeDown eq 'home' + || $getModeDown eq 'always' ) + && $getResidentsLastStatus ne 'asleep' + && $getResidentsLastStatus ne 'awoken' + && IsAfterShuttersTimeBlocking($shuttersDev) + && !$FHEM::Automation::ShuttersControl::shutters + ->getSelfDefenseState + ) + { + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'residents come home'); + $FHEM::Automation::ShuttersControl::shutters->setDriveCmd( + ( + $FHEM::Automation::ShuttersControl::shutters + ->getSleepPos > 0 + ? $FHEM::Automation::ShuttersControl::shutters + ->getSleepPos + : $FHEM::Automation::ShuttersControl::shutters + ->getClosedPos + ) + ); + } + elsif ( + ( + $FHEM::Automation::ShuttersControl::shutters + ->getShadingMode eq 'home' + || $FHEM::Automation::ShuttersControl::shutters + ->getShadingMode eq 'always' + ) + && $FHEM::Automation::ShuttersControl::shutters->getIsDay + && $FHEM::Automation::ShuttersControl::shutters->getIfInShading + && $FHEM::Automation::ShuttersControl::shutters + ->getRoommatesStatus eq 'none' + && $FHEM::Automation::ShuttersControl::shutters->getStatus != + $FHEM::Automation::ShuttersControl::shutters->getShadingPos + && !$FHEM::Automation::ShuttersControl::shutters + ->getShadingManualDriveStatus + && !( + CheckIfShuttersWindowRecOpen($shuttersDev) == 2 + && $FHEM::Automation::ShuttersControl::shutters + ->getShuttersPlace eq 'terrace' + ) + && !$FHEM::Automation::ShuttersControl::shutters + ->getSelfDefenseState + ) + { + ShadingProcessingDriveCommand( $hash, $shuttersDev ); + } + elsif ( + $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq + 'absent' + && $FHEM::Automation::ShuttersControl::shutters->getIsDay + && $FHEM::Automation::ShuttersControl::shutters->getIfInShading + && $FHEM::Automation::ShuttersControl::shutters->getStatus == + $FHEM::Automation::ShuttersControl::shutters->getShadingPos + && $FHEM::Automation::ShuttersControl::shutters + ->getRoommatesStatus eq 'none' + && !$FHEM::Automation::ShuttersControl::shutters + ->getShadingManualDriveStatus + && !( + CheckIfShuttersWindowRecOpen($shuttersDev) == 2 + && $FHEM::Automation::ShuttersControl::shutters + ->getShuttersPlace eq 'terrace' + ) + && !$FHEM::Automation::ShuttersControl::shutters + ->getSelfDefenseState + ) + { + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'shading out'); + $FHEM::Automation::ShuttersControl::shutters->setDriveCmd( + $FHEM::Automation::ShuttersControl::shutters->getLastPos ); + } + elsif ( + $FHEM::Automation::ShuttersControl::ascDev->getSelfDefense eq + 'on' + && $FHEM::Automation::ShuttersControl::shutters + ->getSelfDefenseMode ne 'off' + && !$FHEM::Automation::ShuttersControl::shutters->getIfInShading + && ( $getResidentsLastStatus eq 'gone' + || $getResidentsLastStatus eq 'absent' ) + && $FHEM::Automation::ShuttersControl::shutters + ->getSelfDefenseState + ) + { + RemoveInternalTimer( + $FHEM::Automation::ShuttersControl::shutters + ->getSelfDefenseAbsentTimerhash ) + if ( $getResidentsLastStatus eq 'absent' + && $FHEM::Automation::ShuttersControl::ascDev + ->getSelfDefense eq 'on' + && $FHEM::Automation::ShuttersControl::shutters + ->getSelfDefenseMode ne 'off' + && !$FHEM::Automation::ShuttersControl::shutters + ->getSelfDefenseAbsent + && $FHEM::Automation::ShuttersControl::shutters + ->getSelfDefenseAbsentTimerrun ); + + if ( + ( + $FHEM::Automation::ShuttersControl::shutters->getStatus + == $FHEM::Automation::ShuttersControl::shutters + ->getClosedPos + || $FHEM::Automation::ShuttersControl::shutters + ->getStatus == + $FHEM::Automation::ShuttersControl::shutters + ->getSleepPos + ) + && $FHEM::Automation::ShuttersControl::shutters->getIsDay + ) + { + $FHEM::Automation::ShuttersControl::shutters + ->setHardLockOut('on') + if ( + CheckIfShuttersWindowRecOpen($shuttersDev) == 2 + && $FHEM::Automation::ShuttersControl::shutters + ->getShuttersPlace eq 'terrace' + && ( $getModeUp eq 'absent' + || $getModeUp eq 'off' ) + ); + + $FHEM::Automation::ShuttersControl::shutters + ->setSelfDefenseState(0); + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'selfDefense inactive'); + $FHEM::Automation::ShuttersControl::shutters->setDriveCmd( + ( + $FHEM::Automation::ShuttersControl::shutters + ->getPrivacyDownStatus == 2 + ? $FHEM::Automation::ShuttersControl::shutters + ->getPrivacyDownPos + : $FHEM::Automation::ShuttersControl::shutters + ->getOpenPos + ) + ); + } + } + elsif ( + ( + $FHEM::Automation::ShuttersControl::shutters->getStatus == + $FHEM::Automation::ShuttersControl::shutters->getClosedPos + || $FHEM::Automation::ShuttersControl::shutters->getStatus + == $FHEM::Automation::ShuttersControl::shutters->getSleepPos + ) + && $FHEM::Automation::ShuttersControl::shutters->getIsDay + && $FHEM::Automation::ShuttersControl::shutters + ->getRoommatesStatus eq 'none' + && ( $getModeUp eq 'home' + || $getModeUp eq 'always' ) + && IsAfterShuttersTimeBlocking($shuttersDev) + && !$FHEM::Automation::ShuttersControl::shutters->getIfInShading + && !$FHEM::Automation::ShuttersControl::shutters + ->getSelfDefenseState + ) + { + if ( $getResidentsLastStatus eq 'asleep' + || $getResidentsLastStatus eq 'awoken' ) + { + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'residents awoken'); + } + else { + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'residents home'); + } + $FHEM::Automation::ShuttersControl::shutters->setDriveCmd( + $FHEM::Automation::ShuttersControl::shutters->getOpenPos ); + } + } + } + + return; +} + +sub EventProcessingRain { + + #### Ist noch nicht fertig, es fehlt noch das verzögerte Prüfen auf erhalten bleiben des getriggerten Wertes. + + my $hash = shift; + my $device = shift; + my $events = shift; + + my $name = $device; + my $reading = + $FHEM::Automation::ShuttersControl::ascDev->getRainSensorReading + // 'none'; + + if ( $events =~ m{$reading:\s(\d+(\.\d+)?|rain|dry)}xms ) { + my $val; + my $triggerMax = + $FHEM::Automation::ShuttersControl::ascDev->getRainTriggerMax; + my $triggerMin = + $FHEM::Automation::ShuttersControl::ascDev->getRainTriggerMin; + my $closedPos = $FHEM::Automation::ShuttersControl::ascDev + ->getRainSensorShuttersClosedPos; + + if ( $1 eq 'rain' ) { $val = $triggerMax + 1 } + elsif ( $1 eq 'dry' ) { $val = $triggerMin } + else { $val = $1 } + + RainProtection( $hash, $val, $triggerMax, $triggerMin, $closedPos ); + } + + return; +} + +sub RainProtection { + my ( $hash, $val, $triggerMax, $triggerMin, $closedPos ) = @_; + + for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { + $FHEM::Automation::ShuttersControl::shutters->setShuttersDev( + $shuttersDev); + + next + if ( + $FHEM::Automation::ShuttersControl::shutters->getRainProtection eq + 'off' ); + + if ( $val > $triggerMax + && $FHEM::Automation::ShuttersControl::shutters->getStatus != + $closedPos + && $FHEM::Automation::ShuttersControl::shutters + ->getRainProtectionStatus eq 'unprotected' ) + { + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'rain protected'); + $FHEM::Automation::ShuttersControl::shutters->setDriveCmd( + $closedPos); + $FHEM::Automation::ShuttersControl::shutters + ->setRainProtectionStatus('protected'); + } + elsif ( ( $val == 0 || $val < $triggerMin ) + && $FHEM::Automation::ShuttersControl::shutters->getStatus == + $closedPos + && IsAfterShuttersManualBlocking($shuttersDev) + && $FHEM::Automation::ShuttersControl::shutters + ->getRainProtectionStatus eq 'protected' ) + { + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'rain un-protected'); + $FHEM::Automation::ShuttersControl::shutters->setDriveCmd( + ( + $FHEM::Automation::ShuttersControl::shutters->getIsDay + ? $FHEM::Automation::ShuttersControl::shutters->getLastPos + : ( + $FHEM::Automation::ShuttersControl::shutters + ->getPrivacyDownStatus == 2 + ? $FHEM::Automation::ShuttersControl::shutters + ->getPrivacyDownPos + : $FHEM::Automation::ShuttersControl::shutters + ->getClosedPos + ) + ) + ); + $FHEM::Automation::ShuttersControl::shutters + ->setRainProtectionStatus('unprotected'); + } + } + + return; +} + +sub EventProcessingWind { + my $hash = shift; + my $shuttersDev = shift; + my $events = shift; + + my $name = $hash->{NAME}; + $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev); + + my $reading = + $FHEM::Automation::ShuttersControl::ascDev->getWindSensorReading + // 'none'; + if ( $events =~ m{$reading:\s(\d+(\.\d+)?)}xms ) { + for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { + $FHEM::Automation::ShuttersControl::shutters->setShuttersDev( + $shuttersDev); + + FHEM::Automation::ShuttersControl::ASC_Debug( + 'EventProcessingWind: ' + . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev + . ' - WindProtection1: ' + . $FHEM::Automation::ShuttersControl::shutters + ->getWindProtectionStatus + . ' WindMax1: ' + . $FHEM::Automation::ShuttersControl::shutters->getWindMax + . ' WindMin1: ' + . $FHEM::Automation::ShuttersControl::shutters->getWindMin + . ' Bekommender Wert1: ' + . $1 ); + + next + if ( + ( + CheckIfShuttersWindowRecOpen($shuttersDev) != 0 + && $FHEM::Automation::ShuttersControl::shutters + ->getShuttersPlace eq 'terrace' + ) + || $FHEM::Automation::ShuttersControl::shutters + ->getWindProtection eq 'off' + ); + + if ( $1 > $FHEM::Automation::ShuttersControl::shutters->getWindMax + && $FHEM::Automation::ShuttersControl::shutters + ->getWindProtectionStatus eq 'unprotected' ) + { + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'wind protected'); + $FHEM::Automation::ShuttersControl::shutters->setDriveCmd( + $FHEM::Automation::ShuttersControl::shutters->getWindPos ); + $FHEM::Automation::ShuttersControl::shutters + ->setWindProtectionStatus('protected'); + } + elsif ( + $1 < $FHEM::Automation::ShuttersControl::shutters->getWindMin + && $FHEM::Automation::ShuttersControl::shutters + ->getWindProtectionStatus eq 'protected' ) + { + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'wind un-protected'); + $FHEM::Automation::ShuttersControl::shutters->setDriveCmd( + ( + $FHEM::Automation::ShuttersControl::shutters->getIsDay + ? $FHEM::Automation::ShuttersControl::shutters + ->getLastPos + : ( + $FHEM::Automation::ShuttersControl::shutters + ->getPrivacyDownStatus == 2 + ? $FHEM::Automation::ShuttersControl::shutters + ->getPrivacyDownPos + : ( + $FHEM::Automation::ShuttersControl::shutters + ->getSleepPos > 0 + ? $FHEM::Automation::ShuttersControl::shutters + ->getSleepPos + : $FHEM::Automation::ShuttersControl::shutters + ->getClosedPos + ) + ) + ) + ); + $FHEM::Automation::ShuttersControl::shutters + ->setWindProtectionStatus('unprotected'); + } + + FHEM::Automation::ShuttersControl::ASC_Debug( + 'EventProcessingWind: ' + . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev + . ' - WindProtection2: ' + . $FHEM::Automation::ShuttersControl::shutters + ->getWindProtectionStatus + . ' WindMax2: ' + . $FHEM::Automation::ShuttersControl::shutters->getWindMax + . ' WindMin2: ' + . $FHEM::Automation::ShuttersControl::shutters->getWindMin + . ' Bekommender Wert2: ' + . $1 ); + } + } + + return; +} +########## + +sub EventProcessingBrightness { + my $hash = shift; + my $shuttersDev = shift; + my $events = shift; + + my $name = $hash->{NAME}; + $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev); + + FHEM::Automation::ShuttersControl::ASC_Debug( 'EventProcessingBrightness: ' + . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev + . ' - Event von einem Helligkeitssensor erkannt. Verarbeitung läuft. Sollten keine weitere Meldungen aus der Funktion kommen, so befindet sich die aktuelle Zeit nicht innerhalb der Verarbeitungszeit für Sunset oder Sunrise' + ); + + return EventProcessingShadingBrightness( $hash, $shuttersDev, $events ) + if ( + ( + $FHEM::Automation::ShuttersControl::shutters->getDown ne + 'brightness' + && $FHEM::Automation::ShuttersControl::shutters->getUp ne + 'brightness' + ) + || ( + ( + $FHEM::Automation::ShuttersControl::shutters->getDown eq + 'brightness' + || $FHEM::Automation::ShuttersControl::shutters->getUp eq + 'brightness' + ) + && ( + ( + ( + ( + int( gettimeofday() / 86400 ) == int( + computeAlignTime( + '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpEarly + ) / 86400 + ) + && ( + !IsWe() + || ( + IsWe() + && $FHEM::Automation::ShuttersControl::ascDev + ->getSunriseTimeWeHoliday eq 'off' + || ( + $FHEM::Automation::ShuttersControl::ascDev + ->getSunriseTimeWeHoliday eq 'on' + && $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday eq '01:25' ) + ) + ) + ) + || ( + int( gettimeofday() / 86400 ) == int( + computeAlignTime( + '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday + ) / 86400 + ) + && IsWe() + && $FHEM::Automation::ShuttersControl::ascDev + ->getSunriseTimeWeHoliday eq 'on' + && $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday ne '01:25' + ) + ) + && int( gettimeofday() / 86400 ) == int( + computeAlignTime( + '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpLate + ) / 86400 + ) + + || ( + ( + int( gettimeofday() / 86400 ) != int( + computeAlignTime( + '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpEarly + ) / 86400 + ) + && ( + !IsWe() + || ( + IsWe() + && $FHEM::Automation::ShuttersControl::ascDev + ->getSunriseTimeWeHoliday eq 'off' + || ( + $FHEM::Automation::ShuttersControl::ascDev + ->getSunriseTimeWeHoliday eq 'on' + && $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday eq '01:25' ) + ) + ) + ) + || ( + int( gettimeofday() / 86400 ) != int( + computeAlignTime( + '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday + ) / 86400 + ) + && IsWe() + && $FHEM::Automation::ShuttersControl::ascDev + ->getSunriseTimeWeHoliday eq 'on' + && $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday ne '01:25' + ) + ) + && int( gettimeofday() / 86400 ) != int( + computeAlignTime( + '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpLate + ) / 86400 + ) + ) + && ( + ( + int( gettimeofday() / 86400 ) == int( + computeAlignTime( + '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeDownEarly + ) / 86400 + ) + && int( gettimeofday() / 86400 ) == int( + computeAlignTime( + '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeDownLate + ) / 86400 + ) + ) + || ( + int( gettimeofday() / 86400 ) != int( + computeAlignTime( + '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeDownEarly + ) / 86400 + ) + && int( gettimeofday() / 86400 ) != int( + computeAlignTime( + '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeDownLate + ) / 86400 + ) + ) + ) + ) + ) + ); + + FHEM::Automation::ShuttersControl::ASC_Debug( 'EventProcessingBrightness: ' + . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev + . ' - Die aktuelle Zeit befindet sich innerhalb der Sunset/Sunrise Brightness Verarbeitungszeit. Also zwischen Time Early und Time Late' + ); + + my $reading = + $FHEM::Automation::ShuttersControl::shutters->getBrightnessReading; + if ( $events =~ m{$reading:\s(\d+(\.\d+)?)}xms ) { + my $brightnessMinVal; + if ( $FHEM::Automation::ShuttersControl::shutters->getBrightnessMinVal > + -1 ) + { + $brightnessMinVal = + $FHEM::Automation::ShuttersControl::shutters->getBrightnessMinVal; + } + else { + $brightnessMinVal = + $FHEM::Automation::ShuttersControl::ascDev->getBrightnessMinVal; + } + + my $brightnessMaxVal; + if ( $FHEM::Automation::ShuttersControl::shutters->getBrightnessMaxVal > + -1 ) + { + $brightnessMaxVal = + $FHEM::Automation::ShuttersControl::shutters->getBrightnessMaxVal; + } + else { + $brightnessMaxVal = + $FHEM::Automation::ShuttersControl::ascDev->getBrightnessMaxVal; + } + + my $brightnessPrivacyUpVal = + $FHEM::Automation::ShuttersControl::shutters + ->getPrivacyUpBrightnessVal; + my $brightnessPrivacyDownVal = + $FHEM::Automation::ShuttersControl::shutters + ->getPrivacyDownBrightnessVal; + + FHEM::Automation::ShuttersControl::ASC_Debug( + 'EventProcessingBrightness: ' + . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev + . ' - Es wird geprüft ob Sunset oder Sunrise gefahren werden soll und der aktuelle übergebene Brightness-Wert: ' + . $1 + . ' Größer dem eingestellten Sunrise-Wert: ' + . $brightnessMaxVal + . ' oder kleiner dem eingestellten Sunset-Wert: ' + . $brightnessMinVal + . ' ist. Werte für weitere Parameter - getUp ist: ' + . $FHEM::Automation::ShuttersControl::shutters->getUp + . ' getDown ist: ' + . $FHEM::Automation::ShuttersControl::shutters->getDown + . ' getSunrise ist: ' + . $FHEM::Automation::ShuttersControl::shutters->getSunrise + . ' getSunset ist: ' + . $FHEM::Automation::ShuttersControl::shutters->getSunset ); + + if ( + ( + ( + ( + int( gettimeofday() / 86400 ) != int( + computeAlignTime( + '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpEarly + ) / 86400 + ) + && ( + !IsWe() + || ( + IsWe() + && $FHEM::Automation::ShuttersControl::ascDev + ->getSunriseTimeWeHoliday eq 'off' + || ( $FHEM::Automation::ShuttersControl::ascDev + ->getSunriseTimeWeHoliday eq 'on' + && $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday eq '01:25' ) + ) + ) + ) + || ( + int( gettimeofday() / 86400 ) != int( + computeAlignTime( + '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday + ) / 86400 + ) + && IsWe() + && $FHEM::Automation::ShuttersControl::ascDev + ->getSunriseTimeWeHoliday eq 'on' + && $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday ne '01:25' + ) + ) + && int( gettimeofday() / 86400 ) == int( + computeAlignTime( + '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpLate + ) / 86400 + ) + ) + && ( + $1 > $brightnessMaxVal + || ( $1 > $brightnessPrivacyUpVal + && $FHEM::Automation::ShuttersControl::shutters + ->getPrivacyUpStatus == 1 ) + ) + && $FHEM::Automation::ShuttersControl::shutters->getUp eq + 'brightness' + && !$FHEM::Automation::ShuttersControl::shutters->getSunrise + && $FHEM::Automation::ShuttersControl::ascDev + ->getAutoShuttersControlMorning eq 'on' + && ( + $FHEM::Automation::ShuttersControl::ascDev->getSelfDefense eq + 'off' + || $FHEM::Automation::ShuttersControl::shutters + ->getSelfDefenseMode eq 'off' + || ( $FHEM::Automation::ShuttersControl::ascDev->getSelfDefense + eq 'on' + && $FHEM::Automation::ShuttersControl::ascDev + ->getResidentsStatus ne 'gone' ) + ) + ) + { + Log3( $name, 4, +"AutoShuttersControl ($shuttersDev) - EventProcessingBrightness: Steuerung für Morgens" + ); + + FHEM::Automation::ShuttersControl::ASC_Debug( + 'EventProcessingBrightness: ' + . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev + . ' - Verarbeitungszeit für Sunrise wurd erkannt. Prüfe Status der Roommates' + ); + + my $homemode = + $FHEM::Automation::ShuttersControl::shutters->getRoommatesStatus; + $homemode = + $FHEM::Automation::ShuttersControl::ascDev->getResidentsStatus + if ( $homemode eq 'none' ); + + if ( + $FHEM::Automation::ShuttersControl::shutters->getModeUp eq + $homemode + || ( $FHEM::Automation::ShuttersControl::shutters->getModeUp eq + 'absent' + && $homemode eq 'gone' ) + || $FHEM::Automation::ShuttersControl::shutters->getModeUp eq + 'always' + ) + { + my $roommatestatus = + $FHEM::Automation::ShuttersControl::shutters + ->getRoommatesStatus; + + if ( + $roommatestatus eq 'home' + || $roommatestatus eq 'awoken' + || $roommatestatus eq 'absent' + || $roommatestatus eq 'gone' + || $roommatestatus eq 'none' + && ( + $FHEM::Automation::ShuttersControl::ascDev + ->getSelfDefense eq 'off' + || ( $FHEM::Automation::ShuttersControl::ascDev + ->getSelfDefense eq 'on' + && CheckIfShuttersWindowRecOpen($shuttersDev) == 0 ) + || ( $FHEM::Automation::ShuttersControl::ascDev + ->getSelfDefense eq 'on' + && CheckIfShuttersWindowRecOpen($shuttersDev) != 0 + && $FHEM::Automation::ShuttersControl::ascDev + ->getResidentsStatus eq 'home' ) + ) + ) + { + + if ( $brightnessPrivacyUpVal > 0 + && $1 < $brightnessMaxVal + && $1 > $brightnessPrivacyUpVal ) + { + $FHEM::Automation::ShuttersControl::shutters + ->setPrivacyUpStatus(2); + $FHEM::Automation::ShuttersControl::shutters + ->setLastDrive('brightness privacy day open'); + FHEM::Automation::ShuttersControl::ShuttersCommandSet( + $hash, + $shuttersDev, + $FHEM::Automation::ShuttersControl::shutters + ->getPrivacyUpPos + ) + if ( + $FHEM::Automation::ShuttersControl::shutters + ->getQueryShuttersPos( + $FHEM::Automation::ShuttersControl::shutters + ->getPrivacyUpPos + ) + ); + + FHEM::Automation::ShuttersControl::ASC_Debug( + 'EventProcessingBrightness: ' + . $FHEM::Automation::ShuttersControl::shutters + ->getShuttersDev + . ' - Verarbeitung für Sunrise Privacy Down. Roommatestatus korrekt zum fahren. Fahrbefehl wird an die Funktion FnFHEM::Automation::ShuttersControl::ShuttersCommandSet gesendet. Grund des fahrens: ' + . $FHEM::Automation::ShuttersControl::shutters + ->getLastDrive ); + + CreateSunRiseSetShuttersTimer( $hash, $shuttersDev ); + } + else { + $FHEM::Automation::ShuttersControl::shutters + ->setLastDrive( + 'maximum brightness threshold exceeded'); + $FHEM::Automation::ShuttersControl::shutters + ->setSunrise(1); + $FHEM::Automation::ShuttersControl::shutters + ->setSunset(0); + $FHEM::Automation::ShuttersControl::shutters + ->setPrivacyUpStatus(0) + if ( $FHEM::Automation::ShuttersControl::shutters + ->getPrivacyUpStatus == 2 ); + FHEM::Automation::ShuttersControl::ShuttersCommandSet( + $hash, + $shuttersDev, + $FHEM::Automation::ShuttersControl::shutters + ->getOpenPos + ); + + FHEM::Automation::ShuttersControl::ASC_Debug( + 'EventProcessingBrightness: ' + . $FHEM::Automation::ShuttersControl::shutters + ->getShuttersDev + . ' - Verarbeitung für Sunrise. Roommatestatus korrekt zum fahren. Fahrbefehl wird an die Funktion FnFHEM::Automation::ShuttersControl::ShuttersCommandSet gesendet. Grund des fahrens: ' + . $FHEM::Automation::ShuttersControl::shutters + ->getLastDrive ); + } + } + else { + EventProcessingShadingBrightness( $hash, $shuttersDev, + $events ); + FHEM::Automation::ShuttersControl::ASC_Debug( + 'EventProcessingBrightness: ' + . $FHEM::Automation::ShuttersControl::shutters + ->getShuttersDev + . ' - Verarbeitung für Sunrise. Roommatestatus nicht zum hochfahren oder Fenster sind offen. Fahrbebehl bleibt aus!!! Es wird an die Event verarbeitende Beschattungsfunktion weiter gereicht' + ); + } + } + } + elsif ( + int( gettimeofday() / 86400 ) != int( + computeAlignTime( '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeDownEarly ) / 86400 + ) + && int( gettimeofday() / 86400 ) == int( + computeAlignTime( + '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeDownLate + ) / 86400 + ) + && ( + $1 < $brightnessMinVal + || ( $1 < $brightnessPrivacyDownVal + && $FHEM::Automation::ShuttersControl::shutters + ->getPrivacyDownStatus == 1 ) + ) + && $FHEM::Automation::ShuttersControl::shutters->getDown eq + 'brightness' + && !$FHEM::Automation::ShuttersControl::shutters->getSunset + && IsAfterShuttersManualBlocking($shuttersDev) + && $FHEM::Automation::ShuttersControl::ascDev + ->getAutoShuttersControlEvening eq 'on' + ) + { + Log3( $name, 4, +"AutoShuttersControl ($shuttersDev) - EventProcessingBrightness: Steuerung für Abends" + ); + + FHEM::Automation::ShuttersControl::ASC_Debug( + 'EventProcessingBrightness: ' + . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev + . ' - Verarbeitungszeit für Sunset wurd erkannt. Prüfe Status der Roommates' + ); + + my $homemode = + $FHEM::Automation::ShuttersControl::shutters->getRoommatesStatus; + $homemode = + $FHEM::Automation::ShuttersControl::ascDev->getResidentsStatus + if ( $homemode eq 'none' ); + + if ( + $FHEM::Automation::ShuttersControl::shutters->getModeDown eq + $homemode + || ( $FHEM::Automation::ShuttersControl::shutters->getModeDown + eq 'absent' + && $homemode eq 'gone' ) + || $FHEM::Automation::ShuttersControl::shutters->getModeDown eq + 'always' + ) + { + my $posValue = + $FHEM::Automation::ShuttersControl::shutters->getStatus; + my $lastDrive; + + ## Setzt den PrivacyDown Modus für die Sichtschutzfahrt auf den Status 0 + ## 1 bedeutet das PrivacyDown Timer aktiviert wurde, 2 beudet das er im privacyDown ist + ## also das Rollo in privacyDown Position steht und VOR der endgültigen Nachfahrt + + if ( $brightnessPrivacyDownVal > 0 + && $1 > $brightnessMinVal + && $1 < $brightnessPrivacyDownVal ) + { + $lastDrive = 'brightness privacy night close'; + $posValue = ( + ( + !$FHEM::Automation::ShuttersControl::shutters + ->getQueryShuttersPos( + $FHEM::Automation::ShuttersControl::shutters + ->getPrivacyDownPos + ) + ) + ? $FHEM::Automation::ShuttersControl::shutters + ->getPrivacyDownPos + : $FHEM::Automation::ShuttersControl::shutters + ->getStatus + ); + $FHEM::Automation::ShuttersControl::shutters + ->setPrivacyDownStatus(2); + + FHEM::Automation::ShuttersControl::ASC_Debug( + 'EventProcessingBrightness: ' + . $FHEM::Automation::ShuttersControl::shutters + ->getShuttersDev + . ' - Verarbeitung für Sunset Privacy Down. Roommatestatus korrekt zum fahren. Fahrbefehl wird an die Funktion FnFHEM::Automation::ShuttersControl::ShuttersCommandSet gesendet. Grund des fahrens: ' + . $FHEM::Automation::ShuttersControl::shutters + ->getLastDrive ); + } + elsif ( CheckIfShuttersWindowRecOpen($shuttersDev) == 2 + && $FHEM::Automation::ShuttersControl::shutters->getSubTyp + eq 'threestate' + && $FHEM::Automation::ShuttersControl::ascDev + ->getAutoShuttersControlComfort eq 'on' ) + { + $posValue = $FHEM::Automation::ShuttersControl::shutters + ->getComfortOpenPos; + $lastDrive = 'minimum brightness threshold fell below'; + $FHEM::Automation::ShuttersControl::shutters + ->setPrivacyDownStatus(0) + if ( $FHEM::Automation::ShuttersControl::shutters + ->getPrivacyDownStatus == 2 ); + } + elsif ( CheckIfShuttersWindowRecOpen($shuttersDev) == 0 + || $FHEM::Automation::ShuttersControl::shutters + ->getVentilateOpen eq 'off' ) + { + $posValue = ( + $FHEM::Automation::ShuttersControl::shutters + ->getSleepPos > 0 + ? $FHEM::Automation::ShuttersControl::shutters + ->getSleepPos + : $FHEM::Automation::ShuttersControl::shutters + ->getClosedPos + ); + $lastDrive = 'minimum brightness threshold fell below'; + $FHEM::Automation::ShuttersControl::shutters + ->setPrivacyDownStatus(0) + if ( $FHEM::Automation::ShuttersControl::shutters + ->getPrivacyDownStatus == 2 ); + } + else { + $posValue = $FHEM::Automation::ShuttersControl::shutters + ->getVentilatePos; + $lastDrive = 'minimum brightness threshold fell below'; + $FHEM::Automation::ShuttersControl::shutters + ->setPrivacyDownStatus(0) + if ( $FHEM::Automation::ShuttersControl::shutters + ->getPrivacyDownStatus == 2 ); + } + + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + $lastDrive); + + if ( + $FHEM::Automation::ShuttersControl::shutters + ->getPrivacyDownStatus != 2 + ) + { + $FHEM::Automation::ShuttersControl::shutters->setSunrise(0); + $FHEM::Automation::ShuttersControl::shutters->setSunset(1); + } + + FHEM::Automation::ShuttersControl::ShuttersCommandSet( $hash, + $shuttersDev, $posValue ); + + FHEM::Automation::ShuttersControl::ASC_Debug( + 'EventProcessingBrightness: ' + . $FHEM::Automation::ShuttersControl::shutters + ->getShuttersDev + . ' - Verarbeitung für Sunset. Roommatestatus korrekt zum fahren. Fahrbefehl wird an die Funktion FnFHEM::Automation::ShuttersControl::ShuttersCommandSet gesendet. Zielposition: ' + . $posValue + . ' Grund des fahrens: ' + . $FHEM::Automation::ShuttersControl::shutters + ->getLastDrive ); + } + else { + EventProcessingShadingBrightness( $hash, $shuttersDev, $events ) + if ( $FHEM::Automation::ShuttersControl::shutters + ->getPrivacyDownStatus != 2 ); + + FHEM::Automation::ShuttersControl::ASC_Debug( + 'EventProcessingBrightness: ' + . $FHEM::Automation::ShuttersControl::shutters + ->getShuttersDev + . ' - Verarbeitung für Sunset. Roommatestatus nicht zum runter fahren. Fahrbebehl bleibt aus!!! Es wird an die Event verarbeitende Beschattungsfunktion weiter gereicht' + ); + } + } + else { + EventProcessingShadingBrightness( $hash, $shuttersDev, $events ) + if ( $FHEM::Automation::ShuttersControl::shutters + ->getPrivacyDownStatus != 2 ); + + FHEM::Automation::ShuttersControl::ASC_Debug( + 'EventProcessingBrightness: ' + . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev + . ' - Brightness Event kam nicht innerhalb der Verarbeitungszeit für Sunset oder Sunris oder aber für beide wurden die entsprechendne Verarbeitungsschwellen nicht erreicht.' + ); + } + } + else { + FHEM::Automation::ShuttersControl::ASC_Debug( + 'EventProcessingBrightness: ' + . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev + . ' - Leider konnte kein Korrekter Brightnesswert aus dem Event erkannt werden. Entweder passt das Reading oder der tatsächliche nummerishce Wert des Events nicht' + ); + } + + return; +} + +sub EventProcessingShadingBrightness { + my $hash = shift; + my $shuttersDev = shift; + my $events = shift; + + my $name = $hash->{NAME}; + $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev); + my $reading = + $FHEM::Automation::ShuttersControl::shutters->getBrightnessReading; + my $outTemp = ( + $FHEM::Automation::ShuttersControl::shutters->getOutTemp != -100 + ? $FHEM::Automation::ShuttersControl::shutters->getOutTemp + : $FHEM::Automation::ShuttersControl::ascDev->getOutTemp + ); + + Log3( $name, 4, + "AutoShuttersControl ($shuttersDev) - EventProcessingShadingBrightness" + ); + + FHEM::Automation::ShuttersControl::ASC_Debug( + 'EventProcessingShadingBrightness: ' + . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev + . ' - Es wird nun geprüft ob der übergebene Event ein nummerischer Wert vom Brightnessreading ist.' + ); + + if ( $events =~ m{$reading:\s(\d+(\.\d+)?)}xms ) { + Log3( + $name, 4, +"AutoShuttersControl ($shuttersDev) - EventProcessingShadingBrightness + Brightness: " . $1 + ); + + ## Brightness Wert in ein Array schieben zur Berechnung eines Average Wertes + $FHEM::Automation::ShuttersControl::shutters->setPushBrightnessInArray( + $1); + + FHEM::Automation::ShuttersControl::ASC_Debug( + 'EventProcessingShadingBrightness: ' + . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev + . ' - Nummerischer Brightness-Wert wurde erkannt. Der Brightness Average Wert ist: ' + . $FHEM::Automation::ShuttersControl::shutters + ->getBrightnessAverage + . ' RainProtection: ' + . $FHEM::Automation::ShuttersControl::shutters + ->getRainProtectionStatus + . ' WindProtection: ' + . $FHEM::Automation::ShuttersControl::shutters + ->getWindProtectionStatus ); + + if ( $FHEM::Automation::ShuttersControl::ascDev + ->getAutoShuttersControlShading eq 'on' + && $FHEM::Automation::ShuttersControl::shutters + ->getRainProtectionStatus eq 'unprotected' + && $FHEM::Automation::ShuttersControl::shutters + ->getWindProtectionStatus eq 'unprotected' ) + { + ShadingProcessing( + $hash, + $shuttersDev, + $FHEM::Automation::ShuttersControl::ascDev->getAzimuth, + $FHEM::Automation::ShuttersControl::ascDev->getElevation, + $outTemp, + $FHEM::Automation::ShuttersControl::shutters + ->getShadingAzimuthLeft, + $FHEM::Automation::ShuttersControl::shutters + ->getShadingAzimuthRight + ); + + FHEM::Automation::ShuttersControl::ASC_Debug( + 'EventProcessingShadingBrightness: ' + . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev + . ' - Alle Bedingungen zur weiteren Beschattungsverarbeitung sind erfüllt. Es wird nun die eigentliche Beschattungsfunktion aufgerufen' + ); + } + } + + return; +} + +sub EventProcessingTwilightDevice { + my $hash = shift; + my $device = shift; + my $events = shift; + + # Twilight + # azimuth = azimuth = Sonnenwinkel + # elevation = elevation = Sonnenhöhe + # + # Astro + # SunAz = azimuth = Sonnenwinkel + # SunAlt = elevation = Sonnenhöhe + + FHEM::Automation::ShuttersControl::ASC_Debug( + 'EventProcessingTwilightDevice: ' + . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev + . ' - Event vom Astro oder Twilight Device wurde erkannt. Event wird verarbeitet' + ); + + if ( $events =~ m{(azimuth|elevation|SunAz|SunAlt):\s(\d+.\d+)}xms ) { + my $name = $device; + my $outTemp = $FHEM::Automation::ShuttersControl::ascDev->getOutTemp; + my ( $azimuth, $elevation ); + + $azimuth = $2 if ( $1 eq 'azimuth' || $1 eq 'SunAz' ); + $elevation = $2 if ( $1 eq 'elevation' || $1 eq 'SunAlt' ); + + $azimuth = $FHEM::Automation::ShuttersControl::ascDev->getAzimuth + if ( !defined($azimuth) && !$azimuth ); + $elevation = $FHEM::Automation::ShuttersControl::ascDev->getElevation + if ( !defined($elevation) && !$elevation ); + + FHEM::Automation::ShuttersControl::ASC_Debug( + 'EventProcessingTwilightDevice: ' + . $name + . ' - Passendes Event wurde erkannt. Verarbeitung über alle Rollos beginnt' + ); + + for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { + $FHEM::Automation::ShuttersControl::shutters->setShuttersDev( + $shuttersDev); + + my $homemode = + $FHEM::Automation::ShuttersControl::shutters->getRoommatesStatus; + $homemode = + $FHEM::Automation::ShuttersControl::ascDev->getResidentsStatus + if ( $homemode eq 'none' ); + $outTemp = $FHEM::Automation::ShuttersControl::shutters->getOutTemp + if ( $FHEM::Automation::ShuttersControl::shutters->getOutTemp != + -100 ); + + FHEM::Automation::ShuttersControl::ASC_Debug( + 'EventProcessingTwilightDevice: ' + . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev + . ' RainProtection: ' + . $FHEM::Automation::ShuttersControl::shutters + ->getRainProtectionStatus + . ' WindProtection: ' + . $FHEM::Automation::ShuttersControl::shutters + ->getWindProtectionStatus ); + + if ( $FHEM::Automation::ShuttersControl::ascDev + ->getAutoShuttersControlShading eq 'on' + && $FHEM::Automation::ShuttersControl::shutters + ->getRainProtectionStatus eq 'unprotected' + && $FHEM::Automation::ShuttersControl::shutters + ->getWindProtectionStatus eq 'unprotected' ) + { + ShadingProcessing( + $hash, + $shuttersDev, + $azimuth, + $elevation, + $outTemp, + $FHEM::Automation::ShuttersControl::shutters + ->getShadingAzimuthLeft, + $FHEM::Automation::ShuttersControl::shutters + ->getShadingAzimuthRight + ); + + FHEM::Automation::ShuttersControl::ASC_Debug( + 'EventProcessingTwilightDevice: ' + . $FHEM::Automation::ShuttersControl::shutters + ->getShuttersDev + . ' - Alle Bedingungen zur weiteren Beschattungsverarbeitung sind erfüllt. Es wird nun die Beschattungsfunktion ausgeführt' + ); + } + } + } + + return; +} + +sub EventProcessingPartyMode { + my $hash = shift; + + my $name = $hash->{NAME}; + + for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { + $FHEM::Automation::ShuttersControl::shutters->setShuttersDev( + $shuttersDev); + next + if ( $FHEM::Automation::ShuttersControl::shutters->getPartyMode eq + 'off' ); + + if ( !$FHEM::Automation::ShuttersControl::shutters->getIsDay + && $FHEM::Automation::ShuttersControl::shutters->getModeDown ne + 'off' + && IsAfterShuttersManualBlocking($shuttersDev) ) + { + if ( CheckIfShuttersWindowRecOpen($shuttersDev) == 2 + && $FHEM::Automation::ShuttersControl::shutters->getSubTyp eq + 'threestate' ) + { + Log3( $name, 4, +"AutoShuttersControl ($name) - EventProcessingPartyMode Fenster offen" + ); + $FHEM::Automation::ShuttersControl::shutters->setDelayCmd( + $FHEM::Automation::ShuttersControl::shutters->getClosedPos + ); + Log3( $name, 4, +"AutoShuttersControl ($name) - EventProcessingPartyMode - Spring in ShuttersCommandDelaySet" + ); + } + else { + Log3( $name, 4, +"AutoShuttersControl ($name) - EventProcessingPartyMode Fenster nicht offen" + ); + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'drive after party mode'); + FHEM::Automation::ShuttersControl::ShuttersCommandSet( + $hash, + $shuttersDev, + ( + CheckIfShuttersWindowRecOpen($shuttersDev) == 0 + ? $FHEM::Automation::ShuttersControl::shutters + ->getClosedPos + : $FHEM::Automation::ShuttersControl::shutters + ->getVentilatePos + ) + ); + } + } + elsif ( + $FHEM::Automation::ShuttersControl::shutters->getDelayCmd ne 'none' + && $FHEM::Automation::ShuttersControl::shutters->getIsDay + && IsAfterShuttersManualBlocking($shuttersDev) ) + { + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'drive after party mode'); + FHEM::Automation::ShuttersControl::ShuttersCommandSet( $hash, + $shuttersDev, + $FHEM::Automation::ShuttersControl::shutters->getDelayCmd ); + } + } + + return; +} + +sub EventProcessingAdvShuttersClose { + my $hash = shift; + + my $name = $hash->{NAME}; + + for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { + $FHEM::Automation::ShuttersControl::shutters->setShuttersDev( + $shuttersDev); + next + if ( !$FHEM::Automation::ShuttersControl::shutters->getAdv + && !$FHEM::Automation::ShuttersControl::shutters->getAdvDelay ); + + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'adv delay close'); + $FHEM::Automation::ShuttersControl::shutters->setAdvDelay(1); + FHEM::Automation::ShuttersControl::ShuttersCommandSet( + $hash, + $shuttersDev, + ( + $FHEM::Automation::ShuttersControl::shutters->getDelayCmd ne + 'none' + ? $FHEM::Automation::ShuttersControl::shutters->getDelayCmd + : $FHEM::Automation::ShuttersControl::shutters->getClosedPos + ) + ); + } + + return; +} + +sub EventProcessingShutters { + my $hash = shift; + my $shuttersDev = shift; + my $events = shift; + + my $name = $hash->{NAME}; + + FHEM::Automation::ShuttersControl::ASC_Debug( 'EventProcessingShutters: ' + . ' Fn wurde durch Notify aufgerufen da ASC_Pos_Reading Event erkannt wurde ' + . ' - RECEIVED EVENT: ' + . Dumper $events); + + if ( $events =~ m{.*:\s(\d+)}xms ) { + $FHEM::Automation::ShuttersControl::shutters->setShuttersDev( + $shuttersDev); + $FHEM::Automation::ShuttersControl::ascDev->setPosReading; + + FHEM::Automation::ShuttersControl::ASC_Debug( + 'EventProcessingShutters: ' + . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev + . ' - Event vom Rollo erkannt. Es wird nun eine etwaige manuelle Fahrt ausgewertet.' + . ' Int von gettimeofday: ' + . int( gettimeofday() ) + . ' Last Position Timestamp: ' + . $FHEM::Automation::ShuttersControl::shutters + ->getLastPosTimestamp + . ' Drive Up Max Duration: ' + . $FHEM::Automation::ShuttersControl::shutters + ->getDriveUpMaxDuration + . ' Last Position: ' + . $FHEM::Automation::ShuttersControl::shutters->getLastPos + . ' aktuelle Position: ' + . $FHEM::Automation::ShuttersControl::shutters->getStatus ); + + if ( + ( + int( gettimeofday() ) - + $FHEM::Automation::ShuttersControl::shutters + ->getLastPosTimestamp + ) > + $FHEM::Automation::ShuttersControl::shutters->getDriveUpMaxDuration + && ( + int( gettimeofday() ) - + $FHEM::Automation::ShuttersControl::shutters + ->getLastManPosTimestamp ) > + $FHEM::Automation::ShuttersControl::shutters->getDriveUpMaxDuration + ) + { + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'manual'); + $FHEM::Automation::ShuttersControl::shutters->setLastDriveReading; + $FHEM::Automation::ShuttersControl::ascDev->setStateReading; + $FHEM::Automation::ShuttersControl::shutters->setLastManPos($1); + + $FHEM::Automation::ShuttersControl::shutters + ->setShadingManualDriveStatus(1) + if ( $FHEM::Automation::ShuttersControl::shutters->getIsDay + && $FHEM::Automation::ShuttersControl::shutters->getIfInShading + ); + + FHEM::Automation::ShuttersControl::ASC_Debug( + 'EventProcessingShutters: eine manualle Fahrt wurde erkannt!'); + } + else { + $FHEM::Automation::ShuttersControl::shutters->setLastDriveReading; + $FHEM::Automation::ShuttersControl::ascDev->setStateReading; + + FHEM::Automation::ShuttersControl::ASC_Debug( +'EventProcessingShutters: eine automatisierte Fahrt durch ASC wurde erkannt! Es werden nun die LastDriveReading und StateReading Werte gesetzt!' + ); + } + } + + FHEM::Automation::ShuttersControl::ASC_Debug( 'EventProcessingShutters: ' + . ' Fn wurde durlaufen und es sollten Debugausgaben gekommen sein. ' + . ' !!!Wenn nicht!!! wurde der Event nicht korrekt als Nummerisch erkannt. ' + ); + + return; +} + +sub EventProcessingExternalTriggerDevice { + my $hash = shift; + my $shuttersDev = shift; + my $events = shift; + + my $name = $hash->{NAME}; + + $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev); + + FHEM::Automation::ShuttersControl::ASC_Debug( + 'EventProcessingExternalTriggerDevice: ' + . ' Fn wurde durch Notify ' + . ' - RECEIVED EVENT: ' + . Dumper $events); + + my $reading = + $FHEM::Automation::ShuttersControl::shutters->getExternalTriggerReading; + my $triggerValActive = $FHEM::Automation::ShuttersControl::shutters + ->getExternalTriggerValueActive; + my $triggerValActive2 = $FHEM::Automation::ShuttersControl::shutters + ->getExternalTriggerValueActive2; + my $triggerValInactive = $FHEM::Automation::ShuttersControl::shutters + ->getExternalTriggerValueInactive; + my $triggerPosActive = + $FHEM::Automation::ShuttersControl::shutters->getExternalTriggerPosActive; + my $triggerPosActive2 = $FHEM::Automation::ShuttersControl::shutters + ->getExternalTriggerPosActive2; + my $triggerPosInactive = $FHEM::Automation::ShuttersControl::shutters + ->getExternalTriggerPosInactive; + + if ( $events =~ m{$reading:\s($triggerValActive|$triggerValActive2)}xms ) { + +# && !$FHEM::Automation::ShuttersControl::shutters->getQueryShuttersPos($triggerPosActive) + + FHEM::Automation::ShuttersControl::ASC_Debug( + 'EventProcessingExternalTriggerDevice: ' + . ' In der RegEx Schleife Trigger Val Aktiv' + . ' - TriggerVal: ' + . $triggerValActive + . ' - TriggerVal2: ' + . $triggerValActive2 ); + + if ( $1 eq $triggerValActive2 ) { + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'external trigger2 device active'); + $FHEM::Automation::ShuttersControl::shutters->setNoDelay(1); + $FHEM::Automation::ShuttersControl::shutters + ->setExternalTriggerStatus(1); + FHEM::Automation::ShuttersControl::ShuttersCommandSet( $hash, + $shuttersDev, $triggerPosActive2 ); + } + else { + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'external trigger device active'); + $FHEM::Automation::ShuttersControl::shutters->setNoDelay(1); + $FHEM::Automation::ShuttersControl::shutters + ->setExternalTriggerStatus(1); + FHEM::Automation::ShuttersControl::ShuttersCommandSet( $hash, + $shuttersDev, $triggerPosActive ); + } + } + elsif ( + $events =~ m{$reading:\s($triggerValInactive)}xms + && ( $FHEM::Automation::ShuttersControl::shutters->getPrivacyDownStatus + != 2 + || $FHEM::Automation::ShuttersControl::shutters->getPrivacyUpStatus + != 2 ) + && !$FHEM::Automation::ShuttersControl::shutters->getIfInShading + ) + { + FHEM::Automation::ShuttersControl::ASC_Debug( + 'EventProcessingExternalTriggerDevice: ' + . ' In der RegEx Schleife Trigger Val Inaktiv' + . ' - TriggerVal: ' + . $triggerValInactive ); + + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'external trigger device inactive'); + $FHEM::Automation::ShuttersControl::shutters->setNoDelay(1); + $FHEM::Automation::ShuttersControl::shutters->setExternalTriggerStatus( + 1); + FHEM::Automation::ShuttersControl::ShuttersCommandSet( + $hash, + $shuttersDev, + ( + $FHEM::Automation::ShuttersControl::shutters->getIsDay + ? $triggerPosInactive + : $FHEM::Automation::ShuttersControl::shutters->getClosedPos + ) + ); + } + + FHEM::Automation::ShuttersControl::ASC_Debug( + 'EventProcessingExternalTriggerDevice: ' . ' Funktion durchlaufen' ); + + return; +} + + + + +1; diff --git a/lib/FHEM/Automation/ShuttersControl/Helper.pm b/lib/FHEM/Automation/ShuttersControl/Helper.pm index cf1382a..a736af9 100644 --- a/lib/FHEM/Automation/ShuttersControl/Helper.pm +++ b/lib/FHEM/Automation/ShuttersControl/Helper.pm @@ -46,41 +46,41 @@ use POSIX qw(strftime); use utf8; require Exporter; -our @ISA = qw(Exporter); -our @EXPORT_OK = qw( - PositionValueWindowRec - AutoSearchTwilightDev - GetAttrValues - CheckIfShuttersWindowRecOpen - ExtractNotifyDevFromEvent - ShuttersSunrise - ShuttersSunset - makeReadingName - IsWe - IsAfterShuttersTimeBlocking - IsAfterShuttersManualBlocking - AverageBrightness - PerlCodeCheck - IsAdv +our @ISA = qw(Exporter); +our @EXPORT_OK = qw( + PositionValueWindowRec + AutoSearchTwilightDev + GetAttrValues + CheckIfShuttersWindowRecOpen + ExtractNotifyDevFromEvent + ShuttersSunrise + ShuttersSunset + makeReadingName + IsWe + IsAfterShuttersTimeBlocking + IsAfterShuttersManualBlocking + AverageBrightness + PerlCodeCheck + IsAdv ); -our %EXPORT_TAGS = ( +our %EXPORT_TAGS = ( ALL => [ qw( - PositionValueWindowRec - AutoSearchTwilightDev - GetAttrValues - CheckIfShuttersWindowRecOpen - ExtractNotifyDevFromEvent - ShuttersSunrise - ShuttersSunset - makeReadingName - IsWe - IsAfterShuttersTimeBlocking - IsAfterShuttersManualBlocking - AverageBrightness - PerlCodeCheck - IsAdv - ) + PositionValueWindowRec + AutoSearchTwilightDev + GetAttrValues + CheckIfShuttersWindowRecOpen + ExtractNotifyDevFromEvent + ShuttersSunrise + ShuttersSunset + makeReadingName + IsWe + IsAfterShuttersTimeBlocking + IsAfterShuttersManualBlocking + AverageBrightness + PerlCodeCheck + IsAdv + ) ], ); @@ -89,17 +89,17 @@ use GPUtils qw(GP_Import); BEGIN { GP_Import( qw( - devspec2array - CommandAttr - AttrVal - Log3 - computeAlignTime - gettimeofday - sunset - sunset_abs - sunrise - sunrise_abs - ) + devspec2array + CommandAttr + AttrVal + Log3 + computeAlignTime + gettimeofday + sunset + sunset_abs + sunrise + sunrise_abs + ) ); } @@ -108,27 +108,40 @@ sub PositionValueWindowRec { my $posValue = shift; if ( CheckIfShuttersWindowRecOpen($shuttersDev) == 1 - && $FHEM::Automation::ShuttersControl::shutters->getVentilateOpen eq 'on' ) + && $FHEM::Automation::ShuttersControl::shutters->getVentilateOpen eq + 'on' ) { - $posValue = $FHEM::Automation::ShuttersControl::shutters->getVentilatePos; + $posValue = + $FHEM::Automation::ShuttersControl::shutters->getVentilatePos; } - elsif (CheckIfShuttersWindowRecOpen($shuttersDev) == 2 - && $FHEM::Automation::ShuttersControl::shutters->getSubTyp eq 'threestate' - && $FHEM::Automation::ShuttersControl::ascDev->getAutoShuttersControlComfort eq 'on' ) + elsif ( CheckIfShuttersWindowRecOpen($shuttersDev) == 2 + && $FHEM::Automation::ShuttersControl::shutters->getSubTyp eq + 'threestate' + && $FHEM::Automation::ShuttersControl::ascDev + ->getAutoShuttersControlComfort eq 'on' ) { - $posValue = $FHEM::Automation::ShuttersControl::shutters->getComfortOpenPos; + $posValue = + $FHEM::Automation::ShuttersControl::shutters->getComfortOpenPos; } elsif ( CheckIfShuttersWindowRecOpen($shuttersDev) == 2 - && ( $FHEM::Automation::ShuttersControl::shutters->getSubTyp eq 'threestate' - || $FHEM::Automation::ShuttersControl::shutters->getSubTyp eq 'twostate' ) - && $FHEM::Automation::ShuttersControl::shutters->getVentilateOpen eq 'on' + && ( $FHEM::Automation::ShuttersControl::shutters->getSubTyp eq + 'threestate' + || $FHEM::Automation::ShuttersControl::shutters->getSubTyp eq + 'twostate' ) + && $FHEM::Automation::ShuttersControl::shutters->getVentilateOpen eq + 'on' ) { - $posValue = $FHEM::Automation::ShuttersControl::shutters->getVentilatePos; + $posValue = + $FHEM::Automation::ShuttersControl::shutters->getVentilatePos; } - if ( $FHEM::Automation::ShuttersControl::shutters->getQueryShuttersPos($posValue) ) { + if ( + $FHEM::Automation::ShuttersControl::shutters->getQueryShuttersPos( + $posValue) + ) + { $posValue = $FHEM::Automation::ShuttersControl::shutters->getStatus; } @@ -152,9 +165,9 @@ sub AutoSearchTwilightDev { } sub GetAttrValues { - my $dev = shift; - my $attribut = shift; - my $default = shift; + my $dev = shift; + my $attribut = shift; + my $default = shift; my @values = split( ' ', AttrVal( $dev, $attribut, ( defined($default) ? $default : 'none' ) ) ); @@ -190,20 +203,24 @@ sub CheckIfShuttersWindowRecOpen { { return 2; } - elsif ($FHEM::Automation::ShuttersControl::shutters->getWinStatus =~ m{tilt}xms - && $FHEM::Automation::ShuttersControl::shutters->getSubTyp eq 'threestate' ) # CK: covers: tilt|tilted + elsif ( + $FHEM::Automation::ShuttersControl::shutters->getWinStatus =~ m{tilt}xms + && $FHEM::Automation::ShuttersControl::shutters->getSubTyp eq + 'threestate' ) # CK: covers: tilt|tilted { return 1; } - elsif ( $FHEM::Automation::ShuttersControl::shutters->getWinStatus =~ m{[Cc]lose|true}xms ) { + elsif ( $FHEM::Automation::ShuttersControl::shutters->getWinStatus =~ + m{[Cc]lose|true}xms ) + { return 0; - } # CK: covers: close|closed + } # CK: covers: close|closed } sub ExtractNotifyDevFromEvent { - my $hash = shift; - my $shuttersDev = shift; - my $shuttersAttr = shift; + my $hash = shift; + my $shuttersDev = shift; + my $shuttersAttr = shift; my %notifyDevs; while ( my $notifyDev = each %{ $hash->{monitoredDevs} } ) { @@ -252,42 +269,56 @@ sub _IsDay { ShuttersSunset( $shuttersDev, 'unix' ) ? 1 : 0 ); my $respIsDay = $isday; - FHEM::Automation::ShuttersControl::ASC_Debug( 'FnIsDay: ' . $shuttersDev . ' Allgemein: ' . $respIsDay ); + FHEM::Automation::ShuttersControl::ASC_Debug( + 'FnIsDay: ' . $shuttersDev . ' Allgemein: ' . $respIsDay ); if ( ( ( ( int( gettimeofday() / 86400 ) != int( - computeAlignTime( '24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly ) / - 86400 + computeAlignTime( '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpEarly ) / 86400 ) && !IsWe() ) || ( int( gettimeofday() / 86400 ) != int( - computeAlignTime( '24:00', - $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday ) / - 86400 + computeAlignTime( + '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday + ) / 86400 ) && IsWe() - && $FHEM::Automation::ShuttersControl::ascDev->getSunriseTimeWeHoliday eq 'on' - && $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday ne '01:25' + && $FHEM::Automation::ShuttersControl::ascDev + ->getSunriseTimeWeHoliday eq 'on' + && $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday ne '01:25' ) ) && int( gettimeofday() / 86400 ) == int( - computeAlignTime( '24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeUpLate ) / - 86400 + computeAlignTime( + '24:00', + $FHEM::Automation::ShuttersControl::shutters->getTimeUpLate + ) / 86400 ) ) || ( int( gettimeofday() / 86400 ) != int( - computeAlignTime( '24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeDownEarly ) / - 86400 + computeAlignTime( + '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeDownEarly + ) / 86400 ) && int( gettimeofday() / 86400 ) == int( - computeAlignTime( '24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeDownLate ) / - 86400 + computeAlignTime( + '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeDownLate + ) / 86400 ) ) ) @@ -296,13 +327,17 @@ sub _IsDay { $respIsDay = ( ( ( - $FHEM::Automation::ShuttersControl::shutters->getBrightness > $brightnessMinVal + $FHEM::Automation::ShuttersControl::shutters + ->getBrightness > $brightnessMinVal && $isday - && !$FHEM::Automation::ShuttersControl::shutters->getSunset + && !$FHEM::Automation::ShuttersControl::shutters + ->getSunset ) || !$FHEM::Automation::ShuttersControl::shutters->getSunset ) ? 1 : 0 - ) if ( $FHEM::Automation::ShuttersControl::shutters->getDown eq 'brightness' ); + ) + if ( $FHEM::Automation::ShuttersControl::shutters->getDown eq + 'brightness' ); FHEM::Automation::ShuttersControl::ASC_Debug( 'FnIsDay: ' . $shuttersDev @@ -319,14 +354,18 @@ sub _IsDay { $respIsDay = ( ( ( - $FHEM::Automation::ShuttersControl::shutters->getBrightness > $brightnessMaxVal + $FHEM::Automation::ShuttersControl::shutters + ->getBrightness > $brightnessMaxVal && !$isday - && $FHEM::Automation::ShuttersControl::shutters->getSunrise + && $FHEM::Automation::ShuttersControl::shutters + ->getSunrise ) || $respIsDay || $FHEM::Automation::ShuttersControl::shutters->getSunrise ) ? 1 : 0 - ) if ( $FHEM::Automation::ShuttersControl::shutters->getUp eq 'brightness' ); + ) + if ( $FHEM::Automation::ShuttersControl::shutters->getUp eq + 'brightness' ); FHEM::Automation::ShuttersControl::ASC_Debug( 'FnIsDay: ' . $shuttersDev @@ -350,27 +389,38 @@ sub ShuttersSunrise { my $autoAstroMode; $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev); - if ( $FHEM::Automation::ShuttersControl::shutters->getAutoAstroModeMorning ne 'none' ) { - $autoAstroMode = $FHEM::Automation::ShuttersControl::shutters->getAutoAstroModeMorning; + if ( $FHEM::Automation::ShuttersControl::shutters->getAutoAstroModeMorning + ne 'none' ) + { $autoAstroMode = - $autoAstroMode . '=' . $FHEM::Automation::ShuttersControl::shutters->getAutoAstroModeMorningHorizon + $FHEM::Automation::ShuttersControl::shutters->getAutoAstroModeMorning; + $autoAstroMode = + $autoAstroMode . '=' + . $FHEM::Automation::ShuttersControl::shutters + ->getAutoAstroModeMorningHorizon if ( $autoAstroMode eq 'HORIZON' ); } else { - $autoAstroMode = $FHEM::Automation::ShuttersControl::ascDev->getAutoAstroModeMorning; $autoAstroMode = - $autoAstroMode . '=' . $FHEM::Automation::ShuttersControl::ascDev->getAutoAstroModeMorningHorizon + $FHEM::Automation::ShuttersControl::ascDev->getAutoAstroModeMorning; + $autoAstroMode = + $autoAstroMode . '=' + . $FHEM::Automation::ShuttersControl::ascDev + ->getAutoAstroModeMorningHorizon if ( $autoAstroMode eq 'HORIZON' ); } - my $oldFuncHash = $FHEM::Automation::ShuttersControl::shutters->getInTimerFuncHash; + my $oldFuncHash = + $FHEM::Automation::ShuttersControl::shutters->getInTimerFuncHash; my $shuttersSunriseUnixtime = computeAlignTime( '24:00', sunrise( 'REAL', 0, '4:30', '8:30' ) ); if ( $tm eq 'unix' ) { if ( $FHEM::Automation::ShuttersControl::shutters->getUp eq 'astro' ) { - if ( ( IsWe() || IsWe('tomorrow') ) - && $FHEM::Automation::ShuttersControl::ascDev->getSunriseTimeWeHoliday eq 'on' - && $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday ne '01:25' ) + if ( ( IsWe() || IsWe('tomorrow') ) + && $FHEM::Automation::ShuttersControl::ascDev + ->getSunriseTimeWeHoliday eq 'on' + && $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday ne '01:25' ) { if ( !IsWe('tomorrow') ) { if ( @@ -380,8 +430,10 @@ sub ShuttersSunrise { computeAlignTime( '24:00', sunrise_abs( - $autoAstroMode, 0, - $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday + $autoAstroMode, + 0, + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday ) ) + 1 ) / 86400 @@ -392,8 +444,10 @@ sub ShuttersSunrise { computeAlignTime( '24:00', sunrise_abs( - $autoAstroMode, 0, - $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday + $autoAstroMode, + 0, + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday ) ) + 1 ); @@ -406,8 +460,10 @@ sub ShuttersSunrise { sunrise_abs( $autoAstroMode, 0, - $FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly, - $FHEM::Automation::ShuttersControl::shutters->getTimeUpLate + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpEarly, + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpLate ) ) + 1 ) / 86400 @@ -418,8 +474,10 @@ sub ShuttersSunrise { computeAlignTime( '24:00', sunrise_abs( - $autoAstroMode, 0, - $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday + $autoAstroMode, + 0, + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday ) ) + 1 ); @@ -431,8 +489,10 @@ sub ShuttersSunrise { sunrise_abs( $autoAstroMode, 0, - $FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly, - $FHEM::Automation::ShuttersControl::shutters->getTimeUpLate + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpEarly, + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpLate ) ) + 1 ); @@ -447,8 +507,10 @@ sub ShuttersSunrise { computeAlignTime( '24:00', sunrise_abs( - $autoAstroMode, 0, - $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday + $autoAstroMode, + 0, + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday ) ) + 1 ) / 86400 @@ -458,8 +520,10 @@ sub ShuttersSunrise { computeAlignTime( '24:00', sunrise_abs( - $autoAstroMode, 0, - $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday + $autoAstroMode, + 0, + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday ) ) + 1 ) / 86400 @@ -471,8 +535,10 @@ sub ShuttersSunrise { computeAlignTime( '24:00', sunrise_abs( - $autoAstroMode, 0, - $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday + $autoAstroMode, + 0, + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday ) ) + 1 ); @@ -485,8 +551,10 @@ sub ShuttersSunrise { sunrise_abs( $autoAstroMode, 0, - $FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly, - $FHEM::Automation::ShuttersControl::shutters->getTimeUpLate + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpEarly, + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpLate ) ) + 1 ) / 86400 @@ -499,8 +567,10 @@ sub ShuttersSunrise { sunrise_abs( $autoAstroMode, 0, - $FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly, - $FHEM::Automation::ShuttersControl::shutters->getTimeUpLate + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpEarly, + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpLate ) ) + 1 ); @@ -512,8 +582,10 @@ sub ShuttersSunrise { computeAlignTime( '24:00', sunrise_abs( - $autoAstroMode, 0, - $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday + $autoAstroMode, + 0, + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday ) ) + 1 ) / 86400 @@ -524,8 +596,10 @@ sub ShuttersSunrise { computeAlignTime( '24:00', sunrise_abs( - $autoAstroMode, 0, - $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday + $autoAstroMode, + 0, + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday ) ) + 86401 ); @@ -535,8 +609,10 @@ sub ShuttersSunrise { computeAlignTime( '24:00', sunrise_abs( - $autoAstroMode, 0, - $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday + $autoAstroMode, + 0, + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday ) ) + 1 ); @@ -551,8 +627,10 @@ sub ShuttersSunrise { sunrise_abs( $autoAstroMode, 0, - $FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly, - $FHEM::Automation::ShuttersControl::shutters->getTimeUpLate + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpEarly, + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpLate ) ) + 1 ); @@ -560,8 +638,10 @@ sub ShuttersSunrise { if ( defined($oldFuncHash) && ref($oldFuncHash) eq 'HASH' && ( IsWe() || IsWe('tomorrow') ) - && $FHEM::Automation::ShuttersControl::ascDev->getSunriseTimeWeHoliday eq 'on' - && $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday ne '01:25' ) + && $FHEM::Automation::ShuttersControl::ascDev + ->getSunriseTimeWeHoliday eq 'on' + && $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday ne '01:25' ) { if ( !IsWe('tomorrow') ) { if ( @@ -572,8 +652,10 @@ sub ShuttersSunrise { sunrise_abs( $autoAstroMode, 0, - $FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly, - $FHEM::Automation::ShuttersControl::shutters->getTimeUpLate + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpEarly, + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpLate ) ) + 1 ) / 86400 @@ -595,92 +677,116 @@ sub ShuttersSunrise { && $oldFuncHash->{sunrisetime} < gettimeofday() ); } } - elsif ( $FHEM::Automation::ShuttersControl::shutters->getUp eq 'time' ) { - if ( ( IsWe() || IsWe('tomorrow') ) - && $FHEM::Automation::ShuttersControl::ascDev->getSunriseTimeWeHoliday eq 'on' - && $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday ne '01:25' ) + elsif ( $FHEM::Automation::ShuttersControl::shutters->getUp eq 'time' ) + { + if ( ( IsWe() || IsWe('tomorrow') ) + && $FHEM::Automation::ShuttersControl::ascDev + ->getSunriseTimeWeHoliday eq 'on' + && $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday ne '01:25' ) { if ( !IsWe('tomorrow') ) { if ( int( gettimeofday() / 86400 ) == int( - computeAlignTime( '24:00', - $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday ) / 86400 + computeAlignTime( + '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday + ) / 86400 ) ) { - $shuttersSunriseUnixtime = - computeAlignTime( '24:00', - $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday ); + $shuttersSunriseUnixtime = computeAlignTime( '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday ); } elsif ( int( gettimeofday() / 86400 ) == int( - computeAlignTime( '24:00', - $FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly ) / 86400 + computeAlignTime( + '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpEarly + ) / 86400 ) - && $FHEM::Automation::ShuttersControl::shutters->getSunrise + && $FHEM::Automation::ShuttersControl::shutters + ->getSunrise ) { - $shuttersSunriseUnixtime = - computeAlignTime( '24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly ) - + 86400; + $shuttersSunriseUnixtime = computeAlignTime( '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpEarly ) + 86400; } else { - $shuttersSunriseUnixtime = - computeAlignTime( '24:00', - $FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly ); + $shuttersSunriseUnixtime = computeAlignTime( '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpEarly ); } } else { if ( IsWe() && int( gettimeofday() / 86400 ) == int( - computeAlignTime( '24:00', - $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday ) / 86400 + computeAlignTime( + '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday + ) / 86400 ) ) { - $shuttersSunriseUnixtime = - computeAlignTime( '24:00', - $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday ); + $shuttersSunriseUnixtime = computeAlignTime( '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday ); } elsif ( int( gettimeofday() / 86400 ) == int( - computeAlignTime( '24:00', - $FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly ) / 86400 + computeAlignTime( + '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpEarly + ) / 86400 ) ) { - $shuttersSunriseUnixtime = - computeAlignTime( '24:00', - $FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly ); + $shuttersSunriseUnixtime = computeAlignTime( '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpEarly ); } elsif ( int( gettimeofday() / 86400 ) != int( - computeAlignTime( '24:00', - $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday ) / 86400 + computeAlignTime( + '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday + ) / 86400 ) ) { - $shuttersSunriseUnixtime = - computeAlignTime( '24:00', - $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday ); + $shuttersSunriseUnixtime = computeAlignTime( '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday ); } else { - $shuttersSunriseUnixtime = - computeAlignTime( '24:00', - $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday ) + 86400; + $shuttersSunriseUnixtime = computeAlignTime( '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday ) + 86400; } } } else { - $shuttersSunriseUnixtime = - computeAlignTime( '24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly ); + $shuttersSunriseUnixtime = computeAlignTime( '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpEarly ); } } - elsif ( $FHEM::Automation::ShuttersControl::shutters->getUp eq 'brightness' ) { - if ( ( IsWe() || IsWe('tomorrow') ) - && $FHEM::Automation::ShuttersControl::ascDev->getSunriseTimeWeHoliday eq 'on' - && $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday ne '01:25' ) + elsif ( $FHEM::Automation::ShuttersControl::shutters->getUp eq + 'brightness' ) + { + if ( ( IsWe() || IsWe('tomorrow') ) + && $FHEM::Automation::ShuttersControl::ascDev + ->getSunriseTimeWeHoliday eq 'on' + && $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday ne '01:25' ) { if ( !IsWe('tomorrow') ) { if ( @@ -688,33 +794,38 @@ sub ShuttersSunrise { && int( gettimeofday() / 86400 ) == int( ( computeAlignTime( - '24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday + '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday ) ) / 86400 ) ) { - $shuttersSunriseUnixtime = - computeAlignTime( '24:00', - $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday ); + $shuttersSunriseUnixtime = computeAlignTime( '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday ); } elsif ( int( gettimeofday() / 86400 ) == int( ( computeAlignTime( - '24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeUpLate + '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpLate ) ) / 86400 ) ) { - $shuttersSunriseUnixtime = - computeAlignTime( '24:00', - $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday ); + $shuttersSunriseUnixtime = computeAlignTime( '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday ); } else { - $shuttersSunriseUnixtime = - computeAlignTime( '24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeUpLate ); + $shuttersSunriseUnixtime = computeAlignTime( '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpLate ); } } else { @@ -724,74 +835,93 @@ sub ShuttersSunrise { int( gettimeofday() / 86400 ) == int( ( computeAlignTime( - '24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday + '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday ) ) / 86400 ) || int( gettimeofday() / 86400 ) != int( ( computeAlignTime( - '24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday + '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday ) ) / 86400 ) ) ) { - $shuttersSunriseUnixtime = - computeAlignTime( '24:00', - $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday ); + $shuttersSunriseUnixtime = computeAlignTime( '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday ); } elsif ( int( gettimeofday() / 86400 ) == int( ( computeAlignTime( - '24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeUpLate + '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpLate ) ) / 86400 ) ) { - $shuttersSunriseUnixtime = - computeAlignTime( '24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeUpLate ); + $shuttersSunriseUnixtime = computeAlignTime( '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpLate ); } else { if ( int( gettimeofday() / 86400 ) == int( ( computeAlignTime( - '24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday + '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday ) ) / 86400 ) ) { - $shuttersSunriseUnixtime = - computeAlignTime( '24:00', - $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday ); + $shuttersSunriseUnixtime = computeAlignTime( + '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday + ); } else { - $shuttersSunriseUnixtime = - computeAlignTime( '24:00', - $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday ); + $shuttersSunriseUnixtime = computeAlignTime( + '24:00', + $FHEM::Automation::ShuttersControl::shutters + ->getTimeUpWeHoliday + ); } } } } else { - $shuttersSunriseUnixtime = - computeAlignTime( '24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeUpLate ); + $shuttersSunriseUnixtime = computeAlignTime( '24:00', + $FHEM::Automation::ShuttersControl::shutters->getTimeUpLate + ); } } return $shuttersSunriseUnixtime; } elsif ( $tm eq 'real' ) { - return sunrise_abs( $autoAstroMode, 0, $FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly, - $FHEM::Automation::ShuttersControl::shutters->getTimeUpLate ) + return sunrise_abs( + $autoAstroMode, + 0, + $FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly, + $FHEM::Automation::ShuttersControl::shutters->getTimeUpLate + ) if ( $FHEM::Automation::ShuttersControl::shutters->getUp eq 'astro' ); - return $FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly if ( $FHEM::Automation::ShuttersControl::shutters->getUp eq 'time' ); + return $FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly + if ( $FHEM::Automation::ShuttersControl::shutters->getUp eq 'time' ); } return; @@ -804,32 +934,44 @@ sub ShuttersSunset { my $autoAstroMode; $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev); - if ( $FHEM::Automation::ShuttersControl::shutters->getAutoAstroModeEvening ne 'none' ) { - $autoAstroMode = $FHEM::Automation::ShuttersControl::shutters->getAutoAstroModeEvening; + if ( $FHEM::Automation::ShuttersControl::shutters->getAutoAstroModeEvening + ne 'none' ) + { $autoAstroMode = - $autoAstroMode . '=' . $FHEM::Automation::ShuttersControl::shutters->getAutoAstroModeEveningHorizon + $FHEM::Automation::ShuttersControl::shutters->getAutoAstroModeEvening; + $autoAstroMode = + $autoAstroMode . '=' + . $FHEM::Automation::ShuttersControl::shutters + ->getAutoAstroModeEveningHorizon if ( $autoAstroMode eq 'HORIZON' ); } else { - $autoAstroMode = $FHEM::Automation::ShuttersControl::ascDev->getAutoAstroModeEvening; $autoAstroMode = - $autoAstroMode . '=' . $FHEM::Automation::ShuttersControl::ascDev->getAutoAstroModeEveningHorizon + $FHEM::Automation::ShuttersControl::ascDev->getAutoAstroModeEvening; + $autoAstroMode = + $autoAstroMode . '=' + . $FHEM::Automation::ShuttersControl::ascDev + ->getAutoAstroModeEveningHorizon if ( $autoAstroMode eq 'HORIZON' ); } - my $oldFuncHash = $FHEM::Automation::ShuttersControl::shutters->getInTimerFuncHash; + my $oldFuncHash = + $FHEM::Automation::ShuttersControl::shutters->getInTimerFuncHash; my $shuttersSunsetUnixtime = computeAlignTime( '24:00', sunset( 'REAL', 0, '15:30', '21:30' ) ); if ( $tm eq 'unix' ) { - if ( $FHEM::Automation::ShuttersControl::shutters->getDown eq 'astro' ) { + if ( $FHEM::Automation::ShuttersControl::shutters->getDown eq 'astro' ) + { $shuttersSunsetUnixtime = ( computeAlignTime( '24:00', sunset_abs( $autoAstroMode, 0, - $FHEM::Automation::ShuttersControl::shutters->getTimeDownEarly, - $FHEM::Automation::ShuttersControl::shutters->getTimeDownLate + $FHEM::Automation::ShuttersControl::shutters + ->getTimeDownEarly, + $FHEM::Automation::ShuttersControl::shutters + ->getTimeDownLate ) ) + 1 ); @@ -840,24 +982,34 @@ sub ShuttersSunset { && $oldFuncHash->{sunsettime} < gettimeofday() ); } } - elsif ( $FHEM::Automation::ShuttersControl::shutters->getDown eq 'time' ) { - $shuttersSunsetUnixtime = - computeAlignTime( '24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeDownEarly ); + elsif ( + $FHEM::Automation::ShuttersControl::shutters->getDown eq 'time' ) + { + $shuttersSunsetUnixtime = computeAlignTime( '24:00', + $FHEM::Automation::ShuttersControl::shutters->getTimeDownEarly + ); } - elsif ( $FHEM::Automation::ShuttersControl::shutters->getDown eq 'brightness' ) { + elsif ( $FHEM::Automation::ShuttersControl::shutters->getDown eq + 'brightness' ) + { $shuttersSunsetUnixtime = - computeAlignTime( '24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeDownLate ); + computeAlignTime( '24:00', + $FHEM::Automation::ShuttersControl::shutters->getTimeDownLate ); } return $shuttersSunsetUnixtime; } elsif ( $tm eq 'real' ) { return sunset_abs( - $autoAstroMode, 0, + $autoAstroMode, + 0, $FHEM::Automation::ShuttersControl::shutters->getTimeDownEarly, $FHEM::Automation::ShuttersControl::shutters->getTimeDownLate - ) if ( $FHEM::Automation::ShuttersControl::shutters->getDown eq 'astro' ); + ) + if ( + $FHEM::Automation::ShuttersControl::shutters->getDown eq 'astro' ); return $FHEM::Automation::ShuttersControl::shutters->getTimeDownEarly - if ( $FHEM::Automation::ShuttersControl::shutters->getDown eq 'time' ); + if ( + $FHEM::Automation::ShuttersControl::shutters->getDown eq 'time' ); } return; @@ -869,16 +1021,31 @@ sub IsAfterShuttersTimeBlocking { $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev); if ( - ( int( gettimeofday() ) - $FHEM::Automation::ShuttersControl::shutters->getLastManPosTimestamp ) < + ( + int( gettimeofday() ) - + $FHEM::Automation::ShuttersControl::shutters->getLastManPosTimestamp + ) < $FHEM::Automation::ShuttersControl::shutters->getBlockingTimeAfterManual - || ( !$FHEM::Automation::ShuttersControl::shutters->getIsDay - && defined( $FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime ) - && $FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime - ( int( gettimeofday() ) ) < - $FHEM::Automation::ShuttersControl::shutters->getBlockingTimeBeforDayOpen ) - || ( $FHEM::Automation::ShuttersControl::shutters->getIsDay - && defined( $FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime ) - && $FHEM::Automation::ShuttersControl::shutters->getSunsetUnixTime - ( int( gettimeofday() ) ) < - $FHEM::Automation::ShuttersControl::shutters->getBlockingTimeBeforNightClose ) + || ( + !$FHEM::Automation::ShuttersControl::shutters->getIsDay + && defined( + $FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime + ) + && $FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime + - ( int( gettimeofday() ) ) < + $FHEM::Automation::ShuttersControl::shutters + ->getBlockingTimeBeforDayOpen + ) + || ( + $FHEM::Automation::ShuttersControl::shutters->getIsDay + && defined( + $FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime + ) + && $FHEM::Automation::ShuttersControl::shutters->getSunsetUnixTime + - ( int( gettimeofday() ) ) < + $FHEM::Automation::ShuttersControl::shutters + ->getBlockingTimeBeforNightClose + ) ) { return 0; @@ -891,20 +1058,34 @@ sub IsAfterShuttersManualBlocking { my $shuttersDev = shift; $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev); - if ( $FHEM::Automation::ShuttersControl::ascDev->getBlockAscDrivesAfterManual - && $FHEM::Automation::ShuttersControl::shutters->getStatus != $FHEM::Automation::ShuttersControl::shutters->getOpenPos - && $FHEM::Automation::ShuttersControl::shutters->getStatus != $FHEM::Automation::ShuttersControl::shutters->getClosedPos - && $FHEM::Automation::ShuttersControl::shutters->getStatus != $FHEM::Automation::ShuttersControl::shutters->getWindPos - && $FHEM::Automation::ShuttersControl::shutters->getStatus != $FHEM::Automation::ShuttersControl::shutters->getShadingPos - && $FHEM::Automation::ShuttersControl::shutters->getStatus != $FHEM::Automation::ShuttersControl::shutters->getComfortOpenPos - && $FHEM::Automation::ShuttersControl::shutters->getStatus != $FHEM::Automation::ShuttersControl::shutters->getVentilatePos - && $FHEM::Automation::ShuttersControl::shutters->getStatus != $FHEM::Automation::ShuttersControl::shutters->getAntiFreezePos - && $FHEM::Automation::ShuttersControl::shutters->getLastDrive eq 'manual' ) + if ( + $FHEM::Automation::ShuttersControl::ascDev->getBlockAscDrivesAfterManual + && $FHEM::Automation::ShuttersControl::shutters->getStatus != + $FHEM::Automation::ShuttersControl::shutters->getOpenPos + && $FHEM::Automation::ShuttersControl::shutters->getStatus != + $FHEM::Automation::ShuttersControl::shutters->getClosedPos + && $FHEM::Automation::ShuttersControl::shutters->getStatus != + $FHEM::Automation::ShuttersControl::shutters->getWindPos + && $FHEM::Automation::ShuttersControl::shutters->getStatus != + $FHEM::Automation::ShuttersControl::shutters->getShadingPos + && $FHEM::Automation::ShuttersControl::shutters->getStatus != + $FHEM::Automation::ShuttersControl::shutters->getComfortOpenPos + && $FHEM::Automation::ShuttersControl::shutters->getStatus != + $FHEM::Automation::ShuttersControl::shutters->getVentilatePos + && $FHEM::Automation::ShuttersControl::shutters->getStatus != + $FHEM::Automation::ShuttersControl::shutters->getAntiFreezePos + && $FHEM::Automation::ShuttersControl::shutters->getLastDrive eq + 'manual' ) { return 0; } - elsif ( ( int( gettimeofday() ) - $FHEM::Automation::ShuttersControl::shutters->getLastManPosTimestamp ) < - $FHEM::Automation::ShuttersControl::shutters->getBlockingTimeAfterManual ) + elsif ( + ( + int( gettimeofday() ) - + $FHEM::Automation::ShuttersControl::shutters->getLastManPosTimestamp + ) < + $FHEM::Automation::ShuttersControl::shutters->getBlockingTimeAfterManual + ) { return 0; } @@ -915,13 +1096,13 @@ sub IsAfterShuttersManualBlocking { sub makeReadingName { my ($rname) = shift; my %charHash = ( - chr(0xe4) => "ae", # ä - chr(0xc4) => "Ae", # Ä - chr(0xfc) => "ue", # ü - chr(0xdc) => "Ue", # Ü - chr(0xf6) => "oe", # ö - chr(0xd6) => "Oe", # Ö - chr(0xdf) => "ss" # ß + chr(0xe4) => "ae", # ä + chr(0xc4) => "Ae", # Ä + chr(0xfc) => "ue", # ü + chr(0xdc) => "Ue", # Ü + chr(0xf6) => "oe", # ö + chr(0xd6) => "Oe", # Ö + chr(0xdf) => "ss" # ß ); my $charHashkeys = join( "", keys(%charHash) ); @@ -975,7 +1156,4 @@ sub IsAdv { return $adv; } - - - 1; diff --git a/lib/FHEM/Automation/ShuttersControl/Shading.pm b/lib/FHEM/Automation/ShuttersControl/Shading.pm index af1b2fa..a4351b1 100644 --- a/lib/FHEM/Automation/ShuttersControl/Shading.pm +++ b/lib/FHEM/Automation/ShuttersControl/Shading.pm @@ -46,19 +46,19 @@ use POSIX qw(strftime); use utf8; require Exporter; -our @ISA = qw(Exporter); -our @EXPORT_OK = qw( - CheckASC_ConditionsForShadingFn - ShadingProcessing - ShadingProcessingDriveCommand +our @ISA = qw(Exporter); +our @EXPORT_OK = qw( + CheckASC_ConditionsForShadingFn + ShadingProcessing + ShadingProcessingDriveCommand ); -our %EXPORT_TAGS = ( +our %EXPORT_TAGS = ( ALL => [ qw( - CheckASC_ConditionsForShadingFn - ShadingProcessing - ShadingProcessingDriveCommand - ) + CheckASC_ConditionsForShadingFn + ShadingProcessing + ShadingProcessingDriveCommand + ) ], ); @@ -76,7 +76,7 @@ BEGIN { readingsBulkUpdateIfChanged readingsEndUpdate defs - ) + ) ); } @@ -89,7 +89,8 @@ sub CheckASC_ConditionsForShadingFn { ' no valid data from the ASC temperature sensor, is ASC_tempSensor attribut set?' if ( $FHEM::Automation::ShuttersControl::ascDev->getOutTemp == -100 ); $error .= ' no twilight device found' - if ( $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice eq 'none' ); + if ( $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice eq + 'none' ); my $count = 1; for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { @@ -121,7 +122,8 @@ sub _CheckShuttersConditionsForShadingFn { $infoMessage .= ( $FHEM::Automation::ShuttersControl::shutters->getShadingMode ne 'off' - && $FHEM::Automation::ShuttersControl::ascDev->getAutoShuttersControlShading eq 'on' + && $FHEM::Automation::ShuttersControl::ascDev + ->getAutoShuttersControlShading eq 'on' && $FHEM::Automation::ShuttersControl::shutters->getOutTemp == -100 ? ' shading active, global temp sensor is set, but shutters temperature sensor is not set' : '' @@ -129,15 +131,18 @@ sub _CheckShuttersConditionsForShadingFn { $warnMessage .= ( $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq 'off' - && $FHEM::Automation::ShuttersControl::ascDev->getAutoShuttersControlShading eq 'on' + && $FHEM::Automation::ShuttersControl::ascDev + ->getAutoShuttersControlShading eq 'on' ? ' global shading active but ASC_Shading_Mode attribut is not set or off' : '' ); $errorMessage .= ( $FHEM::Automation::ShuttersControl::shutters->getShadingMode ne 'off' - && $FHEM::Automation::ShuttersControl::ascDev->getAutoShuttersControlShading ne 'on' - && $FHEM::Automation::ShuttersControl::ascDev->getAutoShuttersControlShading ne 'off' + && $FHEM::Automation::ShuttersControl::ascDev + ->getAutoShuttersControlShading ne 'on' + && $FHEM::Automation::ShuttersControl::ascDev + ->getAutoShuttersControlShading ne 'off' ? ' ASC_Shading_Mode attribut is set but global shading has errors, look at ASC device ' . 'getShadingPos; - my $getStatus = $FHEM::Automation::ShuttersControl::shutters->getStatus; - my $oldShadingStatus = $FHEM::Automation::ShuttersControl::shutters->getShadingStatus; - my $shuttersDevHash = $defs{$shuttersDev}; + 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; @@ -254,12 +282,14 @@ sub ShadingProcessing { if ( ( - $outTemp < $FHEM::Automation::ShuttersControl::shutters->getShadingMinOutsideTemperature - 4 + $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->getShadingStatus ne + 'out' ) { $FHEM::Automation::ShuttersControl::shutters->setShadingStatus('out'); @@ -275,24 +305,36 @@ sub ShadingProcessing { } 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 ) + || $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' ); + $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->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->setShadingStatus( + 'out'); } Log3( $name, 4, @@ -301,35 +343,52 @@ sub ShadingProcessing { . " In der Out Abfrage, Shadingwert: " . $FHEM::Automation::ShuttersControl::shutters->getShadingStatus . ", Zeitstempel: " - . $FHEM::Automation::ShuttersControl::shutters->getShadingStatusTimestamp ); + . $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 ); + . $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 ) + && $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' ) + if ( $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq + 'out' + || $FHEM::Automation::ShuttersControl::shutters->getShadingStatus + eq 'out reserved' ) { - $FHEM::Automation::ShuttersControl::shutters->setShadingStatus('in 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 ) ) + 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->setShadingStatus( + 'in'); } Log3( $name, 4, @@ -338,52 +397,75 @@ sub ShadingProcessing { . " In der In Abfrage, Shadingwert: " . $FHEM::Automation::ShuttersControl::shutters->getShadingStatus . ", Zeitstempel: " - . $FHEM::Automation::ShuttersControl::shutters->getShadingStatusTimestamp ); + . $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 ); + . $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::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 '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->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->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 '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' + || $FHEM::Automation::ShuttersControl::shutters->getModeUp eq + 'absent' + || ( $FHEM::Automation::ShuttersControl::shutters->getModeUp eq + 'home' && $homemode ne 'asleep' ) ) && ( ( ( int( gettimeofday() ) - - $FHEM::Automation::ShuttersControl::shutters->getShadingStatusTimestamp + $FHEM::Automation::ShuttersControl::shutters + ->getShadingStatusTimestamp ) < 2 - && $FHEM::Automation::ShuttersControl::shutters->getStatus != $FHEM::Automation::ShuttersControl::shutters->getClosedPos + && $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->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 ) + && $FHEM::Automation::ShuttersControl::shutters->getStatus == + $FHEM::Automation::ShuttersControl::shutters->getShadingPos ) ) ); @@ -392,16 +474,21 @@ sub ShadingProcessing { $shuttersDevHash, 'ASC_ShadingMessage', 'INFO: current shading status is \'' - . $FHEM::Automation::ShuttersControl::shutters->getShadingStatus . '\'' + . $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 + ->getShadingLastStatus eq 'out reserved' + || $FHEM::Automation::ShuttersControl::shutters + ->getShadingLastStatus eq 'out' ) - ? $FHEM::Automation::ShuttersControl::shutters->getShadingWaitingPeriod - : $FHEM::Automation::ShuttersControl::shutters->getShadingWaitingPeriod / 2 + ? $FHEM::Automation::ShuttersControl::shutters + ->getShadingWaitingPeriod + : $FHEM::Automation::ShuttersControl::shutters + ->getShadingWaitingPeriod / 2 ) ) / 60 . 'm' @@ -418,58 +505,82 @@ sub ShadingProcessingDriveCommand { my $name = $hash->{NAME}; $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev); - my $getShadingPos = $FHEM::Automation::ShuttersControl::shutters->getShadingPos; - my $getStatus = $FHEM::Automation::ShuttersControl::shutters->getStatus; + my $getShadingPos = + $FHEM::Automation::ShuttersControl::shutters->getShadingPos; + my $getStatus = $FHEM::Automation::ShuttersControl::shutters->getStatus; - $FHEM::Automation::ShuttersControl::shutters->setShadingStatus( $FHEM::Automation::ShuttersControl::shutters->getShadingStatus ); + $FHEM::Automation::ShuttersControl::shutters->setShadingStatus( + $FHEM::Automation::ShuttersControl::shutters->getShadingStatus ); if ( - $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq 'in' + $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::CheckIfShuttersWindowRecOpen( + $shuttersDev) != 2 + || $FHEM::Automation::ShuttersControl::shutters->getShuttersPlace + ne 'terrace' + ) ) { - $FHEM::Automation::ShuttersControl::shutters->setLastDrive('shading in'); - FHEM::Automation::ShuttersControl::ShuttersCommandSet( $hash, $shuttersDev, $getShadingPos ); + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'shading in'); + FHEM::Automation::ShuttersControl::ShuttersCommandSet( $hash, + $shuttersDev, $getShadingPos ); - FHEM::Automation::ShuttersControl::ASC_Debug( 'ShadingProcessingDriveCommand: ' + 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' ); - - $FHEM::Automation::ShuttersControl::shutters - ->setShadingLastPos($getShadingPos); + + $FHEM::Automation::ShuttersControl::shutters->setShadingLastPos( + $getShadingPos); } - elsif ($FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq 'out' + elsif ( + $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq 'out' && $getShadingPos == $getStatus ) { - $FHEM::Automation::ShuttersControl::shutters->setLastDrive('shading out'); + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'shading out'); FHEM::Automation::ShuttersControl::ShuttersCommandSet( $hash, $shuttersDev, ( - ($getShadingPos == $FHEM::Automation::ShuttersControl::shutters->getLastPos - || $getShadingPos == $FHEM::Automation::ShuttersControl::shutters->getShadingLastPos) + ( + $getShadingPos == + $FHEM::Automation::ShuttersControl::shutters->getLastPos + || $getShadingPos == + $FHEM::Automation::ShuttersControl::shutters + ->getShadingLastPos + ) ? $FHEM::Automation::ShuttersControl::shutters->getOpenPos : ( - $FHEM::Automation::ShuttersControl::shutters->getQueryShuttersPos( $FHEM::Automation::ShuttersControl::shutters->getLastPos ) + $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 + ->getLastPos == + $FHEM::Automation::ShuttersControl::shutters + ->getSleepPos + ? $FHEM::Automation::ShuttersControl::shutters + ->getOpenPos + : $FHEM::Automation::ShuttersControl::shutters + ->getLastPos ) : $FHEM::Automation::ShuttersControl::shutters->getOpenPos ) ) - ) - if ( $FHEM::Automation::ShuttersControl::shutters->getIsDay ); + ) if ( $FHEM::Automation::ShuttersControl::shutters->getIsDay ); - FHEM::Automation::ShuttersControl::ASC_Debug( 'ShadingProcessingDriveCommand: ' + FHEM::Automation::ShuttersControl::ASC_Debug( + 'ShadingProcessingDriveCommand: ' . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev . ' - Der aktuelle Beschattungsstatus ist: ' . $FHEM::Automation::ShuttersControl::shutters->getShadingStatus @@ -489,14 +600,15 @@ sub ShadingProcessingDriveCommand { . $FHEM::Automation::ShuttersControl::shutters->getShadingStatus . ', Beschattungsstatus Zeitstempel: ' . strftime( - "%Y.%m.%e %T", localtime( $FHEM::Automation::ShuttersControl::shutters->getShadingStatusTimestamp ) + "%Y.%m.%e %T", + localtime( + $FHEM::Automation::ShuttersControl::shutters + ->getShadingStatusTimestamp + ) ) ); return; } - - - 1;