dev #85
@@ -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
 | 
					#  All rights reserved
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
#   Special thanks goes to:
 | 
					#   Special thanks goes to:
 | 
				
			||||||
@@ -49,26 +49,17 @@ use utf8;
 | 
				
			|||||||
use FHEM::Meta;
 | 
					use FHEM::Meta;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use FHEM::Automation::ShuttersControl;
 | 
					use FHEM::Automation::ShuttersControl;
 | 
				
			||||||
use GPUtils qw(GP_Import GP_Export);
 | 
					use GPUtils qw(GP_Import);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Import der FHEM Funktionen
 | 
					## Import der FHEM Funktionen
 | 
				
			||||||
#-- Run before package compilation
 | 
					#-- Run before package compilation
 | 
				
			||||||
BEGIN {
 | 
					BEGIN {
 | 
				
			||||||
    # Import from main context
 | 
					    # Import from main context
 | 
				
			||||||
    GP_Import(
 | 
					    GP_Import(qw(readingFnAttributes));
 | 
				
			||||||
        qw(
 | 
					 | 
				
			||||||
          readingFnAttributes
 | 
					 | 
				
			||||||
          )
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    #-- Export to main context with different name
 | 
					 | 
				
			||||||
    GP_Export(
 | 
					 | 
				
			||||||
        qw(
 | 
					 | 
				
			||||||
          Initialize
 | 
					 | 
				
			||||||
          )
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sub ::AutoShuttersControl_Initialize { goto &Initialize }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub Initialize {
 | 
					sub Initialize {
 | 
				
			||||||
    my $hash = shift;
 | 
					    my $hash = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -81,7 +72,7 @@ sub Initialize {
 | 
				
			|||||||
    $hash->{UndefFn}    = \&FHEM::Automation::ShuttersControl::Undef;
 | 
					    $hash->{UndefFn}    = \&FHEM::Automation::ShuttersControl::Undef;
 | 
				
			||||||
    $hash->{DeleteFn}   = \&FHEM::Automation::ShuttersControl::Delete;
 | 
					    $hash->{DeleteFn}   = \&FHEM::Automation::ShuttersControl::Delete;
 | 
				
			||||||
    $hash->{ShutdownFn} = \&FHEM::Automation::ShuttersControl::Shutdown;
 | 
					    $hash->{ShutdownFn} = \&FHEM::Automation::ShuttersControl::Shutdown;
 | 
				
			||||||
    $hash->{AttrList}   =
 | 
					    $hash->{AttrList} =
 | 
				
			||||||
        'ASC_tempSensor '
 | 
					        'ASC_tempSensor '
 | 
				
			||||||
      . 'ASC_brightnessDriveUpDown '
 | 
					      . 'ASC_brightnessDriveUpDown '
 | 
				
			||||||
      . 'ASC_autoShuttersControlMorning:on,off '
 | 
					      . 'ASC_autoShuttersControlMorning:on,off '
 | 
				
			||||||
@@ -416,11 +407,11 @@ __END__
 | 
				
			|||||||
                after the last manual operation in seconds. Defaults to 1200 (20 minutes).
 | 
					                after the last manual operation in seconds. Defaults to 1200 (20 minutes).
 | 
				
			||||||
            </li>
 | 
					            </li>
 | 
				
			||||||
            <a id="AutoShuttersControl-attr-ASC_BlockingTime_beforDayOpen"></a>
 | 
					            <a id="AutoShuttersControl-attr-ASC_BlockingTime_beforDayOpen"></a>
 | 
				
			||||||
            <li><strong>ASC_BlockingTime_beforeDayOpen</strong> - Time in which no closing operation is made by
 | 
					            <li><strong>ASC_BlockingTime_beforDayOpen</strong> - Time in which no closing operation is made by
 | 
				
			||||||
                <abbr>ASC</abbr> after opening at the morning in seconds. Defaults to 3600 (one hour).
 | 
					                <abbr>ASC</abbr> after opening at the morning in seconds. Defaults to 3600 (one hour).
 | 
				
			||||||
            </li>
 | 
					            </li>
 | 
				
			||||||
            <a id="AutoShuttersControl-attr-ASC_BlockingTime_beforeNightClose"></a>
 | 
					            <a id="AutoShuttersControl-attr-ASC_BlockingTime_beforNightClose"></a>
 | 
				
			||||||
            <li><strong>ASC_BlockingTime_beforeNightClose</strong> - Time in which no closing operation is made by
 | 
					            <li><strong>ASC_BlockingTime_beforNightClose</strong> - Time in which no closing operation is made by
 | 
				
			||||||
                <abbr>ASC</abbr> before closing at the evening in seconds. Defaults to 3600 (one hour).
 | 
					                <abbr>ASC</abbr> before closing at the evening in seconds. Defaults to 3600 (one hour).
 | 
				
			||||||
            </li>
 | 
					            </li>
 | 
				
			||||||
            <a id="AutoShuttersControl-attr-ASC_BrightnessSensor"></a>
 | 
					            <a id="AutoShuttersControl-attr-ASC_BrightnessSensor"></a>
 | 
				
			||||||
@@ -1041,10 +1032,10 @@ __END__
 | 
				
			|||||||
            <li><strong>ASC_AutoAstroModeMorningHorizon</strong> - Höhe über Horizont,a wenn beim Attribut ASC_autoAstroModeMorning HORIZON ausgewählt (default: none)</li>
 | 
					            <li><strong>ASC_AutoAstroModeMorningHorizon</strong> - Höhe über Horizont,a wenn beim Attribut ASC_autoAstroModeMorning HORIZON ausgewählt (default: none)</li>
 | 
				
			||||||
            <a id="AutoShuttersControl-attr-ASC_BlockingTime_afterManual"></a>
 | 
					            <a id="AutoShuttersControl-attr-ASC_BlockingTime_afterManual"></a>
 | 
				
			||||||
            <li><strong>ASC_BlockingTime_afterManual</strong> - wie viel Sekunden soll die Automatik nach einer manuellen Fahrt aussetzen. (default: 1200)</li>
 | 
					            <li><strong>ASC_BlockingTime_afterManual</strong> - wie viel Sekunden soll die Automatik nach einer manuellen Fahrt aussetzen. (default: 1200)</li>
 | 
				
			||||||
            <a id="AutoShuttersControl-attr-ASC_BlockingTime_beforeDayOpen"></a>
 | 
					            <a id="AutoShuttersControl-attr-ASC_BlockingTime_beforDayOpen"></a>
 | 
				
			||||||
            <li><strong>ASC_BlockingTime_beforeDayOpen</strong> - wie viel Sekunden vor dem morgendlichen öffnen soll keine schließen Fahrt mehr stattfinden. (default: 3600)</li>
 | 
					            <li><strong>ASC_BlockingTime_beforDayOpen</strong> - wie viel Sekunden vor dem morgendlichen öffnen soll keine schließen Fahrt mehr stattfinden. (default: 3600)</li>
 | 
				
			||||||
            <a id="AutoShuttersControl-attr-ASC_BlockingTime_beforeNightClose"></a>
 | 
					            <a id="AutoShuttersControl-attr-ASC_BlockingTime_beforNightClose"></a>
 | 
				
			||||||
            <li><strong>ASC_BlockingTime_beforeNightClose</strong> - wie viel Sekunden vor dem nächtlichen schließen soll keine öffnen Fahrt mehr stattfinden. (default: 3600)</li>
 | 
					            <li><strong>ASC_BlockingTime_beforNightClose</strong> - wie viel Sekunden vor dem nächtlichen schließen soll keine öffnen Fahrt mehr stattfinden. (default: 3600)</li>
 | 
				
			||||||
            <a id="AutoShuttersControl-attr-ASC_BrightnessSensor"></a>
 | 
					            <a id="AutoShuttersControl-attr-ASC_BrightnessSensor"></a>
 | 
				
			||||||
            <li><strong>ASC_BrightnessSensor - DEVICE[:READING] WERT-MORGENS:WERT-ABENDS</strong> / 'Sensorname[:brightness [400:800]]' Angaben zum Helligkeitssensor mit (Readingname, optional) für die Beschattung und dem Fahren der Rollladen nach brightness und den optionalen Brightnesswerten für Sonnenauf- und Sonnenuntergang. (default: none)</li>
 | 
					            <li><strong>ASC_BrightnessSensor - DEVICE[:READING] WERT-MORGENS:WERT-ABENDS</strong> / 'Sensorname[:brightness [400:800]]' Angaben zum Helligkeitssensor mit (Readingname, optional) für die Beschattung und dem Fahren der Rollladen nach brightness und den optionalen Brightnesswerten für Sonnenauf- und Sonnenuntergang. (default: none)</li>
 | 
				
			||||||
            <a id="AutoShuttersControl-attr-ASC_Down"></a>
 | 
					            <a id="AutoShuttersControl-attr-ASC_Down"></a>
 | 
				
			||||||
@@ -1465,7 +1456,7 @@ __END__
 | 
				
			|||||||
  ],
 | 
					  ],
 | 
				
			||||||
  "release_status": "stable",
 | 
					  "release_status": "stable",
 | 
				
			||||||
  "license": "GPL_2",
 | 
					  "license": "GPL_2",
 | 
				
			||||||
  "version": "v0.10.19",
 | 
					  "version": "v0.10.20",
 | 
				
			||||||
  "author": [
 | 
					  "author": [
 | 
				
			||||||
    "Marko Oldenburg <fhemdevelopment@cooltux.net>"
 | 
					    "Marko Oldenburg <fhemdevelopment@cooltux.net>"
 | 
				
			||||||
  ],
 | 
					  ],
 | 
				
			||||||
@@ -1479,7 +1470,7 @@ __END__
 | 
				
			|||||||
    "runtime": {
 | 
					    "runtime": {
 | 
				
			||||||
      "requires": {
 | 
					      "requires": {
 | 
				
			||||||
        "FHEM": 5.00918799,
 | 
					        "FHEM": 5.00918799,
 | 
				
			||||||
        "perl": 5.016, 
 | 
					        "perl": 5.023, 
 | 
				
			||||||
        "Meta": 0,
 | 
					        "Meta": 0,
 | 
				
			||||||
        "JSON": 0,
 | 
					        "JSON": 0,
 | 
				
			||||||
        "Date::Parse": 0
 | 
					        "Date::Parse": 0
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,16 +1,16 @@
 | 
				
			|||||||
UPD 2021-11-14_13:42:55 115685 FHEM/73_AutoShuttersControl.pm
 | 
					UPD 2022-01-01_09:39:12 115601 FHEM/73_AutoShuttersControl.pm
 | 
				
			||||||
UPD 2021-11-14_13:40:41 75264 lib/FHEM/Automation/ShuttersControl.pm
 | 
					UPD 2022-01-01_09:25:20 75212 lib/FHEM/Automation/ShuttersControl.pm
 | 
				
			||||||
UPD 2021-10-09_07:12:54 2657 lib/FHEM/Automation/ShuttersControl/Dev.pm
 | 
					UPD 2022-01-01_09:25:20 2693 lib/FHEM/Automation/ShuttersControl/Dev.pm
 | 
				
			||||||
UPD 2021-10-09_07:12:54 2494 lib/FHEM/Automation/ShuttersControl/Roommate.pm
 | 
					UPD 2022-01-01_09:25:20 2405 lib/FHEM/Automation/ShuttersControl/Roommate.pm
 | 
				
			||||||
UPD 2021-10-24_07:33:53 31900 lib/FHEM/Automation/ShuttersControl/Shutters.pm
 | 
					UPD 2022-01-01_09:25:20 32020 lib/FHEM/Automation/ShuttersControl/Shutters.pm
 | 
				
			||||||
UPD 2021-10-09_07:12:54 25333 lib/FHEM/Automation/ShuttersControl/Shading.pm
 | 
					UPD 2022-01-01_09:25:20 25426 lib/FHEM/Automation/ShuttersControl/Shading.pm
 | 
				
			||||||
UPD 2021-11-10_20:11:14 110681 lib/FHEM/Automation/ShuttersControl/EventProcessingFunctions.pm
 | 
					UPD 2022-01-01_09:25:20 112138 lib/FHEM/Automation/ShuttersControl/EventProcessingFunctions.pm
 | 
				
			||||||
UPD 2021-11-14_13:37:27 40094 lib/FHEM/Automation/ShuttersControl/Helper.pm
 | 
					UPD 2022-01-01_09:25:20 40296 lib/FHEM/Automation/ShuttersControl/Helper.pm
 | 
				
			||||||
UPD 2021-10-09_07:12:54 2173 lib/FHEM/Automation/ShuttersControl/Window.pm
 | 
					UPD 2022-01-01_09:25:20 2211 lib/FHEM/Automation/ShuttersControl/Window.pm
 | 
				
			||||||
UPD 2021-10-09_07:12:54 11739 lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm
 | 
					UPD 2022-01-01_09:25:20 11706 lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm
 | 
				
			||||||
UPD 2021-10-09_07:12:54 7249 lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm
 | 
					UPD 2022-01-01_09:25:20 7265 lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm
 | 
				
			||||||
UPD 2021-10-27_08:50:46 52649 lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm
 | 
					UPD 2022-01-01_09:25:20 52751 lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm
 | 
				
			||||||
UPD 2021-10-09_07:12:54 2901 lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm
 | 
					UPD 2022-01-01_09:25:20 2799 lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm
 | 
				
			||||||
UPD 2021-10-09_07:12:54 3978 lib/FHEM/Automation/ShuttersControl/Window/Attr.pm
 | 
					UPD 2022-01-01_09:25:20 3887 lib/FHEM/Automation/ShuttersControl/Window/Attr.pm
 | 
				
			||||||
UPD 2021-10-09_07:12:54 2286 lib/FHEM/Automation/ShuttersControl/Window/Readings.pm
 | 
					UPD 2022-01-01_09:25:20 2200 lib/FHEM/Automation/ShuttersControl/Window/Readings.pm
 | 
				
			||||||
UPD 2021-10-27_08:50:46 6716 lib/FHEM/Automation/ShuttersControl/Rainprotection.pm
 | 
					UPD 2022-01-01_09:25:20 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
 | 
					#  All rights reserved
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
#   Special thanks goes to:
 | 
					#   Special thanks goes to:
 | 
				
			||||||
@@ -76,7 +76,8 @@ use Date::Parse;
 | 
				
			|||||||
use FHEM::Automation::ShuttersControl::Shutters;
 | 
					use FHEM::Automation::ShuttersControl::Shutters;
 | 
				
			||||||
use FHEM::Automation::ShuttersControl::Dev;
 | 
					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::EventProcessingFunctions qw (:ALL);
 | 
				
			||||||
use FHEM::Automation::ShuttersControl::Helper qw (:ALL);
 | 
					use FHEM::Automation::ShuttersControl::Helper qw (:ALL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -86,27 +87,20 @@ eval {
 | 
				
			|||||||
    require JSON::MaybeXS;
 | 
					    require JSON::MaybeXS;
 | 
				
			||||||
    import JSON::MaybeXS qw( decode_json encode_json );
 | 
					    import JSON::MaybeXS qw( decode_json encode_json );
 | 
				
			||||||
    1;
 | 
					    1;
 | 
				
			||||||
};
 | 
					} or do {
 | 
				
			||||||
 | 
					 | 
				
			||||||
if ($@) {
 | 
					 | 
				
			||||||
    $@ = undef;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # try to use JSON wrapper
 | 
					    # try to use JSON wrapper
 | 
				
			||||||
    #   for chance of better performance
 | 
					    #   for chance of better performance
 | 
				
			||||||
    eval {
 | 
					    eval {
 | 
				
			||||||
 | 
					 | 
				
			||||||
        # JSON preference order
 | 
					        # JSON preference order
 | 
				
			||||||
        local $ENV{PERL_JSON_BACKEND} =
 | 
					        local $ENV{PERL_JSON_BACKEND} =
 | 
				
			||||||
          'Cpanel::JSON::XS,JSON::XS,JSON::PP,JSON::backportPP'
 | 
					          'Cpanel::JSON::XS,JSON::XS,JSON::PP,JSON::backportPP'
 | 
				
			||||||
          if ( !defined( $ENV{PERL_JSON_BACKEND} ) );
 | 
					          unless ( defined( $ENV{PERL_JSON_BACKEND} ) );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        require JSON;
 | 
					        require JSON;
 | 
				
			||||||
        import JSON qw( decode_json encode_json );
 | 
					        import JSON qw( decode_json encode_json );
 | 
				
			||||||
        1;
 | 
					        1;
 | 
				
			||||||
    };
 | 
					    } or do {
 | 
				
			||||||
 | 
					 | 
				
			||||||
    if ($@) {
 | 
					 | 
				
			||||||
        $@ = undef;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # In rare cases, Cpanel::JSON::XS may
 | 
					        # In rare cases, Cpanel::JSON::XS may
 | 
				
			||||||
        #   be installed but JSON|JSON::MaybeXS not ...
 | 
					        #   be installed but JSON|JSON::MaybeXS not ...
 | 
				
			||||||
@@ -114,10 +108,7 @@ if ($@) {
 | 
				
			|||||||
            require Cpanel::JSON::XS;
 | 
					            require Cpanel::JSON::XS;
 | 
				
			||||||
            import Cpanel::JSON::XS qw(decode_json encode_json);
 | 
					            import Cpanel::JSON::XS qw(decode_json encode_json);
 | 
				
			||||||
            1;
 | 
					            1;
 | 
				
			||||||
        };
 | 
					        } or do {
 | 
				
			||||||
 | 
					 | 
				
			||||||
        if ($@) {
 | 
					 | 
				
			||||||
            $@ = undef;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # In rare cases, JSON::XS may
 | 
					            # In rare cases, JSON::XS may
 | 
				
			||||||
            #   be installed but JSON not ...
 | 
					            #   be installed but JSON not ...
 | 
				
			||||||
@@ -125,10 +116,7 @@ if ($@) {
 | 
				
			|||||||
                require JSON::XS;
 | 
					                require JSON::XS;
 | 
				
			||||||
                import JSON::XS qw(decode_json encode_json);
 | 
					                import JSON::XS qw(decode_json encode_json);
 | 
				
			||||||
                1;
 | 
					                1;
 | 
				
			||||||
            };
 | 
					            } or do {
 | 
				
			||||||
 | 
					 | 
				
			||||||
            if ($@) {
 | 
					 | 
				
			||||||
                $@ = undef;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                # Fallback to built-in JSON which SHOULD
 | 
					                # Fallback to built-in JSON which SHOULD
 | 
				
			||||||
                #   be available since 5.014 ...
 | 
					                #   be available since 5.014 ...
 | 
				
			||||||
@@ -136,20 +124,17 @@ if ($@) {
 | 
				
			|||||||
                    require JSON::PP;
 | 
					                    require JSON::PP;
 | 
				
			||||||
                    import JSON::PP qw(decode_json encode_json);
 | 
					                    import JSON::PP qw(decode_json encode_json);
 | 
				
			||||||
                    1;
 | 
					                    1;
 | 
				
			||||||
                };
 | 
					                } or do {
 | 
				
			||||||
 | 
					 | 
				
			||||||
                if ($@) {
 | 
					 | 
				
			||||||
                    $@ = undef;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    # Fallback to JSON::backportPP in really rare cases
 | 
					                    # Fallback to JSON::backportPP in really rare cases
 | 
				
			||||||
                    require JSON::backportPP;
 | 
					                    require JSON::backportPP;
 | 
				
			||||||
                    import JSON::backportPP qw(decode_json encode_json);
 | 
					                    import JSON::backportPP qw(decode_json encode_json);
 | 
				
			||||||
                    1;
 | 
					                    1;
 | 
				
			||||||
                }
 | 
					                };
 | 
				
			||||||
            }
 | 
					            };
 | 
				
			||||||
        }
 | 
					        };
 | 
				
			||||||
    }
 | 
					    };
 | 
				
			||||||
}
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Import der FHEM Funktionen
 | 
					## Import der FHEM Funktionen
 | 
				
			||||||
#-- Run before package compilation
 | 
					#-- Run before package compilation
 | 
				
			||||||
@@ -227,8 +212,8 @@ our %userAttrList = (
 | 
				
			|||||||
    'ASC_LockOut:soft,hard,off'                  => '-',
 | 
					    'ASC_LockOut:soft,hard,off'                  => '-',
 | 
				
			||||||
    'ASC_LockOut_Cmd:inhibit,blocked,protection' => '-',
 | 
					    'ASC_LockOut_Cmd:inhibit,blocked,protection' => '-',
 | 
				
			||||||
    'ASC_BlockingTime_afterManual'               => '-',
 | 
					    'ASC_BlockingTime_afterManual'               => '-',
 | 
				
			||||||
    'ASC_BlockingTime_beforeNightClose'           => '-',
 | 
					    'ASC_BlockingTime_beforeNightClose'          => '-',
 | 
				
			||||||
    'ASC_BlockingTime_beforeDayOpen'              => '-',
 | 
					    'ASC_BlockingTime_beforeDayOpen'             => '-',
 | 
				
			||||||
    'ASC_BrightnessSensor'                       => '-',
 | 
					    'ASC_BrightnessSensor'                       => '-',
 | 
				
			||||||
    'ASC_Shading_Pos:10,20,30,40,50,60,70,80,90,100'       => [ '', 80, 20 ],
 | 
					    'ASC_Shading_Pos:10,20,30,40,50,60,70,80,90,100'       => [ '', 80, 20 ],
 | 
				
			||||||
    'ASC_Shading_Mode:absent,always,off,home'              => '-',
 | 
					    'ASC_Shading_Mode:absent,always,off,home'              => '-',
 | 
				
			||||||
@@ -366,7 +351,7 @@ sub Define {
 | 
				
			|||||||
        $name . ' devStateIcon { ShuttersControl_DevStateIcon($name) }' )
 | 
					        $name . ' devStateIcon { ShuttersControl_DevStateIcon($name) }' )
 | 
				
			||||||
      if ( AttrVal( $name, 'devStateIcon', 'none' ) eq 'none' );
 | 
					      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" );
 | 
					    Log3( $name, 3, "AutoShuttersControl ($name) - defined" );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -572,7 +557,7 @@ sub Set {
 | 
				
			|||||||
    elsif ( lc $cmd eq 'controlshading' ) {
 | 
					    elsif ( lc $cmd eq 'controlshading' ) {
 | 
				
			||||||
        return "usage: $cmd" if ( scalar( @{$aArg} ) > 1 );
 | 
					        return "usage: $cmd" if ( scalar( @{$aArg} ) > 1 );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        my $response = CheckASC_ConditionsForShadingFn($hash,$aArg->[0]);
 | 
					        my $response = CheckASC_ConditionsForShadingFn( $hash, $aArg->[0] );
 | 
				
			||||||
        readingsSingleUpdate(
 | 
					        readingsSingleUpdate(
 | 
				
			||||||
            $hash, $cmd,
 | 
					            $hash, $cmd,
 | 
				
			||||||
            (
 | 
					            (
 | 
				
			||||||
@@ -703,6 +688,7 @@ sub ShuttersDeviceScan {
 | 
				
			|||||||
            $shutters->setAttrUpdateChanges( 'ASC_ShuttersPlace',
 | 
					            $shutters->setAttrUpdateChanges( 'ASC_ShuttersPlace',
 | 
				
			||||||
                AttrVal( $shuttersDev, 'ASC_ShuttersPlace', 'none' ) );
 | 
					                AttrVal( $shuttersDev, 'ASC_ShuttersPlace', 'none' ) );
 | 
				
			||||||
            delFromDevAttrList( $shuttersDev, 'ASC_ShuttersPlace' );
 | 
					            delFromDevAttrList( $shuttersDev, 'ASC_ShuttersPlace' );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#             $shutters->setAttrUpdateChanges( 'ASC_Down',
 | 
					#             $shutters->setAttrUpdateChanges( 'ASC_Down',
 | 
				
			||||||
#                 AttrVal( $shuttersDev, 'ASC_Down', 'none' ) );
 | 
					#                 AttrVal( $shuttersDev, 'ASC_Down', 'none' ) );
 | 
				
			||||||
#             delFromDevAttrList( $shuttersDev, 'ASC_Down' );
 | 
					#             delFromDevAttrList( $shuttersDev, 'ASC_Down' );
 | 
				
			||||||
@@ -775,7 +761,8 @@ sub WriteReadingsShuttersList {
 | 
				
			|||||||
        readingsBulkUpdate(
 | 
					        readingsBulkUpdate(
 | 
				
			||||||
            $hash,
 | 
					            $hash,
 | 
				
			||||||
            'room_'
 | 
					            'room_'
 | 
				
			||||||
              . ::makeReadingName( AttrVal( $shuttersDev, 'room', 'unsorted' ) ),
 | 
					              . ::makeReadingName(
 | 
				
			||||||
 | 
					                AttrVal( $shuttersDev, 'room', 'unsorted' ) ),
 | 
				
			||||||
            ReadingsVal(
 | 
					            ReadingsVal(
 | 
				
			||||||
                $name,
 | 
					                $name,
 | 
				
			||||||
                'room_'
 | 
					                'room_'
 | 
				
			||||||
@@ -801,7 +788,8 @@ sub WriteReadingsShuttersList {
 | 
				
			|||||||
        readingsBulkUpdate(
 | 
					        readingsBulkUpdate(
 | 
				
			||||||
            $hash,
 | 
					            $hash,
 | 
				
			||||||
            'room_'
 | 
					            'room_'
 | 
				
			||||||
              . ::makeReadingName( AttrVal( $shuttersDev, 'room', 'unsorted' ) ),
 | 
					              . ::makeReadingName(
 | 
				
			||||||
 | 
					                AttrVal( $shuttersDev, 'room', 'unsorted' ) ),
 | 
				
			||||||
            $shuttersDev
 | 
					            $shuttersDev
 | 
				
			||||||
          )
 | 
					          )
 | 
				
			||||||
          if (
 | 
					          if (
 | 
				
			||||||
@@ -1014,11 +1002,13 @@ sub ShuttersCommandSet {
 | 
				
			|||||||
                    || $shutters->getLockOut eq 'hard' )
 | 
					                    || $shutters->getLockOut eq 'hard' )
 | 
				
			||||||
                && !$shutters->getQueryShuttersPos($posValue)
 | 
					                && !$shutters->getQueryShuttersPos($posValue)
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            || (   CheckIfShuttersWindowRecOpen($shuttersDev) == 2
 | 
					            || (
 | 
				
			||||||
 | 
					                   CheckIfShuttersWindowRecOpen($shuttersDev) == 2
 | 
				
			||||||
                && $shutters->getShuttersPlace eq 'terrace'
 | 
					                && $shutters->getShuttersPlace eq 'terrace'
 | 
				
			||||||
                && !$shutters->getQueryShuttersPos($posValue)
 | 
					                && !$shutters->getQueryShuttersPos($posValue)
 | 
				
			||||||
                && (   $shutters->getLockOut eq 'soft'
 | 
					                && (   $shutters->getLockOut eq 'soft'
 | 
				
			||||||
                    || $shutters->getLockOut eq 'hard' ) )
 | 
					                    || $shutters->getLockOut eq 'hard' )
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
            || (   $shutters->getRainProtectionStatus eq 'protected'
 | 
					            || (   $shutters->getRainProtectionStatus eq 'protected'
 | 
				
			||||||
                || $shutters->getWindProtectionStatus eq 'protected' )
 | 
					                || $shutters->getWindProtectionStatus eq 'protected' )
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
@@ -1068,7 +1058,7 @@ sub CreateSunRiseSetShuttersTimer {
 | 
				
			|||||||
    return if ( IsDisabled($name) );
 | 
					    return if ( IsDisabled($name) );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    my $shuttersSunriseUnixtime = ShuttersSunrise( $shuttersDev, 'unix' ) + 1;
 | 
					    my $shuttersSunriseUnixtime = ShuttersSunrise( $shuttersDev, 'unix' ) + 1;
 | 
				
			||||||
    my $shuttersSunsetUnixtime = ShuttersSunset( $shuttersDev, 'unix' ) + 1;
 | 
					    my $shuttersSunsetUnixtime  = ShuttersSunset( $shuttersDev, 'unix' ) + 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $shutters->setSunriseUnixTime($shuttersSunriseUnixtime);
 | 
					    $shutters->setSunriseUnixTime($shuttersSunriseUnixtime);
 | 
				
			||||||
    $shutters->setSunsetUnixTime($shuttersSunsetUnixtime);
 | 
					    $shutters->setSunsetUnixTime($shuttersSunsetUnixtime);
 | 
				
			||||||
@@ -1200,8 +1190,11 @@ sub RenewSunRiseSetShuttersTimer {
 | 
				
			|||||||
            ) == 0
 | 
					            ) == 0
 | 
				
			||||||
          )
 | 
					          )
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            $attr{$shuttersDev}{'ASC_ShuttersPlace'} = $shutters->getAttrUpdateChanges('ASC_ShuttersPlace')
 | 
					            $attr{$shuttersDev}{'ASC_ShuttersPlace'} =
 | 
				
			||||||
              if ( $shutters->getAttrUpdateChanges('ASC_ShuttersPlace') ne 'none' );
 | 
					              $shutters->getAttrUpdateChanges('ASC_ShuttersPlace')
 | 
				
			||||||
 | 
					              if ( $shutters->getAttrUpdateChanges('ASC_ShuttersPlace') ne
 | 
				
			||||||
 | 
					                'none' );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#             $attr{$shuttersDev}{'ASC_Down'} =
 | 
					#             $attr{$shuttersDev}{'ASC_Down'} =
 | 
				
			||||||
#               $shutters->getAttrUpdateChanges('ASC_Down')
 | 
					#               $shutters->getAttrUpdateChanges('ASC_Down')
 | 
				
			||||||
#               if ( $shutters->getAttrUpdateChanges('ASC_Down') ne 'none' );
 | 
					#               if ( $shutters->getAttrUpdateChanges('ASC_Down') ne 'none' );
 | 
				
			||||||
@@ -1228,12 +1221,16 @@ sub RenewSunRiseSetShuttersTimer {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        $attr{$shuttersDev}{ASC_BlockingTime_beforeNightClose} =
 | 
					        $attr{$shuttersDev}{ASC_BlockingTime_beforeNightClose} =
 | 
				
			||||||
          AttrVal( $shuttersDev, 'ASC_BlockingTime_beforNightClose', 'none' )
 | 
					          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' );
 | 
					        delFromDevAttrList( $shuttersDev, 'ASC_BlockingTime_beforNightClose' );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $attr{$shuttersDev}{ASC_BlockingTime_beforeDayOpen} =
 | 
					        $attr{$shuttersDev}{ASC_BlockingTime_beforeDayOpen} =
 | 
				
			||||||
          AttrVal( $shuttersDev, 'ASC_BlockingTime_beforDayOpen', 'none' )
 | 
					          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' );
 | 
					        delFromDevAttrList( $shuttersDev, 'ASC_BlockingTime_beforDayOpen' );
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
#         $attr{$shuttersDev}{ASC_Shading_StateChange_SunnyCloudy} =
 | 
					#         $attr{$shuttersDev}{ASC_Shading_StateChange_SunnyCloudy} =
 | 
				
			||||||
@@ -1708,23 +1705,31 @@ sub _DetermineSlatCmd {
 | 
				
			|||||||
    my $value    = shift;
 | 
					    my $value    = shift;
 | 
				
			||||||
    my $posValue = shift;
 | 
					    my $posValue = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return $posValue    == $shutters->getShadingPos
 | 
					    return $posValue == $shutters->getShadingPos
 | 
				
			||||||
            && $shutters->getShadingPositionAssignment      ne 'none'   ? $shutters->getShadingPositionAssignment
 | 
					      && $shutters->getShadingPositionAssignment ne 'none'
 | 
				
			||||||
        : $posValue     == $shutters->getVentilatePos
 | 
					      ? $shutters->getShadingPositionAssignment
 | 
				
			||||||
            && $shutters->getVentilatePositionAssignment    ne 'none'   ? $shutters->getVentilatePositionAssignment
 | 
					      : $posValue == $shutters->getVentilatePos
 | 
				
			||||||
        : $posValue     == $shutters->getOpenPos
 | 
					      && $shutters->getVentilatePositionAssignment ne 'none'
 | 
				
			||||||
            && $shutters->getOpenPositionAssignment         ne 'none'   ? $shutters->getOpenPositionAssignment
 | 
					      ? $shutters->getVentilatePositionAssignment
 | 
				
			||||||
        : $posValue     == $shutters->getClosedPos
 | 
					      : $posValue == $shutters->getOpenPos
 | 
				
			||||||
            && $shutters->getClosedPositionAssignment       ne 'none'   ? $shutters->getClosedPositionAssignment
 | 
					      && $shutters->getOpenPositionAssignment ne 'none'
 | 
				
			||||||
        : $posValue     == $shutters->getSleepPos
 | 
					      ? $shutters->getOpenPositionAssignment
 | 
				
			||||||
            && $shutters->getSleepPositionAssignment        ne 'none'   ? $shutters->getSleepPositionAssignment
 | 
					      : $posValue == $shutters->getClosedPos
 | 
				
			||||||
        : $posValue     == $shutters->getComfortOpenPos
 | 
					      && $shutters->getClosedPositionAssignment ne 'none'
 | 
				
			||||||
            && $shutters->getComfortOpenPositionAssignment  ne 'none'   ? $shutters->getComfortOpenPositionAssignment
 | 
					      ? $shutters->getClosedPositionAssignment
 | 
				
			||||||
        : $posValue     == $shutters->getPrivacyUpPos
 | 
					      : $posValue == $shutters->getSleepPos
 | 
				
			||||||
            && $shutters->getPrivacyUpPositionAssignment    ne 'none'   ? $shutters->getPrivacyUpPositionAssignment
 | 
					      && $shutters->getSleepPositionAssignment ne 'none'
 | 
				
			||||||
        : $posValue     == $shutters->getPrivacyDownPos
 | 
					      ? $shutters->getSleepPositionAssignment
 | 
				
			||||||
            && $shutters->getPrivacyDownPositionAssignment  ne 'none'   ? $shutters->getPrivacyDownPositionAssignment
 | 
					      : $posValue == $shutters->getComfortOpenPos
 | 
				
			||||||
        : $value;
 | 
					      && $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 {
 | 
					sub _SetCmdFn {
 | 
				
			||||||
@@ -1809,12 +1814,12 @@ sub _SetCmdFn {
 | 
				
			|||||||
            $driveCommand = _DetermineSlatCmd( $driveCommand, $posValue );
 | 
					            $driveCommand = _DetermineSlatCmd( $driveCommand, $posValue );
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        elsif ($shutters->getShadingPositionAssignment =~ m{\A\d{1,3}\z}xms
 | 
					        elsif ($shutters->getShadingPositionAssignment =~ m{\A\d{1,3}\z}xms
 | 
				
			||||||
            || $shutters->getOpenPositionAssignment =~ 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->getClosedPositionAssignment      =~ m{\A\d{1,3}\z}xms
 | 
				
			||||||
            || $shutters->getPrivacyUpPositionAssignment =~ 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->getPrivacyDownPositionAssignment =~ m{\A\d{1,3}\z}xms
 | 
				
			||||||
            || $shutters->getSleepPositionAssignment =~ 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->getVentilatePositionAssignment   =~ m{\A\d{1,3}\z}xms
 | 
				
			||||||
            || $shutters->getComfortOpenPositionAssignment =~
 | 
					            || $shutters->getComfortOpenPositionAssignment =~
 | 
				
			||||||
            m{\A\d{1,3}\z}xms )
 | 
					            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
 | 
					    if ( $commandTemplate ne 'none' )
 | 
				
			||||||
        # Nutzervariablen setzen
 | 
					    { # Patch von Beta-User Forum https://forum.fhem.de/index.php/topic,123659.0.html
 | 
				
			||||||
 | 
					            # Nutzervariablen setzen
 | 
				
			||||||
        my %specials = (
 | 
					        my %specials = (
 | 
				
			||||||
             '$name'        => $shuttersDev,
 | 
					            '$name'    => $shuttersDev,
 | 
				
			||||||
             '$pos'       => $posValue,
 | 
					            '$pos'     => $posValue,
 | 
				
			||||||
             '$slatPos'   => $slatPos,
 | 
					            '$slatPos' => $slatPos,
 | 
				
			||||||
             '$cause'      => $shutters->getLastDrive
 | 
					            '$cause'   => $shutters->getLastDrive
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $commandTemplate  = ::EvalSpecials($commandTemplate, %specials);
 | 
					        $commandTemplate = ::EvalSpecials( $commandTemplate, %specials );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # CMD ausführen
 | 
					        # CMD ausführen
 | 
				
			||||||
        ::AnalyzeCommandChain( $h, $commandTemplate );
 | 
					        ::AnalyzeCommandChain( $h, $commandTemplate );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else {
 | 
					    else {
 | 
				
			||||||
        CommandSet( undef,
 | 
					        CommandSet( undef,
 | 
				
			||||||
                $shuttersDev
 | 
					                $shuttersDev
 | 
				
			||||||
            . ':FILTER='
 | 
					              . ':FILTER='
 | 
				
			||||||
            . $shutters->getPosCmd . '!='
 | 
					              . $shutters->getPosCmd . '!='
 | 
				
			||||||
            . $posValue . ' '
 | 
					              . $posValue . ' '
 | 
				
			||||||
            . $driveCommand );
 | 
					              . $driveCommand );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        InternalTimer(
 | 
					        InternalTimer(
 | 
				
			||||||
            gettimeofday() + 3,
 | 
					            gettimeofday() + 3,
 | 
				
			||||||
@@ -1849,18 +1856,18 @@ sub _SetCmdFn {
 | 
				
			|||||||
                CommandSet(
 | 
					                CommandSet(
 | 
				
			||||||
                    undef,
 | 
					                    undef,
 | 
				
			||||||
                    (
 | 
					                    (
 | 
				
			||||||
                        $shutters->getSlatDevice ne 'none'
 | 
					                          $shutters->getSlatDevice ne 'none'
 | 
				
			||||||
                        ? $shutters->getSlatDevice
 | 
					                        ? $shutters->getSlatDevice
 | 
				
			||||||
                        : $shuttersDev
 | 
					                        : $shuttersDev
 | 
				
			||||||
                    )
 | 
					                      )
 | 
				
			||||||
                    . ' '
 | 
					                      . ' '
 | 
				
			||||||
                    . $shutters->getSlatPosCmd . ' '
 | 
					                      . $shutters->getSlatPosCmd . ' '
 | 
				
			||||||
                    . $slatPos
 | 
					                      . $slatPos
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            $shuttersDev
 | 
					            $shuttersDev
 | 
				
			||||||
        )
 | 
					          )
 | 
				
			||||||
        if ( $slatPos > -1
 | 
					          if ( $slatPos > -1
 | 
				
			||||||
            && $shutters->getSlatPosCmd ne 'none' );
 | 
					            && $shutters->getSlatPosCmd ne 'none' );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -1888,7 +1895,7 @@ sub ASC_Debug {
 | 
				
			|||||||
    return
 | 
					    return
 | 
				
			||||||
      if ( !AttrVal( $ascDev->getName, 'ASC_debug', 0 ) );
 | 
					      if ( !AttrVal( $ascDev->getName, 'ASC_debug', 0 ) );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    my $debugMsg = shift;
 | 
					    my $debugMsg       = shift;
 | 
				
			||||||
    my $debugTimestamp = strftime( "%Y.%m.%d %T", localtime(time) );
 | 
					    my $debugTimestamp = strftime( "%Y.%m.%d %T", localtime(time) );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    print(
 | 
					    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
 | 
					#  All rights reserved
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
#   Special thanks goes to:
 | 
					#   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
 | 
					#  All rights reserved
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
#   Special thanks goes to:
 | 
					#   Special thanks goes to:
 | 
				
			||||||
@@ -44,23 +44,12 @@ use strict;
 | 
				
			|||||||
use warnings;
 | 
					use warnings;
 | 
				
			||||||
use utf8;
 | 
					use utf8;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use GPUtils qw(GP_Import);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Import der FHEM Funktionen
 | 
					 | 
				
			||||||
BEGIN {
 | 
					 | 
				
			||||||
    GP_Import(
 | 
					 | 
				
			||||||
        qw(
 | 
					 | 
				
			||||||
          AttrVal
 | 
					 | 
				
			||||||
          gettimeofday)
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
sub getShuttersOffset {
 | 
					sub getShuttersOffset {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    my $name = $self->{name};
 | 
					    my $name = $self->{name};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $name, 'ASC_shuttersDriveDelay', -1 );
 | 
					    return ::AttrVal( $name, 'ASC_shuttersDriveDelay', -1 );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub getBrightnessMinVal {
 | 
					sub getBrightnessMinVal {
 | 
				
			||||||
@@ -70,7 +59,7 @@ sub getBrightnessMinVal {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    return $self->{ASC_brightness}->{triggermin}
 | 
					    return $self->{ASC_brightness}->{triggermin}
 | 
				
			||||||
      if ( exists( $self->{ASC_brightness}->{LASTGETTIME} )
 | 
					      if ( exists( $self->{ASC_brightness}->{LASTGETTIME} )
 | 
				
			||||||
        && ( gettimeofday() - $self->{ASC_brightness}->{LASTGETTIME} ) < 2 );
 | 
					        && ( ::gettimeofday() - $self->{ASC_brightness}->{LASTGETTIME} ) < 2 );
 | 
				
			||||||
    $FHEM::Automation::ShuttersControl::ascDev->getBrightnessMaxVal;
 | 
					    $FHEM::Automation::ShuttersControl::ascDev->getBrightnessMaxVal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return $self->{ASC_brightness}->{triggermin};
 | 
					    return $self->{ASC_brightness}->{triggermin};
 | 
				
			||||||
@@ -83,8 +72,8 @@ sub getBrightnessMaxVal {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    return $self->{ASC_brightness}->{triggermax}
 | 
					    return $self->{ASC_brightness}->{triggermax}
 | 
				
			||||||
      if ( exists( $self->{ASC_brightness}->{LASTGETTIME} )
 | 
					      if ( exists( $self->{ASC_brightness}->{LASTGETTIME} )
 | 
				
			||||||
        && ( gettimeofday() - $self->{ASC_brightness}->{LASTGETTIME} ) < 2 );
 | 
					        && ( ::gettimeofday() - $self->{ASC_brightness}->{LASTGETTIME} ) < 2 );
 | 
				
			||||||
    $self->{ASC_brightness}->{LASTGETTIME} = int( gettimeofday() );
 | 
					    $self->{ASC_brightness}->{LASTGETTIME} = int( ::gettimeofday() );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    my ( $triggermax, $triggermin ) =
 | 
					    my ( $triggermax, $triggermin ) =
 | 
				
			||||||
      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $name,
 | 
					      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $name,
 | 
				
			||||||
@@ -104,7 +93,7 @@ sub _getTwilightDevice {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    my $name = $self->{name};
 | 
					    my $name = $self->{name};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $name, 'ASC_twilightDevice', 'none' );
 | 
					    return ::AttrVal( $name, 'ASC_twilightDevice', 'none' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub getAutoAstroModeEvening {
 | 
					sub getAutoAstroModeEvening {
 | 
				
			||||||
@@ -112,7 +101,7 @@ sub getAutoAstroModeEvening {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    my $name = $self->{name};
 | 
					    my $name = $self->{name};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $name, 'ASC_autoAstroModeEvening', 'REAL' );
 | 
					    return ::AttrVal( $name, 'ASC_autoAstroModeEvening', 'REAL' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub getAutoAstroModeEveningHorizon {
 | 
					sub getAutoAstroModeEveningHorizon {
 | 
				
			||||||
@@ -120,7 +109,7 @@ sub getAutoAstroModeEveningHorizon {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    my $name = $self->{name};
 | 
					    my $name = $self->{name};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $name, 'ASC_autoAstroModeEveningHorizon', 0 );
 | 
					    return ::AttrVal( $name, 'ASC_autoAstroModeEveningHorizon', 0 );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub getAutoAstroModeMorning {
 | 
					sub getAutoAstroModeMorning {
 | 
				
			||||||
@@ -128,7 +117,7 @@ sub getAutoAstroModeMorning {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    my $name = $self->{name};
 | 
					    my $name = $self->{name};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $name, 'ASC_autoAstroModeMorning', 'REAL' );
 | 
					    return ::AttrVal( $name, 'ASC_autoAstroModeMorning', 'REAL' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub getAutoAstroModeMorningHorizon {
 | 
					sub getAutoAstroModeMorningHorizon {
 | 
				
			||||||
@@ -136,7 +125,7 @@ sub getAutoAstroModeMorningHorizon {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    my $name = $self->{name};
 | 
					    my $name = $self->{name};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $name, 'ASC_autoAstroModeMorningHorizon', 0 );
 | 
					    return ::AttrVal( $name, 'ASC_autoAstroModeMorningHorizon', 0 );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub getAutoShuttersControlMorning {
 | 
					sub getAutoShuttersControlMorning {
 | 
				
			||||||
@@ -144,7 +133,7 @@ sub getAutoShuttersControlMorning {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    my $name = $self->{name};
 | 
					    my $name = $self->{name};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $name, 'ASC_autoShuttersControlMorning', 'on' );
 | 
					    return ::AttrVal( $name, 'ASC_autoShuttersControlMorning', 'on' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub getAutoShuttersControlEvening {
 | 
					sub getAutoShuttersControlEvening {
 | 
				
			||||||
@@ -152,7 +141,7 @@ sub getAutoShuttersControlEvening {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    my $name = $self->{name};
 | 
					    my $name = $self->{name};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $name, 'ASC_autoShuttersControlEvening', 'on' );
 | 
					    return ::AttrVal( $name, 'ASC_autoShuttersControlEvening', 'on' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub getAutoShuttersControlComfort {
 | 
					sub getAutoShuttersControlComfort {
 | 
				
			||||||
@@ -160,7 +149,7 @@ sub getAutoShuttersControlComfort {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    my $name = $self->{name};
 | 
					    my $name = $self->{name};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $name, 'ASC_autoShuttersControlComfort', 'off' );
 | 
					    return ::AttrVal( $name, 'ASC_autoShuttersControlComfort', 'off' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub getFreezeTemp {
 | 
					sub getFreezeTemp {
 | 
				
			||||||
@@ -168,7 +157,7 @@ sub getFreezeTemp {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    my $name = $self->{name};
 | 
					    my $name = $self->{name};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $name, 'ASC_freezeTemp', 3 );
 | 
					    return ::AttrVal( $name, 'ASC_freezeTemp', 3 );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub getSlatDriveCmdInverse {
 | 
					sub getSlatDriveCmdInverse {
 | 
				
			||||||
@@ -176,7 +165,7 @@ sub getSlatDriveCmdInverse {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    my $name = $self->{name};
 | 
					    my $name = $self->{name};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $name, 'ASC_slatDriveCmdInverse', 0 );
 | 
					    return ::AttrVal( $name, 'ASC_slatDriveCmdInverse', 0 );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub _getTempSensor {
 | 
					sub _getTempSensor {
 | 
				
			||||||
@@ -186,11 +175,11 @@ sub _getTempSensor {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    return $self->{ASC_tempSensor}->{device}
 | 
					    return $self->{ASC_tempSensor}->{device}
 | 
				
			||||||
      if ( exists( $self->{ASC_tempSensor}->{LASTGETTIME} )
 | 
					      if ( exists( $self->{ASC_tempSensor}->{LASTGETTIME} )
 | 
				
			||||||
        && ( gettimeofday() - $self->{ASC_tempSensor}->{LASTGETTIME} ) < 2 );
 | 
					        && ( ::gettimeofday() - $self->{ASC_tempSensor}->{LASTGETTIME} ) < 2 );
 | 
				
			||||||
    $self->{ASC_tempSensor}->{LASTGETTIME} = int( gettimeofday() );
 | 
					    $self->{ASC_tempSensor}->{LASTGETTIME} = int( ::gettimeofday() );
 | 
				
			||||||
    my ( $device, $reading ) =
 | 
					    my ( $device, $reading ) =
 | 
				
			||||||
      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $name, 'ASC_tempSensor',
 | 
					      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $name,
 | 
				
			||||||
        'none' );
 | 
					        'ASC_tempSensor', 'none' );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ## erwartetes Ergebnis
 | 
					    ## erwartetes Ergebnis
 | 
				
			||||||
    # DEVICE:READING
 | 
					    # DEVICE:READING
 | 
				
			||||||
@@ -208,7 +197,7 @@ sub getTempSensorReading {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    return $self->{ASC_tempSensor}->{reading}
 | 
					    return $self->{ASC_tempSensor}->{reading}
 | 
				
			||||||
      if ( exists( $self->{ASC_tempSensor}->{LASTGETTIME} )
 | 
					      if ( exists( $self->{ASC_tempSensor}->{LASTGETTIME} )
 | 
				
			||||||
        && ( gettimeofday() - $self->{ASC_tempSensor}->{LASTGETTIME} ) < 2 );
 | 
					        && ( ::gettimeofday() - $self->{ASC_tempSensor}->{LASTGETTIME} ) < 2 );
 | 
				
			||||||
    $FHEM::Automation::ShuttersControl::ascDev->_getTempSensor;
 | 
					    $FHEM::Automation::ShuttersControl::ascDev->_getTempSensor;
 | 
				
			||||||
    return $self->{ASC_tempSensor}->{reading};
 | 
					    return $self->{ASC_tempSensor}->{reading};
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -220,8 +209,9 @@ sub _getResidentsDev {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    return $self->{ASC_residentsDev}->{device}
 | 
					    return $self->{ASC_residentsDev}->{device}
 | 
				
			||||||
      if ( exists( $self->{ASC_residentsDev}->{LASTGETTIME} )
 | 
					      if ( exists( $self->{ASC_residentsDev}->{LASTGETTIME} )
 | 
				
			||||||
        && ( gettimeofday() - $self->{ASC_residentsDev}->{LASTGETTIME} ) < 2 );
 | 
					        && ( ::gettimeofday() - $self->{ASC_residentsDev}->{LASTGETTIME} ) <
 | 
				
			||||||
    $self->{ASC_residentsDev}->{LASTGETTIME} = int( gettimeofday() );
 | 
					        2 );
 | 
				
			||||||
 | 
					    $self->{ASC_residentsDev}->{LASTGETTIME} = int( ::gettimeofday() );
 | 
				
			||||||
    my ( $device, $reading ) =
 | 
					    my ( $device, $reading ) =
 | 
				
			||||||
      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $name,
 | 
					      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $name,
 | 
				
			||||||
        'ASC_residentsDev', 'none' );
 | 
					        'ASC_residentsDev', 'none' );
 | 
				
			||||||
@@ -240,7 +230,8 @@ sub getResidentsReading {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    return $self->{ASC_residentsDev}->{reading}
 | 
					    return $self->{ASC_residentsDev}->{reading}
 | 
				
			||||||
      if ( exists( $self->{ASC_residentsDev}->{LASTGETTIME} )
 | 
					      if ( exists( $self->{ASC_residentsDev}->{LASTGETTIME} )
 | 
				
			||||||
        && ( gettimeofday() - $self->{ASC_residentsDev}->{LASTGETTIME} ) < 2 );
 | 
					        && ( ::gettimeofday() - $self->{ASC_residentsDev}->{LASTGETTIME} ) <
 | 
				
			||||||
 | 
					        2 );
 | 
				
			||||||
    $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev;
 | 
					    $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev;
 | 
				
			||||||
    return $self->{ASC_residentsDev}->{reading};
 | 
					    return $self->{ASC_residentsDev}->{reading};
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -252,11 +243,11 @@ sub _getRainSensor {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    return $self->{ASC_rainSensor}->{device}
 | 
					    return $self->{ASC_rainSensor}->{device}
 | 
				
			||||||
      if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
 | 
					      if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
 | 
				
			||||||
        && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
 | 
					        && ( ::gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
 | 
				
			||||||
    $self->{ASC_rainSensor}->{LASTGETTIME} = int( gettimeofday() );
 | 
					    $self->{ASC_rainSensor}->{LASTGETTIME} = int( ::gettimeofday() );
 | 
				
			||||||
    my ( $device, $reading, $max, $hyst, $pos, $wait ) =
 | 
					    my ( $device, $reading, $max, $hyst, $pos, $wait ) =
 | 
				
			||||||
      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $name, 'ASC_rainSensor',
 | 
					      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $name,
 | 
				
			||||||
        'none' );
 | 
					        'ASC_rainSensor', 'none' );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ## erwartetes Ergebnis
 | 
					    ## erwartetes Ergebnis
 | 
				
			||||||
    # DEVICE:READING MAX:HYST
 | 
					    # DEVICE:READING MAX:HYST
 | 
				
			||||||
@@ -266,10 +257,10 @@ sub _getRainSensor {
 | 
				
			|||||||
    $self->{ASC_rainSensor}->{reading} =
 | 
					    $self->{ASC_rainSensor}->{reading} =
 | 
				
			||||||
      ( $reading ne 'none' ? $reading : 'rain' );
 | 
					      ( $reading ne 'none' ? $reading : 'rain' );
 | 
				
			||||||
    $self->{ASC_rainSensor}->{triggermax} = (
 | 
					    $self->{ASC_rainSensor}->{triggermax} = (
 | 
				
			||||||
         (   $max ne 'none'
 | 
					        ( $max ne 'none' && $max =~ m{\A(-?\d+(\.\d+)?)\z}xms )
 | 
				
			||||||
          && $max =~ m{\A(-?\d+(\.\d+)?)\z}xms )
 | 
					 | 
				
			||||||
        ? $max
 | 
					        ? $max
 | 
				
			||||||
        : 1000 );
 | 
					        : 1000
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $self->{ASC_rainSensor}->{triggerhyst} = (
 | 
					    $self->{ASC_rainSensor}->{triggerhyst} = (
 | 
				
			||||||
          $hyst ne 'none'
 | 
					          $hyst ne 'none'
 | 
				
			||||||
@@ -277,10 +268,11 @@ sub _getRainSensor {
 | 
				
			|||||||
        : ( $self->{ASC_rainSensor}->{triggermax} * 0 )
 | 
					        : ( $self->{ASC_rainSensor}->{triggermax} * 0 )
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $self->{ASC_rainSensor}->{shuttersClosedPos} =
 | 
					    $self->{ASC_rainSensor}->{shuttersClosedPos} = (
 | 
				
			||||||
      (   $pos ne 'none'
 | 
					          $pos ne 'none'
 | 
				
			||||||
        ? $pos
 | 
					        ? $pos
 | 
				
			||||||
        : $FHEM::Automation::ShuttersControl::shutters->getClosedPos );
 | 
					        : $FHEM::Automation::ShuttersControl::shutters->getClosedPos
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
    $self->{ASC_rainSensor}->{waitingTime} =
 | 
					    $self->{ASC_rainSensor}->{waitingTime} =
 | 
				
			||||||
      ( $wait ne 'none' ? $wait : 0 );
 | 
					      ( $wait ne 'none' ? $wait : 0 );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -294,7 +286,7 @@ sub getRainSensorReading {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    return $self->{ASC_rainSensor}->{reading}
 | 
					    return $self->{ASC_rainSensor}->{reading}
 | 
				
			||||||
      if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
 | 
					      if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
 | 
				
			||||||
        && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
 | 
					        && ( ::gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
 | 
				
			||||||
    $FHEM::Automation::ShuttersControl::ascDev->_getRainSensor;
 | 
					    $FHEM::Automation::ShuttersControl::ascDev->_getRainSensor;
 | 
				
			||||||
    return $self->{ASC_rainSensor}->{reading};
 | 
					    return $self->{ASC_rainSensor}->{reading};
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -306,7 +298,7 @@ sub getRainTriggerMax {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    return $self->{ASC_rainSensor}->{triggermax}
 | 
					    return $self->{ASC_rainSensor}->{triggermax}
 | 
				
			||||||
      if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
 | 
					      if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
 | 
				
			||||||
        && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
 | 
					        && ( ::gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
 | 
				
			||||||
    $FHEM::Automation::ShuttersControl::ascDev->_getRainSensor;
 | 
					    $FHEM::Automation::ShuttersControl::ascDev->_getRainSensor;
 | 
				
			||||||
    return $self->{ASC_rainSensor}->{triggermax};
 | 
					    return $self->{ASC_rainSensor}->{triggermax};
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -318,7 +310,7 @@ sub getRainTriggerMin {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    return $self->{ASC_rainSensor}->{triggerhyst}
 | 
					    return $self->{ASC_rainSensor}->{triggerhyst}
 | 
				
			||||||
      if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
 | 
					      if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
 | 
				
			||||||
        && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
 | 
					        && ( ::gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
 | 
				
			||||||
    $FHEM::Automation::ShuttersControl::ascDev->_getRainSensor;
 | 
					    $FHEM::Automation::ShuttersControl::ascDev->_getRainSensor;
 | 
				
			||||||
    return $self->{ASC_rainSensor}->{triggerhyst};
 | 
					    return $self->{ASC_rainSensor}->{triggerhyst};
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -330,7 +322,7 @@ sub getRainSensorShuttersClosedPos {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    return $self->{ASC_rainSensor}->{shuttersClosedPos}
 | 
					    return $self->{ASC_rainSensor}->{shuttersClosedPos}
 | 
				
			||||||
      if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
 | 
					      if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
 | 
				
			||||||
        && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
 | 
					        && ( ::gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
 | 
				
			||||||
    $FHEM::Automation::ShuttersControl::ascDev->_getRainSensor;
 | 
					    $FHEM::Automation::ShuttersControl::ascDev->_getRainSensor;
 | 
				
			||||||
    return $self->{ASC_rainSensor}->{shuttersClosedPos};
 | 
					    return $self->{ASC_rainSensor}->{shuttersClosedPos};
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -342,7 +334,7 @@ sub getRainWaitingTime {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    return $self->{ASC_rainSensor}->{waitingTime}
 | 
					    return $self->{ASC_rainSensor}->{waitingTime}
 | 
				
			||||||
      if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
 | 
					      if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
 | 
				
			||||||
        && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
 | 
					        && ( ::gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
 | 
				
			||||||
    $FHEM::Automation::ShuttersControl::ascDev->_getRainSensor;
 | 
					    $FHEM::Automation::ShuttersControl::ascDev->_getRainSensor;
 | 
				
			||||||
    return $self->{ASC_rainSensor}->{waitingTime};
 | 
					    return $self->{ASC_rainSensor}->{waitingTime};
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -354,11 +346,11 @@ sub _getWindSensor {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    return $self->{ASC_windSensor}->{device}
 | 
					    return $self->{ASC_windSensor}->{device}
 | 
				
			||||||
      if ( exists( $self->{ASC_windSensor}->{LASTGETTIME} )
 | 
					      if ( exists( $self->{ASC_windSensor}->{LASTGETTIME} )
 | 
				
			||||||
        && ( gettimeofday() - $self->{ASC_windSensor}->{LASTGETTIME} ) < 2 );
 | 
					        && ( ::gettimeofday() - $self->{ASC_windSensor}->{LASTGETTIME} ) < 2 );
 | 
				
			||||||
    $self->{ASC_windSensor}->{LASTGETTIME} = int( gettimeofday() );
 | 
					    $self->{ASC_windSensor}->{LASTGETTIME} = int( ::gettimeofday() );
 | 
				
			||||||
    my ( $device, $reading ) =
 | 
					    my ( $device, $reading ) =
 | 
				
			||||||
      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $name, 'ASC_windSensor',
 | 
					      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $name,
 | 
				
			||||||
        'none' );
 | 
					        'ASC_windSensor', 'none' );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return $device if ( $device eq 'none' );
 | 
					    return $device if ( $device eq 'none' );
 | 
				
			||||||
    $self->{ASC_windSensor}->{device} = $device;
 | 
					    $self->{ASC_windSensor}->{device} = $device;
 | 
				
			||||||
@@ -375,7 +367,7 @@ sub getWindSensorReading {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    return $self->{ASC_windSensor}->{reading}
 | 
					    return $self->{ASC_windSensor}->{reading}
 | 
				
			||||||
      if ( exists( $self->{ASC_windSensor}->{LASTGETTIME} )
 | 
					      if ( exists( $self->{ASC_windSensor}->{LASTGETTIME} )
 | 
				
			||||||
        && ( gettimeofday() - $self->{ASC_windSensor}->{LASTGETTIME} ) < 2 );
 | 
					        && ( ::gettimeofday() - $self->{ASC_windSensor}->{LASTGETTIME} ) < 2 );
 | 
				
			||||||
    $FHEM::Automation::ShuttersControl::ascDev->_getWindSensor;
 | 
					    $FHEM::Automation::ShuttersControl::ascDev->_getWindSensor;
 | 
				
			||||||
    return (
 | 
					    return (
 | 
				
			||||||
        defined( $self->{ASC_windSensor}->{reading} )
 | 
					        defined( $self->{ASC_windSensor}->{reading} )
 | 
				
			||||||
@@ -389,7 +381,7 @@ sub getBlockAscDrivesAfterManual {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    my $name = $self->{name};
 | 
					    my $name = $self->{name};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $name, 'ASC_blockAscDrivesAfterManual', 0 );
 | 
					    return ::AttrVal( $name, 'ASC_blockAscDrivesAfterManual', 0 );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub getAdvDate {
 | 
					sub getAdvDate {
 | 
				
			||||||
@@ -397,10 +389,7 @@ sub getAdvDate {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    my $name = $self->{name};
 | 
					    my $name = $self->{name};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $name, 'ASC_advDate', 'FirstAdvent' );
 | 
					    return ::AttrVal( $name, 'ASC_advDate', 'FirstAdvent' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
1;
 | 
					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
 | 
					#  All rights reserved
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
#   Special thanks goes to:
 | 
					#   Special thanks goes to:
 | 
				
			||||||
@@ -48,12 +48,7 @@ use GPUtils qw(GP_Import);
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## Import der FHEM Funktionen
 | 
					## Import der FHEM Funktionen
 | 
				
			||||||
BEGIN {
 | 
					BEGIN {
 | 
				
			||||||
    GP_Import(
 | 
					    GP_Import(qw(defs));
 | 
				
			||||||
        qw(
 | 
					 | 
				
			||||||
          readingsSingleUpdate
 | 
					 | 
				
			||||||
          ReadingsVal
 | 
					 | 
				
			||||||
          defs)
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub setDelayCmdReading {
 | 
					sub setDelayCmdReading {
 | 
				
			||||||
@@ -62,7 +57,7 @@ sub setDelayCmdReading {
 | 
				
			|||||||
    my $name = $self->{name};
 | 
					    my $name = $self->{name};
 | 
				
			||||||
    my $hash = $defs{$name};
 | 
					    my $hash = $defs{$name};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    readingsSingleUpdate(
 | 
					    ::readingsSingleUpdate(
 | 
				
			||||||
        $hash,
 | 
					        $hash,
 | 
				
			||||||
        $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
 | 
					        $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
 | 
				
			||||||
          . '_lastDelayPosValue',
 | 
					          . '_lastDelayPosValue',
 | 
				
			||||||
@@ -79,7 +74,7 @@ sub setStateReading {
 | 
				
			|||||||
    my $name = $self->{name};
 | 
					    my $name = $self->{name};
 | 
				
			||||||
    my $hash = $defs{$name};
 | 
					    my $hash = $defs{$name};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    readingsSingleUpdate(
 | 
					    ::readingsSingleUpdate(
 | 
				
			||||||
        $hash, 'state',
 | 
					        $hash, 'state',
 | 
				
			||||||
        (
 | 
					        (
 | 
				
			||||||
            defined($value)
 | 
					            defined($value)
 | 
				
			||||||
@@ -97,7 +92,7 @@ sub setPosReading {
 | 
				
			|||||||
    my $name = $self->{name};
 | 
					    my $name = $self->{name};
 | 
				
			||||||
    my $hash = $defs{$name};
 | 
					    my $hash = $defs{$name};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    readingsSingleUpdate(
 | 
					    ::readingsSingleUpdate(
 | 
				
			||||||
        $hash,
 | 
					        $hash,
 | 
				
			||||||
        $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
 | 
					        $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
 | 
				
			||||||
          . '_PosValue',
 | 
					          . '_PosValue',
 | 
				
			||||||
@@ -113,7 +108,7 @@ sub setLastPosReading {
 | 
				
			|||||||
    my $name = $self->{name};
 | 
					    my $name = $self->{name};
 | 
				
			||||||
    my $hash = $defs{$name};
 | 
					    my $hash = $defs{$name};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    readingsSingleUpdate(
 | 
					    ::readingsSingleUpdate(
 | 
				
			||||||
        $hash,
 | 
					        $hash,
 | 
				
			||||||
        $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
 | 
					        $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
 | 
				
			||||||
          . '_lastPosValue',
 | 
					          . '_lastPosValue',
 | 
				
			||||||
@@ -128,7 +123,7 @@ sub getPartyMode {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    my $name = $self->{name};
 | 
					    my $name = $self->{name};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return ReadingsVal( $name, 'partyMode', 'off' );
 | 
					    return ::ReadingsVal( $name, 'partyMode', 'off' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub getHardLockOut {
 | 
					sub getHardLockOut {
 | 
				
			||||||
@@ -136,7 +131,7 @@ sub getHardLockOut {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    my $name = $self->{name};
 | 
					    my $name = $self->{name};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return ReadingsVal( $name, 'hardLockOut', 'none' );
 | 
					    return ::ReadingsVal( $name, 'hardLockOut', 'none' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub getSunriseTimeWeHoliday {
 | 
					sub getSunriseTimeWeHoliday {
 | 
				
			||||||
@@ -144,7 +139,7 @@ sub getSunriseTimeWeHoliday {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    my $name = $self->{name};
 | 
					    my $name = $self->{name};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return ReadingsVal( $name, 'sunriseTimeWeHoliday', 'none' );
 | 
					    return ::ReadingsVal( $name, 'sunriseTimeWeHoliday', 'none' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub getMonitoredDevs {
 | 
					sub getMonitoredDevs {
 | 
				
			||||||
@@ -152,14 +147,14 @@ sub getMonitoredDevs {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    my $name = $self->{name};
 | 
					    my $name = $self->{name};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $self->{monitoredDevs} = ReadingsVal( $name, '.monitoredDevs', 'none' );
 | 
					    $self->{monitoredDevs} = ::ReadingsVal( $name, '.monitoredDevs', 'none' );
 | 
				
			||||||
    return $self->{monitoredDevs};
 | 
					    return $self->{monitoredDevs};
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub getOutTemp {
 | 
					sub getOutTemp {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return ReadingsVal(
 | 
					    return ::ReadingsVal(
 | 
				
			||||||
        $FHEM::Automation::ShuttersControl::ascDev->_getTempSensor,
 | 
					        $FHEM::Automation::ShuttersControl::ascDev->_getTempSensor,
 | 
				
			||||||
        $FHEM::Automation::ShuttersControl::ascDev->getTempSensorReading,
 | 
					        $FHEM::Automation::ShuttersControl::ascDev->getTempSensorReading,
 | 
				
			||||||
        -100 );
 | 
					        -100 );
 | 
				
			||||||
@@ -169,7 +164,8 @@ sub getResidentsStatus {
 | 
				
			|||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    my $val =
 | 
					    my $val =
 | 
				
			||||||
      ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev,
 | 
					      ::ReadingsVal(
 | 
				
			||||||
 | 
					        $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev,
 | 
				
			||||||
        $FHEM::Automation::ShuttersControl::ascDev->getResidentsReading,
 | 
					        $FHEM::Automation::ShuttersControl::ascDev->getResidentsReading,
 | 
				
			||||||
        'none' );
 | 
					        'none' );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -178,7 +174,7 @@ sub getResidentsStatus {
 | 
				
			|||||||
        return $1 && $1 eq 'pet' ? 'absent' : $2;
 | 
					        return $1 && $1 eq 'pet' ? 'absent' : $2;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    elsif (
 | 
					    elsif (
 | 
				
			||||||
        ReadingsVal(
 | 
					        ::ReadingsVal(
 | 
				
			||||||
            $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev,
 | 
					            $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev,
 | 
				
			||||||
            'homealoneType', '-' ) eq 'PET'
 | 
					            'homealoneType', '-' ) eq 'PET'
 | 
				
			||||||
      )
 | 
					      )
 | 
				
			||||||
@@ -196,7 +192,8 @@ sub getResidentsLastStatus {
 | 
				
			|||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    my $val =
 | 
					    my $val =
 | 
				
			||||||
      ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev,
 | 
					      ::ReadingsVal(
 | 
				
			||||||
 | 
					        $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev,
 | 
				
			||||||
        'lastState', 'none' );
 | 
					        'lastState', 'none' );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if ( $val =~ m{^(?:(.+)_)?(.+)$}xms ) {
 | 
					    if ( $val =~ m{^(?:(.+)_)?(.+)$}xms ) {
 | 
				
			||||||
@@ -204,7 +201,7 @@ sub getResidentsLastStatus {
 | 
				
			|||||||
        return $1 && $1 eq 'pet' ? 'absent' : $2;
 | 
					        return $1 && $1 eq 'pet' ? 'absent' : $2;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    elsif (
 | 
					    elsif (
 | 
				
			||||||
        ReadingsVal(
 | 
					        ::ReadingsVal(
 | 
				
			||||||
            $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev,
 | 
					            $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev,
 | 
				
			||||||
            'lastHomealoneType', '-' ) eq 'PET'
 | 
					            'lastHomealoneType', '-' ) eq 'PET'
 | 
				
			||||||
      )
 | 
					      )
 | 
				
			||||||
@@ -223,7 +220,7 @@ sub getAutoShuttersControlShading {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    my $name = $self->{name};
 | 
					    my $name = $self->{name};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return ReadingsVal( $name, 'controlShading', 'none' );
 | 
					    return ::ReadingsVal( $name, 'controlShading', 'none' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub getSelfDefense {
 | 
					sub getSelfDefense {
 | 
				
			||||||
@@ -231,7 +228,7 @@ sub getSelfDefense {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    my $name = $self->{name};
 | 
					    my $name = $self->{name};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return ReadingsVal( $name, 'selfDefense', 'none' );
 | 
					    return ::ReadingsVal( $name, 'selfDefense', 'none' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub getAzimuth {
 | 
					sub getAzimuth {
 | 
				
			||||||
@@ -239,13 +236,13 @@ sub getAzimuth {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    my $azimuth;
 | 
					    my $azimuth;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $azimuth = ReadingsVal(
 | 
					    $azimuth = ::ReadingsVal(
 | 
				
			||||||
        $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice,
 | 
					        $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice,
 | 
				
			||||||
        'azimuth', -1 )
 | 
					        'azimuth', -1 )
 | 
				
			||||||
      if (
 | 
					      if (
 | 
				
			||||||
        $defs{ $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice }
 | 
					        $defs{ $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice }
 | 
				
			||||||
        ->{TYPE} eq 'Twilight' );
 | 
					        ->{TYPE} eq 'Twilight' );
 | 
				
			||||||
    $azimuth = ReadingsVal(
 | 
					    $azimuth = ::ReadingsVal(
 | 
				
			||||||
        $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice,
 | 
					        $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice,
 | 
				
			||||||
        'SunAz', -1 )
 | 
					        'SunAz', -1 )
 | 
				
			||||||
      if (
 | 
					      if (
 | 
				
			||||||
@@ -260,13 +257,13 @@ sub getElevation {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    my $elevation;
 | 
					    my $elevation;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $elevation = ReadingsVal(
 | 
					    $elevation = ::ReadingsVal(
 | 
				
			||||||
        $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice,
 | 
					        $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice,
 | 
				
			||||||
        'elevation', -1 )
 | 
					        'elevation', -1 )
 | 
				
			||||||
      if (
 | 
					      if (
 | 
				
			||||||
        $defs{ $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice }
 | 
					        $defs{ $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice }
 | 
				
			||||||
        ->{TYPE} eq 'Twilight' );
 | 
					        ->{TYPE} eq 'Twilight' );
 | 
				
			||||||
    $elevation = ReadingsVal(
 | 
					    $elevation = ::ReadingsVal(
 | 
				
			||||||
        $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice,
 | 
					        $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice,
 | 
				
			||||||
        'SunAlt', -1 )
 | 
					        'SunAlt', -1 )
 | 
				
			||||||
      if (
 | 
					      if (
 | 
				
			||||||
@@ -281,7 +278,7 @@ sub getASCenable {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    my $name = $self->{name};
 | 
					    my $name = $self->{name};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return ReadingsVal( $name, 'ascEnable', 'none' );
 | 
					    return ::ReadingsVal( $name, 'ascEnable', 'none' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1;
 | 
					1;
 | 
				
			||||||
 
 | 
				
			|||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -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
 | 
					#  All rights reserved
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
#   Special thanks goes to:
 | 
					#   Special thanks goes to:
 | 
				
			||||||
@@ -89,21 +89,7 @@ our %EXPORT_TAGS = (
 | 
				
			|||||||
use GPUtils qw(GP_Import);
 | 
					use GPUtils qw(GP_Import);
 | 
				
			||||||
## Import der FHEM Funktionen
 | 
					## Import der FHEM Funktionen
 | 
				
			||||||
BEGIN {
 | 
					BEGIN {
 | 
				
			||||||
    GP_Import(
 | 
					    GP_Import(qw(cmdFromAnalyze));
 | 
				
			||||||
        qw(
 | 
					 | 
				
			||||||
          devspec2array
 | 
					 | 
				
			||||||
          CommandAttr
 | 
					 | 
				
			||||||
          AttrVal
 | 
					 | 
				
			||||||
          Log3
 | 
					 | 
				
			||||||
          computeAlignTime
 | 
					 | 
				
			||||||
          gettimeofday
 | 
					 | 
				
			||||||
          sunset
 | 
					 | 
				
			||||||
          sunset_abs
 | 
					 | 
				
			||||||
          sunrise
 | 
					 | 
				
			||||||
          sunrise_abs
 | 
					 | 
				
			||||||
          cmdFromAnalyze
 | 
					 | 
				
			||||||
          )
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub PositionValueWindowRec {
 | 
					sub PositionValueWindowRec {
 | 
				
			||||||
@@ -156,12 +142,12 @@ sub AutoSearchTwilightDev {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    my $name = $hash->{NAME};
 | 
					    my $name = $hash->{NAME};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if ( devspec2array('TYPE=(Astro|Twilight)') > 0 ) {
 | 
					    if ( ::devspec2array('TYPE=(Astro|Twilight)') > 0 ) {
 | 
				
			||||||
        CommandAttr( undef,
 | 
					        ::CommandAttr( undef,
 | 
				
			||||||
                $name
 | 
					                $name
 | 
				
			||||||
              . ' ASC_twilightDevice '
 | 
					              . ' ASC_twilightDevice '
 | 
				
			||||||
              . ( devspec2array('TYPE=(Astro|Twilight)') )[0] )
 | 
					              . ( ::devspec2array('TYPE=(Astro|Twilight)') )[0] )
 | 
				
			||||||
          if ( AttrVal( $name, 'ASC_twilightDevice', 'none' ) eq 'none' );
 | 
					          if ( ::AttrVal( $name, 'ASC_twilightDevice', 'none' ) eq 'none' );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
@@ -172,8 +158,10 @@ sub GetAttrValues {
 | 
				
			|||||||
    my $attribut = shift;
 | 
					    my $attribut = shift;
 | 
				
			||||||
    my $default  = shift;
 | 
					    my $default  = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    my @values = split( ' ',
 | 
					    my @values = split(
 | 
				
			||||||
        AttrVal( $dev, $attribut, ( defined($default) ? $default : 'none' ) ) );
 | 
					        ' ',
 | 
				
			||||||
 | 
					        ::AttrVal( $dev, $attribut, ( defined($default) ? $default : 'none' ) )
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
    my ( $value1, $value2 ) = split( ':', $values[0] );
 | 
					    my ( $value1, $value2 ) = split( ':', $values[0] );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    my ( $value3, $value4, $value5, $value6, $value7, $value8 );
 | 
					    my ( $value3, $value4, $value5, $value6, $value7, $value8 );
 | 
				
			||||||
@@ -227,10 +215,10 @@ sub ExtractNotifyDevFromEvent {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    my %notifyDevs;
 | 
					    my %notifyDevs;
 | 
				
			||||||
    while ( my $notifyDev = each %{ $hash->{monitoredDevs} } ) {
 | 
					    while ( my $notifyDev = each %{ $hash->{monitoredDevs} } ) {
 | 
				
			||||||
        Log3( $hash->{NAME}, 4,
 | 
					        ::Log3( $hash->{NAME}, 4,
 | 
				
			||||||
"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - NotifyDev: "
 | 
					"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - NotifyDev: "
 | 
				
			||||||
              . $notifyDev );
 | 
					              . $notifyDev );
 | 
				
			||||||
        Log3( $hash->{NAME}, 5,
 | 
					        ::Log3( $hash->{NAME}, 5,
 | 
				
			||||||
"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - ShuttersDev: "
 | 
					"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - ShuttersDev: "
 | 
				
			||||||
              . $shuttersDev );
 | 
					              . $shuttersDev );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -238,10 +226,10 @@ sub ExtractNotifyDevFromEvent {
 | 
				
			|||||||
            && $hash->{monitoredDevs}{$notifyDev}{$shuttersDev} eq
 | 
					            && $hash->{monitoredDevs}{$notifyDev}{$shuttersDev} eq
 | 
				
			||||||
            $shuttersAttr )
 | 
					            $shuttersAttr )
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            Log3( $hash->{NAME}, 4,
 | 
					            ::Log3( $hash->{NAME}, 4,
 | 
				
			||||||
"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - ShuttersDevHash: "
 | 
					"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - ShuttersDevHash: "
 | 
				
			||||||
                  . $hash->{monitoredDevs}{$notifyDev}{$shuttersDev} );
 | 
					                  . $hash->{monitoredDevs}{$notifyDev}{$shuttersDev} );
 | 
				
			||||||
            Log3( $hash->{NAME}, 5,
 | 
					            ::Log3( $hash->{NAME}, 5,
 | 
				
			||||||
"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - return ShuttersDev: "
 | 
					"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - return ShuttersDev: "
 | 
				
			||||||
                  . $notifyDev );
 | 
					                  . $notifyDev );
 | 
				
			||||||
            $notifyDevs{$notifyDev} = $shuttersDev;
 | 
					            $notifyDevs{$notifyDev} = $shuttersDev;
 | 
				
			||||||
@@ -279,24 +267,27 @@ sub _IsDay {
 | 
				
			|||||||
        (
 | 
					        (
 | 
				
			||||||
            (
 | 
					            (
 | 
				
			||||||
                (
 | 
					                (
 | 
				
			||||||
                    int( gettimeofday() / 86400 ) != int(
 | 
					                    int( ::gettimeofday() / 86400 ) != int(
 | 
				
			||||||
                        computeAlignTime( '24:00',
 | 
					                        ::computeAlignTime(
 | 
				
			||||||
 | 
					                            '24:00',
 | 
				
			||||||
                            $FHEM::Automation::ShuttersControl::shutters
 | 
					                            $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
                              ->getTimeUpEarly ) / 86400
 | 
					                              ->getTimeUpEarly
 | 
				
			||||||
 | 
					                        ) / 86400
 | 
				
			||||||
                    )
 | 
					                    )
 | 
				
			||||||
                    && ( !IsWe()
 | 
					                    && (
 | 
				
			||||||
                      || ( IsWe()
 | 
					                        !IsWe()
 | 
				
			||||||
                        && ( $FHEM::Automation::ShuttersControl::ascDev
 | 
					                        || (
 | 
				
			||||||
                          ->getSunriseTimeWeHoliday eq 'off'
 | 
					                            IsWe()
 | 
				
			||||||
                          || $FHEM::Automation::ShuttersControl::shutters
 | 
					                            && ( $FHEM::Automation::ShuttersControl::ascDev
 | 
				
			||||||
                            ->getTimeUpWeHoliday eq '01:25'
 | 
					                                ->getSunriseTimeWeHoliday eq 'off'
 | 
				
			||||||
                           )
 | 
					                                || $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
                         )
 | 
					                                ->getTimeUpWeHoliday eq '01:25' )
 | 
				
			||||||
                        )
 | 
					                        )
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
                || (
 | 
					                || (
 | 
				
			||||||
                    int( gettimeofday() / 86400 ) != int(
 | 
					                    int( ::gettimeofday() / 86400 ) != int(
 | 
				
			||||||
                        computeAlignTime(
 | 
					                        ::computeAlignTime(
 | 
				
			||||||
                            '24:00',
 | 
					                            '24:00',
 | 
				
			||||||
                            $FHEM::Automation::ShuttersControl::shutters
 | 
					                            $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
                              ->getTimeUpWeHoliday
 | 
					                              ->getTimeUpWeHoliday
 | 
				
			||||||
@@ -309,23 +300,23 @@ sub _IsDay {
 | 
				
			|||||||
                    ->getTimeUpWeHoliday ne '01:25'
 | 
					                    ->getTimeUpWeHoliday ne '01:25'
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            && int( gettimeofday() / 86400 ) == int(
 | 
					            && int( ::gettimeofday() / 86400 ) == int(
 | 
				
			||||||
                computeAlignTime(
 | 
					                ::computeAlignTime(
 | 
				
			||||||
                    '24:00',
 | 
					                    '24:00',
 | 
				
			||||||
                    $FHEM::Automation::ShuttersControl::shutters->getTimeUpLate
 | 
					                    $FHEM::Automation::ShuttersControl::shutters->getTimeUpLate
 | 
				
			||||||
                ) / 86400
 | 
					                ) / 86400
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        || (
 | 
					        || (
 | 
				
			||||||
            int( gettimeofday() / 86400 ) != int(
 | 
					            int( ::gettimeofday() / 86400 ) != int(
 | 
				
			||||||
                computeAlignTime(
 | 
					                ::computeAlignTime(
 | 
				
			||||||
                    '24:00',
 | 
					                    '24:00',
 | 
				
			||||||
                    $FHEM::Automation::ShuttersControl::shutters
 | 
					                    $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
                      ->getTimeDownEarly
 | 
					                      ->getTimeDownEarly
 | 
				
			||||||
                ) / 86400
 | 
					                ) / 86400
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            && int( gettimeofday() / 86400 ) == int(
 | 
					            && int( ::gettimeofday() / 86400 ) == int(
 | 
				
			||||||
                computeAlignTime(
 | 
					                ::computeAlignTime(
 | 
				
			||||||
                    '24:00',
 | 
					                    '24:00',
 | 
				
			||||||
                    $FHEM::Automation::ShuttersControl::shutters
 | 
					                    $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
                      ->getTimeDownLate
 | 
					                      ->getTimeDownLate
 | 
				
			||||||
@@ -390,17 +381,22 @@ sub _IsDay {
 | 
				
			|||||||
              . $FHEM::Automation::ShuttersControl::shutters->getSunrise );
 | 
					              . $FHEM::Automation::ShuttersControl::shutters->getSunrise );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    $respIsDay = 1
 | 
					    $respIsDay = 1
 | 
				
			||||||
      if (
 | 
					      if (
 | 
				
			||||||
           (  $FHEM::Automation::ShuttersControl::shutters->getDown eq 'roommate'
 | 
					        (
 | 
				
			||||||
             and ( $FHEM::Automation::ShuttersControl::shutters->getRoommates ne 'asleep'
 | 
					            $FHEM::Automation::ShuttersControl::shutters->getDown eq 'roommate'
 | 
				
			||||||
                or $FHEM::Automation::ShuttersControl::shutters->getRoommates ne 'gotosleep' )
 | 
					            and ( $FHEM::Automation::ShuttersControl::shutters->getRoommates ne
 | 
				
			||||||
           ) 
 | 
					                'asleep'
 | 
				
			||||||
        or (  $FHEM::Automation::ShuttersControl::shutters->getUp eq 'roommate'
 | 
					                or $FHEM::Automation::ShuttersControl::shutters->getRoommates
 | 
				
			||||||
             and ( $FHEM::Automation::ShuttersControl::shutters->getRoommates ne 'asleep'
 | 
					                ne 'gotosleep' )
 | 
				
			||||||
                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;
 | 
					    return $respIsDay;
 | 
				
			||||||
@@ -436,7 +432,7 @@ sub ShuttersSunrise {
 | 
				
			|||||||
    my $oldFuncHash =
 | 
					    my $oldFuncHash =
 | 
				
			||||||
      $FHEM::Automation::ShuttersControl::shutters->getInTimerFuncHash;
 | 
					      $FHEM::Automation::ShuttersControl::shutters->getInTimerFuncHash;
 | 
				
			||||||
    my $shuttersSunriseUnixtime =
 | 
					    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 ( $tm eq 'unix' ) {
 | 
				
			||||||
        if ( $FHEM::Automation::ShuttersControl::shutters->getUp eq 'astro' ) {
 | 
					        if ( $FHEM::Automation::ShuttersControl::shutters->getUp eq 'astro' ) {
 | 
				
			||||||
@@ -449,11 +445,11 @@ sub ShuttersSunrise {
 | 
				
			|||||||
                if ( !IsWe('tomorrow') ) {
 | 
					                if ( !IsWe('tomorrow') ) {
 | 
				
			||||||
                    if (
 | 
					                    if (
 | 
				
			||||||
                        IsWe()
 | 
					                        IsWe()
 | 
				
			||||||
                        && int( gettimeofday() / 86400 ) == int(
 | 
					                        && int( ::gettimeofday() / 86400 ) == int(
 | 
				
			||||||
                            (
 | 
					                            (
 | 
				
			||||||
                                computeAlignTime(
 | 
					                                ::computeAlignTime(
 | 
				
			||||||
                                    '24:00',
 | 
					                                    '24:00',
 | 
				
			||||||
                                    sunrise_abs(
 | 
					                                    ::sunrise_abs(
 | 
				
			||||||
                                        $autoAstroMode,
 | 
					                                        $autoAstroMode,
 | 
				
			||||||
                                        0,
 | 
					                                        0,
 | 
				
			||||||
                                        $FHEM::Automation::ShuttersControl::shutters
 | 
					                                        $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
@@ -465,9 +461,9 @@ sub ShuttersSunrise {
 | 
				
			|||||||
                      )
 | 
					                      )
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        $shuttersSunriseUnixtime = (
 | 
					                        $shuttersSunriseUnixtime = (
 | 
				
			||||||
                            computeAlignTime(
 | 
					                            ::computeAlignTime(
 | 
				
			||||||
                                '24:00',
 | 
					                                '24:00',
 | 
				
			||||||
                                sunrise_abs(
 | 
					                                ::sunrise_abs(
 | 
				
			||||||
                                    $autoAstroMode,
 | 
					                                    $autoAstroMode,
 | 
				
			||||||
                                    0,
 | 
					                                    0,
 | 
				
			||||||
                                    $FHEM::Automation::ShuttersControl::shutters
 | 
					                                    $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
@@ -477,11 +473,11 @@ sub ShuttersSunrise {
 | 
				
			|||||||
                        );
 | 
					                        );
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    elsif (
 | 
					                    elsif (
 | 
				
			||||||
                        int( gettimeofday() / 86400 ) == int(
 | 
					                        int( ::gettimeofday() / 86400 ) == int(
 | 
				
			||||||
                            (
 | 
					                            (
 | 
				
			||||||
                                computeAlignTime(
 | 
					                                ::computeAlignTime(
 | 
				
			||||||
                                    '24:00',
 | 
					                                    '24:00',
 | 
				
			||||||
                                    sunrise_abs(
 | 
					                                    ::sunrise_abs(
 | 
				
			||||||
                                        $autoAstroMode,
 | 
					                                        $autoAstroMode,
 | 
				
			||||||
                                        0,
 | 
					                                        0,
 | 
				
			||||||
                                        $FHEM::Automation::ShuttersControl::shutters
 | 
					                                        $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
@@ -495,9 +491,9 @@ sub ShuttersSunrise {
 | 
				
			|||||||
                      )
 | 
					                      )
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        $shuttersSunriseUnixtime = (
 | 
					                        $shuttersSunriseUnixtime = (
 | 
				
			||||||
                            computeAlignTime(
 | 
					                            ::computeAlignTime(
 | 
				
			||||||
                                '24:00',
 | 
					                                '24:00',
 | 
				
			||||||
                                sunrise_abs(
 | 
					                                ::sunrise_abs(
 | 
				
			||||||
                                    $autoAstroMode,
 | 
					                                    $autoAstroMode,
 | 
				
			||||||
                                    0,
 | 
					                                    0,
 | 
				
			||||||
                                    $FHEM::Automation::ShuttersControl::shutters
 | 
					                                    $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
@@ -508,9 +504,9 @@ sub ShuttersSunrise {
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    else {
 | 
					                    else {
 | 
				
			||||||
                        $shuttersSunriseUnixtime = (
 | 
					                        $shuttersSunriseUnixtime = (
 | 
				
			||||||
                            computeAlignTime(
 | 
					                            ::computeAlignTime(
 | 
				
			||||||
                                '24:00',
 | 
					                                '24:00',
 | 
				
			||||||
                                sunrise_abs(
 | 
					                                ::sunrise_abs(
 | 
				
			||||||
                                    $autoAstroMode,
 | 
					                                    $autoAstroMode,
 | 
				
			||||||
                                    0,
 | 
					                                    0,
 | 
				
			||||||
                                    $FHEM::Automation::ShuttersControl::shutters
 | 
					                                    $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
@@ -526,11 +522,11 @@ sub ShuttersSunrise {
 | 
				
			|||||||
                    if (
 | 
					                    if (
 | 
				
			||||||
                        IsWe()
 | 
					                        IsWe()
 | 
				
			||||||
                        && (
 | 
					                        && (
 | 
				
			||||||
                            int( gettimeofday() / 86400 ) == int(
 | 
					                            int( ::gettimeofday() / 86400 ) == int(
 | 
				
			||||||
                                (
 | 
					                                (
 | 
				
			||||||
                                    computeAlignTime(
 | 
					                                    ::computeAlignTime(
 | 
				
			||||||
                                        '24:00',
 | 
					                                        '24:00',
 | 
				
			||||||
                                        sunrise_abs(
 | 
					                                        ::sunrise_abs(
 | 
				
			||||||
                                            $autoAstroMode,
 | 
					                                            $autoAstroMode,
 | 
				
			||||||
                                            0,
 | 
					                                            0,
 | 
				
			||||||
                                            $FHEM::Automation::ShuttersControl::shutters
 | 
					                                            $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
@@ -539,11 +535,11 @@ sub ShuttersSunrise {
 | 
				
			|||||||
                                    ) + 1
 | 
					                                    ) + 1
 | 
				
			||||||
                                ) / 86400
 | 
					                                ) / 86400
 | 
				
			||||||
                            )
 | 
					                            )
 | 
				
			||||||
                            || int( gettimeofday() / 86400 ) != int(
 | 
					                            || int( ::gettimeofday() / 86400 ) != int(
 | 
				
			||||||
                                (
 | 
					                                (
 | 
				
			||||||
                                    computeAlignTime(
 | 
					                                    ::computeAlignTime(
 | 
				
			||||||
                                        '24:00',
 | 
					                                        '24:00',
 | 
				
			||||||
                                        sunrise_abs(
 | 
					                                        ::sunrise_abs(
 | 
				
			||||||
                                            $autoAstroMode,
 | 
					                                            $autoAstroMode,
 | 
				
			||||||
                                            0,
 | 
					                                            0,
 | 
				
			||||||
                                            $FHEM::Automation::ShuttersControl::shutters
 | 
					                                            $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
@@ -556,9 +552,9 @@ sub ShuttersSunrise {
 | 
				
			|||||||
                      )
 | 
					                      )
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        $shuttersSunriseUnixtime = (
 | 
					                        $shuttersSunriseUnixtime = (
 | 
				
			||||||
                            computeAlignTime(
 | 
					                            ::computeAlignTime(
 | 
				
			||||||
                                '24:00',
 | 
					                                '24:00',
 | 
				
			||||||
                                sunrise_abs(
 | 
					                                ::sunrise_abs(
 | 
				
			||||||
                                    $autoAstroMode,
 | 
					                                    $autoAstroMode,
 | 
				
			||||||
                                    0,
 | 
					                                    0,
 | 
				
			||||||
                                    $FHEM::Automation::ShuttersControl::shutters
 | 
					                                    $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
@@ -568,11 +564,11 @@ sub ShuttersSunrise {
 | 
				
			|||||||
                        );
 | 
					                        );
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    elsif (
 | 
					                    elsif (
 | 
				
			||||||
                        int( gettimeofday() / 86400 ) == int(
 | 
					                        int( ::gettimeofday() / 86400 ) == int(
 | 
				
			||||||
                            (
 | 
					                            (
 | 
				
			||||||
                                computeAlignTime(
 | 
					                                ::computeAlignTime(
 | 
				
			||||||
                                    '24:00',
 | 
					                                    '24:00',
 | 
				
			||||||
                                    sunrise_abs(
 | 
					                                    ::sunrise_abs(
 | 
				
			||||||
                                        $autoAstroMode,
 | 
					                                        $autoAstroMode,
 | 
				
			||||||
                                        0,
 | 
					                                        0,
 | 
				
			||||||
                                        $FHEM::Automation::ShuttersControl::shutters
 | 
					                                        $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
@@ -586,9 +582,9 @@ sub ShuttersSunrise {
 | 
				
			|||||||
                      )
 | 
					                      )
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        $shuttersSunriseUnixtime = (
 | 
					                        $shuttersSunriseUnixtime = (
 | 
				
			||||||
                            computeAlignTime(
 | 
					                            ::computeAlignTime(
 | 
				
			||||||
                                '24:00',
 | 
					                                '24:00',
 | 
				
			||||||
                                sunrise_abs(
 | 
					                                ::sunrise_abs(
 | 
				
			||||||
                                    $autoAstroMode,
 | 
					                                    $autoAstroMode,
 | 
				
			||||||
                                    0,
 | 
					                                    0,
 | 
				
			||||||
                                    $FHEM::Automation::ShuttersControl::shutters
 | 
					                                    $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
@@ -601,11 +597,11 @@ sub ShuttersSunrise {
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    else {
 | 
					                    else {
 | 
				
			||||||
                        if (
 | 
					                        if (
 | 
				
			||||||
                            int( gettimeofday() / 86400 ) == int(
 | 
					                            int( ::gettimeofday() / 86400 ) == int(
 | 
				
			||||||
                                (
 | 
					                                (
 | 
				
			||||||
                                    computeAlignTime(
 | 
					                                    ::computeAlignTime(
 | 
				
			||||||
                                        '24:00',
 | 
					                                        '24:00',
 | 
				
			||||||
                                        sunrise_abs(
 | 
					                                        ::sunrise_abs(
 | 
				
			||||||
                                            $autoAstroMode,
 | 
					                                            $autoAstroMode,
 | 
				
			||||||
                                            0,
 | 
					                                            0,
 | 
				
			||||||
                                            $FHEM::Automation::ShuttersControl::shutters
 | 
					                                            $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
@@ -617,9 +613,9 @@ sub ShuttersSunrise {
 | 
				
			|||||||
                          )
 | 
					                          )
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
                            $shuttersSunriseUnixtime = (
 | 
					                            $shuttersSunriseUnixtime = (
 | 
				
			||||||
                                computeAlignTime(
 | 
					                                ::computeAlignTime(
 | 
				
			||||||
                                    '24:00',
 | 
					                                    '24:00',
 | 
				
			||||||
                                    sunrise_abs(
 | 
					                                    ::sunrise_abs(
 | 
				
			||||||
                                        $autoAstroMode,
 | 
					                                        $autoAstroMode,
 | 
				
			||||||
                                        0,
 | 
					                                        0,
 | 
				
			||||||
                                        $FHEM::Automation::ShuttersControl::shutters
 | 
					                                        $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
@@ -630,9 +626,9 @@ sub ShuttersSunrise {
 | 
				
			|||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        else {
 | 
					                        else {
 | 
				
			||||||
                            $shuttersSunriseUnixtime = (
 | 
					                            $shuttersSunriseUnixtime = (
 | 
				
			||||||
                                computeAlignTime(
 | 
					                                ::computeAlignTime(
 | 
				
			||||||
                                    '24:00',
 | 
					                                    '24:00',
 | 
				
			||||||
                                    sunrise_abs(
 | 
					                                    ::sunrise_abs(
 | 
				
			||||||
                                        $autoAstroMode,
 | 
					                                        $autoAstroMode,
 | 
				
			||||||
                                        0,
 | 
					                                        0,
 | 
				
			||||||
                                        $FHEM::Automation::ShuttersControl::shutters
 | 
					                                        $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
@@ -646,9 +642,9 @@ sub ShuttersSunrise {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            else {
 | 
					            else {
 | 
				
			||||||
                $shuttersSunriseUnixtime = (
 | 
					                $shuttersSunriseUnixtime = (
 | 
				
			||||||
                    computeAlignTime(
 | 
					                    ::computeAlignTime(
 | 
				
			||||||
                        '24:00',
 | 
					                        '24:00',
 | 
				
			||||||
                        sunrise_abs(
 | 
					                        ::sunrise_abs(
 | 
				
			||||||
                            $autoAstroMode,
 | 
					                            $autoAstroMode,
 | 
				
			||||||
                            0,
 | 
					                            0,
 | 
				
			||||||
                            $FHEM::Automation::ShuttersControl::shutters
 | 
					                            $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
@@ -669,11 +665,11 @@ sub ShuttersSunrise {
 | 
				
			|||||||
            {
 | 
					            {
 | 
				
			||||||
                if ( !IsWe('tomorrow') ) {
 | 
					                if ( !IsWe('tomorrow') ) {
 | 
				
			||||||
                    if (
 | 
					                    if (
 | 
				
			||||||
                        int( gettimeofday() / 86400 ) == int(
 | 
					                        int( ::gettimeofday() / 86400 ) == int(
 | 
				
			||||||
                            (
 | 
					                            (
 | 
				
			||||||
                                computeAlignTime(
 | 
					                                ::computeAlignTime(
 | 
				
			||||||
                                    '24:00',
 | 
					                                    '24:00',
 | 
				
			||||||
                                    sunrise_abs(
 | 
					                                    ::sunrise_abs(
 | 
				
			||||||
                                        $autoAstroMode,
 | 
					                                        $autoAstroMode,
 | 
				
			||||||
                                        0,
 | 
					                                        0,
 | 
				
			||||||
                                        $FHEM::Automation::ShuttersControl::shutters
 | 
					                                        $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
@@ -690,7 +686,7 @@ sub ShuttersSunrise {
 | 
				
			|||||||
                          ( $shuttersSunriseUnixtime + 86400 )
 | 
					                          ( $shuttersSunriseUnixtime + 86400 )
 | 
				
			||||||
                          if ( $shuttersSunriseUnixtime <
 | 
					                          if ( $shuttersSunriseUnixtime <
 | 
				
			||||||
                            ( $oldFuncHash->{sunrisetime} + 180 )
 | 
					                            ( $oldFuncHash->{sunrisetime} + 180 )
 | 
				
			||||||
                            && $oldFuncHash->{sunrisetime} < gettimeofday() );
 | 
					                            && $oldFuncHash->{sunrisetime} < ::gettimeofday() );
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -698,7 +694,7 @@ sub ShuttersSunrise {
 | 
				
			|||||||
                $shuttersSunriseUnixtime = ( $shuttersSunriseUnixtime + 86400 )
 | 
					                $shuttersSunriseUnixtime = ( $shuttersSunriseUnixtime + 86400 )
 | 
				
			||||||
                  if ( $shuttersSunriseUnixtime <
 | 
					                  if ( $shuttersSunriseUnixtime <
 | 
				
			||||||
                    ( $oldFuncHash->{sunrisetime} + 180 )
 | 
					                    ( $oldFuncHash->{sunrisetime} + 180 )
 | 
				
			||||||
                    && $oldFuncHash->{sunrisetime} < gettimeofday() );
 | 
					                    && $oldFuncHash->{sunrisetime} < ::gettimeofday() );
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        elsif ( $FHEM::Automation::ShuttersControl::shutters->getUp eq 'time' )
 | 
					        elsif ( $FHEM::Automation::ShuttersControl::shutters->getUp eq 'time' )
 | 
				
			||||||
@@ -711,8 +707,8 @@ sub ShuttersSunrise {
 | 
				
			|||||||
            {
 | 
					            {
 | 
				
			||||||
                if ( !IsWe('tomorrow') ) {
 | 
					                if ( !IsWe('tomorrow') ) {
 | 
				
			||||||
                    if (
 | 
					                    if (
 | 
				
			||||||
                        int( gettimeofday() / 86400 ) == int(
 | 
					                        int( ::gettimeofday() / 86400 ) == int(
 | 
				
			||||||
                            computeAlignTime(
 | 
					                            ::computeAlignTime(
 | 
				
			||||||
                                '24:00',
 | 
					                                '24:00',
 | 
				
			||||||
                                $FHEM::Automation::ShuttersControl::shutters
 | 
					                                $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
                                  ->getTimeUpWeHoliday
 | 
					                                  ->getTimeUpWeHoliday
 | 
				
			||||||
@@ -720,13 +716,13 @@ sub ShuttersSunrise {
 | 
				
			|||||||
                        )
 | 
					                        )
 | 
				
			||||||
                      )
 | 
					                      )
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        $shuttersSunriseUnixtime = computeAlignTime( '24:00',
 | 
					                        $shuttersSunriseUnixtime = ::computeAlignTime( '24:00',
 | 
				
			||||||
                            $FHEM::Automation::ShuttersControl::shutters
 | 
					                            $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
                              ->getTimeUpWeHoliday );
 | 
					                              ->getTimeUpWeHoliday );
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    elsif (
 | 
					                    elsif (
 | 
				
			||||||
                        int( gettimeofday() / 86400 ) == int(
 | 
					                        int( ::gettimeofday() / 86400 ) == int(
 | 
				
			||||||
                            computeAlignTime(
 | 
					                            ::computeAlignTime(
 | 
				
			||||||
                                '24:00',
 | 
					                                '24:00',
 | 
				
			||||||
                                $FHEM::Automation::ShuttersControl::shutters
 | 
					                                $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
                                  ->getTimeUpEarly
 | 
					                                  ->getTimeUpEarly
 | 
				
			||||||
@@ -736,12 +732,12 @@ sub ShuttersSunrise {
 | 
				
			|||||||
                        ->getSunrise
 | 
					                        ->getSunrise
 | 
				
			||||||
                      )
 | 
					                      )
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        $shuttersSunriseUnixtime = computeAlignTime( '24:00',
 | 
					                        $shuttersSunriseUnixtime = ::computeAlignTime( '24:00',
 | 
				
			||||||
                            $FHEM::Automation::ShuttersControl::shutters
 | 
					                            $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
                              ->getTimeUpEarly ) + 86400;
 | 
					                              ->getTimeUpEarly ) + 86400;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    else {
 | 
					                    else {
 | 
				
			||||||
                        $shuttersSunriseUnixtime = computeAlignTime( '24:00',
 | 
					                        $shuttersSunriseUnixtime = ::computeAlignTime( '24:00',
 | 
				
			||||||
                            $FHEM::Automation::ShuttersControl::shutters
 | 
					                            $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
                              ->getTimeUpEarly );
 | 
					                              ->getTimeUpEarly );
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -749,8 +745,8 @@ sub ShuttersSunrise {
 | 
				
			|||||||
                else {
 | 
					                else {
 | 
				
			||||||
                    if (
 | 
					                    if (
 | 
				
			||||||
                        IsWe()
 | 
					                        IsWe()
 | 
				
			||||||
                        && int( gettimeofday() / 86400 ) == int(
 | 
					                        && int( ::gettimeofday() / 86400 ) == int(
 | 
				
			||||||
                            computeAlignTime(
 | 
					                            ::computeAlignTime(
 | 
				
			||||||
                                '24:00',
 | 
					                                '24:00',
 | 
				
			||||||
                                $FHEM::Automation::ShuttersControl::shutters
 | 
					                                $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
                                  ->getTimeUpWeHoliday
 | 
					                                  ->getTimeUpWeHoliday
 | 
				
			||||||
@@ -758,13 +754,13 @@ sub ShuttersSunrise {
 | 
				
			|||||||
                        )
 | 
					                        )
 | 
				
			||||||
                      )
 | 
					                      )
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        $shuttersSunriseUnixtime = computeAlignTime( '24:00',
 | 
					                        $shuttersSunriseUnixtime = ::computeAlignTime( '24:00',
 | 
				
			||||||
                            $FHEM::Automation::ShuttersControl::shutters
 | 
					                            $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
                              ->getTimeUpWeHoliday );
 | 
					                              ->getTimeUpWeHoliday );
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    elsif (
 | 
					                    elsif (
 | 
				
			||||||
                        int( gettimeofday() / 86400 ) == int(
 | 
					                        int( ::gettimeofday() / 86400 ) == int(
 | 
				
			||||||
                            computeAlignTime(
 | 
					                            ::computeAlignTime(
 | 
				
			||||||
                                '24:00',
 | 
					                                '24:00',
 | 
				
			||||||
                                $FHEM::Automation::ShuttersControl::shutters
 | 
					                                $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
                                  ->getTimeUpEarly
 | 
					                                  ->getTimeUpEarly
 | 
				
			||||||
@@ -772,13 +768,13 @@ sub ShuttersSunrise {
 | 
				
			|||||||
                        )
 | 
					                        )
 | 
				
			||||||
                      )
 | 
					                      )
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        $shuttersSunriseUnixtime = computeAlignTime( '24:00',
 | 
					                        $shuttersSunriseUnixtime = ::computeAlignTime( '24:00',
 | 
				
			||||||
                            $FHEM::Automation::ShuttersControl::shutters
 | 
					                            $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
                              ->getTimeUpEarly );
 | 
					                              ->getTimeUpEarly );
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    elsif (
 | 
					                    elsif (
 | 
				
			||||||
                        int( gettimeofday() / 86400 ) != int(
 | 
					                        int( ::gettimeofday() / 86400 ) != int(
 | 
				
			||||||
                            computeAlignTime(
 | 
					                            ::computeAlignTime(
 | 
				
			||||||
                                '24:00',
 | 
					                                '24:00',
 | 
				
			||||||
                                $FHEM::Automation::ShuttersControl::shutters
 | 
					                                $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
                                  ->getTimeUpWeHoliday
 | 
					                                  ->getTimeUpWeHoliday
 | 
				
			||||||
@@ -786,19 +782,19 @@ sub ShuttersSunrise {
 | 
				
			|||||||
                        )
 | 
					                        )
 | 
				
			||||||
                      )
 | 
					                      )
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        $shuttersSunriseUnixtime = computeAlignTime( '24:00',
 | 
					                        $shuttersSunriseUnixtime = ::computeAlignTime( '24:00',
 | 
				
			||||||
                            $FHEM::Automation::ShuttersControl::shutters
 | 
					                            $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
                              ->getTimeUpWeHoliday );
 | 
					                              ->getTimeUpWeHoliday );
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    else {
 | 
					                    else {
 | 
				
			||||||
                        $shuttersSunriseUnixtime = computeAlignTime( '24:00',
 | 
					                        $shuttersSunriseUnixtime = ::computeAlignTime( '24:00',
 | 
				
			||||||
                            $FHEM::Automation::ShuttersControl::shutters
 | 
					                            $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
                              ->getTimeUpWeHoliday ) + 86400;
 | 
					                              ->getTimeUpWeHoliday ) + 86400;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else {
 | 
					            else {
 | 
				
			||||||
                $shuttersSunriseUnixtime = computeAlignTime( '24:00',
 | 
					                $shuttersSunriseUnixtime = ::computeAlignTime( '24:00',
 | 
				
			||||||
                    $FHEM::Automation::ShuttersControl::shutters
 | 
					                    $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
                      ->getTimeUpEarly );
 | 
					                      ->getTimeUpEarly );
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -806,15 +802,14 @@ sub ShuttersSunrise {
 | 
				
			|||||||
        elsif ( $FHEM::Automation::ShuttersControl::shutters->getUp eq
 | 
					        elsif ( $FHEM::Automation::ShuttersControl::shutters->getUp eq
 | 
				
			||||||
            'brightness' )
 | 
					            'brightness' )
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            $shuttersSunriseUnixtime = computeAlignTime( '24:00',
 | 
					            $shuttersSunriseUnixtime = ::computeAlignTime( '24:00',
 | 
				
			||||||
                $FHEM::Automation::ShuttersControl::shutters->getTimeUpLate
 | 
					                $FHEM::Automation::ShuttersControl::shutters->getTimeUpLate );
 | 
				
			||||||
            );
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return $shuttersSunriseUnixtime;
 | 
					        return $shuttersSunriseUnixtime;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    elsif ( $tm eq 'real' ) {
 | 
					    elsif ( $tm eq 'real' ) {
 | 
				
			||||||
        return sunrise_abs(
 | 
					        return ::sunrise_abs(
 | 
				
			||||||
            $autoAstroMode,
 | 
					            $autoAstroMode,
 | 
				
			||||||
            0,
 | 
					            0,
 | 
				
			||||||
            $FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly,
 | 
					            $FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly,
 | 
				
			||||||
@@ -858,15 +853,15 @@ sub ShuttersSunset {
 | 
				
			|||||||
    my $oldFuncHash =
 | 
					    my $oldFuncHash =
 | 
				
			||||||
      $FHEM::Automation::ShuttersControl::shutters->getInTimerFuncHash;
 | 
					      $FHEM::Automation::ShuttersControl::shutters->getInTimerFuncHash;
 | 
				
			||||||
    my $shuttersSunsetUnixtime =
 | 
					    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 ( $tm eq 'unix' ) {
 | 
				
			||||||
        if ( $FHEM::Automation::ShuttersControl::shutters->getDown eq 'astro' )
 | 
					        if ( $FHEM::Automation::ShuttersControl::shutters->getDown eq 'astro' )
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            $shuttersSunsetUnixtime = (
 | 
					            $shuttersSunsetUnixtime = (
 | 
				
			||||||
                computeAlignTime(
 | 
					                ::computeAlignTime(
 | 
				
			||||||
                    '24:00',
 | 
					                    '24:00',
 | 
				
			||||||
                    sunset_abs(
 | 
					                    ::sunset_abs(
 | 
				
			||||||
                        $autoAstroMode,
 | 
					                        $autoAstroMode,
 | 
				
			||||||
                        0,
 | 
					                        0,
 | 
				
			||||||
                        $FHEM::Automation::ShuttersControl::shutters
 | 
					                        $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
@@ -880,13 +875,13 @@ sub ShuttersSunset {
 | 
				
			|||||||
                $shuttersSunsetUnixtime += 86400
 | 
					                $shuttersSunsetUnixtime += 86400
 | 
				
			||||||
                  if ( $shuttersSunsetUnixtime <
 | 
					                  if ( $shuttersSunsetUnixtime <
 | 
				
			||||||
                    ( $oldFuncHash->{sunsettime} + 180 )
 | 
					                    ( $oldFuncHash->{sunsettime} + 180 )
 | 
				
			||||||
                    && $oldFuncHash->{sunsettime} < gettimeofday() );
 | 
					                    && $oldFuncHash->{sunsettime} < ::gettimeofday() );
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        elsif (
 | 
					        elsif (
 | 
				
			||||||
            $FHEM::Automation::ShuttersControl::shutters->getDown eq 'time' )
 | 
					            $FHEM::Automation::ShuttersControl::shutters->getDown eq 'time' )
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            $shuttersSunsetUnixtime = computeAlignTime( '24:00',
 | 
					            $shuttersSunsetUnixtime = ::computeAlignTime( '24:00',
 | 
				
			||||||
                $FHEM::Automation::ShuttersControl::shutters->getTimeDownEarly
 | 
					                $FHEM::Automation::ShuttersControl::shutters->getTimeDownEarly
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -894,13 +889,13 @@ sub ShuttersSunset {
 | 
				
			|||||||
            'brightness' )
 | 
					            'brightness' )
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            $shuttersSunsetUnixtime =
 | 
					            $shuttersSunsetUnixtime =
 | 
				
			||||||
              computeAlignTime( '24:00',
 | 
					              ::computeAlignTime( '24:00',
 | 
				
			||||||
                $FHEM::Automation::ShuttersControl::shutters->getTimeDownLate );
 | 
					                $FHEM::Automation::ShuttersControl::shutters->getTimeDownLate );
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return $shuttersSunsetUnixtime;
 | 
					        return $shuttersSunsetUnixtime;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    elsif ( $tm eq 'real' ) {
 | 
					    elsif ( $tm eq 'real' ) {
 | 
				
			||||||
        return sunset_abs(
 | 
					        return ::sunset_abs(
 | 
				
			||||||
            $autoAstroMode,
 | 
					            $autoAstroMode,
 | 
				
			||||||
            0,
 | 
					            0,
 | 
				
			||||||
            $FHEM::Automation::ShuttersControl::shutters->getTimeDownEarly,
 | 
					            $FHEM::Automation::ShuttersControl::shutters->getTimeDownEarly,
 | 
				
			||||||
@@ -923,7 +918,7 @@ sub IsAfterShuttersTimeBlocking {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if (
 | 
					    if (
 | 
				
			||||||
        (
 | 
					        (
 | 
				
			||||||
            int( gettimeofday() ) -
 | 
					            int( ::gettimeofday() ) -
 | 
				
			||||||
            $FHEM::Automation::ShuttersControl::shutters->getLastManPosTimestamp
 | 
					            $FHEM::Automation::ShuttersControl::shutters->getLastManPosTimestamp
 | 
				
			||||||
        ) <
 | 
					        ) <
 | 
				
			||||||
        $FHEM::Automation::ShuttersControl::shutters->getBlockingTimeAfterManual
 | 
					        $FHEM::Automation::ShuttersControl::shutters->getBlockingTimeAfterManual
 | 
				
			||||||
@@ -933,7 +928,7 @@ sub IsAfterShuttersTimeBlocking {
 | 
				
			|||||||
                $FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime
 | 
					                $FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            && $FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime
 | 
					            && $FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime
 | 
				
			||||||
            - ( int( gettimeofday() ) ) <
 | 
					            - ( int( ::gettimeofday() ) ) <
 | 
				
			||||||
            $FHEM::Automation::ShuttersControl::shutters
 | 
					            $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
            ->getBlockingTimeBeforDayOpen
 | 
					            ->getBlockingTimeBeforDayOpen
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
@@ -943,7 +938,7 @@ sub IsAfterShuttersTimeBlocking {
 | 
				
			|||||||
                $FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime
 | 
					                $FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            && $FHEM::Automation::ShuttersControl::shutters->getSunsetUnixTime
 | 
					            && $FHEM::Automation::ShuttersControl::shutters->getSunsetUnixTime
 | 
				
			||||||
            - ( int( gettimeofday() ) ) <
 | 
					            - ( int( ::gettimeofday() ) ) <
 | 
				
			||||||
            $FHEM::Automation::ShuttersControl::shutters
 | 
					            $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
            ->getBlockingTimeBeforNightClose
 | 
					            ->getBlockingTimeBeforNightClose
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
@@ -982,7 +977,7 @@ sub IsAfterShuttersManualBlocking {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    elsif (
 | 
					    elsif (
 | 
				
			||||||
        (
 | 
					        (
 | 
				
			||||||
            int( gettimeofday() ) -
 | 
					            int( ::gettimeofday() ) -
 | 
				
			||||||
            $FHEM::Automation::ShuttersControl::shutters->getLastManPosTimestamp
 | 
					            $FHEM::Automation::ShuttersControl::shutters->getLastManPosTimestamp
 | 
				
			||||||
        ) <
 | 
					        ) <
 | 
				
			||||||
        $FHEM::Automation::ShuttersControl::shutters->getBlockingTimeAfterManual
 | 
					        $FHEM::Automation::ShuttersControl::shutters->getBlockingTimeAfterManual
 | 
				
			||||||
@@ -1019,7 +1014,7 @@ sub PerlCodeCheck {
 | 
				
			|||||||
sub IsAdv {
 | 
					sub IsAdv {
 | 
				
			||||||
    use HTTP::Date;
 | 
					    use HTTP::Date;
 | 
				
			||||||
    my ( undef, undef, undef, $monthday, $month, $year, undef, undef, undef ) =
 | 
					    my ( undef, undef, undef, $monthday, $month, $year, undef, undef, undef ) =
 | 
				
			||||||
      localtime( gettimeofday() );
 | 
					      localtime( ::gettimeofday() );
 | 
				
			||||||
    my $adv = 0;
 | 
					    my $adv = 0;
 | 
				
			||||||
    $year += 1900;
 | 
					    $year += 1900;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1032,11 +1027,12 @@ sub IsAdv {
 | 
				
			|||||||
        my $time = str2time( $year . '-12-25' );
 | 
					        my $time = str2time( $year . '-12-25' );
 | 
				
			||||||
        my $wday = ( localtime($time) )[6];
 | 
					        my $wday = ( localtime($time) )[6];
 | 
				
			||||||
        $wday = $wday ? $wday : 7;
 | 
					        $wday = $wday ? $wday : 7;
 | 
				
			||||||
        $time -= ( $FHEM::Automation::ShuttersControl::ascDev
 | 
					        $time -= (
 | 
				
			||||||
            ->getAdvDate eq 'DeadSunday'
 | 
					            $FHEM::Automation::ShuttersControl::ascDev->getAdvDate eq
 | 
				
			||||||
              ? ($wday + 27) * 86400
 | 
					              'DeadSunday'
 | 
				
			||||||
              : ($wday + 21) * 86400
 | 
					            ? ( $wday + 27 ) * 86400
 | 
				
			||||||
          );
 | 
					            : ( $wday + 21 ) * 86400
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
        $adv = 1 if ( $time < time );
 | 
					        $adv = 1 if ( $time < time );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1046,15 +1042,16 @@ sub IsAdv {
 | 
				
			|||||||
sub IsInTime {
 | 
					sub IsInTime {
 | 
				
			||||||
    my $dfi = shift;
 | 
					    my $dfi = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $dfi =~ s/{([^\x7d]*)}/$cmdFromAnalyze=$1; eval $1/ge; # Forum #69787
 | 
					    $dfi =~ s/{([^\x7d]*)}/$cmdFromAnalyze=$1; eval $1/ge;    # Forum #69787
 | 
				
			||||||
    my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime(gettimeofday());
 | 
					    my ( $sec, $min, $hour, $mday, $month, $year, $wday, $yday, $isdst ) =
 | 
				
			||||||
    my $dhms = sprintf("%s\@%02d:%02d:%02d", $wday, $hour, $min, $sec);
 | 
					      localtime( ::gettimeofday() );
 | 
				
			||||||
    foreach my $ft (split(" ", $dfi)) {
 | 
					    my $dhms = sprintf( "%s\@%02d:%02d:%02d", $wday, $hour, $min, $sec );
 | 
				
			||||||
        my ($from, $to) = split("-", $ft);
 | 
					    foreach my $ft ( split( " ", $dfi ) ) {
 | 
				
			||||||
        if(defined($from) && defined($to)) {
 | 
					        my ( $from, $to ) = split( "-", $ft );
 | 
				
			||||||
            $from = "$wday\@$from" if(index($from,"@") < 0);
 | 
					        if ( defined($from) && defined($to) ) {
 | 
				
			||||||
            $to   = "$wday\@$to"   if(index($to,  "@") < 0);
 | 
					            $from = "$wday\@$from" if ( index( $from, "@" ) < 0 );
 | 
				
			||||||
            return 1 if($from le $dhms && $dhms le $to);
 | 
					            $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
 | 
					#  All rights reserved
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
#   Special thanks goes to:
 | 
					#   Special thanks goes to:
 | 
				
			||||||
@@ -59,12 +59,11 @@ our %EXPORT_TAGS = (
 | 
				
			|||||||
    ],
 | 
					    ],
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
sub RainProcessing {
 | 
					sub RainProcessing {
 | 
				
			||||||
    my ( $hash, $val, $triggerMax, $triggerMin ) = @_;
 | 
					    my ( $hash, $val, $triggerMax, $triggerMin ) = @_;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    my $rainClosedPos = $FHEM::Automation::ShuttersControl::ascDev
 | 
					    my $rainClosedPos = $FHEM::Automation::ShuttersControl::ascDev
 | 
				
			||||||
          ->getRainSensorShuttersClosedPos;
 | 
					      ->getRainSensorShuttersClosedPos;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
 | 
					    for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
 | 
				
			||||||
        $FHEM::Automation::ShuttersControl::shutters->setShuttersDev(
 | 
					        $FHEM::Automation::ShuttersControl::shutters->setShuttersDev(
 | 
				
			||||||
@@ -75,46 +74,50 @@ sub RainProcessing {
 | 
				
			|||||||
            $FHEM::Automation::ShuttersControl::shutters->getRainProtection eq
 | 
					            $FHEM::Automation::ShuttersControl::shutters->getRainProtection eq
 | 
				
			||||||
            'off' );
 | 
					            'off' );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (   $val > $triggerMax
 | 
					        if (
 | 
				
			||||||
 | 
					               $val > $triggerMax
 | 
				
			||||||
            && $FHEM::Automation::ShuttersControl::shutters->getStatus !=
 | 
					            && $FHEM::Automation::ShuttersControl::shutters->getStatus !=
 | 
				
			||||||
            $rainClosedPos
 | 
					            $rainClosedPos
 | 
				
			||||||
            && $FHEM::Automation::ShuttersControl::shutters
 | 
					            && $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
                 ->getRainProtectionStatus eq 'unprotected'
 | 
					            ->getRainProtectionStatus eq 'unprotected'
 | 
				
			||||||
            || ( $FHEM::Automation::ShuttersControl::shutters
 | 
					            || ( $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
                   ->getRainProtectionStatus eq 'unprotected'
 | 
					                ->getRainProtectionStatus eq 'unprotected'
 | 
				
			||||||
              && $FHEM::Automation::ShuttersControl::shutters
 | 
					                && $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
                   ->getRainUnprotectionDelayObj ne 'none')
 | 
					                ->getRainUnprotectionDelayObj ne 'none' )
 | 
				
			||||||
          )
 | 
					          )
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            _RainProtected();
 | 
					            _RainProtected();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        elsif ( ( $val == 0 || $val < $triggerMin )
 | 
					        elsif ( ( $val == 0 || $val < $triggerMin )
 | 
				
			||||||
            && $FHEM::Automation::ShuttersControl::shutters->getStatus ==
 | 
					            && $FHEM::Automation::ShuttersControl::shutters->getStatus ==
 | 
				
			||||||
              $rainClosedPos
 | 
					            $rainClosedPos
 | 
				
			||||||
            && IsAfterShuttersManualBlocking($shuttersDev)
 | 
					            && IsAfterShuttersManualBlocking($shuttersDev)
 | 
				
			||||||
            && $FHEM::Automation::ShuttersControl::shutters
 | 
					            && $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
                 ->getRainProtectionStatus eq 'protected' )
 | 
					            ->getRainProtectionStatus eq 'protected' )
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            my %funcHash = (
 | 
					            my %funcHash = ( shuttersdevice => $shuttersDev, );
 | 
				
			||||||
                shuttersdevice => $shuttersDev,
 | 
					 | 
				
			||||||
            );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            $FHEM::Automation::ShuttersControl::shutters->setRainUnprotectionDelayObj(\%funcHash);
 | 
					 | 
				
			||||||
            ::InternalTimer( ::gettimeofday() + $FHEM::Automation::ShuttersControl::ascDev->getRainWaitingTime
 | 
					 | 
				
			||||||
                , \&_RainUnprotected
 | 
					 | 
				
			||||||
                , \%funcHash );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            $FHEM::Automation::ShuttersControl::shutters
 | 
					            $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
                ->setRainProtectionStatus('unprotected');
 | 
					              ->setRainUnprotectionDelayObj( \%funcHash );
 | 
				
			||||||
 | 
					            ::InternalTimer(
 | 
				
			||||||
 | 
					                ::gettimeofday() +
 | 
				
			||||||
 | 
					                  $FHEM::Automation::ShuttersControl::ascDev
 | 
				
			||||||
 | 
					                  ->getRainWaitingTime,
 | 
				
			||||||
 | 
					                \&_RainUnprotected, \%funcHash
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
 | 
					              ->setRainProtectionStatus('unprotected');
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else {
 | 
					        else {
 | 
				
			||||||
            if (  $FHEM::Automation::ShuttersControl::shutters->getStatus != $rainClosedPos
 | 
					            if ( $FHEM::Automation::ShuttersControl::shutters->getStatus !=
 | 
				
			||||||
              && ($val == 0 || $val < $triggerMin) )
 | 
					                $rainClosedPos
 | 
				
			||||||
 | 
					                && ( $val == 0 || $val < $triggerMin ) )
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                $FHEM::Automation::ShuttersControl::shutters
 | 
					                $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
                  ->setRainProtectionStatus('unprotected');
 | 
					                  ->setRainProtectionStatus('unprotected');
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            elsif ($val > $triggerMax) {
 | 
					            elsif ( $val > $triggerMax ) {
 | 
				
			||||||
                $FHEM::Automation::ShuttersControl::shutters
 | 
					                $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
                  ->setRainProtectionStatus('protected');
 | 
					                  ->setRainProtectionStatus('protected');
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -126,58 +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
 | 
					### 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 {
 | 
					sub _RainProtected {
 | 
				
			||||||
    ::RemoveInternalTimer($FHEM::Automation::ShuttersControl::shutters->getRainUnprotectionDelayObj)
 | 
					    ::RemoveInternalTimer( $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
        if($FHEM::Automation::ShuttersControl::shutters->getRainUnprotectionDelayObj ne 'none');
 | 
					          ->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(
 | 
					    $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
 | 
				
			||||||
            'rain protected');
 | 
					        'rain protected');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $FHEM::Automation::ShuttersControl::shutters->setDriveCmd(
 | 
					    $FHEM::Automation::ShuttersControl::shutters->setDriveCmd(
 | 
				
			||||||
        $FHEM::Automation::ShuttersControl::ascDev
 | 
					        $FHEM::Automation::ShuttersControl::ascDev
 | 
				
			||||||
    ->getRainSensorShuttersClosedPos);
 | 
					          ->getRainSensorShuttersClosedPos );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $FHEM::Automation::ShuttersControl::shutters
 | 
					    $FHEM::Automation::ShuttersControl::shutters->setRainProtectionStatus(
 | 
				
			||||||
        ->setRainProtectionStatus('protected');
 | 
					        'protected');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub _RainUnprotected {
 | 
					sub _RainUnprotected {
 | 
				
			||||||
    my $h = shift;
 | 
					    my $h = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    my $shuttersDev = $h->{shuttersdevice};
 | 
					    my $shuttersDev = $h->{shuttersdevice};
 | 
				
			||||||
    $FHEM::Automation::ShuttersControl::shutters->setShuttersDev(
 | 
					    $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
 | 
				
			||||||
            $shuttersDev);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
 | 
					    $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
 | 
				
			||||||
            'rain un-protected');
 | 
					        'rain un-protected');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if ( $FHEM::Automation::ShuttersControl::shutters->getRainUnprotectionDelayObj ne 'none' ) {
 | 
					    if ( $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
        ::RemoveInternalTimer($FHEM::Automation::ShuttersControl::shutters->getRainUnprotectionDelayObj);
 | 
					        ->getRainUnprotectionDelayObj ne 'none' )
 | 
				
			||||||
        $FHEM::Automation::ShuttersControl::shutters->setRainUnprotectionDelayObj('none');
 | 
					    {
 | 
				
			||||||
 | 
					        ::RemoveInternalTimer( $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
 | 
					              ->getRainUnprotectionDelayObj );
 | 
				
			||||||
 | 
					        $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
 | 
					          ->setRainUnprotectionDelayObj('none');
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $FHEM::Automation::ShuttersControl::shutters->setDriveCmd(
 | 
					    $FHEM::Automation::ShuttersControl::shutters->setDriveCmd(
 | 
				
			||||||
        (
 | 
					        (
 | 
				
			||||||
                $FHEM::Automation::ShuttersControl::shutters->getIsDay
 | 
					              $FHEM::Automation::ShuttersControl::shutters->getIsDay
 | 
				
			||||||
            ? $FHEM::Automation::ShuttersControl::shutters->getLastPos
 | 
					            ? $FHEM::Automation::ShuttersControl::shutters->getLastPos
 | 
				
			||||||
            : (
 | 
					            : (
 | 
				
			||||||
                $FHEM::Automation::ShuttersControl::shutters
 | 
					                $FHEM::Automation::ShuttersControl::shutters->getShuttersPlace
 | 
				
			||||||
                    ->getPrivacyDownStatus == 2
 | 
					                  eq 'awning'
 | 
				
			||||||
                ? $FHEM::Automation::ShuttersControl::shutters
 | 
					                ? $FHEM::Automation::ShuttersControl::shutters->getOpenPos
 | 
				
			||||||
                    ->getPrivacyDownPos
 | 
					                : (
 | 
				
			||||||
                : $FHEM::Automation::ShuttersControl::shutters
 | 
					                    $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
                    ->getClosedPos
 | 
					                      ->getPrivacyDownStatus == 2
 | 
				
			||||||
 | 
					                    ? $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
 | 
					                      ->getPrivacyDownPos
 | 
				
			||||||
 | 
					                    : $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
 | 
					                      ->getClosedPos
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
    )
 | 
					    ) if ( IsAfterShuttersTimeBlocking($shuttersDev) );
 | 
				
			||||||
    if (IsAfterShuttersTimeBlocking($shuttersDev));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $FHEM::Automation::ShuttersControl::shutters
 | 
					    $FHEM::Automation::ShuttersControl::shutters->setRainProtectionStatus(
 | 
				
			||||||
        ->setRainProtectionStatus('unprotected');
 | 
					        'unprotected');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
1;
 | 
					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
 | 
					#  All rights reserved
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
#   Special thanks goes to:
 | 
					#   Special thanks goes to:
 | 
				
			||||||
@@ -44,37 +44,24 @@ use strict;
 | 
				
			|||||||
use warnings;
 | 
					use warnings;
 | 
				
			||||||
use utf8;
 | 
					use utf8;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use GPUtils qw(GP_Import);
 | 
					sub getRoommateStatus {
 | 
				
			||||||
 | 
					 | 
				
			||||||
## Import der FHEM Funktionen
 | 
					 | 
				
			||||||
BEGIN {
 | 
					 | 
				
			||||||
    GP_Import(
 | 
					 | 
				
			||||||
        qw(
 | 
					 | 
				
			||||||
          ReadingsVal)
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
sub _getRoommateStatus {
 | 
					 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    my $roommate = $self->{roommate};
 | 
					    my $roommate = $self->{roommate};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return ReadingsVal( $roommate,
 | 
					    return ::ReadingsVal( $roommate,
 | 
				
			||||||
        $FHEM::Automation::ShuttersControl::shutters->getRoommatesReading,
 | 
					        $FHEM::Automation::ShuttersControl::shutters->getRoommatesReading,
 | 
				
			||||||
        'none' );
 | 
					        'none' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub _getRoommateLastStatus {
 | 
					sub getRoommateLastStatus {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    my $roommate = $self->{roommate};
 | 
					    my $roommate = $self->{roommate};
 | 
				
			||||||
    my $default  = $self->{defaultarg};
 | 
					    my $default  = $self->{defaultarg};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $default = 'none' if ( !defined($default) );
 | 
					    $default = 'none' if ( !defined($default) );
 | 
				
			||||||
    return ReadingsVal( $roommate, 'lastState', $default );
 | 
					    return ::ReadingsVal( $roommate, 'lastState', $default );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
1;
 | 
					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
 | 
					#  All rights reserved
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
#   Special thanks goes to:
 | 
					#   Special thanks goes to:
 | 
				
			||||||
@@ -64,27 +64,9 @@ our %EXPORT_TAGS = (
 | 
				
			|||||||
    ],
 | 
					    ],
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use GPUtils qw(GP_Import);
 | 
					 | 
				
			||||||
## Import der FHEM Funktionen
 | 
					 | 
				
			||||||
BEGIN {
 | 
					 | 
				
			||||||
    GP_Import(
 | 
					 | 
				
			||||||
        qw(
 | 
					 | 
				
			||||||
          Log3
 | 
					 | 
				
			||||||
          gettimeofday
 | 
					 | 
				
			||||||
          InternalTimer
 | 
					 | 
				
			||||||
          ReadingsVal
 | 
					 | 
				
			||||||
          readingsBeginUpdate
 | 
					 | 
				
			||||||
          readingsBulkUpdate
 | 
					 | 
				
			||||||
          readingsBulkUpdateIfChanged
 | 
					 | 
				
			||||||
          readingsEndUpdate
 | 
					 | 
				
			||||||
          defs
 | 
					 | 
				
			||||||
          )
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
sub CheckASC_ConditionsForShadingFn {
 | 
					sub CheckASC_ConditionsForShadingFn {
 | 
				
			||||||
    my $hash    = shift;
 | 
					    my $hash  = shift;
 | 
				
			||||||
    my $value   = shift;
 | 
					    my $value = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    my $error;
 | 
					    my $error;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -98,14 +80,14 @@ sub CheckASC_ConditionsForShadingFn {
 | 
				
			|||||||
    my $count = 1;
 | 
					    my $count = 1;
 | 
				
			||||||
    for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
 | 
					    for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
 | 
				
			||||||
        my %funcHash = (
 | 
					        my %funcHash = (
 | 
				
			||||||
            hash            => $hash,
 | 
					            hash           => $hash,
 | 
				
			||||||
            shuttersdevice  => $shuttersDev,
 | 
					            shuttersdevice => $shuttersDev,
 | 
				
			||||||
            value           => $value,
 | 
					            value          => $value,
 | 
				
			||||||
            attrEvent       => 0,
 | 
					            attrEvent      => 0,
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        InternalTimer(
 | 
					        ::InternalTimer(
 | 
				
			||||||
            gettimeofday() + $count,
 | 
					            ::gettimeofday() + $count,
 | 
				
			||||||
'FHEM::Automation::ShuttersControl::Shading::_CheckShuttersConditionsForShadingFn',
 | 
					'FHEM::Automation::ShuttersControl::Shading::_CheckShuttersConditionsForShadingFn',
 | 
				
			||||||
            \%funcHash
 | 
					            \%funcHash
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
@@ -121,14 +103,14 @@ sub CheckASC_ConditionsForShadingFn {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub _CheckShuttersConditionsForShadingFn {
 | 
					sub _CheckShuttersConditionsForShadingFn {
 | 
				
			||||||
    my $funcHash    = shift;
 | 
					    my $funcHash = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    my $hash        = $funcHash->{hash};
 | 
					    my $hash        = $funcHash->{hash};
 | 
				
			||||||
    my $shuttersDev = $funcHash->{shuttersdevice};
 | 
					    my $shuttersDev = $funcHash->{shuttersdevice};
 | 
				
			||||||
    my $value       = $funcHash->{value};
 | 
					    my $value       = $funcHash->{value};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
 | 
					    $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
 | 
				
			||||||
    my $shuttersDevHash = $defs{$shuttersDev};
 | 
					    my $shuttersDevHash = $::defs{$shuttersDev};
 | 
				
			||||||
    my $message         = '';
 | 
					    my $message         = '';
 | 
				
			||||||
    my $errorMessage;
 | 
					    my $errorMessage;
 | 
				
			||||||
    my $warnMessage;
 | 
					    my $warnMessage;
 | 
				
			||||||
@@ -136,71 +118,78 @@ sub _CheckShuttersConditionsForShadingFn {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if ( $value eq 'off' ) {
 | 
					    if ( $value eq 'off' ) {
 | 
				
			||||||
        $FHEM::Automation::ShuttersControl::shutters->setShadingStatus('out');
 | 
					        $FHEM::Automation::ShuttersControl::shutters->setShadingStatus('out');
 | 
				
			||||||
        $infoMessage    .= ' shading was deactivated ' . ($funcHash->{attrEvent} ? 'in the device' : 'globally');
 | 
					        $infoMessage .= ' shading was deactivated '
 | 
				
			||||||
        $errorMessage   .= '';
 | 
					          . ( $funcHash->{attrEvent} ? 'in the device' : 'globally' );
 | 
				
			||||||
 | 
					        $errorMessage .= '';
 | 
				
			||||||
        ShadingProcessingDriveCommand( $hash, $shuttersDev );
 | 
					        ShadingProcessingDriveCommand( $hash, $shuttersDev );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else {
 | 
					    else {
 | 
				
			||||||
        $infoMessage .= (
 | 
					        $infoMessage .= (
 | 
				
			||||||
            $FHEM::Automation::ShuttersControl::shutters->getShadingMode ne 'off'
 | 
					            $FHEM::Automation::ShuttersControl::shutters->getShadingMode ne
 | 
				
			||||||
            && $FHEM::Automation::ShuttersControl::ascDev
 | 
					              'off'
 | 
				
			||||||
            ->getAutoShuttersControlShading eq 'on'
 | 
					              && $FHEM::Automation::ShuttersControl::ascDev
 | 
				
			||||||
            && $FHEM::Automation::ShuttersControl::shutters->getOutTemp == -100
 | 
					              ->getAutoShuttersControlShading eq 'on'
 | 
				
			||||||
 | 
					              && $FHEM::Automation::ShuttersControl::shutters->getOutTemp ==
 | 
				
			||||||
 | 
					              -100
 | 
				
			||||||
            ? ' shading active, global temp sensor is set, but shutters temperature sensor is not set'
 | 
					            ? ' shading active, global temp sensor is set, but shutters temperature sensor is not set'
 | 
				
			||||||
            : ''
 | 
					            : ''
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $warnMessage .= (
 | 
					        $warnMessage .= (
 | 
				
			||||||
            $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq 'off'
 | 
					            $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq
 | 
				
			||||||
            && $FHEM::Automation::ShuttersControl::ascDev
 | 
					              'off'
 | 
				
			||||||
            ->getAutoShuttersControlShading eq 'on'
 | 
					              && $FHEM::Automation::ShuttersControl::ascDev
 | 
				
			||||||
 | 
					              ->getAutoShuttersControlShading eq 'on'
 | 
				
			||||||
            ? ' global shading active but ASC_Shading_Mode attribut is not set or off'
 | 
					            ? ' global shading active but ASC_Shading_Mode attribut is not set or off'
 | 
				
			||||||
            : ''
 | 
					            : ''
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $errorMessage .= (
 | 
					        $errorMessage .= (
 | 
				
			||||||
            $FHEM::Automation::ShuttersControl::shutters->getShadingMode ne 'off'
 | 
					            $FHEM::Automation::ShuttersControl::shutters->getShadingMode ne
 | 
				
			||||||
            && $FHEM::Automation::ShuttersControl::ascDev
 | 
					              'off'
 | 
				
			||||||
            ->getAutoShuttersControlShading ne 'on'
 | 
					              && $FHEM::Automation::ShuttersControl::ascDev
 | 
				
			||||||
            && $FHEM::Automation::ShuttersControl::ascDev
 | 
					              ->getAutoShuttersControlShading ne 'on'
 | 
				
			||||||
            ->getAutoShuttersControlShading ne 'off'
 | 
					              && $FHEM::Automation::ShuttersControl::ascDev
 | 
				
			||||||
 | 
					              ->getAutoShuttersControlShading ne 'off'
 | 
				
			||||||
            ? ' ASC_Shading_Mode attribut is set but global shading has errors, look at ASC device '
 | 
					            ? ' ASC_Shading_Mode attribut is set but global shading has errors, look at ASC device '
 | 
				
			||||||
            . '<a href="'
 | 
					              . '<a href="'
 | 
				
			||||||
            . '/fhem?detail='
 | 
					              . '/fhem?detail='
 | 
				
			||||||
            . ReadingsVal( $shuttersDev, 'associatedWith', 'ASC device' )
 | 
					              . ::ReadingsVal( $shuttersDev, 'associatedWith', 'ASC device' )
 | 
				
			||||||
            . $::FW_CSRF . '">'
 | 
					              . $::FW_CSRF . '">'
 | 
				
			||||||
            . ReadingsVal( $shuttersDev, 'associatedWith', 'ASC device' )
 | 
					              . ::ReadingsVal( $shuttersDev, 'associatedWith', 'ASC device' )
 | 
				
			||||||
            . '</a>'
 | 
					              . '</a>'
 | 
				
			||||||
            : ''
 | 
					            : ''
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $errorMessage .= (
 | 
					        $errorMessage .= (
 | 
				
			||||||
            $FHEM::Automation::ShuttersControl::shutters->getBrightness == -1
 | 
					            $FHEM::Automation::ShuttersControl::shutters->getBrightness == -1
 | 
				
			||||||
            && $FHEM::Automation::ShuttersControl::shutters->getShadingMode ne
 | 
					              && $FHEM::Automation::ShuttersControl::shutters->getShadingMode
 | 
				
			||||||
            'off'
 | 
					              ne 'off'
 | 
				
			||||||
            ? ' no brightness sensor found, please set ASC_BrightnessSensor attribut'
 | 
					            ? ' no brightness sensor found, please set ASC_BrightnessSensor attribut'
 | 
				
			||||||
            : ''
 | 
					            : ''
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $message .= ' ERROR: ' . $errorMessage
 | 
					    $message .= ' ERROR: ' . $errorMessage
 | 
				
			||||||
    if ( defined($errorMessage)
 | 
					      if ( defined($errorMessage)
 | 
				
			||||||
        && $errorMessage ne '' );
 | 
					        && $errorMessage ne '' );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $message .= ' WARN: ' . $warnMessage
 | 
					    $message .= ' WARN: ' . $warnMessage
 | 
				
			||||||
    if ( defined($warnMessage)
 | 
					      if ( defined($warnMessage)
 | 
				
			||||||
        && $warnMessage ne ''
 | 
					        && $warnMessage ne ''
 | 
				
			||||||
        && $errorMessage eq '' );
 | 
					        && $errorMessage eq '' );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $message .= ' INFO: ' . $infoMessage
 | 
					    $message .= ' INFO: ' . $infoMessage
 | 
				
			||||||
    if ( defined($infoMessage)
 | 
					      if ( defined($infoMessage)
 | 
				
			||||||
        && $infoMessage ne ''
 | 
					        && $infoMessage ne ''
 | 
				
			||||||
        && $errorMessage eq '' );
 | 
					        && $errorMessage eq '' );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    readingsBeginUpdate($shuttersDevHash);
 | 
					    ::readingsBeginUpdate($shuttersDevHash);
 | 
				
			||||||
    readingsBulkUpdateIfChanged( $shuttersDevHash, 'ASC_ShadingMessage',
 | 
					    ::readingsBulkUpdateIfChanged( $shuttersDevHash, 'ASC_ShadingMessage',
 | 
				
			||||||
        '<html>' . $message . ' </html>' );
 | 
					        '<html>' . $message . ' </html>' );
 | 
				
			||||||
    readingsEndUpdate( $shuttersDevHash, 1 );
 | 
					    ::readingsEndUpdate( $shuttersDevHash, 1 );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub ShadingProcessing {
 | 
					sub ShadingProcessing {
 | 
				
			||||||
@@ -216,11 +205,17 @@ sub ShadingProcessing {
 | 
				
			|||||||
    my $brightness =
 | 
					    my $brightness =
 | 
				
			||||||
      $FHEM::Automation::ShuttersControl::shutters->getBrightnessAverage;
 | 
					      $FHEM::Automation::ShuttersControl::shutters->getBrightnessAverage;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $FHEM::Automation::ShuttersControl::shutters->setShadingBetweenTheTimeSuspend(
 | 
					    $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
          ( IsInTime($FHEM::Automation::ShuttersControl::shutters->getShadingBetweenTheTime)
 | 
					      ->setShadingBetweenTheTimeSuspend(
 | 
				
			||||||
        ? 0
 | 
					        (
 | 
				
			||||||
        : 1 )
 | 
					            IsInTime(
 | 
				
			||||||
    );
 | 
					                $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
 | 
					                  ->getShadingBetweenTheTime
 | 
				
			||||||
 | 
					              )
 | 
				
			||||||
 | 
					            ? 0
 | 
				
			||||||
 | 
					            : 1
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    FHEM::Automation::ShuttersControl::ASC_Debug(
 | 
					    FHEM::Automation::ShuttersControl::ASC_Debug(
 | 
				
			||||||
            'ShadingProcessing: '
 | 
					            'ShadingProcessing: '
 | 
				
			||||||
@@ -250,7 +245,7 @@ sub ShadingProcessing {
 | 
				
			|||||||
          . ', Ist es nach der Hälfte der Beschattungswartezeit: '
 | 
					          . ', Ist es nach der Hälfte der Beschattungswartezeit: '
 | 
				
			||||||
          . (
 | 
					          . (
 | 
				
			||||||
            (
 | 
					            (
 | 
				
			||||||
                int( gettimeofday() ) -
 | 
					                int( ::gettimeofday() ) -
 | 
				
			||||||
                  $FHEM::Automation::ShuttersControl::shutters
 | 
					                  $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
                  ->getShadingStatusTimestamp
 | 
					                  ->getShadingStatusTimestamp
 | 
				
			||||||
            ) < (
 | 
					            ) < (
 | 
				
			||||||
@@ -260,7 +255,7 @@ sub ShadingProcessing {
 | 
				
			|||||||
          )
 | 
					          )
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Log3( $name, 4,
 | 
					    ::Log3( $name, 4,
 | 
				
			||||||
            "AutoShuttersControl ($name) - Shading Processing, Rollladen: "
 | 
					            "AutoShuttersControl ($name) - Shading Processing, Rollladen: "
 | 
				
			||||||
          . $shuttersDev
 | 
					          . $shuttersDev
 | 
				
			||||||
          . " Azimuth: "
 | 
					          . " Azimuth: "
 | 
				
			||||||
@@ -279,18 +274,20 @@ sub ShadingProcessing {
 | 
				
			|||||||
        || $brightness == -1
 | 
					        || $brightness == -1
 | 
				
			||||||
        || $outTemp == -100
 | 
					        || $outTemp == -100
 | 
				
			||||||
        || (
 | 
					        || (
 | 
				
			||||||
            int( gettimeofday() ) -
 | 
					            int( ::gettimeofday() ) -
 | 
				
			||||||
            $FHEM::Automation::ShuttersControl::shutters
 | 
					            $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
            ->getShadingStatusTimestamp ) < (
 | 
					            ->getShadingStatusTimestamp ) < (
 | 
				
			||||||
            $FHEM::Automation::ShuttersControl::shutters
 | 
					            $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
              ->getShadingWaitingPeriod / 2
 | 
					              ->getShadingWaitingPeriod / 2
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
 | 
					        || $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
 | 
					        ->getExternalTriggerStatus
 | 
				
			||||||
        || $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq 'off'
 | 
					        || $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq 'off'
 | 
				
			||||||
        || $FHEM::Automation::ShuttersControl::ascDev
 | 
					        || $FHEM::Automation::ShuttersControl::ascDev
 | 
				
			||||||
              ->getAutoShuttersControlShading eq 'off'
 | 
					        ->getAutoShuttersControlShading eq 'off'
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Log3( $name, 4,
 | 
					    ::Log3( $name, 4,
 | 
				
			||||||
            "AutoShuttersControl ($name) - Shading Processing, Rollladen: "
 | 
					            "AutoShuttersControl ($name) - Shading Processing, Rollladen: "
 | 
				
			||||||
          . $shuttersDev
 | 
					          . $shuttersDev
 | 
				
			||||||
          . " Nach dem return" );
 | 
					          . " Nach dem return" );
 | 
				
			||||||
@@ -300,7 +297,7 @@ sub ShadingProcessing {
 | 
				
			|||||||
    my $getStatus = $FHEM::Automation::ShuttersControl::shutters->getStatus;
 | 
					    my $getStatus = $FHEM::Automation::ShuttersControl::shutters->getStatus;
 | 
				
			||||||
    my $oldShadingStatus =
 | 
					    my $oldShadingStatus =
 | 
				
			||||||
      $FHEM::Automation::ShuttersControl::shutters->getShadingStatus;
 | 
					      $FHEM::Automation::ShuttersControl::shutters->getShadingStatus;
 | 
				
			||||||
    my $shuttersDevHash = $defs{$shuttersDev};
 | 
					    my $shuttersDevHash = $::defs{$shuttersDev};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    my $getModeUp = $FHEM::Automation::ShuttersControl::shutters->getModeUp;
 | 
					    my $getModeUp = $FHEM::Automation::ShuttersControl::shutters->getModeUp;
 | 
				
			||||||
    my $homemode  = $FHEM::Automation::ShuttersControl::shutters->getHomemode;
 | 
					    my $homemode  = $FHEM::Automation::ShuttersControl::shutters->getHomemode;
 | 
				
			||||||
@@ -316,9 +313,9 @@ sub ShadingProcessing {
 | 
				
			|||||||
            ->getShadingMinOutsideTemperature - 4
 | 
					            ->getShadingMinOutsideTemperature - 4
 | 
				
			||||||
            || $azimuth < $azimuthLeft
 | 
					            || $azimuth < $azimuthLeft
 | 
				
			||||||
            || $azimuth > $azimuthRight
 | 
					            || $azimuth > $azimuthRight
 | 
				
			||||||
            || (   !$FHEM::Automation::ShuttersControl::shutters->getIsDay
 | 
					            || (  !$FHEM::Automation::ShuttersControl::shutters->getIsDay
 | 
				
			||||||
                && $FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime
 | 
					                && $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
                  - ( int( gettimeofday() ) ) > 7200 )
 | 
					                ->getSunriseUnixTime - ( int( ::gettimeofday() ) ) > 7200 )
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && $FHEM::Automation::ShuttersControl::shutters->getShadingStatus ne
 | 
					        && $FHEM::Automation::ShuttersControl::shutters->getShadingStatus ne
 | 
				
			||||||
        'out'
 | 
					        'out'
 | 
				
			||||||
@@ -331,7 +328,7 @@ sub ShadingProcessing {
 | 
				
			|||||||
              . ' - Es ist Nacht oder die Aussentemperatur unterhalb der Shading Temperatur. Die Beschattung wird Zwangsbeendet'
 | 
					              . ' - Es ist Nacht oder die Aussentemperatur unterhalb der Shading Temperatur. Die Beschattung wird Zwangsbeendet'
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Log3( $name, 4,
 | 
					        ::Log3( $name, 4,
 | 
				
			||||||
"AutoShuttersControl ($name) - Shading Processing - Der Sonnenstand ist ausserhalb der Winkelangaben oder die Aussentemperatur unterhalb der Shading Temperatur "
 | 
					"AutoShuttersControl ($name) - Shading Processing - Der Sonnenstand ist ausserhalb der Winkelangaben oder die Aussentemperatur unterhalb der Shading Temperatur "
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -358,7 +355,7 @@ sub ShadingProcessing {
 | 
				
			|||||||
                $FHEM::Automation::ShuttersControl::shutters->getShadingStatus
 | 
					                $FHEM::Automation::ShuttersControl::shutters->getShadingStatus
 | 
				
			||||||
                eq 'out reserved'
 | 
					                eq 'out reserved'
 | 
				
			||||||
                and (
 | 
					                and (
 | 
				
			||||||
                    int( gettimeofday() ) -
 | 
					                    int( ::gettimeofday() ) -
 | 
				
			||||||
                    $FHEM::Automation::ShuttersControl::shutters
 | 
					                    $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
                    ->getShadingStatusTimestamp )
 | 
					                    ->getShadingStatusTimestamp )
 | 
				
			||||||
            ) > $FHEM::Automation::ShuttersControl::shutters
 | 
					            ) > $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
@@ -369,7 +366,7 @@ sub ShadingProcessing {
 | 
				
			|||||||
                'out');
 | 
					                'out');
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Log3( $name, 4,
 | 
					        ::Log3( $name, 4,
 | 
				
			||||||
                "AutoShuttersControl ($name) - Shading Processing, Rollladen: "
 | 
					                "AutoShuttersControl ($name) - Shading Processing, Rollladen: "
 | 
				
			||||||
              . $shuttersDev
 | 
					              . $shuttersDev
 | 
				
			||||||
              . " In der Out Abfrage, Shadingwert: "
 | 
					              . " In der Out Abfrage, Shadingwert: "
 | 
				
			||||||
@@ -411,7 +408,7 @@ sub ShadingProcessing {
 | 
				
			|||||||
            $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq
 | 
					            $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq
 | 
				
			||||||
            'in reserved'
 | 
					            'in reserved'
 | 
				
			||||||
            and (
 | 
					            and (
 | 
				
			||||||
                int( gettimeofday() ) -
 | 
					                int( ::gettimeofday() ) -
 | 
				
			||||||
                $FHEM::Automation::ShuttersControl::shutters
 | 
					                $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
                ->getShadingStatusTimestamp ) > (
 | 
					                ->getShadingStatusTimestamp ) > (
 | 
				
			||||||
                $FHEM::Automation::ShuttersControl::shutters
 | 
					                $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
@@ -423,7 +420,7 @@ sub ShadingProcessing {
 | 
				
			|||||||
                'in');
 | 
					                'in');
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Log3( $name, 4,
 | 
					        ::Log3( $name, 4,
 | 
				
			||||||
                "AutoShuttersControl ($name) - Shading Processing, Rollladen: "
 | 
					                "AutoShuttersControl ($name) - Shading Processing, Rollladen: "
 | 
				
			||||||
              . $shuttersDev
 | 
					              . $shuttersDev
 | 
				
			||||||
              . " In der In Abfrage, Shadingwert: "
 | 
					              . " In der In Abfrage, Shadingwert: "
 | 
				
			||||||
@@ -468,22 +465,18 @@ sub ShadingProcessing {
 | 
				
			|||||||
            || $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq
 | 
					            || $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq
 | 
				
			||||||
            $homemode )
 | 
					            $homemode )
 | 
				
			||||||
        && (
 | 
					        && (
 | 
				
			||||||
            $getModeUp eq 'always'
 | 
					               $getModeUp eq 'always'
 | 
				
			||||||
            || $getModeUp eq
 | 
					            || $getModeUp eq $homemode
 | 
				
			||||||
            $homemode
 | 
					 | 
				
			||||||
            || $getModeUp eq 'off'
 | 
					            || $getModeUp eq 'off'
 | 
				
			||||||
            || $getModeUp eq
 | 
					            || $getModeUp eq 'absent'
 | 
				
			||||||
            'absent'
 | 
					            || $getModeUp eq 'gone'
 | 
				
			||||||
            || $getModeUp eq
 | 
					            || (   $getModeUp eq 'home'
 | 
				
			||||||
            'gone'
 | 
					 | 
				
			||||||
            || ( $getModeUp eq
 | 
					 | 
				
			||||||
                'home'
 | 
					 | 
				
			||||||
                && $homemode ne 'asleep' )
 | 
					                && $homemode ne 'asleep' )
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && (
 | 
					        && (
 | 
				
			||||||
            (
 | 
					            (
 | 
				
			||||||
                (
 | 
					                (
 | 
				
			||||||
                    int( gettimeofday() ) -
 | 
					                    int( ::gettimeofday() ) -
 | 
				
			||||||
                    $FHEM::Automation::ShuttersControl::shutters
 | 
					                    $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
                    ->getShadingStatusTimestamp
 | 
					                    ->getShadingStatusTimestamp
 | 
				
			||||||
                ) < 2
 | 
					                ) < 2
 | 
				
			||||||
@@ -497,18 +490,18 @@ sub ShadingProcessing {
 | 
				
			|||||||
                )
 | 
					                )
 | 
				
			||||||
                && $FHEM::Automation::ShuttersControl::shutters->getIfInShading
 | 
					                && $FHEM::Automation::ShuttersControl::shutters->getIfInShading
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            || (   !$FHEM::Automation::ShuttersControl::shutters->getIfInShading
 | 
					            || (  !$FHEM::Automation::ShuttersControl::shutters->getIfInShading
 | 
				
			||||||
                && $FHEM::Automation::ShuttersControl::shutters->getStatus ==
 | 
					                && $FHEM::Automation::ShuttersControl::shutters->getStatus ==
 | 
				
			||||||
                $FHEM::Automation::ShuttersControl::shutters->getShadingPos
 | 
					                $FHEM::Automation::ShuttersControl::shutters->getShadingPos )
 | 
				
			||||||
            )
 | 
					            || ( !$FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
            || (   !$FHEM::Automation::ShuttersControl::shutters->getShadingBetweenTheTimeSuspend
 | 
					                ->getShadingBetweenTheTimeSuspend
 | 
				
			||||||
                && $FHEM::Automation::ShuttersControl::shutters->getStatus !=
 | 
					                && $FHEM::Automation::ShuttersControl::shutters->getStatus !=
 | 
				
			||||||
                $FHEM::Automation::ShuttersControl::shutters->getShadingPos )
 | 
					                $FHEM::Automation::ShuttersControl::shutters->getShadingPos )
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    readingsBeginUpdate($shuttersDevHash);
 | 
					    ::readingsBeginUpdate($shuttersDevHash);
 | 
				
			||||||
    readingsBulkUpdate(
 | 
					    ::readingsBulkUpdate(
 | 
				
			||||||
        $shuttersDevHash,
 | 
					        $shuttersDevHash,
 | 
				
			||||||
        'ASC_ShadingMessage',
 | 
					        'ASC_ShadingMessage',
 | 
				
			||||||
        'INFO: current shading status is \''
 | 
					        'INFO: current shading status is \''
 | 
				
			||||||
@@ -531,7 +524,7 @@ sub ShadingProcessing {
 | 
				
			|||||||
          ) / 60
 | 
					          ) / 60
 | 
				
			||||||
          . 'm'
 | 
					          . 'm'
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
    readingsEndUpdate( $shuttersDevHash, 1 );
 | 
					    ::readingsEndUpdate( $shuttersDevHash, 1 );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -551,19 +544,28 @@ sub ShadingProcessingDriveCommand {
 | 
				
			|||||||
    $FHEM::Automation::ShuttersControl::shutters->setShadingStatus(
 | 
					    $FHEM::Automation::ShuttersControl::shutters->setShadingStatus(
 | 
				
			||||||
        $FHEM::Automation::ShuttersControl::shutters->getShadingStatus );
 | 
					        $FHEM::Automation::ShuttersControl::shutters->getShadingStatus );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (   IsInTime($FHEM::Automation::ShuttersControl::shutters->getShadingBetweenTheTime)
 | 
					    if (
 | 
				
			||||||
        && $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq 'in'
 | 
					        IsInTime(
 | 
				
			||||||
 | 
					            $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
 | 
					              ->getShadingBetweenTheTime
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        && $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq
 | 
				
			||||||
 | 
					        'in'
 | 
				
			||||||
        && $getShadingPos != $getStatus
 | 
					        && $getShadingPos != $getStatus
 | 
				
			||||||
        && ( $getStatus != $FHEM::Automation::ShuttersControl::shutters->getClosedPos
 | 
					        && (
 | 
				
			||||||
          || ( $getStatus == $FHEM::Automation::ShuttersControl::shutters->getClosedPos
 | 
					            $getStatus !=
 | 
				
			||||||
            && $marker
 | 
					            $FHEM::Automation::ShuttersControl::shutters->getClosedPos
 | 
				
			||||||
            )
 | 
					            || ( $getStatus ==
 | 
				
			||||||
          )
 | 
					                   $FHEM::Automation::ShuttersControl::shutters->getClosedPos
 | 
				
			||||||
        && ( $getStatus != $FHEM::Automation::ShuttersControl::shutters->getSleepPos
 | 
					                && $marker )
 | 
				
			||||||
          || ( $getStatus == $FHEM::Automation::ShuttersControl::shutters->getSleepPos
 | 
					        )
 | 
				
			||||||
            && $marker
 | 
					        && (
 | 
				
			||||||
            )
 | 
					            $getStatus !=
 | 
				
			||||||
          )
 | 
					            $FHEM::Automation::ShuttersControl::shutters->getSleepPos
 | 
				
			||||||
 | 
					            || ( $getStatus ==
 | 
				
			||||||
 | 
					                   $FHEM::Automation::ShuttersControl::shutters->getSleepPos
 | 
				
			||||||
 | 
					                && $marker )
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
        && (
 | 
					        && (
 | 
				
			||||||
            FHEM::Automation::ShuttersControl::CheckIfShuttersWindowRecOpen(
 | 
					            FHEM::Automation::ShuttersControl::CheckIfShuttersWindowRecOpen(
 | 
				
			||||||
                $shuttersDev) != 2
 | 
					                $shuttersDev) != 2
 | 
				
			||||||
@@ -602,10 +604,10 @@ sub ShadingProcessingDriveCommand {
 | 
				
			|||||||
            (
 | 
					            (
 | 
				
			||||||
                (
 | 
					                (
 | 
				
			||||||
                    $getShadingPos ==
 | 
					                    $getShadingPos ==
 | 
				
			||||||
                         $FHEM::Automation::ShuttersControl::shutters->getLastPos
 | 
					                      $FHEM::Automation::ShuttersControl::shutters->getLastPos
 | 
				
			||||||
                      || $getShadingPos ==
 | 
					                      || $getShadingPos ==
 | 
				
			||||||
                         $FHEM::Automation::ShuttersControl::shutters
 | 
					                      $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
                         ->getShadingLastPos
 | 
					                      ->getShadingLastPos
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
                ? $FHEM::Automation::ShuttersControl::shutters->getOpenPos
 | 
					                ? $FHEM::Automation::ShuttersControl::shutters->getOpenPos
 | 
				
			||||||
                : (
 | 
					                : (
 | 
				
			||||||
@@ -626,8 +628,10 @@ sub ShadingProcessingDriveCommand {
 | 
				
			|||||||
                    : $FHEM::Automation::ShuttersControl::shutters->getOpenPos
 | 
					                    : $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(
 | 
					        FHEM::Automation::ShuttersControl::ASC_Debug(
 | 
				
			||||||
                'ShadingProcessingDriveCommand: '
 | 
					                'ShadingProcessingDriveCommand: '
 | 
				
			||||||
@@ -639,7 +643,7 @@ sub ShadingProcessingDriveCommand {
 | 
				
			|||||||
              . ' zum beenden der Beschattung gefahren' );
 | 
					              . ' zum beenden der Beschattung gefahren' );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Log3( $name, 4,
 | 
					    ::Log3( $name, 4,
 | 
				
			||||||
"AutoShuttersControl ($name) - Shading Processing - In der Routine zum fahren der Rollläden, Shading Wert: "
 | 
					"AutoShuttersControl ($name) - Shading Processing - In der Routine zum fahren der Rollläden, Shading Wert: "
 | 
				
			||||||
          . $FHEM::Automation::ShuttersControl::shutters->getShadingStatus );
 | 
					          . $FHEM::Automation::ShuttersControl::shutters->getShadingStatus );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
					#  All rights reserved
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
#   Special thanks goes to:
 | 
					#   Special thanks goes to:
 | 
				
			||||||
@@ -45,6 +45,10 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
package FHEM::Automation::ShuttersControl::Shutters;
 | 
					package FHEM::Automation::ShuttersControl::Shutters;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use strict;
 | 
				
			||||||
 | 
					use warnings;
 | 
				
			||||||
 | 
					use utf8;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use FHEM::Automation::ShuttersControl::Shutters::Readings;
 | 
					use FHEM::Automation::ShuttersControl::Shutters::Readings;
 | 
				
			||||||
use FHEM::Automation::ShuttersControl::Shutters::Attr;
 | 
					use FHEM::Automation::ShuttersControl::Shutters::Attr;
 | 
				
			||||||
use FHEM::Automation::ShuttersControl::Roommate;
 | 
					use FHEM::Automation::ShuttersControl::Roommate;
 | 
				
			||||||
@@ -53,10 +57,6 @@ use FHEM::Automation::ShuttersControl::Window;
 | 
				
			|||||||
our @ISA =
 | 
					our @ISA =
 | 
				
			||||||
  qw(FHEM::Automation::ShuttersControl::Shutters::Readings FHEM::Automation::ShuttersControl::Shutters::Attr FHEM::Automation::ShuttersControl::Roommate FHEM::Automation::ShuttersControl::Window);
 | 
					  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 {
 | 
					sub new {
 | 
				
			||||||
    my $class = shift;
 | 
					    my $class = shift;
 | 
				
			||||||
    my $self  = {
 | 
					    my $self  = {
 | 
				
			||||||
@@ -161,6 +161,7 @@ sub setDriveCmd {
 | 
				
			|||||||
        $FHEM::Automation::ShuttersControl::shutters->setDelayCmd($posValue);
 | 
					        $FHEM::Automation::ShuttersControl::shutters->setDelayCmd($posValue);
 | 
				
			||||||
        $FHEM::Automation::ShuttersControl::ascDev->setDelayCmdReading;
 | 
					        $FHEM::Automation::ShuttersControl::ascDev->setDelayCmdReading;
 | 
				
			||||||
        $FHEM::Automation::ShuttersControl::shutters->setNoDelay(0);
 | 
					        $FHEM::Automation::ShuttersControl::shutters->setNoDelay(0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#         $FHEM::Automation::ShuttersControl::shutters->setExternalTriggerStatus(0)
 | 
					#         $FHEM::Automation::ShuttersControl::shutters->setExternalTriggerStatus(0)
 | 
				
			||||||
#           if ( $FHEM::Automation::ShuttersControl::shutters
 | 
					#           if ( $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
#             ->getExternalTriggerStatus );
 | 
					#             ->getExternalTriggerStatus );
 | 
				
			||||||
@@ -177,7 +178,8 @@ sub setDriveCmd {
 | 
				
			|||||||
          if ( $FHEM::Automation::ShuttersControl::shutters->getDelayCmd ne
 | 
					          if ( $FHEM::Automation::ShuttersControl::shutters->getDelayCmd ne
 | 
				
			||||||
            'none' )
 | 
					            'none' )
 | 
				
			||||||
          ; # setzt den Wert auf none da der Rolladen nun gesteuert werden kann.
 | 
					          ; # 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
 | 
					          if ( $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
            ->getExternalTriggerStatus );
 | 
					            ->getExternalTriggerStatus );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -460,7 +462,8 @@ sub setRainUnprotectionDelayObj {
 | 
				
			|||||||
    my $self  = shift;
 | 
					    my $self  = shift;
 | 
				
			||||||
    my $value = shift;
 | 
					    my $value = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $self->{ $self->{shuttersDev} }->{RainProtection}->{UNPROTECTIONDELAYOBJVAL} = $value
 | 
					    $self->{ $self->{shuttersDev} }->{RainProtection}->{UNPROTECTIONDELAYOBJVAL}
 | 
				
			||||||
 | 
					      = $value
 | 
				
			||||||
      if ( defined($value) );
 | 
					      if ( defined($value) );
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -545,12 +548,13 @@ sub getAttrUpdateChanges {
 | 
				
			|||||||
sub getIsDay {
 | 
					sub getIsDay {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return FHEM::Automation::ShuttersControl::Helper::_IsDay( $self->{shuttersDev} );
 | 
					    return FHEM::Automation::ShuttersControl::Helper::_IsDay(
 | 
				
			||||||
 | 
					        $self->{shuttersDev} );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub getAntiFreezeStatus {
 | 
					sub getAntiFreezeStatus {
 | 
				
			||||||
    use POSIX qw(strftime);
 | 
					    use POSIX qw(strftime);
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self    = shift;
 | 
				
			||||||
    my $daytime = strftime( "%P", localtime() );
 | 
					    my $daytime = strftime( "%P", localtime() );
 | 
				
			||||||
    $daytime = (
 | 
					    $daytime = (
 | 
				
			||||||
        defined($daytime) && $daytime
 | 
					        defined($daytime) && $daytime
 | 
				
			||||||
@@ -756,10 +760,12 @@ sub getRainUnprotectionDelayObj {
 | 
				
			|||||||
        (
 | 
					        (
 | 
				
			||||||
            defined( $self->{ $self->{shuttersDev} }->{RainProtection} )
 | 
					            defined( $self->{ $self->{shuttersDev} }->{RainProtection} )
 | 
				
			||||||
              && defined(
 | 
					              && defined(
 | 
				
			||||||
                $self->{ $self->{shuttersDev} }->{RainProtection}->{UNPROTECTIONDELAYOBJVAL}
 | 
					                $self->{ $self->{shuttersDev} }->{RainProtection}
 | 
				
			||||||
 | 
					                  ->{UNPROTECTIONDELAYOBJVAL}
 | 
				
			||||||
              )
 | 
					              )
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        ? $self->{ $self->{shuttersDev} }->{RainProtection}->{UNPROTECTIONDELAYOBJVAL}
 | 
					        ? $self->{ $self->{shuttersDev} }->{RainProtection}
 | 
				
			||||||
 | 
					          ->{UNPROTECTIONDELAYOBJVAL}
 | 
				
			||||||
        : 'none'
 | 
					        : 'none'
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -821,7 +827,7 @@ sub getRoommatesStatus {
 | 
				
			|||||||
        $FHEM::Automation::ShuttersControl::shutters->setRoommate($ro);
 | 
					        $FHEM::Automation::ShuttersControl::shutters->setRoommate($ro);
 | 
				
			||||||
        my $currentPrio =
 | 
					        my $currentPrio =
 | 
				
			||||||
          $statePrio{ $FHEM::Automation::ShuttersControl::shutters
 | 
					          $statePrio{ $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
              ->_getRoommateStatus };
 | 
					              ->getRoommateStatus };
 | 
				
			||||||
        $minPrio = $currentPrio if ( $minPrio > $currentPrio );
 | 
					        $minPrio = $currentPrio if ( $minPrio > $currentPrio );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -854,7 +860,7 @@ sub getRoommatesLastStatus {
 | 
				
			|||||||
        $FHEM::Automation::ShuttersControl::shutters->setRoommate($ro);
 | 
					        $FHEM::Automation::ShuttersControl::shutters->setRoommate($ro);
 | 
				
			||||||
        my $currentPrio =
 | 
					        my $currentPrio =
 | 
				
			||||||
          $statePrio{ $FHEM::Automation::ShuttersControl::shutters
 | 
					          $statePrio{ $FHEM::Automation::ShuttersControl::shutters
 | 
				
			||||||
              ->_getRoommateLastStatus };
 | 
					              ->getRoommateLastStatus };
 | 
				
			||||||
        $minPrio = $currentPrio if ( $minPrio > $currentPrio );
 | 
					        $minPrio = $currentPrio if ( $minPrio > $currentPrio );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -899,7 +905,8 @@ sub setShadingStatus {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} = $value
 | 
					    $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} = $value
 | 
				
			||||||
      if ( defined($value) );
 | 
					      if ( defined($value) );
 | 
				
			||||||
    $self->{ $self->{shuttersDev} }{ShadingStatus}{TIME} = int( ::gettimeofday() )
 | 
					    $self->{ $self->{shuttersDev} }{ShadingStatus}{TIME} =
 | 
				
			||||||
 | 
					      int( ::gettimeofday() )
 | 
				
			||||||
      if ( defined( $self->{ $self->{shuttersDev} }{ShadingStatus} ) );
 | 
					      if ( defined( $self->{ $self->{shuttersDev} }{ShadingStatus} ) );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
@@ -945,7 +952,7 @@ sub setShadingLastPos {
 | 
				
			|||||||
    return;
 | 
					    return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub setShadingBetweenTheTimeSuspend {       # Werte für value = 0, 1
 | 
					sub setShadingBetweenTheTimeSuspend {    # Werte für value = 0, 1
 | 
				
			||||||
    my $self  = shift;
 | 
					    my $self  = shift;
 | 
				
			||||||
    my $value = 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;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return (
 | 
					    return (
 | 
				
			||||||
        defined( $self->{ $self->{shuttersDev} }{ShadingBetweenTheTimeSuspend} )
 | 
					        defined(
 | 
				
			||||||
          && defined( $self->{ $self->{shuttersDev} }{ShadingBetweenTheTimeSuspend}{VAL} )
 | 
					            $self->{ $self->{shuttersDev} }{ShadingBetweenTheTimeSuspend}
 | 
				
			||||||
 | 
					          )
 | 
				
			||||||
 | 
					          && defined(
 | 
				
			||||||
 | 
					            $self->{ $self->{shuttersDev} }{ShadingBetweenTheTimeSuspend}{VAL}
 | 
				
			||||||
 | 
					          )
 | 
				
			||||||
        ? $self->{ $self->{shuttersDev} }{ShadingBetweenTheTimeSuspend}{VAL}
 | 
					        ? $self->{ $self->{shuttersDev} }{ShadingBetweenTheTimeSuspend}{VAL}
 | 
				
			||||||
        : 0
 | 
					        : 0
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
@@ -1084,9 +1095,7 @@ sub getShadingLastPos {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    return (
 | 
					    return (
 | 
				
			||||||
        defined( $self->{ $self->{shuttersDev} }{ShadingLastPos} )
 | 
					        defined( $self->{ $self->{shuttersDev} }{ShadingLastPos} )
 | 
				
			||||||
          && defined(
 | 
					          && defined( $self->{ $self->{shuttersDev} }{ShadingLastPos}{VAL} )
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }{ShadingLastPos}{VAL}
 | 
					 | 
				
			||||||
          )
 | 
					 | 
				
			||||||
        ? $self->{ $self->{shuttersDev} }{ShadingLastPos}{VAL}
 | 
					        ? $self->{ $self->{shuttersDev} }{ShadingLastPos}{VAL}
 | 
				
			||||||
        : $FHEM::Automation::ShuttersControl::shutters->getShadingPos
 | 
					        : $FHEM::Automation::ShuttersControl::shutters->getShadingPos
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
@@ -1094,7 +1103,4 @@ sub getShadingLastPos {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
### Ende Beschattung
 | 
					### Ende Beschattung
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
1;
 | 
					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
 | 
					#  All rights reserved
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
#   Special thanks goes to:
 | 
					#   Special thanks goes to:
 | 
				
			||||||
@@ -46,24 +46,12 @@ use utf8;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
use FHEM::Automation::ShuttersControl::Helper qw (IsAdv PerlCodeCheck);
 | 
					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 {
 | 
					sub _setAttributs {
 | 
				
			||||||
    my $shuttersDev = shift;
 | 
					    my $shuttersDev = shift;
 | 
				
			||||||
    my $attr        = shift;
 | 
					    my $attr        = shift;
 | 
				
			||||||
    my $attrVal     = shift;
 | 
					    my $attrVal     = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    CommandAttr( undef, $shuttersDev . ' ' . $attr . ' ' . $attrVal );
 | 
					    ::CommandAttr( undef, $shuttersDev . ' ' . $attr . ' ' . $attrVal );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -77,28 +65,28 @@ sub _getPosition {
 | 
				
			|||||||
    return $self->{ $self->{shuttersDev} }->{$attr}->{position}
 | 
					    return $self->{ $self->{shuttersDev} }->{$attr}->{position}
 | 
				
			||||||
      if (
 | 
					      if (
 | 
				
			||||||
        exists( $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} )
 | 
					        exists( $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} ) < 2
 | 
					            $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} ) < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
    $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} =
 | 
					    $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} =
 | 
				
			||||||
      int( gettimeofday() );
 | 
					      int( ::gettimeofday() );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    my $position;
 | 
					    my $position;
 | 
				
			||||||
    my $posAssignment;
 | 
					    my $posAssignment;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (
 | 
					    if (
 | 
				
			||||||
        AttrVal( $self->{shuttersDev}, $attr,
 | 
					        ::AttrVal( $self->{shuttersDev}, $attr,
 | 
				
			||||||
            $FHEM::Automation::ShuttersControl::userAttrList{$userAttrList}
 | 
					            $FHEM::Automation::ShuttersControl::userAttrList{$userAttrList}
 | 
				
			||||||
              [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] ) =~
 | 
					              [ ::AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] ) =~
 | 
				
			||||||
        m{\A\{.+\}\z}xms
 | 
					        m{\A\{.+\}\z}xms
 | 
				
			||||||
      )
 | 
					      )
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        my $response = PerlCodeCheck(
 | 
					        my $response = PerlCodeCheck(
 | 
				
			||||||
            AttrVal(
 | 
					            ::AttrVal(
 | 
				
			||||||
                $self->{shuttersDev},
 | 
					                $self->{shuttersDev},
 | 
				
			||||||
                $attr,
 | 
					                $attr,
 | 
				
			||||||
                $FHEM::Automation::ShuttersControl::userAttrList{$userAttrList}
 | 
					                $FHEM::Automation::ShuttersControl::userAttrList{$userAttrList}
 | 
				
			||||||
                  [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ]
 | 
					                  [ ::AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ]
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -108,14 +96,14 @@ sub _getPosition {
 | 
				
			|||||||
              $position =~ m{\A\d+(\.\d+)?\z}xms
 | 
					              $position =~ m{\A\d+(\.\d+)?\z}xms
 | 
				
			||||||
            ? $position
 | 
					            ? $position
 | 
				
			||||||
            : $FHEM::Automation::ShuttersControl::userAttrList{$userAttrList}
 | 
					            : $FHEM::Automation::ShuttersControl::userAttrList{$userAttrList}
 | 
				
			||||||
              [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ]
 | 
					              [ ::AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ]
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $posAssignment = (
 | 
					        $posAssignment = (
 | 
				
			||||||
                defined($posAssignment)
 | 
					            defined($posAssignment)
 | 
				
			||||||
            &&  $posAssignment =~ m{\A\d+(\.\d+)?\z}xms
 | 
					              && $posAssignment =~ m{\A\d+(\.\d+)?\z}xms
 | 
				
			||||||
              ? $posAssignment
 | 
					            ? $posAssignment
 | 
				
			||||||
              : 'none'
 | 
					            : 'none'
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else {
 | 
					    else {
 | 
				
			||||||
@@ -124,7 +112,7 @@ sub _getPosition {
 | 
				
			|||||||
            $self->{shuttersDev},
 | 
					            $self->{shuttersDev},
 | 
				
			||||||
            $attr,
 | 
					            $attr,
 | 
				
			||||||
            $FHEM::Automation::ShuttersControl::userAttrList{$userAttrList}
 | 
					            $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} =
 | 
					        $self->{ $self->{shuttersDev} }->{$attr}->{position} =
 | 
				
			||||||
          PerlCodeCheck(
 | 
					          PerlCodeCheck( $self->{ $self->{shuttersDev} }->{$attr}->{position} );
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{$attr}->{position} );
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return (
 | 
					    return (
 | 
				
			||||||
@@ -154,7 +141,7 @@ sub _getPosition {
 | 
				
			|||||||
          m{^\d+(\.\d+)?$}xms
 | 
					          m{^\d+(\.\d+)?$}xms
 | 
				
			||||||
        ? $self->{ $self->{shuttersDev} }->{$attr}->{position}
 | 
					        ? $self->{ $self->{shuttersDev} }->{$attr}->{position}
 | 
				
			||||||
        : $FHEM::Automation::ShuttersControl::userAttrList{$userAttrList}
 | 
					        : $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}
 | 
					    return $self->{ $self->{shuttersDev} }->{$attr}->{posAssignment}
 | 
				
			||||||
      if (
 | 
					      if (
 | 
				
			||||||
        exists( $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} )
 | 
					        exists( $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} ) < 2
 | 
					            $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} ) < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
    $FHEM::Automation::ShuttersControl::shutters->$getFn;
 | 
					    $FHEM::Automation::ShuttersControl::shutters->$getFn;
 | 
				
			||||||
@@ -213,7 +200,7 @@ sub setShuttersPlace {
 | 
				
			|||||||
sub getShuttersPlace {
 | 
					sub getShuttersPlace {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $self->{shuttersDev}, 'ASC_ShuttersPlace', 'window' );
 | 
					    return ::AttrVal( $self->{shuttersDev}, 'ASC_ShuttersPlace', 'window' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub setSlatPosCmd {
 | 
					sub setSlatPosCmd {
 | 
				
			||||||
@@ -236,15 +223,15 @@ sub getSlatPosCmd {
 | 
				
			|||||||
            $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
 | 
				
			||||||
              ->{LASTGETTIME}
 | 
					              ->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
 | 
				
			||||||
            ->{LASTGETTIME} ) < 2
 | 
					            ->{LASTGETTIME} ) < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
    $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}->{LASTGETTIME}
 | 
					    $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}->{LASTGETTIME}
 | 
				
			||||||
      = int( gettimeofday() );
 | 
					      = int( ::gettimeofday() );
 | 
				
			||||||
    my ( $slatPosCmd, $slatDevice ) =
 | 
					    my ( $slatPosCmd, $slatDevice ) =
 | 
				
			||||||
      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
 | 
					      FHEM::Automation::ShuttersControl::Helper::GetAttrValues(
 | 
				
			||||||
        'ASC_SlatPosCmd_SlatDevice', 'none:none' );
 | 
					        $self->{shuttersDev}, 'ASC_SlatPosCmd_SlatDevice', 'none:none' );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ## Erwartetes Ergebnis
 | 
					    ## Erwartetes Ergebnis
 | 
				
			||||||
    # upTime:upBrightnessVal
 | 
					    # upTime:upBrightnessVal
 | 
				
			||||||
@@ -268,7 +255,7 @@ sub getSlatDevice {
 | 
				
			|||||||
            $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
 | 
				
			||||||
              ->{LASTGETTIME}
 | 
					              ->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
 | 
				
			||||||
            ->{LASTGETTIME} ) < 2
 | 
					            ->{LASTGETTIME} ) < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
@@ -299,15 +286,15 @@ sub getPrivacyUpTime {
 | 
				
			|||||||
            $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
 | 
				
			||||||
              ->{LASTGETTIME}
 | 
					              ->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
 | 
				
			||||||
            ->{LASTGETTIME} ) < 2
 | 
					            ->{LASTGETTIME} ) < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
    $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
 | 
					    $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
 | 
				
			||||||
      ->{LASTGETTIME} = int( gettimeofday() );
 | 
					      ->{LASTGETTIME} = int( ::gettimeofday() );
 | 
				
			||||||
    my ( $upTime, $upBrightnessVal ) =
 | 
					    my ( $upTime, $upBrightnessVal ) =
 | 
				
			||||||
      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
 | 
					      FHEM::Automation::ShuttersControl::Helper::GetAttrValues(
 | 
				
			||||||
        'ASC_PrivacyUpValue_beforeDayOpen', '-1:-1' );
 | 
					        $self->{shuttersDev}, 'ASC_PrivacyUpValue_beforeDayOpen', '-1:-1' );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ## Erwartetes Ergebnis
 | 
					    ## Erwartetes Ergebnis
 | 
				
			||||||
    # upTime:upBrightnessVal
 | 
					    # upTime:upBrightnessVal
 | 
				
			||||||
@@ -341,7 +328,7 @@ sub getPrivacyUpBrightnessVal {
 | 
				
			|||||||
            $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
 | 
				
			||||||
              ->{LASTGETTIME}
 | 
					              ->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
 | 
				
			||||||
            ->{LASTGETTIME} ) < 2
 | 
					            ->{LASTGETTIME} ) < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
@@ -378,14 +365,15 @@ sub getPrivacyDownTime {
 | 
				
			|||||||
            $self->{ $self->{shuttersDev} }
 | 
					            $self->{ $self->{shuttersDev} }
 | 
				
			||||||
              ->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME}
 | 
					              ->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }
 | 
					            $self->{ $self->{shuttersDev} }
 | 
				
			||||||
            ->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME} ) < 2
 | 
					            ->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME} ) < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
    $self->{ $self->{shuttersDev} }->{ASC_PrivacyDownValue_beforeNightClose}
 | 
					    $self->{ $self->{shuttersDev} }->{ASC_PrivacyDownValue_beforeNightClose}
 | 
				
			||||||
      ->{LASTGETTIME} = int( gettimeofday() );
 | 
					      ->{LASTGETTIME} = int( ::gettimeofday() );
 | 
				
			||||||
    my ( $downTime, $downBrightnessVal ) =
 | 
					    my ( $downTime, $downBrightnessVal ) =
 | 
				
			||||||
      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
 | 
					      FHEM::Automation::ShuttersControl::Helper::GetAttrValues(
 | 
				
			||||||
 | 
					        $self->{shuttersDev},
 | 
				
			||||||
        'ASC_PrivacyDownValue_beforeNightClose', '-1:-1' );
 | 
					        'ASC_PrivacyDownValue_beforeNightClose', '-1:-1' );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ## Erwartetes Ergebnis
 | 
					    ## Erwartetes Ergebnis
 | 
				
			||||||
@@ -420,7 +408,7 @@ sub getPrivacyDownBrightnessVal {
 | 
				
			|||||||
            $self->{ $self->{shuttersDev} }
 | 
					            $self->{ $self->{shuttersDev} }
 | 
				
			||||||
              ->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME}
 | 
					              ->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }
 | 
					            $self->{ $self->{shuttersDev} }
 | 
				
			||||||
            ->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME} ) < 2
 | 
					            ->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME} ) < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
@@ -497,7 +485,7 @@ sub setSelfDefenseMode {
 | 
				
			|||||||
sub getSelfDefenseMode {
 | 
					sub getSelfDefenseMode {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $self->{shuttersDev}, 'ASC_Self_Defense_Mode', 'gone' );
 | 
					    return ::AttrVal( $self->{shuttersDev}, 'ASC_Self_Defense_Mode', 'gone' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub setSelfDefenseAbsentDelay {
 | 
					sub setSelfDefenseAbsentDelay {
 | 
				
			||||||
@@ -513,13 +501,14 @@ sub setSelfDefenseAbsentDelay {
 | 
				
			|||||||
sub getSelfDefenseAbsentDelay {
 | 
					sub getSelfDefenseAbsentDelay {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $self->{shuttersDev}, 'ASC_Self_Defense_AbsentDelay', 300 );
 | 
					    return ::AttrVal( $self->{shuttersDev}, 'ASC_Self_Defense_AbsentDelay',
 | 
				
			||||||
 | 
					        300 );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub getCommandTemplate {
 | 
					sub getCommandTemplate {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $self->{shuttersDev}, 'ASC_CommandTemplate', 'none' );
 | 
					    return ::AttrVal( $self->{shuttersDev}, 'ASC_CommandTemplate', 'none' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub setWiggleValue {
 | 
					sub setWiggleValue {
 | 
				
			||||||
@@ -534,7 +523,7 @@ sub setWiggleValue {
 | 
				
			|||||||
sub getWiggleValue {
 | 
					sub getWiggleValue {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $self->{shuttersDev}, 'ASC_WiggleValue', 5 );
 | 
					    return ::AttrVal( $self->{shuttersDev}, 'ASC_WiggleValue', 5 );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub setAdv {
 | 
					sub setAdv {
 | 
				
			||||||
@@ -550,7 +539,7 @@ sub getAdv {
 | 
				
			|||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return (
 | 
					    return (
 | 
				
			||||||
        AttrVal( $self->{shuttersDev}, 'ASC_Adv', 'off' ) eq 'on'
 | 
					        ::AttrVal( $self->{shuttersDev}, 'ASC_Adv', 'off' ) eq 'on'
 | 
				
			||||||
        ? ( IsAdv == 1 ? 1 : 0 )
 | 
					        ? ( IsAdv == 1 ? 1 : 0 )
 | 
				
			||||||
        : 0
 | 
					        : 0
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
@@ -593,7 +582,7 @@ sub setShadingMode {
 | 
				
			|||||||
sub getShadingMode {
 | 
					sub getShadingMode {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $self->{shuttersDev}, 'ASC_Shading_Mode', 'off' );
 | 
					    return ::AttrVal( $self->{shuttersDev}, 'ASC_Shading_Mode', 'off' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub _getTempSensor {
 | 
					sub _getTempSensor {
 | 
				
			||||||
@@ -604,15 +593,15 @@ sub _getTempSensor {
 | 
				
			|||||||
        exists(
 | 
					        exists(
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} )
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} )
 | 
				
			||||||
        < 2
 | 
					        < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
    $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} =
 | 
					    $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} =
 | 
				
			||||||
      int( gettimeofday() );
 | 
					      int( ::gettimeofday() );
 | 
				
			||||||
    my ( $device, $reading ) =
 | 
					    my ( $device, $reading ) =
 | 
				
			||||||
      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
 | 
					      FHEM::Automation::ShuttersControl::Helper::GetAttrValues(
 | 
				
			||||||
        'ASC_TempSensor', 'none' );
 | 
					        $self->{shuttersDev}, 'ASC_TempSensor', 'none' );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ### erwartetes Ergebnis
 | 
					    ### erwartetes Ergebnis
 | 
				
			||||||
    # DEVICE:READING
 | 
					    # DEVICE:READING
 | 
				
			||||||
@@ -631,7 +620,7 @@ sub getTempSensorReading {
 | 
				
			|||||||
        exists(
 | 
					        exists(
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} )
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} )
 | 
				
			||||||
        < 2
 | 
					        < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
@@ -664,15 +653,15 @@ sub _getIdleDetectionReading {
 | 
				
			|||||||
            $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
 | 
				
			||||||
              ->{LASTGETTIME}
 | 
					              ->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
 | 
				
			||||||
            ->{LASTGETTIME} ) < 2
 | 
					            ->{LASTGETTIME} ) < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
    $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}->{LASTGETTIME}
 | 
					    $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}->{LASTGETTIME}
 | 
				
			||||||
      = int( gettimeofday() );
 | 
					      = int( ::gettimeofday() );
 | 
				
			||||||
    my ( $reading, $value ) =
 | 
					    my ( $reading, $value ) =
 | 
				
			||||||
      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
 | 
					      FHEM::Automation::ShuttersControl::Helper::GetAttrValues(
 | 
				
			||||||
        'ASC_Shutter_IdleDetection', 'none' );
 | 
					        $self->{shuttersDev}, 'ASC_Shutter_IdleDetection', 'none' );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ### erwartetes Ergebnis
 | 
					    ### erwartetes Ergebnis
 | 
				
			||||||
    # READING:VALUE
 | 
					    # READING:VALUE
 | 
				
			||||||
@@ -694,7 +683,7 @@ sub getIdleDetectionValue {
 | 
				
			|||||||
            $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
 | 
				
			||||||
              ->{LASTGETTIME}
 | 
					              ->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
 | 
				
			||||||
            ->{LASTGETTIME} ) < 2
 | 
					            ->{LASTGETTIME} ) < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
@@ -728,15 +717,15 @@ sub _getBrightnessSensor {
 | 
				
			|||||||
            $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
 | 
				
			||||||
              ->{LASTGETTIME}
 | 
					              ->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
 | 
				
			||||||
            ->{LASTGETTIME} ) < 2
 | 
					            ->{LASTGETTIME} ) < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
    $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{LASTGETTIME} =
 | 
					    $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{LASTGETTIME} =
 | 
				
			||||||
      int( gettimeofday() );
 | 
					      int( ::gettimeofday() );
 | 
				
			||||||
    my ( $device, $reading, $max, $min ) =
 | 
					    my ( $device, $reading, $max, $min ) =
 | 
				
			||||||
      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
 | 
					      FHEM::Automation::ShuttersControl::Helper::GetAttrValues(
 | 
				
			||||||
        'ASC_BrightnessSensor', 'none' );
 | 
					        $self->{shuttersDev}, 'ASC_BrightnessSensor', 'none' );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ### erwartetes Ergebnis
 | 
					    ### erwartetes Ergebnis
 | 
				
			||||||
    # DEVICE:READING MAX:MIN
 | 
					    # DEVICE:READING MAX:MIN
 | 
				
			||||||
@@ -760,7 +749,7 @@ sub getBrightnessReading {
 | 
				
			|||||||
            $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
 | 
				
			||||||
              ->{LASTGETTIME}
 | 
					              ->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
 | 
				
			||||||
            ->{LASTGETTIME} ) < 2
 | 
					            ->{LASTGETTIME} ) < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
@@ -785,7 +774,7 @@ sub getShadingAzimuthLeft {
 | 
				
			|||||||
            $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
 | 
				
			||||||
              ->{LASTGETTIME}
 | 
					              ->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
 | 
				
			||||||
            ->{LASTGETTIME} ) < 2
 | 
					            ->{LASTGETTIME} ) < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
@@ -814,15 +803,15 @@ sub getShadingAzimuthRight {
 | 
				
			|||||||
            $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
 | 
				
			||||||
              ->{LASTGETTIME}
 | 
					              ->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
 | 
				
			||||||
            ->{LASTGETTIME} ) < 2
 | 
					            ->{LASTGETTIME} ) < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
    $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}->{LASTGETTIME}
 | 
					    $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}->{LASTGETTIME}
 | 
				
			||||||
      = int( gettimeofday() );
 | 
					      = int( ::gettimeofday() );
 | 
				
			||||||
    my ( $left, $right ) =
 | 
					    my ( $left, $right ) =
 | 
				
			||||||
      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
 | 
					      FHEM::Automation::ShuttersControl::Helper::GetAttrValues(
 | 
				
			||||||
        'ASC_Shading_InOutAzimuth', '95:265' );
 | 
					        $self->{shuttersDev}, 'ASC_Shading_InOutAzimuth', '95:265' );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ### erwartetes Ergebnis
 | 
					    ### erwartetes Ergebnis
 | 
				
			||||||
    # MIN:MAX
 | 
					    # MIN:MAX
 | 
				
			||||||
@@ -849,8 +838,8 @@ sub setShadingMinOutsideTemperature {
 | 
				
			|||||||
sub getShadingMinOutsideTemperature {
 | 
					sub getShadingMinOutsideTemperature {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $self->{shuttersDev}, 'ASC_Shading_Min_OutsideTemperature',
 | 
					    return ::AttrVal( $self->{shuttersDev},
 | 
				
			||||||
        18 );
 | 
					        'ASC_Shading_Min_OutsideTemperature', 18 );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub setShadingMinMaxElevation {
 | 
					sub setShadingMinMaxElevation {
 | 
				
			||||||
@@ -873,15 +862,15 @@ sub getShadingMinElevation {
 | 
				
			|||||||
            $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
 | 
				
			||||||
              ->{LASTGETTIME}
 | 
					              ->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
 | 
				
			||||||
            ->{LASTGETTIME} ) < 2
 | 
					            ->{LASTGETTIME} ) < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
    $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
 | 
					    $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
 | 
				
			||||||
      ->{LASTGETTIME} = int( gettimeofday() );
 | 
					      ->{LASTGETTIME} = int( ::gettimeofday() );
 | 
				
			||||||
    my ( $min, $max ) =
 | 
					    my ( $min, $max ) =
 | 
				
			||||||
      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
 | 
					      FHEM::Automation::ShuttersControl::Helper::GetAttrValues(
 | 
				
			||||||
        'ASC_Shading_MinMax_Elevation', '25.0:100.0' );
 | 
					        $self->{shuttersDev}, 'ASC_Shading_MinMax_Elevation', '25.0:100.0' );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ### erwartetes Ergebnis
 | 
					    ### erwartetes Ergebnis
 | 
				
			||||||
    # MIN:MAX
 | 
					    # MIN:MAX
 | 
				
			||||||
@@ -905,7 +894,7 @@ sub getShadingMaxElevation {
 | 
				
			|||||||
            $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
 | 
				
			||||||
              ->{LASTGETTIME}
 | 
					              ->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
 | 
				
			||||||
            ->{LASTGETTIME} ) < 2
 | 
					            ->{LASTGETTIME} ) < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
@@ -943,15 +932,15 @@ sub getShadingStateChangeSunny {
 | 
				
			|||||||
            $self->{ $self->{shuttersDev} }
 | 
					            $self->{ $self->{shuttersDev} }
 | 
				
			||||||
              ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME}
 | 
					              ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }
 | 
					            $self->{ $self->{shuttersDev} }
 | 
				
			||||||
            ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} ) < 2
 | 
					            ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} ) < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
    $self->{ $self->{shuttersDev} }->{ASC_Shading_StateChange_SunnyCloudy}
 | 
					    $self->{ $self->{shuttersDev} }->{ASC_Shading_StateChange_SunnyCloudy}
 | 
				
			||||||
      ->{LASTGETTIME} = int( gettimeofday() );
 | 
					      ->{LASTGETTIME} = int( ::gettimeofday() );
 | 
				
			||||||
    my ( $sunny, $cloudy, $maxBrightnessAverageArrayObjects ) =
 | 
					    my ( $sunny, $cloudy, $maxBrightnessAverageArrayObjects ) =
 | 
				
			||||||
      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
 | 
					      FHEM::Automation::ShuttersControl::Helper::GetAttrValues(
 | 
				
			||||||
        'ASC_Shading_StateChange_SunnyCloudy',
 | 
					        $self->{shuttersDev}, 'ASC_Shading_StateChange_SunnyCloudy',
 | 
				
			||||||
        '35000:20000' );
 | 
					        '35000:20000' );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ### erwartetes Ergebnis
 | 
					    ### erwartetes Ergebnis
 | 
				
			||||||
@@ -982,7 +971,7 @@ sub getShadingStateChangeCloudy {
 | 
				
			|||||||
            $self->{ $self->{shuttersDev} }
 | 
					            $self->{ $self->{shuttersDev} }
 | 
				
			||||||
              ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME}
 | 
					              ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }
 | 
					            $self->{ $self->{shuttersDev} }
 | 
				
			||||||
            ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} ) < 2
 | 
					            ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} ) < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
@@ -1002,7 +991,7 @@ sub getMaxBrightnessAverageArrayObjects {
 | 
				
			|||||||
            $self->{ $self->{shuttersDev} }
 | 
					            $self->{ $self->{shuttersDev} }
 | 
				
			||||||
              ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME}
 | 
					              ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }
 | 
					            $self->{ $self->{shuttersDev} }
 | 
				
			||||||
            ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} ) < 2
 | 
					            ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} ) < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
@@ -1025,7 +1014,7 @@ sub setShadingWaitingPeriod {
 | 
				
			|||||||
sub getShadingWaitingPeriod {
 | 
					sub getShadingWaitingPeriod {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $self->{shuttersDev}, 'ASC_Shading_WaitingPeriod', 1200 );
 | 
					    return ::AttrVal( $self->{shuttersDev}, 'ASC_Shading_WaitingPeriod', 1200 );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
### Ende Beschattung
 | 
					### Ende Beschattung
 | 
				
			||||||
sub setExternalTrigger {
 | 
					sub setExternalTrigger {
 | 
				
			||||||
@@ -1046,16 +1035,16 @@ sub getExternalTriggerDevice {
 | 
				
			|||||||
            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
				
			||||||
              ->{LASTGETTIME}
 | 
					              ->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
				
			||||||
            ->{LASTGETTIME} ) < 2
 | 
					            ->{LASTGETTIME} ) < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
    $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{LASTGETTIME} =
 | 
					    $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{LASTGETTIME} =
 | 
				
			||||||
      int( gettimeofday() );
 | 
					      int( ::gettimeofday() );
 | 
				
			||||||
    my ( $device, $reading, $valueActive, $valueInactive, $posActive,
 | 
					    my ( $device, $reading, $valueActive, $valueInactive, $posActive,
 | 
				
			||||||
        $posInactive, $valueActive2, $posActive2 )
 | 
					        $posInactive, $valueActive2, $posActive2 )
 | 
				
			||||||
      = FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
 | 
					      = FHEM::Automation::ShuttersControl::Helper::GetAttrValues(
 | 
				
			||||||
        'ASC_ExternalTrigger', 'none' );
 | 
					        $self->{shuttersDev}, 'ASC_ExternalTrigger', 'none' );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ### erwartetes Ergebnis
 | 
					    ### erwartetes Ergebnis
 | 
				
			||||||
# DEVICE:READING VALUEACTIVE:VALUEINACTIVE POSACTIVE:POSINACTIVE VALUEACTIVE2:POSACTIVE2
 | 
					# DEVICE:READING VALUEACTIVE:VALUEINACTIVE POSACTIVE:POSINACTIVE VALUEACTIVE2:POSACTIVE2
 | 
				
			||||||
@@ -1070,10 +1059,11 @@ sub getExternalTriggerDevice {
 | 
				
			|||||||
      $valueInactive;
 | 
					      $valueInactive;
 | 
				
			||||||
    $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive} =
 | 
					    $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive} =
 | 
				
			||||||
      $posActive;
 | 
					      $posActive;
 | 
				
			||||||
    $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posinactive} =
 | 
					    $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posinactive} = (
 | 
				
			||||||
      (   $posInactive ne 'none'
 | 
					          $posInactive ne 'none'
 | 
				
			||||||
        ? $posInactive
 | 
					        ? $posInactive
 | 
				
			||||||
        : $FHEM::Automation::ShuttersControl::shutters->getLastPos );
 | 
					        : $FHEM::Automation::ShuttersControl::shutters->getLastPos
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
    $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{valueactive2} =
 | 
					    $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{valueactive2} =
 | 
				
			||||||
      $valueActive2;
 | 
					      $valueActive2;
 | 
				
			||||||
    $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive2} =
 | 
					    $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive2} =
 | 
				
			||||||
@@ -1092,7 +1082,7 @@ sub getExternalTriggerReading {
 | 
				
			|||||||
            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
				
			||||||
              ->{LASTGETTIME}
 | 
					              ->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
				
			||||||
            ->{LASTGETTIME} ) < 2
 | 
					            ->{LASTGETTIME} ) < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
@@ -1110,7 +1100,7 @@ sub getExternalTriggerValueActive {
 | 
				
			|||||||
            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
				
			||||||
              ->{LASTGETTIME}
 | 
					              ->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
				
			||||||
            ->{LASTGETTIME} ) < 2
 | 
					            ->{LASTGETTIME} ) < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
@@ -1130,7 +1120,7 @@ sub getExternalTriggerValueActive2 {
 | 
				
			|||||||
            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
				
			||||||
              ->{LASTGETTIME}
 | 
					              ->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
				
			||||||
            ->{LASTGETTIME} ) < 2
 | 
					            ->{LASTGETTIME} ) < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
@@ -1150,7 +1140,7 @@ sub getExternalTriggerValueInactive {
 | 
				
			|||||||
            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
				
			||||||
              ->{LASTGETTIME}
 | 
					              ->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
				
			||||||
            ->{LASTGETTIME} ) < 2
 | 
					            ->{LASTGETTIME} ) < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
@@ -1169,7 +1159,7 @@ sub getExternalTriggerPosActive {
 | 
				
			|||||||
            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
				
			||||||
              ->{LASTGETTIME}
 | 
					              ->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
				
			||||||
            ->{LASTGETTIME} ) < 2
 | 
					            ->{LASTGETTIME} ) < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
@@ -1187,7 +1177,7 @@ sub getExternalTriggerPosActive2 {
 | 
				
			|||||||
            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
				
			||||||
              ->{LASTGETTIME}
 | 
					              ->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
				
			||||||
            ->{LASTGETTIME} ) < 2
 | 
					            ->{LASTGETTIME} ) < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
@@ -1205,7 +1195,7 @@ sub getExternalTriggerPosInactive {
 | 
				
			|||||||
            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
				
			||||||
              ->{LASTGETTIME}
 | 
					              ->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
 | 
				
			||||||
            ->{LASTGETTIME} ) < 2
 | 
					            ->{LASTGETTIME} ) < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
@@ -1227,7 +1217,7 @@ sub setDelay {
 | 
				
			|||||||
sub getDelay {
 | 
					sub getDelay {
 | 
				
			||||||
    my $self = shift;
 | 
					    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 );
 | 
					    return ( $val =~ m{^\d+$}xms ? $val : -1 );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1243,7 +1233,7 @@ sub setDelayStart {
 | 
				
			|||||||
sub getDelayStart {
 | 
					sub getDelayStart {
 | 
				
			||||||
    my $self = shift;
 | 
					    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 );
 | 
					    return ( ( $val > 0 && $val =~ m{^\d+$}xms ) ? $val : -1 );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1260,7 +1250,7 @@ sub setBlockingTimeAfterManual {
 | 
				
			|||||||
sub getBlockingTimeAfterManual {
 | 
					sub getBlockingTimeAfterManual {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_afterManual',
 | 
					    return ::AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_afterManual',
 | 
				
			||||||
        1200 );
 | 
					        1200 );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1277,7 +1267,7 @@ sub setBlockingTimeBeforNightClose {
 | 
				
			|||||||
sub getBlockingTimeBeforNightClose {
 | 
					sub getBlockingTimeBeforNightClose {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_beforNightClose',
 | 
					    return ::AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_beforNightClose',
 | 
				
			||||||
        3600 );
 | 
					        3600 );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1294,7 +1284,7 @@ sub setBlockingTimeBeforDayOpen {
 | 
				
			|||||||
sub getBlockingTimeBeforDayOpen {
 | 
					sub getBlockingTimeBeforDayOpen {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_beforDayOpen',
 | 
					    return ::AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_beforDayOpen',
 | 
				
			||||||
        3600 );
 | 
					        3600 );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1310,9 +1300,9 @@ sub setPosCmd {
 | 
				
			|||||||
sub getPosCmd {
 | 
					sub getPosCmd {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $self->{shuttersDev}, 'ASC_Pos_Reading',
 | 
					    return ::AttrVal( $self->{shuttersDev}, 'ASC_Pos_Reading',
 | 
				
			||||||
        $FHEM::Automation::ShuttersControl::userAttrList{'ASC_Pos_Reading'}
 | 
					        $FHEM::Automation::ShuttersControl::userAttrList{'ASC_Pos_Reading'}
 | 
				
			||||||
          [ AttrVal( $self->{shuttersDev}, 'ASC', 1 ) ] );
 | 
					          [ ::AttrVal( $self->{shuttersDev}, 'ASC', 1 ) ] );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub setOpenPos {
 | 
					sub setOpenPos {
 | 
				
			||||||
@@ -1377,7 +1367,7 @@ sub setVentilatePosAfterDayClosed {
 | 
				
			|||||||
sub getVentilatePosAfterDayClosed {
 | 
					sub getVentilatePosAfterDayClosed {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $self->{shuttersDev}, 'ASC_WindowRec_PosAfterDayClosed',
 | 
					    return ::AttrVal( $self->{shuttersDev}, 'ASC_WindowRec_PosAfterDayClosed',
 | 
				
			||||||
        'open' );
 | 
					        'open' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1442,7 +1432,7 @@ sub setVentilateOpen {
 | 
				
			|||||||
sub getVentilateOpen {
 | 
					sub getVentilateOpen {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $self->{shuttersDev}, 'ASC_Ventilate_Window_Open', 'on' );
 | 
					    return ::AttrVal( $self->{shuttersDev}, 'ASC_Ventilate_Window_Open', 'on' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub setComfortOpenPos {
 | 
					sub setComfortOpenPos {
 | 
				
			||||||
@@ -1482,7 +1472,7 @@ sub setPartyMode {
 | 
				
			|||||||
sub getPartyMode {
 | 
					sub getPartyMode {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $self->{shuttersDev}, 'ASC_Partymode', 'off' );
 | 
					    return ::AttrVal( $self->{shuttersDev}, 'ASC_Partymode', 'off' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub setRoommates {
 | 
					sub setRoommates {
 | 
				
			||||||
@@ -1497,7 +1487,7 @@ sub setRoommates {
 | 
				
			|||||||
sub getRoommates {
 | 
					sub getRoommates {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $self->{shuttersDev}, 'ASC_Roommate_Device', 'none' );
 | 
					    return ::AttrVal( $self->{shuttersDev}, 'ASC_Roommate_Device', 'none' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub setRoommatesReading {
 | 
					sub setRoommatesReading {
 | 
				
			||||||
@@ -1512,7 +1502,7 @@ sub setRoommatesReading {
 | 
				
			|||||||
sub getRoommatesReading {
 | 
					sub getRoommatesReading {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $self->{shuttersDev}, 'ASC_Roommate_Reading', 'state' );
 | 
					    return ::AttrVal( $self->{shuttersDev}, 'ASC_Roommate_Reading', 'state' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub getWindPos {
 | 
					sub getWindPos {
 | 
				
			||||||
@@ -1525,7 +1515,7 @@ sub getWindPos {
 | 
				
			|||||||
        exists(
 | 
					        exists(
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
 | 
				
			||||||
        ) < 2
 | 
					        ) < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
@@ -1544,15 +1534,15 @@ sub getWindMax {
 | 
				
			|||||||
        exists(
 | 
					        exists(
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
 | 
				
			||||||
        ) < 2
 | 
					        ) < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
    $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME} =
 | 
					    $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME} =
 | 
				
			||||||
      int( gettimeofday() );
 | 
					      int( ::gettimeofday() );
 | 
				
			||||||
    my ( $max, $hyst, $pos ) =
 | 
					    my ( $max, $hyst, $pos ) =
 | 
				
			||||||
      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
 | 
					      FHEM::Automation::ShuttersControl::Helper::GetAttrValues(
 | 
				
			||||||
        'ASC_WindParameters', '50:20' );
 | 
					        $self->{shuttersDev}, 'ASC_WindParameters', '50:20' );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ## Erwartetes Ergebnis
 | 
					    ## Erwartetes Ergebnis
 | 
				
			||||||
    # max:hyst pos
 | 
					    # max:hyst pos
 | 
				
			||||||
@@ -1560,10 +1550,11 @@ sub getWindMax {
 | 
				
			|||||||
    $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggermax} = $max;
 | 
					    $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggermax} = $max;
 | 
				
			||||||
    $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggerhyst} =
 | 
					    $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggerhyst} =
 | 
				
			||||||
      ( $hyst ne 'none' ? $max - $hyst : $max - 20 );
 | 
					      ( $hyst ne 'none' ? $max - $hyst : $max - 20 );
 | 
				
			||||||
    $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{closedPos} =
 | 
					    $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{closedPos} = (
 | 
				
			||||||
      (   $pos ne 'none'
 | 
					          $pos ne 'none'
 | 
				
			||||||
        ? $pos
 | 
					        ? $pos
 | 
				
			||||||
        : $FHEM::Automation::ShuttersControl::shutters->getOpenPos );
 | 
					        : $FHEM::Automation::ShuttersControl::shutters->getOpenPos
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggermax};
 | 
					    return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggermax};
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -1587,7 +1578,7 @@ sub getWindMin {
 | 
				
			|||||||
        exists(
 | 
					        exists(
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
 | 
				
			||||||
        ) < 2
 | 
					        ) < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
@@ -1608,7 +1599,7 @@ sub setWindProtection {
 | 
				
			|||||||
sub getWindProtection {
 | 
					sub getWindProtection {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $self->{shuttersDev}, 'ASC_WindProtection', 'off' );
 | 
					    return ::AttrVal( $self->{shuttersDev}, 'ASC_WindProtection', 'off' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub setRainProtection {
 | 
					sub setRainProtection {
 | 
				
			||||||
@@ -1623,7 +1614,7 @@ sub setRainProtection {
 | 
				
			|||||||
sub getRainProtection {
 | 
					sub getRainProtection {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $self->{shuttersDev}, 'ASC_RainProtection', 'off' );
 | 
					    return ::AttrVal( $self->{shuttersDev}, 'ASC_RainProtection', 'off' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub setModeUp {
 | 
					sub setModeUp {
 | 
				
			||||||
@@ -1638,7 +1629,7 @@ sub setModeUp {
 | 
				
			|||||||
sub getModeUp {
 | 
					sub getModeUp {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $self->{shuttersDev}, 'ASC_Mode_Up', 'always' );
 | 
					    return ::AttrVal( $self->{shuttersDev}, 'ASC_Mode_Up', 'always' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub setModeDown {
 | 
					sub setModeDown {
 | 
				
			||||||
@@ -1653,7 +1644,7 @@ sub setModeDown {
 | 
				
			|||||||
sub getModeDown {
 | 
					sub getModeDown {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $self->{shuttersDev}, 'ASC_Mode_Down', 'always' );
 | 
					    return ::AttrVal( $self->{shuttersDev}, 'ASC_Mode_Down', 'always' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub setLockOut {
 | 
					sub setLockOut {
 | 
				
			||||||
@@ -1668,7 +1659,7 @@ sub setLockOut {
 | 
				
			|||||||
sub getLockOut {
 | 
					sub getLockOut {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $self->{shuttersDev}, 'ASC_LockOut', 'off' );
 | 
					    return ::AttrVal( $self->{shuttersDev}, 'ASC_LockOut', 'off' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub setLockOutCmd {
 | 
					sub setLockOutCmd {
 | 
				
			||||||
@@ -1683,7 +1674,7 @@ sub setLockOutCmd {
 | 
				
			|||||||
sub getLockOutCmd {
 | 
					sub getLockOutCmd {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $self->{shuttersDev}, 'ASC_LockOut_Cmd', 'none' );
 | 
					    return ::AttrVal( $self->{shuttersDev}, 'ASC_LockOut_Cmd', 'none' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub setAntiFreeze {
 | 
					sub setAntiFreeze {
 | 
				
			||||||
@@ -1698,7 +1689,7 @@ sub setAntiFreeze {
 | 
				
			|||||||
sub getAntiFreeze {
 | 
					sub getAntiFreeze {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $self->{shuttersDev}, 'ASC_Antifreeze', 'off' );
 | 
					    return ::AttrVal( $self->{shuttersDev}, 'ASC_Antifreeze', 'off' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub setAutoAstroModeMorning {
 | 
					sub setAutoAstroModeMorning {
 | 
				
			||||||
@@ -1713,7 +1704,8 @@ sub setAutoAstroModeMorning {
 | 
				
			|||||||
sub getAutoAstroModeMorning {
 | 
					sub getAutoAstroModeMorning {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeMorning', 'none' );
 | 
					    return ::AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeMorning',
 | 
				
			||||||
 | 
					        'none' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub setAutoAstroModeEvening {
 | 
					sub setAutoAstroModeEvening {
 | 
				
			||||||
@@ -1728,7 +1720,8 @@ sub setAutoAstroModeEvening {
 | 
				
			|||||||
sub getAutoAstroModeEvening {
 | 
					sub getAutoAstroModeEvening {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeEvening', 'none' );
 | 
					    return ::AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeEvening',
 | 
				
			||||||
 | 
					        'none' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub setAutoAstroModeMorningHorizon {
 | 
					sub setAutoAstroModeMorningHorizon {
 | 
				
			||||||
@@ -1744,7 +1737,7 @@ sub setAutoAstroModeMorningHorizon {
 | 
				
			|||||||
sub getAutoAstroModeMorningHorizon {
 | 
					sub getAutoAstroModeMorningHorizon {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeMorningHorizon',
 | 
					    return ::AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeMorningHorizon',
 | 
				
			||||||
        0 );
 | 
					        0 );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1761,7 +1754,7 @@ sub setAutoAstroModeEveningHorizon {
 | 
				
			|||||||
sub getAutoAstroModeEveningHorizon {
 | 
					sub getAutoAstroModeEveningHorizon {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeEveningHorizon',
 | 
					    return ::AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeEveningHorizon',
 | 
				
			||||||
        0 );
 | 
					        0 );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1777,7 +1770,7 @@ sub setUp {
 | 
				
			|||||||
sub getUp {
 | 
					sub getUp {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $self->{shuttersDev}, 'ASC_Up', 'astro' );
 | 
					    return ::AttrVal( $self->{shuttersDev}, 'ASC_Up', 'astro' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub setDown {
 | 
					sub setDown {
 | 
				
			||||||
@@ -1792,14 +1785,15 @@ sub setDown {
 | 
				
			|||||||
sub getDown {
 | 
					sub getDown {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $self->{shuttersDev}, 'ASC_Down', 'astro' );
 | 
					    return ::AttrVal( $self->{shuttersDev}, 'ASC_Down', 'astro' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub setShadingBetweenTheTime {
 | 
					sub setShadingBetweenTheTime {
 | 
				
			||||||
    my $self    = shift;
 | 
					    my $self    = shift;
 | 
				
			||||||
    my $attrVal = shift;
 | 
					    my $attrVal = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    _setAttributs( $self->{shuttersDev}, 'ASC_Shading_BetweenTheTime', $attrVal );
 | 
					    _setAttributs( $self->{shuttersDev}, 'ASC_Shading_BetweenTheTime',
 | 
				
			||||||
 | 
					        $attrVal );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -1807,7 +1801,8 @@ sub setShadingBetweenTheTime {
 | 
				
			|||||||
sub getShadingBetweenTheTime {
 | 
					sub getShadingBetweenTheTime {
 | 
				
			||||||
    my $self = shift;
 | 
					    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 {
 | 
					sub setTimeUpEarly {
 | 
				
			||||||
@@ -1822,7 +1817,7 @@ sub setTimeUpEarly {
 | 
				
			|||||||
sub getTimeUpEarly {
 | 
					sub getTimeUpEarly {
 | 
				
			||||||
    my $self = shift;
 | 
					    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) ) ) {
 | 
					    if ( defined( PerlCodeCheck($val) ) ) {
 | 
				
			||||||
        $val = PerlCodeCheck($val);
 | 
					        $val = PerlCodeCheck($val);
 | 
				
			||||||
@@ -1847,7 +1842,7 @@ sub setTimeUpLate {
 | 
				
			|||||||
sub getTimeUpLate {
 | 
					sub getTimeUpLate {
 | 
				
			||||||
    my $self = shift;
 | 
					    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) ) ) {
 | 
					    if ( defined( PerlCodeCheck($val) ) ) {
 | 
				
			||||||
        $val = PerlCodeCheck($val);
 | 
					        $val = PerlCodeCheck($val);
 | 
				
			||||||
@@ -1872,7 +1867,7 @@ sub setTimeDownEarly {
 | 
				
			|||||||
sub getTimeDownEarly {
 | 
					sub getTimeDownEarly {
 | 
				
			||||||
    my $self = shift;
 | 
					    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) ) ) {
 | 
					    if ( defined( PerlCodeCheck($val) ) ) {
 | 
				
			||||||
        $val = PerlCodeCheck($val);
 | 
					        $val = PerlCodeCheck($val);
 | 
				
			||||||
@@ -1897,7 +1892,7 @@ sub setTimeDownLate {
 | 
				
			|||||||
sub getTimeDownLate {
 | 
					sub getTimeDownLate {
 | 
				
			||||||
    my $self = shift;
 | 
					    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) ) ) {
 | 
					    if ( defined( PerlCodeCheck($val) ) ) {
 | 
				
			||||||
        $val = PerlCodeCheck($val);
 | 
					        $val = PerlCodeCheck($val);
 | 
				
			||||||
@@ -1923,7 +1918,7 @@ sub getTimeUpWeHoliday {
 | 
				
			|||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    my $val =
 | 
					    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) ) ) {
 | 
					    if ( defined( PerlCodeCheck($val) ) ) {
 | 
				
			||||||
        $val = PerlCodeCheck($val);
 | 
					        $val = PerlCodeCheck($val);
 | 
				
			||||||
@@ -1945,7 +1940,7 @@ sub getBrightnessMinVal {
 | 
				
			|||||||
            $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
 | 
				
			||||||
              ->{LASTGETTIME}
 | 
					              ->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
 | 
				
			||||||
            ->{LASTGETTIME} ) < 2
 | 
					            ->{LASTGETTIME} ) < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
@@ -1964,7 +1959,7 @@ sub getBrightnessMaxVal {
 | 
				
			|||||||
            $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
 | 
				
			||||||
              ->{LASTGETTIME}
 | 
					              ->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
 | 
				
			||||||
            ->{LASTGETTIME} ) < 2
 | 
					            ->{LASTGETTIME} ) < 2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
@@ -1986,7 +1981,7 @@ sub setDriveUpMaxDuration {
 | 
				
			|||||||
sub getDriveUpMaxDuration {
 | 
					sub getDriveUpMaxDuration {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $self->{shuttersDev}, 'ASC_DriveUpMaxDuration', 60 );
 | 
					    return ::AttrVal( $self->{shuttersDev}, 'ASC_DriveUpMaxDuration', 60 );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1;
 | 
					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
 | 
					#  All rights reserved
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
#   Special thanks goes to:
 | 
					#   Special thanks goes to:
 | 
				
			||||||
@@ -44,21 +44,10 @@ use strict;
 | 
				
			|||||||
use warnings;
 | 
					use warnings;
 | 
				
			||||||
use utf8;
 | 
					use utf8;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use GPUtils qw(GP_Import);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Import der FHEM Funktionen
 | 
					 | 
				
			||||||
BEGIN {
 | 
					 | 
				
			||||||
    GP_Import(
 | 
					 | 
				
			||||||
        qw(
 | 
					 | 
				
			||||||
          ReadingsVal
 | 
					 | 
				
			||||||
          ReadingsNum)
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
sub getBrightness {
 | 
					sub getBrightness {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return ReadingsNum(
 | 
					    return ::ReadingsNum(
 | 
				
			||||||
        $FHEM::Automation::ShuttersControl::shutters->_getBrightnessSensor,
 | 
					        $FHEM::Automation::ShuttersControl::shutters->_getBrightnessSensor,
 | 
				
			||||||
        $FHEM::Automation::ShuttersControl::shutters->getBrightnessReading,
 | 
					        $FHEM::Automation::ShuttersControl::shutters->getBrightnessReading,
 | 
				
			||||||
        -1 );
 | 
					        -1 );
 | 
				
			||||||
@@ -67,7 +56,7 @@ sub getBrightness {
 | 
				
			|||||||
sub getWindStatus {
 | 
					sub getWindStatus {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return ReadingsVal(
 | 
					    return ::ReadingsVal(
 | 
				
			||||||
        $FHEM::Automation::ShuttersControl::ascDev->_getWindSensor,
 | 
					        $FHEM::Automation::ShuttersControl::ascDev->_getWindSensor,
 | 
				
			||||||
        $FHEM::Automation::ShuttersControl::ascDev->getWindSensorReading, -1 );
 | 
					        $FHEM::Automation::ShuttersControl::ascDev->getWindSensorReading, -1 );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -75,7 +64,7 @@ sub getWindStatus {
 | 
				
			|||||||
sub getStatus {
 | 
					sub getStatus {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return ReadingsNum( $self->{shuttersDev},
 | 
					    return ::ReadingsNum( $self->{shuttersDev},
 | 
				
			||||||
        $FHEM::Automation::ShuttersControl::shutters->getPosCmd, 0 );
 | 
					        $FHEM::Automation::ShuttersControl::shutters->getPosCmd, 0 );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -88,7 +77,7 @@ sub getDelayCmd {
 | 
				
			|||||||
sub getASCenable {
 | 
					sub getASCenable {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return ReadingsVal( $self->{shuttersDev}, 'ASC_Enable', 'on' );
 | 
					    return ::ReadingsVal( $self->{shuttersDev}, 'ASC_Enable', 'on' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1;
 | 
					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
 | 
					#  All rights reserved
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
#   Special thanks goes to:
 | 
					#   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
 | 
					#  All rights reserved
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
#   Special thanks goes to:
 | 
					#   Special thanks goes to:
 | 
				
			||||||
@@ -44,17 +44,6 @@ use strict;
 | 
				
			|||||||
use warnings;
 | 
					use warnings;
 | 
				
			||||||
use utf8;
 | 
					use utf8;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use GPUtils qw(GP_Import);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Import der FHEM Funktionen
 | 
					 | 
				
			||||||
BEGIN {
 | 
					 | 
				
			||||||
    GP_Import(
 | 
					 | 
				
			||||||
        qw(
 | 
					 | 
				
			||||||
          AttrVal
 | 
					 | 
				
			||||||
          gettimeofday)
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
sub setSubTyp {
 | 
					sub setSubTyp {
 | 
				
			||||||
    my $self    = shift;
 | 
					    my $self    = shift;
 | 
				
			||||||
    my $attrVal = shift;
 | 
					    my $attrVal = shift;
 | 
				
			||||||
@@ -67,7 +56,8 @@ sub setSubTyp {
 | 
				
			|||||||
sub getSubTyp {
 | 
					sub getSubTyp {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return AttrVal( $self->{shuttersDev}, 'ASC_WindowRec_subType', 'twostate' );
 | 
					    return ::AttrVal( $self->{shuttersDev}, 'ASC_WindowRec_subType',
 | 
				
			||||||
 | 
					        'twostate' );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub setWinDev {
 | 
					sub setWinDev {
 | 
				
			||||||
@@ -87,15 +77,15 @@ sub _getWinDev {
 | 
				
			|||||||
        exists(
 | 
					        exists(
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} ) <
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} ) <
 | 
				
			||||||
        2
 | 
					        2
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
    $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} =
 | 
					    $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} =
 | 
				
			||||||
      int( gettimeofday() );
 | 
					      int( ::gettimeofday() );
 | 
				
			||||||
    my ( $device, $reading ) =
 | 
					    my ( $device, $reading ) =
 | 
				
			||||||
      FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
 | 
					      FHEM::Automation::ShuttersControl::Helper::GetAttrValues(
 | 
				
			||||||
        'ASC_WindowRec', 'none' );
 | 
					        $self->{shuttersDev}, 'ASC_WindowRec', 'none' );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ### erwartetes Ergebnis
 | 
					    ### erwartetes Ergebnis
 | 
				
			||||||
    # DEVICE:READING VALUEACTIVE:VALUEINACTIVE POSACTIVE:POSINACTIVE
 | 
					    # DEVICE:READING VALUEACTIVE:VALUEINACTIVE POSACTIVE:POSINACTIVE
 | 
				
			||||||
@@ -116,7 +106,7 @@ sub getWinDevReading {
 | 
				
			|||||||
        exists(
 | 
					        exists(
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME}
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        && ( gettimeofday() -
 | 
					        && ( ::gettimeofday() -
 | 
				
			||||||
            $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} ) <
 | 
					            $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} ) <
 | 
				
			||||||
        2
 | 
					        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
 | 
					#  All rights reserved
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
#   Special thanks goes to:
 | 
					#   Special thanks goes to:
 | 
				
			||||||
@@ -44,20 +44,10 @@ use strict;
 | 
				
			|||||||
use warnings;
 | 
					use warnings;
 | 
				
			||||||
use utf8;
 | 
					use utf8;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use GPUtils qw(GP_Import);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Import der FHEM Funktionen
 | 
					 | 
				
			||||||
BEGIN {
 | 
					 | 
				
			||||||
    GP_Import(
 | 
					 | 
				
			||||||
        qw(
 | 
					 | 
				
			||||||
          ReadingsVal)
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
sub getWinStatus {
 | 
					sub getWinStatus {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return ReadingsVal(
 | 
					    return ::ReadingsVal(
 | 
				
			||||||
        $FHEM::Automation::ShuttersControl::shutters->_getWinDev,
 | 
					        $FHEM::Automation::ShuttersControl::shutters->_getWinDev,
 | 
				
			||||||
        $FHEM::Automation::ShuttersControl::shutters->getWinDevReading,
 | 
					        $FHEM::Automation::ShuttersControl::shutters->getWinDevReading,
 | 
				
			||||||
        'closed' );
 | 
					        'closed' );
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user