From a5d1582d5afd79603c1d438f56e4a6096f364d56 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Tue, 2 Jun 2020 14:44:50 +0200 Subject: [PATCH] add ASC device attribut ASC_slatDriveCmdInverse --- 73_AutoShuttersControl.pm | 173 +++++++++++++++++++++++++------------- 1 file changed, 116 insertions(+), 57 deletions(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index 07be0cf..324594b 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -350,6 +350,7 @@ sub Initialize { . 'ASC_expert:1 ' . 'ASC_blockAscDrivesAfterManual:0,1 ' . 'ASC_debug:1 ' + . 'ASC_slatDriveCmdInverse:0,1 ' . $readingFnAttributes; $hash->{NotifyOrderPrefix} = '51-'; # Order Nummer für NotifyFn $hash->{FW_detailFn} = \&ShuttersInformation; @@ -1203,11 +1204,14 @@ sub EventProcessingWindowRec { elsif ( $shutters->getModeDown ne 'absent' && $shutters->getModeDown ne 'off' - && ( ( !$shutters->getIsDay + && ( + ( + !$shutters->getIsDay && $shutters->getModeDown ne 'roommate' - ) + ) || $homemode eq 'asleep' - || $homemode eq 'gotosleep' ) + || $homemode eq 'gotosleep' + ) && $ascDev->getAutoShuttersControlEvening eq 'on' ) { @@ -1542,12 +1546,10 @@ sub EventProcessingResidents { && $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' - ) + || ( $shutters->getShadingMode eq 'absent' + && $shutters->getRoommatesStatus eq 'none' ) + || ( $shutters->getShadingMode eq 'home' + && $shutters->getRoommatesStatus eq 'none' ) ) { if ( @@ -1567,24 +1569,24 @@ sub EventProcessingResidents { $shutters->setSelfDefenseState(1); $shutters->setDriveCmd( $shutters->getClosedPos ); } - elsif ( $shutters->getIsDay - && $shutters->getIfInShading - && $shutters->getShadingMode eq 'absent' - && $shutters->getRoommatesStatus eq 'none' - ) + elsif ($shutters->getIsDay + && $shutters->getIfInShading + && $shutters->getShadingMode eq 'absent' + && $shutters->getRoommatesStatus eq 'none' ) { 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 + 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'); @@ -2288,10 +2290,11 @@ sub EventProcessingShadingBrightness { my $name = $hash->{NAME}; $shutters->setShuttersDev($shuttersDev); my $reading = $shutters->getBrightnessReading; - my $outTemp = - ( $shutters->getOutTemp != -100 + my $outTemp = ( + $shutters->getOutTemp != -100 ? $shutters->getOutTemp - : $ascDev->getOutTemp ); + : $ascDev->getOutTemp + ); Log3( $name, 4, "AutoShuttersControl ($shuttersDev) - EventProcessingShadingBrightness" @@ -4645,32 +4648,62 @@ sub _SetCmdFn { } } - CommandSet( undef, - $shuttersDev - . ':FILTER=' - . $shutters->getPosCmd . '!=' - . $posValue . ' ' - . $driveCommand ); + if ( $ascDev->getSlatDriveCmdInverse ) { + CommandSet( + undef, + ( + $shutters->getSlatDevice ne 'none' + ? $shutters->getSlatDevice + : $shuttersDev + ) + . ' ' + . $shutters->getSlatPosCmd . ' ' + . $slatPos + ) + if ( $slatPos > -1 + && $shutters->getSlatPosCmd ne 'none' ); - InternalTimer( - gettimeofday() + 3, - sub() { - CommandSet( - undef, - ( - $shutters->getSlatDevice ne 'none' - ? $shutters->getSlatDevice - : $shuttersDev - ) - . ' ' - . $shutters->getSlatPosCmd . ' ' - . $slatPos - ); - }, - $shuttersDev - ) - if ( $slatPos > -1 - && $shutters->getSlatPosCmd ne 'none' ); + InternalTimer( + gettimeofday() + 3, + sub() { + CommandSet( undef, + $shuttersDev + . ':FILTER=' + . $shutters->getPosCmd . '!=' + . $posValue . ' ' + . $driveCommand ); + }, + $shuttersDev + ) + if ( $slatPos > -1 + && $shutters->getSlatPosCmd ne 'none' ); + } + else { + CommandSet( undef, + $shuttersDev + . ':FILTER=' + . $shutters->getPosCmd . '!=' + . $posValue . ' ' + . $driveCommand ); + + InternalTimer( + gettimeofday() + 3, + sub() { + CommandSet( + undef, + ( + $shutters->getSlatDevice ne 'none' + ? $shutters->getSlatDevice + : $shuttersDev + ) + . ' ' + . $shutters->getSlatPosCmd . ' ' + . $slatPos + ); + }, + $shuttersDev + ); + } $shutters->setSelfDefenseAbsent( 0, 0 ) if (!$shutters->getSelfDefenseAbsent @@ -8371,6 +8404,14 @@ sub getFreezeTemp { return AttrVal( $name, 'ASC_freezeTemp', 3 ); } +sub getSlatDriveCmdInverse { + my $self = shift; + + my $name = $self->{name}; + + return AttrVal( $name, 'ASC_slatDriveCmdInverse', 0 ); +} + sub _getTempSensor { my $self = shift; @@ -9507,11 +9548,29 @@ sub getBlockAscDrivesAfterManual { PosCmdwelches Kommando wird zum fahren der Rollos verwendet (pct, position?) OpenPosPosition für Rollo ganz auf OpenPositionAssignmentSlat-Position für Rollo ganz auf - VentilatePos - VentilatePositionAssignment - VentilatePosAfterDayClosed - ClosedPos - ClosedPositionAssignment + VentilatePosLüften Position + VentilatePositionAssignmentLüften Slat-Position + VentilatePosAfterDayClosedPosition des Rollos beim schließen des Fensters am Tag + ClosedPosPosition für Rollo ganz geschlossen + ClosedPositionAssignmentSlat-Position für Rollo ganz geschlossen + SleepPosPosition für schlafen + SleepPositionAssignmentSlat-Position für schlafen + VentilateOpenLüften aktiv? + ComfortOpenPosComfort Position + ComfortOpenPositionAssignmentSlat-Comfort Position + PartyModeAbfrage Party Mode + RoommatesAbfrage Roommates / Antwort als String + RoommatesReadingRoommates Reading + RoommatesStatusRoommates Status unter Berücksichtigung aller Roommates und dessen Status + RoommatesLastStatusRoommates letzter Status unter Berücksichtigung aller Roommates und dessen letzten Status + WindPosRollo Position bei Windtrigger + WindMaxWert über dem die Windprotection aktiviert werden soll + WindMinWert unter dem die Windprotection aufgehoben werden soll + WindProtectionWindprotection soll aktiv sein oder nicht + WindProtectionStatusaktueller Status der WindProtection + RainProtectionRain Protection soll aktiv sein oder nicht + RainProtectionStatusaktueller Staus der Rain Protection +