testing #94
@@ -1,8 +1,8 @@
 | 
			
		||||
###############################################################################
 | 
			
		||||
#
 | 
			
		||||
# Developed with Kate
 | 
			
		||||
# Developed with VSCodium and richterger perl plugin
 | 
			
		||||
#
 | 
			
		||||
#  (c) 2018-2021 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net)
 | 
			
		||||
#  (c) 2018-2022 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net)
 | 
			
		||||
#  All rights reserved
 | 
			
		||||
#
 | 
			
		||||
#   Special thanks goes to:
 | 
			
		||||
@@ -81,7 +81,7 @@ sub Initialize {
 | 
			
		||||
    $hash->{UndefFn}    = \&FHEM::Automation::ShuttersControl::Undef;
 | 
			
		||||
    $hash->{DeleteFn}   = \&FHEM::Automation::ShuttersControl::Delete;
 | 
			
		||||
    $hash->{ShutdownFn} = \&FHEM::Automation::ShuttersControl::Shutdown;
 | 
			
		||||
    $hash->{AttrList}   =
 | 
			
		||||
    $hash->{AttrList} =
 | 
			
		||||
        'ASC_tempSensor '
 | 
			
		||||
      . 'ASC_brightnessDriveUpDown '
 | 
			
		||||
      . 'ASC_autoShuttersControlMorning:on,off '
 | 
			
		||||
 
 | 
			
		||||
@@ -1,16 +1,16 @@
 | 
			
		||||
UPD 2021-12-06_06:34:51 115678 FHEM/73_AutoShuttersControl.pm
 | 
			
		||||
UPD 2021-11-29_15:01:56 75264 lib/FHEM/Automation/ShuttersControl.pm
 | 
			
		||||
UPD 2021-10-09_07:12:54 2657 lib/FHEM/Automation/ShuttersControl/Dev.pm
 | 
			
		||||
UPD 2021-10-09_07:12:54 2494 lib/FHEM/Automation/ShuttersControl/Roommate.pm
 | 
			
		||||
UPD 2021-10-24_07:33:53 31900 lib/FHEM/Automation/ShuttersControl/Shutters.pm
 | 
			
		||||
UPD 2021-12-11_14:23:02 25126 lib/FHEM/Automation/ShuttersControl/Shading.pm
 | 
			
		||||
UPD 2021-12-11_14:23:02 112344 lib/FHEM/Automation/ShuttersControl/EventProcessingFunctions.pm
 | 
			
		||||
UPD 2021-11-14_14:03:06 40094 lib/FHEM/Automation/ShuttersControl/Helper.pm
 | 
			
		||||
UPD 2021-10-09_07:12:54 2173 lib/FHEM/Automation/ShuttersControl/Window.pm
 | 
			
		||||
UPD 2021-10-09_07:12:54 11739 lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm
 | 
			
		||||
UPD 2021-10-09_07:12:54 7249 lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm
 | 
			
		||||
UPD 2021-10-27_08:50:46 52649 lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm
 | 
			
		||||
UPD 2021-10-09_07:12:54 2901 lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm
 | 
			
		||||
UPD 2021-10-09_07:12:54 3978 lib/FHEM/Automation/ShuttersControl/Window/Attr.pm
 | 
			
		||||
UPD 2021-10-09_07:12:54 2286 lib/FHEM/Automation/ShuttersControl/Window/Readings.pm
 | 
			
		||||
UPD 2021-12-06_06:34:51 6965 lib/FHEM/Automation/ShuttersControl/Rainprotection.pm
 | 
			
		||||
UPD 2022-01-01_08:13:19 115707 FHEM/73_AutoShuttersControl.pm
 | 
			
		||||
UPD 2022-01-01_08:49:52 75212 lib/FHEM/Automation/ShuttersControl.pm
 | 
			
		||||
UPD 2022-01-01_08:30:27 2693 lib/FHEM/Automation/ShuttersControl/Dev.pm
 | 
			
		||||
UPD 2022-01-01_08:47:26 2405 lib/FHEM/Automation/ShuttersControl/Roommate.pm
 | 
			
		||||
UPD 2022-01-01_08:47:58 32020 lib/FHEM/Automation/ShuttersControl/Shutters.pm
 | 
			
		||||
UPD 2022-01-01_08:42:08 25426 lib/FHEM/Automation/ShuttersControl/Shading.pm
 | 
			
		||||
UPD 2022-01-01_08:33:11 112138 lib/FHEM/Automation/ShuttersControl/EventProcessingFunctions.pm
 | 
			
		||||
UPD 2022-01-01_08:37:31 40342 lib/FHEM/Automation/ShuttersControl/Helper.pm
 | 
			
		||||
UPD 2022-01-01_08:49:33 2211 lib/FHEM/Automation/ShuttersControl/Window.pm
 | 
			
		||||
UPD 2022-01-01_08:29:01 11716 lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm
 | 
			
		||||
UPD 2022-01-01_08:28:05 7265 lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm
 | 
			
		||||
UPD 2022-01-01_08:26:38 52775 lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm
 | 
			
		||||
UPD 2022-01-01_08:24:22 2799 lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm
 | 
			
		||||
UPD 2022-01-01_08:23:02 3887 lib/FHEM/Automation/ShuttersControl/Window/Attr.pm
 | 
			
		||||
UPD 2022-01-01_08:20:59 2200 lib/FHEM/Automation/ShuttersControl/Window/Readings.pm
 | 
			
		||||
UPD 2022-01-01_08:38:43 7087 lib/FHEM/Automation/ShuttersControl/Rainprotection.pm
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
###############################################################################
 | 
			
		||||
#
 | 
			
		||||
# Developed with Kate
 | 
			
		||||
# Developed with VSCodium and richterger perl plugin
 | 
			
		||||
#
 | 
			
		||||
#  (c) 2018-2021 Copyright: Marko Oldenburg (fhemsupport@cooltux.net)
 | 
			
		||||
#  (c) 2018-2022 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net)
 | 
			
		||||
#  All rights reserved
 | 
			
		||||
#
 | 
			
		||||
#   Special thanks goes to:
 | 
			
		||||
@@ -76,7 +76,8 @@ use Date::Parse;
 | 
			
		||||
use FHEM::Automation::ShuttersControl::Shutters;
 | 
			
		||||
use FHEM::Automation::ShuttersControl::Dev;
 | 
			
		||||
 | 
			
		||||
use FHEM::Automation::ShuttersControl::Shading qw (CheckASC_ConditionsForShadingFn);
 | 
			
		||||
use FHEM::Automation::ShuttersControl::Shading
 | 
			
		||||
  qw (CheckASC_ConditionsForShadingFn);
 | 
			
		||||
use FHEM::Automation::ShuttersControl::EventProcessingFunctions qw (:ALL);
 | 
			
		||||
use FHEM::Automation::ShuttersControl::Helper qw (:ALL);
 | 
			
		||||
 | 
			
		||||
@@ -86,27 +87,20 @@ eval {
 | 
			
		||||
    require JSON::MaybeXS;
 | 
			
		||||
    import JSON::MaybeXS qw( decode_json encode_json );
 | 
			
		||||
    1;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
if ($@) {
 | 
			
		||||
    $@ = undef;
 | 
			
		||||
} or do {
 | 
			
		||||
 | 
			
		||||
    # try to use JSON wrapper
 | 
			
		||||
    #   for chance of better performance
 | 
			
		||||
    eval {
 | 
			
		||||
 | 
			
		||||
        # JSON preference order
 | 
			
		||||
        local $ENV{PERL_JSON_BACKEND} =
 | 
			
		||||
          'Cpanel::JSON::XS,JSON::XS,JSON::PP,JSON::backportPP'
 | 
			
		||||
          if ( !defined( $ENV{PERL_JSON_BACKEND} ) );
 | 
			
		||||
          unless ( defined( $ENV{PERL_JSON_BACKEND} ) );
 | 
			
		||||
 | 
			
		||||
        require JSON;
 | 
			
		||||
        import JSON qw( decode_json encode_json );
 | 
			
		||||
        1;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    if ($@) {
 | 
			
		||||
        $@ = undef;
 | 
			
		||||
    } or do {
 | 
			
		||||
 | 
			
		||||
        # In rare cases, Cpanel::JSON::XS may
 | 
			
		||||
        #   be installed but JSON|JSON::MaybeXS not ...
 | 
			
		||||
@@ -114,10 +108,7 @@ if ($@) {
 | 
			
		||||
            require Cpanel::JSON::XS;
 | 
			
		||||
            import Cpanel::JSON::XS qw(decode_json encode_json);
 | 
			
		||||
            1;
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        if ($@) {
 | 
			
		||||
            $@ = undef;
 | 
			
		||||
        } or do {
 | 
			
		||||
 | 
			
		||||
            # In rare cases, JSON::XS may
 | 
			
		||||
            #   be installed but JSON not ...
 | 
			
		||||
@@ -125,10 +116,7 @@ if ($@) {
 | 
			
		||||
                require JSON::XS;
 | 
			
		||||
                import JSON::XS qw(decode_json encode_json);
 | 
			
		||||
                1;
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            if ($@) {
 | 
			
		||||
                $@ = undef;
 | 
			
		||||
            } or do {
 | 
			
		||||
 | 
			
		||||
                # Fallback to built-in JSON which SHOULD
 | 
			
		||||
                #   be available since 5.014 ...
 | 
			
		||||
@@ -136,20 +124,17 @@ if ($@) {
 | 
			
		||||
                    require JSON::PP;
 | 
			
		||||
                    import JSON::PP qw(decode_json encode_json);
 | 
			
		||||
                    1;
 | 
			
		||||
                };
 | 
			
		||||
 | 
			
		||||
                if ($@) {
 | 
			
		||||
                    $@ = undef;
 | 
			
		||||
                } or do {
 | 
			
		||||
 | 
			
		||||
                    # Fallback to JSON::backportPP in really rare cases
 | 
			
		||||
                    require JSON::backportPP;
 | 
			
		||||
                    import JSON::backportPP qw(decode_json encode_json);
 | 
			
		||||
                    1;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
                };
 | 
			
		||||
            };
 | 
			
		||||
        };
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
## Import der FHEM Funktionen
 | 
			
		||||
#-- Run before package compilation
 | 
			
		||||
@@ -227,8 +212,8 @@ our %userAttrList = (
 | 
			
		||||
    'ASC_LockOut:soft,hard,off'                  => '-',
 | 
			
		||||
    'ASC_LockOut_Cmd:inhibit,blocked,protection' => '-',
 | 
			
		||||
    'ASC_BlockingTime_afterManual'               => '-',
 | 
			
		||||
    'ASC_BlockingTime_beforeNightClose'           => '-',
 | 
			
		||||
    'ASC_BlockingTime_beforeDayOpen'              => '-',
 | 
			
		||||
    'ASC_BlockingTime_beforeNightClose'          => '-',
 | 
			
		||||
    'ASC_BlockingTime_beforeDayOpen'             => '-',
 | 
			
		||||
    'ASC_BrightnessSensor'                       => '-',
 | 
			
		||||
    'ASC_Shading_Pos:10,20,30,40,50,60,70,80,90,100'       => [ '', 80, 20 ],
 | 
			
		||||
    'ASC_Shading_Mode:absent,always,off,home'              => '-',
 | 
			
		||||
@@ -366,7 +351,7 @@ sub Define {
 | 
			
		||||
        $name . ' devStateIcon { ShuttersControl_DevStateIcon($name) }' )
 | 
			
		||||
      if ( AttrVal( $name, 'devStateIcon', 'none' ) eq 'none' );
 | 
			
		||||
 | 
			
		||||
    addToAttrList('ASC:0,1,2','AutoShuttersControl');
 | 
			
		||||
    addToAttrList( 'ASC:0,1,2', 'AutoShuttersControl' );
 | 
			
		||||
 | 
			
		||||
    Log3( $name, 3, "AutoShuttersControl ($name) - defined" );
 | 
			
		||||
 | 
			
		||||
@@ -572,7 +557,7 @@ sub Set {
 | 
			
		||||
    elsif ( lc $cmd eq 'controlshading' ) {
 | 
			
		||||
        return "usage: $cmd" if ( scalar( @{$aArg} ) > 1 );
 | 
			
		||||
 | 
			
		||||
        my $response = CheckASC_ConditionsForShadingFn($hash,$aArg->[0]);
 | 
			
		||||
        my $response = CheckASC_ConditionsForShadingFn( $hash, $aArg->[0] );
 | 
			
		||||
        readingsSingleUpdate(
 | 
			
		||||
            $hash, $cmd,
 | 
			
		||||
            (
 | 
			
		||||
@@ -703,6 +688,7 @@ sub ShuttersDeviceScan {
 | 
			
		||||
            $shutters->setAttrUpdateChanges( 'ASC_ShuttersPlace',
 | 
			
		||||
                AttrVal( $shuttersDev, 'ASC_ShuttersPlace', 'none' ) );
 | 
			
		||||
            delFromDevAttrList( $shuttersDev, 'ASC_ShuttersPlace' );
 | 
			
		||||
 | 
			
		||||
#             $shutters->setAttrUpdateChanges( 'ASC_Down',
 | 
			
		||||
#                 AttrVal( $shuttersDev, 'ASC_Down', 'none' ) );
 | 
			
		||||
#             delFromDevAttrList( $shuttersDev, 'ASC_Down' );
 | 
			
		||||
@@ -775,7 +761,8 @@ sub WriteReadingsShuttersList {
 | 
			
		||||
        readingsBulkUpdate(
 | 
			
		||||
            $hash,
 | 
			
		||||
            'room_'
 | 
			
		||||
              . ::makeReadingName( AttrVal( $shuttersDev, 'room', 'unsorted' ) ),
 | 
			
		||||
              . ::makeReadingName(
 | 
			
		||||
                AttrVal( $shuttersDev, 'room', 'unsorted' ) ),
 | 
			
		||||
            ReadingsVal(
 | 
			
		||||
                $name,
 | 
			
		||||
                'room_'
 | 
			
		||||
@@ -801,7 +788,8 @@ sub WriteReadingsShuttersList {
 | 
			
		||||
        readingsBulkUpdate(
 | 
			
		||||
            $hash,
 | 
			
		||||
            'room_'
 | 
			
		||||
              . ::makeReadingName( AttrVal( $shuttersDev, 'room', 'unsorted' ) ),
 | 
			
		||||
              . ::makeReadingName(
 | 
			
		||||
                AttrVal( $shuttersDev, 'room', 'unsorted' ) ),
 | 
			
		||||
            $shuttersDev
 | 
			
		||||
          )
 | 
			
		||||
          if (
 | 
			
		||||
@@ -1014,11 +1002,13 @@ sub ShuttersCommandSet {
 | 
			
		||||
                    || $shutters->getLockOut eq 'hard' )
 | 
			
		||||
                && !$shutters->getQueryShuttersPos($posValue)
 | 
			
		||||
            )
 | 
			
		||||
            || (   CheckIfShuttersWindowRecOpen($shuttersDev) == 2
 | 
			
		||||
            || (
 | 
			
		||||
                   CheckIfShuttersWindowRecOpen($shuttersDev) == 2
 | 
			
		||||
                && $shutters->getShuttersPlace eq 'terrace'
 | 
			
		||||
                && !$shutters->getQueryShuttersPos($posValue)
 | 
			
		||||
                && (   $shutters->getLockOut eq 'soft'
 | 
			
		||||
                    || $shutters->getLockOut eq 'hard' ) )
 | 
			
		||||
                    || $shutters->getLockOut eq 'hard' )
 | 
			
		||||
            )
 | 
			
		||||
            || (   $shutters->getRainProtectionStatus eq 'protected'
 | 
			
		||||
                || $shutters->getWindProtectionStatus eq 'protected' )
 | 
			
		||||
        )
 | 
			
		||||
@@ -1068,7 +1058,7 @@ sub CreateSunRiseSetShuttersTimer {
 | 
			
		||||
    return if ( IsDisabled($name) );
 | 
			
		||||
 | 
			
		||||
    my $shuttersSunriseUnixtime = ShuttersSunrise( $shuttersDev, 'unix' ) + 1;
 | 
			
		||||
    my $shuttersSunsetUnixtime = ShuttersSunset( $shuttersDev, 'unix' ) + 1;
 | 
			
		||||
    my $shuttersSunsetUnixtime  = ShuttersSunset( $shuttersDev, 'unix' ) + 1;
 | 
			
		||||
 | 
			
		||||
    $shutters->setSunriseUnixTime($shuttersSunriseUnixtime);
 | 
			
		||||
    $shutters->setSunsetUnixTime($shuttersSunsetUnixtime);
 | 
			
		||||
@@ -1200,8 +1190,11 @@ sub RenewSunRiseSetShuttersTimer {
 | 
			
		||||
            ) == 0
 | 
			
		||||
          )
 | 
			
		||||
        {
 | 
			
		||||
            $attr{$shuttersDev}{'ASC_ShuttersPlace'} = $shutters->getAttrUpdateChanges('ASC_ShuttersPlace')
 | 
			
		||||
              if ( $shutters->getAttrUpdateChanges('ASC_ShuttersPlace') ne 'none' );
 | 
			
		||||
            $attr{$shuttersDev}{'ASC_ShuttersPlace'} =
 | 
			
		||||
              $shutters->getAttrUpdateChanges('ASC_ShuttersPlace')
 | 
			
		||||
              if ( $shutters->getAttrUpdateChanges('ASC_ShuttersPlace') ne
 | 
			
		||||
                'none' );
 | 
			
		||||
 | 
			
		||||
#             $attr{$shuttersDev}{'ASC_Down'} =
 | 
			
		||||
#               $shutters->getAttrUpdateChanges('ASC_Down')
 | 
			
		||||
#               if ( $shutters->getAttrUpdateChanges('ASC_Down') ne 'none' );
 | 
			
		||||
@@ -1228,12 +1221,16 @@ sub RenewSunRiseSetShuttersTimer {
 | 
			
		||||
 | 
			
		||||
        $attr{$shuttersDev}{ASC_BlockingTime_beforeNightClose} =
 | 
			
		||||
          AttrVal( $shuttersDev, 'ASC_BlockingTime_beforNightClose', 'none' )
 | 
			
		||||
          if ( AttrVal( $shuttersDev, 'ASC_BlockingTime_beforNightClose', 'none' ) ne 'none' );
 | 
			
		||||
          if (
 | 
			
		||||
            AttrVal( $shuttersDev, 'ASC_BlockingTime_beforNightClose', 'none' )
 | 
			
		||||
            ne 'none' );
 | 
			
		||||
        delFromDevAttrList( $shuttersDev, 'ASC_BlockingTime_beforNightClose' );
 | 
			
		||||
 | 
			
		||||
        $attr{$shuttersDev}{ASC_BlockingTime_beforeDayOpen} =
 | 
			
		||||
          AttrVal( $shuttersDev, 'ASC_BlockingTime_beforDayOpen', 'none' )
 | 
			
		||||
          if ( AttrVal( $shuttersDev, 'ASC_BlockingTime_beforDayOpen', 'none' ) ne 'none' );
 | 
			
		||||
          if (
 | 
			
		||||
            AttrVal( $shuttersDev, 'ASC_BlockingTime_beforDayOpen', 'none' ) ne
 | 
			
		||||
            'none' );
 | 
			
		||||
        delFromDevAttrList( $shuttersDev, 'ASC_BlockingTime_beforDayOpen' );
 | 
			
		||||
#
 | 
			
		||||
#         $attr{$shuttersDev}{ASC_Shading_StateChange_SunnyCloudy} =
 | 
			
		||||
@@ -1708,23 +1705,31 @@ 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;
 | 
			
		||||
    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 {
 | 
			
		||||
@@ -1809,12 +1814,12 @@ sub _SetCmdFn {
 | 
			
		||||
            $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->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->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 )
 | 
			
		||||
        {
 | 
			
		||||
@@ -1822,26 +1827,28 @@ sub _SetCmdFn {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( $commandTemplate ne 'none' ) {     # Patch von Beta-User Forum https://forum.fhem.de/index.php/topic,123659.0.html
 | 
			
		||||
        # Nutzervariablen setzen
 | 
			
		||||
    if ( $commandTemplate ne 'none' )
 | 
			
		||||
    { # Patch von Beta-User Forum https://forum.fhem.de/index.php/topic,123659.0.html
 | 
			
		||||
            # Nutzervariablen setzen
 | 
			
		||||
        my %specials = (
 | 
			
		||||
             '$name'        => $shuttersDev,
 | 
			
		||||
             '$pos'       => $posValue,
 | 
			
		||||
             '$slatPos'   => $slatPos,
 | 
			
		||||
             '$cause'      => $shutters->getLastDrive
 | 
			
		||||
            '$name'    => $shuttersDev,
 | 
			
		||||
            '$pos'     => $posValue,
 | 
			
		||||
            '$slatPos' => $slatPos,
 | 
			
		||||
            '$cause'   => $shutters->getLastDrive
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        $commandTemplate  = ::EvalSpecials($commandTemplate, %specials);
 | 
			
		||||
        $commandTemplate = ::EvalSpecials( $commandTemplate, %specials );
 | 
			
		||||
 | 
			
		||||
        # CMD ausführen
 | 
			
		||||
        ::AnalyzeCommandChain( $h, $commandTemplate );
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        CommandSet( undef,
 | 
			
		||||
                $shuttersDev
 | 
			
		||||
            . ':FILTER='
 | 
			
		||||
            . $shutters->getPosCmd . '!='
 | 
			
		||||
            . $posValue . ' '
 | 
			
		||||
            . $driveCommand );
 | 
			
		||||
              . ':FILTER='
 | 
			
		||||
              . $shutters->getPosCmd . '!='
 | 
			
		||||
              . $posValue . ' '
 | 
			
		||||
              . $driveCommand );
 | 
			
		||||
 | 
			
		||||
        InternalTimer(
 | 
			
		||||
            gettimeofday() + 3,
 | 
			
		||||
@@ -1849,18 +1856,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' );
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
@@ -1888,7 +1895,7 @@ sub ASC_Debug {
 | 
			
		||||
    return
 | 
			
		||||
      if ( !AttrVal( $ascDev->getName, 'ASC_debug', 0 ) );
 | 
			
		||||
 | 
			
		||||
    my $debugMsg = shift;
 | 
			
		||||
    my $debugMsg       = shift;
 | 
			
		||||
    my $debugTimestamp = strftime( "%Y.%m.%d %T", localtime(time) );
 | 
			
		||||
 | 
			
		||||
    print(
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
###############################################################################
 | 
			
		||||
#
 | 
			
		||||
# Developed with Kate
 | 
			
		||||
# Developed with VSCodium and richterger perl plugin
 | 
			
		||||
#
 | 
			
		||||
#  (c) 2018-2021 Copyright: Marko Oldenburg (leongaultier at gmail dot com)
 | 
			
		||||
#  (c) 2018-2022 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net)
 | 
			
		||||
#  All rights reserved
 | 
			
		||||
#
 | 
			
		||||
#   Special thanks goes to:
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
###############################################################################
 | 
			
		||||
#
 | 
			
		||||
# Developed with Kate
 | 
			
		||||
# Developed with VSCodium and richterger perl plugin
 | 
			
		||||
#
 | 
			
		||||
#  (c) 2018-2021 Copyright: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
			
		||||
#  (c) 2018-2022 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net)
 | 
			
		||||
#  All rights reserved
 | 
			
		||||
#
 | 
			
		||||
#   Special thanks goes to:
 | 
			
		||||
@@ -44,23 +44,12 @@ use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use utf8;
 | 
			
		||||
 | 
			
		||||
use GPUtils qw(GP_Import);
 | 
			
		||||
 | 
			
		||||
## Import der FHEM Funktionen
 | 
			
		||||
BEGIN {
 | 
			
		||||
    GP_Import(
 | 
			
		||||
        qw(
 | 
			
		||||
          AttrVal
 | 
			
		||||
          gettimeofday)
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub getShuttersOffset {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    my $name = $self->{name};
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $name, 'ASC_shuttersDriveDelay', -1 );
 | 
			
		||||
    return ::AttrVal( $name, 'ASC_shuttersDriveDelay', -1 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub getBrightnessMinVal {
 | 
			
		||||
@@ -70,7 +59,7 @@ sub getBrightnessMinVal {
 | 
			
		||||
 | 
			
		||||
    return $self->{ASC_brightness}->{triggermin}
 | 
			
		||||
      if ( exists( $self->{ASC_brightness}->{LASTGETTIME} )
 | 
			
		||||
        && ( gettimeofday() - $self->{ASC_brightness}->{LASTGETTIME} ) < 2 );
 | 
			
		||||
        && ( ::gettimeofday() - $self->{ASC_brightness}->{LASTGETTIME} ) < 2 );
 | 
			
		||||
    $FHEM::Automation::ShuttersControl::ascDev->getBrightnessMaxVal;
 | 
			
		||||
 | 
			
		||||
    return $self->{ASC_brightness}->{triggermin};
 | 
			
		||||
@@ -83,11 +72,11 @@ sub getBrightnessMaxVal {
 | 
			
		||||
 | 
			
		||||
    return $self->{ASC_brightness}->{triggermax}
 | 
			
		||||
      if ( exists( $self->{ASC_brightness}->{LASTGETTIME} )
 | 
			
		||||
        && ( gettimeofday() - $self->{ASC_brightness}->{LASTGETTIME} ) < 2 );
 | 
			
		||||
    $self->{ASC_brightness}->{LASTGETTIME} = int( gettimeofday() );
 | 
			
		||||
        && ( ::gettimeofday() - $self->{ASC_brightness}->{LASTGETTIME} ) < 2 );
 | 
			
		||||
    $self->{ASC_brightness}->{LASTGETTIME} = int( ::gettimeofday() );
 | 
			
		||||
 | 
			
		||||
    my ( $triggermax, $triggermin ) =
 | 
			
		||||
      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $name,
 | 
			
		||||
      FHEM::Automation::ShuttersControl::Helper::Get::AttrValues( $name,
 | 
			
		||||
        'ASC_brightnessDriveUpDown', '800:500' );
 | 
			
		||||
 | 
			
		||||
    ## erwartetes Ergebnis
 | 
			
		||||
@@ -104,7 +93,7 @@ sub _getTwilightDevice {
 | 
			
		||||
 | 
			
		||||
    my $name = $self->{name};
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $name, 'ASC_twilightDevice', 'none' );
 | 
			
		||||
    return ::AttrVal( $name, 'ASC_twilightDevice', 'none' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub getAutoAstroModeEvening {
 | 
			
		||||
@@ -112,7 +101,7 @@ sub getAutoAstroModeEvening {
 | 
			
		||||
 | 
			
		||||
    my $name = $self->{name};
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $name, 'ASC_autoAstroModeEvening', 'REAL' );
 | 
			
		||||
    return ::AttrVal( $name, 'ASC_autoAstroModeEvening', 'REAL' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub getAutoAstroModeEveningHorizon {
 | 
			
		||||
@@ -120,7 +109,7 @@ sub getAutoAstroModeEveningHorizon {
 | 
			
		||||
 | 
			
		||||
    my $name = $self->{name};
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $name, 'ASC_autoAstroModeEveningHorizon', 0 );
 | 
			
		||||
    return ::AttrVal( $name, 'ASC_autoAstroModeEveningHorizon', 0 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub getAutoAstroModeMorning {
 | 
			
		||||
@@ -128,7 +117,7 @@ sub getAutoAstroModeMorning {
 | 
			
		||||
 | 
			
		||||
    my $name = $self->{name};
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $name, 'ASC_autoAstroModeMorning', 'REAL' );
 | 
			
		||||
    return ::AttrVal( $name, 'ASC_autoAstroModeMorning', 'REAL' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub getAutoAstroModeMorningHorizon {
 | 
			
		||||
@@ -136,7 +125,7 @@ sub getAutoAstroModeMorningHorizon {
 | 
			
		||||
 | 
			
		||||
    my $name = $self->{name};
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $name, 'ASC_autoAstroModeMorningHorizon', 0 );
 | 
			
		||||
    return ::AttrVal( $name, 'ASC_autoAstroModeMorningHorizon', 0 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub getAutoShuttersControlMorning {
 | 
			
		||||
@@ -144,7 +133,7 @@ sub getAutoShuttersControlMorning {
 | 
			
		||||
 | 
			
		||||
    my $name = $self->{name};
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $name, 'ASC_autoShuttersControlMorning', 'on' );
 | 
			
		||||
    return ::AttrVal( $name, 'ASC_autoShuttersControlMorning', 'on' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub getAutoShuttersControlEvening {
 | 
			
		||||
@@ -152,7 +141,7 @@ sub getAutoShuttersControlEvening {
 | 
			
		||||
 | 
			
		||||
    my $name = $self->{name};
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $name, 'ASC_autoShuttersControlEvening', 'on' );
 | 
			
		||||
    return ::AttrVal( $name, 'ASC_autoShuttersControlEvening', 'on' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub getAutoShuttersControlComfort {
 | 
			
		||||
@@ -160,7 +149,7 @@ sub getAutoShuttersControlComfort {
 | 
			
		||||
 | 
			
		||||
    my $name = $self->{name};
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $name, 'ASC_autoShuttersControlComfort', 'off' );
 | 
			
		||||
    return ::AttrVal( $name, 'ASC_autoShuttersControlComfort', 'off' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub getFreezeTemp {
 | 
			
		||||
@@ -168,7 +157,7 @@ sub getFreezeTemp {
 | 
			
		||||
 | 
			
		||||
    my $name = $self->{name};
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $name, 'ASC_freezeTemp', 3 );
 | 
			
		||||
    return ::AttrVal( $name, 'ASC_freezeTemp', 3 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub getSlatDriveCmdInverse {
 | 
			
		||||
@@ -176,7 +165,7 @@ sub getSlatDriveCmdInverse {
 | 
			
		||||
 | 
			
		||||
    my $name = $self->{name};
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $name, 'ASC_slatDriveCmdInverse', 0 );
 | 
			
		||||
    return ::AttrVal( $name, 'ASC_slatDriveCmdInverse', 0 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub _getTempSensor {
 | 
			
		||||
@@ -186,11 +175,11 @@ sub _getTempSensor {
 | 
			
		||||
 | 
			
		||||
    return $self->{ASC_tempSensor}->{device}
 | 
			
		||||
      if ( exists( $self->{ASC_tempSensor}->{LASTGETTIME} )
 | 
			
		||||
        && ( gettimeofday() - $self->{ASC_tempSensor}->{LASTGETTIME} ) < 2 );
 | 
			
		||||
    $self->{ASC_tempSensor}->{LASTGETTIME} = int( gettimeofday() );
 | 
			
		||||
        && ( ::gettimeofday() - $self->{ASC_tempSensor}->{LASTGETTIME} ) < 2 );
 | 
			
		||||
    $self->{ASC_tempSensor}->{LASTGETTIME} = int( ::gettimeofday() );
 | 
			
		||||
    my ( $device, $reading ) =
 | 
			
		||||
      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $name, 'ASC_tempSensor',
 | 
			
		||||
        'none' );
 | 
			
		||||
      FHEM::Automation::ShuttersControl::Helper::Get::AttrValues( $name,
 | 
			
		||||
        'ASC_tempSensor', 'none' );
 | 
			
		||||
 | 
			
		||||
    ## erwartetes Ergebnis
 | 
			
		||||
    # DEVICE:READING
 | 
			
		||||
@@ -208,7 +197,7 @@ sub getTempSensorReading {
 | 
			
		||||
 | 
			
		||||
    return $self->{ASC_tempSensor}->{reading}
 | 
			
		||||
      if ( exists( $self->{ASC_tempSensor}->{LASTGETTIME} )
 | 
			
		||||
        && ( gettimeofday() - $self->{ASC_tempSensor}->{LASTGETTIME} ) < 2 );
 | 
			
		||||
        && ( ::gettimeofday() - $self->{ASC_tempSensor}->{LASTGETTIME} ) < 2 );
 | 
			
		||||
    $FHEM::Automation::ShuttersControl::ascDev->_getTempSensor;
 | 
			
		||||
    return $self->{ASC_tempSensor}->{reading};
 | 
			
		||||
}
 | 
			
		||||
@@ -220,10 +209,11 @@ sub _getResidentsDev {
 | 
			
		||||
 | 
			
		||||
    return $self->{ASC_residentsDev}->{device}
 | 
			
		||||
      if ( exists( $self->{ASC_residentsDev}->{LASTGETTIME} )
 | 
			
		||||
        && ( gettimeofday() - $self->{ASC_residentsDev}->{LASTGETTIME} ) < 2 );
 | 
			
		||||
    $self->{ASC_residentsDev}->{LASTGETTIME} = int( gettimeofday() );
 | 
			
		||||
        && ( ::gettimeofday() - $self->{ASC_residentsDev}->{LASTGETTIME} ) <
 | 
			
		||||
        2 );
 | 
			
		||||
    $self->{ASC_residentsDev}->{LASTGETTIME} = int( ::gettimeofday() );
 | 
			
		||||
    my ( $device, $reading ) =
 | 
			
		||||
      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $name,
 | 
			
		||||
      FHEM::Automation::ShuttersControl::Helper::Get::AttrValues( $name,
 | 
			
		||||
        'ASC_residentsDev', 'none' );
 | 
			
		||||
 | 
			
		||||
    $self->{ASC_residentsDev}->{device} = $device;
 | 
			
		||||
@@ -240,7 +230,8 @@ sub getResidentsReading {
 | 
			
		||||
 | 
			
		||||
    return $self->{ASC_residentsDev}->{reading}
 | 
			
		||||
      if ( exists( $self->{ASC_residentsDev}->{LASTGETTIME} )
 | 
			
		||||
        && ( gettimeofday() - $self->{ASC_residentsDev}->{LASTGETTIME} ) < 2 );
 | 
			
		||||
        && ( ::gettimeofday() - $self->{ASC_residentsDev}->{LASTGETTIME} ) <
 | 
			
		||||
        2 );
 | 
			
		||||
    $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev;
 | 
			
		||||
    return $self->{ASC_residentsDev}->{reading};
 | 
			
		||||
}
 | 
			
		||||
@@ -252,11 +243,11 @@ sub _getRainSensor {
 | 
			
		||||
 | 
			
		||||
    return $self->{ASC_rainSensor}->{device}
 | 
			
		||||
      if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
 | 
			
		||||
        && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
 | 
			
		||||
    $self->{ASC_rainSensor}->{LASTGETTIME} = int( gettimeofday() );
 | 
			
		||||
        && ( ::gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
 | 
			
		||||
    $self->{ASC_rainSensor}->{LASTGETTIME} = int( ::gettimeofday() );
 | 
			
		||||
    my ( $device, $reading, $max, $hyst, $pos, $wait ) =
 | 
			
		||||
      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $name, 'ASC_rainSensor',
 | 
			
		||||
        'none' );
 | 
			
		||||
      FHEM::Automation::ShuttersControl::Helper::Get::AttrValues( $name,
 | 
			
		||||
        'ASC_rainSensor', 'none' );
 | 
			
		||||
 | 
			
		||||
    ## erwartetes Ergebnis
 | 
			
		||||
    # DEVICE:READING MAX:HYST
 | 
			
		||||
@@ -266,10 +257,10 @@ sub _getRainSensor {
 | 
			
		||||
    $self->{ASC_rainSensor}->{reading} =
 | 
			
		||||
      ( $reading ne 'none' ? $reading : 'rain' );
 | 
			
		||||
    $self->{ASC_rainSensor}->{triggermax} = (
 | 
			
		||||
         (   $max ne 'none'
 | 
			
		||||
          && $max =~ m{\A(-?\d+(\.\d+)?)\z}xms )
 | 
			
		||||
        ( $max ne 'none' && $max =~ m{\A(-?\d+(\.\d+)?)\z}xms )
 | 
			
		||||
        ? $max
 | 
			
		||||
        : 1000 );
 | 
			
		||||
        : 1000
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    $self->{ASC_rainSensor}->{triggerhyst} = (
 | 
			
		||||
          $hyst ne 'none'
 | 
			
		||||
@@ -277,10 +268,11 @@ sub _getRainSensor {
 | 
			
		||||
        : ( $self->{ASC_rainSensor}->{triggermax} * 0 )
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    $self->{ASC_rainSensor}->{shuttersClosedPos} =
 | 
			
		||||
      (   $pos ne 'none'
 | 
			
		||||
    $self->{ASC_rainSensor}->{shuttersClosedPos} = (
 | 
			
		||||
          $pos ne 'none'
 | 
			
		||||
        ? $pos
 | 
			
		||||
        : $FHEM::Automation::ShuttersControl::shutters->getClosedPos );
 | 
			
		||||
        : $FHEM::Automation::ShuttersControl::shutters->getClosedPos
 | 
			
		||||
    );
 | 
			
		||||
    $self->{ASC_rainSensor}->{waitingTime} =
 | 
			
		||||
      ( $wait ne 'none' ? $wait : 0 );
 | 
			
		||||
 | 
			
		||||
@@ -294,7 +286,7 @@ sub getRainSensorReading {
 | 
			
		||||
 | 
			
		||||
    return $self->{ASC_rainSensor}->{reading}
 | 
			
		||||
      if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
 | 
			
		||||
        && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
 | 
			
		||||
        && ( ::gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
 | 
			
		||||
    $FHEM::Automation::ShuttersControl::ascDev->_getRainSensor;
 | 
			
		||||
    return $self->{ASC_rainSensor}->{reading};
 | 
			
		||||
}
 | 
			
		||||
@@ -306,7 +298,7 @@ sub getRainTriggerMax {
 | 
			
		||||
 | 
			
		||||
    return $self->{ASC_rainSensor}->{triggermax}
 | 
			
		||||
      if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
 | 
			
		||||
        && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
 | 
			
		||||
        && ( ::gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
 | 
			
		||||
    $FHEM::Automation::ShuttersControl::ascDev->_getRainSensor;
 | 
			
		||||
    return $self->{ASC_rainSensor}->{triggermax};
 | 
			
		||||
}
 | 
			
		||||
@@ -318,7 +310,7 @@ sub getRainTriggerMin {
 | 
			
		||||
 | 
			
		||||
    return $self->{ASC_rainSensor}->{triggerhyst}
 | 
			
		||||
      if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
 | 
			
		||||
        && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
 | 
			
		||||
        && ( ::gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
 | 
			
		||||
    $FHEM::Automation::ShuttersControl::ascDev->_getRainSensor;
 | 
			
		||||
    return $self->{ASC_rainSensor}->{triggerhyst};
 | 
			
		||||
}
 | 
			
		||||
@@ -330,7 +322,7 @@ sub getRainSensorShuttersClosedPos {
 | 
			
		||||
 | 
			
		||||
    return $self->{ASC_rainSensor}->{shuttersClosedPos}
 | 
			
		||||
      if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
 | 
			
		||||
        && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
 | 
			
		||||
        && ( ::gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
 | 
			
		||||
    $FHEM::Automation::ShuttersControl::ascDev->_getRainSensor;
 | 
			
		||||
    return $self->{ASC_rainSensor}->{shuttersClosedPos};
 | 
			
		||||
}
 | 
			
		||||
@@ -342,7 +334,7 @@ sub getRainWaitingTime {
 | 
			
		||||
 | 
			
		||||
    return $self->{ASC_rainSensor}->{waitingTime}
 | 
			
		||||
      if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
 | 
			
		||||
        && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
 | 
			
		||||
        && ( ::gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
 | 
			
		||||
    $FHEM::Automation::ShuttersControl::ascDev->_getRainSensor;
 | 
			
		||||
    return $self->{ASC_rainSensor}->{waitingTime};
 | 
			
		||||
}
 | 
			
		||||
@@ -354,11 +346,11 @@ sub _getWindSensor {
 | 
			
		||||
 | 
			
		||||
    return $self->{ASC_windSensor}->{device}
 | 
			
		||||
      if ( exists( $self->{ASC_windSensor}->{LASTGETTIME} )
 | 
			
		||||
        && ( gettimeofday() - $self->{ASC_windSensor}->{LASTGETTIME} ) < 2 );
 | 
			
		||||
    $self->{ASC_windSensor}->{LASTGETTIME} = int( gettimeofday() );
 | 
			
		||||
        && ( ::gettimeofday() - $self->{ASC_windSensor}->{LASTGETTIME} ) < 2 );
 | 
			
		||||
    $self->{ASC_windSensor}->{LASTGETTIME} = int( ::gettimeofday() );
 | 
			
		||||
    my ( $device, $reading ) =
 | 
			
		||||
      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $name, 'ASC_windSensor',
 | 
			
		||||
        'none' );
 | 
			
		||||
      FHEM::Automation::ShuttersControl::Helper::Get::AttrValues( $name,
 | 
			
		||||
        'ASC_windSensor', 'none' );
 | 
			
		||||
 | 
			
		||||
    return $device if ( $device eq 'none' );
 | 
			
		||||
    $self->{ASC_windSensor}->{device} = $device;
 | 
			
		||||
@@ -375,7 +367,7 @@ sub getWindSensorReading {
 | 
			
		||||
 | 
			
		||||
    return $self->{ASC_windSensor}->{reading}
 | 
			
		||||
      if ( exists( $self->{ASC_windSensor}->{LASTGETTIME} )
 | 
			
		||||
        && ( gettimeofday() - $self->{ASC_windSensor}->{LASTGETTIME} ) < 2 );
 | 
			
		||||
        && ( ::gettimeofday() - $self->{ASC_windSensor}->{LASTGETTIME} ) < 2 );
 | 
			
		||||
    $FHEM::Automation::ShuttersControl::ascDev->_getWindSensor;
 | 
			
		||||
    return (
 | 
			
		||||
        defined( $self->{ASC_windSensor}->{reading} )
 | 
			
		||||
@@ -389,7 +381,7 @@ sub getBlockAscDrivesAfterManual {
 | 
			
		||||
 | 
			
		||||
    my $name = $self->{name};
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $name, 'ASC_blockAscDrivesAfterManual', 0 );
 | 
			
		||||
    return ::AttrVal( $name, 'ASC_blockAscDrivesAfterManual', 0 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub getAdvDate {
 | 
			
		||||
@@ -397,10 +389,7 @@ sub getAdvDate {
 | 
			
		||||
 | 
			
		||||
    my $name = $self->{name};
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $name, 'ASC_advDate', 'FirstAdvent' );
 | 
			
		||||
    return ::AttrVal( $name, 'ASC_advDate', 'FirstAdvent' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
###############################################################################
 | 
			
		||||
#
 | 
			
		||||
# Developed with Kate
 | 
			
		||||
# Developed with VSCodium and richterger perl plugin
 | 
			
		||||
#
 | 
			
		||||
#  (c) 2018-2021 Copyright: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
			
		||||
#  (c) 2018-2022 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net)
 | 
			
		||||
#  All rights reserved
 | 
			
		||||
#
 | 
			
		||||
#   Special thanks goes to:
 | 
			
		||||
@@ -48,12 +48,7 @@ use GPUtils qw(GP_Import);
 | 
			
		||||
 | 
			
		||||
## Import der FHEM Funktionen
 | 
			
		||||
BEGIN {
 | 
			
		||||
    GP_Import(
 | 
			
		||||
        qw(
 | 
			
		||||
          readingsSingleUpdate
 | 
			
		||||
          ReadingsVal
 | 
			
		||||
          defs)
 | 
			
		||||
    );
 | 
			
		||||
    GP_Import(qw(defs));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub setDelayCmdReading {
 | 
			
		||||
@@ -62,7 +57,7 @@ sub setDelayCmdReading {
 | 
			
		||||
    my $name = $self->{name};
 | 
			
		||||
    my $hash = $defs{$name};
 | 
			
		||||
 | 
			
		||||
    readingsSingleUpdate(
 | 
			
		||||
    ::readingsSingleUpdate(
 | 
			
		||||
        $hash,
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
 | 
			
		||||
          . '_lastDelayPosValue',
 | 
			
		||||
@@ -79,7 +74,7 @@ sub setStateReading {
 | 
			
		||||
    my $name = $self->{name};
 | 
			
		||||
    my $hash = $defs{$name};
 | 
			
		||||
 | 
			
		||||
    readingsSingleUpdate(
 | 
			
		||||
    ::readingsSingleUpdate(
 | 
			
		||||
        $hash, 'state',
 | 
			
		||||
        (
 | 
			
		||||
            defined($value)
 | 
			
		||||
@@ -97,7 +92,7 @@ sub setPosReading {
 | 
			
		||||
    my $name = $self->{name};
 | 
			
		||||
    my $hash = $defs{$name};
 | 
			
		||||
 | 
			
		||||
    readingsSingleUpdate(
 | 
			
		||||
    ::readingsSingleUpdate(
 | 
			
		||||
        $hash,
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
 | 
			
		||||
          . '_PosValue',
 | 
			
		||||
@@ -113,7 +108,7 @@ sub setLastPosReading {
 | 
			
		||||
    my $name = $self->{name};
 | 
			
		||||
    my $hash = $defs{$name};
 | 
			
		||||
 | 
			
		||||
    readingsSingleUpdate(
 | 
			
		||||
    ::readingsSingleUpdate(
 | 
			
		||||
        $hash,
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
 | 
			
		||||
          . '_lastPosValue',
 | 
			
		||||
@@ -128,7 +123,7 @@ sub getPartyMode {
 | 
			
		||||
 | 
			
		||||
    my $name = $self->{name};
 | 
			
		||||
 | 
			
		||||
    return ReadingsVal( $name, 'partyMode', 'off' );
 | 
			
		||||
    return ::ReadingsVal( $name, 'partyMode', 'off' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub getHardLockOut {
 | 
			
		||||
@@ -136,7 +131,7 @@ sub getHardLockOut {
 | 
			
		||||
 | 
			
		||||
    my $name = $self->{name};
 | 
			
		||||
 | 
			
		||||
    return ReadingsVal( $name, 'hardLockOut', 'none' );
 | 
			
		||||
    return ::ReadingsVal( $name, 'hardLockOut', 'none' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub getSunriseTimeWeHoliday {
 | 
			
		||||
@@ -144,7 +139,7 @@ sub getSunriseTimeWeHoliday {
 | 
			
		||||
 | 
			
		||||
    my $name = $self->{name};
 | 
			
		||||
 | 
			
		||||
    return ReadingsVal( $name, 'sunriseTimeWeHoliday', 'none' );
 | 
			
		||||
    return ::ReadingsVal( $name, 'sunriseTimeWeHoliday', 'none' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub getMonitoredDevs {
 | 
			
		||||
@@ -152,14 +147,14 @@ sub getMonitoredDevs {
 | 
			
		||||
 | 
			
		||||
    my $name = $self->{name};
 | 
			
		||||
 | 
			
		||||
    $self->{monitoredDevs} = ReadingsVal( $name, '.monitoredDevs', 'none' );
 | 
			
		||||
    $self->{monitoredDevs} = ::ReadingsVal( $name, '.monitoredDevs', 'none' );
 | 
			
		||||
    return $self->{monitoredDevs};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub getOutTemp {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return ReadingsVal(
 | 
			
		||||
    return ::ReadingsVal(
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::ascDev->_getTempSensor,
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::ascDev->getTempSensorReading,
 | 
			
		||||
        -100 );
 | 
			
		||||
@@ -169,7 +164,8 @@ sub getResidentsStatus {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    my $val =
 | 
			
		||||
      ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev,
 | 
			
		||||
      ::ReadingsVal(
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev,
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::ascDev->getResidentsReading,
 | 
			
		||||
        'none' );
 | 
			
		||||
 | 
			
		||||
@@ -178,7 +174,7 @@ sub getResidentsStatus {
 | 
			
		||||
        return $1 && $1 eq 'pet' ? 'absent' : $2;
 | 
			
		||||
    }
 | 
			
		||||
    elsif (
 | 
			
		||||
        ReadingsVal(
 | 
			
		||||
        ::ReadingsVal(
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev,
 | 
			
		||||
            'homealoneType', '-' ) eq 'PET'
 | 
			
		||||
      )
 | 
			
		||||
@@ -196,7 +192,8 @@ sub getResidentsLastStatus {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    my $val =
 | 
			
		||||
      ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev,
 | 
			
		||||
      ::ReadingsVal(
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev,
 | 
			
		||||
        'lastState', 'none' );
 | 
			
		||||
 | 
			
		||||
    if ( $val =~ m{^(?:(.+)_)?(.+)$}xms ) {
 | 
			
		||||
@@ -204,7 +201,7 @@ sub getResidentsLastStatus {
 | 
			
		||||
        return $1 && $1 eq 'pet' ? 'absent' : $2;
 | 
			
		||||
    }
 | 
			
		||||
    elsif (
 | 
			
		||||
        ReadingsVal(
 | 
			
		||||
        ::ReadingsVal(
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev,
 | 
			
		||||
            'lastHomealoneType', '-' ) eq 'PET'
 | 
			
		||||
      )
 | 
			
		||||
@@ -223,7 +220,7 @@ sub getAutoShuttersControlShading {
 | 
			
		||||
 | 
			
		||||
    my $name = $self->{name};
 | 
			
		||||
 | 
			
		||||
    return ReadingsVal( $name, 'controlShading', 'none' );
 | 
			
		||||
    return ::ReadingsVal( $name, 'controlShading', 'none' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub getSelfDefense {
 | 
			
		||||
@@ -231,7 +228,7 @@ sub getSelfDefense {
 | 
			
		||||
 | 
			
		||||
    my $name = $self->{name};
 | 
			
		||||
 | 
			
		||||
    return ReadingsVal( $name, 'selfDefense', 'none' );
 | 
			
		||||
    return ::ReadingsVal( $name, 'selfDefense', 'none' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub getAzimuth {
 | 
			
		||||
@@ -239,13 +236,13 @@ sub getAzimuth {
 | 
			
		||||
 | 
			
		||||
    my $azimuth;
 | 
			
		||||
 | 
			
		||||
    $azimuth = ReadingsVal(
 | 
			
		||||
    $azimuth = ::ReadingsVal(
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice,
 | 
			
		||||
        'azimuth', -1 )
 | 
			
		||||
      if (
 | 
			
		||||
        $defs{ $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice }
 | 
			
		||||
        ->{TYPE} eq 'Twilight' );
 | 
			
		||||
    $azimuth = ReadingsVal(
 | 
			
		||||
    $azimuth = ::ReadingsVal(
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice,
 | 
			
		||||
        'SunAz', -1 )
 | 
			
		||||
      if (
 | 
			
		||||
@@ -260,13 +257,13 @@ sub getElevation {
 | 
			
		||||
 | 
			
		||||
    my $elevation;
 | 
			
		||||
 | 
			
		||||
    $elevation = ReadingsVal(
 | 
			
		||||
    $elevation = ::ReadingsVal(
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice,
 | 
			
		||||
        'elevation', -1 )
 | 
			
		||||
      if (
 | 
			
		||||
        $defs{ $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice }
 | 
			
		||||
        ->{TYPE} eq 'Twilight' );
 | 
			
		||||
    $elevation = ReadingsVal(
 | 
			
		||||
    $elevation = ::ReadingsVal(
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice,
 | 
			
		||||
        'SunAlt', -1 )
 | 
			
		||||
      if (
 | 
			
		||||
@@ -281,7 +278,7 @@ sub getASCenable {
 | 
			
		||||
 | 
			
		||||
    my $name = $self->{name};
 | 
			
		||||
 | 
			
		||||
    return ReadingsVal( $name, 'ascEnable', 'none' );
 | 
			
		||||
    return ::ReadingsVal( $name, 'ascEnable', 'none' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
###############################################################################
 | 
			
		||||
#
 | 
			
		||||
# Developed with Kate
 | 
			
		||||
# Developed with VSCodium and richterger perl plugin
 | 
			
		||||
#
 | 
			
		||||
#  (c) 2018-2021 Copyright: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
			
		||||
#  (c) 2018-2022 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net)
 | 
			
		||||
#  All rights reserved
 | 
			
		||||
#
 | 
			
		||||
#   Special thanks goes to:
 | 
			
		||||
@@ -70,21 +70,6 @@ our %EXPORT_TAGS = (
 | 
			
		||||
    ],
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
use GPUtils qw(GP_Import);
 | 
			
		||||
## Import der FHEM Funktionen
 | 
			
		||||
BEGIN {
 | 
			
		||||
    GP_Import(
 | 
			
		||||
        qw(
 | 
			
		||||
          Log3
 | 
			
		||||
          gettimeofday
 | 
			
		||||
          computeAlignTime
 | 
			
		||||
          CommandSet
 | 
			
		||||
          ReadingsVal
 | 
			
		||||
          RemoveInternalTimer
 | 
			
		||||
          )
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub EventProcessingGeneral {
 | 
			
		||||
    my $hash    = shift;
 | 
			
		||||
    my $devname = shift;
 | 
			
		||||
@@ -156,7 +141,7 @@ sub EventProcessingGeneral {
 | 
			
		||||
        {     # wurde den Attributen unserer Rolläden ein Wert zugewiesen ?
 | 
			
		||||
            FHEM::Automation::ShuttersControl::AddNotifyDev( $hash, $3, $1, $2 )
 | 
			
		||||
              if ( $3 ne 'none' );
 | 
			
		||||
            Log3( $name, 4,
 | 
			
		||||
            ::Log3( $name, 4,
 | 
			
		||||
                "AutoShuttersControl ($name) - EventProcessing: ATTR" );
 | 
			
		||||
        }
 | 
			
		||||
        elsif (
 | 
			
		||||
@@ -168,7 +153,7 @@ sub EventProcessingGeneral {
 | 
			
		||||
                $}xms
 | 
			
		||||
          )
 | 
			
		||||
        {    # wurde das Attribut unserer Rolläden gelöscht ?
 | 
			
		||||
            Log3( $name, 4,
 | 
			
		||||
            ::Log3( $name, 4,
 | 
			
		||||
                "AutoShuttersControl ($name) - EventProcessing: DELETEATTR" );
 | 
			
		||||
            FHEM::Automation::ShuttersControl::DeleteNotifyDev( $hash, $1, $2 );
 | 
			
		||||
        }
 | 
			
		||||
@@ -235,8 +220,9 @@ m{^(DELETEATTR|ATTR)         #global ATTR myASC ASC_tempSensor Cellar
 | 
			
		||||
                    \%funcHash );
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                CommandSet( undef, $name . ' controlShading on' )
 | 
			
		||||
                  if ( ReadingsVal( $name, 'controlShading', 'off' ) ne 'off' );
 | 
			
		||||
                ::CommandSet( undef, $name . ' controlShading on' )
 | 
			
		||||
                  if (
 | 
			
		||||
                    ::ReadingsVal( $name, 'controlShading', 'off' ) ne 'off' );
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -259,11 +245,12 @@ sub EventProcessingWindowRec {
 | 
			
		||||
        m{.*$reading:.*?([Oo]pen(?>ed)?|[Cc]losed?|tilt(?>ed)?|true|false)}xms )
 | 
			
		||||
    {
 | 
			
		||||
        return
 | 
			
		||||
          if ( !IsAfterShuttersManualBlocking($shuttersDev)
 | 
			
		||||
          if (
 | 
			
		||||
            !IsAfterShuttersManualBlocking($shuttersDev)
 | 
			
		||||
            && ( $FHEM::Automation::ShuttersControl::shutters->getLockOut eq
 | 
			
		||||
            'off'
 | 
			
		||||
              || $FHEM::Automation::ShuttersControl::shutters->getShuttersPlace
 | 
			
		||||
            ne 'terrace' )
 | 
			
		||||
                'off'
 | 
			
		||||
                || $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                ->getShuttersPlace ne 'terrace' )
 | 
			
		||||
          );
 | 
			
		||||
 | 
			
		||||
        my $match = $1;
 | 
			
		||||
@@ -281,7 +268,6 @@ sub EventProcessingWindowRec {
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::shutters->setShuttersDev(
 | 
			
		||||
            $shuttersDev);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        #### Hardware Lock der Rollläden
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::shutters->setHardLockOut('off')
 | 
			
		||||
          if ( $match =~ m{[Cc]lose|true}xms
 | 
			
		||||
@@ -299,13 +285,9 @@ sub EventProcessingWindowRec {
 | 
			
		||||
            )
 | 
			
		||||
          );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        return
 | 
			
		||||
          if ( !IsAfterShuttersManualBlocking($shuttersDev) );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
          
 | 
			
		||||
        my $homemode =
 | 
			
		||||
          $FHEM::Automation::ShuttersControl::shutters->getRoommatesStatus;
 | 
			
		||||
        $homemode =
 | 
			
		||||
@@ -535,11 +517,16 @@ sub EventProcessingWindowRec {
 | 
			
		||||
            )
 | 
			
		||||
            && $FHEM::Automation::ShuttersControl::shutters->getVentilateOpen
 | 
			
		||||
            eq 'on'
 | 
			
		||||
            && ( $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
            ->getQueryShuttersPos(
 | 
			
		||||
                $FHEM::Automation::ShuttersControl::shutters->getVentilatePos)
 | 
			
		||||
              || ( $FHEM::Automation::ShuttersControl::shutters->getShuttersPlace eq 'terrace'
 | 
			
		||||
                && $FHEM::Automation::ShuttersControl::shutters->getSubTyp eq 'twostate' )
 | 
			
		||||
            && (
 | 
			
		||||
                $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                ->getQueryShuttersPos(
 | 
			
		||||
                    $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                      ->getVentilatePos
 | 
			
		||||
                )
 | 
			
		||||
                || ( $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                    ->getShuttersPlace eq 'terrace'
 | 
			
		||||
                    && $FHEM::Automation::ShuttersControl::shutters->getSubTyp
 | 
			
		||||
                    eq 'twostate' )
 | 
			
		||||
            )
 | 
			
		||||
          )
 | 
			
		||||
        {
 | 
			
		||||
@@ -622,42 +609,46 @@ sub EventProcessingRoommate {
 | 
			
		||||
      $FHEM::Automation::ShuttersControl::shutters->getRoommatesReading;
 | 
			
		||||
 | 
			
		||||
    if ( $events =~ m{$reading:\s(absent|gotosleep|asleep|awoken|home)}xms ) {
 | 
			
		||||
        Log3( $name, 4,
 | 
			
		||||
        ::Log3( $name, 4,
 | 
			
		||||
            "AutoShuttersControl ($name) - EventProcessingRoommate: "
 | 
			
		||||
              . $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
              ->getRoommatesReading );
 | 
			
		||||
        Log3( $name, 4,
 | 
			
		||||
        ::Log3( $name, 4,
 | 
			
		||||
"AutoShuttersControl ($name) - EventProcessingRoommate: $shuttersDev und Events $events"
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        my $event     = $1;
 | 
			
		||||
        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 $getUp    = $FHEM::Automation::ShuttersControl::shutters->getUp;
 | 
			
		||||
        my $getDown  = $FHEM::Automation::ShuttersControl::shutters->getDown;
 | 
			
		||||
        my $getIsDay = $FHEM::Automation::ShuttersControl::shutters->getIsDay;
 | 
			
		||||
 | 
			
		||||
        my $event                   = $1;
 | 
			
		||||
        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 $getUp                   = $FHEM::Automation::ShuttersControl::shutters->getUp;
 | 
			
		||||
        my $getDown                 = $FHEM::Automation::ShuttersControl::shutters->getDown;
 | 
			
		||||
        my $getIsDay                = $FHEM::Automation::ShuttersControl::shutters->getIsDay;
 | 
			
		||||
        
 | 
			
		||||
        my $posValue                = $FHEM::Automation::ShuttersControl::shutters->getStatus;          # !!! ACHTUNG!!!
 | 
			
		||||
        
 | 
			
		||||
        my $posValue = $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
          ->getStatus;    # !!! ACHTUNG!!!
 | 
			
		||||
 | 
			
		||||
        if (
 | 
			
		||||
            ( $event eq 'home' || $event eq 'awoken' )
 | 
			
		||||
            && (   $getRoommatesStatus eq 'home'
 | 
			
		||||
                || $getRoommatesStatus eq 'awoken' )
 | 
			
		||||
            && ( $FHEM::Automation::ShuttersControl::ascDev
 | 
			
		||||
            && (
 | 
			
		||||
                $FHEM::Automation::ShuttersControl::ascDev
 | 
			
		||||
                ->getAutoShuttersControlMorning eq 'on'
 | 
			
		||||
                || ( $getUp eq 'roommate'
 | 
			
		||||
                  &&  ( $getRoommatesLastStatus eq 'asleep'
 | 
			
		||||
                    ||  $getRoommatesLastStatus ne 'awoken' )
 | 
			
		||||
                   )
 | 
			
		||||
               )
 | 
			
		||||
                || (
 | 
			
		||||
                    $getUp eq 'roommate'
 | 
			
		||||
                    && (   $getRoommatesLastStatus eq 'asleep'
 | 
			
		||||
                        || $getRoommatesLastStatus ne 'awoken' )
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
            && IsAfterShuttersManualBlocking($shuttersDev)
 | 
			
		||||
          )
 | 
			
		||||
        {
 | 
			
		||||
            Log3( $name, 4,
 | 
			
		||||
            ::Log3( $name, 4,
 | 
			
		||||
"AutoShuttersControl ($name) - EventProcessingRoommate_1: $shuttersDev und Events $events"
 | 
			
		||||
            );
 | 
			
		||||
            if (
 | 
			
		||||
@@ -683,7 +674,7 @@ sub EventProcessingRoommate {
 | 
			
		||||
                    || $getUp eq 'roommate' )
 | 
			
		||||
              )
 | 
			
		||||
            {
 | 
			
		||||
                Log3( $name, 4,
 | 
			
		||||
                ::Log3( $name, 4,
 | 
			
		||||
"AutoShuttersControl ($name) - EventProcessingRoommate_2: $shuttersDev und Events $events"
 | 
			
		||||
                );
 | 
			
		||||
 | 
			
		||||
@@ -709,7 +700,7 @@ sub EventProcessingRoommate {
 | 
			
		||||
                      $FHEM::Automation::ShuttersControl::shutters->getOpenPos;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                FHEM::Automation::ShuttersControl::ShuttersCommandSet( $hash,
 | 
			
		||||
                FHEM::Automation::ShuttersControl::Shutters::CommandSet( $hash,
 | 
			
		||||
                    $shuttersDev, $posValue );
 | 
			
		||||
            }
 | 
			
		||||
            elsif (
 | 
			
		||||
@@ -745,8 +736,7 @@ sub EventProcessingRoommate {
 | 
			
		||||
                    && IsAfterShuttersTimeBlocking($shuttersDev)
 | 
			
		||||
                    && (   $getModeDown eq 'home'
 | 
			
		||||
                        || $getModeDown eq 'always' )
 | 
			
		||||
                    && $getDown ne
 | 
			
		||||
                    'roommate'
 | 
			
		||||
                    && $getDown ne 'roommate'
 | 
			
		||||
                  )
 | 
			
		||||
                {
 | 
			
		||||
                    $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
 | 
			
		||||
@@ -780,14 +770,11 @@ sub EventProcessingRoommate {
 | 
			
		||||
                              ->getLastDrive . ' - ventilate mode' );
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    FHEM::Automation::ShuttersControl::ShuttersCommandSet(
 | 
			
		||||
                    FHEM::Automation::ShuttersControl::Shutters::CommandSet(
 | 
			
		||||
                        $hash, $shuttersDev, $posValue );
 | 
			
		||||
                }
 | 
			
		||||
                elsif (
 | 
			
		||||
                    (
 | 
			
		||||
                        $getIsDay
 | 
			
		||||
                        || $getUp eq 'roommate'
 | 
			
		||||
                    )
 | 
			
		||||
                       ( $getIsDay || $getUp eq 'roommate' )
 | 
			
		||||
                    && IsAfterShuttersTimeBlocking($shuttersDev)
 | 
			
		||||
                    && (   $getModeUp eq 'home'
 | 
			
		||||
                        || $getModeUp eq 'always' )
 | 
			
		||||
@@ -807,7 +794,7 @@ sub EventProcessingRoommate {
 | 
			
		||||
                    {
 | 
			
		||||
                        $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                          ->setLastDrive('shading in');
 | 
			
		||||
                        FHEM::Automation::ShuttersControl::ShuttersCommandSet(
 | 
			
		||||
                        FHEM::Automation::ShuttersControl::Shutters::CommandSet(
 | 
			
		||||
                            $hash,
 | 
			
		||||
                            $shuttersDev,
 | 
			
		||||
                            $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
@@ -853,7 +840,7 @@ sub EventProcessingRoommate {
 | 
			
		||||
                            )
 | 
			
		||||
                          );
 | 
			
		||||
 | 
			
		||||
                        FHEM::Automation::ShuttersControl::ShuttersCommandSet(
 | 
			
		||||
                        FHEM::Automation::ShuttersControl::Shutters::CommandSet(
 | 
			
		||||
                            $hash,
 | 
			
		||||
                            $shuttersDev,
 | 
			
		||||
                            $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
@@ -869,11 +856,9 @@ sub EventProcessingRoommate {
 | 
			
		||||
            'absent'
 | 
			
		||||
            && ( $FHEM::Automation::ShuttersControl::ascDev
 | 
			
		||||
                ->getAutoShuttersControlEvening eq 'on'
 | 
			
		||||
                || $getDown eq
 | 
			
		||||
                'roommate' )
 | 
			
		||||
                || $getDown eq 'roommate' )
 | 
			
		||||
            && ( IsAfterShuttersManualBlocking($shuttersDev)
 | 
			
		||||
                || $getDown eq
 | 
			
		||||
                'roommate' )
 | 
			
		||||
                || $getDown eq 'roommate' )
 | 
			
		||||
          )
 | 
			
		||||
        {
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
 | 
			
		||||
@@ -898,14 +883,13 @@ sub EventProcessingRoommate {
 | 
			
		||||
                      . ' - ventilate mode' );
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            FHEM::Automation::ShuttersControl::ShuttersCommandSet( $hash,
 | 
			
		||||
            FHEM::Automation::ShuttersControl::Shutters::CommandSet( $hash,
 | 
			
		||||
                $shuttersDev, $posValue );
 | 
			
		||||
        }
 | 
			
		||||
        elsif (
 | 
			
		||||
            $event eq 'absent'
 | 
			
		||||
            && (  !$getIsDay
 | 
			
		||||
                || $getDown eq
 | 
			
		||||
                'roommate'
 | 
			
		||||
                || $getDown eq 'roommate'
 | 
			
		||||
                || $FHEM::Automation::ShuttersControl::shutters->getShadingMode
 | 
			
		||||
                eq 'absent'
 | 
			
		||||
                || $FHEM::Automation::ShuttersControl::shutters->getModeUp eq
 | 
			
		||||
@@ -914,7 +898,7 @@ sub EventProcessingRoommate {
 | 
			
		||||
                'absent' )
 | 
			
		||||
          )
 | 
			
		||||
        {
 | 
			
		||||
            Log3( $name, 4,
 | 
			
		||||
            ::Log3( $name, 4,
 | 
			
		||||
"AutoShuttersControl ($name) - EventProcessingRoommate absent: $shuttersDev"
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
@@ -922,42 +906,36 @@ sub EventProcessingRoommate {
 | 
			
		||||
                   $getIsDay
 | 
			
		||||
                && $FHEM::Automation::ShuttersControl::shutters->getIfInShading
 | 
			
		||||
                && !$FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                  ->getQueryShuttersPos(
 | 
			
		||||
                      $FHEM::Automation::ShuttersControl::shutters->getShadingPos
 | 
			
		||||
                  )
 | 
			
		||||
                ->getQueryShuttersPos(
 | 
			
		||||
                    $FHEM::Automation::ShuttersControl::shutters->getShadingPos
 | 
			
		||||
                )
 | 
			
		||||
                && $FHEM::Automation::ShuttersControl::shutters->getShadingMode
 | 
			
		||||
                eq 'absent'
 | 
			
		||||
              )
 | 
			
		||||
            {
 | 
			
		||||
                Log3( $name, 4,
 | 
			
		||||
                ::Log3( $name, 4,
 | 
			
		||||
"AutoShuttersControl ($name) - EventProcessingRoommate Shading: $shuttersDev"
 | 
			
		||||
                );
 | 
			
		||||
 | 
			
		||||
                $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
 | 
			
		||||
                    'shading in');
 | 
			
		||||
                FHEM::Automation::ShuttersControl::ShuttersCommandSet(
 | 
			
		||||
                FHEM::Automation::ShuttersControl::Shutters::CommandSet(
 | 
			
		||||
                    $hash,
 | 
			
		||||
                    $shuttersDev,
 | 
			
		||||
                    $FHEM::Automation::ShuttersControl::shutters->getShadingPos
 | 
			
		||||
                );
 | 
			
		||||
            }
 | 
			
		||||
            elsif (
 | 
			
		||||
                (
 | 
			
		||||
                      !$getIsDay
 | 
			
		||||
                    || $getDown eq
 | 
			
		||||
                    'roommate'
 | 
			
		||||
                )
 | 
			
		||||
            elsif (( !$getIsDay || $getDown eq 'roommate' )
 | 
			
		||||
                && $getModeDown eq 'absent'
 | 
			
		||||
                && $getRoommatesStatus eq 'absent'
 | 
			
		||||
              )
 | 
			
		||||
                && $getRoommatesStatus eq 'absent' )
 | 
			
		||||
            {
 | 
			
		||||
                Log3( $name, 4,
 | 
			
		||||
                ::Log3( $name, 4,
 | 
			
		||||
"AutoShuttersControl ($name) - EventProcessingRoommate Down: $shuttersDev"
 | 
			
		||||
                );
 | 
			
		||||
 | 
			
		||||
                $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
 | 
			
		||||
                    'roommate absent');
 | 
			
		||||
                FHEM::Automation::ShuttersControl::ShuttersCommandSet(
 | 
			
		||||
                FHEM::Automation::ShuttersControl::Shutters::CommandSet(
 | 
			
		||||
                    $hash,
 | 
			
		||||
                    $shuttersDev,
 | 
			
		||||
                    $FHEM::Automation::ShuttersControl::shutters->getClosedPos
 | 
			
		||||
@@ -968,18 +946,18 @@ sub EventProcessingRoommate {
 | 
			
		||||
                'absent'
 | 
			
		||||
                && $getRoommatesStatus eq 'absent' )
 | 
			
		||||
            {
 | 
			
		||||
                Log3( $name, 4,
 | 
			
		||||
                ::Log3( $name, 4,
 | 
			
		||||
"AutoShuttersControl ($name) - EventProcessingRoommate Up: $shuttersDev"
 | 
			
		||||
                );
 | 
			
		||||
 | 
			
		||||
                $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
 | 
			
		||||
                    'roommate absent');
 | 
			
		||||
                FHEM::Automation::ShuttersControl::ShuttersCommandSet( $hash,
 | 
			
		||||
                FHEM::Automation::ShuttersControl::Shutters::CommandSet( $hash,
 | 
			
		||||
                    $shuttersDev,
 | 
			
		||||
                    $FHEM::Automation::ShuttersControl::shutters->getOpenPos );
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            Log3( $name, 4,
 | 
			
		||||
            ::Log3( $name, 4,
 | 
			
		||||
"AutoShuttersControl ($name) - EventProcessingRoommate NICHTS: $shuttersDev"
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
@@ -1247,7 +1225,7 @@ sub EventProcessingResidents {
 | 
			
		||||
                ->getSelfDefenseState
 | 
			
		||||
              )
 | 
			
		||||
            {
 | 
			
		||||
                RemoveInternalTimer(
 | 
			
		||||
                ::RemoveInternalTimer(
 | 
			
		||||
                    $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                      ->getSelfDefenseAbsentTimerhash )
 | 
			
		||||
                  if ( $getResidentsLastStatus eq 'absent'
 | 
			
		||||
@@ -1508,8 +1486,8 @@ sub EventProcessingBrightness {
 | 
			
		||||
                (
 | 
			
		||||
                    (
 | 
			
		||||
                        (
 | 
			
		||||
                            int( gettimeofday() / 86400 ) == int(
 | 
			
		||||
                                computeAlignTime(
 | 
			
		||||
                            int( ::gettimeofday() / 86400 ) == int(
 | 
			
		||||
                                ::computeAlignTime(
 | 
			
		||||
                                    '24:00',
 | 
			
		||||
                                    $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                                      ->getTimeUpEarly
 | 
			
		||||
@@ -1530,8 +1508,8 @@ sub EventProcessingBrightness {
 | 
			
		||||
                            )
 | 
			
		||||
                        )
 | 
			
		||||
                        || (
 | 
			
		||||
                            int( gettimeofday() / 86400 ) == int(
 | 
			
		||||
                                computeAlignTime(
 | 
			
		||||
                            int( ::gettimeofday() / 86400 ) == int(
 | 
			
		||||
                                ::computeAlignTime(
 | 
			
		||||
                                    '24:00',
 | 
			
		||||
                                    $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                                      ->getTimeUpWeHoliday
 | 
			
		||||
@@ -1544,8 +1522,8 @@ sub EventProcessingBrightness {
 | 
			
		||||
                            ->getTimeUpWeHoliday ne '01:25'
 | 
			
		||||
                        )
 | 
			
		||||
                    )
 | 
			
		||||
                    && int( gettimeofday() / 86400 ) == int(
 | 
			
		||||
                        computeAlignTime(
 | 
			
		||||
                    && int( ::gettimeofday() / 86400 ) == int(
 | 
			
		||||
                        ::computeAlignTime(
 | 
			
		||||
                            '24:00',
 | 
			
		||||
                            $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                              ->getTimeUpLate
 | 
			
		||||
@@ -1554,8 +1532,8 @@ sub EventProcessingBrightness {
 | 
			
		||||
 | 
			
		||||
                    || (
 | 
			
		||||
                        (
 | 
			
		||||
                            int( gettimeofday() / 86400 ) != int(
 | 
			
		||||
                                computeAlignTime(
 | 
			
		||||
                            int( ::gettimeofday() / 86400 ) != int(
 | 
			
		||||
                                ::computeAlignTime(
 | 
			
		||||
                                    '24:00',
 | 
			
		||||
                                    $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                                      ->getTimeUpEarly
 | 
			
		||||
@@ -1576,8 +1554,8 @@ sub EventProcessingBrightness {
 | 
			
		||||
                            )
 | 
			
		||||
                        )
 | 
			
		||||
                        || (
 | 
			
		||||
                            int( gettimeofday() / 86400 ) != int(
 | 
			
		||||
                                computeAlignTime(
 | 
			
		||||
                            int( ::gettimeofday() / 86400 ) != int(
 | 
			
		||||
                                ::computeAlignTime(
 | 
			
		||||
                                    '24:00',
 | 
			
		||||
                                    $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                                      ->getTimeUpWeHoliday
 | 
			
		||||
@@ -1590,8 +1568,8 @@ sub EventProcessingBrightness {
 | 
			
		||||
                            ->getTimeUpWeHoliday ne '01:25'
 | 
			
		||||
                        )
 | 
			
		||||
                    )
 | 
			
		||||
                    && int( gettimeofday() / 86400 ) != int(
 | 
			
		||||
                        computeAlignTime(
 | 
			
		||||
                    && int( ::gettimeofday() / 86400 ) != int(
 | 
			
		||||
                        ::computeAlignTime(
 | 
			
		||||
                            '24:00',
 | 
			
		||||
                            $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                              ->getTimeUpLate
 | 
			
		||||
@@ -1600,15 +1578,15 @@ sub EventProcessingBrightness {
 | 
			
		||||
                )
 | 
			
		||||
                && (
 | 
			
		||||
                    (
 | 
			
		||||
                        int( gettimeofday() / 86400 ) == int(
 | 
			
		||||
                            computeAlignTime(
 | 
			
		||||
                        int( ::gettimeofday() / 86400 ) == int(
 | 
			
		||||
                            ::computeAlignTime(
 | 
			
		||||
                                '24:00',
 | 
			
		||||
                                $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                                  ->getTimeDownEarly
 | 
			
		||||
                            ) / 86400
 | 
			
		||||
                        )
 | 
			
		||||
                        && int( gettimeofday() / 86400 ) == int(
 | 
			
		||||
                            computeAlignTime(
 | 
			
		||||
                        && int( ::gettimeofday() / 86400 ) == int(
 | 
			
		||||
                            ::computeAlignTime(
 | 
			
		||||
                                '24:00',
 | 
			
		||||
                                $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                                  ->getTimeDownLate
 | 
			
		||||
@@ -1616,15 +1594,15 @@ sub EventProcessingBrightness {
 | 
			
		||||
                        )
 | 
			
		||||
                    )
 | 
			
		||||
                    || (
 | 
			
		||||
                        int( gettimeofday() / 86400 ) != int(
 | 
			
		||||
                            computeAlignTime(
 | 
			
		||||
                        int( ::gettimeofday() / 86400 ) != int(
 | 
			
		||||
                            ::computeAlignTime(
 | 
			
		||||
                                '24:00',
 | 
			
		||||
                                $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                                  ->getTimeDownEarly
 | 
			
		||||
                            ) / 86400
 | 
			
		||||
                        )
 | 
			
		||||
                        && int( gettimeofday() / 86400 ) != int(
 | 
			
		||||
                            computeAlignTime(
 | 
			
		||||
                        && int( ::gettimeofday() / 86400 ) != int(
 | 
			
		||||
                            ::computeAlignTime(
 | 
			
		||||
                                '24:00',
 | 
			
		||||
                                $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                                  ->getTimeDownLate
 | 
			
		||||
@@ -1697,8 +1675,8 @@ sub EventProcessingBrightness {
 | 
			
		||||
            (
 | 
			
		||||
                (
 | 
			
		||||
                    (
 | 
			
		||||
                        int( gettimeofday() / 86400 ) != int(
 | 
			
		||||
                            computeAlignTime(
 | 
			
		||||
                        int( ::gettimeofday() / 86400 ) != int(
 | 
			
		||||
                            ::computeAlignTime(
 | 
			
		||||
                                '24:00',
 | 
			
		||||
                                $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                                  ->getTimeUpEarly
 | 
			
		||||
@@ -1718,8 +1696,8 @@ sub EventProcessingBrightness {
 | 
			
		||||
                        )
 | 
			
		||||
                    )
 | 
			
		||||
                    || (
 | 
			
		||||
                        int( gettimeofday() / 86400 ) != int(
 | 
			
		||||
                            computeAlignTime(
 | 
			
		||||
                        int( ::gettimeofday() / 86400 ) != int(
 | 
			
		||||
                            ::computeAlignTime(
 | 
			
		||||
                                '24:00',
 | 
			
		||||
                                $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                                  ->getTimeUpWeHoliday
 | 
			
		||||
@@ -1732,8 +1710,8 @@ sub EventProcessingBrightness {
 | 
			
		||||
                        ->getTimeUpWeHoliday ne '01:25'
 | 
			
		||||
                    )
 | 
			
		||||
                )
 | 
			
		||||
                && int( gettimeofday() / 86400 ) == int(
 | 
			
		||||
                    computeAlignTime(
 | 
			
		||||
                && int( ::gettimeofday() / 86400 ) == int(
 | 
			
		||||
                    ::computeAlignTime(
 | 
			
		||||
                        '24:00',
 | 
			
		||||
                        $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                          ->getTimeUpLate
 | 
			
		||||
@@ -1763,7 +1741,7 @@ sub EventProcessingBrightness {
 | 
			
		||||
            )
 | 
			
		||||
          )
 | 
			
		||||
        {
 | 
			
		||||
            Log3( $name, 4,
 | 
			
		||||
            ::Log3( $name, 4,
 | 
			
		||||
"AutoShuttersControl ($shuttersDev) - EventProcessingBrightness: Steuerung für Morgens"
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
@@ -1822,7 +1800,7 @@ sub EventProcessingBrightness {
 | 
			
		||||
                          ->setPrivacyUpStatus(2);
 | 
			
		||||
                        $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                          ->setLastDrive('brightness privacy day open');
 | 
			
		||||
                        FHEM::Automation::ShuttersControl::ShuttersCommandSet(
 | 
			
		||||
                        FHEM::Automation::ShuttersControl::Shutters::CommandSet(
 | 
			
		||||
                            $hash,
 | 
			
		||||
                            $shuttersDev,
 | 
			
		||||
                            $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
@@ -1840,7 +1818,7 @@ sub EventProcessingBrightness {
 | 
			
		||||
                            '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: '
 | 
			
		||||
                              . ' - Verarbeitung für Sunrise Privacy Down. Roommatestatus korrekt zum fahren. Fahrbefehl wird an die Funktion FnFHEM::Automation::ShuttersControl::Shutters::CommandSet gesendet. Grund des fahrens: '
 | 
			
		||||
                              . $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                              ->getLastDrive );
 | 
			
		||||
 | 
			
		||||
@@ -1859,7 +1837,7 @@ sub EventProcessingBrightness {
 | 
			
		||||
                          ->setPrivacyUpStatus(0)
 | 
			
		||||
                          if ( $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                            ->getPrivacyUpStatus == 2 );
 | 
			
		||||
                        FHEM::Automation::ShuttersControl::ShuttersCommandSet(
 | 
			
		||||
                        FHEM::Automation::ShuttersControl::Shutters::CommandSet(
 | 
			
		||||
                            $hash,
 | 
			
		||||
                            $shuttersDev,
 | 
			
		||||
                            $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
@@ -1870,7 +1848,7 @@ sub EventProcessingBrightness {
 | 
			
		||||
                            '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: '
 | 
			
		||||
                              . ' - Verarbeitung für Sunrise. Roommatestatus korrekt zum fahren. Fahrbefehl wird an die Funktion FnFHEM::Automation::ShuttersControl::Shutters::CommandSet gesendet. Grund des fahrens: '
 | 
			
		||||
                              . $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                              ->getLastDrive );
 | 
			
		||||
                    }
 | 
			
		||||
@@ -1888,13 +1866,15 @@ sub EventProcessingBrightness {
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        elsif (
 | 
			
		||||
            int( gettimeofday() / 86400 ) != int(
 | 
			
		||||
                computeAlignTime( '24:00',
 | 
			
		||||
            int( ::gettimeofday() / 86400 ) != int(
 | 
			
		||||
                ::computeAlignTime(
 | 
			
		||||
                    '24:00',
 | 
			
		||||
                    $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                      ->getTimeDownEarly ) / 86400
 | 
			
		||||
                      ->getTimeDownEarly
 | 
			
		||||
                ) / 86400
 | 
			
		||||
            )
 | 
			
		||||
            && int( gettimeofday() / 86400 ) == int(
 | 
			
		||||
                computeAlignTime(
 | 
			
		||||
            && int( ::gettimeofday() / 86400 ) == int(
 | 
			
		||||
                ::computeAlignTime(
 | 
			
		||||
                    '24:00',
 | 
			
		||||
                    $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                      ->getTimeDownLate
 | 
			
		||||
@@ -1914,7 +1894,7 @@ sub EventProcessingBrightness {
 | 
			
		||||
            ->getAutoShuttersControlEvening eq 'on'
 | 
			
		||||
          )
 | 
			
		||||
        {
 | 
			
		||||
            Log3( $name, 4,
 | 
			
		||||
            ::Log3( $name, 4,
 | 
			
		||||
"AutoShuttersControl ($shuttersDev) - EventProcessingBrightness: Steuerung für Abends"
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
@@ -1973,7 +1953,7 @@ sub EventProcessingBrightness {
 | 
			
		||||
                        '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: '
 | 
			
		||||
                          . ' - Verarbeitung für Sunset Privacy Down. Roommatestatus korrekt zum fahren. Fahrbefehl wird an die Funktion FnFHEM::Automation::ShuttersControl::Shutters::CommandSet gesendet. Grund des fahrens: '
 | 
			
		||||
                          . $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                          ->getLastDrive );
 | 
			
		||||
                }
 | 
			
		||||
@@ -2029,14 +2009,14 @@ sub EventProcessingBrightness {
 | 
			
		||||
                    $FHEM::Automation::ShuttersControl::shutters->setSunset(1);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                FHEM::Automation::ShuttersControl::ShuttersCommandSet( $hash,
 | 
			
		||||
                FHEM::Automation::ShuttersControl::Shutters::CommandSet( $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: '
 | 
			
		||||
                      . ' - Verarbeitung für Sunset. Roommatestatus korrekt zum fahren. Fahrbefehl wird an die Funktion FnFHEM::Automation::ShuttersControl::Shutters::CommandSet gesendet. Zielposition: '
 | 
			
		||||
                      . $posValue
 | 
			
		||||
                      . ' Grund des fahrens: '
 | 
			
		||||
                      . $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
@@ -2093,7 +2073,7 @@ sub EventProcessingShadingBrightness {
 | 
			
		||||
        : $FHEM::Automation::ShuttersControl::ascDev->getOutTemp
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    Log3( $name, 4,
 | 
			
		||||
    ::Log3( $name, 4,
 | 
			
		||||
        "AutoShuttersControl ($shuttersDev) - EventProcessingShadingBrightness"
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
@@ -2104,7 +2084,7 @@ sub EventProcessingShadingBrightness {
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    if ( $events =~ m{$reading:\s(\d+(\.\d+)?)}xms ) {
 | 
			
		||||
        Log3(
 | 
			
		||||
        ::Log3(
 | 
			
		||||
            $name, 4,
 | 
			
		||||
"AutoShuttersControl ($shuttersDev) - EventProcessingShadingBrightness
 | 
			
		||||
            Brightness: " . $1
 | 
			
		||||
@@ -2271,23 +2251,23 @@ sub EventProcessingPartyMode {
 | 
			
		||||
                && $FHEM::Automation::ShuttersControl::shutters->getSubTyp eq
 | 
			
		||||
                'threestate' )
 | 
			
		||||
            {
 | 
			
		||||
                Log3( $name, 4,
 | 
			
		||||
                ::Log3( $name, 4,
 | 
			
		||||
"AutoShuttersControl ($name) - EventProcessingPartyMode Fenster offen"
 | 
			
		||||
                );
 | 
			
		||||
                $FHEM::Automation::ShuttersControl::shutters->setDelayCmd(
 | 
			
		||||
                    $FHEM::Automation::ShuttersControl::shutters->getClosedPos
 | 
			
		||||
                );
 | 
			
		||||
                Log3( $name, 4,
 | 
			
		||||
                ::Log3( $name, 4,
 | 
			
		||||
"AutoShuttersControl ($name) - EventProcessingPartyMode - Spring in ShuttersCommandDelaySet"
 | 
			
		||||
                );
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                Log3( $name, 4,
 | 
			
		||||
                ::Log3( $name, 4,
 | 
			
		||||
"AutoShuttersControl ($name) - EventProcessingPartyMode Fenster nicht offen"
 | 
			
		||||
                );
 | 
			
		||||
                $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
 | 
			
		||||
                    'drive after party mode');
 | 
			
		||||
                FHEM::Automation::ShuttersControl::ShuttersCommandSet(
 | 
			
		||||
                FHEM::Automation::ShuttersControl::Shutters::CommandSet(
 | 
			
		||||
                    $hash,
 | 
			
		||||
                    $shuttersDev,
 | 
			
		||||
                    (
 | 
			
		||||
@@ -2313,7 +2293,7 @@ sub EventProcessingPartyMode {
 | 
			
		||||
        {
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
 | 
			
		||||
                'drive after party mode');
 | 
			
		||||
            FHEM::Automation::ShuttersControl::ShuttersCommandSet( $hash,
 | 
			
		||||
            FHEM::Automation::ShuttersControl::Shutters::CommandSet( $hash,
 | 
			
		||||
                $shuttersDev,
 | 
			
		||||
                $FHEM::Automation::ShuttersControl::shutters->getDelayCmd );
 | 
			
		||||
        }
 | 
			
		||||
@@ -2337,7 +2317,7 @@ sub EventProcessingAdvShuttersClose {
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
 | 
			
		||||
            'adv delay close');
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::shutters->setAdvDelay(1);
 | 
			
		||||
        FHEM::Automation::ShuttersControl::ShuttersCommandSet(
 | 
			
		||||
        FHEM::Automation::ShuttersControl::Shutters::CommandSet(
 | 
			
		||||
            $hash,
 | 
			
		||||
            $shuttersDev,
 | 
			
		||||
            (
 | 
			
		||||
@@ -2373,8 +2353,8 @@ sub EventProcessingShutters {
 | 
			
		||||
                'EventProcessingShutters: '
 | 
			
		||||
              . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
 | 
			
		||||
              . ' - Event vom Rollo erkannt. Es wird nun eine etwaige manuelle Fahrt ausgewertet.'
 | 
			
		||||
              . ' Int von gettimeofday: '
 | 
			
		||||
              . int( gettimeofday() )
 | 
			
		||||
              . ' Int von ::gettimeofday: '
 | 
			
		||||
              . int( ::gettimeofday() )
 | 
			
		||||
              . ' Last Position Timestamp: '
 | 
			
		||||
              . $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
              ->getLastPosTimestamp
 | 
			
		||||
@@ -2388,13 +2368,13 @@ sub EventProcessingShutters {
 | 
			
		||||
 | 
			
		||||
        if (
 | 
			
		||||
            (
 | 
			
		||||
                int( gettimeofday() ) -
 | 
			
		||||
                int( ::gettimeofday() ) -
 | 
			
		||||
                $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                ->getLastPosTimestamp
 | 
			
		||||
            ) >
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::shutters->getDriveUpMaxDuration
 | 
			
		||||
            && (
 | 
			
		||||
                int( gettimeofday() ) -
 | 
			
		||||
                int( ::gettimeofday() ) -
 | 
			
		||||
                $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                ->getLastManPosTimestamp ) >
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::shutters->getDriveUpMaxDuration
 | 
			
		||||
@@ -2497,7 +2477,7 @@ sub EventProcessingExternalTriggerDevice {
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::shutters->setNoDelay(1);
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
              ->setExternalTriggerStatus(1);
 | 
			
		||||
            FHEM::Automation::ShuttersControl::ShuttersCommandSet( $hash,
 | 
			
		||||
            FHEM::Automation::ShuttersControl::Shutters::CommandSet( $hash,
 | 
			
		||||
                $shuttersDev, $triggerPosActive2 );
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
@@ -2506,7 +2486,7 @@ sub EventProcessingExternalTriggerDevice {
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::shutters->setNoDelay(1);
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
              ->setExternalTriggerStatus(1);
 | 
			
		||||
            FHEM::Automation::ShuttersControl::ShuttersCommandSet( $hash,
 | 
			
		||||
            FHEM::Automation::ShuttersControl::Shutters::CommandSet( $hash,
 | 
			
		||||
                $shuttersDev, $triggerPosActive );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -2530,7 +2510,7 @@ sub EventProcessingExternalTriggerDevice {
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::shutters->setNoDelay(1);
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::shutters->setExternalTriggerStatus(
 | 
			
		||||
            0);
 | 
			
		||||
        FHEM::Automation::ShuttersControl::ShuttersCommandSet(
 | 
			
		||||
        FHEM::Automation::ShuttersControl::Shutters::CommandSet(
 | 
			
		||||
            $hash,
 | 
			
		||||
            $shuttersDev,
 | 
			
		||||
            (
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
###############################################################################
 | 
			
		||||
#
 | 
			
		||||
# Developed with Kate
 | 
			
		||||
# Developed with VSCodium and richterger perl plugin
 | 
			
		||||
#
 | 
			
		||||
#  (c) 2018-2021 Copyright: Marko Oldenburg (fhemsupport@cooltux.net)
 | 
			
		||||
#  (c) 2018-2022 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net)
 | 
			
		||||
#  All rights reserved
 | 
			
		||||
#
 | 
			
		||||
#   Special thanks goes to:
 | 
			
		||||
@@ -50,7 +50,7 @@ our @ISA       = qw(Exporter);
 | 
			
		||||
our @EXPORT_OK = qw(
 | 
			
		||||
  PositionValueWindowRec
 | 
			
		||||
  AutoSearchTwilightDev
 | 
			
		||||
  GetAttrValues
 | 
			
		||||
  Get::AttrValues
 | 
			
		||||
  CheckIfShuttersWindowRecOpen
 | 
			
		||||
  ExtractNotifyDevFromEvent
 | 
			
		||||
  ShuttersSunrise
 | 
			
		||||
@@ -69,7 +69,7 @@ our %EXPORT_TAGS = (
 | 
			
		||||
        qw(
 | 
			
		||||
          PositionValueWindowRec
 | 
			
		||||
          AutoSearchTwilightDev
 | 
			
		||||
          GetAttrValues
 | 
			
		||||
          Get::AttrValues
 | 
			
		||||
          CheckIfShuttersWindowRecOpen
 | 
			
		||||
          ExtractNotifyDevFromEvent
 | 
			
		||||
          ShuttersSunrise
 | 
			
		||||
@@ -89,21 +89,7 @@ our %EXPORT_TAGS = (
 | 
			
		||||
use GPUtils qw(GP_Import);
 | 
			
		||||
## Import der FHEM Funktionen
 | 
			
		||||
BEGIN {
 | 
			
		||||
    GP_Import(
 | 
			
		||||
        qw(
 | 
			
		||||
          devspec2array
 | 
			
		||||
          CommandAttr
 | 
			
		||||
          AttrVal
 | 
			
		||||
          Log3
 | 
			
		||||
          computeAlignTime
 | 
			
		||||
          gettimeofday
 | 
			
		||||
          sunset
 | 
			
		||||
          sunset_abs
 | 
			
		||||
          sunrise
 | 
			
		||||
          sunrise_abs
 | 
			
		||||
          cmdFromAnalyze
 | 
			
		||||
          )
 | 
			
		||||
    );
 | 
			
		||||
    GP_Import(qw(cmdFromAnalyze));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub PositionValueWindowRec {
 | 
			
		||||
@@ -156,24 +142,26 @@ sub AutoSearchTwilightDev {
 | 
			
		||||
 | 
			
		||||
    my $name = $hash->{NAME};
 | 
			
		||||
 | 
			
		||||
    if ( devspec2array('TYPE=(Astro|Twilight)') > 0 ) {
 | 
			
		||||
        CommandAttr( undef,
 | 
			
		||||
    if ( ::devspec2array('TYPE=(Astro|Twilight)') > 0 ) {
 | 
			
		||||
        ::CommandAttr( undef,
 | 
			
		||||
                $name
 | 
			
		||||
              . ' ASC_twilightDevice '
 | 
			
		||||
              . ( devspec2array('TYPE=(Astro|Twilight)') )[0] )
 | 
			
		||||
          if ( AttrVal( $name, 'ASC_twilightDevice', 'none' ) eq 'none' );
 | 
			
		||||
              . ( ::devspec2array('TYPE=(Astro|Twilight)') )[0] )
 | 
			
		||||
          if ( ::AttrVal( $name, 'ASC_twilightDevice', 'none' ) eq 'none' );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub GetAttrValues {
 | 
			
		||||
sub Get::AttrValues {
 | 
			
		||||
    my $dev      = shift;
 | 
			
		||||
    my $attribut = shift;
 | 
			
		||||
    my $default  = shift;
 | 
			
		||||
 | 
			
		||||
    my @values = split( ' ',
 | 
			
		||||
        AttrVal( $dev, $attribut, ( defined($default) ? $default : 'none' ) ) );
 | 
			
		||||
    my @values = split(
 | 
			
		||||
        ' ',
 | 
			
		||||
        ::AttrVal( $dev, $attribut, ( defined($default) ? $default : 'none' ) )
 | 
			
		||||
    );
 | 
			
		||||
    my ( $value1, $value2 ) = split( ':', $values[0] );
 | 
			
		||||
 | 
			
		||||
    my ( $value3, $value4, $value5, $value6, $value7, $value8 );
 | 
			
		||||
@@ -227,10 +215,10 @@ sub ExtractNotifyDevFromEvent {
 | 
			
		||||
 | 
			
		||||
    my %notifyDevs;
 | 
			
		||||
    while ( my $notifyDev = each %{ $hash->{monitoredDevs} } ) {
 | 
			
		||||
        Log3( $hash->{NAME}, 4,
 | 
			
		||||
        ::Log3( $hash->{NAME}, 4,
 | 
			
		||||
"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - NotifyDev: "
 | 
			
		||||
              . $notifyDev );
 | 
			
		||||
        Log3( $hash->{NAME}, 5,
 | 
			
		||||
        ::Log3( $hash->{NAME}, 5,
 | 
			
		||||
"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - ShuttersDev: "
 | 
			
		||||
              . $shuttersDev );
 | 
			
		||||
 | 
			
		||||
@@ -238,10 +226,10 @@ sub ExtractNotifyDevFromEvent {
 | 
			
		||||
            && $hash->{monitoredDevs}{$notifyDev}{$shuttersDev} eq
 | 
			
		||||
            $shuttersAttr )
 | 
			
		||||
        {
 | 
			
		||||
            Log3( $hash->{NAME}, 4,
 | 
			
		||||
            ::Log3( $hash->{NAME}, 4,
 | 
			
		||||
"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - ShuttersDevHash: "
 | 
			
		||||
                  . $hash->{monitoredDevs}{$notifyDev}{$shuttersDev} );
 | 
			
		||||
            Log3( $hash->{NAME}, 5,
 | 
			
		||||
            ::Log3( $hash->{NAME}, 5,
 | 
			
		||||
"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - return ShuttersDev: "
 | 
			
		||||
                  . $notifyDev );
 | 
			
		||||
            $notifyDevs{$notifyDev} = $shuttersDev;
 | 
			
		||||
@@ -279,24 +267,27 @@ sub _IsDay {
 | 
			
		||||
        (
 | 
			
		||||
            (
 | 
			
		||||
                (
 | 
			
		||||
                    int( gettimeofday() / 86400 ) != int(
 | 
			
		||||
                        computeAlignTime( '24:00',
 | 
			
		||||
                    int( ::gettimeofday() / 86400 ) != int(
 | 
			
		||||
                        ::computeAlignTime(
 | 
			
		||||
                            '24:00',
 | 
			
		||||
                            $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                              ->getTimeUpEarly ) / 86400
 | 
			
		||||
                              ->getTimeUpEarly
 | 
			
		||||
                        ) / 86400
 | 
			
		||||
                    )
 | 
			
		||||
                    && ( !IsWe()
 | 
			
		||||
                      || ( IsWe()
 | 
			
		||||
                        && ( $FHEM::Automation::ShuttersControl::ascDev
 | 
			
		||||
                          ->getSunriseTimeWeHoliday eq 'off'
 | 
			
		||||
                          || $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                            ->getTimeUpWeHoliday eq '01:25'
 | 
			
		||||
                           )
 | 
			
		||||
                         )
 | 
			
		||||
                    && (
 | 
			
		||||
                        !IsWe()
 | 
			
		||||
                        || (
 | 
			
		||||
                            IsWe()
 | 
			
		||||
                            && ( $FHEM::Automation::ShuttersControl::ascDev
 | 
			
		||||
                                ->getSunriseTimeWeHoliday eq 'off'
 | 
			
		||||
                                || $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                                ->getTimeUpWeHoliday eq '01:25' )
 | 
			
		||||
                        )
 | 
			
		||||
                    )
 | 
			
		||||
                )
 | 
			
		||||
                || (
 | 
			
		||||
                    int( gettimeofday() / 86400 ) != int(
 | 
			
		||||
                        computeAlignTime(
 | 
			
		||||
                    int( ::gettimeofday() / 86400 ) != int(
 | 
			
		||||
                        ::computeAlignTime(
 | 
			
		||||
                            '24:00',
 | 
			
		||||
                            $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                              ->getTimeUpWeHoliday
 | 
			
		||||
@@ -309,23 +300,23 @@ sub _IsDay {
 | 
			
		||||
                    ->getTimeUpWeHoliday ne '01:25'
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
            && int( gettimeofday() / 86400 ) == int(
 | 
			
		||||
                computeAlignTime(
 | 
			
		||||
            && int( ::gettimeofday() / 86400 ) == int(
 | 
			
		||||
                ::computeAlignTime(
 | 
			
		||||
                    '24:00',
 | 
			
		||||
                    $FHEM::Automation::ShuttersControl::shutters->getTimeUpLate
 | 
			
		||||
                ) / 86400
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
        || (
 | 
			
		||||
            int( gettimeofday() / 86400 ) != int(
 | 
			
		||||
                computeAlignTime(
 | 
			
		||||
            int( ::gettimeofday() / 86400 ) != int(
 | 
			
		||||
                ::computeAlignTime(
 | 
			
		||||
                    '24:00',
 | 
			
		||||
                    $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                      ->getTimeDownEarly
 | 
			
		||||
                ) / 86400
 | 
			
		||||
            )
 | 
			
		||||
            && int( gettimeofday() / 86400 ) == int(
 | 
			
		||||
                computeAlignTime(
 | 
			
		||||
            && int( ::gettimeofday() / 86400 ) == int(
 | 
			
		||||
                ::computeAlignTime(
 | 
			
		||||
                    '24:00',
 | 
			
		||||
                    $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                      ->getTimeDownLate
 | 
			
		||||
@@ -390,17 +381,22 @@ sub _IsDay {
 | 
			
		||||
              . $FHEM::Automation::ShuttersControl::shutters->getSunrise );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    $respIsDay = 1
 | 
			
		||||
      if (
 | 
			
		||||
           (  $FHEM::Automation::ShuttersControl::shutters->getDown eq 'roommate'
 | 
			
		||||
             and ( $FHEM::Automation::ShuttersControl::shutters->getRoommates ne 'asleep'
 | 
			
		||||
                or $FHEM::Automation::ShuttersControl::shutters->getRoommates ne 'gotosleep' )
 | 
			
		||||
           ) 
 | 
			
		||||
        or (  $FHEM::Automation::ShuttersControl::shutters->getUp eq 'roommate'
 | 
			
		||||
             and ( $FHEM::Automation::ShuttersControl::shutters->getRoommates ne 'asleep'
 | 
			
		||||
                or $FHEM::Automation::ShuttersControl::shutters->getRoommates ne 'gotosleep' )
 | 
			
		||||
           )
 | 
			
		||||
        (
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::shutters->getDown eq 'roommate'
 | 
			
		||||
            and ( $FHEM::Automation::ShuttersControl::shutters->getRoommates ne
 | 
			
		||||
                'asleep'
 | 
			
		||||
                or $FHEM::Automation::ShuttersControl::shutters->getRoommates
 | 
			
		||||
                ne 'gotosleep' )
 | 
			
		||||
        )
 | 
			
		||||
        or (
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::shutters->getUp eq 'roommate'
 | 
			
		||||
            and ( $FHEM::Automation::ShuttersControl::shutters->getRoommates ne
 | 
			
		||||
                'asleep'
 | 
			
		||||
                or $FHEM::Automation::ShuttersControl::shutters->getRoommates
 | 
			
		||||
                ne 'gotosleep' )
 | 
			
		||||
        )
 | 
			
		||||
      );
 | 
			
		||||
 | 
			
		||||
    return $respIsDay;
 | 
			
		||||
@@ -436,7 +432,7 @@ sub ShuttersSunrise {
 | 
			
		||||
    my $oldFuncHash =
 | 
			
		||||
      $FHEM::Automation::ShuttersControl::shutters->getInTimerFuncHash;
 | 
			
		||||
    my $shuttersSunriseUnixtime =
 | 
			
		||||
      computeAlignTime( '24:00', sunrise( 'REAL', 0, '4:30', '8:30' ) );
 | 
			
		||||
      ::computeAlignTime( '24:00', ::sunrise( 'REAL', 0, '4:30', '8:30' ) );
 | 
			
		||||
 | 
			
		||||
    if ( $tm eq 'unix' ) {
 | 
			
		||||
        if ( $FHEM::Automation::ShuttersControl::shutters->getUp eq 'astro' ) {
 | 
			
		||||
@@ -449,11 +445,11 @@ sub ShuttersSunrise {
 | 
			
		||||
                if ( !IsWe('tomorrow') ) {
 | 
			
		||||
                    if (
 | 
			
		||||
                        IsWe()
 | 
			
		||||
                        && int( gettimeofday() / 86400 ) == int(
 | 
			
		||||
                        && int( ::gettimeofday() / 86400 ) == int(
 | 
			
		||||
                            (
 | 
			
		||||
                                computeAlignTime(
 | 
			
		||||
                                ::computeAlignTime(
 | 
			
		||||
                                    '24:00',
 | 
			
		||||
                                    sunrise_abs(
 | 
			
		||||
                                    ::sunrise_abs(
 | 
			
		||||
                                        $autoAstroMode,
 | 
			
		||||
                                        0,
 | 
			
		||||
                                        $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
@@ -465,9 +461,9 @@ sub ShuttersSunrise {
 | 
			
		||||
                      )
 | 
			
		||||
                    {
 | 
			
		||||
                        $shuttersSunriseUnixtime = (
 | 
			
		||||
                            computeAlignTime(
 | 
			
		||||
                            ::computeAlignTime(
 | 
			
		||||
                                '24:00',
 | 
			
		||||
                                sunrise_abs(
 | 
			
		||||
                                ::sunrise_abs(
 | 
			
		||||
                                    $autoAstroMode,
 | 
			
		||||
                                    0,
 | 
			
		||||
                                    $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
@@ -477,11 +473,11 @@ sub ShuttersSunrise {
 | 
			
		||||
                        );
 | 
			
		||||
                    }
 | 
			
		||||
                    elsif (
 | 
			
		||||
                        int( gettimeofday() / 86400 ) == int(
 | 
			
		||||
                        int( ::gettimeofday() / 86400 ) == int(
 | 
			
		||||
                            (
 | 
			
		||||
                                computeAlignTime(
 | 
			
		||||
                                ::computeAlignTime(
 | 
			
		||||
                                    '24:00',
 | 
			
		||||
                                    sunrise_abs(
 | 
			
		||||
                                    ::sunrise_abs(
 | 
			
		||||
                                        $autoAstroMode,
 | 
			
		||||
                                        0,
 | 
			
		||||
                                        $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
@@ -495,9 +491,9 @@ sub ShuttersSunrise {
 | 
			
		||||
                      )
 | 
			
		||||
                    {
 | 
			
		||||
                        $shuttersSunriseUnixtime = (
 | 
			
		||||
                            computeAlignTime(
 | 
			
		||||
                            ::computeAlignTime(
 | 
			
		||||
                                '24:00',
 | 
			
		||||
                                sunrise_abs(
 | 
			
		||||
                                ::sunrise_abs(
 | 
			
		||||
                                    $autoAstroMode,
 | 
			
		||||
                                    0,
 | 
			
		||||
                                    $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
@@ -508,9 +504,9 @@ sub ShuttersSunrise {
 | 
			
		||||
                    }
 | 
			
		||||
                    else {
 | 
			
		||||
                        $shuttersSunriseUnixtime = (
 | 
			
		||||
                            computeAlignTime(
 | 
			
		||||
                            ::computeAlignTime(
 | 
			
		||||
                                '24:00',
 | 
			
		||||
                                sunrise_abs(
 | 
			
		||||
                                ::sunrise_abs(
 | 
			
		||||
                                    $autoAstroMode,
 | 
			
		||||
                                    0,
 | 
			
		||||
                                    $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
@@ -526,11 +522,11 @@ sub ShuttersSunrise {
 | 
			
		||||
                    if (
 | 
			
		||||
                        IsWe()
 | 
			
		||||
                        && (
 | 
			
		||||
                            int( gettimeofday() / 86400 ) == int(
 | 
			
		||||
                            int( ::gettimeofday() / 86400 ) == int(
 | 
			
		||||
                                (
 | 
			
		||||
                                    computeAlignTime(
 | 
			
		||||
                                    ::computeAlignTime(
 | 
			
		||||
                                        '24:00',
 | 
			
		||||
                                        sunrise_abs(
 | 
			
		||||
                                        ::sunrise_abs(
 | 
			
		||||
                                            $autoAstroMode,
 | 
			
		||||
                                            0,
 | 
			
		||||
                                            $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
@@ -539,11 +535,11 @@ sub ShuttersSunrise {
 | 
			
		||||
                                    ) + 1
 | 
			
		||||
                                ) / 86400
 | 
			
		||||
                            )
 | 
			
		||||
                            || int( gettimeofday() / 86400 ) != int(
 | 
			
		||||
                            || int( ::gettimeofday() / 86400 ) != int(
 | 
			
		||||
                                (
 | 
			
		||||
                                    computeAlignTime(
 | 
			
		||||
                                    ::computeAlignTime(
 | 
			
		||||
                                        '24:00',
 | 
			
		||||
                                        sunrise_abs(
 | 
			
		||||
                                        ::sunrise_abs(
 | 
			
		||||
                                            $autoAstroMode,
 | 
			
		||||
                                            0,
 | 
			
		||||
                                            $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
@@ -556,9 +552,9 @@ sub ShuttersSunrise {
 | 
			
		||||
                      )
 | 
			
		||||
                    {
 | 
			
		||||
                        $shuttersSunriseUnixtime = (
 | 
			
		||||
                            computeAlignTime(
 | 
			
		||||
                            ::computeAlignTime(
 | 
			
		||||
                                '24:00',
 | 
			
		||||
                                sunrise_abs(
 | 
			
		||||
                                ::sunrise_abs(
 | 
			
		||||
                                    $autoAstroMode,
 | 
			
		||||
                                    0,
 | 
			
		||||
                                    $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
@@ -568,11 +564,11 @@ sub ShuttersSunrise {
 | 
			
		||||
                        );
 | 
			
		||||
                    }
 | 
			
		||||
                    elsif (
 | 
			
		||||
                        int( gettimeofday() / 86400 ) == int(
 | 
			
		||||
                        int( ::gettimeofday() / 86400 ) == int(
 | 
			
		||||
                            (
 | 
			
		||||
                                computeAlignTime(
 | 
			
		||||
                                ::computeAlignTime(
 | 
			
		||||
                                    '24:00',
 | 
			
		||||
                                    sunrise_abs(
 | 
			
		||||
                                    ::sunrise_abs(
 | 
			
		||||
                                        $autoAstroMode,
 | 
			
		||||
                                        0,
 | 
			
		||||
                                        $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
@@ -586,9 +582,9 @@ sub ShuttersSunrise {
 | 
			
		||||
                      )
 | 
			
		||||
                    {
 | 
			
		||||
                        $shuttersSunriseUnixtime = (
 | 
			
		||||
                            computeAlignTime(
 | 
			
		||||
                            ::computeAlignTime(
 | 
			
		||||
                                '24:00',
 | 
			
		||||
                                sunrise_abs(
 | 
			
		||||
                                ::sunrise_abs(
 | 
			
		||||
                                    $autoAstroMode,
 | 
			
		||||
                                    0,
 | 
			
		||||
                                    $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
@@ -601,11 +597,11 @@ sub ShuttersSunrise {
 | 
			
		||||
                    }
 | 
			
		||||
                    else {
 | 
			
		||||
                        if (
 | 
			
		||||
                            int( gettimeofday() / 86400 ) == int(
 | 
			
		||||
                            int( ::gettimeofday() / 86400 ) == int(
 | 
			
		||||
                                (
 | 
			
		||||
                                    computeAlignTime(
 | 
			
		||||
                                    ::computeAlignTime(
 | 
			
		||||
                                        '24:00',
 | 
			
		||||
                                        sunrise_abs(
 | 
			
		||||
                                        ::sunrise_abs(
 | 
			
		||||
                                            $autoAstroMode,
 | 
			
		||||
                                            0,
 | 
			
		||||
                                            $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
@@ -617,9 +613,9 @@ sub ShuttersSunrise {
 | 
			
		||||
                          )
 | 
			
		||||
                        {
 | 
			
		||||
                            $shuttersSunriseUnixtime = (
 | 
			
		||||
                                computeAlignTime(
 | 
			
		||||
                                ::computeAlignTime(
 | 
			
		||||
                                    '24:00',
 | 
			
		||||
                                    sunrise_abs(
 | 
			
		||||
                                    ::sunrise_abs(
 | 
			
		||||
                                        $autoAstroMode,
 | 
			
		||||
                                        0,
 | 
			
		||||
                                        $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
@@ -630,9 +626,9 @@ sub ShuttersSunrise {
 | 
			
		||||
                        }
 | 
			
		||||
                        else {
 | 
			
		||||
                            $shuttersSunriseUnixtime = (
 | 
			
		||||
                                computeAlignTime(
 | 
			
		||||
                                ::computeAlignTime(
 | 
			
		||||
                                    '24:00',
 | 
			
		||||
                                    sunrise_abs(
 | 
			
		||||
                                    ::sunrise_abs(
 | 
			
		||||
                                        $autoAstroMode,
 | 
			
		||||
                                        0,
 | 
			
		||||
                                        $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
@@ -646,9 +642,9 @@ sub ShuttersSunrise {
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                $shuttersSunriseUnixtime = (
 | 
			
		||||
                    computeAlignTime(
 | 
			
		||||
                    ::computeAlignTime(
 | 
			
		||||
                        '24:00',
 | 
			
		||||
                        sunrise_abs(
 | 
			
		||||
                        ::sunrise_abs(
 | 
			
		||||
                            $autoAstroMode,
 | 
			
		||||
                            0,
 | 
			
		||||
                            $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
@@ -669,11 +665,11 @@ sub ShuttersSunrise {
 | 
			
		||||
            {
 | 
			
		||||
                if ( !IsWe('tomorrow') ) {
 | 
			
		||||
                    if (
 | 
			
		||||
                        int( gettimeofday() / 86400 ) == int(
 | 
			
		||||
                        int( ::gettimeofday() / 86400 ) == int(
 | 
			
		||||
                            (
 | 
			
		||||
                                computeAlignTime(
 | 
			
		||||
                                ::computeAlignTime(
 | 
			
		||||
                                    '24:00',
 | 
			
		||||
                                    sunrise_abs(
 | 
			
		||||
                                    ::sunrise_abs(
 | 
			
		||||
                                        $autoAstroMode,
 | 
			
		||||
                                        0,
 | 
			
		||||
                                        $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
@@ -689,16 +685,17 @@ sub ShuttersSunrise {
 | 
			
		||||
                        $shuttersSunriseUnixtime =
 | 
			
		||||
                          ( $shuttersSunriseUnixtime + 86400 )
 | 
			
		||||
                          if ( $shuttersSunriseUnixtime <
 | 
			
		||||
                            ( $oldFuncHash->{sunrisetime} + 180 )
 | 
			
		||||
                            && $oldFuncHash->{sunrisetime} < gettimeofday() );
 | 
			
		||||
                            ( $oldFuncHash->{::sunrisetime} + 180 )
 | 
			
		||||
                            && $oldFuncHash->{::sunrisetime} <
 | 
			
		||||
                            ::gettimeofday() );
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            elsif ( defined($oldFuncHash) && ref($oldFuncHash) eq 'HASH' ) {
 | 
			
		||||
                $shuttersSunriseUnixtime = ( $shuttersSunriseUnixtime + 86400 )
 | 
			
		||||
                  if ( $shuttersSunriseUnixtime <
 | 
			
		||||
                    ( $oldFuncHash->{sunrisetime} + 180 )
 | 
			
		||||
                    && $oldFuncHash->{sunrisetime} < gettimeofday() );
 | 
			
		||||
                    ( $oldFuncHash->{::sunrisetime} + 180 )
 | 
			
		||||
                    && $oldFuncHash->{::sunrisetime} < ::gettimeofday() );
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        elsif ( $FHEM::Automation::ShuttersControl::shutters->getUp eq 'time' )
 | 
			
		||||
@@ -711,8 +708,8 @@ sub ShuttersSunrise {
 | 
			
		||||
            {
 | 
			
		||||
                if ( !IsWe('tomorrow') ) {
 | 
			
		||||
                    if (
 | 
			
		||||
                        int( gettimeofday() / 86400 ) == int(
 | 
			
		||||
                            computeAlignTime(
 | 
			
		||||
                        int( ::gettimeofday() / 86400 ) == int(
 | 
			
		||||
                            ::computeAlignTime(
 | 
			
		||||
                                '24:00',
 | 
			
		||||
                                $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                                  ->getTimeUpWeHoliday
 | 
			
		||||
@@ -720,13 +717,13 @@ sub ShuttersSunrise {
 | 
			
		||||
                        )
 | 
			
		||||
                      )
 | 
			
		||||
                    {
 | 
			
		||||
                        $shuttersSunriseUnixtime = computeAlignTime( '24:00',
 | 
			
		||||
                        $shuttersSunriseUnixtime = ::computeAlignTime( '24:00',
 | 
			
		||||
                            $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                              ->getTimeUpWeHoliday );
 | 
			
		||||
                    }
 | 
			
		||||
                    elsif (
 | 
			
		||||
                        int( gettimeofday() / 86400 ) == int(
 | 
			
		||||
                            computeAlignTime(
 | 
			
		||||
                        int( ::gettimeofday() / 86400 ) == int(
 | 
			
		||||
                            ::computeAlignTime(
 | 
			
		||||
                                '24:00',
 | 
			
		||||
                                $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                                  ->getTimeUpEarly
 | 
			
		||||
@@ -736,12 +733,12 @@ sub ShuttersSunrise {
 | 
			
		||||
                        ->getSunrise
 | 
			
		||||
                      )
 | 
			
		||||
                    {
 | 
			
		||||
                        $shuttersSunriseUnixtime = computeAlignTime( '24:00',
 | 
			
		||||
                        $shuttersSunriseUnixtime = ::computeAlignTime( '24:00',
 | 
			
		||||
                            $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                              ->getTimeUpEarly ) + 86400;
 | 
			
		||||
                    }
 | 
			
		||||
                    else {
 | 
			
		||||
                        $shuttersSunriseUnixtime = computeAlignTime( '24:00',
 | 
			
		||||
                        $shuttersSunriseUnixtime = ::computeAlignTime( '24:00',
 | 
			
		||||
                            $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                              ->getTimeUpEarly );
 | 
			
		||||
                    }
 | 
			
		||||
@@ -749,8 +746,8 @@ sub ShuttersSunrise {
 | 
			
		||||
                else {
 | 
			
		||||
                    if (
 | 
			
		||||
                        IsWe()
 | 
			
		||||
                        && int( gettimeofday() / 86400 ) == int(
 | 
			
		||||
                            computeAlignTime(
 | 
			
		||||
                        && int( ::gettimeofday() / 86400 ) == int(
 | 
			
		||||
                            ::computeAlignTime(
 | 
			
		||||
                                '24:00',
 | 
			
		||||
                                $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                                  ->getTimeUpWeHoliday
 | 
			
		||||
@@ -758,13 +755,13 @@ sub ShuttersSunrise {
 | 
			
		||||
                        )
 | 
			
		||||
                      )
 | 
			
		||||
                    {
 | 
			
		||||
                        $shuttersSunriseUnixtime = computeAlignTime( '24:00',
 | 
			
		||||
                        $shuttersSunriseUnixtime = ::computeAlignTime( '24:00',
 | 
			
		||||
                            $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                              ->getTimeUpWeHoliday );
 | 
			
		||||
                    }
 | 
			
		||||
                    elsif (
 | 
			
		||||
                        int( gettimeofday() / 86400 ) == int(
 | 
			
		||||
                            computeAlignTime(
 | 
			
		||||
                        int( ::gettimeofday() / 86400 ) == int(
 | 
			
		||||
                            ::computeAlignTime(
 | 
			
		||||
                                '24:00',
 | 
			
		||||
                                $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                                  ->getTimeUpEarly
 | 
			
		||||
@@ -772,13 +769,13 @@ sub ShuttersSunrise {
 | 
			
		||||
                        )
 | 
			
		||||
                      )
 | 
			
		||||
                    {
 | 
			
		||||
                        $shuttersSunriseUnixtime = computeAlignTime( '24:00',
 | 
			
		||||
                        $shuttersSunriseUnixtime = ::computeAlignTime( '24:00',
 | 
			
		||||
                            $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                              ->getTimeUpEarly );
 | 
			
		||||
                    }
 | 
			
		||||
                    elsif (
 | 
			
		||||
                        int( gettimeofday() / 86400 ) != int(
 | 
			
		||||
                            computeAlignTime(
 | 
			
		||||
                        int( ::gettimeofday() / 86400 ) != int(
 | 
			
		||||
                            ::computeAlignTime(
 | 
			
		||||
                                '24:00',
 | 
			
		||||
                                $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                                  ->getTimeUpWeHoliday
 | 
			
		||||
@@ -786,19 +783,19 @@ sub ShuttersSunrise {
 | 
			
		||||
                        )
 | 
			
		||||
                      )
 | 
			
		||||
                    {
 | 
			
		||||
                        $shuttersSunriseUnixtime = computeAlignTime( '24:00',
 | 
			
		||||
                        $shuttersSunriseUnixtime = ::computeAlignTime( '24:00',
 | 
			
		||||
                            $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                              ->getTimeUpWeHoliday );
 | 
			
		||||
                    }
 | 
			
		||||
                    else {
 | 
			
		||||
                        $shuttersSunriseUnixtime = computeAlignTime( '24:00',
 | 
			
		||||
                        $shuttersSunriseUnixtime = ::computeAlignTime( '24:00',
 | 
			
		||||
                            $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                              ->getTimeUpWeHoliday ) + 86400;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                $shuttersSunriseUnixtime = computeAlignTime( '24:00',
 | 
			
		||||
                $shuttersSunriseUnixtime = ::computeAlignTime( '24:00',
 | 
			
		||||
                    $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                      ->getTimeUpEarly );
 | 
			
		||||
            }
 | 
			
		||||
@@ -806,15 +803,14 @@ sub ShuttersSunrise {
 | 
			
		||||
        elsif ( $FHEM::Automation::ShuttersControl::shutters->getUp eq
 | 
			
		||||
            'brightness' )
 | 
			
		||||
        {
 | 
			
		||||
            $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(
 | 
			
		||||
        return ::sunrise_abs(
 | 
			
		||||
            $autoAstroMode,
 | 
			
		||||
            0,
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly,
 | 
			
		||||
@@ -858,15 +854,15 @@ sub ShuttersSunset {
 | 
			
		||||
    my $oldFuncHash =
 | 
			
		||||
      $FHEM::Automation::ShuttersControl::shutters->getInTimerFuncHash;
 | 
			
		||||
    my $shuttersSunsetUnixtime =
 | 
			
		||||
      computeAlignTime( '24:00', sunset( 'REAL', 0, '15:30', '21:30' ) );
 | 
			
		||||
      ::computeAlignTime( '24:00', ::sunset( 'REAL', 0, '15:30', '21:30' ) );
 | 
			
		||||
 | 
			
		||||
    if ( $tm eq 'unix' ) {
 | 
			
		||||
        if ( $FHEM::Automation::ShuttersControl::shutters->getDown eq 'astro' )
 | 
			
		||||
        {
 | 
			
		||||
            $shuttersSunsetUnixtime = (
 | 
			
		||||
                computeAlignTime(
 | 
			
		||||
                ::computeAlignTime(
 | 
			
		||||
                    '24:00',
 | 
			
		||||
                    sunset_abs(
 | 
			
		||||
                    ::sunset_abs(
 | 
			
		||||
                        $autoAstroMode,
 | 
			
		||||
                        0,
 | 
			
		||||
                        $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
@@ -879,14 +875,14 @@ sub ShuttersSunset {
 | 
			
		||||
            if ( defined($oldFuncHash) && ref($oldFuncHash) eq 'HASH' ) {
 | 
			
		||||
                $shuttersSunsetUnixtime += 86400
 | 
			
		||||
                  if ( $shuttersSunsetUnixtime <
 | 
			
		||||
                    ( $oldFuncHash->{sunsettime} + 180 )
 | 
			
		||||
                    && $oldFuncHash->{sunsettime} < gettimeofday() );
 | 
			
		||||
                    ( $oldFuncHash->{::sunsettime} + 180 )
 | 
			
		||||
                    && $oldFuncHash->{::sunsettime} < ::gettimeofday() );
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        elsif (
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::shutters->getDown eq 'time' )
 | 
			
		||||
        {
 | 
			
		||||
            $shuttersSunsetUnixtime = computeAlignTime( '24:00',
 | 
			
		||||
            $shuttersSunsetUnixtime = ::computeAlignTime( '24:00',
 | 
			
		||||
                $FHEM::Automation::ShuttersControl::shutters->getTimeDownEarly
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
@@ -894,13 +890,13 @@ sub ShuttersSunset {
 | 
			
		||||
            'brightness' )
 | 
			
		||||
        {
 | 
			
		||||
            $shuttersSunsetUnixtime =
 | 
			
		||||
              computeAlignTime( '24:00',
 | 
			
		||||
              ::computeAlignTime( '24:00',
 | 
			
		||||
                $FHEM::Automation::ShuttersControl::shutters->getTimeDownLate );
 | 
			
		||||
        }
 | 
			
		||||
        return $shuttersSunsetUnixtime;
 | 
			
		||||
    }
 | 
			
		||||
    elsif ( $tm eq 'real' ) {
 | 
			
		||||
        return sunset_abs(
 | 
			
		||||
        return ::sunset_abs(
 | 
			
		||||
            $autoAstroMode,
 | 
			
		||||
            0,
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::shutters->getTimeDownEarly,
 | 
			
		||||
@@ -923,7 +919,7 @@ sub IsAfterShuttersTimeBlocking {
 | 
			
		||||
 | 
			
		||||
    if (
 | 
			
		||||
        (
 | 
			
		||||
            int( gettimeofday() ) -
 | 
			
		||||
            int( ::gettimeofday() ) -
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::shutters->getLastManPosTimestamp
 | 
			
		||||
        ) <
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::shutters->getBlockingTimeAfterManual
 | 
			
		||||
@@ -933,7 +929,7 @@ sub IsAfterShuttersTimeBlocking {
 | 
			
		||||
                $FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime
 | 
			
		||||
            )
 | 
			
		||||
            && $FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime
 | 
			
		||||
            - ( int( gettimeofday() ) ) <
 | 
			
		||||
            - ( int( ::gettimeofday() ) ) <
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
            ->getBlockingTimeBeforDayOpen
 | 
			
		||||
        )
 | 
			
		||||
@@ -943,7 +939,7 @@ sub IsAfterShuttersTimeBlocking {
 | 
			
		||||
                $FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime
 | 
			
		||||
            )
 | 
			
		||||
            && $FHEM::Automation::ShuttersControl::shutters->getSunsetUnixTime
 | 
			
		||||
            - ( int( gettimeofday() ) ) <
 | 
			
		||||
            - ( int( ::gettimeofday() ) ) <
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
            ->getBlockingTimeBeforNightClose
 | 
			
		||||
        )
 | 
			
		||||
@@ -982,7 +978,7 @@ sub IsAfterShuttersManualBlocking {
 | 
			
		||||
    }
 | 
			
		||||
    elsif (
 | 
			
		||||
        (
 | 
			
		||||
            int( gettimeofday() ) -
 | 
			
		||||
            int( ::gettimeofday() ) -
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::shutters->getLastManPosTimestamp
 | 
			
		||||
        ) <
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::shutters->getBlockingTimeAfterManual
 | 
			
		||||
@@ -1019,7 +1015,7 @@ sub PerlCodeCheck {
 | 
			
		||||
sub IsAdv {
 | 
			
		||||
    use HTTP::Date;
 | 
			
		||||
    my ( undef, undef, undef, $monthday, $month, $year, undef, undef, undef ) =
 | 
			
		||||
      localtime( gettimeofday() );
 | 
			
		||||
      localtime( ::gettimeofday() );
 | 
			
		||||
    my $adv = 0;
 | 
			
		||||
    $year += 1900;
 | 
			
		||||
 | 
			
		||||
@@ -1032,11 +1028,12 @@ sub IsAdv {
 | 
			
		||||
        my $time = str2time( $year . '-12-25' );
 | 
			
		||||
        my $wday = ( localtime($time) )[6];
 | 
			
		||||
        $wday = $wday ? $wday : 7;
 | 
			
		||||
        $time -= ( $FHEM::Automation::ShuttersControl::ascDev
 | 
			
		||||
            ->getAdvDate eq 'DeadSunday'
 | 
			
		||||
              ? ($wday + 27) * 86400
 | 
			
		||||
              : ($wday + 21) * 86400
 | 
			
		||||
          );
 | 
			
		||||
        $time -= (
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::ascDev->getAdvDate eq
 | 
			
		||||
              'DeadSunday'
 | 
			
		||||
            ? ( $wday + 27 ) * 86400
 | 
			
		||||
            : ( $wday + 21 ) * 86400
 | 
			
		||||
        );
 | 
			
		||||
        $adv = 1 if ( $time < time );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1046,15 +1043,16 @@ sub IsAdv {
 | 
			
		||||
sub IsInTime {
 | 
			
		||||
    my $dfi = shift;
 | 
			
		||||
 | 
			
		||||
    $dfi =~ s/{([^\x7d]*)}/$cmdFromAnalyze=$1; eval $1/ge; # Forum #69787
 | 
			
		||||
    my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime(gettimeofday());
 | 
			
		||||
    my $dhms = sprintf("%s\@%02d:%02d:%02d", $wday, $hour, $min, $sec);
 | 
			
		||||
    foreach my $ft (split(" ", $dfi)) {
 | 
			
		||||
        my ($from, $to) = split("-", $ft);
 | 
			
		||||
        if(defined($from) && defined($to)) {
 | 
			
		||||
            $from = "$wday\@$from" if(index($from,"@") < 0);
 | 
			
		||||
            $to   = "$wday\@$to"   if(index($to,  "@") < 0);
 | 
			
		||||
            return 1 if($from le $dhms && $dhms le $to);
 | 
			
		||||
    $dfi =~ s/{([^\x7d]*)}/$cmdFromAnalyze=$1; eval $1/ge;    # Forum #69787
 | 
			
		||||
    my ( $sec, $min, $hour, $mday, $month, $year, $wday, $yday, $isdst ) =
 | 
			
		||||
      localtime( ::gettimeofday() );
 | 
			
		||||
    my $dhms = sprintf( "%s\@%02d:%02d:%02d", $wday, $hour, $min, $sec );
 | 
			
		||||
    foreach my $ft ( split( " ", $dfi ) ) {
 | 
			
		||||
        my ( $from, $to ) = split( "-", $ft );
 | 
			
		||||
        if ( defined($from) && defined($to) ) {
 | 
			
		||||
            $from = "$wday\@$from" if ( index( $from, "@" ) < 0 );
 | 
			
		||||
            $to   = "$wday\@$to"   if ( index( $to,   "@" ) < 0 );
 | 
			
		||||
            return 1 if ( $from le $dhms && $dhms le $to );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
###############################################################################
 | 
			
		||||
#
 | 
			
		||||
# Developed with Kate
 | 
			
		||||
# Developed with VSCodium and richterger perl plugin
 | 
			
		||||
#
 | 
			
		||||
#  (c) 2018-2021 Copyright: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
			
		||||
#  (c) 2018-2022 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net)
 | 
			
		||||
#  All rights reserved
 | 
			
		||||
#
 | 
			
		||||
#   Special thanks goes to:
 | 
			
		||||
@@ -59,12 +59,11 @@ our %EXPORT_TAGS = (
 | 
			
		||||
    ],
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub RainProcessing {
 | 
			
		||||
    my ( $hash, $val, $triggerMax, $triggerMin ) = @_;
 | 
			
		||||
 | 
			
		||||
    my $rainClosedPos = $FHEM::Automation::ShuttersControl::ascDev
 | 
			
		||||
          ->getRainSensorShuttersClosedPos;
 | 
			
		||||
      ->getRainSensorShuttersClosedPos;
 | 
			
		||||
 | 
			
		||||
    for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::shutters->setShuttersDev(
 | 
			
		||||
@@ -75,46 +74,50 @@ sub RainProcessing {
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::shutters->getRainProtection eq
 | 
			
		||||
            'off' );
 | 
			
		||||
 | 
			
		||||
        if (   $val > $triggerMax
 | 
			
		||||
        if (
 | 
			
		||||
               $val > $triggerMax
 | 
			
		||||
            && $FHEM::Automation::ShuttersControl::shutters->getStatus !=
 | 
			
		||||
            $rainClosedPos
 | 
			
		||||
            && $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                 ->getRainProtectionStatus eq 'unprotected'
 | 
			
		||||
            ->getRainProtectionStatus eq 'unprotected'
 | 
			
		||||
            || ( $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                   ->getRainProtectionStatus eq 'unprotected'
 | 
			
		||||
              && $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                   ->getRainUnprotectionDelayObj ne 'none')
 | 
			
		||||
                ->getRainProtectionStatus eq 'unprotected'
 | 
			
		||||
                && $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                ->getRainUnprotectionDelayObj ne 'none' )
 | 
			
		||||
          )
 | 
			
		||||
        {
 | 
			
		||||
            _RainProtected();
 | 
			
		||||
        }
 | 
			
		||||
        elsif ( ( $val == 0 || $val < $triggerMin )
 | 
			
		||||
            && $FHEM::Automation::ShuttersControl::shutters->getStatus ==
 | 
			
		||||
              $rainClosedPos
 | 
			
		||||
            $rainClosedPos
 | 
			
		||||
            && IsAfterShuttersManualBlocking($shuttersDev)
 | 
			
		||||
            && $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                 ->getRainProtectionStatus eq 'protected' )
 | 
			
		||||
            ->getRainProtectionStatus eq 'protected' )
 | 
			
		||||
        {
 | 
			
		||||
            my %funcHash = (
 | 
			
		||||
                shuttersdevice => $shuttersDev,
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::shutters->setRainUnprotectionDelayObj(\%funcHash);
 | 
			
		||||
            ::InternalTimer( ::gettimeofday() + $FHEM::Automation::ShuttersControl::ascDev->getRainWaitingTime
 | 
			
		||||
                , \&_RainUnprotected
 | 
			
		||||
                , \%funcHash );
 | 
			
		||||
            my %funcHash = ( shuttersdevice => $shuttersDev, );
 | 
			
		||||
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                ->setRainProtectionStatus('unprotected');
 | 
			
		||||
              ->setRainUnprotectionDelayObj( \%funcHash );
 | 
			
		||||
            ::InternalTimer(
 | 
			
		||||
                ::gettimeofday() +
 | 
			
		||||
                  $FHEM::Automation::ShuttersControl::ascDev
 | 
			
		||||
                  ->getRainWaitingTime,
 | 
			
		||||
                \&_RainUnprotected, \%funcHash
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
              ->setRainProtectionStatus('unprotected');
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            if (  $FHEM::Automation::ShuttersControl::shutters->getStatus != $rainClosedPos
 | 
			
		||||
              && ($val == 0 || $val < $triggerMin) )
 | 
			
		||||
            if ( $FHEM::Automation::ShuttersControl::shutters->getStatus !=
 | 
			
		||||
                $rainClosedPos
 | 
			
		||||
                && ( $val == 0 || $val < $triggerMin ) )
 | 
			
		||||
            {
 | 
			
		||||
                $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                  ->setRainProtectionStatus('unprotected');
 | 
			
		||||
            }
 | 
			
		||||
            elsif ($val > $triggerMax) {
 | 
			
		||||
            elsif ( $val > $triggerMax ) {
 | 
			
		||||
                $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                  ->setRainProtectionStatus('protected');
 | 
			
		||||
            }
 | 
			
		||||
@@ -126,63 +129,69 @@ sub RainProcessing {
 | 
			
		||||
 | 
			
		||||
### es muss noch beobachtet werden ob die Auswahl des Rollos welches bearbeitet werden soll bestehen bleibt oder mit in die neuen Funktionen übergeben werden muss
 | 
			
		||||
sub _RainProtected {
 | 
			
		||||
    ::RemoveInternalTimer($FHEM::Automation::ShuttersControl::shutters->getRainUnprotectionDelayObj)
 | 
			
		||||
        if($FHEM::Automation::ShuttersControl::shutters->getRainUnprotectionDelayObj ne 'none');
 | 
			
		||||
    ::RemoveInternalTimer( $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
          ->getRainUnprotectionDelayObj )
 | 
			
		||||
      if ( $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
        ->getRainUnprotectionDelayObj ne 'none' );
 | 
			
		||||
 | 
			
		||||
    $FHEM::Automation::ShuttersControl::shutters->setRainUnprotectionDelayObj('none');
 | 
			
		||||
    $FHEM::Automation::ShuttersControl::shutters->setRainUnprotectionDelayObj(
 | 
			
		||||
        'none');
 | 
			
		||||
 | 
			
		||||
    $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
 | 
			
		||||
            'rain protected');
 | 
			
		||||
        'rain protected');
 | 
			
		||||
 | 
			
		||||
    $FHEM::Automation::ShuttersControl::shutters->setDriveCmd(
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::ascDev
 | 
			
		||||
    ->getRainSensorShuttersClosedPos);
 | 
			
		||||
          ->getRainSensorShuttersClosedPos );
 | 
			
		||||
 | 
			
		||||
    $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
        ->setRainProtectionStatus('protected');
 | 
			
		||||
    $FHEM::Automation::ShuttersControl::shutters->setRainProtectionStatus(
 | 
			
		||||
        'protected');
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub _RainUnprotected {
 | 
			
		||||
    my $h = shift;
 | 
			
		||||
 | 
			
		||||
    my $shuttersDev = $h->{shuttersdevice};
 | 
			
		||||
    $FHEM::Automation::ShuttersControl::shutters->setShuttersDev(
 | 
			
		||||
            $shuttersDev);
 | 
			
		||||
    $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
 | 
			
		||||
 | 
			
		||||
    $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
 | 
			
		||||
            'rain un-protected');
 | 
			
		||||
        'rain un-protected');
 | 
			
		||||
 | 
			
		||||
    if ( $FHEM::Automation::ShuttersControl::shutters->getRainUnprotectionDelayObj ne 'none' ) {
 | 
			
		||||
        ::RemoveInternalTimer($FHEM::Automation::ShuttersControl::shutters->getRainUnprotectionDelayObj);
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::shutters->setRainUnprotectionDelayObj('none');
 | 
			
		||||
    if ( $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
        ->getRainUnprotectionDelayObj ne 'none' )
 | 
			
		||||
    {
 | 
			
		||||
        ::RemoveInternalTimer( $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
              ->getRainUnprotectionDelayObj );
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
          ->setRainUnprotectionDelayObj('none');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $FHEM::Automation::ShuttersControl::shutters->setDriveCmd(
 | 
			
		||||
        (
 | 
			
		||||
                $FHEM::Automation::ShuttersControl::shutters->getIsDay
 | 
			
		||||
              $FHEM::Automation::ShuttersControl::shutters->getIsDay
 | 
			
		||||
            ? $FHEM::Automation::ShuttersControl::shutters->getLastPos
 | 
			
		||||
            : ( $FHEM::Automation::ShuttersControl::shutters->getShuttersPlace
 | 
			
		||||
                eq 'awning'
 | 
			
		||||
                ? $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                    ->getOpenPos
 | 
			
		||||
            : (
 | 
			
		||||
                $FHEM::Automation::ShuttersControl::shutters->getShuttersPlace
 | 
			
		||||
                  eq 'awning'
 | 
			
		||||
                ? $FHEM::Automation::ShuttersControl::shutters->getOpenPos
 | 
			
		||||
                : (
 | 
			
		||||
                    $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                        ->getPrivacyDownStatus == 2
 | 
			
		||||
                      ->getPrivacyDownStatus == 2
 | 
			
		||||
                    ? $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                        ->getPrivacyDownPos
 | 
			
		||||
                      ->getPrivacyDownPos
 | 
			
		||||
                    : $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                        ->getClosedPos
 | 
			
		||||
                      ->getClosedPos
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
    )
 | 
			
		||||
    if (IsAfterShuttersTimeBlocking($shuttersDev));
 | 
			
		||||
    ) if ( IsAfterShuttersTimeBlocking($shuttersDev) );
 | 
			
		||||
 | 
			
		||||
    $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
        ->setRainProtectionStatus('unprotected');
 | 
			
		||||
    $FHEM::Automation::ShuttersControl::shutters->setRainProtectionStatus(
 | 
			
		||||
        'unprotected');
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
###############################################################################
 | 
			
		||||
#
 | 
			
		||||
# Developed with Kate
 | 
			
		||||
# Developed with VSCodium and richterger perl plugin
 | 
			
		||||
#
 | 
			
		||||
#  (c) 2018-2021 Copyright: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
			
		||||
#  (c) 2018-2022 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net)
 | 
			
		||||
#  All rights reserved
 | 
			
		||||
#
 | 
			
		||||
#   Special thanks goes to:
 | 
			
		||||
@@ -44,37 +44,24 @@ use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use utf8;
 | 
			
		||||
 | 
			
		||||
use GPUtils qw(GP_Import);
 | 
			
		||||
 | 
			
		||||
## Import der FHEM Funktionen
 | 
			
		||||
BEGIN {
 | 
			
		||||
    GP_Import(
 | 
			
		||||
        qw(
 | 
			
		||||
          ReadingsVal)
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub _getRoommateStatus {
 | 
			
		||||
sub getRoommateStatus {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    my $roommate = $self->{roommate};
 | 
			
		||||
 | 
			
		||||
    return ReadingsVal( $roommate,
 | 
			
		||||
    return ::ReadingsVal( $roommate,
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::shutters->getRoommatesReading,
 | 
			
		||||
        'none' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub _getRoommateLastStatus {
 | 
			
		||||
sub getRoommateLastStatus {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    my $roommate = $self->{roommate};
 | 
			
		||||
    my $default  = $self->{defaultarg};
 | 
			
		||||
 | 
			
		||||
    $default = 'none' if ( !defined($default) );
 | 
			
		||||
    return ReadingsVal( $roommate, 'lastState', $default );
 | 
			
		||||
    return ::ReadingsVal( $roommate, 'lastState', $default );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
###############################################################################
 | 
			
		||||
#
 | 
			
		||||
# Developed with Kate
 | 
			
		||||
# Developed with VSCodium and richterger perl plugin
 | 
			
		||||
#
 | 
			
		||||
#  (c) 2018-2021 Copyright: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
			
		||||
#  (c) 2018-2022 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net)
 | 
			
		||||
#  All rights reserved
 | 
			
		||||
#
 | 
			
		||||
#   Special thanks goes to:
 | 
			
		||||
@@ -64,10 +64,9 @@ our %EXPORT_TAGS = (
 | 
			
		||||
    ],
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub CheckASC_ConditionsForShadingFn {
 | 
			
		||||
    my $hash    = shift;
 | 
			
		||||
    my $value   = shift;
 | 
			
		||||
    my $hash  = shift;
 | 
			
		||||
    my $value = shift;
 | 
			
		||||
 | 
			
		||||
    my $error;
 | 
			
		||||
 | 
			
		||||
@@ -81,10 +80,10 @@ sub CheckASC_ConditionsForShadingFn {
 | 
			
		||||
    my $count = 1;
 | 
			
		||||
    for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
 | 
			
		||||
        my %funcHash = (
 | 
			
		||||
            hash            => $hash,
 | 
			
		||||
            shuttersdevice  => $shuttersDev,
 | 
			
		||||
            value           => $value,
 | 
			
		||||
            attrEvent       => 0,
 | 
			
		||||
            hash           => $hash,
 | 
			
		||||
            shuttersdevice => $shuttersDev,
 | 
			
		||||
            value          => $value,
 | 
			
		||||
            attrEvent      => 0,
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        ::InternalTimer(
 | 
			
		||||
@@ -104,7 +103,7 @@ sub CheckASC_ConditionsForShadingFn {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub _CheckShuttersConditionsForShadingFn {
 | 
			
		||||
    my $funcHash    = shift;
 | 
			
		||||
    my $funcHash = shift;
 | 
			
		||||
 | 
			
		||||
    my $hash        = $funcHash->{hash};
 | 
			
		||||
    my $shuttersDev = $funcHash->{shuttersdevice};
 | 
			
		||||
@@ -119,64 +118,69 @@ sub _CheckShuttersConditionsForShadingFn {
 | 
			
		||||
 | 
			
		||||
    if ( $value eq 'off' ) {
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::shutters->setShadingStatus('out');
 | 
			
		||||
        $infoMessage    .= ' shading was deactivated ' . ($funcHash->{attrEvent} ? 'in the device' : 'globally');
 | 
			
		||||
        $errorMessage   .= '';
 | 
			
		||||
        $infoMessage .= ' shading was deactivated '
 | 
			
		||||
          . ( $funcHash->{attrEvent} ? 'in the device' : 'globally' );
 | 
			
		||||
        $errorMessage .= '';
 | 
			
		||||
        ShadingProcessingDriveCommand( $hash, $shuttersDev );
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        $infoMessage .= (
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::shutters->getShadingMode ne 'off'
 | 
			
		||||
            && $FHEM::Automation::ShuttersControl::ascDev
 | 
			
		||||
            ->getAutoShuttersControlShading eq 'on'
 | 
			
		||||
            && $FHEM::Automation::ShuttersControl::shutters->getOutTemp == -100
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::shutters->getShadingMode ne
 | 
			
		||||
              'off'
 | 
			
		||||
              && $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'
 | 
			
		||||
            : ''
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        $warnMessage .= (
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq 'off'
 | 
			
		||||
            && $FHEM::Automation::ShuttersControl::ascDev
 | 
			
		||||
            ->getAutoShuttersControlShading eq 'on'
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq
 | 
			
		||||
              'off'
 | 
			
		||||
              && $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::shutters->getShadingMode 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 '
 | 
			
		||||
            . '<a href="'
 | 
			
		||||
            . '/fhem?detail='
 | 
			
		||||
            . ::ReadingsVal( $shuttersDev, 'associatedWith', 'ASC device' )
 | 
			
		||||
            . $::FW_CSRF . '">'
 | 
			
		||||
            . ::ReadingsVal( $shuttersDev, 'associatedWith', 'ASC device' )
 | 
			
		||||
            . '</a>'
 | 
			
		||||
              . '<a href="'
 | 
			
		||||
              . '/fhem?detail='
 | 
			
		||||
              . ::ReadingsVal( $shuttersDev, 'associatedWith', 'ASC device' )
 | 
			
		||||
              . $::FW_CSRF . '">'
 | 
			
		||||
              . ::ReadingsVal( $shuttersDev, 'associatedWith', 'ASC device' )
 | 
			
		||||
              . '</a>'
 | 
			
		||||
            : ''
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        $errorMessage .= (
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::shutters->getBrightness == -1
 | 
			
		||||
            && $FHEM::Automation::ShuttersControl::shutters->getShadingMode ne
 | 
			
		||||
            'off'
 | 
			
		||||
              && $FHEM::Automation::ShuttersControl::shutters->getShadingMode
 | 
			
		||||
              ne 'off'
 | 
			
		||||
            ? ' no brightness sensor found, please set ASC_BrightnessSensor attribut'
 | 
			
		||||
            : ''
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $message .= ' ERROR: ' . $errorMessage
 | 
			
		||||
    if ( defined($errorMessage)
 | 
			
		||||
      if ( defined($errorMessage)
 | 
			
		||||
        && $errorMessage ne '' );
 | 
			
		||||
 | 
			
		||||
    $message .= ' WARN: ' . $warnMessage
 | 
			
		||||
    if ( defined($warnMessage)
 | 
			
		||||
      if ( defined($warnMessage)
 | 
			
		||||
        && $warnMessage ne ''
 | 
			
		||||
        && $errorMessage eq '' );
 | 
			
		||||
 | 
			
		||||
    $message .= ' INFO: ' . $infoMessage
 | 
			
		||||
    if ( defined($infoMessage)
 | 
			
		||||
      if ( defined($infoMessage)
 | 
			
		||||
        && $infoMessage ne ''
 | 
			
		||||
        && $errorMessage eq '' );
 | 
			
		||||
 | 
			
		||||
@@ -184,6 +188,8 @@ sub _CheckShuttersConditionsForShadingFn {
 | 
			
		||||
    ::readingsBulkUpdateIfChanged( $shuttersDevHash, 'ASC_ShadingMessage',
 | 
			
		||||
        '<html>' . $message . ' </html>' );
 | 
			
		||||
    ::readingsEndUpdate( $shuttersDevHash, 1 );
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ShadingProcessing {
 | 
			
		||||
@@ -199,11 +205,17 @@ sub ShadingProcessing {
 | 
			
		||||
    my $brightness =
 | 
			
		||||
      $FHEM::Automation::ShuttersControl::shutters->getBrightnessAverage;
 | 
			
		||||
 | 
			
		||||
    $FHEM::Automation::ShuttersControl::shutters->setShadingBetweenTheTimeSuspend(
 | 
			
		||||
          ( IsInTime($FHEM::Automation::ShuttersControl::shutters->getShadingBetweenTheTime)
 | 
			
		||||
        ? 0
 | 
			
		||||
        : 1 )
 | 
			
		||||
    );
 | 
			
		||||
    $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
      ->setShadingBetweenTheTimeSuspend(
 | 
			
		||||
        (
 | 
			
		||||
            IsInTime(
 | 
			
		||||
                $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                  ->getShadingBetweenTheTime
 | 
			
		||||
              )
 | 
			
		||||
            ? 0
 | 
			
		||||
            : 1
 | 
			
		||||
        )
 | 
			
		||||
      );
 | 
			
		||||
 | 
			
		||||
    FHEM::Automation::ShuttersControl::ASC_Debug(
 | 
			
		||||
            'ShadingProcessing: '
 | 
			
		||||
@@ -268,10 +280,11 @@ sub ShadingProcessing {
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
              ->getShadingWaitingPeriod / 2
 | 
			
		||||
            )
 | 
			
		||||
        || $FHEM::Automation::ShuttersControl::shutters->getExternalTriggerStatus
 | 
			
		||||
        || $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
        ->getExternalTriggerStatus
 | 
			
		||||
        || $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq 'off'
 | 
			
		||||
        || $FHEM::Automation::ShuttersControl::ascDev
 | 
			
		||||
              ->getAutoShuttersControlShading eq 'off'
 | 
			
		||||
        ->getAutoShuttersControlShading eq 'off'
 | 
			
		||||
      );
 | 
			
		||||
 | 
			
		||||
    ::Log3( $name, 4,
 | 
			
		||||
@@ -300,9 +313,9 @@ sub ShadingProcessing {
 | 
			
		||||
            ->getShadingMinOutsideTemperature - 4
 | 
			
		||||
            || $azimuth < $azimuthLeft
 | 
			
		||||
            || $azimuth > $azimuthRight
 | 
			
		||||
            || (   !$FHEM::Automation::ShuttersControl::shutters->getIsDay
 | 
			
		||||
                && $FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime
 | 
			
		||||
                  - ( int( ::gettimeofday() ) ) > 7200 )
 | 
			
		||||
            || (  !$FHEM::Automation::ShuttersControl::shutters->getIsDay
 | 
			
		||||
                && $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                ->getSunriseUnixTime - ( int( ::gettimeofday() ) ) > 7200 )
 | 
			
		||||
        )
 | 
			
		||||
        && $FHEM::Automation::ShuttersControl::shutters->getShadingStatus ne
 | 
			
		||||
        'out'
 | 
			
		||||
@@ -452,16 +465,12 @@ sub ShadingProcessing {
 | 
			
		||||
            || $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq
 | 
			
		||||
            $homemode )
 | 
			
		||||
        && (
 | 
			
		||||
            $getModeUp eq 'always'
 | 
			
		||||
            || $getModeUp eq
 | 
			
		||||
            $homemode
 | 
			
		||||
               $getModeUp eq 'always'
 | 
			
		||||
            || $getModeUp eq $homemode
 | 
			
		||||
            || $getModeUp eq 'off'
 | 
			
		||||
            || $getModeUp eq
 | 
			
		||||
            'absent'
 | 
			
		||||
            || $getModeUp eq
 | 
			
		||||
            'gone'
 | 
			
		||||
            || ( $getModeUp eq
 | 
			
		||||
                'home'
 | 
			
		||||
            || $getModeUp eq 'absent'
 | 
			
		||||
            || $getModeUp eq 'gone'
 | 
			
		||||
            || (   $getModeUp eq 'home'
 | 
			
		||||
                && $homemode ne 'asleep' )
 | 
			
		||||
        )
 | 
			
		||||
        && (
 | 
			
		||||
@@ -481,11 +490,11 @@ sub ShadingProcessing {
 | 
			
		||||
                )
 | 
			
		||||
                && $FHEM::Automation::ShuttersControl::shutters->getIfInShading
 | 
			
		||||
            )
 | 
			
		||||
            || (   !$FHEM::Automation::ShuttersControl::shutters->getIfInShading
 | 
			
		||||
            || (  !$FHEM::Automation::ShuttersControl::shutters->getIfInShading
 | 
			
		||||
                && $FHEM::Automation::ShuttersControl::shutters->getStatus ==
 | 
			
		||||
                $FHEM::Automation::ShuttersControl::shutters->getShadingPos
 | 
			
		||||
            )
 | 
			
		||||
            || (   !$FHEM::Automation::ShuttersControl::shutters->getShadingBetweenTheTimeSuspend
 | 
			
		||||
                $FHEM::Automation::ShuttersControl::shutters->getShadingPos )
 | 
			
		||||
            || ( !$FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                ->getShadingBetweenTheTimeSuspend
 | 
			
		||||
                && $FHEM::Automation::ShuttersControl::shutters->getStatus !=
 | 
			
		||||
                $FHEM::Automation::ShuttersControl::shutters->getShadingPos )
 | 
			
		||||
        )
 | 
			
		||||
@@ -535,19 +544,28 @@ sub ShadingProcessingDriveCommand {
 | 
			
		||||
    $FHEM::Automation::ShuttersControl::shutters->setShadingStatus(
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::shutters->getShadingStatus );
 | 
			
		||||
 | 
			
		||||
    if (   IsInTime($FHEM::Automation::ShuttersControl::shutters->getShadingBetweenTheTime)
 | 
			
		||||
        && $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq 'in'
 | 
			
		||||
    if (
 | 
			
		||||
        IsInTime(
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
              ->getShadingBetweenTheTime
 | 
			
		||||
        )
 | 
			
		||||
        && $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq
 | 
			
		||||
        'in'
 | 
			
		||||
        && $getShadingPos != $getStatus
 | 
			
		||||
        && ( $getStatus != $FHEM::Automation::ShuttersControl::shutters->getClosedPos
 | 
			
		||||
          || ( $getStatus == $FHEM::Automation::ShuttersControl::shutters->getClosedPos
 | 
			
		||||
            && $marker
 | 
			
		||||
            )
 | 
			
		||||
          )
 | 
			
		||||
        && ( $getStatus != $FHEM::Automation::ShuttersControl::shutters->getSleepPos
 | 
			
		||||
          || ( $getStatus == $FHEM::Automation::ShuttersControl::shutters->getSleepPos
 | 
			
		||||
            && $marker
 | 
			
		||||
            )
 | 
			
		||||
          )
 | 
			
		||||
        && (
 | 
			
		||||
            $getStatus !=
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::shutters->getClosedPos
 | 
			
		||||
            || ( $getStatus ==
 | 
			
		||||
                   $FHEM::Automation::ShuttersControl::shutters->getClosedPos
 | 
			
		||||
                && $marker )
 | 
			
		||||
        )
 | 
			
		||||
        && (
 | 
			
		||||
            $getStatus !=
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::shutters->getSleepPos
 | 
			
		||||
            || ( $getStatus ==
 | 
			
		||||
                   $FHEM::Automation::ShuttersControl::shutters->getSleepPos
 | 
			
		||||
                && $marker )
 | 
			
		||||
        )
 | 
			
		||||
        && (
 | 
			
		||||
            FHEM::Automation::ShuttersControl::CheckIfShuttersWindowRecOpen(
 | 
			
		||||
                $shuttersDev) != 2
 | 
			
		||||
@@ -586,10 +604,10 @@ sub ShadingProcessingDriveCommand {
 | 
			
		||||
            (
 | 
			
		||||
                (
 | 
			
		||||
                    $getShadingPos ==
 | 
			
		||||
                         $FHEM::Automation::ShuttersControl::shutters->getLastPos
 | 
			
		||||
                      $FHEM::Automation::ShuttersControl::shutters->getLastPos
 | 
			
		||||
                      || $getShadingPos ==
 | 
			
		||||
                         $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                         ->getShadingLastPos
 | 
			
		||||
                      $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
                      ->getShadingLastPos
 | 
			
		||||
                )
 | 
			
		||||
                ? $FHEM::Automation::ShuttersControl::shutters->getOpenPos
 | 
			
		||||
                : (
 | 
			
		||||
@@ -610,8 +628,10 @@ sub ShadingProcessingDriveCommand {
 | 
			
		||||
                    : $FHEM::Automation::ShuttersControl::shutters->getOpenPos
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
        ) if (    $FHEM::Automation::ShuttersControl::shutters->getIsDay
 | 
			
		||||
               || $FHEM::Automation::ShuttersControl::shutters->getShuttersPlace eq 'awning' );
 | 
			
		||||
          )
 | 
			
		||||
          if ( $FHEM::Automation::ShuttersControl::shutters->getIsDay
 | 
			
		||||
            || $FHEM::Automation::ShuttersControl::shutters->getShuttersPlace
 | 
			
		||||
            eq 'awning' );
 | 
			
		||||
 | 
			
		||||
        FHEM::Automation::ShuttersControl::ASC_Debug(
 | 
			
		||||
                'ShadingProcessingDriveCommand: '
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
###############################################################################
 | 
			
		||||
#
 | 
			
		||||
# Developed with Kate
 | 
			
		||||
# Developed with VSCodium and richterger perl plugin
 | 
			
		||||
#
 | 
			
		||||
#  (c) 2018-2021 Copyright: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
			
		||||
#  (c) 2018-2022 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net)
 | 
			
		||||
#  All rights reserved
 | 
			
		||||
#
 | 
			
		||||
#   Special thanks goes to:
 | 
			
		||||
@@ -45,6 +45,10 @@
 | 
			
		||||
 | 
			
		||||
package FHEM::Automation::ShuttersControl::Shutters;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use utf8;
 | 
			
		||||
 | 
			
		||||
use FHEM::Automation::ShuttersControl::Shutters::Readings;
 | 
			
		||||
use FHEM::Automation::ShuttersControl::Shutters::Attr;
 | 
			
		||||
use FHEM::Automation::ShuttersControl::Roommate;
 | 
			
		||||
@@ -53,10 +57,6 @@ use FHEM::Automation::ShuttersControl::Window;
 | 
			
		||||
our @ISA =
 | 
			
		||||
  qw(FHEM::Automation::ShuttersControl::Shutters::Readings FHEM::Automation::ShuttersControl::Shutters::Attr FHEM::Automation::ShuttersControl::Roommate FHEM::Automation::ShuttersControl::Window);
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use utf8;
 | 
			
		||||
 | 
			
		||||
sub new {
 | 
			
		||||
    my $class = shift;
 | 
			
		||||
    my $self  = {
 | 
			
		||||
@@ -161,6 +161,7 @@ sub setDriveCmd {
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::shutters->setDelayCmd($posValue);
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::ascDev->setDelayCmdReading;
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::shutters->setNoDelay(0);
 | 
			
		||||
 | 
			
		||||
#         $FHEM::Automation::ShuttersControl::shutters->setExternalTriggerStatus(0)
 | 
			
		||||
#           if ( $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
#             ->getExternalTriggerStatus );
 | 
			
		||||
@@ -177,7 +178,8 @@ sub setDriveCmd {
 | 
			
		||||
          if ( $FHEM::Automation::ShuttersControl::shutters->getDelayCmd ne
 | 
			
		||||
            'none' )
 | 
			
		||||
          ; # setzt den Wert auf none da der Rolladen nun gesteuert werden kann.
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::shutters->setExternalTriggerStatus(0)
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::shutters->setExternalTriggerStatus(
 | 
			
		||||
            0)
 | 
			
		||||
          if ( $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
            ->getExternalTriggerStatus );
 | 
			
		||||
 | 
			
		||||
@@ -460,7 +462,8 @@ sub setRainUnprotectionDelayObj {
 | 
			
		||||
    my $self  = shift;
 | 
			
		||||
    my $value = shift;
 | 
			
		||||
 | 
			
		||||
    $self->{ $self->{shuttersDev} }->{RainProtection}->{UNPROTECTIONDELAYOBJVAL} = $value
 | 
			
		||||
    $self->{ $self->{shuttersDev} }->{RainProtection}->{UNPROTECTIONDELAYOBJVAL}
 | 
			
		||||
      = $value
 | 
			
		||||
      if ( defined($value) );
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
@@ -545,12 +548,13 @@ sub getAttrUpdateChanges {
 | 
			
		||||
sub getIsDay {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return FHEM::Automation::ShuttersControl::Helper::_IsDay( $self->{shuttersDev} );
 | 
			
		||||
    return FHEM::Automation::ShuttersControl::Helper::_IsDay(
 | 
			
		||||
        $self->{shuttersDev} );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub getAntiFreezeStatus {
 | 
			
		||||
    use POSIX qw(strftime);
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
    my $self    = shift;
 | 
			
		||||
    my $daytime = strftime( "%P", localtime() );
 | 
			
		||||
    $daytime = (
 | 
			
		||||
        defined($daytime) && $daytime
 | 
			
		||||
@@ -756,10 +760,12 @@ sub getRainUnprotectionDelayObj {
 | 
			
		||||
        (
 | 
			
		||||
            defined( $self->{ $self->{shuttersDev} }->{RainProtection} )
 | 
			
		||||
              && defined(
 | 
			
		||||
                $self->{ $self->{shuttersDev} }->{RainProtection}->{UNPROTECTIONDELAYOBJVAL}
 | 
			
		||||
                $self->{ $self->{shuttersDev} }->{RainProtection}
 | 
			
		||||
                  ->{UNPROTECTIONDELAYOBJVAL}
 | 
			
		||||
              )
 | 
			
		||||
        )
 | 
			
		||||
        ? $self->{ $self->{shuttersDev} }->{RainProtection}->{UNPROTECTIONDELAYOBJVAL}
 | 
			
		||||
        ? $self->{ $self->{shuttersDev} }->{RainProtection}
 | 
			
		||||
          ->{UNPROTECTIONDELAYOBJVAL}
 | 
			
		||||
        : 'none'
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
@@ -821,7 +827,7 @@ sub getRoommatesStatus {
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::shutters->setRoommate($ro);
 | 
			
		||||
        my $currentPrio =
 | 
			
		||||
          $statePrio{ $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
              ->_getRoommateStatus };
 | 
			
		||||
              ->getRoommateStatus };
 | 
			
		||||
        $minPrio = $currentPrio if ( $minPrio > $currentPrio );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -854,7 +860,7 @@ sub getRoommatesLastStatus {
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::shutters->setRoommate($ro);
 | 
			
		||||
        my $currentPrio =
 | 
			
		||||
          $statePrio{ $FHEM::Automation::ShuttersControl::shutters
 | 
			
		||||
              ->_getRoommateLastStatus };
 | 
			
		||||
              ->getRoommateLastStatus };
 | 
			
		||||
        $minPrio = $currentPrio if ( $minPrio > $currentPrio );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -899,7 +905,8 @@ sub setShadingStatus {
 | 
			
		||||
 | 
			
		||||
    $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} = $value
 | 
			
		||||
      if ( defined($value) );
 | 
			
		||||
    $self->{ $self->{shuttersDev} }{ShadingStatus}{TIME} = int( ::gettimeofday() )
 | 
			
		||||
    $self->{ $self->{shuttersDev} }{ShadingStatus}{TIME} =
 | 
			
		||||
      int( ::gettimeofday() )
 | 
			
		||||
      if ( defined( $self->{ $self->{shuttersDev} }{ShadingStatus} ) );
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
@@ -945,7 +952,7 @@ sub setShadingLastPos {
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub setShadingBetweenTheTimeSuspend {       # Werte für value = 0, 1
 | 
			
		||||
sub setShadingBetweenTheTimeSuspend {    # Werte für value = 0, 1
 | 
			
		||||
    my $self  = shift;
 | 
			
		||||
    my $value = shift;
 | 
			
		||||
 | 
			
		||||
@@ -1007,12 +1014,16 @@ sub getShadingStatus {   # Werte für value = in, out, in reserved, out reserved
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub getShadingBetweenTheTimeSuspend {   # Werte für value = 0, 1
 | 
			
		||||
sub getShadingBetweenTheTimeSuspend {    # Werte für value = 0, 1
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
        defined( $self->{ $self->{shuttersDev} }{ShadingBetweenTheTimeSuspend} )
 | 
			
		||||
          && defined( $self->{ $self->{shuttersDev} }{ShadingBetweenTheTimeSuspend}{VAL} )
 | 
			
		||||
        defined(
 | 
			
		||||
            $self->{ $self->{shuttersDev} }{ShadingBetweenTheTimeSuspend}
 | 
			
		||||
          )
 | 
			
		||||
          && defined(
 | 
			
		||||
            $self->{ $self->{shuttersDev} }{ShadingBetweenTheTimeSuspend}{VAL}
 | 
			
		||||
          )
 | 
			
		||||
        ? $self->{ $self->{shuttersDev} }{ShadingBetweenTheTimeSuspend}{VAL}
 | 
			
		||||
        : 0
 | 
			
		||||
    );
 | 
			
		||||
@@ -1084,9 +1095,7 @@ sub getShadingLastPos {
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
        defined( $self->{ $self->{shuttersDev} }{ShadingLastPos} )
 | 
			
		||||
          && defined(
 | 
			
		||||
            $self->{ $self->{shuttersDev} }{ShadingLastPos}{VAL}
 | 
			
		||||
          )
 | 
			
		||||
          && defined( $self->{ $self->{shuttersDev} }{ShadingLastPos}{VAL} )
 | 
			
		||||
        ? $self->{ $self->{shuttersDev} }{ShadingLastPos}{VAL}
 | 
			
		||||
        : $FHEM::Automation::ShuttersControl::shutters->getShadingPos
 | 
			
		||||
    );
 | 
			
		||||
@@ -1094,7 +1103,4 @@ sub getShadingLastPos {
 | 
			
		||||
 | 
			
		||||
### Ende Beschattung
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
###############################################################################
 | 
			
		||||
#
 | 
			
		||||
# Developed with Kate
 | 
			
		||||
# Developed with VSCodium and richterger perl plugin
 | 
			
		||||
#
 | 
			
		||||
#  (c) 2018-2021 Copyright: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
			
		||||
#  (c) 2018-2022 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net)
 | 
			
		||||
#  All rights reserved
 | 
			
		||||
#
 | 
			
		||||
#   Special thanks goes to:
 | 
			
		||||
@@ -46,24 +46,12 @@ use utf8;
 | 
			
		||||
 | 
			
		||||
use FHEM::Automation::ShuttersControl::Helper qw (IsAdv PerlCodeCheck);
 | 
			
		||||
 | 
			
		||||
use GPUtils qw(GP_Import);
 | 
			
		||||
 | 
			
		||||
## Import der FHEM Funktionen
 | 
			
		||||
BEGIN {
 | 
			
		||||
    GP_Import(
 | 
			
		||||
        qw(
 | 
			
		||||
          AttrVal
 | 
			
		||||
          CommandAttr
 | 
			
		||||
          gettimeofday)
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub _setAttributs {
 | 
			
		||||
    my $shuttersDev = shift;
 | 
			
		||||
    my $attr        = shift;
 | 
			
		||||
    my $attrVal     = shift;
 | 
			
		||||
 | 
			
		||||
    CommandAttr( undef, $shuttersDev . ' ' . $attr . ' ' . $attrVal );
 | 
			
		||||
    ::CommandAttr( undef, $shuttersDev . ' ' . $attr . ' ' . $attrVal );
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
@@ -77,28 +65,28 @@ sub _getPosition {
 | 
			
		||||
    return $self->{ $self->{shuttersDev} }->{$attr}->{position}
 | 
			
		||||
      if (
 | 
			
		||||
        exists( $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} ) < 2
 | 
			
		||||
      );
 | 
			
		||||
    $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} =
 | 
			
		||||
      int( gettimeofday() );
 | 
			
		||||
      int( ::gettimeofday() );
 | 
			
		||||
 | 
			
		||||
    my $position;
 | 
			
		||||
    my $posAssignment;
 | 
			
		||||
 | 
			
		||||
    if (
 | 
			
		||||
        AttrVal( $self->{shuttersDev}, $attr,
 | 
			
		||||
        ::AttrVal( $self->{shuttersDev}, $attr,
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::userAttrList{$userAttrList}
 | 
			
		||||
              [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] ) =~
 | 
			
		||||
              [ ::AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] ) =~
 | 
			
		||||
        m{\A\{.+\}\z}xms
 | 
			
		||||
      )
 | 
			
		||||
    {
 | 
			
		||||
        my $response = PerlCodeCheck(
 | 
			
		||||
            AttrVal(
 | 
			
		||||
            ::AttrVal(
 | 
			
		||||
                $self->{shuttersDev},
 | 
			
		||||
                $attr,
 | 
			
		||||
                $FHEM::Automation::ShuttersControl::userAttrList{$userAttrList}
 | 
			
		||||
                  [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ]
 | 
			
		||||
                  [ ::AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ]
 | 
			
		||||
            )
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
@@ -108,23 +96,23 @@ sub _getPosition {
 | 
			
		||||
              $position =~ m{\A\d+(\.\d+)?\z}xms
 | 
			
		||||
            ? $position
 | 
			
		||||
            : $FHEM::Automation::ShuttersControl::userAttrList{$userAttrList}
 | 
			
		||||
              [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ]
 | 
			
		||||
              [ ::AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ]
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        $posAssignment = (
 | 
			
		||||
                defined($posAssignment)
 | 
			
		||||
            &&  $posAssignment =~ m{\A\d+(\.\d+)?\z}xms
 | 
			
		||||
              ? $posAssignment
 | 
			
		||||
              : 'none'
 | 
			
		||||
            defined($posAssignment)
 | 
			
		||||
              && $posAssignment =~ m{\A\d+(\.\d+)?\z}xms
 | 
			
		||||
            ? $posAssignment
 | 
			
		||||
            : 'none'
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        ( $position, $posAssignment ) =
 | 
			
		||||
          FHEM::Automation::ShuttersControl::Helper::GetAttrValues(
 | 
			
		||||
          FHEM::Automation::ShuttersControl::Helper::Get::AttrValues(
 | 
			
		||||
            $self->{shuttersDev},
 | 
			
		||||
            $attr,
 | 
			
		||||
            $FHEM::Automation::ShuttersControl::userAttrList{$userAttrList}
 | 
			
		||||
              [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ]
 | 
			
		||||
              [ ::AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ]
 | 
			
		||||
          );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -145,8 +133,7 @@ sub _getPosition {
 | 
			
		||||
      )
 | 
			
		||||
    {
 | 
			
		||||
        $self->{ $self->{shuttersDev} }->{$attr}->{position} =
 | 
			
		||||
          PerlCodeCheck(
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{$attr}->{position} );
 | 
			
		||||
          PerlCodeCheck( $self->{ $self->{shuttersDev} }->{$attr}->{position} );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
@@ -154,7 +141,7 @@ sub _getPosition {
 | 
			
		||||
          m{^\d+(\.\d+)?$}xms
 | 
			
		||||
        ? $self->{ $self->{shuttersDev} }->{$attr}->{position}
 | 
			
		||||
        : $FHEM::Automation::ShuttersControl::userAttrList{$userAttrList}
 | 
			
		||||
          [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ]
 | 
			
		||||
          [ ::AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ]
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -167,7 +154,7 @@ sub _getPositionAssignment {
 | 
			
		||||
    return $self->{ $self->{shuttersDev} }->{$attr}->{posAssignment}
 | 
			
		||||
      if (
 | 
			
		||||
        exists( $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} ) < 2
 | 
			
		||||
      );
 | 
			
		||||
    $FHEM::Automation::ShuttersControl::shutters->$getFn;
 | 
			
		||||
@@ -213,7 +200,7 @@ sub setShuttersPlace {
 | 
			
		||||
sub getShuttersPlace {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $self->{shuttersDev}, 'ASC_ShuttersPlace', 'window' );
 | 
			
		||||
    return ::AttrVal( $self->{shuttersDev}, 'ASC_ShuttersPlace', 'window' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub setSlatPosCmd {
 | 
			
		||||
@@ -236,15 +223,15 @@ sub getSlatPosCmd {
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
 | 
			
		||||
              ->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
 | 
			
		||||
            ->{LASTGETTIME} ) < 2
 | 
			
		||||
      );
 | 
			
		||||
    $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}->{LASTGETTIME}
 | 
			
		||||
      = int( gettimeofday() );
 | 
			
		||||
      = int( ::gettimeofday() );
 | 
			
		||||
    my ( $slatPosCmd, $slatDevice ) =
 | 
			
		||||
      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
 | 
			
		||||
        'ASC_SlatPosCmd_SlatDevice', 'none:none' );
 | 
			
		||||
      FHEM::Automation::ShuttersControl::Helper::Get::AttrValues(
 | 
			
		||||
        $self->{shuttersDev}, 'ASC_SlatPosCmd_SlatDevice', 'none:none' );
 | 
			
		||||
 | 
			
		||||
    ## Erwartetes Ergebnis
 | 
			
		||||
    # upTime:upBrightnessVal
 | 
			
		||||
@@ -268,7 +255,7 @@ sub getSlatDevice {
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
 | 
			
		||||
              ->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
 | 
			
		||||
            ->{LASTGETTIME} ) < 2
 | 
			
		||||
      );
 | 
			
		||||
@@ -299,15 +286,15 @@ sub getPrivacyUpTime {
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
 | 
			
		||||
              ->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
 | 
			
		||||
            ->{LASTGETTIME} ) < 2
 | 
			
		||||
      );
 | 
			
		||||
    $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
 | 
			
		||||
      ->{LASTGETTIME} = int( gettimeofday() );
 | 
			
		||||
      ->{LASTGETTIME} = int( ::gettimeofday() );
 | 
			
		||||
    my ( $upTime, $upBrightnessVal ) =
 | 
			
		||||
      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
 | 
			
		||||
        'ASC_PrivacyUpValue_beforeDayOpen', '-1:-1' );
 | 
			
		||||
      FHEM::Automation::ShuttersControl::Helper::Get::AttrValues(
 | 
			
		||||
        $self->{shuttersDev}, 'ASC_PrivacyUpValue_beforeDayOpen', '-1:-1' );
 | 
			
		||||
 | 
			
		||||
    ## Erwartetes Ergebnis
 | 
			
		||||
    # upTime:upBrightnessVal
 | 
			
		||||
@@ -341,7 +328,7 @@ sub getPrivacyUpBrightnessVal {
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
 | 
			
		||||
              ->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
 | 
			
		||||
            ->{LASTGETTIME} ) < 2
 | 
			
		||||
      );
 | 
			
		||||
@@ -378,14 +365,15 @@ sub getPrivacyDownTime {
 | 
			
		||||
            $self->{ $self->{shuttersDev} }
 | 
			
		||||
              ->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }
 | 
			
		||||
            ->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME} ) < 2
 | 
			
		||||
      );
 | 
			
		||||
    $self->{ $self->{shuttersDev} }->{ASC_PrivacyDownValue_beforeNightClose}
 | 
			
		||||
      ->{LASTGETTIME} = int( gettimeofday() );
 | 
			
		||||
      ->{LASTGETTIME} = int( ::gettimeofday() );
 | 
			
		||||
    my ( $downTime, $downBrightnessVal ) =
 | 
			
		||||
      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
 | 
			
		||||
      FHEM::Automation::ShuttersControl::Helper::Get::AttrValues(
 | 
			
		||||
        $self->{shuttersDev},
 | 
			
		||||
        'ASC_PrivacyDownValue_beforeNightClose', '-1:-1' );
 | 
			
		||||
 | 
			
		||||
    ## Erwartetes Ergebnis
 | 
			
		||||
@@ -420,7 +408,7 @@ sub getPrivacyDownBrightnessVal {
 | 
			
		||||
            $self->{ $self->{shuttersDev} }
 | 
			
		||||
              ->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }
 | 
			
		||||
            ->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME} ) < 2
 | 
			
		||||
      );
 | 
			
		||||
@@ -497,7 +485,7 @@ sub setSelfDefenseMode {
 | 
			
		||||
sub getSelfDefenseMode {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $self->{shuttersDev}, 'ASC_Self_Defense_Mode', 'gone' );
 | 
			
		||||
    return ::AttrVal( $self->{shuttersDev}, 'ASC_Self_Defense_Mode', 'gone' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub setSelfDefenseAbsentDelay {
 | 
			
		||||
@@ -513,13 +501,14 @@ sub setSelfDefenseAbsentDelay {
 | 
			
		||||
sub getSelfDefenseAbsentDelay {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $self->{shuttersDev}, 'ASC_Self_Defense_AbsentDelay', 300 );
 | 
			
		||||
    return ::AttrVal( $self->{shuttersDev}, 'ASC_Self_Defense_AbsentDelay',
 | 
			
		||||
        300 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub getCommandTemplate {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $self->{shuttersDev}, 'ASC_CommandTemplate', 'none' );
 | 
			
		||||
    return ::AttrVal( $self->{shuttersDev}, 'ASC_CommandTemplate', 'none' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub setWiggleValue {
 | 
			
		||||
@@ -534,7 +523,7 @@ sub setWiggleValue {
 | 
			
		||||
sub getWiggleValue {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $self->{shuttersDev}, 'ASC_WiggleValue', 5 );
 | 
			
		||||
    return ::AttrVal( $self->{shuttersDev}, 'ASC_WiggleValue', 5 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub setAdv {
 | 
			
		||||
@@ -550,7 +539,7 @@ sub getAdv {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
        AttrVal( $self->{shuttersDev}, 'ASC_Adv', 'off' ) eq 'on'
 | 
			
		||||
        ::AttrVal( $self->{shuttersDev}, 'ASC_Adv', 'off' ) eq 'on'
 | 
			
		||||
        ? ( IsAdv == 1 ? 1 : 0 )
 | 
			
		||||
        : 0
 | 
			
		||||
    );
 | 
			
		||||
@@ -593,7 +582,7 @@ sub setShadingMode {
 | 
			
		||||
sub getShadingMode {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $self->{shuttersDev}, 'ASC_Shading_Mode', 'off' );
 | 
			
		||||
    return ::AttrVal( $self->{shuttersDev}, 'ASC_Shading_Mode', 'off' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub _getTempSensor {
 | 
			
		||||
@@ -604,15 +593,15 @@ sub _getTempSensor {
 | 
			
		||||
        exists(
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} )
 | 
			
		||||
        < 2
 | 
			
		||||
      );
 | 
			
		||||
    $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} =
 | 
			
		||||
      int( gettimeofday() );
 | 
			
		||||
      int( ::gettimeofday() );
 | 
			
		||||
    my ( $device, $reading ) =
 | 
			
		||||
      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
 | 
			
		||||
        'ASC_TempSensor', 'none' );
 | 
			
		||||
      FHEM::Automation::ShuttersControl::Helper::Get::AttrValues(
 | 
			
		||||
        $self->{shuttersDev}, 'ASC_TempSensor', 'none' );
 | 
			
		||||
 | 
			
		||||
    ### erwartetes Ergebnis
 | 
			
		||||
    # DEVICE:READING
 | 
			
		||||
@@ -631,7 +620,7 @@ sub getTempSensorReading {
 | 
			
		||||
        exists(
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} )
 | 
			
		||||
        < 2
 | 
			
		||||
      );
 | 
			
		||||
@@ -664,15 +653,15 @@ sub _getIdleDetectionReading {
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
 | 
			
		||||
              ->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
 | 
			
		||||
            ->{LASTGETTIME} ) < 2
 | 
			
		||||
      );
 | 
			
		||||
    $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}->{LASTGETTIME}
 | 
			
		||||
      = int( gettimeofday() );
 | 
			
		||||
      = int( ::gettimeofday() );
 | 
			
		||||
    my ( $reading, $value ) =
 | 
			
		||||
      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
 | 
			
		||||
        'ASC_Shutter_IdleDetection', 'none' );
 | 
			
		||||
      FHEM::Automation::ShuttersControl::Helper::Get::AttrValues(
 | 
			
		||||
        $self->{shuttersDev}, 'ASC_Shutter_IdleDetection', 'none' );
 | 
			
		||||
 | 
			
		||||
    ### erwartetes Ergebnis
 | 
			
		||||
    # READING:VALUE
 | 
			
		||||
@@ -694,7 +683,7 @@ sub getIdleDetectionValue {
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
 | 
			
		||||
              ->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
 | 
			
		||||
            ->{LASTGETTIME} ) < 2
 | 
			
		||||
      );
 | 
			
		||||
@@ -728,15 +717,15 @@ sub _getBrightnessSensor {
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
 | 
			
		||||
              ->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
 | 
			
		||||
            ->{LASTGETTIME} ) < 2
 | 
			
		||||
      );
 | 
			
		||||
    $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{LASTGETTIME} =
 | 
			
		||||
      int( gettimeofday() );
 | 
			
		||||
      int( ::gettimeofday() );
 | 
			
		||||
    my ( $device, $reading, $max, $min ) =
 | 
			
		||||
      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
 | 
			
		||||
        'ASC_BrightnessSensor', 'none' );
 | 
			
		||||
      FHEM::Automation::ShuttersControl::Helper::Get::AttrValues(
 | 
			
		||||
        $self->{shuttersDev}, 'ASC_BrightnessSensor', 'none' );
 | 
			
		||||
 | 
			
		||||
    ### erwartetes Ergebnis
 | 
			
		||||
    # DEVICE:READING MAX:MIN
 | 
			
		||||
@@ -760,7 +749,7 @@ sub getBrightnessReading {
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
 | 
			
		||||
              ->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
 | 
			
		||||
            ->{LASTGETTIME} ) < 2
 | 
			
		||||
      );
 | 
			
		||||
@@ -785,7 +774,7 @@ sub getShadingAzimuthLeft {
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
 | 
			
		||||
              ->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
 | 
			
		||||
            ->{LASTGETTIME} ) < 2
 | 
			
		||||
      );
 | 
			
		||||
@@ -814,15 +803,15 @@ sub getShadingAzimuthRight {
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
 | 
			
		||||
              ->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
 | 
			
		||||
            ->{LASTGETTIME} ) < 2
 | 
			
		||||
      );
 | 
			
		||||
    $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}->{LASTGETTIME}
 | 
			
		||||
      = int( gettimeofday() );
 | 
			
		||||
      = int( ::gettimeofday() );
 | 
			
		||||
    my ( $left, $right ) =
 | 
			
		||||
      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
 | 
			
		||||
        'ASC_Shading_InOutAzimuth', '95:265' );
 | 
			
		||||
      FHEM::Automation::ShuttersControl::Helper::Get::AttrValues(
 | 
			
		||||
        $self->{shuttersDev}, 'ASC_Shading_InOutAzimuth', '95:265' );
 | 
			
		||||
 | 
			
		||||
    ### erwartetes Ergebnis
 | 
			
		||||
    # MIN:MAX
 | 
			
		||||
@@ -849,8 +838,8 @@ sub setShadingMinOutsideTemperature {
 | 
			
		||||
sub getShadingMinOutsideTemperature {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $self->{shuttersDev}, 'ASC_Shading_Min_OutsideTemperature',
 | 
			
		||||
        18 );
 | 
			
		||||
    return ::AttrVal( $self->{shuttersDev},
 | 
			
		||||
        'ASC_Shading_Min_OutsideTemperature', 18 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub setShadingMinMaxElevation {
 | 
			
		||||
@@ -873,15 +862,15 @@ sub getShadingMinElevation {
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
 | 
			
		||||
              ->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
 | 
			
		||||
            ->{LASTGETTIME} ) < 2
 | 
			
		||||
      );
 | 
			
		||||
    $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
 | 
			
		||||
      ->{LASTGETTIME} = int( gettimeofday() );
 | 
			
		||||
      ->{LASTGETTIME} = int( ::gettimeofday() );
 | 
			
		||||
    my ( $min, $max ) =
 | 
			
		||||
      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
 | 
			
		||||
        'ASC_Shading_MinMax_Elevation', '25.0:100.0' );
 | 
			
		||||
      FHEM::Automation::ShuttersControl::Helper::Get::AttrValues(
 | 
			
		||||
        $self->{shuttersDev}, 'ASC_Shading_MinMax_Elevation', '25.0:100.0' );
 | 
			
		||||
 | 
			
		||||
    ### erwartetes Ergebnis
 | 
			
		||||
    # MIN:MAX
 | 
			
		||||
@@ -905,7 +894,7 @@ sub getShadingMaxElevation {
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
 | 
			
		||||
              ->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
 | 
			
		||||
            ->{LASTGETTIME} ) < 2
 | 
			
		||||
      );
 | 
			
		||||
@@ -943,15 +932,15 @@ sub getShadingStateChangeSunny {
 | 
			
		||||
            $self->{ $self->{shuttersDev} }
 | 
			
		||||
              ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }
 | 
			
		||||
            ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} ) < 2
 | 
			
		||||
      );
 | 
			
		||||
    $self->{ $self->{shuttersDev} }->{ASC_Shading_StateChange_SunnyCloudy}
 | 
			
		||||
      ->{LASTGETTIME} = int( gettimeofday() );
 | 
			
		||||
      ->{LASTGETTIME} = int( ::gettimeofday() );
 | 
			
		||||
    my ( $sunny, $cloudy, $maxBrightnessAverageArrayObjects ) =
 | 
			
		||||
      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
 | 
			
		||||
        'ASC_Shading_StateChange_SunnyCloudy',
 | 
			
		||||
      FHEM::Automation::ShuttersControl::Helper::Get::AttrValues(
 | 
			
		||||
        $self->{shuttersDev}, 'ASC_Shading_StateChange_SunnyCloudy',
 | 
			
		||||
        '35000:20000' );
 | 
			
		||||
 | 
			
		||||
    ### erwartetes Ergebnis
 | 
			
		||||
@@ -982,7 +971,7 @@ sub getShadingStateChangeCloudy {
 | 
			
		||||
            $self->{ $self->{shuttersDev} }
 | 
			
		||||
              ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }
 | 
			
		||||
            ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} ) < 2
 | 
			
		||||
      );
 | 
			
		||||
@@ -1002,7 +991,7 @@ sub getMaxBrightnessAverageArrayObjects {
 | 
			
		||||
            $self->{ $self->{shuttersDev} }
 | 
			
		||||
              ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }
 | 
			
		||||
            ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} ) < 2
 | 
			
		||||
      );
 | 
			
		||||
@@ -1025,7 +1014,7 @@ sub setShadingWaitingPeriod {
 | 
			
		||||
sub getShadingWaitingPeriod {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $self->{shuttersDev}, 'ASC_Shading_WaitingPeriod', 1200 );
 | 
			
		||||
    return ::AttrVal( $self->{shuttersDev}, 'ASC_Shading_WaitingPeriod', 1200 );
 | 
			
		||||
}
 | 
			
		||||
### Ende Beschattung
 | 
			
		||||
sub setExternalTrigger {
 | 
			
		||||
@@ -1046,16 +1035,16 @@ sub getExternalTriggerDevice {
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
			
		||||
              ->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
			
		||||
            ->{LASTGETTIME} ) < 2
 | 
			
		||||
      );
 | 
			
		||||
    $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{LASTGETTIME} =
 | 
			
		||||
      int( gettimeofday() );
 | 
			
		||||
      int( ::gettimeofday() );
 | 
			
		||||
    my ( $device, $reading, $valueActive, $valueInactive, $posActive,
 | 
			
		||||
        $posInactive, $valueActive2, $posActive2 )
 | 
			
		||||
      = FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
 | 
			
		||||
        'ASC_ExternalTrigger', 'none' );
 | 
			
		||||
      = FHEM::Automation::ShuttersControl::Helper::Get::AttrValues(
 | 
			
		||||
        $self->{shuttersDev}, 'ASC_ExternalTrigger', 'none' );
 | 
			
		||||
 | 
			
		||||
    ### erwartetes Ergebnis
 | 
			
		||||
# DEVICE:READING VALUEACTIVE:VALUEINACTIVE POSACTIVE:POSINACTIVE VALUEACTIVE2:POSACTIVE2
 | 
			
		||||
@@ -1070,10 +1059,11 @@ sub getExternalTriggerDevice {
 | 
			
		||||
      $valueInactive;
 | 
			
		||||
    $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive} =
 | 
			
		||||
      $posActive;
 | 
			
		||||
    $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posinactive} =
 | 
			
		||||
      (   $posInactive ne 'none'
 | 
			
		||||
    $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posinactive} = (
 | 
			
		||||
          $posInactive ne 'none'
 | 
			
		||||
        ? $posInactive
 | 
			
		||||
        : $FHEM::Automation::ShuttersControl::shutters->getLastPos );
 | 
			
		||||
        : $FHEM::Automation::ShuttersControl::shutters->getLastPos
 | 
			
		||||
    );
 | 
			
		||||
    $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{valueactive2} =
 | 
			
		||||
      $valueActive2;
 | 
			
		||||
    $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive2} =
 | 
			
		||||
@@ -1092,7 +1082,7 @@ sub getExternalTriggerReading {
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
			
		||||
              ->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
			
		||||
            ->{LASTGETTIME} ) < 2
 | 
			
		||||
      );
 | 
			
		||||
@@ -1110,7 +1100,7 @@ sub getExternalTriggerValueActive {
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
			
		||||
              ->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
			
		||||
            ->{LASTGETTIME} ) < 2
 | 
			
		||||
      );
 | 
			
		||||
@@ -1130,7 +1120,7 @@ sub getExternalTriggerValueActive2 {
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
			
		||||
              ->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
			
		||||
            ->{LASTGETTIME} ) < 2
 | 
			
		||||
      );
 | 
			
		||||
@@ -1150,7 +1140,7 @@ sub getExternalTriggerValueInactive {
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
			
		||||
              ->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
			
		||||
            ->{LASTGETTIME} ) < 2
 | 
			
		||||
      );
 | 
			
		||||
@@ -1169,7 +1159,7 @@ sub getExternalTriggerPosActive {
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
			
		||||
              ->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
			
		||||
            ->{LASTGETTIME} ) < 2
 | 
			
		||||
      );
 | 
			
		||||
@@ -1187,7 +1177,7 @@ sub getExternalTriggerPosActive2 {
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
			
		||||
              ->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
			
		||||
            ->{LASTGETTIME} ) < 2
 | 
			
		||||
      );
 | 
			
		||||
@@ -1205,7 +1195,7 @@ sub getExternalTriggerPosInactive {
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
			
		||||
              ->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
			
		||||
            ->{LASTGETTIME} ) < 2
 | 
			
		||||
      );
 | 
			
		||||
@@ -1227,7 +1217,7 @@ sub setDelay {
 | 
			
		||||
sub getDelay {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    my $val = AttrVal( $self->{shuttersDev}, 'ASC_Drive_Delay', -1 );
 | 
			
		||||
    my $val = ::AttrVal( $self->{shuttersDev}, 'ASC_Drive_Delay', -1 );
 | 
			
		||||
    return ( $val =~ m{^\d+$}xms ? $val : -1 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1243,7 +1233,7 @@ sub setDelayStart {
 | 
			
		||||
sub getDelayStart {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    my $val = AttrVal( $self->{shuttersDev}, 'ASC_Drive_DelayStart', -1 );
 | 
			
		||||
    my $val = ::AttrVal( $self->{shuttersDev}, 'ASC_Drive_DelayStart', -1 );
 | 
			
		||||
    return ( ( $val > 0 && $val =~ m{^\d+$}xms ) ? $val : -1 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1260,7 +1250,7 @@ sub setBlockingTimeAfterManual {
 | 
			
		||||
sub getBlockingTimeAfterManual {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_afterManual',
 | 
			
		||||
    return ::AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_afterManual',
 | 
			
		||||
        1200 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1277,7 +1267,7 @@ sub setBlockingTimeBeforNightClose {
 | 
			
		||||
sub getBlockingTimeBeforNightClose {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_beforNightClose',
 | 
			
		||||
    return ::AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_beforNightClose',
 | 
			
		||||
        3600 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1294,7 +1284,7 @@ sub setBlockingTimeBeforDayOpen {
 | 
			
		||||
sub getBlockingTimeBeforDayOpen {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_beforDayOpen',
 | 
			
		||||
    return ::AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_beforDayOpen',
 | 
			
		||||
        3600 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1310,9 +1300,9 @@ sub setPosCmd {
 | 
			
		||||
sub getPosCmd {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $self->{shuttersDev}, 'ASC_Pos_Reading',
 | 
			
		||||
    return ::AttrVal( $self->{shuttersDev}, 'ASC_Pos_Reading',
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::userAttrList{'ASC_Pos_Reading'}
 | 
			
		||||
          [ AttrVal( $self->{shuttersDev}, 'ASC', 1 ) ] );
 | 
			
		||||
          [ ::AttrVal( $self->{shuttersDev}, 'ASC', 1 ) ] );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub setOpenPos {
 | 
			
		||||
@@ -1377,7 +1367,7 @@ sub setVentilatePosAfterDayClosed {
 | 
			
		||||
sub getVentilatePosAfterDayClosed {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $self->{shuttersDev}, 'ASC_WindowRec_PosAfterDayClosed',
 | 
			
		||||
    return ::AttrVal( $self->{shuttersDev}, 'ASC_WindowRec_PosAfterDayClosed',
 | 
			
		||||
        'open' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1442,7 +1432,7 @@ sub setVentilateOpen {
 | 
			
		||||
sub getVentilateOpen {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $self->{shuttersDev}, 'ASC_Ventilate_Window_Open', 'on' );
 | 
			
		||||
    return ::AttrVal( $self->{shuttersDev}, 'ASC_Ventilate_Window_Open', 'on' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub setComfortOpenPos {
 | 
			
		||||
@@ -1482,7 +1472,7 @@ sub setPartyMode {
 | 
			
		||||
sub getPartyMode {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $self->{shuttersDev}, 'ASC_Partymode', 'off' );
 | 
			
		||||
    return ::AttrVal( $self->{shuttersDev}, 'ASC_Partymode', 'off' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub setRoommates {
 | 
			
		||||
@@ -1497,7 +1487,7 @@ sub setRoommates {
 | 
			
		||||
sub getRoommates {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $self->{shuttersDev}, 'ASC_Roommate_Device', 'none' );
 | 
			
		||||
    return ::AttrVal( $self->{shuttersDev}, 'ASC_Roommate_Device', 'none' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub setRoommatesReading {
 | 
			
		||||
@@ -1512,7 +1502,7 @@ sub setRoommatesReading {
 | 
			
		||||
sub getRoommatesReading {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $self->{shuttersDev}, 'ASC_Roommate_Reading', 'state' );
 | 
			
		||||
    return ::AttrVal( $self->{shuttersDev}, 'ASC_Roommate_Reading', 'state' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub getWindPos {
 | 
			
		||||
@@ -1525,7 +1515,7 @@ sub getWindPos {
 | 
			
		||||
        exists(
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
 | 
			
		||||
        ) < 2
 | 
			
		||||
      );
 | 
			
		||||
@@ -1544,15 +1534,15 @@ sub getWindMax {
 | 
			
		||||
        exists(
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
 | 
			
		||||
        ) < 2
 | 
			
		||||
      );
 | 
			
		||||
    $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME} =
 | 
			
		||||
      int( gettimeofday() );
 | 
			
		||||
      int( ::gettimeofday() );
 | 
			
		||||
    my ( $max, $hyst, $pos ) =
 | 
			
		||||
      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
 | 
			
		||||
        'ASC_WindParameters', '50:20' );
 | 
			
		||||
      FHEM::Automation::ShuttersControl::Helper::Get::AttrValues(
 | 
			
		||||
        $self->{shuttersDev}, 'ASC_WindParameters', '50:20' );
 | 
			
		||||
 | 
			
		||||
    ## Erwartetes Ergebnis
 | 
			
		||||
    # max:hyst pos
 | 
			
		||||
@@ -1560,10 +1550,11 @@ sub getWindMax {
 | 
			
		||||
    $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggermax} = $max;
 | 
			
		||||
    $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggerhyst} =
 | 
			
		||||
      ( $hyst ne 'none' ? $max - $hyst : $max - 20 );
 | 
			
		||||
    $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{closedPos} =
 | 
			
		||||
      (   $pos ne 'none'
 | 
			
		||||
    $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{closedPos} = (
 | 
			
		||||
          $pos ne 'none'
 | 
			
		||||
        ? $pos
 | 
			
		||||
        : $FHEM::Automation::ShuttersControl::shutters->getOpenPos );
 | 
			
		||||
        : $FHEM::Automation::ShuttersControl::shutters->getOpenPos
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggermax};
 | 
			
		||||
}
 | 
			
		||||
@@ -1587,7 +1578,7 @@ sub getWindMin {
 | 
			
		||||
        exists(
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
 | 
			
		||||
        ) < 2
 | 
			
		||||
      );
 | 
			
		||||
@@ -1608,7 +1599,7 @@ sub setWindProtection {
 | 
			
		||||
sub getWindProtection {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $self->{shuttersDev}, 'ASC_WindProtection', 'off' );
 | 
			
		||||
    return ::AttrVal( $self->{shuttersDev}, 'ASC_WindProtection', 'off' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub setRainProtection {
 | 
			
		||||
@@ -1623,7 +1614,7 @@ sub setRainProtection {
 | 
			
		||||
sub getRainProtection {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $self->{shuttersDev}, 'ASC_RainProtection', 'off' );
 | 
			
		||||
    return ::AttrVal( $self->{shuttersDev}, 'ASC_RainProtection', 'off' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub setModeUp {
 | 
			
		||||
@@ -1638,7 +1629,7 @@ sub setModeUp {
 | 
			
		||||
sub getModeUp {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $self->{shuttersDev}, 'ASC_Mode_Up', 'always' );
 | 
			
		||||
    return ::AttrVal( $self->{shuttersDev}, 'ASC_Mode_Up', 'always' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub setModeDown {
 | 
			
		||||
@@ -1653,7 +1644,7 @@ sub setModeDown {
 | 
			
		||||
sub getModeDown {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $self->{shuttersDev}, 'ASC_Mode_Down', 'always' );
 | 
			
		||||
    return ::AttrVal( $self->{shuttersDev}, 'ASC_Mode_Down', 'always' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub setLockOut {
 | 
			
		||||
@@ -1668,7 +1659,7 @@ sub setLockOut {
 | 
			
		||||
sub getLockOut {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $self->{shuttersDev}, 'ASC_LockOut', 'off' );
 | 
			
		||||
    return ::AttrVal( $self->{shuttersDev}, 'ASC_LockOut', 'off' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub setLockOutCmd {
 | 
			
		||||
@@ -1683,7 +1674,7 @@ sub setLockOutCmd {
 | 
			
		||||
sub getLockOutCmd {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $self->{shuttersDev}, 'ASC_LockOut_Cmd', 'none' );
 | 
			
		||||
    return ::AttrVal( $self->{shuttersDev}, 'ASC_LockOut_Cmd', 'none' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub setAntiFreeze {
 | 
			
		||||
@@ -1698,7 +1689,7 @@ sub setAntiFreeze {
 | 
			
		||||
sub getAntiFreeze {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $self->{shuttersDev}, 'ASC_Antifreeze', 'off' );
 | 
			
		||||
    return ::AttrVal( $self->{shuttersDev}, 'ASC_Antifreeze', 'off' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub setAutoAstroModeMorning {
 | 
			
		||||
@@ -1713,7 +1704,8 @@ sub setAutoAstroModeMorning {
 | 
			
		||||
sub getAutoAstroModeMorning {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeMorning', 'none' );
 | 
			
		||||
    return ::AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeMorning',
 | 
			
		||||
        'none' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub setAutoAstroModeEvening {
 | 
			
		||||
@@ -1728,7 +1720,8 @@ sub setAutoAstroModeEvening {
 | 
			
		||||
sub getAutoAstroModeEvening {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeEvening', 'none' );
 | 
			
		||||
    return ::AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeEvening',
 | 
			
		||||
        'none' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub setAutoAstroModeMorningHorizon {
 | 
			
		||||
@@ -1744,7 +1737,7 @@ sub setAutoAstroModeMorningHorizon {
 | 
			
		||||
sub getAutoAstroModeMorningHorizon {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeMorningHorizon',
 | 
			
		||||
    return ::AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeMorningHorizon',
 | 
			
		||||
        0 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1761,7 +1754,7 @@ sub setAutoAstroModeEveningHorizon {
 | 
			
		||||
sub getAutoAstroModeEveningHorizon {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeEveningHorizon',
 | 
			
		||||
    return ::AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeEveningHorizon',
 | 
			
		||||
        0 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1777,7 +1770,7 @@ sub setUp {
 | 
			
		||||
sub getUp {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $self->{shuttersDev}, 'ASC_Up', 'astro' );
 | 
			
		||||
    return ::AttrVal( $self->{shuttersDev}, 'ASC_Up', 'astro' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub setDown {
 | 
			
		||||
@@ -1792,14 +1785,15 @@ sub setDown {
 | 
			
		||||
sub getDown {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $self->{shuttersDev}, 'ASC_Down', 'astro' );
 | 
			
		||||
    return ::AttrVal( $self->{shuttersDev}, 'ASC_Down', 'astro' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub setShadingBetweenTheTime {
 | 
			
		||||
    my $self    = shift;
 | 
			
		||||
    my $attrVal = shift;
 | 
			
		||||
 | 
			
		||||
    _setAttributs( $self->{shuttersDev}, 'ASC_Shading_BetweenTheTime', $attrVal );
 | 
			
		||||
    _setAttributs( $self->{shuttersDev}, 'ASC_Shading_BetweenTheTime',
 | 
			
		||||
        $attrVal );
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
@@ -1807,7 +1801,8 @@ sub setShadingBetweenTheTime {
 | 
			
		||||
sub getShadingBetweenTheTime {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $self->{shuttersDev}, 'ASC_Shading_BetweenTheTime', '00:00-24:00' );
 | 
			
		||||
    return ::AttrVal( $self->{shuttersDev}, 'ASC_Shading_BetweenTheTime',
 | 
			
		||||
        '00:00-24:00' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub setTimeUpEarly {
 | 
			
		||||
@@ -1822,7 +1817,7 @@ sub setTimeUpEarly {
 | 
			
		||||
sub getTimeUpEarly {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_Early', '05:00' );
 | 
			
		||||
    my $val = ::AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_Early', '05:00' );
 | 
			
		||||
 | 
			
		||||
    if ( defined( PerlCodeCheck($val) ) ) {
 | 
			
		||||
        $val = PerlCodeCheck($val);
 | 
			
		||||
@@ -1847,7 +1842,7 @@ sub setTimeUpLate {
 | 
			
		||||
sub getTimeUpLate {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_Late', '08:30' );
 | 
			
		||||
    my $val = ::AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_Late', '08:30' );
 | 
			
		||||
 | 
			
		||||
    if ( defined( PerlCodeCheck($val) ) ) {
 | 
			
		||||
        $val = PerlCodeCheck($val);
 | 
			
		||||
@@ -1872,7 +1867,7 @@ sub setTimeDownEarly {
 | 
			
		||||
sub getTimeDownEarly {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Down_Early', '16:00' );
 | 
			
		||||
    my $val = ::AttrVal( $self->{shuttersDev}, 'ASC_Time_Down_Early', '16:00' );
 | 
			
		||||
 | 
			
		||||
    if ( defined( PerlCodeCheck($val) ) ) {
 | 
			
		||||
        $val = PerlCodeCheck($val);
 | 
			
		||||
@@ -1897,7 +1892,7 @@ sub setTimeDownLate {
 | 
			
		||||
sub getTimeDownLate {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Down_Late', '22:00' );
 | 
			
		||||
    my $val = ::AttrVal( $self->{shuttersDev}, 'ASC_Time_Down_Late', '22:00' );
 | 
			
		||||
 | 
			
		||||
    if ( defined( PerlCodeCheck($val) ) ) {
 | 
			
		||||
        $val = PerlCodeCheck($val);
 | 
			
		||||
@@ -1923,7 +1918,7 @@ sub getTimeUpWeHoliday {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    my $val =
 | 
			
		||||
      AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_WE_Holiday', '01:25' );
 | 
			
		||||
      ::AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_WE_Holiday', '01:25' );
 | 
			
		||||
 | 
			
		||||
    if ( defined( PerlCodeCheck($val) ) ) {
 | 
			
		||||
        $val = PerlCodeCheck($val);
 | 
			
		||||
@@ -1945,7 +1940,7 @@ sub getBrightnessMinVal {
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
 | 
			
		||||
              ->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
 | 
			
		||||
            ->{LASTGETTIME} ) < 2
 | 
			
		||||
      );
 | 
			
		||||
@@ -1964,7 +1959,7 @@ sub getBrightnessMaxVal {
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
 | 
			
		||||
              ->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
 | 
			
		||||
            ->{LASTGETTIME} ) < 2
 | 
			
		||||
      );
 | 
			
		||||
@@ -1986,7 +1981,7 @@ sub setDriveUpMaxDuration {
 | 
			
		||||
sub getDriveUpMaxDuration {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $self->{shuttersDev}, 'ASC_DriveUpMaxDuration', 60 );
 | 
			
		||||
    return ::AttrVal( $self->{shuttersDev}, 'ASC_DriveUpMaxDuration', 60 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
###############################################################################
 | 
			
		||||
#
 | 
			
		||||
# Developed with Kate
 | 
			
		||||
# Developed with VSCodium and richterger perl plugin
 | 
			
		||||
#
 | 
			
		||||
#  (c) 2018-2021 Copyright: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
			
		||||
#  (c) 2018-2022 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net)
 | 
			
		||||
#  All rights reserved
 | 
			
		||||
#
 | 
			
		||||
#   Special thanks goes to:
 | 
			
		||||
@@ -44,21 +44,10 @@ use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use utf8;
 | 
			
		||||
 | 
			
		||||
use GPUtils qw(GP_Import);
 | 
			
		||||
 | 
			
		||||
## Import der FHEM Funktionen
 | 
			
		||||
BEGIN {
 | 
			
		||||
    GP_Import(
 | 
			
		||||
        qw(
 | 
			
		||||
          ReadingsVal
 | 
			
		||||
          ReadingsNum)
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub getBrightness {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return ReadingsNum(
 | 
			
		||||
    return ::ReadingsNum(
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::shutters->_getBrightnessSensor,
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::shutters->getBrightnessReading,
 | 
			
		||||
        -1 );
 | 
			
		||||
@@ -67,7 +56,7 @@ sub getBrightness {
 | 
			
		||||
sub getWindStatus {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return ReadingsVal(
 | 
			
		||||
    return ::ReadingsVal(
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::ascDev->_getWindSensor,
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::ascDev->getWindSensorReading, -1 );
 | 
			
		||||
}
 | 
			
		||||
@@ -75,7 +64,7 @@ sub getWindStatus {
 | 
			
		||||
sub getStatus {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return ReadingsNum( $self->{shuttersDev},
 | 
			
		||||
    return ::ReadingsNum( $self->{shuttersDev},
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::shutters->getPosCmd, 0 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -88,7 +77,7 @@ sub getDelayCmd {
 | 
			
		||||
sub getASCenable {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return ReadingsVal( $self->{shuttersDev}, 'ASC_Enable', 'on' );
 | 
			
		||||
    return ::ReadingsVal( $self->{shuttersDev}, 'ASC_Enable', 'on' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
###############################################################################
 | 
			
		||||
#
 | 
			
		||||
# Developed with Kate
 | 
			
		||||
# Developed with VSCodium and richterger perl plugin
 | 
			
		||||
#
 | 
			
		||||
#  (c) 2018-2021 Copyright: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
			
		||||
#  (c) 2018-2022 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net)
 | 
			
		||||
#  All rights reserved
 | 
			
		||||
#
 | 
			
		||||
#   Special thanks goes to:
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
###############################################################################
 | 
			
		||||
#
 | 
			
		||||
# Developed with Kate
 | 
			
		||||
# Developed with VSCodium and richterger perl plugin
 | 
			
		||||
#
 | 
			
		||||
#  (c) 2018-2021 Copyright: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
			
		||||
#  (c) 2018-2022 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net)
 | 
			
		||||
#  All rights reserved
 | 
			
		||||
#
 | 
			
		||||
#   Special thanks goes to:
 | 
			
		||||
@@ -44,17 +44,6 @@ use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use utf8;
 | 
			
		||||
 | 
			
		||||
use GPUtils qw(GP_Import);
 | 
			
		||||
 | 
			
		||||
## Import der FHEM Funktionen
 | 
			
		||||
BEGIN {
 | 
			
		||||
    GP_Import(
 | 
			
		||||
        qw(
 | 
			
		||||
          AttrVal
 | 
			
		||||
          gettimeofday)
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub setSubTyp {
 | 
			
		||||
    my $self    = shift;
 | 
			
		||||
    my $attrVal = shift;
 | 
			
		||||
@@ -67,7 +56,8 @@ sub setSubTyp {
 | 
			
		||||
sub getSubTyp {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return AttrVal( $self->{shuttersDev}, 'ASC_WindowRec_subType', 'twostate' );
 | 
			
		||||
    return ::AttrVal( $self->{shuttersDev}, 'ASC_WindowRec_subType',
 | 
			
		||||
        'twostate' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub setWinDev {
 | 
			
		||||
@@ -87,15 +77,15 @@ sub _getWinDev {
 | 
			
		||||
        exists(
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} ) <
 | 
			
		||||
        2
 | 
			
		||||
      );
 | 
			
		||||
    $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} =
 | 
			
		||||
      int( gettimeofday() );
 | 
			
		||||
      int( ::gettimeofday() );
 | 
			
		||||
    my ( $device, $reading ) =
 | 
			
		||||
      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
 | 
			
		||||
        'ASC_WindowRec', 'none' );
 | 
			
		||||
      FHEM::Automation::ShuttersControl::Helper::GetAttrValues(
 | 
			
		||||
        $self->{shuttersDev}, 'ASC_WindowRec', 'none' );
 | 
			
		||||
 | 
			
		||||
    ### erwartetes Ergebnis
 | 
			
		||||
    # DEVICE:READING VALUEACTIVE:VALUEINACTIVE POSACTIVE:POSINACTIVE
 | 
			
		||||
@@ -116,7 +106,7 @@ sub getWinDevReading {
 | 
			
		||||
        exists(
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME}
 | 
			
		||||
        )
 | 
			
		||||
        && ( gettimeofday() -
 | 
			
		||||
        && ( ::gettimeofday() -
 | 
			
		||||
            $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} ) <
 | 
			
		||||
        2
 | 
			
		||||
      );
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
###############################################################################
 | 
			
		||||
#
 | 
			
		||||
# Developed with Kate
 | 
			
		||||
# Developed with VSCodium and richterger perl plugin
 | 
			
		||||
#
 | 
			
		||||
#  (c) 2018-2021 Copyright: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
			
		||||
#  (c) 2018-2022 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net)
 | 
			
		||||
#  All rights reserved
 | 
			
		||||
#
 | 
			
		||||
#   Special thanks goes to:
 | 
			
		||||
@@ -44,20 +44,10 @@ use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use utf8;
 | 
			
		||||
 | 
			
		||||
use GPUtils qw(GP_Import);
 | 
			
		||||
 | 
			
		||||
## Import der FHEM Funktionen
 | 
			
		||||
BEGIN {
 | 
			
		||||
    GP_Import(
 | 
			
		||||
        qw(
 | 
			
		||||
          ReadingsVal)
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub getWinStatus {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    return ReadingsVal(
 | 
			
		||||
    return ::ReadingsVal(
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::shutters->_getWinDev,
 | 
			
		||||
        $FHEM::Automation::ShuttersControl::shutters->getWinDevReading,
 | 
			
		||||
        'closed' );
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user