From 1a2b8f52cdb29ccb0f4bcf8e2c171ba80ad92cbd Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Mon, 11 May 2020 18:57:22 +0200 Subject: [PATCH] roleback to 0.6.x version --- 73_AutoShuttersControl.pm | 690 ++++++++++++-------------------------- 1 file changed, 206 insertions(+), 484 deletions(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index 807bf65..2db45a0 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -33,7 +33,7 @@ # GNU General Public License for more details. # # -# $Id$ +# $Id: 73_AutoShuttersControl.pm 21670 2020-04-14 10:09:09Z CoolTux $ # ############################################################################### @@ -202,7 +202,7 @@ my %userAttrList = ( => '-', 'ASC_Open_Pos:0,10,20,30,40,50,60,70,80,90,100' => [ '', 0, 100 ], 'ASC_Closed_Pos:0,10,20,30,40,50,60,70,80,90,100' => [ '', 100, 0 ], - 'ASC_Sleep_Pos:0,10,20,30,40,50,60,70,80,90,100' => [ '', -1, -1 ], + 'ASC_Sleep_Pos:0,10,20,30,40,50,60,70,80,90,100' => '-', 'ASC_Pos_Reading' => [ '', 'position', 'pct' ], 'ASC_Time_Up_Early' => '-', 'ASC_Time_Up_Late' => '-', @@ -211,8 +211,8 @@ my %userAttrList = ( 'ASC_Time_Down_Late' => '-', 'ASC_PrivacyUpValue_beforeDayOpen' => '-', 'ASC_PrivacyDownValue_beforeNightClose' => '-', - 'ASC_PrivacyUp_Pos' => [ '', 50, 50 ], - 'ASC_PrivacyDown_Pos' => [ '', 50, 50 ], + 'ASC_PrivacyUp_Pos' => '-', + 'ASC_PrivacyDown_Pos' => '-', 'ASC_TempSensor' => '-', 'ASC_Ventilate_Window_Open:on,off' => '-', 'ASC_LockOut:soft,hard,off' => '-', @@ -252,8 +252,7 @@ my %userAttrList = ( 'ASC_WindProtection:on,off' => '-', 'ASC_RainProtection:on,off' => '-', 'ASC_ExternalTrigger' => '-', - 'ASC_Adv:on,off' => '-', - 'ASC_SlatPosCmd_SlatDevice' => '-', + 'ASC_Adv:on,off' => '-' ); my %posSetCmds = ( @@ -412,15 +411,15 @@ sub Notify { if ( ( grep m{^DEFINED.$name$}xms, - @{$events} && $devname eq 'global' && $init_done + @{$events} and $devname eq 'global' and $init_done ) - || ( + or ( grep m{^INITIALIZED$}xms, @{$events} or grep m{^REREADCFG$}xms, @{$events} or grep m{^MODIFIED.$name$}xms, @{$events} ) - && $devname eq 'global' + and $devname eq 'global' ) { readingsSingleUpdate( $hash, 'partyMode', 'off', 0 ) @@ -457,7 +456,7 @@ sub Notify { } return unless ( ref( $hash->{helper}{shuttersList} ) eq 'ARRAY' - && scalar( @{ $hash->{helper}{shuttersList} } ) > 0 ); + and scalar( @{ $hash->{helper}{shuttersList} } ) > 0 ); my $posReading = $shutters->getPosCmd; @@ -491,7 +490,7 @@ m{^(ATTR|DELETEATTR)\s(.*ASC_Time_Up_WE_Holiday|.*ASC_Up|.*ASC_Down|.*ASC_AutoAs EventProcessingGeneral( $hash, undef, join( ' ', @{$events} ) ); } } - elsif ( grep m{^($posReading):\s\d{1,3}$}xms, @{$events} ) { + elsif ( grep m{^($posReading):\s\d+$}xms, @{$events} ) { ASC_Debug( 'Notify: ' . ' ASC_Pos_Reading Event vom Rollo wurde erkannt ' . ' - RECEIVED EVENT: ' @@ -780,10 +779,9 @@ sub ShuttersDeviceScan { $shutters->setShadingStatus( ( $shutters->getStatus != $shutters->getShadingPos ? 'out' : 'in' ) ); - -# $shutters->setShadingLastStatus( -# ( $shutters->getStatus != $shutters->getShadingPos ? 'in' : 'out' ) -# ); + $shutters->setShadingLastStatus( + ( $shutters->getStatus != $shutters->getShadingPos ? 'in' : 'out' ) + ); $shutters->setPushBrightnessInArray( $shutters->getBrightness ); readingsSingleUpdate( $defs{$_}, 'ASC_Enable', 'on', 0 ) if ( ReadingsVal( $_, 'ASC_Enable', 'none' ) eq 'none' ); @@ -1234,7 +1232,7 @@ sub EventProcessingRoommate { $shutters->setLastDrive('shading in'); $posValue = $shutters->getShadingPos; } - elsif ( !$shutters->getIfInShading ) { + else { $shutters->setLastDrive('roommate awoken'); $posValue = $shutters->getOpenPos; } @@ -2346,9 +2344,6 @@ sub ShadingProcessing { my $getStatus = $shutters->getStatus; my $oldShadingStatus = $shutters->getShadingStatus; - my $getModeUp = $shutters->getModeUp; - my $homemode = $shutters->getHomemode; - ASC_Debug( 'ShadingProcessing: ' . $shutters->getShuttersDev . ' - Alle Werte für die weitere Verarbeitung sind korrekt vorhanden und es wird nun mit der Beschattungsverarbeitung begonnen' @@ -2364,7 +2359,7 @@ sub ShadingProcessing { && $shutters->getShadingStatus ne 'out' ) { - # $shutters->setShadingLastStatus('in'); + $shutters->setShadingLastStatus('in'); $shutters->setShadingStatus('out'); ASC_Debug( 'ShadingProcessing: ' @@ -2396,9 +2391,8 @@ sub ShadingProcessing { ) { $shutters->setShadingStatus('out'); - - # $shutters->setShadingLastStatus('in') - # if ( $shutters->getShadingLastStatus eq 'out' ); + $shutters->setShadingLastStatus('in') + if ( $shutters->getShadingLastStatus eq 'out' ); } Log3( $name, 4, @@ -2433,9 +2427,8 @@ sub ShadingProcessing { ( $shutters->getShadingWaitingPeriod / 2 ) ) { $shutters->setShadingStatus('in'); - - # $shutters->setShadingLastStatus('out') - # if ( $shutters->getShadingLastStatus eq 'in' ); + $shutters->setShadingLastStatus('out') + if ( $shutters->getShadingLastStatus eq 'in' ); } Log3( $name, 4, @@ -2466,17 +2459,9 @@ sub ShadingProcessing { || ( $shutters->getShadingStatus eq 'in' && $shutters->getShadingLastStatus eq 'out' ) ) - && ( $shutters->getShadingMode eq 'always' - || $shutters->getShadingMode eq $homemode ) - && ( $shutters->getModeUp eq 'always' - || $shutters->getModeUp eq $homemode - || $shutters->getModeUp eq 'off' ) - && ( - ( int( gettimeofday() ) - $shutters->getShadingStatusTimestamp ) < 2 - || ( !$shutters->getQueryShuttersPos( $shutters->getShadingPos ) - && $shutters->getIfInShading - && $shutters->getStatus != $shutters->getShadingPos ) - ) + && $shutters->getRoommatesStatus ne 'asleep' + && $shutters->getRoommatesStatus ne 'gotosleep' + && ( int( gettimeofday() ) - $shutters->getShadingStatusTimestamp ) < 2 ); return; @@ -2492,72 +2477,79 @@ sub ShadingProcessingDriveCommand { my $getShadingPos = $shutters->getShadingPos; my $getStatus = $shutters->getStatus; - $shutters->setShadingStatus( $shutters->getShadingStatus ); + my $homemode = $shutters->getRoommatesStatus; + $homemode = $ascDev->getResidentsStatus if ( $homemode eq 'none' ); - if ( - $shutters->getShadingStatus eq 'in' - && $getShadingPos != $getStatus - && ( CheckIfShuttersWindowRecOpen($shuttersDev) != 2 - || $shutters->getShuttersPlace ne 'terrace' ) - ) + if ( $shutters->getShadingMode eq 'always' + || $shutters->getShadingMode eq $homemode ) { - $shutters->setLastDrive('shading in'); - ShuttersCommandSet( $hash, $shuttersDev, $getShadingPos ); + $shutters->setShadingStatus( $shutters->getShadingStatus ); - ASC_Debug( 'ShadingProcessingDriveCommand: ' - . $shutters->getShuttersDev - . ' - Der aktuelle Beschattungsstatus ist: ' - . $shutters->getShadingStatus - . ' und somit wird nun in die Position: ' - . $getShadingPos - . ' zum Beschatten gefahren' ); - } - elsif ($shutters->getShadingStatus eq 'out' - && $getShadingPos == $getStatus ) - { - $shutters->setLastDrive('shading out'); - - ShuttersCommandSet( - $hash, - $shuttersDev, - ( - $getShadingPos == $shutters->getLastPos - ? $shutters->getOpenPos - : ( - $shutters->getQueryShuttersPos( $shutters->getLastPos ) - ? ( - $shutters->getLastPos == $shutters->getSleepPos - ? $shutters->getOpenPos - : $shutters->getLastPos - ) - : $shutters->getOpenPos - ) - ) - ); - - ASC_Debug( 'ShadingProcessingDriveCommand: ' - . $shutters->getShuttersDev - . ' - Der aktuelle Beschattungsstatus ist: ' - . $shutters->getShadingStatus - . ' und somit wird nun in die Position: ' - . $getShadingPos - . ' zum beenden der Beschattung gefahren' ); - } - - Log3( $name, 4, -"AutoShuttersControl ($name) - Shading Processing - In der Routine zum fahren der Rollläden, Shading Wert: " - . $shutters->getShadingStatus ); - - ASC_Debug( - 'ShadingProcessingDriveCommand: ' - . $shutters->getShuttersDev - . ' - Der aktuelle Beschattungsstatus ist: ' - . $shutters->getShadingStatus - . ', Beschattungsstatus Zeitstempel: ' - . strftime( - "%Y.%m.%e %T", localtime( $shutters->getShadingStatusTimestamp ) + if ( + $shutters->getShadingStatus eq 'in' + && $getShadingPos != $getStatus + && ( CheckIfShuttersWindowRecOpen($shuttersDev) != 2 + || $shutters->getShuttersPlace ne 'terrace' ) ) - ); + { + $shutters->setLastDrive('shading in'); + ShuttersCommandSet( $hash, $shuttersDev, $getShadingPos ); + + ASC_Debug( 'ShadingProcessingDriveCommand: ' + . $shutters->getShuttersDev + . ' - Der aktuelle Beschattungsstatus ist: ' + . $shutters->getShadingStatus + . ' und somit wird nun in die Position: ' + . $getShadingPos + . ' zum Beschatten gefahren' ); + } + elsif ($shutters->getShadingStatus eq 'out' + && $getShadingPos == $getStatus ) + { + $shutters->setLastDrive('shading out'); + + ShuttersCommandSet( + $hash, + $shuttersDev, + ( + $getShadingPos == $shutters->getLastPos + ? $shutters->getOpenPos + : ( + $shutters->getQueryShuttersPos( $shutters->getLastPos ) + ? ( + $shutters->getLastPos == $shutters->getSleepPos + ? $shutters->getOpenPos + : $shutters->getLastPos + ) + : $shutters->getOpenPos + ) + ) + ); + + ASC_Debug( 'ShadingProcessingDriveCommand: ' + . $shutters->getShuttersDev + . ' - Der aktuelle Beschattungsstatus ist: ' + . $shutters->getShadingStatus + . ' und somit wird nun in die Position: ' + . $getShadingPos + . ' zum beenden der Beschattung gefahren' ); + } + + Log3( $name, 4, +"AutoShuttersControl ($name) - Shading Processing - In der Routine zum fahren der Rollläden, Shading Wert: " + . $shutters->getShadingStatus ); + + ASC_Debug( + 'ShadingProcessingDriveCommand: ' + . $shutters->getShuttersDev + . ' - Der aktuelle Beschattungsstatus ist: ' + . $shutters->getShadingStatus + . ', Beschattungsstatus Zeitstempel: ' + . strftime( + "%Y.%m.%e %T", localtime( $shutters->getShadingStatusTimestamp ) + ) + ); + } return; } @@ -2782,48 +2774,47 @@ sub ShuttersCommandSet { if ( ( - # $posValue == $shutters->getShadingPos && - CheckIfShuttersWindowRecOpen($shuttersDev) == 2 + $posValue == $shutters->getShadingPos + && CheckIfShuttersWindowRecOpen($shuttersDev) == 2 && $shutters->getShuttersPlace eq 'terrace' && ( $shutters->getLockOut eq 'soft' || $shutters->getLockOut eq 'hard' ) && !$shutters->getQueryShuttersPos($posValue) ) || ( - # $posValue != $shutters->getShadingPos - # && ( - ( - $shutters->getPartyMode eq 'on' - && $ascDev->getPartyMode eq 'on' + $posValue != $shutters->getShadingPos + && ( + ( + $shutters->getPartyMode eq 'on' + && $ascDev->getPartyMode eq 'on' + ) + || ( + CheckIfShuttersWindowRecOpen($shuttersDev) == 2 + && $shutters->getSubTyp eq 'threestate' + && ( $ascDev->getAutoShuttersControlComfort eq 'off' + || $shutters->getComfortOpenPos != $posValue ) + && $shutters->getVentilateOpen eq 'on' + && $shutters->getShuttersPlace eq 'window' + && $shutters->getLockOut ne 'off' + ) + || ( CheckIfShuttersWindowRecOpen($shuttersDev) == 2 + && $shutters->getSubTyp eq 'threestate' + && $ascDev->getAutoShuttersControlComfort eq 'on' + && $shutters->getVentilateOpen eq 'off' + && $shutters->getShuttersPlace eq 'window' + && $shutters->getLockOut ne 'off' ) + || ( + CheckIfShuttersWindowRecOpen($shuttersDev) == 2 + && ( $shutters->getLockOut eq 'soft' + || $shutters->getLockOut eq 'hard' ) + && !$shutters->getQueryShuttersPos($posValue) + ) + || ( CheckIfShuttersWindowRecOpen($shuttersDev) == 2 + && $shutters->getShuttersPlace eq 'terrace' + && !$shutters->getQueryShuttersPos($posValue) ) + || ( $shutters->getRainProtectionStatus eq 'protected' + && $shutters->getWindProtectionStatus eq 'protected' ) ) - || ( - CheckIfShuttersWindowRecOpen($shuttersDev) == 2 - && $shutters->getSubTyp eq 'threestate' - && ( $ascDev->getAutoShuttersControlComfort eq 'off' - || $shutters->getComfortOpenPos != $posValue ) - && $shutters->getVentilateOpen eq 'on' - && $shutters->getShuttersPlace eq 'window' - && $shutters->getLockOut ne 'off' - ) - || ( CheckIfShuttersWindowRecOpen($shuttersDev) == 2 - && $shutters->getSubTyp eq 'threestate' - && $ascDev->getAutoShuttersControlComfort eq 'on' - && $shutters->getVentilateOpen eq 'off' - && $shutters->getShuttersPlace eq 'window' - && $shutters->getLockOut ne 'off' ) - || ( - CheckIfShuttersWindowRecOpen($shuttersDev) == 2 - && ( $shutters->getLockOut eq 'soft' - || $shutters->getLockOut eq 'hard' ) - && !$shutters->getQueryShuttersPos($posValue) - ) - || ( CheckIfShuttersWindowRecOpen($shuttersDev) == 2 - && $shutters->getShuttersPlace eq 'terrace' - && !$shutters->getQueryShuttersPos($posValue) ) - || ( $shutters->getRainProtectionStatus eq 'protected' - && $shutters->getWindProtectionStatus eq 'protected' ) - - # ) ) ) { @@ -4347,29 +4338,6 @@ sub IsWe { return main::IsWe( shift, shift ); } -sub _DetermineSlatCmd { - my $value = shift; - my $posValue = shift; - - return $posValue == $shutters->getShadingPos - && $shutters->getShadingPositionAssignment ne 'none' ? $shutters->getShadingPositionAssignment - : $posValue == $shutters->getVentilatePos - && $shutters->getVentilatePositionAssignment ne 'none' ? $shutters->getVentilatePositionAssignment - : $posValue == $shutters->getOpenPos - && $shutters->getOpenPositionAssignment ne 'none' ? $shutters->getOpenPositionAssignment - : $posValue == $shutters->getClosedPos - && $shutters->getClosedPositionAssignment ne 'none' ? $shutters->getClosedPositionAssignment - : $posValue == $shutters->getSleepPos - && $shutters->getSleepPositionAssignment ne 'none' ? $shutters->getSleepPositionAssignment - : $posValue == $shutters->getComfortOpenPos - && $shutters->getComfortOpenPositionAssignment ne 'none' ? $shutters->getComfortOpenPositionAssignment - : $posValue == $shutters->getPrivacyUpPos - && $shutters->getPrivacyUpPositionAssignment ne 'none' ? $shutters->getPrivacyUpPositionAssignment - : $posValue == $shutters->getPrivacyDownPos - && $shutters->getPrivacyDownPositionAssignment ne 'none' ? $shutters->getPrivacyDownPositionAssignment - : $value; -} - sub _SetCmdFn { my $h = shift; @@ -4382,7 +4350,6 @@ sub _SetCmdFn { my $idleDetectionValue = $shutters->getIdleDetectionValue; my $idleDetection = $shutters->getIdleDetection; - return unless ( $shutters->getASCenable eq 'on' @@ -4414,79 +4381,13 @@ sub _SetCmdFn { . '. Grund der Fahrt: ' . $shutters->getLastDrive ); - my $driveCommand = $shutters->getPosSetCmd . ' ' . $posValue; - my $slatPos = -1; - - if ( $shutters->getShadingPositionAssignment ne 'none' - || $shutters->getOpenPositionAssignment ne 'none' - || $shutters->getClosedPositionAssignment ne 'none' - || $shutters->getPrivacyUpPositionAssignment ne 'none' - || $shutters->getPrivacyDownPositionAssignment ne 'none' - || $shutters->getSleepPositionAssignment ne 'none' - || $shutters->getVentilatePositionAssignment ne 'none' - || $shutters->getComfortOpenPositionAssignment ne 'none' ) - { - if ( - ( - $shutters->getShadingPositionAssignment =~ m{\A[a-zA-Z]+\z}xms - && $shutters->getShadingPositionAssignment ne 'none' - ) - || ( $shutters->getOpenPositionAssignment =~ m{\A[a-zA-Z]+\z}xms - && $shutters->getOpenPositionAssignment ne 'none' ) - || ( $shutters->getClosedPositionAssignment =~ m{\A[a-zA-Z]+\z}xms - && $shutters->getClosedPositionAssignment ne 'none' ) - || ( - $shutters->getPrivacyUpPositionAssignment =~ m{\A[a-zA-Z]+\z}xms - && $shutters->getPrivacyUpPositionAssignment ne 'none' ) - || ( $shutters->getPrivacyDownPositionAssignment =~ - m{\A[a-zA-Z]+\z}xms - && $shutters->getPrivacyDownPositionAssignment ne 'none' ) - || ( $shutters->getSleepPositionAssignment =~ m{\A[a-zA-Z]+\z}xms - && $shutters->getSleepPositionAssignment ne 'none' ) - || ( - $shutters->getVentilatePositionAssignment =~ m{\A[a-zA-Z]+\z}xms - && $shutters->getVentilatePositionAssignment ne 'none' ) - || ( $shutters->getComfortOpenPositionAssignment =~ - m{\A[a-zA-Z]+\z}xms - && $shutters->getComfortOpenPositionAssignment ne 'none' ) - ) - { - $driveCommand = _DetermineSlatCmd( $driveCommand, $posValue ); - } - elsif ($shutters->getShadingPositionAssignment =~ m{\A\d{1,3}\z}xms - || $shutters->getOpenPositionAssignment =~ m{\A\d{1,3}\z}xms - || $shutters->getClosedPositionAssignment =~ m{\A\d{1,3}\z}xms - || $shutters->getPrivacyUpPositionAssignment =~ m{\A\d{1,3}\z}xms - || $shutters->getPrivacyDownPositionAssignment =~ m{\A\d{1,3}\z}xms - || $shutters->getSleepPositionAssignment =~ m{\A\d{1,3}\z}xms - || $shutters->getVentilatePositionAssignment =~ m{\A\d{1,3}\z}xms - || $shutters->getComfortOpenPositionAssignment =~ - m{\A\d{1,3}\z}xms ) - { - $slatPos = _DetermineSlatCmd( $slatPos, $posValue ); - } - } - CommandSet( undef, $shuttersDev . ':FILTER=' . $shutters->getPosCmd . '!=' . $posValue . ' ' - . $driveCommand ); - - CommandSet( - undef, - ( - $shutters->getSlatDevice ne 'none' - ? $shutters->getSlatDevice - : $shuttersDev - ) - . ' ' - . $shutters->getSlatPosCmd . ' ' - . $slatPos - ) - if ( $slatPos > -1 - && $shutters->getSlatPosCmd ne 'none' ); + . $shutters->getPosSetCmd . ' ' + . $posValue ); $shutters->setSelfDefenseAbsent( 0, 0 ) if (!$shutters->getSelfDefenseAbsent @@ -4534,7 +4435,7 @@ sub _perlCodeCheck { my $exec = shift; my $val = undef; - if ( $exec =~ m{\A\{(.+)\}\z}xms ) { + if ( $exec =~ m{^\{(.+)\}$}xms ) { $val = main::AnalyzePerlCommand( undef, $1 ); } @@ -5071,15 +4972,6 @@ sub setAdvDelay { return; } -sub getHomemode { - my $self = shift; - - my $homemode = $shutters->getRoommatesStatus; - $homemode = $ascDev->getResidentsStatus - if ( $homemode eq 'none' ); - return $homemode; -} - sub getAdvDelay { my $self = shift; @@ -5398,10 +5290,6 @@ sub setShadingStatus { && exists( $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} ) && $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} eq $value ); - $shutters->setShadingLastStatus( ( $value eq 'in' ? 'out' : 'in' ) ) - if ( $value eq 'in' - || $value eq 'out' ); - $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} = $value if ( defined($value) ); $self->{ $self->{shuttersDev} }{ShadingStatus}{TIME} = int( gettimeofday() ) @@ -5626,125 +5514,26 @@ BEGIN { ); } -sub _getPosition { - my $self = shift; - - my $attr = shift; - my $userAttrList = shift; - - return $self->{ $self->{shuttersDev} }->{$attr}->{position} - if ( - exists( $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} ) < 2 - ); - $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} = - int( gettimeofday() ); - - my $position; - my $posAssignment; - - if ( - AttrVal( $self->{shuttersDev}, $attr, - $userAttrList{$userAttrList} - [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] ) =~ - m{\A\{.+\}\z}xms - ) - { - my $response = FHEM::AutoShuttersControl::_perlCodeCheck( - AttrVal( - $self->{shuttersDev}, - $attr, - $userAttrList{$userAttrList} - [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] - ) - ); - - ( $position, $posAssignment ) = split ':', $response; - - $position = ( - $position =~ m{\A\d+(\.\d+)?\z}xms - ? $position - : $userAttrList{$userAttrList} - [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] - ); - - $posAssignment = ( - $posAssignment =~ m{\A\d+(\.\d+)?\z}xms - ? $posAssignment - : 'none' - ); - } - else { - ( $position, $posAssignment ) = - FHEM::AutoShuttersControl::GetAttrValues( - $self->{shuttersDev}, - $attr, - $userAttrList{$userAttrList} - [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] - ); - } - - ### erwartetes Ergebnis - # DEVICE:READING - $self->{ $self->{shuttersDev} }->{$attr}->{position} = $position; - $self->{ $self->{shuttersDev} }->{$attr}->{posAssignment} = - $posAssignment; - - return $self->{ $self->{shuttersDev} }->{$attr}->{position}; - - if ( - defined( - FHEM::AutoShuttersControl::_perlCodeCheck( - $self->{ $self->{shuttersDev} }->{$attr}->{position} - ) - ) - ) - { - $self->{ $self->{shuttersDev} }->{$attr}->{position} = - FHEM::AutoShuttersControl::_perlCodeCheck( - $self->{ $self->{shuttersDev} }->{$attr}->{position} ); - } - - return ( - $self->{ $self->{shuttersDev} }->{$attr}->{position} =~ - m{^\d+(\.\d+)?$}xms - ? $self->{ $self->{shuttersDev} }->{$attr}->{position} - : $userAttrList{$userAttrList} - [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] - ); -} - -sub _getPositionAssignment { - my $self = shift; - - my $attr = shift; - my $getFn = shift; - - return $self->{ $self->{shuttersDev} }->{$attr}->{posAssignment} - if ( - exists( $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} ) < 2 - ); - $shutters->$getFn; - - return ( $self->{ $self->{shuttersDev} }->{$attr}->{posAssignment} ); -} - sub getAntiFreezePos { my $self = shift; - return $shutters->_getPosition( 'ASC_Antifreeze_Pos', + my $val = AttrVal( + $self->{shuttersDev}, + 'ASC_Antifreeze_Pos', + $userAttrList{ 'ASC_Antifreeze_Pos:5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100' + }[ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] ); -} -sub getAntiFreezePosAssignment { - my $self = shift; + if ( defined( FHEM::AutoShuttersControl::_perlCodeCheck($val) ) ) { + $val = FHEM::AutoShuttersControl::_perlCodeCheck($val); + } - return $shutters->_getPositionAssignment( 'ASC_Antifreeze_Pos', - 'getAntiFreezePos' ); + return ( + $val =~ m{^\d+(\.\d+)?$}xms ? $val : $userAttrList{ +'ASC_Antifreeze_Pos:5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100' + }[ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] + ); } sub getShuttersPlace { @@ -5753,59 +5542,6 @@ sub getShuttersPlace { return AttrVal( $self->{shuttersDev}, 'ASC_ShuttersPlace', 'window' ); } -sub getSlatPosCmd { - my $self = shift; - - return $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice} - ->{poscmd} - if ( - exists( - $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice} - ->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice} - ->{LASTGETTIME} ) < 2 - ); - $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}->{LASTGETTIME} - = int( gettimeofday() ); - my ( $slatPosCmd, $slatDevice ) = - FHEM::AutoShuttersControl::GetAttrValues( $self->{shuttersDev}, - 'ASC_SlatPosCmd_SlatDevice', 'none:none' ); - - ## Erwartetes Ergebnis - # upTime:upBrightnessVal - - $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}->{poscmd} = - $slatPosCmd; - $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}->{device} = - $slatDevice; - - return $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice} - ->{poscmd}; -} - -sub getSlatDevice { - my $self = shift; - - return $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice} - ->{device} - if ( - exists( - $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice} - ->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice} - ->{LASTGETTIME} ) < 2 - ); - $shutters->getSlatPosCmd; - - return ( - $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}->{device} - ); -} - sub getPrivacyUpTime { my $self = shift; @@ -5939,28 +5675,25 @@ sub getPrivacyDownBrightnessVal { sub getPrivacyUpPos { my $self = shift; - return $shutters->_getPosition( 'ASC_PrivacyUp_Pos', 'ASC_PrivacyUp_Pos' ); -} + my $val = AttrVal( $self->{shuttersDev}, 'ASC_PrivacyUp_Pos', 50 ); -sub getPrivacyUpPositionAssignment { - my $self = shift; + if ( defined( FHEM::AutoShuttersControl::_perlCodeCheck($val) ) ) { + $val = FHEM::AutoShuttersControl::_perlCodeCheck($val); + } - return $shutters->_getPositionAssignment( 'ASC_PrivacyUp_Pos', - 'getPrivacyUpPos' ); + return ( $val =~ m{^\d+(\.\d+)?$}xms ? $val : 50 ); } sub getPrivacyDownPos { my $self = shift; - return $shutters->_getPosition( 'ASC_PrivacyDown_Pos', - 'ASC_PrivacyDown_Pos' ); -} + my $val = AttrVal( $self->{shuttersDev}, 'ASC_PrivacyDown_Pos', 50 ); -sub getPrivacyDownPositionAssignment { - my $self = shift; + if ( defined( FHEM::AutoShuttersControl::_perlCodeCheck($val) ) ) { + $val = FHEM::AutoShuttersControl::_perlCodeCheck($val); + } - return $shutters->_getPositionAssignment( 'ASC_PrivacyDown_Pos', - 'getPrivacyDownPos' ); + return ( $val =~ m{^\d+(\.\d+)?$}xms ? $val : 50 ); } sub getSelfDefenseMode { @@ -5995,21 +5728,26 @@ sub getAdv { sub getShadingPos { my $self = shift; - return $shutters->_getPosition( 'ASC_Shading_Pos', - 'ASC_Shading_Pos:10,20,30,40,50,60,70,80,90,100' ); -} + my $val = AttrVal( $self->{shuttersDev}, 'ASC_Shading_Pos', + $userAttrList{'ASC_Shading_Pos:10,20,30,40,50,60,70,80,90,100'} + [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] ); -sub getShadingPositionAssignment { - my $self = shift; + if ( defined( FHEM::AutoShuttersControl::_perlCodeCheck($val) ) ) { + $val = FHEM::AutoShuttersControl::_perlCodeCheck($val); + } - return $shutters->_getPositionAssignment( 'ASC_Shading_Pos', - 'getShadingPos' ); + return ( + $val =~ m{^\d+(\.\d+)?$}xms + ? $val + : $userAttrList{'ASC_Shading_Pos:10,20,30,40,50,60,70,80,90,100'} + [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] + ); } sub getShadingMode { my $self = shift; - return AttrVal( $self->{shuttersDev}, 'ASC_Shading_Mode', 'always' ); + return AttrVal( $self->{shuttersDev}, 'ASC_Shading_Mode', 'off' ); } sub _getTempSensor { @@ -6597,36 +6335,34 @@ sub getBlockingTimeBeforDayOpen { sub getPosCmd { my $self = shift; - return AttrVal( $self->{shuttersDev}, 'ASC_Pos_Reading', - $userAttrList{'ASC_Pos_Reading'} - [ AttrVal( $self->{shuttersDev}, 'ASC', 1 ) ] ); + return AttrVal( $self->{shuttersDev}, 'ASC_Pos_Reading', 'pct' ); } sub getOpenPos { my $self = shift; - return $shutters->_getPosition( 'ASC_Open_Pos', - 'ASC_Open_Pos:0,10,20,30,40,50,60,70,80,90,100' ); -} - -sub getOpenPositionAssignment { - my $self = shift; - - return $shutters->_getPositionAssignment( 'ASC_Open_Pos', 'getOpenPos' ); + return AttrVal( $self->{shuttersDev}, 'ASC_Open_Pos', + $userAttrList{'ASC_Open_Pos:0,10,20,30,40,50,60,70,80,90,100'} + [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] ); } sub getVentilatePos { my $self = shift; - return $shutters->_getPosition( 'ASC_Ventilate_Pos', - 'ASC_Ventilate_Pos:10,20,30,40,50,60,70,80,90,100' ); -} + my $val = AttrVal( $self->{shuttersDev}, 'ASC_Ventilate_Pos', + $userAttrList{'ASC_Ventilate_Pos:10,20,30,40,50,60,70,80,90,100'} + [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] ); -sub getVentilatePositionAssignment { - my $self = shift; + if ( defined( FHEM::AutoShuttersControl::_perlCodeCheck($val) ) ) { + $val = FHEM::AutoShuttersControl::_perlCodeCheck($val); + } - return $shutters->_getPositionAssignment( 'ASC_Ventilate_Pos', - 'getVentilatePos' ); + return ( + $val =~ m{^\d+(\.\d+)?$}xms + ? $val + : $userAttrList{'ASC_Ventilate_Pos:10,20,30,40,50,60,70,80,90,100'} + [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] + ); } sub getVentilatePosAfterDayClosed { @@ -6639,28 +6375,21 @@ sub getVentilatePosAfterDayClosed { sub getClosedPos { my $self = shift; - return $shutters->_getPosition( 'ASC_Closed_Pos', - 'ASC_Closed_Pos:0,10,20,30,40,50,60,70,80,90,100' ); -} - -sub getClosedPositionAssignment { - my $self = shift; - - return $shutters->_getPositionAssignment( 'ASC_Closed_Pos', - 'getClosedPos' ); + return AttrVal( $self->{shuttersDev}, 'ASC_Closed_Pos', + $userAttrList{'ASC_Closed_Pos:0,10,20,30,40,50,60,70,80,90,100'} + [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] ); } sub getSleepPos { my $self = shift; - return $shutters->_getPosition( 'ASC_Sleep_Pos', - 'ASC_Sleep_Pos:0,10,20,30,40,50,60,70,80,90,100' ); -} + my $val = AttrVal( $self->{shuttersDev}, 'ASC_Sleep_Pos', -1 ); -sub getSleepPositionAssignment { - my $self = shift; + if ( defined( FHEM::AutoShuttersControl::_perlCodeCheck($val) ) ) { + $val = FHEM::AutoShuttersControl::_perlCodeCheck($val); + } - return $shutters->_getPositionAssignment( 'ASC_Sleep_Pos', 'getSleepPos' ); + return ( $val =~ m{^\d+(\.\d+)?$}xms ? $val : -1 ); } sub getVentilateOpen { @@ -6671,16 +6400,20 @@ sub getVentilateOpen { sub getComfortOpenPos { my $self = shift; + my $val = AttrVal( $self->{shuttersDev}, 'ASC_ComfortOpen_Pos', + $userAttrList{'ASC_ComfortOpen_Pos:0,10,20,30,40,50,60,70,80,90,100'} + [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] ); - return $shutters->_getPosition( 'ASC_ComfortOpen_Pos', - 'ASC_ComfortOpen_Pos:0,10,20,30,40,50,60,70,80,90,100' ); -} + if ( defined( FHEM::AutoShuttersControl::_perlCodeCheck($val) ) ) { + $val = FHEM::AutoShuttersControl::_perlCodeCheck($val); + } -sub getComfortOpenPositionAssignment { - my $self = shift; - - return $shutters->_getPositionAssignment( 'ASC_ComfortOpen_Pos', - 'getComfortOpenPos' ); + return ( + $val =~ m{^\d+(\.\d+)?$}xms + ? $val + : $userAttrList{'ASC_ComfortOpen_Pos:0,10,20,30,40,50,60,70,80,90,100'} + [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] + ); } sub getPartyMode { @@ -8538,22 +8271,11 @@ sub getBlockAscDrivesAfterManual {
  • ASC_BlockingTime_beforDayOpen - wie viel Sekunden vor dem morgendlichen öffnen soll keine schließen Fahrt mehr stattfinden. (default: 3600)
  • ASC_BlockingTime_beforNightClose - wie viel Sekunden vor dem nächtlichen schließen soll keine öffnen Fahrt mehr stattfinden. (default: 3600)
  • ASC_BrightnessSensor - DEVICE[:READING] WERT-MORGENS:WERT-ABENDS / 'Sensorname[:brightness [400:800]]' Angaben zum Helligkeitssensor mit (Readingname, optional) für die Beschattung und dem Fahren der Rollladen nach brightness und den optionalen Brightnesswerten für Sonnenauf- und Sonnenuntergang. (default: none)
  • +
  • ASC_Closed_Pos - in 10 Schritten von 0 bis 100 (Default: ist abhängig vom AttributASC 0/100)
  • +
  • ASC_Open_Pos - in 10 Schritten von 0 bis 100 (default: ist abhängig vom AttributASC 100/0)
  • +
  • ASC_Sleep_Pos - in 10 Schritten von 0 bis 100 (default: ist abhängig vom AttributASC 75/25) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
  • +
  • ASC_ComfortOpen_Pos - in 10 Schritten von 0 bis 100 (Default: ist abhängig vom AttributASC 20/80) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
  • ASC_Down - astro/time/brightness - bei astro wird Sonnenuntergang berechnet, bei time wird der Wert aus ASC_Time_Down_Early als Fahrzeit verwendet und bei brightness muss ASC_Time_Down_Early und ASC_Time_Down_Late korrekt gesetzt werden. Der Timer läuft dann nach ASC_Time_Down_Late Zeit, es wird aber in der Zeit zwischen ASC_Time_Down_Early und ASC_Time_Down_Late geschaut, ob die als Attribut im Moduldevice hinterlegte ASC_brightnessDriveUpDown der Down Wert erreicht wurde. Wenn ja, wird der Rollladen runter gefahren (default: astro)
  • -
  • ASC_Shutter_IdleDetection - READING:VALUE gibt das Reading an welches Auskunft über den Fahrstatus des Rollos gibt, sowie als zweites den Wert im Reading welcher aus sagt das das Rollo nicht fährt
  • ASC_DriveUpMaxDuration - die Dauer des Hochfahrens des Rollladens plus 5 Sekunden (default: 60)
  • ASC_Drive_Delay - maximaler Wert für einen zufällig ermittelte Verzögerungswert in Sekunden bei der Berechnung der Fahrzeiten.
  • @@ -8598,13 +8320,13 @@ sub getBlockAscDrivesAfterManual {
  • ASC_Time_Up_Late - Sonnenaufgang späteste Zeit zum Hochfahren (default: 08:30) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!
  • ASC_Time_Up_WE_Holiday - Sonnenaufgang frühste Zeit zum Hochfahren am Wochenende und/oder Urlaub (holiday2we wird beachtet). (default: 08:00) ACHTUNG!!! in Verbindung mit Brightness für ASC_Up muss die Uhrzeit kleiner sein wie die Uhrzeit aus ASC_Time_Up_Late !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!
  • ASC_Up - astro/time/brightness - bei astro wird Sonnenaufgang berechnet, bei time wird der Wert aus ASC_Time_Up_Early als Fahrzeit verwendet und bei brightness muss ASC_Time_Up_Early und ASC_Time_Up_Late korrekt gesetzt werden. Der Timer läuft dann nach ASC_Time_Up_Late Zeit, es wird aber in der Zeit zwischen ASC_Time_Up_Early und ASC_Time_Up_Late geschaut, ob die als Attribut im Moduldevice hinterlegte Down Wert von ASC_brightnessDriveUpDown erreicht wurde. Wenn ja, wird der Rollladen hoch gefahren (default: astro)
  • +
  • ASC_Ventilate_Pos - in 10 Schritten von 0 bis 100 (default: ist abhängig vom Attribut ASC 70/30) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
  • ASC_Ventilate_Window_Open - auf lüften, wenn das Fenster gekippt/geöffnet wird und aktuelle Position unterhalb der Lüften-Position ist (default: on)
  • ASC_WiggleValue - Wert um welchen sich die Position des Rollladens ändern soll (default: 5)
  • ASC_WindParameters - TRIGGERMAX[:HYSTERESE] [DRIVEPOSITION] / Angabe von Max Wert ab dem für Wind getriggert werden soll, Hytsrese Wert ab dem der Windschutz aufgehoben werden soll TRIGGERMAX - HYSTERESE / Ist es bei einigen Rollläden nicht gewünscht das gefahren werden soll, so ist der TRIGGERMAX Wert mit -1 an zu geben. (default: '50:20 ClosedPosition')
  • ASC_WindowRec_PosAfterDayClosed - open,lastManual / auf welche Position soll das Rollo nach dem schließen am Tag fahren. Open Position oder letzte gespeicherte manuelle Position (default: open)
  • ASC_WindowRec - WINDOWREC:[READING], Name des Fensterkontaktes, an dessen Fenster der Rollladen angebracht ist (default: none). Reading ist optional
  • ASC_WindowRec_subType - Typ des verwendeten Fensterkontaktes: twostate (optisch oder magnetisch) oder threestate (Drehgriffkontakt) (default: twostate)
  • -
  • ASC_SlatPosCmd_SlatDevice - Angaben zu einem Slat (Lamellen) CMD und sofern diese Lamellen über ein anderes Device gesteuert werden zum Slat Device. Beispiel: attr ROLLO ASC_SlatPosCmd_SlatDevice slatPct[:ROLLOSLATDEVICE] [ ] bedeutet optinal. Kann also auch weg gelassen werden. Wenn Ihr das SLAT Device mit angibt dann bitte ohne []. Beispiel: attr ROLLO ASC_SlatPosCmd_SlatDevice slatPct:ROLLOSLATDEVICE. Damit das ganze dann auch greift muss in den 6 Positionsangaben ASC_Open_Pos, ASC_Closed_Pos, ASC_Ventilate_Pos, ASC_ComfortOpen_Pos, ASC_Shading_Pos und ASC_Sleep_Pos ein weiterer Parameter für die Lamellenstellung mit angegeben werden.
  • @@ -8688,7 +8410,7 @@ sub getBlockAscDrivesAfterManual { ], "release_status": "testing", "license": "GPL_2", - "version": "v0.9.9", + "version": "v0.8.27", "author": [ "Marko Oldenburg " ],