From ed5be615e06850bc6eea167683ade5d4f889ad87 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Sun, 19 Apr 2020 10:10:55 +0200 Subject: [PATCH 01/60] remove shutter device tempsensor in AntiFreeze condition, use only ASC device tempsensor --- 73_AutoShuttersControl.pm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index 807bf65..5f49e92 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -4852,8 +4852,8 @@ sub setDriveCmd { if ( $shutters->getExternalTriggerState ); ### antifreeze Routine - if ( $shutters->getFreezeStatus > 0 ) { - if ( $shutters->getFreezeStatus != 1 ) { + if ( $shutters->getAntiFreezeStatus > 0 ) { + if ( $shutters->getAntiFreezeStatus != 1 ) { $posValue = $shutters->getStatus; $shutters->setLastDrive('no drive - antifreeze defense'); @@ -5129,7 +5129,7 @@ sub getIsDay { return FHEM::AutoShuttersControl::_IsDay( $self->{shuttersDev} ); } -sub getFreezeStatus { +sub getAntiFreezeStatus { use POSIX qw(strftime); my $self = shift; my $daytime = strftime( "%P", localtime() ); @@ -5139,7 +5139,7 @@ sub getFreezeStatus { : ( strftime( "%k", localtime() ) < 12 ? 'am' : 'pm' ) ); my $outTemp = $ascDev->getOutTemp; - $outTemp = $shutters->getOutTemp if ( $shutters->getOutTemp != -100 ); +# $outTemp = $shutters->getOutTemp if ( $shutters->getOutTemp != -100 ); sollte raus das der Sensor im Rollo auch ein Innentemperatursensor sein kann. if ( $shutters->getAntiFreeze ne 'off' && $outTemp <= $ascDev->getFreezeTemp ) @@ -8688,7 +8688,7 @@ sub getBlockAscDrivesAfterManual { ], "release_status": "testing", "license": "GPL_2", - "version": "v0.9.9", + "version": "v0.9.10", "author": [ "Marko Oldenburg " ], From 107a2b1c965c988a1151f10e1c0a50e90d8b6ef3 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Sun, 19 Apr 2020 13:32:51 +0200 Subject: [PATCH 02/60] rolleback ASC_Shading_Mode default to off --- 73_AutoShuttersControl.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index 5f49e92..63da094 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -6009,7 +6009,7 @@ sub getShadingPositionAssignment { sub getShadingMode { my $self = shift; - return AttrVal( $self->{shuttersDev}, 'ASC_Shading_Mode', 'always' ); + return AttrVal( $self->{shuttersDev}, 'ASC_Shading_Mode', 'off' ); } sub _getTempSensor { From e4a2f824197dad1885531d6e63d3cc493f52d0aa Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Sun, 19 Apr 2020 15:16:21 +0200 Subject: [PATCH 03/60] add first works shadind condition info --- 73_AutoShuttersControl.pm | 75 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 73 insertions(+), 2 deletions(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index 63da094..af0bd1c 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -645,7 +645,19 @@ sub Set { } elsif ( lc $cmd eq 'controlshading' ) { return "usage: $cmd" if ( scalar( @{$a} ) > 1 ); - readingsSingleUpdate( $hash, $cmd, $a->[0], 1 ); + + my $response = _CheckASC_ConditionsForShadingFn($hash); + readingsSingleUpdate( + $hash, $cmd, + ( + $a->[0] eq 'off' ? $a->[0] + : ( + $response eq 'none' ? $a->[0] + : $response + ) + ), + 1 + ); } elsif ( lc $cmd eq 'selfdefense' ) { return "usage: $cmd" if ( scalar( @{$a} ) > 1 ); @@ -4713,6 +4725,64 @@ sub DevStateIcon { return; } +sub _CheckASC_ConditionsForShadingFn { + my $hash = shift; + + my $error; + + $error .= ' no valid data from the ASC temperature sensor' + if ( $ascDev->getOutTemp == -100 ); + $error .= ' no twilight device found' + if ( $ascDev->_getTwilightDevice eq 'none' ); + + my $count = 1; + for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { + InternalTimer( gettimeofday() + $count, + 'FHEM::AutoShuttersControl::_CheckShuttersConditionsForShadingFn', + $shuttersDev ); + + $count++; + } + + return ( + defined($error) + ? $error + : 'none' + ); +} + +sub _CheckShuttersConditionsForShadingFn { + my $shuttersDev = shift; + + $shutters->setShuttersDev($shuttersDev); + my $shuttersDevHash = $defs{$shuttersDev}; + my $message = 'none'; + my $errorMessage; + my $warnMessage; + my $infoMessage; + + $infoMessage .= + ( $shutters->getShadingMode eq 'off' + && $ascDev->getAutoShuttersControlShading eq 'on' + ? ' global shading activ but no ASC_Shading_Mode attribut set' + : 'none' ); + + $message .= ' ERROR: ' . $errorMessage + if ( defined($errorMessage) + && $errorMessage ne 'none' ); + + $message .= ' WARN: ' . $warnMessage + if ( defined($warnMessage) + && $warnMessage ne 'none' ); + + $message .= ' INFO: ' . $infoMessage + if ( defined($infoMessage) + && $infoMessage ne 'none' ); + + readingsSingleUpdate( $shuttersDevHash, 'ASC_Shading_Message', $message, + 1 ); +} + ###################################### ###################################### ########## Begin der Klassendeklarierungen für OOP (Objektorientierte Programmierung) ######################### @@ -5139,6 +5209,7 @@ sub getAntiFreezeStatus { : ( strftime( "%k", localtime() ) < 12 ? 'am' : 'pm' ) ); my $outTemp = $ascDev->getOutTemp; + # $outTemp = $shutters->getOutTemp if ( $shutters->getOutTemp != -100 ); sollte raus das der Sensor im Rollo auch ein Innentemperatursensor sein kann. if ( $shutters->getAntiFreeze ne 'off' @@ -8688,7 +8759,7 @@ sub getBlockAscDrivesAfterManual { ], "release_status": "testing", "license": "GPL_2", - "version": "v0.9.10", + "version": "v0.9.11", "author": [ "Marko Oldenburg " ], From 63ec20cde650bd9121202448c6eb64444ca326d1 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Sun, 19 Apr 2020 16:58:10 +0200 Subject: [PATCH 04/60] add more shading information at shutters --- 73_AutoShuttersControl.pm | 44 +++++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index af0bd1c..5ec0e6a 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -471,6 +471,12 @@ sub Notify { $hash ); InternalTimer( gettimeofday() + 5, 'FHEM::AutoShuttersControl::AutoSearchTwilightDev', $hash ); + InternalTimer( + gettimeofday() + 5, + sub() { CommandSet( undef, $name . ' controlShading on' ) }, + $hash + ) + if ( ReadingsVal( $name, 'controlShading', 'off' ) eq 'on' ); } } elsif ( grep m{^partyMode:.off$}xms, @{$events} ) { @@ -4730,7 +4736,7 @@ sub _CheckASC_ConditionsForShadingFn { my $error; - $error .= ' no valid data from the ASC temperature sensor' + $error .= ' no valid data from the ASC temperature sensor, is ASC_tempSensor attribut set?' if ( $ascDev->getOutTemp == -100 ); $error .= ' no twilight device found' if ( $ascDev->_getTwilightDevice eq 'none' ); @@ -4756,31 +4762,47 @@ sub _CheckShuttersConditionsForShadingFn { $shutters->setShuttersDev($shuttersDev); my $shuttersDevHash = $defs{$shuttersDev}; - my $message = 'none'; + my $message = ''; my $errorMessage; my $warnMessage; my $infoMessage; - $infoMessage .= - ( $shutters->getShadingMode eq 'off' + $infoMessage .= ( + $shutters->getShadingMode eq 'off' && $ascDev->getAutoShuttersControlShading eq 'on' - ? ' global shading activ but no ASC_Shading_Mode attribut set' - : 'none' ); + ? ' global shading active but ASC_Shading_Mode attribut is not set' + : '' + ); + + $infoMessage .= ( + $shutters->getShadingMode ne 'off' + && $ascDev->getAutoShuttersControlShading eq 'on' + && $shutters->getOutTemp == -100 + ? ' shading active, global temp sensor is set, but shutters temperature sensor is not set' + : '' + ); + + $warnMessage .= ( + $shutters->getShadingMode ne 'off' + && $ascDev->getAutoShuttersControlShading ne 'on' + && $ascDev->getAutoShuttersControlShading ne 'off' + ? ' ASC_Shading_Mode attribut is set but global shading has errors, look at ASC device' + : '' + ); $message .= ' ERROR: ' . $errorMessage if ( defined($errorMessage) - && $errorMessage ne 'none' ); + && $errorMessage ne '' ); $message .= ' WARN: ' . $warnMessage if ( defined($warnMessage) - && $warnMessage ne 'none' ); + && $warnMessage ne '' ); $message .= ' INFO: ' . $infoMessage if ( defined($infoMessage) - && $infoMessage ne 'none' ); + && $infoMessage ne '' ); - readingsSingleUpdate( $shuttersDevHash, 'ASC_Shading_Message', $message, - 1 ); + readingsSingleUpdate( $shuttersDevHash, 'ASC_ShadingMessage', $message, 1 ); } ###################################### From fc81592a32b875a228309c2d349948bff4cbf4be Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Sun, 19 Apr 2020 17:38:43 +0200 Subject: [PATCH 05/60] add more shading information at shutters --- 73_AutoShuttersControl.pm | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index 5ec0e6a..d0ebf37 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -45,6 +45,7 @@ package main; use strict; use warnings; +use utf8; sub ascAPIget { my ( $getCommand, $shutterDev, $value ) = @_; @@ -59,6 +60,7 @@ use strict; use warnings; use POSIX qw(strftime); use utf8; + use Encode; use FHEM::Meta; use GPUtils qw(GP_Import GP_Export); @@ -4736,7 +4738,8 @@ sub _CheckASC_ConditionsForShadingFn { my $error; - $error .= ' no valid data from the ASC temperature sensor, is ASC_tempSensor attribut set?' + $error .= +' no valid data from the ASC temperature sensor, is ASC_tempSensor attribut set?' if ( $ascDev->getOutTemp == -100 ); $error .= ' no twilight device found' if ( $ascDev->_getTwilightDevice eq 'none' ); @@ -4786,7 +4789,13 @@ sub _CheckShuttersConditionsForShadingFn { $shutters->getShadingMode ne 'off' && $ascDev->getAutoShuttersControlShading ne 'on' && $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 ' + . '' + . ReadingsVal( $shuttersDev, 'associatedWith', 'ASC device' ) + . '' : '' ); @@ -4802,7 +4811,8 @@ sub _CheckShuttersConditionsForShadingFn { if ( defined($infoMessage) && $infoMessage ne '' ); - readingsSingleUpdate( $shuttersDevHash, 'ASC_ShadingMessage', $message, 1 ); + readingsSingleUpdate( $shuttersDevHash, 'ASC_ShadingMessage', + '' . $message . ' ', 1 ); } ###################################### @@ -7121,6 +7131,11 @@ sub getASCenable { ## Klasse Fenster (Window) und die Subklassen Attr und Readings ## package ASC_Window; + +use strict; +use warnings; +use utf8; + our @ISA = qw(ASC_Window::Attr ASC_Window::Readings); ## Subklasse Attr von Klasse ASC_Window ## @@ -8781,7 +8796,7 @@ sub getBlockAscDrivesAfterManual { ], "release_status": "testing", "license": "GPL_2", - "version": "v0.9.11", + "version": "v0.9.12", "author": [ "Marko Oldenburg " ], From 2a90962675860d318b7ad1f03e20596d10cc38f9 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Mon, 20 Apr 2020 14:52:27 +0200 Subject: [PATCH 06/60] add more shading information in reading --- 73_AutoShuttersControl.pm | 53 ++++++++++++++++++++++++++++++++------- 1 file changed, 44 insertions(+), 9 deletions(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index d0ebf37..1b8f832 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -478,7 +478,7 @@ sub Notify { sub() { CommandSet( undef, $name . ' controlShading on' ) }, $hash ) - if ( ReadingsVal( $name, 'controlShading', 'off' ) eq 'on' ); + if ( ReadingsVal( $name, 'controlShading', 'off' ) ne 'off' ); } } elsif ( grep m{^partyMode:.off$}xms, @{$events} ) { @@ -492,7 +492,7 @@ sub Notify { { # Kommt ein globales Event und beinhaltet folgende Syntax wird die Funktion zur Verarbeitung aufgerufen if ( grep -m{^(ATTR|DELETEATTR)\s(.*ASC_Time_Up_WE_Holiday|.*ASC_Up|.*ASC_Down|.*ASC_AutoAstroModeMorning|.*ASC_AutoAstroModeMorningHorizon|.*ASC_AutoAstroModeEvening|.*ASC_AutoAstroModeEveningHorizon|.*ASC_Time_Up_Early|.*ASC_Time_Up_Late|.*ASC_Time_Down_Early|.*ASC_Time_Down_Late|.*ASC_autoAstroModeMorning|.*ASC_autoAstroModeMorningHorizon|.*ASC_PrivacyDownValue_beforeNightClose|.*ASC_PrivacyUpValue_beforeDayOpen|.*ASC_autoAstroModeEvening|.*ASC_autoAstroModeEveningHorizon|.*ASC_Roommate_Device|.*ASC_WindowRec|.*ASC_residentsDev|.*ASC_rainSensor|.*ASC_windSensor|.*ASC_BrightnessSensor|.*ASC_twilightDevice|.*ASC_ExternalTrigger)(\s.*|$)}xms, +m{^(ATTR|DELETEATTR)\s(.*ASC_Time_Up_WE_Holiday|.*ASC_Up|.*ASC_Down|.*ASC_AutoAstroModeMorning|.*ASC_AutoAstroModeMorningHorizon|.*ASC_AutoAstroModeEvening|.*ASC_AutoAstroModeEveningHorizon|.*ASC_Time_Up_Early|.*ASC_Time_Up_Late|.*ASC_Time_Down_Early|.*ASC_Time_Down_Late|.*ASC_autoAstroModeMorning|.*ASC_autoAstroModeMorningHorizon|.*ASC_PrivacyDownValue_beforeNightClose|.*ASC_PrivacyUpValue_beforeDayOpen|.*ASC_autoAstroModeEvening|.*ASC_autoAstroModeEveningHorizon|.*ASC_Roommate_Device|.*ASC_WindowRec|.*ASC_residentsDev|.*ASC_rainSensor|.*ASC_windSensor|.*ASC_tempSensor|.*ASC_BrightnessSensor|.*ASC_twilightDevice|.*ASC_ExternalTrigger)(\s.*|$)}xms, @{$events} ) { @@ -609,6 +609,20 @@ sub EventProcessingGeneral { { RenewSunRiseSetShuttersTimer($hash); } + + if ( + $events =~ +m{^(DELETEATTR|ATTR) #global ATTR myASC ASC_tempSensor Cellar + \s(.*)\s(ASC_tempSensor + |ASC_Shading_Mode + |ASC_BrightnessSensor + |ASC_TempSensor) + (.*)?}xms + ) + { + CommandSet( undef, $name . ' controlShading on' ) + if ( ReadingsVal( $name, 'controlShading', 'off' ) ne 'off' ); + } } return; @@ -2443,9 +2457,12 @@ sub ShadingProcessing { && $brightness > $shutters->getShadingStateChangeSunny && $outTemp > $shutters->getShadingMinOutsideTemperature ) { - $shutters->setShadingStatus('in reserved') - if ( $shutters->getShadingStatus eq 'out' - || $shutters->getShadingStatus eq 'out reserved' ); + if ( $shutters->getShadingStatus eq 'out' + || $shutters->getShadingStatus eq 'out reserved' ) + { + $shutters->setShadingStatus('in reserved'); + + } if ( $shutters->getShadingStatus eq 'in reserved' and @@ -2499,6 +2516,16 @@ sub ShadingProcessing { ) ); + readingsSingleUpdate( + $defs{$shuttersDev}, + 'ASC_ShadingMessage', + 'INFO: current shading status is \'' + . $shutters->getShadingStatus . '\'', + 1 + ) + if ( $shutters->getShadingStatus ne 'in' + && $shutters->getShadingStatus ne 'out' ); + return; } @@ -4785,7 +4812,7 @@ sub _CheckShuttersConditionsForShadingFn { : '' ); - $warnMessage .= ( + $errorMessage .= ( $shutters->getShadingMode ne 'off' && $ascDev->getAutoShuttersControlShading ne 'on' && $ascDev->getAutoShuttersControlShading ne 'off' @@ -4799,17 +4826,25 @@ sub _CheckShuttersConditionsForShadingFn { : '' ); + $errorMessage .= ( + $shutters->getBrightness == -1 && $shutters->getShadingMode ne 'off' + ? ' no brightness sensor found, please set ASC_BrightnessSensor attribut' + : '' + ); + $message .= ' ERROR: ' . $errorMessage if ( defined($errorMessage) && $errorMessage ne '' ); $message .= ' WARN: ' . $warnMessage if ( defined($warnMessage) - && $warnMessage ne '' ); + && $warnMessage ne '' + && $errorMessage eq '' ); $message .= ' INFO: ' . $infoMessage if ( defined($infoMessage) - && $infoMessage ne '' ); + && $infoMessage ne '' + && $errorMessage eq '' ); readingsSingleUpdate( $shuttersDevHash, 'ASC_ShadingMessage', '' . $message . ' ', 1 ); @@ -8796,7 +8831,7 @@ sub getBlockAscDrivesAfterManual { ], "release_status": "testing", "license": "GPL_2", - "version": "v0.9.12", + "version": "v0.9.13", "author": [ "Marko Oldenburg " ], From 3e7becaf89acae83fcb70cc06cb9c88639ee4290 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Mon, 20 Apr 2020 14:59:46 +0200 Subject: [PATCH 07/60] little fix --- 73_AutoShuttersControl.pm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index 1b8f832..8c74595 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -2522,9 +2522,7 @@ sub ShadingProcessing { 'INFO: current shading status is \'' . $shutters->getShadingStatus . '\'', 1 - ) - if ( $shutters->getShadingStatus ne 'in' - && $shutters->getShadingStatus ne 'out' ); + ); return; } From 9d77ac4811dc257378e60d8ba11ccd09a5ba1e47 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Mon, 20 Apr 2020 15:17:33 +0200 Subject: [PATCH 08/60] fix Eventhandling --- 73_AutoShuttersControl.pm | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index 8c74595..38eb526 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -2379,6 +2379,7 @@ sub ShadingProcessing { my $getShadingPos = $shutters->getShadingPos; my $getStatus = $shutters->getStatus; my $oldShadingStatus = $shutters->getShadingStatus; + my $shuttersDevHash = $defs{$shuttersDev}; my $getModeUp = $shutters->getModeUp; my $homemode = $shutters->getHomemode; @@ -2516,13 +2517,14 @@ sub ShadingProcessing { ) ); - readingsSingleUpdate( - $defs{$shuttersDev}, + readingsBeginUpdate($shuttersDevHash); + readingsBulkUpdateIfChanged( + $shuttersDevHash, 'ASC_ShadingMessage', 'INFO: current shading status is \'' . $shutters->getShadingStatus . '\'', - 1 - ); + ); + readingsEndUpdate( $shuttersDevHash, 1 ); return; } @@ -4844,8 +4846,10 @@ sub _CheckShuttersConditionsForShadingFn { && $infoMessage ne '' && $errorMessage eq '' ); - readingsSingleUpdate( $shuttersDevHash, 'ASC_ShadingMessage', - '' . $message . ' ', 1 ); + readingsBeginUpdate($shuttersDevHash); + readingsBulkUpdateIfChanged( $shuttersDevHash, 'ASC_ShadingMessage', + '' . $message . ' ' ); + readingsEndUpdate( $shuttersDevHash, 1 ); } ###################################### From 005340a2faf19ef2cd2c6646aedd40c5a95d75c4 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Tue, 21 Apr 2020 18:42:16 +0200 Subject: [PATCH 09/60] add more info for shading information reading --- 73_AutoShuttersControl.pm | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index 38eb526..722d6e6 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -2518,11 +2518,23 @@ sub ShadingProcessing { ); readingsBeginUpdate($shuttersDevHash); - readingsBulkUpdateIfChanged( + readingsBulkUpdate( $shuttersDevHash, 'ASC_ShadingMessage', 'INFO: current shading status is \'' - . $shutters->getShadingStatus . '\'', + . $shutters->getShadingStatus . '\'' + . ' - next check in ' + . ( + ( + ( + $shutters->getShadingLastStatus eq 'out reserved' + || $shutters->getShadingLastStatus eq 'out' + ) + ? $shutters->getShadingWaitingPeriod + : $shutters->getShadingWaitingPeriod / 2 + ) + ) / 60 + . 'm' ); readingsEndUpdate( $shuttersDevHash, 1 ); @@ -4800,7 +4812,7 @@ sub _CheckShuttersConditionsForShadingFn { $infoMessage .= ( $shutters->getShadingMode eq 'off' && $ascDev->getAutoShuttersControlShading eq 'on' - ? ' global shading active but ASC_Shading_Mode attribut is not set' + ? ' global shading active but ASC_Shading_Mode attribut is not set or off' : '' ); @@ -8599,6 +8611,9 @@ sub getBlockAscDrivesAfterManual {
  • ASC_Time_DriveUp - Im Astro-Modus ist hier die Sonnenaufgangszeit für das Rollo gespeichert. Im Brightnessmodus ist hier der Zeitpunkt aus dem Attribut ASC_Time_Up_Late gespeichert. Im Timemodus ist hier der Zeitpunkt aus dem Attribut ASC_Time_Up_Early gespeichert.
  • ASC_Time_DriveDown - Im Astro-Modus ist hier die Sonnenuntergangszeit für das Rollo gespeichert. Im Brightnessmodus ist hier der Zeitpunkt aus dem Attribut ASC_Time_Down_Late gespeichert. Im Timemodus ist hier der Zeitpunkt aus dem Attribut ASC_Time_Down_Early gespeichert.
  • ASC_ShuttersLastDrive - Grund der letzten Fahrt vom Rollladen
  • +
  • ASC_ShadingMessage -
  • +
  • ASC_Time_PrivacyDriveDown -
  • +
  • ASC_Time_PrivacyDriveUp -


  • @@ -8833,7 +8848,7 @@ sub getBlockAscDrivesAfterManual { ], "release_status": "testing", "license": "GPL_2", - "version": "v0.9.13", + "version": "v0.9.14", "author": [ "Marko Oldenburg " ], From d98e5a903c4f341d4b0cfc510ce937a9aa335e7e Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Tue, 21 Apr 2020 23:29:12 +0200 Subject: [PATCH 10/60] add my Scalar in all loop declaration, more robust for NOTIFYDEV after reboot --- 73_AutoShuttersControl.pm | 241 +++++++++++++++++++------------------- 1 file changed, 120 insertions(+), 121 deletions(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index 722d6e6..69589f6 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -774,43 +774,43 @@ sub ShuttersDeviceScan { return; } my $shuttersList = ''; - for (@list) { - push( @{ $hash->{helper}{shuttersList} }, $_ ) + for my $shuttersDev (@list) { + push( @{ $hash->{helper}{shuttersList} }, $shuttersDev ) ; ## einem Hash wird ein Array zugewiesen welches die Liste der erkannten Rollos beinhaltet - $shutters->setShuttersDev($_); + $shutters->setShuttersDev($shuttersDev); #### Ab hier können temporäre Änderungen der Attribute gesetzt werden #### Gleichlautende Attribute wo lediglich die Parameter geändert werden sollen müssen hier gelöscht und die Parameter in der Funktion renewSetSunriseSunsetTimer gesetzt werden, #### vorher empfiehlt es sich die dort vergebenen Parameter aus zu lesen um sie dann hier wieder neu zu setzen. Dazu wird das shutters Objekt um einen Eintrag #### 'AttrUpdateChanges' erweitert - if ( ReadingsVal( $_, '.ASC_AttrUpdateChanges_' . $hash->{VERSION}, 0 ) + if ( ReadingsVal( $shuttersDev, '.ASC_AttrUpdateChanges_' . $hash->{VERSION}, 0 ) == 0 ) { # $shutters->setAttrUpdateChanges( 'ASC_Up', - # AttrVal( $_, 'ASC_Up', 'none' ) ); - # delFromDevAttrList( $_, 'ASC_Up' ); + # AttrVal( $shuttersDev, 'ASC_Up', 'none' ) ); + # delFromDevAttrList( $shuttersDev, 'ASC_Up' ); # $shutters->setAttrUpdateChanges( 'ASC_Down', - # AttrVal( $_, 'ASC_Down', 'none' ) ); - # delFromDevAttrList( $_, 'ASC_Down' ); + # AttrVal( $shuttersDev, 'ASC_Down', 'none' ) ); + # delFromDevAttrList( $shuttersDev, 'ASC_Down' ); # $shutters->setAttrUpdateChanges( 'ASC_Self_Defense_Mode', - # AttrVal( $_, 'ASC_Self_Defense_Mode', 'none' ) ); - # delFromDevAttrList( $_, 'ASC_Self_Defense_Mode' ); + # AttrVal( $shuttersDev, 'ASC_Self_Defense_Mode', 'none' ) ); + # delFromDevAttrList( $shuttersDev, 'ASC_Self_Defense_Mode' ); # $shutters->setAttrUpdateChanges( 'ASC_Self_Defense_Exclude', - # AttrVal( $_, 'ASC_Self_Defense_Exclude', 'none' ) ); - # delFromDevAttrList( $_, 'ASC_Self_Defense_Exclude' ); + # AttrVal( $shuttersDev, 'ASC_Self_Defense_Exclude', 'none' ) ); + # delFromDevAttrList( $shuttersDev, 'ASC_Self_Defense_Exclude' ); } #### #### - $shuttersList = $shuttersList . ',' . $_; + $shuttersList = $shuttersList . ',' . $shuttersDev; $shutters->setLastManPos( $shutters->getStatus ); $shutters->setLastPos( $shutters->getStatus ); $shutters->setDelayCmd('none'); $shutters->setNoDelay(0); $shutters->setSelfDefenseAbsent( 0, 0 ); - $shutters->setPosSetCmd( $posSetCmds{ $defs{$_}->{TYPE} } ); + $shutters->setPosSetCmd( $posSetCmds{ $defs{$shuttersDev}->{TYPE} } ); $shutters->setShadingStatus( ( $shutters->getStatus != $shutters->getShadingPos ? 'out' : 'in' ) ); @@ -819,8 +819,8 @@ sub ShuttersDeviceScan { # ( $shutters->getStatus != $shutters->getShadingPos ? 'in' : 'out' ) # ); $shutters->setPushBrightnessInArray( $shutters->getBrightness ); - readingsSingleUpdate( $defs{$_}, 'ASC_Enable', 'on', 0 ) - if ( ReadingsVal( $_, 'ASC_Enable', 'none' ) eq 'none' ); + readingsSingleUpdate( $defs{$shuttersDev}, 'ASC_Enable', 'on', 0 ) + if ( ReadingsVal( $shuttersDev, 'ASC_Enable', 'none' ) eq 'none' ); if ( $shutters->getIsDay ) { $shutters->setSunrise(1); @@ -838,8 +838,8 @@ sub ShuttersDeviceScan { $hash->{monitoredDevs} = eval { decode_json( $ascDev->getMonitoredDevs ) }; my $notifyDevString = $hash->{NOTIFYDEV}; - while ( each %{ $hash->{monitoredDevs} } ) { - $notifyDevString .= ',' . $_; + while ( my $shuttersDev = each %{ $hash->{monitoredDevs} } ) { + $notifyDevString .= ',' . $shuttersDev; } $hash->{NOTIFYDEV} = $notifyDevString; } @@ -858,32 +858,32 @@ sub WriteReadingsShuttersList { CommandDeleteReading( undef, $name . ' room_.*' ); readingsBeginUpdate($hash); - for ( @{ $hash->{helper}{shuttersList} } ) { + for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { readingsBulkUpdate( $hash, - 'room_' . makeReadingName( AttrVal( $_, 'room', 'unsorted' ) ), + 'room_' . makeReadingName( AttrVal( $shuttersDev, 'room', 'unsorted' ) ), ReadingsVal( $name, - 'room_' . makeReadingName( AttrVal( $_, 'room', 'unsorted' ) ), + 'room_' . makeReadingName( AttrVal( $shuttersDev, 'room', 'unsorted' ) ), '' ) . ',' - . $_ + . $shuttersDev ) if ( ReadingsVal( $name, - 'room_' . makeReadingName( AttrVal( $_, 'room', 'unsorted' ) ), + 'room_' . makeReadingName( AttrVal( $shuttersDev, 'room', 'unsorted' ) ), 'none' ) ne 'none' ); readingsBulkUpdate( $hash, - 'room_' . makeReadingName( AttrVal( $_, 'room', 'unsorted' ) ), $_ ) + 'room_' . makeReadingName( AttrVal( $shuttersDev, 'room', 'unsorted' ) ), $shuttersDev ) if ( ReadingsVal( $name, - 'room_' . makeReadingName( AttrVal( $_, 'room', 'unsorted' ) ), + 'room_' . makeReadingName( AttrVal( $shuttersDev, 'room', 'unsorted' ) ), 'none' ) eq 'none' ); @@ -901,64 +901,64 @@ sub UserAttributs_Readings_ForShutters { my $name = $hash->{NAME}; while ( my ( $attrib, $attribValue ) = each %{userAttrList} ) { - for ( @{ $hash->{helper}{shuttersList} } ) { - addToDevAttrList( $_, $attrib ) + for my $shuttersDev( @{ $hash->{helper}{shuttersList} } ) { + addToDevAttrList( $shuttersDev, $attrib ) ; ## fhem.pl bietet eine Funktion um ein userAttr Attribut zu befüllen. Wir schreiben also in den Attribut userAttr alle unsere Attribute rein. Pro Rolladen immer ein Attribut pro Durchlauf ## Danach werden die Attribute die im userAttr stehen gesetzt und mit default Werten befüllt ## CommandAttr hat nicht funktioniert. Führte zu Problemen ## https://github.com/LeonGaultier/fhem-AutoShuttersControl/commit/e33d3cc7815031b087736c1054b98c57817e7083 if ( $cmd eq 'add' ) { if ( ref($attribValue) ne 'ARRAY' ) { - $attr{$_}{ ( split( ':', $attrib ) )[0] } = $attribValue - if ( !defined( $attr{$_}{ ( split( ':', $attrib ) )[0] } ) + $attr{$shuttersDev}{ ( split( ':', $attrib ) )[0] } = $attribValue + if ( !defined( $attr{$shuttersDev}{ ( split( ':', $attrib ) )[0] } ) && $attribValue ne '-' ); } else { - $attr{$_}{ ( split( ':', $attrib ) )[0] } = - $attribValue->[ AttrVal( $_, 'ASC', 2 ) ] - if ( !defined( $attr{$_}{ ( split( ':', $attrib ) )[0] } ) + $attr{$shuttersDev}{ ( split( ':', $attrib ) )[0] } = + $attribValue->[ AttrVal( $shuttersDev, 'ASC', 2 ) ] + if ( !defined( $attr{$shuttersDev}{ ( split( ':', $attrib ) )[0] } ) && $attrib eq 'ASC_Pos_Reading' ); } ### associatedWith damit man sieht das der Rollladen mit einem ASC Device verbunden ist my $associatedString = - ReadingsVal( $_, 'associatedWith', 'none' ); + ReadingsVal( $shuttersDev, 'associatedWith', 'none' ); if ( $associatedString ne 'none' ) { my %hash; %hash = map { ( $_ => 1 ) } split( ',', "$associatedString,$name" ); - readingsSingleUpdate( $defs{$_}, + readingsSingleUpdate( $defs{$shuttersDev}, 'associatedWith', join( ',', sort keys %hash ), 0 ); } else { - readingsSingleUpdate( $defs{$_}, + readingsSingleUpdate( $defs{$shuttersDev}, 'associatedWith', $name, 0 ); } ####################################### } ## Oder das Attribut wird wieder gelöscht. elsif ( $cmd eq 'del' ) { - $shutters->setShuttersDev($_); + $shutters->setShuttersDev($shuttersDev); RemoveInternalTimer( $shutters->getInTimerFuncHash ); - CommandDeleteReading( undef, $_ . ' .?(ASC)_.*' ); - CommandDeleteAttr( undef, $_ . ' ASC' ); - delFromDevAttrList( $_, $attrib ); + CommandDeleteReading( undef, $shuttersDev . ' .?(ASC)_.*' ); + CommandDeleteAttr( undef, $shuttersDev . ' ASC' ); + delFromDevAttrList( $shuttersDev, $attrib ); ### associatedWith wird wieder entfernt my $associatedString = - ReadingsVal( $_, 'associatedWith', 'none' ); + ReadingsVal( $shuttersDev, 'associatedWith', 'none' ); my %hash; %hash = map { ( $_ => 1 ) } - grep { " $name " !~ m{ $_ }xms } + grep { " $name " !~ m{ $shuttersDev }xms } split( ',', "$associatedString,$name" ); if ( keys %hash > 1 ) { - readingsSingleUpdate( $defs{$_}, + readingsSingleUpdate( $defs{$shuttersDev}, 'associatedWith', join( ',', sort keys %hash ), 0 ); } - else { CommandDeleteReading( undef, $_ . ' associatedWith' ); } + else { CommandDeleteReading( undef, $shuttersDev . ' associatedWith' ); } ################################### } } @@ -970,12 +970,12 @@ sub UserAttributs_Readings_ForShutters { ## Fügt dem NOTIFYDEV Hash weitere Devices hinzu sub AddNotifyDev { ### Beispielaufruf: AddNotifyDev( $hash, $3, $1, $2 ) if ( $3 ne 'none' ); - my ( $hash, $dev, $shuttersDev, $shuttersAttr ) = @_; + my ( $hash, $attrVal, $shuttersDev, $shuttersAttr ) = @_; - $dev = ( split( ':', $dev ) )[0]; - my ( $key, $value ) = split( ':', ( split( ' ', $dev ) )[0], 2 ) + $attrVal = ( split( ':', $attrVal ) )[0]; + my ( $key, $value ) = split( ':', ( split( ' ', $attrVal ) )[0], 2 ) ; ## Wir versuchen die Device Attribute anders zu setzen. device=DEVICE reading=READING - $dev = $key; + $attrVal = $key; my $name = $hash->{NAME}; @@ -984,13 +984,13 @@ sub AddNotifyDev { my %hash; %hash = map { ( $_ => 1 ) } - split( ',', "$notifyDev,$dev" ); + split( ',', "$notifyDev,$attrVal" ); $hash->{NOTIFYDEV} = join( ',', sort keys %hash ); - my @devs = split( ',', $dev ); - for (@devs) { - $hash->{monitoredDevs}{$_}{$shuttersDev} = $shuttersAttr; + my @devs = split( ',', $attrVal ); + for my $dev (@devs) { + $hash->{monitoredDevs}{$dev}{$shuttersDev} = $shuttersAttr; } readingsSingleUpdate( $hash, '.monitoredDevs', @@ -1011,7 +1011,7 @@ sub DeleteNotifyDev { for my $notifyDev ( keys( %{$notifyDevs} ) ) { Log3( $name, 4, "AutoShuttersControl ($name) - DeleteNotifyDev - NotifyDev: " - . $_ ); + . $notifyDev ); delete $hash->{monitoredDevs}{$notifyDev}{$shuttersDev}; if ( !keys %{ $hash->{monitoredDevs}{$notifyDev} } ) { @@ -3037,15 +3037,14 @@ sub CreateSunRiseSetShuttersTimer { sub RenewSunRiseSetShuttersTimer { my $hash = shift; - for ( @{ $hash->{helper}{shuttersList} } ) { - my $name = $_; - my $dhash = $defs{$name}; + for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { + my $dhash = $defs{$shuttersDev}; - $shutters->setShuttersDev($name); + $shutters->setShuttersDev($shuttersDev); RemoveInternalTimer( $shutters->getInTimerFuncHash ); $shutters->setInTimerFuncHash(undef); - CreateSunRiseSetShuttersTimer( $hash, $name ); + CreateSunRiseSetShuttersTimer( $hash, $shuttersDev ); #### Temporär angelegt damit die neue Attributs Parameter Syntax verteilt werden kann #### Gleichlautende Attribute wo lediglich die Parameter geändert werden sollen müssen bereits in der Funktion ShuttersDeviceScan gelöscht werden @@ -3054,28 +3053,28 @@ sub RenewSunRiseSetShuttersTimer { if ( ( int( gettimeofday() ) - $::fhem_started ) < 60 and - ReadingsVal( $name, '.ASC_AttrUpdateChanges_' . $hash->{VERSION}, + ReadingsVal( $shuttersDev, '.ASC_AttrUpdateChanges_' . $hash->{VERSION}, 0 ) == 0 ) { -# $attr{$name}{'ASC_Up'} = $shutters->getAttrUpdateChanges('ASC_Up') +# $attr{$shuttersDev}{'ASC_Up'} = $shutters->getAttrUpdateChanges('ASC_Up') # if ( $shutters->getAttrUpdateChanges('ASC_Up') ne 'none' ); -# $attr{$name}{'ASC_Down'} = +# $attr{$shuttersDev}{'ASC_Down'} = # $shutters->getAttrUpdateChanges('ASC_Down') # if ( $shutters->getAttrUpdateChanges('ASC_Down') ne 'none' ); -# $attr{$name}{'ASC_Self_Defense_Mode'} = +# $attr{$shuttersDev}{'ASC_Self_Defense_Mode'} = # $shutters->getAttrUpdateChanges('ASC_Self_Defense_Mode') # if ( $shutters->getAttrUpdateChanges('ASC_Self_Defense_Mode') ne # 'none' ); -# $attr{$name}{'ASC_Self_Defense_Mode'} = 'off' +# $attr{$shuttersDev}{'ASC_Self_Defense_Mode'} = 'off' # if ( # $shutters->getAttrUpdateChanges('ASC_Self_Defense_Exclude') eq # 'on' ); - CommandDeleteReading( undef, $name . ' .ASC_AttrUpdateChanges_.*' ) + CommandDeleteReading( undef, $shuttersDev . ' .ASC_AttrUpdateChanges_.*' ) if ( ReadingsVal( - $name, '.ASC_AttrUpdateChanges_' . $hash->{VERSION}, + $shuttersDev, '.ASC_AttrUpdateChanges_' . $hash->{VERSION}, 'none' ) eq 'none' ); @@ -3084,47 +3083,47 @@ sub RenewSunRiseSetShuttersTimer { 1, 0 ); } -# $attr{$name}{ASC_Drive_Delay} = -# AttrVal( $name, 'ASC_Drive_Offset', 'none' ) -# if ( AttrVal( $name, 'ASC_Drive_Offset', 'none' ) ne 'none' ); -# delFromDevAttrList( $name, 'ASC_Drive_Offset' ); +# $attr{$shuttersDev}{ASC_Drive_Delay} = +# AttrVal( $shuttersDev, 'ASC_Drive_Offset', 'none' ) +# if ( AttrVal( $shuttersDev, 'ASC_Drive_Offset', 'none' ) ne 'none' ); +# delFromDevAttrList( $shuttersDev, 'ASC_Drive_Offset' ); # -# $attr{$name}{ASC_Drive_DelayStart} = -# AttrVal( $name, 'ASC_Drive_OffsetStart', 'none' ) -# if ( AttrVal( $name, 'ASC_Drive_OffsetStart', 'none' ) ne 'none' ); -# delFromDevAttrList( $name, 'ASC_Drive_OffsetStart' ); +# $attr{$shuttersDev}{ASC_Drive_DelayStart} = +# AttrVal( $shuttersDev, 'ASC_Drive_OffsetStart', 'none' ) +# if ( AttrVal( $shuttersDev, 'ASC_Drive_OffsetStart', 'none' ) ne 'none' ); +# delFromDevAttrList( $shuttersDev, 'ASC_Drive_OffsetStart' ); # -# $attr{$name}{ASC_Shading_StateChange_SunnyCloudy} = -# AttrVal( $name, 'ASC_Shading_StateChange_Sunny', 'none' ) . ':' -# . AttrVal( $name, 'ASC_Shading_StateChange_Cloudy', 'none' ) +# $attr{$shuttersDev}{ASC_Shading_StateChange_SunnyCloudy} = +# AttrVal( $shuttersDev, 'ASC_Shading_StateChange_Sunny', 'none' ) . ':' +# . AttrVal( $shuttersDev, 'ASC_Shading_StateChange_Cloudy', 'none' ) # if ( -# AttrVal( $name, 'ASC_Shading_StateChange_Sunny', 'none' ) ne 'none' -# && AttrVal( $name, 'ASC_Shading_StateChange_Cloudy', 'none' ) ne +# AttrVal( $shuttersDev, 'ASC_Shading_StateChange_Sunny', 'none' ) ne 'none' +# && AttrVal( $shuttersDev, 'ASC_Shading_StateChange_Cloudy', 'none' ) ne # 'none' ); -# delFromDevAttrList( $name, 'ASC_Shading_StateChange_Sunny' ); -# delFromDevAttrList( $name, 'ASC_Shading_StateChange_Cloudy' ); +# delFromDevAttrList( $shuttersDev, 'ASC_Shading_StateChange_Sunny' ); +# delFromDevAttrList( $shuttersDev, 'ASC_Shading_StateChange_Cloudy' ); # -# $attr{$name}{ASC_Shading_InOutAzimuth} = -# ( AttrVal( $name, 'ASC_Shading_Direction', 180 ) - -# AttrVal( $name, 'ASC_Shading_Angle_Left', 85 ) ) +# $attr{$shuttersDev}{ASC_Shading_InOutAzimuth} = +# ( AttrVal( $shuttersDev, 'ASC_Shading_Direction', 180 ) - +# AttrVal( $shuttersDev, 'ASC_Shading_Angle_Left', 85 ) ) # . ':' -# . ( AttrVal( $name, 'ASC_Shading_Direction', 180 ) + -# AttrVal( $name, 'ASC_Shading_Angle_Right', 85 ) ) -# if ( AttrVal( $name, 'ASC_Shading_Direction', 'none' ) ne 'none' -# || AttrVal( $name, 'ASC_Shading_Angle_Left', 'none' ) ne 'none' -# || AttrVal( $name, 'ASC_Shading_Angle_Right', 'none' ) ne 'none' ); -# delFromDevAttrList( $name, 'ASC_Shading_Direction' ); -# delFromDevAttrList( $name, 'ASC_Shading_Angle_Left' ); -# delFromDevAttrList( $name, 'ASC_Shading_Angle_Right' ); +# . ( AttrVal( $shuttersDev, 'ASC_Shading_Direction', 180 ) + +# AttrVal( $shuttersDev, 'ASC_Shading_Angle_Right', 85 ) ) +# if ( AttrVal( $shuttersDev, 'ASC_Shading_Direction', 'none' ) ne 'none' +# || AttrVal( $shuttersDev, 'ASC_Shading_Angle_Left', 'none' ) ne 'none' +# || AttrVal( $shuttersDev, 'ASC_Shading_Angle_Right', 'none' ) ne 'none' ); +# delFromDevAttrList( $shuttersDev, 'ASC_Shading_Direction' ); +# delFromDevAttrList( $shuttersDev, 'ASC_Shading_Angle_Left' ); +# delFromDevAttrList( $shuttersDev, 'ASC_Shading_Angle_Right' ); # -# $attr{$name}{ASC_PrivacyDownValue_beforeNightClose} = -# AttrVal( $name, 'ASC_PrivacyDownTime_beforNightClose', 'none' ) +# $attr{$shuttersDev}{ASC_PrivacyDownValue_beforeNightClose} = +# AttrVal( $shuttersDev, 'ASC_PrivacyDownTime_beforNightClose', 'none' ) # if ( -# AttrVal( $name, 'ASC_PrivacyDownTime_beforNightClose', 'none' ) ne +# AttrVal( $shuttersDev, 'ASC_PrivacyDownTime_beforNightClose', 'none' ) ne # 'none' ); -# delFromDevAttrList( $name, 'ASC_PrivacyDownTime_beforNightClose' ); +# delFromDevAttrList( $shuttersDev, 'ASC_PrivacyDownTime_beforNightClose' ); # -# delFromDevAttrList( $name, 'ASC_ExternalTriggerDevice' ); +# delFromDevAttrList( $shuttersDev, 'ASC_ExternalTriggerDevice' ); } return; @@ -3135,8 +3134,8 @@ sub HardewareBlockForShutters { my $hash = shift; my $cmd = shift; - for ( @{ $hash->{helper}{shuttersList} } ) { - $shutters->setShuttersDev($_); + for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { + $shutters->setShuttersDev($shuttersDev); $shutters->setHardLockOut($cmd); } @@ -3147,8 +3146,8 @@ sub HardewareBlockForShutters { sub wiggleAll { my $hash = shift; - for ( @{ $hash->{helper}{shuttersList} } ) { - wiggle( $hash, $_ ); + for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { + wiggle( $hash, $shuttersDev ); } return; @@ -3382,21 +3381,21 @@ sub CreateNewNotifyDev { CommandDeleteReading( undef, $name . ' .monitoredDevs' ); my $shuttersList = ''; - for ( @{ $hash->{helper}{shuttersList} } ) { - AddNotifyDev( $hash, AttrVal( $_, 'ASC_Roommate_Device', 'none' ), - $_, 'ASC_Roommate_Device' ) - if ( AttrVal( $_, 'ASC_Roommate_Device', 'none' ) ne 'none' ); - AddNotifyDev( $hash, AttrVal( $_, 'ASC_WindowRec', 'none' ), - $_, 'ASC_WindowRec' ) - if ( AttrVal( $_, 'ASC_WindowRec', 'none' ) ne 'none' ); - AddNotifyDev( $hash, AttrVal( $_, 'ASC_BrightnessSensor', 'none' ), - $_, 'ASC_BrightnessSensor' ) - if ( AttrVal( $_, 'ASC_BrightnessSensor', 'none' ) ne 'none' ); - AddNotifyDev( $hash, AttrVal( $_, 'ASC_ExternalTrigger', 'none' ), - $_, 'ASC_ExternalTrigger' ) - if ( AttrVal( $_, 'ASC_ExternalTrigger', 'none' ) ne 'none' ); + for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { + AddNotifyDev( $hash, AttrVal( $shuttersDev, 'ASC_Roommate_Device', 'none' ), + $shuttersDev, 'ASC_Roommate_Device' ) + if ( AttrVal( $shuttersDev, 'ASC_Roommate_Device', 'none' ) ne 'none' ); + AddNotifyDev( $hash, AttrVal( $shuttersDev, 'ASC_WindowRec', 'none' ), + $shuttersDev, 'ASC_WindowRec' ) + if ( AttrVal( $shuttersDev, 'ASC_WindowRec', 'none' ) ne 'none' ); + AddNotifyDev( $hash, AttrVal( $shuttersDev, 'ASC_BrightnessSensor', 'none' ), + $shuttersDev, 'ASC_BrightnessSensor' ) + if ( AttrVal( $shuttersDev, 'ASC_BrightnessSensor', 'none' ) ne 'none' ); + AddNotifyDev( $hash, AttrVal( $shuttersDev, 'ASC_ExternalTrigger', 'none' ), + $shuttersDev, 'ASC_ExternalTrigger' ) + if ( AttrVal( $shuttersDev, 'ASC_ExternalTrigger', 'none' ) ne 'none' ); - $shuttersList = $shuttersList . ',' . $_; + $shuttersList = $shuttersList . ',' . $shuttersDev; } AddNotifyDev( $hash, AttrVal( $name, 'ASC_residentsDev', 'none' ), @@ -3462,12 +3461,12 @@ sub ShuttersInformation { $ret .= ''; my $linecount = 1; - for my $shutter ( @{ $hash->{helper}{shuttersList} } ) { - $shutters->setShuttersDev($shutter); + for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { + $shutters->setShuttersDev($shuttersDev); if ( $linecount % 2 == 0 ) { $ret .= ''; } else { $ret .= ''; } - $ret .= "$shutter"; + $ret .= "$shuttersDev"; $ret .= " "; $ret .= "" . strftime( "%e.%m.%Y - %H:%M:%S", @@ -3492,7 +3491,7 @@ sub ShuttersInformation { $ret .= "" . $shutters->getLockOut . ""; $ret .= " "; $ret .= "" - . ReadingsVal( $shutter, 'ASC_ShuttersLastDrive', 'none' ) . ""; + . ReadingsVal( $shuttersDev, 'ASC_ShuttersLastDrive', 'none' ) . ""; $ret .= " "; $ret .= "" . $shutters->getStatus . ""; $ret .= " "; @@ -3533,15 +3532,15 @@ sub GetMonitoredDevs { my $linecount = 1; for my $notifydev ( sort keys( %{$notifydevs} ) ) { if ( ref( $notifydevs->{$notifydev} ) eq "HASH" ) { - for my $shutters ( sort keys( %{ $notifydevs->{$notifydev} } ) ) + for my $shuttersDev ( sort keys( %{ $notifydevs->{$notifydev} } ) ) { if ( $linecount % 2 == 0 ) { $ret .= ''; } else { $ret .= ''; } - $ret .= "$shutters"; + $ret .= "$shuttersDev"; $ret .= " "; $ret .= "$notifydev"; $ret .= " "; - $ret .= "$notifydevs->{$notifydev}{$shutters}"; + $ret .= "$notifydevs->{$notifydev}{$shuttersDev}"; $ret .= " "; $ret .= ''; $linecount++; @@ -8848,7 +8847,7 @@ sub getBlockAscDrivesAfterManual { ], "release_status": "testing", "license": "GPL_2", - "version": "v0.9.14", + "version": "v0.9.15", "author": [ "Marko Oldenburg " ], From 0498d0323be17b06cfea604c36d15d142ae0fb1d Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Tue, 21 Apr 2020 23:50:04 +0200 Subject: [PATCH 11/60] check roommate status then drive in shading pos --- 73_AutoShuttersControl.pm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index 69589f6..53a4b30 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -2496,6 +2496,8 @@ sub ShadingProcessing { if ( IsAfterShuttersTimeBlocking($shuttersDev) && !$shutters->getShadingManualDriveStatus + && $shutters->getRoommatesStatus ne 'gotosleep' + && $shutters->getRoommatesStatus ne 'asleep' && ( ( $shutters->getShadingStatus eq 'out' From 7a0aad9ff7744ab91bcd6c219ee46c9174439742 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Fri, 1 May 2020 16:23:09 +0200 Subject: [PATCH 12/60] Closes: #10, add API commandref, fix Rain unprotected bug --- 73_AutoShuttersControl.pm | 665 +++++++++++++++++++++++++++++++++++--- API_Uebersicht.txt | 153 +++++++++ 2 files changed, 772 insertions(+), 46 deletions(-) create mode 100644 API_Uebersicht.txt diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index 53a4b30..134e257 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -53,6 +53,12 @@ sub ascAPIget { return AutoShuttersControl_ascAPIget( $getCommand, $shutterDev, $value ); } +sub ascAPIset { + my ( $setCommand, $shutterDev, $value ) = @_; + + return AutoShuttersControl_ascAPIset( $setCommand, $shutterDev, $value ); +} + ## unserer packagename package FHEM::AutoShuttersControl; @@ -186,6 +192,7 @@ GP_Export( qw( Initialize ascAPIget + ascAPIset DevStateIcon ) ); @@ -293,6 +300,26 @@ sub ascAPIget { else { return $ascDev->$getter; } + + return; +} + +sub ascAPIset { + my ( $setCommand, $shutterDev, $value ) = @_; + + my $setter = 'set' . $setCommand; + + if ( defined($shutterDev) + && $shutterDev + && defined($value) + && $value + ) + { + $shutters->setShuttersDev($shutterDev); + $shutters->$setter($value); + } + + return; } sub Initialize { @@ -333,8 +360,8 @@ sub Initialize { } sub Define { - my $hash = shift; - my $a = shift; + my $hash = shift // return; + my $aArg = shift // return; return $@ unless ( FHEM::Meta::SetInternals($hash) ); use version 0.60; our $VERSION = FHEM::Meta::Get( $hash, 'version' ); @@ -343,9 +370,9 @@ sub Define { if ( devspec2array('TYPE=AutoShuttersControl') > 1 ) ; # es wird geprüft ob bereits eine Instanz unseres Modules existiert,wenn ja wird abgebrochen return 'too few parameters: define ShuttersControl' - if ( scalar( @{$a} ) != 2 ); + if ( scalar( @{$aArg} ) != 2 ); - my $name = shift @$a; + my $name = shift @$aArg; $hash->{MID} = 'da39a3ee5e6b4b0d3255bfef95601890afd80709' ; # eine Ein Eindeutige ID für interne FHEM Belange / nicht weiter wichtig $hash->{VERSION} = version->parse($VERSION)->normal; @@ -394,8 +421,8 @@ sub Undef { } sub Notify { - my $hash = shift; - my $dev = shift; + my $hash = shift // return; + my $dev = shift // return; my $name = $hash->{NAME}; my $devname = $dev->{NAME}; @@ -629,52 +656,52 @@ m{^(DELETEATTR|ATTR) #global ATTR myASC ASC_tempSensor Cellar } sub Set { - my $hash = shift; - my $a = shift; + my $hash = shift // return; + my $aArg = shift // return; - my $name = shift @$a; - my $cmd = shift @$a // return qq{"set $name" needs at least one argument}; + my $name = shift @$aArg; + my $cmd = shift @$aArg // return qq{"set $name" needs at least one argument}; if ( lc $cmd eq 'renewalltimer' ) { - return "usage: $cmd" if ( scalar( @{$a} ) != 0 ); + return "usage: $cmd" if ( scalar( @{$aArg} ) != 0 ); RenewSunRiseSetShuttersTimer($hash); } elsif ( lc $cmd eq 'renewtimer' ) { - return "usage: $cmd" if ( scalar( @{$a} ) > 1 ); - CreateSunRiseSetShuttersTimer( $hash, $a->[0] ); + return "usage: $cmd" if ( scalar( @{$aArg} ) > 1 ); + CreateSunRiseSetShuttersTimer( $hash, $aArg->[0] ); } elsif ( lc $cmd eq 'scanforshutters' ) { - return "usage: $cmd" if ( scalar( @{$a} ) != 0 ); + return "usage: $cmd" if ( scalar( @{$aArg} ) != 0 ); ShuttersDeviceScan($hash); } elsif ( lc $cmd eq 'createnewnotifydev' ) { - return "usage: $cmd" if ( scalar( @{$a} ) != 0 ); + return "usage: $cmd" if ( scalar( @{$aArg} ) != 0 ); CreateNewNotifyDev($hash); } elsif ( lc $cmd eq 'partymode' ) { - return "usage: $cmd" if ( scalar( @{$a} ) > 1 ); - readingsSingleUpdate( $hash, $cmd, $a->[0], 1 ) - if ( $a->[0] ne ReadingsVal( $name, 'partyMode', 0 ) ); + return "usage: $cmd" if ( scalar( @{$aArg} ) > 1 ); + readingsSingleUpdate( $hash, $cmd, $aArg->[0], 1 ) + if ( $aArg->[0] ne ReadingsVal( $name, 'partyMode', 0 ) ); } elsif ( lc $cmd eq 'hardlockout' ) { - return "usage: $cmd" if ( scalar( @{$a} ) > 1 ); - readingsSingleUpdate( $hash, $cmd, $a->[0], 1 ); - HardewareBlockForShutters( $hash, $a->[0] ); + return "usage: $cmd" if ( scalar( @{$aArg} ) > 1 ); + readingsSingleUpdate( $hash, $cmd, $aArg->[0], 1 ); + HardewareBlockForShutters( $hash, $aArg->[0] ); } elsif ( lc $cmd eq 'sunrisetimeweholiday' ) { - return "usage: $cmd" if ( scalar( @{$a} ) > 1 ); - readingsSingleUpdate( $hash, $cmd, $a->[0], 1 ); + return "usage: $cmd" if ( scalar( @{$aArg} ) > 1 ); + readingsSingleUpdate( $hash, $cmd, $aArg->[0], 1 ); } elsif ( lc $cmd eq 'controlshading' ) { - return "usage: $cmd" if ( scalar( @{$a} ) > 1 ); + return "usage: $cmd" if ( scalar( @{$aArg} ) > 1 ); my $response = _CheckASC_ConditionsForShadingFn($hash); readingsSingleUpdate( $hash, $cmd, ( - $a->[0] eq 'off' ? $a->[0] + $aArg->[0] eq 'off' ? $aArg->[0] : ( - $response eq 'none' ? $a->[0] + $response eq 'none' ? $aArg->[0] : $response ) ), @@ -682,24 +709,24 @@ sub Set { ); } elsif ( lc $cmd eq 'selfdefense' ) { - return "usage: $cmd" if ( scalar( @{$a} ) > 1 ); - readingsSingleUpdate( $hash, $cmd, $a->[0], 1 ); + return "usage: $cmd" if ( scalar( @{$aArg} ) > 1 ); + readingsSingleUpdate( $hash, $cmd, $aArg->[0], 1 ); } elsif ( lc $cmd eq 'ascenable' ) { - return "usage: $cmd" if ( scalar( @{$a} ) > 1 ); - readingsSingleUpdate( $hash, $cmd, $a->[0], 1 ); + return "usage: $cmd" if ( scalar( @{$aArg} ) > 1 ); + readingsSingleUpdate( $hash, $cmd, $aArg->[0], 1 ); } elsif ( lc $cmd eq 'advdrivedown' ) { - return "usage: $cmd" if ( scalar( @{$a} ) != 0 ); + return "usage: $cmd" if ( scalar( @{$aArg} ) != 0 ); EventProcessingAdvShuttersClose($hash); } elsif ( lc $cmd eq 'shutterascenabletoggle' ) { - return "usage: $cmd" if ( scalar( @{$a} ) > 1 ); + return "usage: $cmd" if ( scalar( @{$aArg} ) > 1 ); readingsSingleUpdate( - $defs{ $a->[0] }, + $defs{ $aArg->[0] }, 'ASC_Enable', ( - ReadingsVal( $a->[0], 'ASC_Enable', 'off' ) eq 'on' + ReadingsVal( $aArg->[0], 'ASC_Enable', 'off' ) eq 'on' ? 'off' : 'on' ), @@ -707,9 +734,9 @@ sub Set { ); } elsif ( lc $cmd eq 'wiggle' ) { - return "usage: $cmd" if ( scalar( @{$a} ) > 1 ); + return "usage: $cmd" if ( scalar( @{$aArg} ) > 1 ); - ( $a->[0] eq 'all' ? wiggleAll($hash) : wiggle( $hash, $a->[0] ) ); + ( $aArg->[0] eq 'all' ? wiggleAll($hash) : wiggle( $hash, $aArg->[0] ) ); } else { my $list = 'scanForShutters:noArg'; @@ -733,14 +760,14 @@ sub Set { } sub Get { - my $hash = shift; - my $a = shift; + my $hash = shift // return; + my $aArg = shift // return; - my $name = shift @$a; - my $cmd = shift @$a // return qq{"set $name" needs at least one argument}; + my $name = shift @$aArg // return; + my $cmd = shift @$aArg // return qq{"get $name" needs at least one argument}; if ( lc $cmd eq 'shownotifydevsinformations' ) { - return "usage: $cmd" if ( scalar( @{$a} ) != 0 ); + return "usage: $cmd" if ( scalar( @{$aArg} ) != 0 ); my $ret = GetMonitoredDevs($hash); return $ret; } @@ -1696,7 +1723,7 @@ sub RainProtection { $shutters->setDriveCmd($closedPos); $shutters->setRainProtectionStatus('protected'); } - elsif (( $val == 0 || $val < $triggerMax ) + elsif (( $val == 0 || $val < $shutters->getWindMin ) && $shutters->getStatus == $closedPos && IsAfterShuttersManualBlocking($shuttersDev) && $shutters->getRainProtectionStatus eq 'protected' ) @@ -5585,7 +5612,7 @@ sub setShadingLastStatus { sub setShadingManualDriveStatus { my $self = shift; - my $value = shift; ### Werte für value = in, out + my $value = shift; ### Werte für value = 0, 1 $self->{ $self->{shuttersDev} }{ShadingManualDriveStatus}{VAL} = $value if ( defined($value) ); @@ -5775,10 +5802,26 @@ BEGIN { GP_Import( qw( AttrVal + CommandAttr gettimeofday) ); } +sub _setAttributs { + my $shuttersDev = shift; + my $attr = shift; + my $attrVal = shift; + + CommandAttr(undef,$shuttersDev + . ' ' + . $attr + . ' ' + . $attrVal + ); + + return; +} + sub _getPosition { my $self = shift; @@ -5885,6 +5928,15 @@ sub _getPositionAssignment { return ( $self->{ $self->{shuttersDev} }->{$attr}->{posAssignment} ); } +sub setAntiFreezePos { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_Antifreeze_Pos',$attrVal); + + return; +} + sub getAntiFreezePos { my $self = shift; @@ -5900,12 +5952,30 @@ sub getAntiFreezePosAssignment { 'getAntiFreezePos' ); } +sub setShuttersPlace { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_ShuttersPlace',$attrVal); + + return; +} + sub getShuttersPlace { my $self = shift; return AttrVal( $self->{shuttersDev}, 'ASC_ShuttersPlace', 'window' ); } +sub setSlatPosCmd { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_SlatPosCmd_SlatDevice',$attrVal); + + return; +} + sub getSlatPosCmd { my $self = shift; @@ -5959,6 +6029,15 @@ sub getSlatDevice { ); } +sub setPrivacyUpTime { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_PrivacyUpValue_beforeDayOpen',$attrVal); + + return; +} + sub getPrivacyUpTime { my $self = shift; @@ -6024,6 +6103,15 @@ sub getPrivacyUpBrightnessVal { ); } +sub setPrivacyDownTime { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_PrivacyDownValue_beforeNightClose',$attrVal); + + return; +} + sub getPrivacyDownTime { my $self = shift; @@ -6089,6 +6177,15 @@ sub getPrivacyDownBrightnessVal { ); } +sub setPrivacyUpPos { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_PrivacyUp_Pos',$attrVal); + + return; +} + sub getPrivacyUpPos { my $self = shift; @@ -6102,6 +6199,15 @@ sub getPrivacyUpPositionAssignment { 'getPrivacyUpPos' ); } +sub setPrivacyDownPos { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_PrivacyDown_Pos',$attrVal); + + return; +} + sub getPrivacyDownPos { my $self = shift; @@ -6116,24 +6222,60 @@ sub getPrivacyDownPositionAssignment { 'getPrivacyDownPos' ); } +sub setSelfDefenseMode { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_Self_Defense_Mode',$attrVal); + + return; +} + sub getSelfDefenseMode { my $self = shift; return AttrVal( $self->{shuttersDev}, 'ASC_Self_Defense_Mode', 'gone' ); } +sub setSelfDefenseAbsentDelay { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_Self_Defense_AbsentDelay',$attrVal); + + return; +} + sub getSelfDefenseAbsentDelay { my $self = shift; return AttrVal( $self->{shuttersDev}, 'ASC_Self_Defense_AbsentDelay', 300 ); } +sub setWiggleValue { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_WiggleValue',$attrVal); + + return; +} + sub getWiggleValue { my $self = shift; return AttrVal( $self->{shuttersDev}, 'ASC_WiggleValue', 5 ); } +sub setAdv { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_Adv',$attrVal); + + return; +} + sub getAdv { my $self = shift; @@ -6145,6 +6287,15 @@ sub getAdv { } ### Begin Beschattung +sub setShadingPos { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_Shading_Pos',$attrVal); + + return; +} + sub getShadingPos { my $self = shift; @@ -6159,6 +6310,15 @@ sub getShadingPositionAssignment { 'getShadingPos' ); } +sub setShadingMode { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_Shading_Mode',$attrVal); + + return; +} + sub getShadingMode { my $self = shift; @@ -6213,6 +6373,15 @@ sub getTempSensorReading { ); } +sub setIdleDetectionReading { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_Shutter_IdleDetection',$attrVal); + + return; +} + sub _getIdleDetectionReading { my $self = shift; @@ -6269,6 +6438,15 @@ sub getIdleDetectionValue { ); } +sub setBrightnessSensor { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_BrightnessSensor',$attrVal); + + return; +} + sub _getBrightnessSensor { my $self = shift; @@ -6345,6 +6523,15 @@ sub getShadingAzimuthLeft { ->{leftVal}; } +sub setShadingInOutAzimuth { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_Shading_InOutAzimuth',$attrVal); + + return; +} + sub getShadingAzimuthRight { my $self = shift; @@ -6377,6 +6564,15 @@ sub getShadingAzimuthRight { ->{rightVal}; } +sub setShadingMinOutsideTemperature { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_Shading_Min_OutsideTemperature',$attrVal); + + return; +} + sub getShadingMinOutsideTemperature { my $self = shift; @@ -6384,6 +6580,15 @@ sub getShadingMinOutsideTemperature { 18 ); } +sub setShadingMinMaxElevation { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_Shading_MinMax_Elevation',$attrVal); + + return; +} + sub getShadingMinElevation { my $self = shift; @@ -6436,6 +6641,15 @@ sub getShadingMaxElevation { ->{maxVal}; } +sub setShadingStateChangeSunnyCloudy { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_Shading_StateChange_SunnyCloudy',$attrVal); + + return; +} + sub getShadingStateChangeSunny { my $self = shift; @@ -6515,12 +6729,29 @@ sub getMaxBrightnessAverageArrayObjects { ->{MAXOBJECT}; } +sub setShadingWaitingPeriod { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_Shading_WaitingPeriod',$attrVal); + + return; +} + sub getShadingWaitingPeriod { my $self = shift; return AttrVal( $self->{shuttersDev}, 'ASC_Shading_WaitingPeriod', 1200 ); } ### Ende Beschattung +sub setExternalTrigger { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_ExternalTrigger',$attrVal); + + return; +} sub getExternalTriggerDevice { my $self = shift; @@ -6712,6 +6943,15 @@ sub getExternalTriggerState { ); } +sub setDelay { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_Drive_Delay',$attrVal); + + return; +} + sub getDelay { my $self = shift; @@ -6719,6 +6959,15 @@ sub getDelay { return ( $val =~ m{^\d+$}xms ? $val : -1 ); } +sub setDelayStart { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_Drive_DelayStart',$attrVal); + + return; +} + sub getDelayStart { my $self = shift; @@ -6726,6 +6975,15 @@ sub getDelayStart { return ( ( $val > 0 && $val =~ m{^\d+$}xms ) ? $val : -1 ); } +sub setBlockingTimeAfterManual { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_BlockingTime_afterManual',$attrVal); + + return; +} + sub getBlockingTimeAfterManual { my $self = shift; @@ -6733,6 +6991,15 @@ sub getBlockingTimeAfterManual { 1200 ); } +sub setBlockingTimeBeforNightClose { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_BlockingTime_beforNightClose',$attrVal); + + return; +} + sub getBlockingTimeBeforNightClose { my $self = shift; @@ -6740,6 +7007,15 @@ sub getBlockingTimeBeforNightClose { 3600 ); } +sub setBlockingTimeBeforDayOpen { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_BlockingTime_beforDayOpen',$attrVal); + + return; +} + sub getBlockingTimeBeforDayOpen { my $self = shift; @@ -6747,6 +7023,15 @@ sub getBlockingTimeBeforDayOpen { 3600 ); } +sub setPosCmd { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_Pos_Reading',$attrVal); + + return; +} + sub getPosCmd { my $self = shift; @@ -6755,6 +7040,15 @@ sub getPosCmd { [ AttrVal( $self->{shuttersDev}, 'ASC', 1 ) ] ); } +sub setOpenPos { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_Open_Pos',$attrVal); + + return; +} + sub getOpenPos { my $self = shift; @@ -6768,6 +7062,15 @@ sub getOpenPositionAssignment { return $shutters->_getPositionAssignment( 'ASC_Open_Pos', 'getOpenPos' ); } +sub setVentilatePos { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_Ventilate_Pos',$attrVal); + + return; +} + sub getVentilatePos { my $self = shift; @@ -6782,6 +7085,15 @@ sub getVentilatePositionAssignment { 'getVentilatePos' ); } +sub setVentilatePosAfterDayClosed { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_WindowRec_PosAfterDayClosed',$attrVal); + + return; +} + sub getVentilatePosAfterDayClosed { my $self = shift; @@ -6789,6 +7101,15 @@ sub getVentilatePosAfterDayClosed { 'open' ); } +sub setClosedPos { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_Closed_Pos',$attrVal); + + return; +} + sub getClosedPos { my $self = shift; @@ -6803,6 +7124,15 @@ sub getClosedPositionAssignment { 'getClosedPos' ); } +sub setSleepPos { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_Sleep_Pos',$attrVal); + + return; +} + sub getSleepPos { my $self = shift; @@ -6816,12 +7146,30 @@ sub getSleepPositionAssignment { return $shutters->_getPositionAssignment( 'ASC_Sleep_Pos', 'getSleepPos' ); } +sub setVentilateOpen { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_Ventilate_Window_Open',$attrVal); + + return; +} + sub getVentilateOpen { my $self = shift; return AttrVal( $self->{shuttersDev}, 'ASC_Ventilate_Window_Open', 'on' ); } +sub setComfortOpenPos { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_ComfortOpen_Pos',$attrVal); + + return; +} + sub getComfortOpenPos { my $self = shift; @@ -6836,18 +7184,45 @@ sub getComfortOpenPositionAssignment { 'getComfortOpenPos' ); } +sub setPartyMode { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_Partymode',$attrVal); + + return; +} + sub getPartyMode { my $self = shift; return AttrVal( $self->{shuttersDev}, 'ASC_Partymode', 'off' ); } +sub setRoommates { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_Roommate_Device',$attrVal); + + return; +} + sub getRoommates { my $self = shift; return AttrVal( $self->{shuttersDev}, 'ASC_Roommate_Device', 'none' ); } +sub setRoommatesReading { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_Roommate_Reading',$attrVal); + + return; +} + sub getRoommatesReading { my $self = shift; @@ -6905,6 +7280,15 @@ sub getWindMax { return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggermax}; } +sub setWindParameters { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_WindParameters',$attrVal); + + return; +} + sub getWindMin { my $self = shift; @@ -6924,60 +7308,150 @@ sub getWindMin { return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggerhyst}; } +sub setWindProtection { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_WindProtection',$attrVal); + + return; +} + sub getWindProtection { my $self = shift; return AttrVal( $self->{shuttersDev}, 'ASC_WindProtection', 'off' ); } +sub setRainProtection { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_RainProtection',$attrVal); + + return; +} + sub getRainProtection { my $self = shift; return AttrVal( $self->{shuttersDev}, 'ASC_RainProtection', 'off' ); } +sub setModeUp { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_Mode_Up',$attrVal); + + return; +} + sub getModeUp { my $self = shift; return AttrVal( $self->{shuttersDev}, 'ASC_Mode_Up', 'always' ); } +sub setModeDown { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_Mode_Down',$attrVal); + + return; +} + sub getModeDown { my $self = shift; return AttrVal( $self->{shuttersDev}, 'ASC_Mode_Down', 'always' ); } +sub setLockOut { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_LockOut',$attrVal); + + return; +} + sub getLockOut { my $self = shift; return AttrVal( $self->{shuttersDev}, 'ASC_LockOut', 'off' ); } +sub setLockOutCmd { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_LockOut_Cmd',$attrVal); + + return; +} + sub getLockOutCmd { my $self = shift; return AttrVal( $self->{shuttersDev}, 'ASC_LockOut_Cmd', 'none' ); } +sub setAntiFreeze { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_Antifreeze',$attrVal); + + return; +} + sub getAntiFreeze { my $self = shift; return AttrVal( $self->{shuttersDev}, 'ASC_Antifreeze', 'off' ); } +sub setAutoAstroModeMorning { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_AutoAstroModeMorning',$attrVal); + + return; +} + sub getAutoAstroModeMorning { my $self = shift; return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeMorning', 'none' ); } +sub setAutoAstroModeEvening { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_AutoAstroModeEvening',$attrVal); + + return; +} + sub getAutoAstroModeEvening { my $self = shift; return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeEvening', 'none' ); } +sub setAutoAstroModeMorningHorizon { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_AutoAstroModeMorningHorizon',$attrVal); + + return; +} + sub getAutoAstroModeMorningHorizon { my $self = shift; @@ -6985,6 +7459,15 @@ sub getAutoAstroModeMorningHorizon { 0 ); } +sub setAutoAstroModeEveningHorizon { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_AutoAstroModeEveningHorizon',$attrVal); + + return; +} + sub getAutoAstroModeEveningHorizon { my $self = shift; @@ -6992,18 +7475,45 @@ sub getAutoAstroModeEveningHorizon { 0 ); } +sub setUp { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_Up',$attrVal); + + return; +} + sub getUp { my $self = shift; return AttrVal( $self->{shuttersDev}, 'ASC_Up', 'astro' ); } +sub setDown { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_Down',$attrVal); + + return; +} + sub getDown { my $self = shift; return AttrVal( $self->{shuttersDev}, 'ASC_Down', 'astro' ); } +sub setTimeUpEarly { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_Time_Up_Early',$attrVal); + + return; +} + sub getTimeUpEarly { my $self = shift; @@ -7020,6 +7530,15 @@ sub getTimeUpEarly { ); } +sub setTimeUpLate { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_Time_Up_Late',$attrVal); + + return; +} + sub getTimeUpLate { my $self = shift; @@ -7036,6 +7555,15 @@ sub getTimeUpLate { ); } +sub setTimeDownEarly { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_Time_Down_Early',$attrVal); + + return; +} + sub getTimeDownEarly { my $self = shift; @@ -7052,6 +7580,15 @@ sub getTimeDownEarly { ); } +sub setTimeDownLate { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_Time_Down_Late',$attrVal); + + return; +} + sub getTimeDownLate { my $self = shift; @@ -7068,6 +7605,15 @@ sub getTimeDownLate { ); } +sub setTimeUpWeHoliday { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_Time_Up_WE_Holiday',$attrVal); + + return; +} + sub getTimeUpWeHoliday { my $self = shift; @@ -7123,6 +7669,15 @@ sub getBrightnessMaxVal { ->{triggermax}; } +sub setDriveUpMaxDuration { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_DriveUpMaxDuration',$attrVal); + + return; +} + sub getDriveUpMaxDuration { my $self = shift; @@ -7206,12 +7761,30 @@ BEGIN { ); } +sub setSubTyp { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_WindowRec_subType',$attrVal); + + return; +} + sub getSubTyp { my $self = shift; return AttrVal( $self->{shuttersDev}, 'ASC_WindowRec_subType', 'twostate' ); } +sub setWinDev { + my $self = shift; + my $attrVal = shift; + + _setAttributs($self->{shuttersDev},'ASC_WindowRec',$attrVal); + + return; +} + sub _getWinDev { my $self = shift; @@ -8387,7 +8960,7 @@ sub getBlockAscDrivesAfterManual { outdoor brightness, depending also on other sensor values. Defaults to 20000.
  • ASC_Shading_StateChange_SunnyCloudy - Shading starts/stops at this - outdoor brightness, depending also on other sensor values. A optional parameter set the maximal object in brightness average array. Defaults to 35000:20000 [3]. + outdoor brightness, depending also on other sensor values. An optional parameter specifies how many successive brightness reading values should be used to average the brightness value. Defaults to 35000:20000 [3].
  • ASC_Shading_WaitingPeriod - Waiting time in seconds before additional sensor values to ASC_Shading_StateChange_Sunny or ASC_Shading_StateChange_Cloudy @@ -8749,7 +9322,7 @@ sub getBlockAscDrivesAfterManual {
  • ASC_Shading_Min_OutsideTemperature - ab welcher Temperatur soll Beschattet werden, immer in Abhängigkeit der anderen einbezogenen Sensorwerte (default: 18)
  • ASC_Shading_Mode - absent,always,off,home / wann soll die Beschattung nur stattfinden. (default: off)
  • ASC_Shading_Pos - Position des Rollladens für die Beschattung (Default: ist abhängig vom AttributASC 80/20) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
  • -
  • ASC_Shading_StateChange_SunnyCloudy - Brightness Wert ab welchen die Beschattung stattfinden und aufgehoben werden soll, immer in Abhängigkeit der anderen einbezogenen Sensorwerte. Ein optionaler dritter Wert gibt an wie viele Brightnesswerte im Average Array enthalten sein sollen (default: 35000:20000 [3])
  • +
  • ASC_Shading_StateChange_SunnyCloudy - Brightness Wert ab welchen die Beschattung stattfinden und aufgehoben werden soll, immer in Abhängigkeit der anderen einbezogenen Sensorwerte. Ein optionaler dritter Wert gibt an wie, viele Brightnesswerte für den aktuellen Brightness-Durchschnitt berücksichtigt werden. Standard ist 3, es sollte nicht höher wie 5 genommen werden. (default: 35000:20000 [3])
  • ASC_Shading_WaitingPeriod - wie viele Sekunden soll gewartet werden bevor eine weitere Auswertung der Sensordaten für die Beschattung stattfinden soll (default: 1200)
  • ASC_ShuttersPlace - window/terrace - Wenn dieses Attribut auf terrace gesetzt ist, das Residence Device in den Status "gone" geht und SelfDefense aktiv ist (ohne das das Reading selfDefense gesetzt sein muss), wird das Rollo geschlossen (default: window)
  • @@ -8849,7 +9422,7 @@ sub getBlockAscDrivesAfterManual { ], "release_status": "testing", "license": "GPL_2", - "version": "v0.9.15", + "version": "v0.9.16", "author": [ "Marko Oldenburg " ], diff --git a/API_Uebersicht.txt b/API_Uebersicht.txt new file mode 100644 index 0000000..3ec057e --- /dev/null +++ b/API_Uebersicht.txt @@ -0,0 +1,153 @@ +--- In den Rolläden --- +AntiFreezePos +AntiFreezePosAssignment - nur getter +ShuttersPlace +SlatPosCmd +SlatDevice - nur getter +PrivacyUpTime +PrivacyUpBrightnessVal - nur getter +PrivacyDownTime +PrivacyDownBrightnessVal - nur getter +PrivacyDownPos +PrivacyDownPositionAssignment - nur getter +PrivacyUpPos +PrivacyUpPositionAssignment - nur getter +SelfDefenseMode +SelfDefenseAbsentDelay +WiggleValue +Adv +ShadingPos +ShadingPositionAssignment - nur getter +ShadingMode +IdleDetectionReading - nur setter +IdleDetectionValue - nur getter +BrightnessSensor - nur setter +ShadingInOutAzimuth - nur setter +ShadingAzimuthRight - nur getter +ShadingAzimuthLeft - nur getter +ShadingMinOutsideTemperature +ShadingMinMaxElevation - nur setter +getShadingMinElevation - nur getter +getShadingMaxElevation - nur getter +ShadingStateChangeSunnyCloudy - nur setter +ShadingStateChangeSunny - nur getter +ShadingStateChangeCloudy - nur getter +ShadingWaitingPeriod +ExternalTrigger - nur setter +ExternalTriggerDevice - nur getter +ExternalTriggerReading - nur getter +ExternalTriggerValueActive - nur getter +ExternalTriggerValueActive2 - nur getter +ExternalTriggerValueInactive - nur getter +ExternalTriggerPosActive - nur getter +ExternalTriggerPosActive2 - nur getter +ExternalTriggerPosInactive - nur getter +ExternalTriggerState - nur getter +Delay +DelayStart +BlockingTimeAfterManual +BlockingTimeBeforNightClose +BlockingTimeBeforDayOpen +PosCmd - ASC_Pos_Reading +OpenPos +OpenPositionAssignment - nur getter +VentilatePos +VentilatePositionAssignment - nur getter +VentilatePosAfterDayClosed +ClosedPos +ClosedPositionAssignment - nur getter +SleepPos +SleepPositionAssignment - nur getter +VentilateOpen +ComfortOpenPos +ComfortOpenPositionAssignment - nur getter +PartyMode +Roommates +RoommatesReading +RoommatesStatus - nur getter +RoommatesLastStatus - nur getter +WindParameters - nur setter +WindPos - nur getter +WindMax - nur getter +WindMin - nur getter +WindProtection +RainProtection +ModeUp +ModeDown +LockOut +LockOutCmd +AntiFreeze +AutoAstroModeMorning +AutoAstroModeEvening +AutoAstroModeMorningHorizon +AutoAstroModeEveningHorizon +Up +Down +TimeUpEarly +TimeUpLate +TimeDownEarly +TimeDownLate +TimeUpWeHoliday +getBrightnessMinVal - nur getter +BrightnessMaxVal - nur getter +DriveUpMaxDuration +Homemode - nur getter +PrivacyDownStatus - nur getter +PrivacyUpStatus - nur getter +IsDay - nur getter +AntiFreezeStatus - nur getter +SelfDefenseState - nur getter +LastDrive - nur getter +LastPos - nur getter +Sunset - nur getter +Sunrise - nur getter +OutTemp - nur getter +IdleDetection - nur getter +BrightnessAverage - nur getter nur für die Beschattung relevant +ShadingStatus - nur getter +ShadingLastStatus - nur getter +ShadingManualDriveStatus - nur getter +IfInShading - nur getter +WindProtectionStatus - nur getter +RainProtectionStatus - nur getter +Brightness - nur getter +WindStatus - nur getter +Status - nur getter, aktuelle Position des Rollos +DelayCmd - nur getter, Status der Query von ausgesetzten Fahrten wegen PartyMod oder offnen Fenster +ASCenable - nur getter, Status der ASC Steuerung vom Rollo +SubTyp - Fenster SubType +WinDevReading - nur getter, Reading für das Fenster ExternalTriggerDevice +WinDev - nur setter, ASC_WindowRec +WinStatus - nur getter, Fensterstatus + + + + +--- Im ASC Device --- - alles nur getter für das ASC Device +PartyMode - Party Mode Reading +HardLockOut - Hard Lock Out Reading +SunriseTimeWeHoliday - Feiertags und Wochenend Sunrise Zeiten beachten +OutTemp - Wert vom Tempsensor für Aussen +ResidentsStatus - aktueller Staus des Residents Devices +ResidentsLastStatus - vorheriger Staus des Residents Devices +AutoShuttersControlShading - globale Beschattung on/off +SelfDefense - global Self Defense on/off +Azimuth - aktueller Azimutwert vom Twilight Device +Elevation - aktueller Elevationwert vom Twilight Device +ASCenable - globaler ASC Status +ShuttersOffset - globales Drive Delay +BrightnessMinVal - Brightness Wert für Sonnenuntergang +BrightnessMaxVal - Brightness Wert für Sonnenaufgang +AutoAstroModeEvening +AutoAstroModeEveningHorizon +AutoAstroModeMorning +AutoAstroModeMorningHorizon +AutoShuttersControlMorning +AutoShuttersControlEvening +AutoShuttersControlComfort +FreezeTemp +RainTriggerMax +RainTriggerMin +RainSensorShuttersClosedPos +RainWaitingTime +BlockAscDrivesAfterManual From 47066ea068056c184dd2b716bd6e97ab380673e6 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Sat, 9 May 2020 08:40:58 +0200 Subject: [PATCH 13/60] expand API documantation --- 73_AutoShuttersControl.pm | 897 ++++++++++++++++++++++---------------- API_Uebersicht.txt | 7 +- 2 files changed, 518 insertions(+), 386 deletions(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index 134e257..e5e1709 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -300,7 +300,7 @@ sub ascAPIget { else { return $ascDev->$getter; } - + return; } @@ -312,13 +312,12 @@ sub ascAPIset { if ( defined($shutterDev) && $shutterDev && defined($value) - && $value - ) + && $value ) { $shutters->setShuttersDev($shutterDev); $shutters->$setter($value); } - + return; } @@ -657,10 +656,11 @@ m{^(DELETEATTR|ATTR) #global ATTR myASC ASC_tempSensor Cellar sub Set { my $hash = shift // return; - my $aArg = shift // return; + my $aArg = shift // return; my $name = shift @$aArg; - my $cmd = shift @$aArg // return qq{"set $name" needs at least one argument}; + my $cmd = shift @$aArg + // return qq{"set $name" needs at least one argument}; if ( lc $cmd eq 'renewalltimer' ) { return "usage: $cmd" if ( scalar( @{$aArg} ) != 0 ); @@ -736,7 +736,11 @@ sub Set { elsif ( lc $cmd eq 'wiggle' ) { return "usage: $cmd" if ( scalar( @{$aArg} ) > 1 ); - ( $aArg->[0] eq 'all' ? wiggleAll($hash) : wiggle( $hash, $aArg->[0] ) ); + ( + $aArg->[0] eq 'all' + ? wiggleAll($hash) + : wiggle( $hash, $aArg->[0] ) + ); } else { my $list = 'scanForShutters:noArg'; @@ -760,11 +764,12 @@ sub Set { } sub Get { - my $hash = shift // return; - my $aArg = shift // return; + my $hash = shift // return; + my $aArg = shift // return; - my $name = shift @$aArg // return; - my $cmd = shift @$aArg // return qq{"get $name" needs at least one argument}; + my $name = shift @$aArg // return; + my $cmd = shift @$aArg + // return qq{"get $name" needs at least one argument}; if ( lc $cmd eq 'shownotifydevsinformations' ) { return "usage: $cmd" if ( scalar( @{$aArg} ) != 0 ); @@ -811,21 +816,25 @@ sub ShuttersDeviceScan { #### Gleichlautende Attribute wo lediglich die Parameter geändert werden sollen müssen hier gelöscht und die Parameter in der Funktion renewSetSunriseSunsetTimer gesetzt werden, #### vorher empfiehlt es sich die dort vergebenen Parameter aus zu lesen um sie dann hier wieder neu zu setzen. Dazu wird das shutters Objekt um einen Eintrag #### 'AttrUpdateChanges' erweitert - if ( ReadingsVal( $shuttersDev, '.ASC_AttrUpdateChanges_' . $hash->{VERSION}, 0 ) - == 0 ) + if ( + ReadingsVal( + $shuttersDev, '.ASC_AttrUpdateChanges_' . $hash->{VERSION}, + 0 + ) == 0 + ) { - # $shutters->setAttrUpdateChanges( 'ASC_Up', - # AttrVal( $shuttersDev, 'ASC_Up', 'none' ) ); - # delFromDevAttrList( $shuttersDev, 'ASC_Up' ); - # $shutters->setAttrUpdateChanges( 'ASC_Down', - # AttrVal( $shuttersDev, 'ASC_Down', 'none' ) ); - # delFromDevAttrList( $shuttersDev, 'ASC_Down' ); - # $shutters->setAttrUpdateChanges( 'ASC_Self_Defense_Mode', - # AttrVal( $shuttersDev, 'ASC_Self_Defense_Mode', 'none' ) ); - # delFromDevAttrList( $shuttersDev, 'ASC_Self_Defense_Mode' ); - # $shutters->setAttrUpdateChanges( 'ASC_Self_Defense_Exclude', - # AttrVal( $shuttersDev, 'ASC_Self_Defense_Exclude', 'none' ) ); - # delFromDevAttrList( $shuttersDev, 'ASC_Self_Defense_Exclude' ); +# $shutters->setAttrUpdateChanges( 'ASC_Up', +# AttrVal( $shuttersDev, 'ASC_Up', 'none' ) ); +# delFromDevAttrList( $shuttersDev, 'ASC_Up' ); +# $shutters->setAttrUpdateChanges( 'ASC_Down', +# AttrVal( $shuttersDev, 'ASC_Down', 'none' ) ); +# delFromDevAttrList( $shuttersDev, 'ASC_Down' ); +# $shutters->setAttrUpdateChanges( 'ASC_Self_Defense_Mode', +# AttrVal( $shuttersDev, 'ASC_Self_Defense_Mode', 'none' ) ); +# delFromDevAttrList( $shuttersDev, 'ASC_Self_Defense_Mode' ); +# $shutters->setAttrUpdateChanges( 'ASC_Self_Defense_Exclude', +# AttrVal( $shuttersDev, 'ASC_Self_Defense_Exclude', 'none' ) ); +# delFromDevAttrList( $shuttersDev, 'ASC_Self_Defense_Exclude' ); } #### @@ -888,10 +897,14 @@ sub WriteReadingsShuttersList { for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { readingsBulkUpdate( $hash, - 'room_' . makeReadingName( AttrVal( $shuttersDev, 'room', 'unsorted' ) ), + 'room_' + . makeReadingName( AttrVal( $shuttersDev, 'room', 'unsorted' ) ), ReadingsVal( $name, - 'room_' . makeReadingName( AttrVal( $shuttersDev, 'room', 'unsorted' ) ), + 'room_' + . makeReadingName( + AttrVal( $shuttersDev, 'room', 'unsorted' ) + ), '' ) . ',' @@ -900,17 +913,27 @@ sub WriteReadingsShuttersList { if ( ReadingsVal( $name, - 'room_' . makeReadingName( AttrVal( $shuttersDev, 'room', 'unsorted' ) ), + 'room_' + . makeReadingName( + AttrVal( $shuttersDev, 'room', 'unsorted' ) + ), 'none' ) ne 'none' ); - readingsBulkUpdate( $hash, - 'room_' . makeReadingName( AttrVal( $shuttersDev, 'room', 'unsorted' ) ), $shuttersDev ) + readingsBulkUpdate( + $hash, + 'room_' + . makeReadingName( AttrVal( $shuttersDev, 'room', 'unsorted' ) ), + $shuttersDev + ) if ( ReadingsVal( $name, - 'room_' . makeReadingName( AttrVal( $shuttersDev, 'room', 'unsorted' ) ), + 'room_' + . makeReadingName( + AttrVal( $shuttersDev, 'room', 'unsorted' ) + ), 'none' ) eq 'none' ); @@ -928,7 +951,7 @@ sub UserAttributs_Readings_ForShutters { my $name = $hash->{NAME}; while ( my ( $attrib, $attribValue ) = each %{userAttrList} ) { - for my $shuttersDev( @{ $hash->{helper}{shuttersList} } ) { + for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { addToDevAttrList( $shuttersDev, $attrib ) ; ## fhem.pl bietet eine Funktion um ein userAttr Attribut zu befüllen. Wir schreiben also in den Attribut userAttr alle unsere Attribute rein. Pro Rolladen immer ein Attribut pro Durchlauf ## Danach werden die Attribute die im userAttr stehen gesetzt und mit default Werten befüllt @@ -936,15 +959,24 @@ sub UserAttributs_Readings_ForShutters { ## https://github.com/LeonGaultier/fhem-AutoShuttersControl/commit/e33d3cc7815031b087736c1054b98c57817e7083 if ( $cmd eq 'add' ) { if ( ref($attribValue) ne 'ARRAY' ) { - $attr{$shuttersDev}{ ( split( ':', $attrib ) )[0] } = $attribValue - if ( !defined( $attr{$shuttersDev}{ ( split( ':', $attrib ) )[0] } ) - && $attribValue ne '-' ); + $attr{$shuttersDev}{ ( split( ':', $attrib ) )[0] } = + $attribValue + if ( + !defined( + $attr{$shuttersDev}{ ( split( ':', $attrib ) )[0] } + ) + && $attribValue ne '-' + ); } else { $attr{$shuttersDev}{ ( split( ':', $attrib ) )[0] } = $attribValue->[ AttrVal( $shuttersDev, 'ASC', 2 ) ] - if ( !defined( $attr{$shuttersDev}{ ( split( ':', $attrib ) )[0] } ) - && $attrib eq 'ASC_Pos_Reading' ); + if ( + !defined( + $attr{$shuttersDev}{ ( split( ':', $attrib ) )[0] } + ) + && $attrib eq 'ASC_Pos_Reading' + ); } ### associatedWith damit man sieht das der Rollladen mit einem ASC Device verbunden ist @@ -985,7 +1017,10 @@ sub UserAttributs_Readings_ForShutters { readingsSingleUpdate( $defs{$shuttersDev}, 'associatedWith', join( ',', sort keys %hash ), 0 ); } - else { CommandDeleteReading( undef, $shuttersDev . ' associatedWith' ); } + else { + CommandDeleteReading( undef, + $shuttersDev . ' associatedWith' ); + } ################################### } } @@ -1259,10 +1294,11 @@ sub EventProcessingRoommate { my $getModeDown = $shutters->getModeDown; my $getRoommatesStatus = $shutters->getRoommatesStatus; my $getRoommatesLastStatus = $shutters->getRoommatesLastStatus; + my $event = $1; my $posValue; if ( - ( $1 eq 'home' || $1 eq 'awoken' ) + ( $event eq 'home' || $event eq 'awoken' ) && ( $getRoommatesStatus eq 'home' || $getRoommatesStatus eq 'awoken' ) && ( $ascDev->getAutoShuttersControlMorning eq 'on' @@ -1275,8 +1311,16 @@ sub EventProcessingRoommate { ); if ( ( - $getRoommatesLastStatus eq 'asleep' - || $getRoommatesLastStatus eq 'awoken' + ( + $getRoommatesLastStatus eq 'asleep' + && ( $shutters->getModeUp eq 'always' + or $shutters->getModeUp eq $event ) + ) + || ( + $getRoommatesLastStatus eq 'awoken' + && ( $shutters->getModeUp eq 'always' + or $shutters->getModeUp eq $event ) + ) ) && ( $shutters->getIsDay || $shutters->getUp eq 'roommate' ) @@ -1387,7 +1431,7 @@ sub EventProcessingRoommate { } } elsif ( - ( $1 eq 'gotosleep' || $1 eq 'asleep' ) + ( $event eq 'gotosleep' || $event eq 'asleep' ) && ( $ascDev->getAutoShuttersControlEvening eq 'on' || $shutters->getDown eq 'roommate' ) && ( IsAfterShuttersManualBlocking($shuttersDev) @@ -1414,7 +1458,7 @@ sub EventProcessingRoommate { ShuttersCommandSet( $hash, $shuttersDev, $posValue ); } elsif ( - $1 eq 'absent' + $event eq 'absent' && ( !$shutters->getIsDay || $shutters->getDown eq 'roommate' || $shutters->getShadingMode eq 'absent' @@ -2206,10 +2250,12 @@ sub EventProcessingBrightness { sub EventProcessingShadingBrightness { my ( $hash, $shuttersDev, $events ) = @_; - my $name = $hash->{NAME}; + my $name = $hash->{NAME}; $shutters->setShuttersDev($shuttersDev); my $reading = $shutters->getBrightnessReading; - my $outTemp = $ascDev->getOutTemp; + my $outTemp = $$shutters->getOutTemp; + $outTemp = $ascDev->getOutTemp + if ($outTemp == -100); Log3( $name, 4, "AutoShuttersControl ($shuttersDev) - EventProcessingShadingBrightness" @@ -2243,8 +2289,6 @@ sub EventProcessingShadingBrightness { && $shutters->getRainProtectionStatus eq 'unprotected' && $shutters->getWindProtectionStatus eq 'unprotected' ) { - $outTemp = $shutters->getOutTemp - if ( $shutters->getOutTemp != -100 ); ShadingProcessing( $hash, $shuttersDev, @@ -2282,9 +2326,11 @@ sub EventProcessingTwilightDevice { ); if ( $events =~ m{(azimuth|elevation|SunAz|SunAlt):\s(\d+.\d+)}xms ) { - my $name = $device; + my $name = $device; + my $outTemp = $$shutters->getOutTemp; + $outTemp = $ascDev->getOutTemp + if ($outTemp == -100); my ( $azimuth, $elevation ); - my $outTemp = $ascDev->getOutTemp; $azimuth = $2 if ( $1 eq 'azimuth' || $1 eq 'SunAz' ); $elevation = $2 if ( $1 eq 'elevation' || $1 eq 'SunAlt' ); @@ -2537,6 +2583,8 @@ sub ShadingProcessing { || $shutters->getShadingMode eq $homemode ) && ( $shutters->getModeUp eq 'always' || $shutters->getModeUp eq $homemode + || ( $shutters->getModeUp eq 'home' + && $homemode ne 'asleep' ) || $shutters->getModeUp eq 'off' ) && ( ( int( gettimeofday() ) - $shutters->getShadingStatusTimestamp ) < 2 @@ -3081,9 +3129,10 @@ sub RenewSunRiseSetShuttersTimer { #### 'AttrUpdateChanges' erweitert if ( ( int( gettimeofday() ) - $::fhem_started ) < 60 - and - ReadingsVal( $shuttersDev, '.ASC_AttrUpdateChanges_' . $hash->{VERSION}, - 0 ) == 0 + and ReadingsVal( + $shuttersDev, '.ASC_AttrUpdateChanges_' . $hash->{VERSION}, + 0 + ) == 0 ) { # $attr{$shuttersDev}{'ASC_Up'} = $shutters->getAttrUpdateChanges('ASC_Up') @@ -3100,12 +3149,12 @@ sub RenewSunRiseSetShuttersTimer { # $shutters->getAttrUpdateChanges('ASC_Self_Defense_Exclude') eq # 'on' ); - CommandDeleteReading( undef, $shuttersDev . ' .ASC_AttrUpdateChanges_.*' ) + CommandDeleteReading( undef, + $shuttersDev . ' .ASC_AttrUpdateChanges_.*' ) if ( - ReadingsVal( - $shuttersDev, '.ASC_AttrUpdateChanges_' . $hash->{VERSION}, - 'none' - ) eq 'none' + ReadingsVal( $shuttersDev, + '.ASC_AttrUpdateChanges_' . $hash->{VERSION}, 'none' ) eq + 'none' ); readingsSingleUpdate( $dhash, '.ASC_AttrUpdateChanges_' . $hash->{VERSION}, @@ -3411,18 +3460,24 @@ sub CreateNewNotifyDev { CommandDeleteReading( undef, $name . ' .monitoredDevs' ); my $shuttersList = ''; for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { - AddNotifyDev( $hash, AttrVal( $shuttersDev, 'ASC_Roommate_Device', 'none' ), + AddNotifyDev( $hash, + AttrVal( $shuttersDev, 'ASC_Roommate_Device', 'none' ), $shuttersDev, 'ASC_Roommate_Device' ) - if ( AttrVal( $shuttersDev, 'ASC_Roommate_Device', 'none' ) ne 'none' ); + if ( + AttrVal( $shuttersDev, 'ASC_Roommate_Device', 'none' ) ne 'none' ); AddNotifyDev( $hash, AttrVal( $shuttersDev, 'ASC_WindowRec', 'none' ), $shuttersDev, 'ASC_WindowRec' ) if ( AttrVal( $shuttersDev, 'ASC_WindowRec', 'none' ) ne 'none' ); - AddNotifyDev( $hash, AttrVal( $shuttersDev, 'ASC_BrightnessSensor', 'none' ), + AddNotifyDev( $hash, + AttrVal( $shuttersDev, 'ASC_BrightnessSensor', 'none' ), $shuttersDev, 'ASC_BrightnessSensor' ) - if ( AttrVal( $shuttersDev, 'ASC_BrightnessSensor', 'none' ) ne 'none' ); - AddNotifyDev( $hash, AttrVal( $shuttersDev, 'ASC_ExternalTrigger', 'none' ), + if ( + AttrVal( $shuttersDev, 'ASC_BrightnessSensor', 'none' ) ne 'none' ); + AddNotifyDev( $hash, + AttrVal( $shuttersDev, 'ASC_ExternalTrigger', 'none' ), $shuttersDev, 'ASC_ExternalTrigger' ) - if ( AttrVal( $shuttersDev, 'ASC_ExternalTrigger', 'none' ) ne 'none' ); + if ( + AttrVal( $shuttersDev, 'ASC_ExternalTrigger', 'none' ) ne 'none' ); $shuttersList = $shuttersList . ',' . $shuttersDev; } @@ -3520,7 +3575,8 @@ sub ShuttersInformation { $ret .= "" . $shutters->getLockOut . ""; $ret .= " "; $ret .= "" - . ReadingsVal( $shuttersDev, 'ASC_ShuttersLastDrive', 'none' ) . ""; + . ReadingsVal( $shuttersDev, 'ASC_ShuttersLastDrive', 'none' ) + . ""; $ret .= " "; $ret .= "" . $shutters->getStatus . ""; $ret .= " "; @@ -3561,7 +3617,8 @@ sub GetMonitoredDevs { my $linecount = 1; for my $notifydev ( sort keys( %{$notifydevs} ) ) { if ( ref( $notifydevs->{$notifydev} ) eq "HASH" ) { - for my $shuttersDev ( sort keys( %{ $notifydevs->{$notifydev} } ) ) + for my $shuttersDev ( + sort keys( %{ $notifydevs->{$notifydev} } ) ) { if ( $linecount % 2 == 0 ) { $ret .= ''; } else { $ret .= ''; } @@ -4561,16 +4618,22 @@ sub _SetCmdFn { . $posValue . ' ' . $driveCommand ); - CommandSet( - undef, - ( - $shutters->getSlatDevice ne 'none' - ? $shutters->getSlatDevice - : $shuttersDev - ) - . ' ' - . $shutters->getSlatPosCmd . ' ' - . $slatPos + InternalTimer( + gettimeofday() + 3, + sub() { + CommandSet( + undef, + ( + $shutters->getSlatDevice ne 'none' + ? $shutters->getSlatDevice + : $shuttersDev + ) + . ' ' + . $shutters->getSlatPosCmd . ' ' + . $slatPos + ); + }, + $shuttersDev ) if ( $slatPos > -1 && $shutters->getSlatPosCmd ne 'none' ); @@ -5808,17 +5871,12 @@ BEGIN { } sub _setAttributs { - my $shuttersDev = shift; - my $attr = shift; - my $attrVal = shift; + my $shuttersDev = shift; + my $attr = shift; + my $attrVal = shift; + + CommandAttr( undef, $shuttersDev . ' ' . $attr . ' ' . $attrVal ); - CommandAttr(undef,$shuttersDev - . ' ' - . $attr - . ' ' - . $attrVal - ); - return; } @@ -5929,11 +5987,11 @@ sub _getPositionAssignment { } sub setAntiFreezePos { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_Antifreeze_Pos',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Antifreeze_Pos', $attrVal ); + return; } @@ -5953,11 +6011,11 @@ sub getAntiFreezePosAssignment { } sub setShuttersPlace { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_ShuttersPlace',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_ShuttersPlace', $attrVal ); + return; } @@ -5968,11 +6026,12 @@ sub getShuttersPlace { } sub setSlatPosCmd { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_SlatPosCmd_SlatDevice',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_SlatPosCmd_SlatDevice', + $attrVal ); + return; } @@ -6030,11 +6089,12 @@ sub getSlatDevice { } sub setPrivacyUpTime { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_PrivacyUpValue_beforeDayOpen',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_PrivacyUpValue_beforeDayOpen', + $attrVal ); + return; } @@ -6104,11 +6164,12 @@ sub getPrivacyUpBrightnessVal { } sub setPrivacyDownTime { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_PrivacyDownValue_beforeNightClose',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, + 'ASC_PrivacyDownValue_beforeNightClose', $attrVal ); + return; } @@ -6178,11 +6239,11 @@ sub getPrivacyDownBrightnessVal { } sub setPrivacyUpPos { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_PrivacyUp_Pos',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_PrivacyUp_Pos', $attrVal ); + return; } @@ -6200,11 +6261,11 @@ sub getPrivacyUpPositionAssignment { } sub setPrivacyDownPos { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_PrivacyDown_Pos',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_PrivacyDown_Pos', $attrVal ); + return; } @@ -6223,11 +6284,11 @@ sub getPrivacyDownPositionAssignment { } sub setSelfDefenseMode { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_Self_Defense_Mode',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Self_Defense_Mode', $attrVal ); + return; } @@ -6238,11 +6299,12 @@ sub getSelfDefenseMode { } sub setSelfDefenseAbsentDelay { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_Self_Defense_AbsentDelay',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Self_Defense_AbsentDelay', + $attrVal ); + return; } @@ -6253,11 +6315,11 @@ sub getSelfDefenseAbsentDelay { } sub setWiggleValue { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_WiggleValue',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_WiggleValue', $attrVal ); + return; } @@ -6268,11 +6330,11 @@ sub getWiggleValue { } sub setAdv { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_Adv',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Adv', $attrVal ); + return; } @@ -6288,11 +6350,11 @@ sub getAdv { ### Begin Beschattung sub setShadingPos { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_Shading_Pos',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Shading_Pos', $attrVal ); + return; } @@ -6311,11 +6373,11 @@ sub getShadingPositionAssignment { } sub setShadingMode { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_Shading_Mode',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Shading_Mode', $attrVal ); + return; } @@ -6374,11 +6436,12 @@ sub getTempSensorReading { } sub setIdleDetectionReading { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_Shutter_IdleDetection',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Shutter_IdleDetection', + $attrVal ); + return; } @@ -6439,11 +6502,11 @@ sub getIdleDetectionValue { } sub setBrightnessSensor { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_BrightnessSensor',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_BrightnessSensor', $attrVal ); + return; } @@ -6524,11 +6587,11 @@ sub getShadingAzimuthLeft { } sub setShadingInOutAzimuth { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_Shading_InOutAzimuth',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Shading_InOutAzimuth', $attrVal ); + return; } @@ -6565,11 +6628,12 @@ sub getShadingAzimuthRight { } sub setShadingMinOutsideTemperature { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_Shading_Min_OutsideTemperature',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Shading_Min_OutsideTemperature', + $attrVal ); + return; } @@ -6581,11 +6645,12 @@ sub getShadingMinOutsideTemperature { } sub setShadingMinMaxElevation { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_Shading_MinMax_Elevation',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Shading_MinMax_Elevation', + $attrVal ); + return; } @@ -6642,11 +6707,12 @@ sub getShadingMaxElevation { } sub setShadingStateChangeSunnyCloudy { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_Shading_StateChange_SunnyCloudy',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Shading_StateChange_SunnyCloudy', + $attrVal ); + return; } @@ -6730,11 +6796,12 @@ sub getMaxBrightnessAverageArrayObjects { } sub setShadingWaitingPeriod { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_Shading_WaitingPeriod',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Shading_WaitingPeriod', + $attrVal ); + return; } @@ -6745,11 +6812,11 @@ sub getShadingWaitingPeriod { } ### Ende Beschattung sub setExternalTrigger { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_ExternalTrigger',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_ExternalTrigger', $attrVal ); + return; } @@ -6944,11 +7011,11 @@ sub getExternalTriggerState { } sub setDelay { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_Drive_Delay',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Drive_Delay', $attrVal ); + return; } @@ -6960,11 +7027,11 @@ sub getDelay { } sub setDelayStart { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_Drive_DelayStart',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Drive_DelayStart', $attrVal ); + return; } @@ -6976,11 +7043,12 @@ sub getDelayStart { } sub setBlockingTimeAfterManual { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_BlockingTime_afterManual',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_BlockingTime_afterManual', + $attrVal ); + return; } @@ -6992,11 +7060,12 @@ sub getBlockingTimeAfterManual { } sub setBlockingTimeBeforNightClose { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_BlockingTime_beforNightClose',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_BlockingTime_beforNightClose', + $attrVal ); + return; } @@ -7008,11 +7077,12 @@ sub getBlockingTimeBeforNightClose { } sub setBlockingTimeBeforDayOpen { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_BlockingTime_beforDayOpen',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_BlockingTime_beforDayOpen', + $attrVal ); + return; } @@ -7024,11 +7094,11 @@ sub getBlockingTimeBeforDayOpen { } sub setPosCmd { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_Pos_Reading',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Pos_Reading', $attrVal ); + return; } @@ -7041,11 +7111,11 @@ sub getPosCmd { } sub setOpenPos { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_Open_Pos',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Open_Pos', $attrVal ); + return; } @@ -7063,11 +7133,11 @@ sub getOpenPositionAssignment { } sub setVentilatePos { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_Ventilate_Pos',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Ventilate_Pos', $attrVal ); + return; } @@ -7086,11 +7156,12 @@ sub getVentilatePositionAssignment { } sub setVentilatePosAfterDayClosed { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_WindowRec_PosAfterDayClosed',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_WindowRec_PosAfterDayClosed', + $attrVal ); + return; } @@ -7102,11 +7173,11 @@ sub getVentilatePosAfterDayClosed { } sub setClosedPos { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_Closed_Pos',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Closed_Pos', $attrVal ); + return; } @@ -7125,11 +7196,11 @@ sub getClosedPositionAssignment { } sub setSleepPos { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_Sleep_Pos',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Sleep_Pos', $attrVal ); + return; } @@ -7147,11 +7218,12 @@ sub getSleepPositionAssignment { } sub setVentilateOpen { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_Ventilate_Window_Open',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Ventilate_Window_Open', + $attrVal ); + return; } @@ -7162,11 +7234,11 @@ sub getVentilateOpen { } sub setComfortOpenPos { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_ComfortOpen_Pos',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_ComfortOpen_Pos', $attrVal ); + return; } @@ -7185,11 +7257,11 @@ sub getComfortOpenPositionAssignment { } sub setPartyMode { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_Partymode',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Partymode', $attrVal ); + return; } @@ -7200,11 +7272,11 @@ sub getPartyMode { } sub setRoommates { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_Roommate_Device',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Roommate_Device', $attrVal ); + return; } @@ -7215,11 +7287,11 @@ sub getRoommates { } sub setRoommatesReading { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_Roommate_Reading',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Roommate_Reading', $attrVal ); + return; } @@ -7281,11 +7353,11 @@ sub getWindMax { } sub setWindParameters { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_WindParameters',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_WindParameters', $attrVal ); + return; } @@ -7309,11 +7381,11 @@ sub getWindMin { } sub setWindProtection { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_WindProtection',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_WindProtection', $attrVal ); + return; } @@ -7324,11 +7396,11 @@ sub getWindProtection { } sub setRainProtection { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_RainProtection',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_RainProtection', $attrVal ); + return; } @@ -7339,11 +7411,11 @@ sub getRainProtection { } sub setModeUp { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_Mode_Up',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Mode_Up', $attrVal ); + return; } @@ -7354,11 +7426,11 @@ sub getModeUp { } sub setModeDown { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_Mode_Down',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Mode_Down', $attrVal ); + return; } @@ -7369,11 +7441,11 @@ sub getModeDown { } sub setLockOut { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_LockOut',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_LockOut', $attrVal ); + return; } @@ -7384,11 +7456,11 @@ sub getLockOut { } sub setLockOutCmd { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_LockOut_Cmd',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_LockOut_Cmd', $attrVal ); + return; } @@ -7399,11 +7471,11 @@ sub getLockOutCmd { } sub setAntiFreeze { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_Antifreeze',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Antifreeze', $attrVal ); + return; } @@ -7414,11 +7486,11 @@ sub getAntiFreeze { } sub setAutoAstroModeMorning { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_AutoAstroModeMorning',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_AutoAstroModeMorning', $attrVal ); + return; } @@ -7429,11 +7501,11 @@ sub getAutoAstroModeMorning { } sub setAutoAstroModeEvening { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_AutoAstroModeEvening',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_AutoAstroModeEvening', $attrVal ); + return; } @@ -7444,11 +7516,12 @@ sub getAutoAstroModeEvening { } sub setAutoAstroModeMorningHorizon { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_AutoAstroModeMorningHorizon',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_AutoAstroModeMorningHorizon', + $attrVal ); + return; } @@ -7460,11 +7533,12 @@ sub getAutoAstroModeMorningHorizon { } sub setAutoAstroModeEveningHorizon { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_AutoAstroModeEveningHorizon',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_AutoAstroModeEveningHorizon', + $attrVal ); + return; } @@ -7476,11 +7550,11 @@ sub getAutoAstroModeEveningHorizon { } sub setUp { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_Up',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Up', $attrVal ); + return; } @@ -7491,11 +7565,11 @@ sub getUp { } sub setDown { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_Down',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Down', $attrVal ); + return; } @@ -7506,11 +7580,11 @@ sub getDown { } sub setTimeUpEarly { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_Time_Up_Early',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Time_Up_Early', $attrVal ); + return; } @@ -7531,11 +7605,11 @@ sub getTimeUpEarly { } sub setTimeUpLate { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_Time_Up_Late',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Time_Up_Late', $attrVal ); + return; } @@ -7556,11 +7630,11 @@ sub getTimeUpLate { } sub setTimeDownEarly { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_Time_Down_Early',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Time_Down_Early', $attrVal ); + return; } @@ -7581,11 +7655,11 @@ sub getTimeDownEarly { } sub setTimeDownLate { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_Time_Down_Late',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Time_Down_Late', $attrVal ); + return; } @@ -7606,11 +7680,11 @@ sub getTimeDownLate { } sub setTimeUpWeHoliday { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_Time_Up_WE_Holiday',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Time_Up_WE_Holiday', $attrVal ); + return; } @@ -7670,11 +7744,11 @@ sub getBrightnessMaxVal { } sub setDriveUpMaxDuration { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_DriveUpMaxDuration',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_DriveUpMaxDuration', $attrVal ); + return; } @@ -7762,11 +7836,11 @@ BEGIN { } sub setSubTyp { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_WindowRec_subType',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_WindowRec_subType', $attrVal ); + return; } @@ -7777,11 +7851,11 @@ sub getSubTyp { } sub setWinDev { - my $self = shift; - my $attrVal = shift; - - _setAttributs($self->{shuttersDev},'ASC_WindowRec',$attrVal); - + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_WindowRec', $attrVal ); + return; } @@ -9322,7 +9396,7 @@ sub getBlockAscDrivesAfterManual {
  • ASC_Shading_Min_OutsideTemperature - ab welcher Temperatur soll Beschattet werden, immer in Abhängigkeit der anderen einbezogenen Sensorwerte (default: 18)
  • ASC_Shading_Mode - absent,always,off,home / wann soll die Beschattung nur stattfinden. (default: off)
  • ASC_Shading_Pos - Position des Rollladens für die Beschattung (Default: ist abhängig vom AttributASC 80/20) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
  • -
  • ASC_Shading_StateChange_SunnyCloudy - Brightness Wert ab welchen die Beschattung stattfinden und aufgehoben werden soll, immer in Abhängigkeit der anderen einbezogenen Sensorwerte. Ein optionaler dritter Wert gibt an wie, viele Brightnesswerte für den aktuellen Brightness-Durchschnitt berücksichtigt werden. Standard ist 3, es sollte nicht höher wie 5 genommen werden. (default: 35000:20000 [3])
  • +
  • ASC_Shading_StateChange_SunnyCloudy - Brightness Wert ab welchen die Beschattung stattfinden und aufgehoben werden soll, immer in Abhängigkeit der anderen einbezogenen Sensorwerte. Ein optionaler dritter Wert gibt an wie, viele Brightnesswerte für den aktuellen Brightness-Durchschnitt berücksichtigt werden. Standard ist 3, es sollten nicht mehr als 5 berücksichtigt werden. (default: 35000:20000 [3])
  • ASC_Shading_WaitingPeriod - wie viele Sekunden soll gewartet werden bevor eine weitere Auswertung der Sensordaten für die Beschattung stattfinden soll (default: 1200)
  • ASC_ShuttersPlace - window/terrace - Wenn dieses Attribut auf terrace gesetzt ist, das Residence Device in den Status "gone" geht und SelfDefense aktiv ist (ohne das das Reading selfDefense gesetzt sein muss), wird das Rollo geschlossen (default: window)
  • @@ -9352,6 +9426,65 @@ sub getBlockAscDrivesAfterManual { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -9422,7 +9555,7 @@ sub getBlockAscDrivesAfterManual { ], "release_status": "testing", "license": "GPL_2", - "version": "v0.9.16", + "version": "v0.9.17", "author": [ "Marko Oldenburg " ], diff --git a/API_Uebersicht.txt b/API_Uebersicht.txt index 3ec057e..c15b30e 100644 --- a/API_Uebersicht.txt +++ b/API_Uebersicht.txt @@ -1,6 +1,7 @@ --- In den Rolläden --- AntiFreezePos AntiFreezePosAssignment - nur getter +AntiFreeze ShuttersPlace SlatPosCmd SlatDevice - nur getter @@ -27,8 +28,8 @@ ShadingAzimuthRight - nur getter ShadingAzimuthLeft - nur getter ShadingMinOutsideTemperature ShadingMinMaxElevation - nur setter -getShadingMinElevation - nur getter -getShadingMaxElevation - nur getter +ShadingMinElevation - nur getter +ShadingMaxElevation - nur getter ShadingStateChangeSunnyCloudy - nur setter ShadingStateChangeSunny - nur getter ShadingStateChangeCloudy - nur getter @@ -76,7 +77,6 @@ ModeUp ModeDown LockOut LockOutCmd -AntiFreeze AutoAstroModeMorning AutoAstroModeEvening AutoAstroModeMorningHorizon @@ -95,7 +95,6 @@ Homemode - nur getter PrivacyDownStatus - nur getter PrivacyUpStatus - nur getter IsDay - nur getter -AntiFreezeStatus - nur getter SelfDefenseState - nur getter LastDrive - nur getter LastPos - nur getter From 92682765183c59a7c50686f668e443f131b46560 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Sat, 9 May 2020 14:50:51 +0200 Subject: [PATCH 14/60] fix bug not a scalar reference --- 73_AutoShuttersControl.pm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index e5e1709..24cca52 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -2253,7 +2253,7 @@ sub EventProcessingShadingBrightness { my $name = $hash->{NAME}; $shutters->setShuttersDev($shuttersDev); my $reading = $shutters->getBrightnessReading; - my $outTemp = $$shutters->getOutTemp; + my $outTemp = $shutters->getOutTemp; $outTemp = $ascDev->getOutTemp if ($outTemp == -100); @@ -2327,7 +2327,7 @@ sub EventProcessingTwilightDevice { if ( $events =~ m{(azimuth|elevation|SunAz|SunAlt):\s(\d+.\d+)}xms ) { my $name = $device; - my $outTemp = $$shutters->getOutTemp; + my $outTemp = $shutters->getOutTemp; $outTemp = $ascDev->getOutTemp if ($outTemp == -100); my ( $azimuth, $elevation ); From ce5fb58b3478994ce54565dc217ab6da8dc866c8 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Mon, 11 May 2020 18:55:12 +0200 Subject: [PATCH 15/60] expand commandref --- 73_AutoShuttersControl.pm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index 24cca52..f98ed5e 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -9470,14 +9470,14 @@ sub getBlockAscDrivesAfterManual { - - - + + + - + @@ -9555,7 +9555,7 @@ sub getBlockAscDrivesAfterManual { ], "release_status": "testing", "license": "GPL_2", - "version": "v0.9.17", + "version": "v0.9.18", "author": [ "Marko Oldenburg " ], From 20191f45650b4c12445ff66b265b3340d3d44b82 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Tue, 12 May 2020 22:40:17 +0200 Subject: [PATCH 16/60] fix bug then privacyDownPos and night drive with window open --- 73_AutoShuttersControl.pm | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index f98ed5e..aebd03f 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -1142,9 +1142,14 @@ sub EventProcessingWindowRec { if ( $match =~ m{[Cc]lose|true}xms && IsAfterShuttersTimeBlocking($shuttersDev) - && ( $shutters->getStatus == $shutters->getVentilatePos + && ( + $shutters->getStatus == $shutters->getVentilatePos || $shutters->getStatus == $shutters->getComfortOpenPos - || $shutters->getStatus == $shutters->getOpenPos ) + || $shutters->getStatus == $shutters->getOpenPos + || ( $shutters->getStatus == $shutters->getPrivacyDownPos + && $shutters->getPrivacyDownStatus == 0 + && !$shutters->getIsDay ) + ) && ( $shutters->getVentilateOpen eq 'on' || $ascDev->getAutoShuttersControlComfort eq 'on' ) ) @@ -2250,12 +2255,12 @@ sub EventProcessingBrightness { sub EventProcessingShadingBrightness { my ( $hash, $shuttersDev, $events ) = @_; - my $name = $hash->{NAME}; + my $name = $hash->{NAME}; $shutters->setShuttersDev($shuttersDev); my $reading = $shutters->getBrightnessReading; my $outTemp = $shutters->getOutTemp; - $outTemp = $ascDev->getOutTemp - if ($outTemp == -100); + $outTemp = $ascDev->getOutTemp + if ( $outTemp == -100 ); Log3( $name, 4, "AutoShuttersControl ($shuttersDev) - EventProcessingShadingBrightness" @@ -2328,8 +2333,8 @@ sub EventProcessingTwilightDevice { if ( $events =~ m{(azimuth|elevation|SunAz|SunAlt):\s(\d+.\d+)}xms ) { my $name = $device; my $outTemp = $shutters->getOutTemp; - $outTemp = $ascDev->getOutTemp - if ($outTemp == -100); + $outTemp = $ascDev->getOutTemp + if ( $outTemp == -100 ); my ( $azimuth, $elevation ); $azimuth = $2 if ( $1 eq 'azimuth' || $1 eq 'SunAz' ); @@ -2581,11 +2586,13 @@ sub ShadingProcessing { ) && ( $shutters->getShadingMode eq 'always' || $shutters->getShadingMode eq $homemode ) - && ( $shutters->getModeUp eq 'always' + && ( + $shutters->getModeUp eq 'always' || $shutters->getModeUp eq $homemode || ( $shutters->getModeUp eq 'home' && $homemode ne 'asleep' ) - || $shutters->getModeUp eq 'off' ) + || $shutters->getModeUp eq 'off' + ) && ( ( int( gettimeofday() ) - $shutters->getShadingStatusTimestamp ) < 2 || ( !$shutters->getQueryShuttersPos( $shutters->getShadingPos ) From 2a2122f93a56086d0da5d2554efcda854c58bced Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Fri, 15 May 2020 11:02:23 +0200 Subject: [PATCH 17/60] fix night detection --- 73_AutoShuttersControl.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index aebd03f..35d35da 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -3856,7 +3856,7 @@ sub _IsDay { ( $shutters->getBrightness > $brightnessMaxVal && !$isday - && !$shutters->getSunrise + && $shutters->getSunrise ) || $respIsDay || $shutters->getSunrise From 9d0a1b0141296530ea566433daeb68731c89659b Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Fri, 15 May 2020 13:49:41 +0200 Subject: [PATCH 18/60] fix shutters closed then windows closed and shutter position is privacydown position --- 73_AutoShuttersControl.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index 35d35da..edc4fe0 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -1147,7 +1147,7 @@ sub EventProcessingWindowRec { || $shutters->getStatus == $shutters->getComfortOpenPos || $shutters->getStatus == $shutters->getOpenPos || ( $shutters->getStatus == $shutters->getPrivacyDownPos - && $shutters->getPrivacyDownStatus == 0 + && $shutters->getPrivacyDownStatus == 1 && !$shutters->getIsDay ) ) && ( $shutters->getVentilateOpen eq 'on' From ac818f62502bcf2e278bdbc3258e9c8a1a907adc Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Thu, 21 May 2020 09:17:28 +0200 Subject: [PATCH 19/60] change outTemp Code in ProcessingShadingBrightness7 --- 73_AutoShuttersControl.pm | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index edc4fe0..f1a2738 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -2258,9 +2258,7 @@ sub EventProcessingShadingBrightness { my $name = $hash->{NAME}; $shutters->setShuttersDev($shuttersDev); my $reading = $shutters->getBrightnessReading; - my $outTemp = $shutters->getOutTemp; - $outTemp = $ascDev->getOutTemp - if ( $outTemp == -100 ); + my $outTemp = ( $shutters->getOutTemp != -100 ? $shutters->getOutTemp : $ascDev->getOutTemp ); Log3( $name, 4, "AutoShuttersControl ($shuttersDev) - EventProcessingShadingBrightness" @@ -2332,17 +2330,15 @@ sub EventProcessingTwilightDevice { if ( $events =~ m{(azimuth|elevation|SunAz|SunAlt):\s(\d+.\d+)}xms ) { my $name = $device; - my $outTemp = $shutters->getOutTemp; - $outTemp = $ascDev->getOutTemp - if ( $outTemp == -100 ); + my $outTemp = $ascDev->getOutTemp; my ( $azimuth, $elevation ); - $azimuth = $2 if ( $1 eq 'azimuth' || $1 eq 'SunAz' ); - $elevation = $2 if ( $1 eq 'elevation' || $1 eq 'SunAlt' ); + $azimuth = $2 if ( $1 eq 'azimuth' || $1 eq 'SunAz' ); + $elevation = $2 if ( $1 eq 'elevation' || $1 eq 'SunAlt' ); - $azimuth = $ascDev->getAzimuth + $azimuth = $ascDev->getAzimuth if ( !defined($azimuth) && !$azimuth ); - $elevation = $ascDev->getElevation + $elevation = $ascDev->getElevation if ( !defined($elevation) && !$elevation ); ASC_Debug( 'EventProcessingTwilightDevice: ' @@ -2353,10 +2349,10 @@ sub EventProcessingTwilightDevice { for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { $shutters->setShuttersDev($shuttersDev); - my $homemode = $shutters->getRoommatesStatus; - $homemode = $ascDev->getResidentsStatus if ( $homemode eq 'none' ); - $outTemp = $shutters->getOutTemp - if ( $shutters->getOutTemp != -100 ); + my $homemode = $shutters->getRoommatesStatus; + $homemode = $ascDev->getResidentsStatus if ( $homemode eq 'none' ); + $outTemp = $shutters->getOutTemp + if ( $shutters->getOutTemp != -100 ); ASC_Debug( 'EventProcessingTwilightDevice: ' . $shutters->getShuttersDev From 6ab65372d25e599544aceb88ea596570edfe13e2 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Thu, 21 May 2020 09:39:39 +0200 Subject: [PATCH 20/60] change outTemp condition for shading out --- 73_AutoShuttersControl.pm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index f1a2738..709ad2d 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -2465,7 +2465,7 @@ sub ShadingProcessing { if ( ( - $outTemp < $shutters->getShadingMinOutsideTemperature - 3 + $outTemp < $shutters->getShadingMinOutsideTemperature - 4 || $azimuth < $azimuthLeft || $azimuth > $azimuthRight || !$shutters->getIsDay @@ -2490,7 +2490,7 @@ sub ShadingProcessing { || $elevation < $shutters->getShadingMinElevation || $elevation > $shutters->getShadingMaxElevation || $brightness < $shutters->getShadingStateChangeCloudy - || $outTemp < $shutters->getShadingMinOutsideTemperature ) + || $outTemp < $shutters->getShadingMinOutsideTemperature - 1 ) { $shutters->setShadingStatus('out reserved') if ( $shutters->getShadingStatus eq 'in' From ca56067e5cd29903b5166439830308f7ea4b21da Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Thu, 21 May 2020 09:46:37 +0200 Subject: [PATCH 21/60] fixes: #12 drive shutters in closePos then is not day and triggerPosInactiv --- 73_AutoShuttersControl.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index 709ad2d..46e2ffd 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -2903,7 +2903,7 @@ sub EventProcessingExternalTriggerDevice { $shutters->setLastDrive('external trigger device inactive'); $shutters->setNoDelay(1); $shutters->setExternalTriggerState(1); - ShuttersCommandSet( $hash, $shuttersDev, $triggerPosInactive ); + ShuttersCommandSet( $hash, $shuttersDev, ($shutters->getIsDay ? $triggerPosInactive : $shutters->getClosedPos) ); } ASC_Debug( From b440b1b96e2416881ca75cbd9ced3f9e6968d935 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Thu, 21 May 2020 11:22:30 +0200 Subject: [PATCH 22/60] fixed #11 --- 73_AutoShuttersControl.pm | 92 +++++++++++++++++++-------------------- 1 file changed, 44 insertions(+), 48 deletions(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index 46e2ffd..0df4787 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -2903,7 +2903,13 @@ sub EventProcessingExternalTriggerDevice { $shutters->setLastDrive('external trigger device inactive'); $shutters->setNoDelay(1); $shutters->setExternalTriggerState(1); - ShuttersCommandSet( $hash, $shuttersDev, ($shutters->getIsDay ? $triggerPosInactive : $shutters->getClosedPos) ); + ShuttersCommandSet( $hash, $shuttersDev, + ( + $shutters->getIsDay + ? $triggerPosInactive + : $shutters->getClosedPos + ) + ); } ASC_Debug( @@ -3758,6 +3764,18 @@ sub _IsDay { $shutters->setShuttersDev($shuttersDev); + my $brightnessMinVal = + ( $shutters->getBrightnessMinVal > -1 + ? $shutters->getBrightnessMinVal + : $ascDev->getBrightnessMinVal + ); + + my $brightnessMaxVal = + ( $shutters->getBrightnessMaxVal > -1 + ? $shutters->getBrightnessMaxVal + : $ascDev->getBrightnessMaxVal + ); + my $isday = ( ShuttersSunrise( $shuttersDev, 'unix' ) > ShuttersSunset( $shuttersDev, 'unix' ) ? 1 : 0 ); my $respIsDay = $isday; @@ -3766,63 +3784,41 @@ sub _IsDay { if ( ( - $shutters->getDown eq 'brightness' - || $shutters->getUp eq 'brightness' - ) - || ( ( ( - ( - int( gettimeofday() / 86400 ) != int( - computeAlignTime( '24:00', - $shutters->getTimeUpEarly ) / 86400 - ) - && !IsWe() - ) - || ( - int( gettimeofday() / 86400 ) != int( - computeAlignTime( '24:00', - $shutters->getTimeUpWeHoliday ) / 86400 - ) - && IsWe() - && $ascDev->getSunriseTimeWeHoliday eq 'on' - && $shutters->getTimeUpWeHoliday ne '01:25' + int( gettimeofday() / 86400 ) != int( + computeAlignTime( '24:00', + $shutters->getTimeUpEarly ) / 86400 ) + && !IsWe() ) - && int( gettimeofday() / 86400 ) == int( - computeAlignTime( '24:00', $shutters->getTimeUpLate ) / - 86400 + || ( + int( gettimeofday() / 86400 ) != int( + computeAlignTime( '24:00', + $shutters->getTimeUpWeHoliday ) / 86400 + ) + && IsWe() + && $ascDev->getSunriseTimeWeHoliday eq 'on' + && $shutters->getTimeUpWeHoliday ne '01:25' ) ) - || ( - int( gettimeofday() / 86400 ) != int( - computeAlignTime( '24:00', $shutters->getTimeDownEarly ) / - 86400 - ) - && int( gettimeofday() / 86400 ) == int( - computeAlignTime( '24:00', $shutters->getTimeDownLate ) / - 86400 - ) + && int( gettimeofday() / 86400 ) == int( + computeAlignTime( '24:00', $shutters->getTimeUpLate ) / + 86400 + ) + ) + || ( + int( gettimeofday() / 86400 ) != int( + computeAlignTime( '24:00', $shutters->getTimeDownEarly ) / + 86400 + ) + && int( gettimeofday() / 86400 ) == int( + computeAlignTime( '24:00', $shutters->getTimeDownLate ) / + 86400 ) ) ) { - my $brightnessMinVal; - if ( $shutters->getBrightnessMinVal > -1 ) { - $brightnessMinVal = $shutters->getBrightnessMinVal; - } - else { - $brightnessMinVal = $ascDev->getBrightnessMinVal; - } - - my $brightnessMaxVal; - if ( $shutters->getBrightnessMaxVal > -1 ) { - $brightnessMaxVal = $shutters->getBrightnessMaxVal; - } - else { - $brightnessMaxVal = $ascDev->getBrightnessMaxVal; - } - ##### Nach Sonnenuntergang / Abends $respIsDay = ( ( From 419bba1e74bae376731f8a93e69d5a756cba791c Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Thu, 21 May 2020 11:24:28 +0200 Subject: [PATCH 23/60] change version number --- 73_AutoShuttersControl.pm | 61 ++++++++++++++++++++------------------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index 0df4787..f95cc72 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -2258,7 +2258,10 @@ sub EventProcessingShadingBrightness { my $name = $hash->{NAME}; $shutters->setShuttersDev($shuttersDev); my $reading = $shutters->getBrightnessReading; - my $outTemp = ( $shutters->getOutTemp != -100 ? $shutters->getOutTemp : $ascDev->getOutTemp ); + my $outTemp = + ( $shutters->getOutTemp != -100 + ? $shutters->getOutTemp + : $ascDev->getOutTemp ); Log3( $name, 4, "AutoShuttersControl ($shuttersDev) - EventProcessingShadingBrightness" @@ -2333,12 +2336,12 @@ sub EventProcessingTwilightDevice { my $outTemp = $ascDev->getOutTemp; my ( $azimuth, $elevation ); - $azimuth = $2 if ( $1 eq 'azimuth' || $1 eq 'SunAz' ); - $elevation = $2 if ( $1 eq 'elevation' || $1 eq 'SunAlt' ); + $azimuth = $2 if ( $1 eq 'azimuth' || $1 eq 'SunAz' ); + $elevation = $2 if ( $1 eq 'elevation' || $1 eq 'SunAlt' ); - $azimuth = $ascDev->getAzimuth + $azimuth = $ascDev->getAzimuth if ( !defined($azimuth) && !$azimuth ); - $elevation = $ascDev->getElevation + $elevation = $ascDev->getElevation if ( !defined($elevation) && !$elevation ); ASC_Debug( 'EventProcessingTwilightDevice: ' @@ -2349,10 +2352,10 @@ sub EventProcessingTwilightDevice { for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { $shutters->setShuttersDev($shuttersDev); - my $homemode = $shutters->getRoommatesStatus; - $homemode = $ascDev->getResidentsStatus if ( $homemode eq 'none' ); - $outTemp = $shutters->getOutTemp - if ( $shutters->getOutTemp != -100 ); + my $homemode = $shutters->getRoommatesStatus; + $homemode = $ascDev->getResidentsStatus if ( $homemode eq 'none' ); + $outTemp = $shutters->getOutTemp + if ( $shutters->getOutTemp != -100 ); ASC_Debug( 'EventProcessingTwilightDevice: ' . $shutters->getShuttersDev @@ -2903,9 +2906,11 @@ sub EventProcessingExternalTriggerDevice { $shutters->setLastDrive('external trigger device inactive'); $shutters->setNoDelay(1); $shutters->setExternalTriggerState(1); - ShuttersCommandSet( $hash, $shuttersDev, + ShuttersCommandSet( + $hash, + $shuttersDev, ( - $shutters->getIsDay + $shutters->getIsDay ? $triggerPosInactive : $shutters->getClosedPos ) @@ -3764,17 +3769,17 @@ sub _IsDay { $shutters->setShuttersDev($shuttersDev); - my $brightnessMinVal = - ( $shutters->getBrightnessMinVal > -1 - ? $shutters->getBrightnessMinVal - : $ascDev->getBrightnessMinVal - ); + my $brightnessMinVal = ( + $shutters->getBrightnessMinVal > -1 + ? $shutters->getBrightnessMinVal + : $ascDev->getBrightnessMinVal + ); - my $brightnessMaxVal = - ( $shutters->getBrightnessMaxVal > -1 - ? $shutters->getBrightnessMaxVal - : $ascDev->getBrightnessMaxVal - ); + my $brightnessMaxVal = ( + $shutters->getBrightnessMaxVal > -1 + ? $shutters->getBrightnessMaxVal + : $ascDev->getBrightnessMaxVal + ); my $isday = ( ShuttersSunrise( $shuttersDev, 'unix' ) > ShuttersSunset( $shuttersDev, 'unix' ) ? 1 : 0 ); @@ -3787,8 +3792,8 @@ sub _IsDay { ( ( int( gettimeofday() / 86400 ) != int( - computeAlignTime( '24:00', - $shutters->getTimeUpEarly ) / 86400 + computeAlignTime( '24:00', $shutters->getTimeUpEarly ) + / 86400 ) && !IsWe() ) @@ -3803,18 +3808,16 @@ sub _IsDay { ) ) && int( gettimeofday() / 86400 ) == int( - computeAlignTime( '24:00', $shutters->getTimeUpLate ) / - 86400 + computeAlignTime( '24:00', $shutters->getTimeUpLate ) / 86400 ) ) || ( int( gettimeofday() / 86400 ) != int( computeAlignTime( '24:00', $shutters->getTimeDownEarly ) / - 86400 + 86400 ) && int( gettimeofday() / 86400 ) == int( - computeAlignTime( '24:00', $shutters->getTimeDownLate ) / - 86400 + computeAlignTime( '24:00', $shutters->getTimeDownLate ) / 86400 ) ) ) @@ -9554,7 +9557,7 @@ sub getBlockAscDrivesAfterManual { ], "release_status": "testing", "license": "GPL_2", - "version": "v0.9.18", + "version": "v0.9.19", "author": [ "Marko Oldenburg " ], From 2dc5da70c2355d56caac5f4a19372bdc15638fbc Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Fri, 22 May 2020 15:58:16 +0200 Subject: [PATCH 24/60] fix bug then shading out but not drive and timestamp is to old --- 73_AutoShuttersControl.pm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index f95cc72..32b97fc 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -2597,6 +2597,8 @@ sub ShadingProcessing { || ( !$shutters->getQueryShuttersPos( $shutters->getShadingPos ) && $shutters->getIfInShading && $shutters->getStatus != $shutters->getShadingPos ) + || ( !$shutters->getIfInShading + && $shutters->getStatus == $shutters->getShadingPos ) ) ); From 0fa7dc308c63b61d3de60be8929732d6152a675d Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Tue, 2 Jun 2020 10:36:48 +0200 Subject: [PATCH 25/60] fixes: #15 --- 73_AutoShuttersControl.pm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index 32b97fc..f69cc6c 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -1203,7 +1203,9 @@ sub EventProcessingWindowRec { elsif ( $shutters->getModeDown ne 'absent' && $shutters->getModeDown ne 'off' - && ( !$shutters->getIsDay + && ( ( !$shutters->getIsDay + && $shutters->getModeDown ne 'roommate' + ) || $homemode eq 'asleep' || $homemode eq 'gotosleep' ) && $ascDev->getAutoShuttersControlEvening eq 'on' @@ -9559,7 +9561,7 @@ sub getBlockAscDrivesAfterManual { ], "release_status": "testing", "license": "GPL_2", - "version": "v0.9.19", + "version": "v0.9.20", "author": [ "Marko Oldenburg " ], From 29e35be4981820a099663f04394d9b7f260e6228 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Tue, 2 Jun 2020 11:13:54 +0200 Subject: [PATCH 26/60] fixes: #17 --- 73_AutoShuttersControl.pm | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index f69cc6c..07be0cf 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -1542,6 +1542,12 @@ sub EventProcessingResidents { && $shutters->getSelfDefenseMode ne 'off' || ( $getModeDown eq 'absent' || $getModeDown eq 'always' ) + || ( $shutters->getShadingMode eq 'absent' + && $shutters->getRoommatesStatus eq 'none' + ) + || ( $shutters->getShadingMode eq 'home' + && $shutters->getRoommatesStatus eq 'none' + ) ) { if ( @@ -1561,6 +1567,29 @@ sub EventProcessingResidents { $shutters->setSelfDefenseState(1); $shutters->setDriveCmd( $shutters->getClosedPos ); } + elsif ( $shutters->getIsDay + && $shutters->getIfInShading + && $shutters->getShadingMode eq 'absent' + && $shutters->getRoommatesStatus eq 'none' + ) + { + ShadingProcessingDriveCommand( $hash, $shuttersDev ); + } + elsif ( $shutters->getShadingMode eq 'home' + && $shutters->getIsDay + && $shutters->getIfInShading + && $shutters->getStatus == $shutters->getShadingPos + && $shutters->getRoommatesStatus eq 'none' + && !( + CheckIfShuttersWindowRecOpen($shuttersDev) == 2 + && $shutters->getShuttersPlace eq 'terrace' + ) + && !$shutters->getSelfDefenseState + ) + { + $shutters->setLastDrive('shading out'); + $shutters->setDriveCmd( $shutters->getLastPos ); + } elsif (( $getModeDown eq 'absent' || $getModeDown eq 'always' ) && !$shutters->getIsDay && IsAfterShuttersTimeBlocking($shuttersDev) @@ -1640,8 +1669,7 @@ sub EventProcessingResidents { && !$shutters->getSelfDefenseState ) { - $shutters->setLastDrive('shading in'); - $shutters->setDriveCmd( $shutters->getShadingPos ); + ShadingProcessingDriveCommand( $hash, $shuttersDev ); } elsif ( $shutters->getShadingMode eq 'absent' From a5d1582d5afd79603c1d438f56e4a6096f364d56 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Tue, 2 Jun 2020 14:44:50 +0200 Subject: [PATCH 27/60] add ASC device attribut ASC_slatDriveCmdInverse --- 73_AutoShuttersControl.pm | 173 +++++++++++++++++++++++++------------- 1 file changed, 116 insertions(+), 57 deletions(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index 07be0cf..324594b 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -350,6 +350,7 @@ sub Initialize { . 'ASC_expert:1 ' . 'ASC_blockAscDrivesAfterManual:0,1 ' . 'ASC_debug:1 ' + . 'ASC_slatDriveCmdInverse:0,1 ' . $readingFnAttributes; $hash->{NotifyOrderPrefix} = '51-'; # Order Nummer für NotifyFn $hash->{FW_detailFn} = \&ShuttersInformation; @@ -1203,11 +1204,14 @@ sub EventProcessingWindowRec { elsif ( $shutters->getModeDown ne 'absent' && $shutters->getModeDown ne 'off' - && ( ( !$shutters->getIsDay + && ( + ( + !$shutters->getIsDay && $shutters->getModeDown ne 'roommate' - ) + ) || $homemode eq 'asleep' - || $homemode eq 'gotosleep' ) + || $homemode eq 'gotosleep' + ) && $ascDev->getAutoShuttersControlEvening eq 'on' ) { @@ -1542,12 +1546,10 @@ sub EventProcessingResidents { && $shutters->getSelfDefenseMode ne 'off' || ( $getModeDown eq 'absent' || $getModeDown eq 'always' ) - || ( $shutters->getShadingMode eq 'absent' - && $shutters->getRoommatesStatus eq 'none' - ) - || ( $shutters->getShadingMode eq 'home' - && $shutters->getRoommatesStatus eq 'none' - ) + || ( $shutters->getShadingMode eq 'absent' + && $shutters->getRoommatesStatus eq 'none' ) + || ( $shutters->getShadingMode eq 'home' + && $shutters->getRoommatesStatus eq 'none' ) ) { if ( @@ -1567,24 +1569,24 @@ sub EventProcessingResidents { $shutters->setSelfDefenseState(1); $shutters->setDriveCmd( $shutters->getClosedPos ); } - elsif ( $shutters->getIsDay - && $shutters->getIfInShading - && $shutters->getShadingMode eq 'absent' - && $shutters->getRoommatesStatus eq 'none' - ) + elsif ($shutters->getIsDay + && $shutters->getIfInShading + && $shutters->getShadingMode eq 'absent' + && $shutters->getRoommatesStatus eq 'none' ) { ShadingProcessingDriveCommand( $hash, $shuttersDev ); } - elsif ( $shutters->getShadingMode eq 'home' - && $shutters->getIsDay - && $shutters->getIfInShading - && $shutters->getStatus == $shutters->getShadingPos - && $shutters->getRoommatesStatus eq 'none' - && !( - CheckIfShuttersWindowRecOpen($shuttersDev) == 2 - && $shutters->getShuttersPlace eq 'terrace' - ) - && !$shutters->getSelfDefenseState + elsif ( + $shutters->getShadingMode eq 'home' + && $shutters->getIsDay + && $shutters->getIfInShading + && $shutters->getStatus == $shutters->getShadingPos + && $shutters->getRoommatesStatus eq 'none' + && !( + CheckIfShuttersWindowRecOpen($shuttersDev) == 2 + && $shutters->getShuttersPlace eq 'terrace' + ) + && !$shutters->getSelfDefenseState ) { $shutters->setLastDrive('shading out'); @@ -2288,10 +2290,11 @@ sub EventProcessingShadingBrightness { my $name = $hash->{NAME}; $shutters->setShuttersDev($shuttersDev); my $reading = $shutters->getBrightnessReading; - my $outTemp = - ( $shutters->getOutTemp != -100 + my $outTemp = ( + $shutters->getOutTemp != -100 ? $shutters->getOutTemp - : $ascDev->getOutTemp ); + : $ascDev->getOutTemp + ); Log3( $name, 4, "AutoShuttersControl ($shuttersDev) - EventProcessingShadingBrightness" @@ -4645,32 +4648,62 @@ sub _SetCmdFn { } } - CommandSet( undef, - $shuttersDev - . ':FILTER=' - . $shutters->getPosCmd . '!=' - . $posValue . ' ' - . $driveCommand ); + if ( $ascDev->getSlatDriveCmdInverse ) { + CommandSet( + undef, + ( + $shutters->getSlatDevice ne 'none' + ? $shutters->getSlatDevice + : $shuttersDev + ) + . ' ' + . $shutters->getSlatPosCmd . ' ' + . $slatPos + ) + if ( $slatPos > -1 + && $shutters->getSlatPosCmd ne 'none' ); - InternalTimer( - gettimeofday() + 3, - sub() { - CommandSet( - undef, - ( - $shutters->getSlatDevice ne 'none' - ? $shutters->getSlatDevice - : $shuttersDev - ) - . ' ' - . $shutters->getSlatPosCmd . ' ' - . $slatPos - ); - }, - $shuttersDev - ) - if ( $slatPos > -1 - && $shutters->getSlatPosCmd ne 'none' ); + InternalTimer( + gettimeofday() + 3, + sub() { + CommandSet( undef, + $shuttersDev + . ':FILTER=' + . $shutters->getPosCmd . '!=' + . $posValue . ' ' + . $driveCommand ); + }, + $shuttersDev + ) + if ( $slatPos > -1 + && $shutters->getSlatPosCmd ne 'none' ); + } + else { + CommandSet( undef, + $shuttersDev + . ':FILTER=' + . $shutters->getPosCmd . '!=' + . $posValue . ' ' + . $driveCommand ); + + InternalTimer( + gettimeofday() + 3, + sub() { + CommandSet( + undef, + ( + $shutters->getSlatDevice ne 'none' + ? $shutters->getSlatDevice + : $shuttersDev + ) + . ' ' + . $shutters->getSlatPosCmd . ' ' + . $slatPos + ); + }, + $shuttersDev + ); + } $shutters->setSelfDefenseAbsent( 0, 0 ) if (!$shutters->getSelfDefenseAbsent @@ -8371,6 +8404,14 @@ sub getFreezeTemp { return AttrVal( $name, 'ASC_freezeTemp', 3 ); } +sub getSlatDriveCmdInverse { + my $self = shift; + + my $name = $self->{name}; + + return AttrVal( $name, 'ASC_slatDriveCmdInverse', 0 ); +} + sub _getTempSensor { my $self = shift; @@ -9507,11 +9548,29 @@ sub getBlockAscDrivesAfterManual { - - - - - + + + + + + + + + + + + + + + + + + + + + + + From fd708c2685d44436651fd178b24b1b122a7c09ba Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Tue, 2 Jun 2020 14:47:59 +0200 Subject: [PATCH 28/60] add commandref attribut ASC_slatDriveCmdInverse --- 73_AutoShuttersControl.pm | 1 + 1 file changed, 1 insertion(+) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index 324594b..b268b53 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -9405,6 +9405,7 @@ sub getBlockAscDrivesAfterManual {
  • ASC_twilightDevice - das Device, welches die Informationen zum Sonnenstand liefert. Wird unter anderem für die Beschattung verwendet.
  • ASC_windSensor - DEVICE[:READING] - Sensor für die Windgeschwindigkeit. Kombination aus Device und Reading.
  • +
  • ASC_slatDriveCmdInverse - Vertauscht wie Reihnfolge der Fahrbefehle für Slat und Drive


  • From e5ce1f40e3ce251809e807a76a68a6173ae793ed Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Wed, 3 Jun 2020 10:22:48 +0200 Subject: [PATCH 29/60] add more commandref entry for asc api --- 73_AutoShuttersControl.pm | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index b268b53..83d2248 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -9568,11 +9568,33 @@ sub getBlockAscDrivesAfterManual {
    - + - - - + + + + + + + + + + + + + + + + + + + + + + + + + @@ -9594,8 +9616,6 @@ sub getBlockAscDrivesAfterManual { - - From 578b96a4ff281a6f2a23a09b23eb1338ea8b634a Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Wed, 3 Jun 2020 12:59:04 +0200 Subject: [PATCH 30/60] change package code in mutiple files --- FHEM/73_AutoShuttersControl.pm | 1184 +++++ .../FHEM/Automation/ShuttersControl.pm | 4704 +---------------- lib/FHEM/Automation/ShuttersControl/Dev.pm | 79 + .../Automation/ShuttersControl/Dev/Attr.pm | 388 ++ .../ShuttersControl/Dev/Readings.pm | 242 + .../Automation/ShuttersControl/Roommate.pm | 76 + .../Automation/ShuttersControl/Shutters.pm | 937 ++++ .../ShuttersControl/Shutters/Attr.pm | 1948 +++++++ .../ShuttersControl/Shutters/Readings.pm | 92 + lib/FHEM/Automation/ShuttersControl/Window.pm | 50 + .../Automation/ShuttersControl/Window/Attr.pm | 129 + .../ShuttersControl/Window/Readings.pm | 65 + 12 files changed, 5207 insertions(+), 4687 deletions(-) create mode 100644 FHEM/73_AutoShuttersControl.pm rename 73_AutoShuttersControl.pm => lib/FHEM/Automation/ShuttersControl.pm (51%) create mode 100644 lib/FHEM/Automation/ShuttersControl/Dev.pm create mode 100644 lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm create mode 100644 lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm create mode 100644 lib/FHEM/Automation/ShuttersControl/Roommate.pm create mode 100644 lib/FHEM/Automation/ShuttersControl/Shutters.pm create mode 100644 lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm create mode 100644 lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm create mode 100644 lib/FHEM/Automation/ShuttersControl/Window.pm create mode 100644 lib/FHEM/Automation/ShuttersControl/Window/Attr.pm create mode 100644 lib/FHEM/Automation/ShuttersControl/Window/Readings.pm diff --git a/FHEM/73_AutoShuttersControl.pm b/FHEM/73_AutoShuttersControl.pm new file mode 100644 index 0000000..c8c716f --- /dev/null +++ b/FHEM/73_AutoShuttersControl.pm @@ -0,0 +1,1184 @@ +############################################################################### +# +# Developed with Kate +# +# (c) 2018-2020 Copyright: Marko Oldenburg (leongaultier at gmail dot com) +# All rights reserved +# +# Special thanks goes to: +# - Bernd (Cluni) this module is based on the logic of his script "Rollladensteuerung für HM/ROLLO inkl. Abschattung und Komfortfunktionen in Perl" (https://forum.fhem.de/index.php/topic,73964.0.html) +# - Beta-User for many tests, many suggestions and good discussions +# - pc1246 write english commandref +# - FunkOdyssey commandref style +# - sledge fix many typo in commandref +# - many User that use with modul and report bugs +# - Christoph (christoph.kaiser.in) Patch that expand RegEx for Window Events +# - Julian (Loredo) expand Residents Events for new Residents functions +# - Christoph (Christoph Morrison) for fix Commandref, many suggestions and good discussions +# +# +# This script is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License,or +# any later version. +# +# The GNU General Public License can be found at +# http://www.gnu.org/copyleft/gpl.html. +# A copy is found in the textfile GPL.txt and important notices to the license +# from the author is found in LICENSE.txt distributed with these scripts. +# +# This script is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# +# $Id$ +# +############################################################################### + +### Notizen +# !!!!! - Innerhalb einer Shutterschleife kein CommandAttr verwenden. Bring Fehler!!! Kommen Raumnamen in die Shutterliste !!!!!! +# + +package FHEM::AutoShuttersControl; + +use strict; +use warnings; +use utf8; + +use FHEM::Automation::ShuttersControl; +use FHEM::Meta; +use GPUtils qw(GP_Import GP_Export); + +## Import der FHEM Funktionen +#-- Run before package compilation +BEGIN { + #-- Export to main context with different name + GP_Export( + qw( + Initialize + ) + ); +} + +sub Initialize { + my $hash = shift; + +## Da ich mit package arbeite müssen in die Initialize für die jeweiligen hash Fn Funktionen der Funktionsname + # und davor mit :: getrennt der eigentliche package Name des Modules + $hash->{SetFn} = \&Set; + $hash->{GetFn} = \&Get; + $hash->{DefFn} = \&Define; + $hash->{NotifyFn} = \&Notify; + $hash->{UndefFn} = \&Undef; + $hash->{AttrList} = + 'ASC_tempSensor ' + . 'ASC_brightnessDriveUpDown ' + . 'ASC_autoShuttersControlMorning:on,off ' + . 'ASC_autoShuttersControlEvening:on,off ' + . 'ASC_autoShuttersControlComfort:on,off ' + . 'ASC_residentsDev ' + . 'ASC_rainSensor ' + . 'ASC_autoAstroModeMorning:REAL,CIVIL,NAUTIC,ASTRONOMIC,HORIZON ' + . 'ASC_autoAstroModeMorningHorizon:-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9 ' + . 'ASC_autoAstroModeEvening:REAL,CIVIL,NAUTIC,ASTRONOMIC,HORIZON ' + . 'ASC_autoAstroModeEveningHorizon:-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9 ' + . 'ASC_freezeTemp:-5,-4,-3,-2,-1,0,1,2,3,4,5 ' + . 'ASC_shuttersDriveDelay ' + . 'ASC_twilightDevice ' + . 'ASC_windSensor ' + . 'ASC_expert:1 ' + . 'ASC_blockAscDrivesAfterManual:0,1 ' + . 'ASC_debug:1 ' + . 'ASC_slatDriveCmdInverse:0,1 ' + . $readingFnAttributes; + $hash->{NotifyOrderPrefix} = '51-'; # Order Nummer für NotifyFn + $hash->{FW_detailFn} = \&ShuttersInformation; + $hash->{parseParams} = 1; + + return FHEM::Meta::InitMod( __FILE__, $hash ); +} + + +1; + +=pod +=item device +=item summary Module for controlling shutters depending on various conditions +=item summary_DE Modul zur automatischen Rolladensteuerung auf Basis bestimmter Ereignisse + + +=begin html + + +

    AutoShuttersControl

    +
      +

      + AutoShuttersControl (ASC) provides a complete automation for shutters with comprehensive + configuration options, e.g. open or close shutters depending on the sunrise or sunset, + by outdoor brightness or randomly for simulate presence. +
      + So that ASC can drive the blinds on the basis of the astronomical times, it is very important to + correctly set the location (latitude, longitude) in the device "global". +

      +

      + After telling ASC which shutters should be controlled, several in-depth configuration options + are provided. With these and in combination with a resident presence state, complex scenarios are possible: + For example, shutters could be opened if a resident awakes from sleep and the sun is already rosen. Or if a + closed window with shutters down is tilted, the shutters could be half opened for ventilation. + Many more is possible. +

      + + Define +
        +

        + define <name> AutoShuttersControl +

        + + Usage: +

        +

          + define myASControl AutoShuttersControl
          +
        +

        +

        + This creates an new AutoShuttersControl device, called myASControl.
        + Now was the new global attribute ASC added to the FHEM installation. + Each shutter that is to be controlled by AutoShuttersControl must now have the attribute ASC set to 1 or 2. + The value 1 is to be used with devices whose state is given as position (i.e. ROLLO or Siro, shutters + openend is 0, shutters closed is 100), 2 with devices whose state is given as percent closed (i.e. HomeMatic, + shutters opened is 100, closed is 0). +

        +

        + After setting the attributes to all devices who should be controlled, the automatic scan at the main device + can be started for example with
        + set myASControl scanForShutters +

        +
      +
      + + Readings +
        +

        Within the ASC device:

        +
          +
        • ..._nextAstroTimeEvent - Next astro event: sunrise, sunset or fixed time
        • +
        • ..._PosValue - current position
        • +
        • ..._lastPosValue - shutters last position
        • +
        • ..._lastDelayPosValue - last specified order, will be executed with the next matching + event +
        • +
        • partyMode on|off - is working mode set to part?y
        • +
        • ascEnable on|off - are the associated shutters control by ASC completely?
        • +
        • controlShading on|off - are the associated shutters controlled for shading by ASC? +
        • +
        • hardLockOut on|off - switch for preventing a global hard lock out
        • +
        • room_... - list of every found shutter for every room: room_Sleeping: Patio
        • +
        • selfDefense - state of the self defense mode
        • +
        • state - state of the ASC device: active, enabled, disabled or other state information +
        • +
        • sunriseTimeWeHoliday on|off - state of the weekend and holiday support
        • +
        • userAttrList - ASC sets some user defined attributes (userattr) + for the shutter devices. This readings shows the current state of the given user attributes to the + shutter devices. +
        • +
        + +

        Within the shutter devices:

        +
          +
        • ASC_Enable on|off - shutter is controlled by ASC or not
        • +
        • ASC_Time_DriveUp - if the astro mode is used, the next sunrise is shown. + If the brightness or time mode is used, the value from ASC_Time_Up_Late is shown. +
        • +
        • ASC_Time_DriveDown - if the astro mode is used, the next sunset is shown. + If the brightness or time mode is used, the value from ASC_TASC_Time_Down_Lateime_Up_Late is + shown. +
        • +
        • ASC_ShuttersLastDrive - initiator for the last action
        • +
        +
      +

      + + Set +
        +
      • ascEnable on|off - enable or disable the global control by ASC
      • +
      • controlShading on|off - enable or disable the global shading control by ASC
      • +
      • createNewNotifyDev - re-creates the internal structure for NOTIFYDEV. Is only present if + the + ASC_Expert attribute is set to 1. +
      • +
      • hardLockOut on|off -
      • hardLockOut - on/off - Aktiviert den hardwareseitigen Aussperrschutz für die Rollläden, bei denen das Attributs ASC_LockOut entsprechend auf hard gesetzt ist. Mehr Informationen in der Beschreibung bei den Attributen für die Rollladengeräten.
      • + +
      • partyMode on|off - controls the global party mode for shutters. Every shutters whose + ASC_Partymode attribute is set to on, is not longer controlled by ASC. The last saved + working command send to the device, i.e. by a event, created by a window or presence event, will be executed + once the party mode is disabled. +
      • +
      • renewAllTimer - resets the sunrise and sunset timers for every associated + shutter device and creates new internal FHEM timers. +
      • +
      • renewTimer - resets the sunrise and sunset timers for selected shutter + device and creates new internal FHEM timers. +
      • +
      • scanForShutters - scans the whole FHEM installation for (new) devices whose ASC + attribute is set (to 1 or 2, see above). +
      • +
      • selfDefense on|off - controls the self defense function. This function listens for + example on a residents device. If this device is set to absent and a window is still open, ASC will close + the shutter for a rudimentary burglary protection. +
      • +
      • shutterASCenableToggle on|off - controls if the ASC controls are shown at a associated + shutter device. +
      • +
      • sunriseTimeWeHoliday on|off - controls the weekend and holiday support. If enabled, the + ASC_Time_Up_WE_Holiday attribute is considered. +
      • +
      • wiggle - wiggles a device for a given value (default 5%, controlled by + ASC_WiggleValue) up or down and back after a minute. Useful as a deterrence in combination with + alarm system. +
      • +
      +

      + + Get +
        +
      • showNotifyDevsInformations - shows the generated NOTIFYDEV structure. Useful for + debugging and only shown if the ASC_expert attribute is set to 1. +
      • +
      +

      + + Attributes +
        +

        At the global ASC device:

        + +
          + +
        • ASC_autoAstroModeEvening - REAL, CIVIL, NAUTIC, ASTRONOMIC or HORIZON
        • + +
        • ASC_autoAstroModeEveningHorizon - Height above the horizon. Is only considered + if the ASC_autoAstroModeEvening attribute is set to HORIZON. Defaults to 0. +
        • + +
        • ASC_autoAstroModeMorning - REAL, CIVIL, NAUTIC, ASTRONOMIC or HORIZON
        • + +
        • ASC_autoAstroModeMorningHorizon - Height above the horizon. Is only considered + if the ASC_autoAstroModeMorning attribute is set to HORIZON. Defaults to 0. +
        • + +
        • ASC_autoShuttersControlComfort - on|off - + Controls the comfort functions: If a three state sensor, like the HmIP-SRH window handle + sensor, is installed, ASC will open the window if the sensor signals open position. The + ASC_ComfortOpen_Pos attribute has to be set for the shutter to on, defaults to off. +
        • + +
        • ASC_autoShuttersControlEvening - on|off - Enables the automatic control by ASC + at the evenings. +
        • + +
        • ASC_autoShuttersControlMorning - on|off - Enables the automatic control by ASC + at the mornings. +
        • + +
        • ASC_blockAscDrivesAfterManual 0|1 - If set to 1, ASC will not + automatically control a shutter if there was an manual control to the shutter. To be considered, the + ASC_ShuttersLastDrive reading has to contain the value manual and the shutter is in + an unknown (i.e. not otherwise configured in ASC) position. +
        • + +
        • ASC_brightnessDriveUpDown - VALUE-MORNING:VALUE-EVENING - Drive the shutters by + brightness. VALUE-MORNING sets the brightness threshold for the morning. If the value is + reached in the morning, the shutter will go up. Vice versa in the evening. This is a global setting + and can be overwritte per device with the ASC_BrightnessSensor attribute (see below). +
        • + +
        • ASC_debug - + Extendend logging for debugging purposes +
        • + +
        • ASC_expert - Switches the export mode on. Currently, if set to 1, get + and set will contain additional functions regarding the NOTIFYDEFs. +
        • + +
        • ASC_freezeTemp - Temperature threshold for the freeze protection. The freeze protection + prevents the shutter to be operated by ASC. Last operating order will be kept. +
        • + +
        • ASC_rainSensor DEVICENAME[:READINGNAME] MAXTRIGGER[:HYSTERESE] [CLOSEDPOS] - Contains + settings for the rain protection. DEVICNAME specifies a rain sensor, the optional + READINGNAME the name of the reading at the DEVICENAME. The READINGNAME + should contain the values rain and dry or a numeral rain amount. MAXTRIGGER + sets the threshold for the amount of rain for when the shutter is driven to CLOSEDPOS as soon + the threshold is reached. HYSTERESE sets a hysteresis for MAXTRIGGER. +
        • + +
        • ASC_residentsDev DEVICENAME[:READINGNAME] - DEVICENAME points to a device + for presence, e.g. of type RESIDENTS. READINGNAME points to a reading at + DEVICENAME which contains a presence state, e.g. rgr_Residents:state. The target + should contain values alike the RESIDENTS family. +
        • + +
        • ASC_shuttersDriveDelay - Maximum random drive delay in seconds for calculating + the operating time. 0 equals to no delay. +
        • + +
        • ASC_tempSensor DEVICENAME[:READINGNAME] - DEVICENAME points to a device + with a temperature, READINGNAME to a reading located at the DEVICENAME, for example + OUTDOOR_TEMP:measured-temp. READINGNAME defaults to temperature. +
        • + +
        • ASC_twilightDevice - points to a DEVICENAME containing values regarding + the sun position. Supports currently devices of type Twilight or Astro. +
        • + +
        • ASC_windSensor DEVICENAME[:READINGNAME] - DEVICENAME points to a device + containing a wind speed. Reads from the wind reading, if not otherwise specified by + READINGNAME. +
        • +
        +
        +

        At shutter devices, controlled by ASC:

        +
          +
        • ASC - 0|1|2 +
            +
          • 0 - don't create attributes for ASC at the first scan and don't be controlled + by ASC
          • +
          • 1 - inverse or venetian type blind mode. Shutter is open equals to 0, shutter is closed equals + to 100, is controlled by position values.
          • +
          • 2 - HomeMatic mode. Shutter is open equals to 100, shutter is closed equals to 0, is + controlled by pct values.
          • +
          +
        • +
        • ASC_Antifreeze - soft|am|pm|hard|off - Freeze protection. +
            +
          • soft - see ASC_Antifreeze_Pos.
          • +
          • hard / am / pm - freeze protection will be active (everytime, + ante meridiem or post meridiem).
          • +
          • off - freeze protection is disabled, default value
          • +
          +
        • +
        • ASC_Antifreeze_Pos - Position to be operated if the shutter should be closed, + but ASC_Antifreeze is not set to off. (Default: dependent on attributASC 85/15). +
        • +
        • ASC_AutoAstroModeEvening - Can be set to REAL, CIVIL, + NAUTIC, ASTRONOMIC or HORIZON. Defaults to none of those.
        • +
        • ASC_AutoAstroModeEveningHorizon - If this value is reached by the sun, a sunset is + presumed. Is used if ASC_autoAstroModeEvening is set to HORIZON. Defaults to none. +
        • +
        • ASC_AutoAstroModeMorning - Can be set to REAL, CIVIL, + NAUTIC, ASTRONOMIC or HORIZON. Defaults to none of those.
        • +
        • ASC_AutoAstroModeMorningHorizon - If this value is reached by the sun, a sunrise is + presumed. Is used if ASC_AutoAstroModeMorning is set to HORIZON. Defaults to none. +
        • +
        • ASC_Shutter_IdleDetection - indicates the Reading which gives information about the running status of the roller blind, as well as secondly the value in the Reading which says that the roller blind does not run. +
        • +
        • ASC_BlockingTime_afterManual - Time in which operations by ASC are blocked + after the last manual operation in seconds. Defaults to 1200 (20 minutes). +
        • +
        • ASC_BlockingTime_beforDayOpen - Time in which no closing operation is made by + ASC after opening at the morning in seconds. Defaults to 3600 (one hour). +
        • +
        • ASC_BlockingTime_beforNightClose - Time in which no closing operation is made by + ASC before closing at the evening in seconds. Defaults to 3600 (one hour). +
        • +
        • ASC_BrightnessSensor - DEVICE[:READING] MORNING-VALUE:EVENING-VALUE - + Drive this shutter by brightness. MORNING-VALUE sets the brightness threshold for the morning. + If the value is reached in the morning, the shutter will go up. Vice versa in the evening, specified by + EVENING-VALUE. Gets the brightness from DEVICE, reads by default from the + brightness reading, unless READING is specified. Defaults to none. +
        • +
        • ASC_Closed_Pos - The closed position value from 0 to 100 percent in increments of 10. + (Default: dependent on attributASC 100/0). +
        • +
        • ASC_ComfortOpen_Pos - The comfort opening position, ranging + from 0 to 100 percent in increments of 10. (Default: dependent on attributASC 20/80). +
        • +
        • ASC_Down - astro|time|brightness|roommate - Drive the shutter depending on this setting: +
            +
          • astro - drive down at sunset
          • +
          • time - drive at ASC_Time_Down_Early
          • +
          • brightness - drive between ASC_Time_Down_Early and ASC_Time_Down_Late, + depending on the settings of ASC_BrightnessSensor (see above).
          • +
          • roommate - no drive by time or brightness, roommate trigger only
          • +
          + Defaults to astro. +
        • +
        • ASC_DriveUpMaxDuration - Drive up duration of the shutter plus 5 seconds. Defaults + to 60 seconds if not set. +
        • +
        • ASC_LockOut soft|hard|off - Configures the lock out protection for the current + shutter. Values are: +
            +
          • soft - works if the global lock out protection lockOut soft is set and a sensor + specified by ASC_WindowRec is set. If the sensor is set to open, the shutter will not + be closed. Affects only commands issued by ASC. +
          • +
          • + hard - see soft, but ASC tries also to block manual issued commands by a switch. +
          • +
          • + off - lock out protection is disabled. Default. +
          • +
          +
        • +
        • ASC_LockOut_Cmd inhibit|blocked|protection - Configures the lock out command for + ASC_LockOut if hard is chosen as a value. Defaults to none. +
        • +
        • ASC_Mode_Down always|home|absent|off - When will a shutter be driven down: +
            +
          • always - ASC will drive always. Default value.
          • +
          • off - don't drive
          • +
          • home / absent - considers a residents status set by ASC_residentsDev. If no + resident is configured and this attribute is set to absent, ASC will not + operate the shutter.
          • +
          +
        • +
        • ASC_Mode_Up always|home|absent|off - When will a shutter be driven up: +
            +
          • always - ASC will drive always. Default value.
          • +
          • off - don't drive
          • +
          • home / absent - considers a residents status set by ASC_residentsDev. If no + resident is configured and this attribute is set to absent, ASC will not + operate the shutter.
          • +
          +
        • +
        • ASC_Open_Pos - The opening position value from 0 to 100 percent in increments of 10. + (Default: dependent on attributASC 0/100). +
        • +
        • ASC_Sleep_Pos - The opening position value from 0 to 100 percent in increments of 10. + (Default: dependent on attributASC 75/25). +
        • +
        • ASC_Partymode on|off - Party mode. If configured to on, driving orders for the + shutter by ASC will be queued if partyMode is set to on at the + global ASC device. Will execute the driving orders after partyMode is disabled. + Defaults to off. +
        • +
        • ASC_Pos_Reading - Points to the reading name, which contains the current + position for the shutter in percent. Will be used for set at devices of unknown kind. +
        • +
        • ASC_PrivacyDownValue_beforeNightClose - How many seconds is the privacy mode activated + before the shutter is closed in the evening. For Brightness, in addition to the time value, + the Brightness value must also be specified. 1800:300 means 30 min before night close or above a brightness + value of 300. -1 is the default + value. +
        • +
        • ASC_PrivacyDown_Pos - + Position in percent for privacy mode, defaults to 50. +
        • +
        • ASC_PrivacyUpValue_beforeDayOpen - How many seconds is the privacy mode activated + before the shutter is open in the morning. For Brightness, in addition to the time value, + the Brightness value must also be specified. 1800:600 means 30 min before day open or above a brightness + value of 600. -1 is the default + value. +
        • +
        • ASC_PrivacyUp_Pos - + Position in percent for privacy mode, defaults to 50. +
        • +
        • ASC_WindProtection on|off - Shutter is protected by the wind protection. Defaults + to off. +
        • +
        • ASC_RainProtection on|off - Shutter is protected by the rain protection. Defaults + to off. +
        • +
        • ASC_Roommate_Device - Comma separated list of ROOMMATE devices, representing + the inhabitants of the room to which the shutter belongs. Especially useful for bedrooms. Defaults + to none. +
        • +
        • ASC_Roommate_Reading - Specifies a reading name to ASC_Roommate_Device. + Defaults to state. +
        • +
        • ASC_Self_Defense_Mode - absent/gone/off - which Residents status Self Defense should become + active without the window being open. (default: gone) off exclude from self defense +
        • +
        • ASC_Self_Defense_AbsentDelay - um wie viele Sekunden soll das fahren in Selfdefense bei + Residents absent verzögert werden. (default: 300) +
        • +
        • ASC_ShuttersPlace window|terrace - If set to terrace, and the + residents device is set to gone, and selfDefense is activated, the shutter will + be closed. If set to window, will not. Defaults to window. +
        • +
        • ASC_Time_Down_Early - Will not drive before time is ASC_Time_Down_Early + or later, even the sunset occurs earlier. To be set in military time. Defaults to 16:00. +
        • +
        • ASC_Time_Down_Late - Will not drive after time is ASC_Time_Down_Late + or earlier, even the sunset occurs later. To be set in military time. Defaults to 22:00. +
        • +
        • ASC_Time_Up_Early - Will not drive before time is ASC_Time_Up_Early + or earlier, even the sunrise occurs earlier. To be set in military time. Defaults to 05:00. +
        • +
        • ASC_Time_Up_Late - Will not drive after time is ASC_Time_Up_Late + or earlier, even the sunrise occurs later. To be set in military time. Defaults to 08:30. +
        • +
        • ASC_Time_Up_WE_Holiday - Will not drive before time is ASC_Time_Up_WE_Holiday + on weekends and holidays (holiday2we is considered). Defaults to 08:00. Warning! + If ASC_Up set to brightness, the time for ASC_Time_Up_WE_Holiday + must be earlier then ASC_Time_Up_Late. +
        • +
        • ASC_Up astro|time|brightness|roommate - Drive the shutter depending on this setting: +
            +
          • astro - drive up at sunrise
          • +
          • time - drive at ASC_Time_Up_Early
          • +
          • brightness - drive between ASC_Time_Up_Early and ASC_Time_Up_Late, + depending on the settings of ASC_BrightnessSensor (see above).
          • +
          • roommate - no drive by time or brightness, roommate trigger only
          • +
          + Defaults to astro. +
        • +
        • ASC_Ventilate_Pos - The opening position value for ventilation + from 0 to 100 percent in increments of 10. (Default: dependent on attributASC 70/30). +
        • +
        • ASC_Ventilate_Window_Open on|off - Drive to ventilation position as window is opened + or tilted, even when the current shutter position is lower than the ASC_Ventilate_Pos. + Defaults to on. +
        • +
        • ASC_WiggleValue - How many percent should the shutter be driven if a wiggle drive + is operated. Defaults to 5. +
        • +
        • ASC_WindParameters THRESHOLD-ON[:THRESHOLD-OFF] [DRIVEPOSITION] - + Threshold for when the shutter is driven to the wind protection position. Optional + THRESHOLD-OFF sets the complementary value when the wind protection is disabled. Disabled + if THRESHOLD-ON is set to -1. Defaults to 50:20 ASC_Closed_Pos. +
        • +
        • ASC_WindowRec - WINDOWREC:[READING], Points to the window contact device, associated with the shutter. + Defaults to none. Reading is optional +
        • +
        • ASC_WindowRec_subType - Model type of the used ASC_WindowRec: +
            +
          • twostate - optical or magnetical sensors with two states: opened or closed
          • +
          • threestate - sensors with three states: opened, tilted, closed
          • +
          + Defaults to twostate. +
        • +
        • ASC_WindowRec_PosAfterDayClosed - open,lastManual / auf welche Position soll das Rollo nach dem schließen am Tag fahren. Open Position oder letzte gespeicherte manuelle Position (default: open)
        • +
          +

          + Shading +

          +

          + Shading is only available if the following prerequests are met: +

            +
          • + The controlShading reading is set to on, and there is a device + of type Astro or Twilight configured to ASC_twilightDevice, and ASC_tempSensor + is set. +
          • +
          • + ASC_BrightnessSensor is configured to any shutter device. +
          • +
          • + All other attributes are optional and the default value for them is used, if they are not + otherwise configured. Please review the settings carefully, especially the values for + StateChange_Cloudy and StateChange_Sunny. +
          • +
          +

          +

          + The following attributes are available: +

          +
            +
          • ASC_Shading_InOutAzimuth - Azimuth value from which shading is to be used when shading is exceeded and shading when undershooting is required. + Defaults to 95:265. +
          • +
          • ASC_Shading_MinMax_Elevation - Shading starts as min point of sun elevation is + reached and end as max point of sun elevation is reached, depending also on other sensor values. Defaults to 25.0:100.0. +
          • +
          • ASC_Shading_Min_OutsideTemperature - Shading starts at this outdoor temperature, + depending also on other sensor values. Defaults to 18.0. +
          • +
          • ASC_Shading_Mode absent|always|off|home - see ASC_Mode_Down above, + but for shading. Defaults to off. +
          • +
          • ASC_Shading_Pos - Shading position in percent. (Default: dependent on attributASC 85/15)
          • +
          • ASC_Shading_StateChange_Cloudy - Shading ends at this + outdoor brightness, depending also on other sensor values. Defaults to 20000. +
          • +
          • ASC_Shading_StateChange_SunnyCloudy - Shading starts/stops at this + outdoor brightness, depending also on other sensor values. An optional parameter specifies how many successive brightness reading values should be used to average the brightness value. Defaults to 35000:20000 [3]. +
          • +
          • ASC_Shading_WaitingPeriod - Waiting time in seconds before additional sensor values + to ASC_Shading_StateChange_Sunny or ASC_Shading_StateChange_Cloudy + are used for shading. Defaults to 120. +
          • +
          +
          +
        +
      +

      + AutoShuttersControl API description +

      +

      + It's possible to access internal data of the ASC module by calling the API function. +

      + Data points of a shutter device, controlled by ASC +

      +

      { ascAPIget('Getter','SHUTTERS_DEVICENAME') }
      +

      +
    GetterErläuterung
    FreezeStatus1=soft, 2=Daytime, 3=hard
    AntiFreezePoskonfigurierte Position beim AntiFreeze Status
    AntiFreezePosAssignmentkonfigurierte Lamellen Position bei der AntiFreeze Position
    AntiFreezeaktuelle Konfiguration für AntiFreeze
    ShuttersPlaceaktuelle Konfiguration an welchem Platz sich das Rollo befindet, Fenster oder Terrasse
    SlatPosCmdwelcher PosCmd ist aktuell für den Lamellen Befehl konfiguriert
    SlatDevicewelches Device aktuell für die Lamellen Steuerung konfiguriert ist
    PrivacyUpTimePrivacy Zeit in Sekunden zum fahren in die Privacy Pos vor dem vollen öffnen
    PrivacyUpBrightnessValPrivacy Brightness Wert zum fahren in die Privacy Pos
    PrivacyUpPosPosition für die Privacy Up Fahrt
    PrivacyUpPositionAssignmentPosition für die Lamellenfahrt von Privacy Up
    PrivacyDownTimePrivacy Zeit in Sekunden zum fahren in die Privacy Pos vor dem vollen schließ
    PrivacyDownBrightnessValPrivacy Brightness Wert zum fahren in die Privacy Pos
    PrivacyDownPosPosition für die Privacy Down Fahrt
    PrivacyDownPositionAssignmentPosition für die Lamellenfahrt von Privacy Down
    SelfDefenseModeModus für den SelfDefense
    SelfDefenseAbsentDelayVerzögerungszeit der SelfDefense Fahrt bei absent
    WiggleValueum welchen Wert soll das Rollo bei einer wiggle Fahrt fahren
    AdvIst es in der definierten Weihnachtszeit
    ShadingPoskonfigurierte Position für die Beschattungsfahrt
    ShadingPositionAssignmentPosition für die Lamellenfahrt für die Beschattungsfahrt
    ShadingModewelcher aktuelle Modus für das Beschatten ist konfiguriert
    IdleDetectionValuewelcher Wert im IdleDetectionRading zeigt an dass das Rollo aktuell nicht in Bewegung ist
    ShadingAzimuthLeftab welchem Azimut beginnt die Beschattung
    ShadingAzimuthRightab welchem Azimut endet die Beschattung
    ShadingMinOutsideTemperatureüber welchem Temperaturwert beginnt die Beschattung
    ShadingMinElevationüber welchem Elevationwert beginnt die Beschattung
    ShadingMaxElevationüber welchem Elevationwert endet die Beschattung
    ShadingStateChangeSunnyüber welchem Brightnesswert beginnt die Beschattung
    ShadingStateChangeCloudyunter welchem Brightnesswert endet die Beschattung
    ShadingWaitingPeriodnach welcher Wartezeit werden Beschattungsrelevante Sensorwerte wieder beachtet und die Beschattungsroutine abgearbeitet
    ExternalTriggerDevicekonfiguriertes Triggerdevice
    ExternalTriggerReadingkofiguriertes Triggerdevice Reading
    ExternalTriggerValueActiveWert mit welchen der externe Trigger Prozess ausgel&uoml;st werden soll.
    ExternalTriggerValueActive2weiterer Wert mit welchen der externe zweite Trigger Prozess ausgel&uoml;st werden soll.
    ExternalTriggerValueInactiveWert mit welchen der externe Trigger Prozess beendet werden soll
    ExternalTriggerPosActiveRolloposition welche angefahren werden soll wenn der erste externe Trigger aktiv wird.
    ExternalTriggerPosActive2Rolloposition welche angefahren werden soll wenn der zweite externe Trigger aktiv wird.
    ExternalTriggerPosInactiveRolloposition welche angefahren werden soll wenn der externe Trigger inaktiv wird.
    ExternalTriggerStateaktueller Status des externen Triggers, 0 oder 1
    Delaykonfigurierte Verzögerungswert welcher für die Zufallsberechnung werwendet werden soll
    DelayStartkonfigurierter fester Verzögerungswert
    BlockingTimeAfterManualkonfigurierte Blockzeit nach einer manuellen Fahrt
    BlockingTimeBeforNightClosekonfigurierte Blockzeit vor dem nächtlichen schließen
    BlockingTimeBeforDayOpenkonfigurierte Blockzeit vor dem morgendlichen öffnen
    PosCmd
    OpenPos
    OpenPositionAssignment
    VentilatePos
    VentilatePositionAssignment
    VentilatePosAfterDayClosed
    ClosedPos
    NoDelayWurde die Behandlung von Offset deaktiviert (Beispiel bei Fahrten über Fensterevents)
    LastDriveGrund des letzten Fahrens
    LastPosdie letzte Position des Rollladens
    BlockingTimeAfterManualkonfigurierte Blockzeit nach einer manuellen Fahrt
    BlockingTimeBeforNightClosekonfigurierte Blockzeit vor dem nächtlichen schließen
    BlockingTimeBeforDayOpenkonfigurierte Blockzeit vor dem morgendlichen öffnen
    PosCmd
    OpenPos
    OpenPositionAssignment
    PosCmdwelches Kommando wird zum fahren der Rollos verwendet (pct, position?)
    OpenPosPosition für Rollo ganz auf
    OpenPositionAssignmentSlat-Position für Rollo ganz auf
    VentilatePos
    VentilatePositionAssignment
    VentilatePosAfterDayClosed
    ClosedPos
    ClosedPositionAssignment
    PosCmdwelches Kommando wird zum fahren der Rollos verwendet (pct, position?)
    OpenPosPosition für Rollo ganz auf
    OpenPositionAssignmentSlat-Position für Rollo ganz auf
    VentilatePos
    VentilatePositionAssignment
    VentilatePosAfterDayClosed
    ClosedPos
    ClosedPositionAssignment
    VentilatePosLüften Position
    VentilatePositionAssignmentLüften Slat-Position
    VentilatePosAfterDayClosedPosition des Rollos beim schließen des Fensters am Tag
    ClosedPosPosition für Rollo ganz geschlossen
    ClosedPositionAssignmentSlat-Position für Rollo ganz geschlossen
    SleepPosPosition für schlafen
    SleepPositionAssignmentSlat-Position für schlafen
    VentilateOpenLüften aktiv?
    ComfortOpenPosComfort Position
    ComfortOpenPositionAssignmentSlat-Comfort Position
    PartyModeAbfrage Party Mode
    RoommatesAbfrage Roommates / Antwort als String
    RoommatesReadingRoommates Reading
    RoommatesStatusRoommates Status unter Berücksichtigung aller Roommates und dessen Status
    RoommatesLastStatusRoommates letzter Status unter Berücksichtigung aller Roommates und dessen letzten Status
    WindPosRollo Position bei Windtrigger
    WindMaxWert über dem die Windprotection aktiviert werden soll
    WindMinWert unter dem die Windprotection aufgehoben werden soll
    WindProtectionWindprotection soll aktiv sein oder nicht
    WindProtectionStatusaktueller Status der WindProtection
    RainProtectionRain Protection soll aktiv sein oder nicht
    RainProtectionStatusaktueller Staus der Rain Protection
    WindMaxWert über dem die Windprotection aktiviert werden soll
    WindMinWert unter dem die Windprotection aufgehoben werden soll
    WindProtectionWindprotection soll aktiv sein oder nicht
    WindProtectionStatusaktueller Status der WindProtection
    WindProtectionStatusaktueller Status der Wind Protection „protected“ oder „unprotected“
    RainProtectionRain Protection soll aktiv sein oder nicht
    RainProtectionStatusaktueller Staus der Rain Protection
    RainProtectionStatusaktueller Status der Regen Protection „unprotected“ oder „unprotected“
    ModeUp
    ModeDown
    LockOut
    LockOutCmd
    AutoAstroModeMorning
    AutoAstroModeEvening
    AutoAstroModeMorningHorizon
    AutoAstroModeEveningHorizon
    Up
    Down
    TimeUpEarly
    TimeUpLate
    TimeDownEarly
    TimeDownLate
    TimeUpWeHoliday
    ShadingStatusAusgabe des aktuellen Shading Status, „in“, „out“, „in reserved“, „out reserved“
    ShadingStatusTimestampTimestamp des letzten Beschattungsstatus
    IfInShadingBefindet sich der Rollladen, in Abhängigkeit des Shading Mode, in der Beschattung
    WindProtectionStatusaktueller Status der Wind Protection „protected“ oder „unprotected“
    RainProtectionStatusaktueller Status der Regen Protection „unprotected“ oder „unprotected“
    DelayCmdletzter Fahrbefehl welcher in die Warteschlange kam. Grund z.B. Partymodus.
    StatusPosition des Rollladens
    ASCenableAbfrage ob für den Rollladen die ASC Steuerung aktiv ist.
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    GetterDescription
    FreezeStatus1 = soft, 2 = daytime, 3 = hard
    NoDelayWas the offset handling deactivated (e.g. by operations triggered by a window event)
    LastDriveReason for the last action caused by ASC
    LastPosLast position of the shutter
    LastPosTimestampTimestamp of the last position
    LastManPosLast position manually set of the shutter
    LastManPosTimestampTimestamp of the last position manually set
    SunsetUnixTimeCalculated sunset time in seconds since the UNIX epoche
    Sunset1 = operation in the evening was made, 0 = operation in the evening was not yet made
    SunriseUnixTimeCalculated sunrise time in seconds since the UNIX epoche
    Sunrise1 = operation in the morning was made, 0 = operation in the morning was not yet made
    RoommatesStatusCurrent state of the room mate set for this shutter
    RoommatesLastStatusLast state of the room mate set for this shutter
    ShadingStatusValue of the current shading state. Can hold in, out, in reserved or + out reserved
    ShadingStatusTimestampTimestamp of the last shading state
    IfInShadingIs the shutter currently in shading (depends on the shading mode)
    WindProtectionStatusCurrent state of the wind protection. Can hold protection or unprotection
    RainProtectionStatusCurrent state of the rain protection. Can hold protection or unprotection
    DelayCmdLast operation order in the waiting queue. Set for example by the party mode
    StatusPosition of the shutter
    ASCenableDoes ASC control the shutter?
    PrivacyDownStatusIs the shutter currently in privacyDown mode
    outTempCurrent temperature of a configured temperature device, return -100 is no device configured
    +

    + Übersicht für das Rollladen-Device mit Parameterübergabe +
      + { ascAPIget('Getter','ROLLODEVICENAME',VALUE) }
      +
    + + + + + + + +
    GetterErläuterung
    QueryShuttersPosRückgabewert 1 bedeutet das die aktuelle Position des Rollos unterhalb der Valueposition ist. 0 oder nichts bedeutet oberhalb der Valueposition.
    +

    + Data points of the ASC device +

    + { ascAPIget('Getter') }
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    GetterDescription
    OutTempCurrent temperature of a configured temperature device, return -100 is no device configured
    ResidentsStatusCurrent state of a configured resident device
    ResidentsLastStatusLast state of a configured resident device
    AzimuthCurrent azimuth of the sun
    ElevationCurrent elevation of the sun
    ASCenableIs ASC globally activated?
    + + +=end html + +=begin html_DE + + +

    AutoShuttersControl

    +
      +

      AutoShuttersControl (ASC) ermöglicht eine vollständige Automatisierung der vorhandenen Rollläden. Das Modul bietet umfangreiche Konfigurationsmöglichkeiten, um Rollläden bspw. nach Sonnenauf- und untergangszeiten, nach Helligkeitswerten oder rein zeitgesteuert zu steuern. +
      Damit ASC auf Basis der astronomischen Zeiten die Rollos fahren kann, ist es ganz wichtig im Device "global" die Location (Latitude,Longitude) korrekt zu setzen. +

      +

      + Man kann festlegen, welche Rollläden von ASC in die Automatisierung mit aufgenommen werden sollen. Daraufhin stehen diverse Attribute zur Feinkonfiguration zur Verfügung. So sind unter anderem komplexe Lösungen wie Fahrten in Abhängigkeit des Bewohnerstatus einfach umsetzbar. Beispiel: Hochfahren von Rollläden, wenn der Bewohner erwacht ist und draußen bereits die Sonne aufgegangen ist. Weiterhin ist es möglich, dass der geschlossene Rollladen z.B. nach dem Ankippen eines Fensters in eine Lüftungsposition fährt. Und vieles mehr. +

      + + Define +
        + define <name> AutoShuttersControl +

        + Beispiel: +
          +
          + define myASControl AutoShuttersControl
          +
        +
        + Der Befehl erstellt ein AutoShuttersControl Device mit Namen myASControl.
        + Nachdem das Device angelegt wurde, muss in allen Rollläden Devices, welche gesteuert werden sollen, das Attribut ASC mit Wert 1 oder 2 gesetzt werden. + Dabei bedeutet 1 = "Prozent geschlossen" (z.B. ROLLO oder Siro Modul) - Rollo Oben 0, Rollo Unten 100, 2 = "Prozent geöffnet" (z.B. Homematic) - Rollo Oben 100, Rollo Unten 0. + Die Voreinstellung für den Befehl zum prozentualen Fahren ist in beiden Fällen unterschiedlich. 1="position" und 2="pct". Dies kann, soweit erforderlich, zu späterer Zeit noch angepasst werden. + Habt Ihr das Attribut gesetzt, könnt Ihr den automatischen Scan nach den Devices anstoßen. +
      +
      + + Readings +
        + Im ASC-Device +
          +
        • ..._nextAstroTimeEvent - Uhrzeit des nächsten Astro-Events: Sonnenauf- oder Sonnenuntergang oder feste Zeit
        • +
        • ..._PosValue - aktuelle Position des Rollladens
        • +
        • ..._lastPosValue - letzte Position des Rollladens
        • +
        • ..._lastDelayPosValue - letzter abgesetzter Fahrbefehl, welcher beim nächsten zulässigen Event ausgeführt wird.
        • +
        • partyMode - on/off - Partymodus-Status
        • +
        • ascEnable - on/off - globale ASC Steuerung bei den Rollläden aktiv oder inaktiv
        • +
        • controlShading - on/off - globale Beschattungsfunktion aktiv oder inaktiv
        • +
        • hardLockOut - on/off - Status des hardwareseitigen Aussperrschutzes / gilt nur für Rolläden mit dem Attribut bei denen das Attributs ASC_LockOut entsprechend auf hard gesetzt ist
        • +
        • room_... - Auflistung aller Rollläden, die in den jeweiligen Rämen gefunden wurde. Beispiel: room_Schlafzimmer: Terrasse
        • +
        • selfDefense - Selbstschutz-Status
        • +
        • state - Status des ASC-Devices: active, enabled, disabled oder weitere Statusinformationen
        • +
        • sunriseTimeWeHoliday - on/off - Status der Wochenendunterstützung
        • +
        • userAttrList - Das ASC-Modul verteilt an die gesteuerten Rollladen-Geräte diverse Benutzerattribute (userattr). In diesem Reading kann der Status dieser Verteilung geprüft werden.
        • +

        + In den Rollläden-Geräten +
          +
        • ASC_Enable - on/off - wird der Rollladen über ASC gesteuert oder nicht
        • +
        • ASC_Time_DriveUp - Im Astro-Modus ist hier die Sonnenaufgangszeit für das Rollo gespeichert. Im Brightnessmodus ist hier der Zeitpunkt aus dem Attribut ASC_Time_Up_Late gespeichert. Im Timemodus ist hier der Zeitpunkt aus dem Attribut ASC_Time_Up_Early gespeichert.
        • +
        • ASC_Time_DriveDown - Im Astro-Modus ist hier die Sonnenuntergangszeit für das Rollo gespeichert. Im Brightnessmodus ist hier der Zeitpunkt aus dem Attribut ASC_Time_Down_Late gespeichert. Im Timemodus ist hier der Zeitpunkt aus dem Attribut ASC_Time_Down_Early gespeichert.
        • +
        • ASC_ShuttersLastDrive - Grund der letzten Fahrt vom Rollladen
        • +
        • ASC_ShadingMessage -
        • +
        • ASC_Time_PrivacyDriveDown -
        • +
        • ASC_Time_PrivacyDriveUp -
        • +
        +
      +

      + + Set +
        +
      • advDriveDown - holt bei allen Rollläden durch ASC_Adv on ausgesetzte Fahrten nach.
      • +
      • ascEnable - on/off - Aktivieren oder deaktivieren der globalen ASC Steuerung
      • +
      • controlShading - on/off - Aktiviert oder deaktiviert die globale Beschattungssteuerung
      • +
      • createNewNotifyDev - Legt die interne Struktur für NOTIFYDEV neu an. Diese Funktion steht nur zur Verfügung, wenn Attribut ASC_expert auf 1 gesetzt ist.
      • +
      • hardLockOut - on/off - Aktiviert den hardwareseitigen Aussperrschutz für die Rollläden, bei denen das Attributs ASC_LockOut entsprechend auf hard gesetzt ist. Mehr Informationen in der Beschreibung bei den Attributen für die Rollladengeräten.
      • +
      • partyMode - on/off - Aktiviert den globalen Partymodus. Alle Rollladen-Geräten, in welchen das Attribut ASC_Partymode auf on gesetzt ist, werden durch ASC nicht mehr gesteuert. Der letzte Schaltbefehl, der bspw. durch ein Fensterevent oder Wechsel des Bewohnerstatus an die Rollläden gesendet wurde, wird beim Deaktivieren des Partymodus ausgeführt
      • +
      • renewTimer - erneuert beim ausgewählten Rollladen die Zeiten für Sonnenauf- und -untergang und setzt die internen Timer neu.
      • +
      • renewAllTimer - erneuert bei allen Rollläden die Zeiten für Sonnenauf- und -untergang und setzt die internen Timer neu.
      • +
      • scanForShutters - Durchsucht das System nach GerätenRo mit dem Attribut ASC = 1 oder ASC = 2
      • +
      • selfDefense - on/off - Aktiviert bzw. deaktiviert die Selbstschutzfunktion. Beispiel: Wenn das Residents-Gerät absent meldet, die Selbstschutzfunktion aktiviert wurde und ein Fenster im Haus noch geöffnet ist, so wird an diesem Fenster der Rollladen deaktivieren dann heruntergefahren.
      • +
      • shutterASCenableToggle - on/off - Aktivieren oder deaktivieren der ASC Kontrolle beim einzelnen Rollladens
      • +
      • sunriseTimeWeHoliday - on/off - Aktiviert die Wochenendunterstützung und somit, ob im Rollladengerät das Attribut ASC_Time_Up_WE_Holiday beachtet werden soll oder nicht.
      • +
      • wiggle - bewegt einen oder mehrere Rollläden um einen definierten Wert (Default: 5%) und nach einer Minute wieder zurück in die Ursprungsposition. Diese Funktion könnte bspw. zur Abschreckung in einem Alarmsystem eingesetzt werden.
      • +
      +

      + + Get +
        +
      • showNotifyDevsInformations - zeigt eine Übersicht der abgelegten NOTIFYDEV Struktur. Diese Funktion wird primär fürs Debugging genutzt. Hierzu ist das Attribut ASC_expert = 1 zu setzen.
      • +
      +

      + + Attributes +
        + Im ASC-Device +
          + +
        • ASC_autoAstroModeEvening - REAL, CIVIL, NAUTIC, ASTRONOMIC oder HORIZON
        • + +
        • ASC_autoAstroModeEveningHorizon - Höhe über dem Horizont. Wird nur berücksichtigt, wenn im Attribut ASC_autoAstroModeEvening der Wert HORIZON ausgewählt wurde. (default: 0)
        • + +
        • ASC_autoAstroModeMorning - REAL, CIVIL, NAUTIC, ASTRONOMIC oder HORIZON
        • + +
        • ASC_autoAstroModeMorningHorizon - Höhe über dem Horizont. Wird nur berücksichtigt, wenn im Attribut ASC_autoAstroModeMorning der Wert HORIZON ausgewählt wurde. (default: 0)
        • + +
        • ASC_autoShuttersControlComfort - on/off - schaltet die Komfortfunktion an. Bedeutet, dass ein Rollladen mit einem threestate-Sensor am Fenster beim Öffnen in eine Offenposition fährt. Hierzu muss beim Rollladen das Attribut ASC_ComfortOpen_Pos entsprechend konfiguriert sein. (default: off)
        • + +
        • ASC_autoShuttersControlEvening - on/off - Aktiviert die automatische Steuerung durch das ASC-Modul am Abend.
        • + +
        • ASC_autoShuttersControlMorning - on/off - Aktiviert die automatische Steuerung durch das ASC-Modul am Morgen.
        • + +
        • ASC_blockAscDrivesAfterManual - 0,1 - wenn dieser Wert auf 1 gesetzt ist, dann werden Rollläden vom ASC-Modul nicht mehr gesteuert, wenn zuvor manuell eingegriffen wurde. Voraussetzung hierfür ist jedoch, dass im Reading ASC_ShuttersLastDrive der Status manual enthalten ist und sich der Rollladen auf eine unbekannte (nicht in den Attributen anderweitig konfigurierte) Position befindet.
        • + +
        • ASC_brightnessDriveUpDown - WERT-MORGENS:WERT-ABENDS - Werte bei dem Schaltbedingungen für Sonnenauf- und -untergang geprüft werden sollen. Diese globale Einstellung kann durch die WERT-MORGENS:WERT-ABENDS Einstellung von ASC_BrightnessSensor im Rollladen selbst überschrieben werden.
        • + +
        • ASC_debug - Aktiviert die erweiterte Logausgabe für Debugausgaben
        • + +
        • ASC_expert - ist der Wert 1, so werden erweiterte Informationen bezüglich des NotifyDevs unter set und get angezeigt
        • + +
        • ASC_freezeTemp - Temperatur, ab welcher der Frostschutz greifen soll und der Rollladen nicht mehr fährt. Der letzte Fahrbefehl wird gespeichert.
        • + +
        • ASC_rainSensor - DEVICENAME[:READINGNAME] MAXTRIGGER[:HYSTERESE] [CLOSEDPOS] - der Inhalt ist eine Kombination aus Devicename, Readingname, Wert ab dem getriggert werden soll, Hysterese Wert ab dem der Status Regenschutz aufgehoben werden soll und der "wegen Regen geschlossen Position".
        • + +
        • ASC_residentsDev - DEVICENAME[:READINGNAME] - der Inhalt ist eine Kombination aus Devicenamen und Readingnamen des Residents-Device der obersten Ebene (z.B. rgr_Residents:state)
        • + +
        • ASC_shuttersDriveDelay - maximale Zufallsverzögerung in Sekunden bei der Berechnung der Fahrzeiten. 0 bedeutet keine Verzögerung
        • + +
        • ASC_tempSensor - DEVICENAME[:READINGNAME] - der Inhalt ist eine Kombination aus Device und Reading für die Außentemperatur
        • + +
        • ASC_twilightDevice - das Device, welches die Informationen zum Sonnenstand liefert. Wird unter anderem für die Beschattung verwendet.
        • + +
        • ASC_windSensor - DEVICE[:READING] - Sensor für die Windgeschwindigkeit. Kombination aus Device und Reading.
        • +
        • ASC_slatDriveCmdInverse - Vertauscht wie Reihnfolge der Fahrbefehle für Slat und Drive
        • +
        +
        +
        + In den Rollläden-Geräten +
          +
        • ASC - 0/1/2 0 = "kein Anlegen der Attribute beim ersten Scan bzw. keine Beachtung eines Fahrbefehles",1 = "Inverse oder Rollo - Bsp.: Rollo oben 0, Rollo unten 100 und der Befehl zum prozentualen Fahren ist position",2 = "Homematic Style - Bsp.: Rollo oben 100, Rollo unten 0 und der Befehl zum prozentualen Fahren ist pct
        • +
        • ASC_Antifreeze - soft/am/pm/hard/off - Frostschutz, wenn soft fährt der Rollladen in die ASC_Antifreeze_Pos und wenn hard/am/pm wird gar nicht oder innerhalb der entsprechenden Tageszeit nicht gefahren (default: off)
        • +
        • ASC_Antifreeze_Pos - Position die angefahren werden soll, wenn der Fahrbefehl komplett schließen lautet, aber der Frostschutz aktiv ist (Default: ist abhängig vom AttributASC 85/15) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
        • +
        • ASC_AutoAstroModeEvening - aktuell REAL,CIVIL,NAUTIC,ASTRONOMIC (default: none)
        • +
        • ASC_AutoAstroModeEveningHorizon - Höhe über Horizont, wenn beim Attribut ASC_autoAstroModeEvening HORIZON ausgewählt (default: none)
        • +
        • ASC_AutoAstroModeMorning - aktuell REAL,CIVIL,NAUTIC,ASTRONOMIC (default: none)
        • +
        • ASC_AutoAstroModeMorningHorizon - Höhe über Horizont,a wenn beim Attribut ASC_autoAstroModeMorning HORIZON ausgewählt (default: none)
        • +
        • ASC_BlockingTime_afterManual - wie viel Sekunden soll die Automatik nach einer manuellen Fahrt aussetzen. (default: 1200)
        • +
        • ASC_BlockingTime_beforDayOpen - wie viel Sekunden vor dem morgendlichen öffnen soll keine schließen Fahrt mehr stattfinden. (default: 3600)
        • +
        • ASC_BlockingTime_beforNightClose - wie viel Sekunden vor dem nächtlichen schließen soll keine öffnen Fahrt mehr stattfinden. (default: 3600)
        • +
        • ASC_BrightnessSensor - DEVICE[:READING] WERT-MORGENS:WERT-ABENDS / 'Sensorname[:brightness [400:800]]' Angaben zum Helligkeitssensor mit (Readingname, optional) für die Beschattung und dem Fahren der Rollladen nach brightness und den optionalen Brightnesswerten für Sonnenauf- und Sonnenuntergang. (default: none)
        • +
        • ASC_Down - astro/time/brightness - bei astro wird Sonnenuntergang berechnet, bei time wird der Wert aus ASC_Time_Down_Early als Fahrzeit verwendet und bei brightness muss ASC_Time_Down_Early und ASC_Time_Down_Late korrekt gesetzt werden. Der Timer läuft dann nach ASC_Time_Down_Late Zeit, es wird aber in der Zeit zwischen ASC_Time_Down_Early und ASC_Time_Down_Late geschaut, ob die als Attribut im Moduldevice hinterlegte ASC_brightnessDriveUpDown der Down Wert erreicht wurde. Wenn ja, wird der Rollladen runter gefahren (default: astro)
        • +

            + Beschreibung der besonderen Positionsattribute +
          • ASC_Closed_Pos - in 10 Schritten von 0 bis 100 (Default: ist abhängig vom AttributASC 0/100)
          • +
          • ASC_Open_Pos - in 10 Schritten von 0 bis 100 (default: ist abhängig vom AttributASC 100/0)
          • +
          • ASC_Sleep_Pos - in 10 Schritten von 0 bis 100 (default: ist abhängig vom AttributASC 75/25) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
          • +
          • ASC_ComfortOpen_Pos - in 10 Schritten von 0 bis 100 (Default: ist abhängig vom AttributASC 20/80) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
          • +
          • ASC_Shading_Pos - Position des Rollladens für die Beschattung (Default: ist abhängig vom AttributASC 80/20) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
          • +
          • ASC_Ventilate_Pos - in 10 Schritten von 0 bis 100 (default: ist abhängig vom Attribut ASC 70/30) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
          • +

            + In Bezug auf die Verwendung mit Lamellen gibt es folgende ergänzende Parameter. +
              +
            • Wird die gesamte Position inklusive der Lamellen mit Hilfe einer "festen Zurdnung" angefahren, so z.B. set ROLLONAME Beschattung dann wird hinter dem Positionswert mittels : getrennt die "feste Zuordnung" geschrieben. Beispiel: attr ROLLONAME ASC_Shading_Pos 30:Beschattung
            • +
            • Wird hingegen ein ander Command verwendet z.B. slatPct oder ähnliches dann muss hinter der normalen Positionsangebe noch die Position für die Lamellen mit angegeb werden. Beispiel: attr ROLLONAME ASC_Shading_Pos 30:75. Bitte beachtet in diesem Zusammenhang auch das Attribut ASC_SlatPosCmd_SlatDevice wo mindesten die Angabe des SlatPosCMD Voraussetzung ist.
            • +
            +

          +
        • ASC_Shutter_IdleDetection - READING:VALUE gibt das Reading an welches Auskunft über den Fahrstatus des Rollos gibt, sowie als zweites den Wert im Reading welcher aus sagt das das Rollo nicht fährt
        • +
        • ASC_DriveUpMaxDuration - die Dauer des Hochfahrens des Rollladens plus 5 Sekunden (default: 60)
        • +
        • ASC_Drive_Delay - maximaler Wert für einen zufällig ermittelte Verzögerungswert in Sekunden bei der Berechnung der Fahrzeiten.
        • +
        • ASC_Drive_DelayStart - in Sekunden verzögerter Wert ab welchen das Rollo gefahren werden soll.
        • +
        • ASC_LockOut - soft/hard/off - stellt entsprechend den Aussperrschutz ein. Bei global aktivem Aussperrschutz (set ASC-Device lockOut soft) und einem Fensterkontakt open bleibt dann der Rollladen oben. Dies gilt nur bei Steuerbefehlen über das ASC Modul. Stellt man global auf hard, wird bei entsprechender Möglichkeit versucht den Rollladen hardwareseitig zu blockieren. Dann ist auch ein Fahren über die Taster nicht mehr möglich. (default: off)
        • +
        • ASC_LockOut_Cmd - inhibit/blocked/protection - set Befehl für das Rollladen-Device zum Hardware sperren. Dieser Befehl wird gesetzt werden, wenn man "ASC_LockOut" auf hard setzt (default: none)
        • +
        • ASC_Mode_Down - always/home/absent/off - Wann darf die Automatik steuern. immer, niemals, bei Abwesenheit des Roommate (ist kein Roommate und absent eingestellt, wird gar nicht gesteuert) (default: always)
        • +
        • ASC_Mode_Up - always/home/absent/off - Wann darf die Automatik steuern. immer, niemals, bei Abwesenheit des Roommate (ist kein Roommate und absent eingestellt, wird gar nicht gesteuert) (default: always)
        • +
        • ASC_Partymode - on/off - schaltet den Partymodus an oder aus. Wird am ASC Device set ASC-DEVICE partyMode on geschalten, werden alle Fahrbefehle an den Rollläden, welche das Attribut auf on haben, zwischengespeichert und später erst ausgeführt (default: off)
        • +
        • ASC_Pos_Reading - Name des Readings, welches die Position des Rollladen in Prozent an gibt; wird bei unbekannten Device Typen auch als set Befehl zum fahren verwendet
        • +
        • ASC_PrivacyUpValue_beforeDayOpen - wie viele Sekunden vor dem morgendlichen öffnen soll der Rollladen in die Sichtschutzposition fahren, oder bei Brightness ab welchem minimum Brightnesswert soll das Rollo in die Privacy Position fahren. Bei Brightness muss zusätzlich zum Zeitwert der Brightnesswert mit angegeben werden 1800:600 bedeutet 30 min vor day open oder bei über einem Brightnesswert von 600 (default: -1)
        • +
        • ASC_PrivacyDownValue_beforeNightClose - wie viele Sekunden vor dem abendlichen schließen soll der Rollladen in die Sichtschutzposition fahren, oder bei Brightness ab welchem minimum Brightnesswert soll das Rollo in die Privacy Position fahren. Bei Brightness muss zusätzlich zum Zeitwert der Brightnesswert mit angegeben werden 1800:300 bedeutet 30 min vor night close oder bei unter einem Brightnesswert von 300 (default: -1)
        • +
        • ASC_PrivacyUp_Pos - Position den Rollladens für den morgendlichen Sichtschutz (default: 50) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
        • +
        • ASC_PrivacyDown_Pos - Position den Rollladens für den abendlichen Sichtschutz (default: 50) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
        • +
        • ASC_ExternalTrigger - DEVICE:READING VALUEACTIVE:VALUEINACTIVE POSACTIVE:[POSINACTIVE VALUEACTIVE2:POSACTIVE2], Beispiel: "WohnzimmerTV:state on:off 66:100" bedeutet das wenn ein "state:on" Event kommt soll das Rollo in Position 66 fahren, kommt ein "state:off" Event soll es in Position 100 fahren. Es ist möglich die POSINACTIVE weg zu lassen dann fährt das Rollo in LastStatus Position.
        • +
        • ASC_WindProtection - on/off - soll der Rollladen beim Windschutz beachtet werden. on=JA, off=NEIN. (default off)
        • +
        • ASC_RainProtection - on/off - soll der Rollladen beim Regenschutz beachtet werden. on=JA, off=NEIN. (default off)
        • +
        • ASC_Roommate_Device - mit Komma getrennte Namen des/der Roommate Device/s, welche den/die Bewohner des Raumes vom Rollladen wiedergibt. Es macht nur Sinn in Schlaf- oder Kinderzimmern (default: none)
        • +
        • ASC_Adv - on/off bei on wird das runterfahren des Rollos während der Weihnachtszeit (1. Advent bis 6. Januar) ausgesetzt! Durch set ASCDEVICE advDriveDown werden alle ausgesetzten Fahrten nachgeholt.
        • +
        • ASC_Roommate_Reading - das Reading zum Roommate Device, welches den Status wieder gibt (default: state)
        • +
        • ASC_Self_Defense_Mode - absent/gone/off - ab welchen Residents Status soll Selfdefense aktiv werden ohne das Fenster auf sind. (default: gone)
        • +
        • ASC_Self_Defense_AbsentDelay - um wie viele Sekunden soll das fahren in Selfdefense bei Residents absent verzögert werden. (default: 300)
        • +
        • ASC_Self_Defense_Exclude - on/off - bei on Wert wird dieser Rollladen bei aktiven Self Defense und offenen Fenster nicht runter gefahren, wenn Residents absent ist. (default: off), off bedeutet das es ausgeschlossen ist vom Self Defense
        • +
            + Beschreibung der Beschattungsfunktion +
            Damit die Beschattung Funktion hat, müssen folgende Anforderungen erfüllt sein. +
            Im ASC Device das Reading "controlShading" mit dem Wert on, sowie ein Astro/Twilight Device im Attribut "ASC_twilightDevice" und das Attribut "ASC_tempSensor". +
            In den Rollladendevices benötigt ihr ein Helligkeitssensor als Attribut "ASC_BrightnessSensor", sofern noch nicht vorhanden. Findet der Sensor nur für die Beschattung Verwendung ist der Wert DEVICENAME[:READING] ausreichend. +
            Alle weiteren Attribute sind optional und wenn nicht gesetzt mit Default-Werten belegt. Ihr solltet sie dennoch einmal anschauen und entsprechend Euren Gegebenheiten setzen. Die Werte für die Fensterposition und den Vor- Nachlaufwinkel sowie die Grenzwerte für die StateChange_Cloudy und StateChange_Sunny solltet ihr besondere Beachtung dabei schenken. +
          • ASC_Shading_InOutAzimuth - Azimut Wert ab dem bei Überschreiten Beschattet und bei Unterschreiten Endschattet werden soll. (default: 95:265)
          • +
          • ASC_Shading_MinMax_Elevation - ab welcher min Höhe des Sonnenstandes soll beschattet und ab welcher max Höhe wieder beendet werden, immer in Abhängigkeit der anderen einbezogenen Sensorwerte (default: 25.0:100.0)
          • +
          • ASC_Shading_Min_OutsideTemperature - ab welcher Temperatur soll Beschattet werden, immer in Abhängigkeit der anderen einbezogenen Sensorwerte (default: 18)
          • +
          • ASC_Shading_Mode - absent,always,off,home / wann soll die Beschattung nur stattfinden. (default: off)
          • +
          • ASC_Shading_Pos - Position des Rollladens für die Beschattung (Default: ist abhängig vom AttributASC 80/20) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
          • +
          • ASC_Shading_StateChange_SunnyCloudy - Brightness Wert ab welchen die Beschattung stattfinden und aufgehoben werden soll, immer in Abhängigkeit der anderen einbezogenen Sensorwerte. Ein optionaler dritter Wert gibt an wie, viele Brightnesswerte für den aktuellen Brightness-Durchschnitt berücksichtigt werden. Standard ist 3, es sollten nicht mehr als 5 berücksichtigt werden. (default: 35000:20000 [3])
          • +
          • ASC_Shading_WaitingPeriod - wie viele Sekunden soll gewartet werden bevor eine weitere Auswertung der Sensordaten für die Beschattung stattfinden soll (default: 1200)
          • +

          +
        • ASC_ShuttersPlace - window/terrace - Wenn dieses Attribut auf terrace gesetzt ist, das Residence Device in den Status "gone" geht und SelfDefense aktiv ist (ohne das das Reading selfDefense gesetzt sein muss), wird das Rollo geschlossen (default: window)
        • +
        • ASC_Time_Down_Early - Sonnenuntergang frühste Zeit zum Runterfahren (default: 16:00) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!
        • +
        • ASC_Time_Down_Late - Sonnenuntergang späteste Zeit zum Runterfahren (default: 22:00) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!
        • +
        • ASC_Time_Up_Early - Sonnenaufgang frühste Zeit zum Hochfahren (default: 05:00) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!
        • +
        • ASC_Time_Up_Late - Sonnenaufgang späteste Zeit zum Hochfahren (default: 08:30) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!
        • +
        • ASC_Time_Up_WE_Holiday - Sonnenaufgang frühste Zeit zum Hochfahren am Wochenende und/oder Urlaub (holiday2we wird beachtet). (default: 08:00) ACHTUNG!!! in Verbindung mit Brightness für ASC_Up muss die Uhrzeit kleiner sein wie die Uhrzeit aus ASC_Time_Up_Late !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!
        • +
        • ASC_Up - astro/time/brightness - bei astro wird Sonnenaufgang berechnet, bei time wird der Wert aus ASC_Time_Up_Early als Fahrzeit verwendet und bei brightness muss ASC_Time_Up_Early und ASC_Time_Up_Late korrekt gesetzt werden. Der Timer läuft dann nach ASC_Time_Up_Late Zeit, es wird aber in der Zeit zwischen ASC_Time_Up_Early und ASC_Time_Up_Late geschaut, ob die als Attribut im Moduldevice hinterlegte Down Wert von ASC_brightnessDriveUpDown erreicht wurde. Wenn ja, wird der Rollladen hoch gefahren (default: astro)
        • +
        • ASC_Ventilate_Window_Open - auf lüften, wenn das Fenster gekippt/geöffnet wird und aktuelle Position unterhalb der Lüften-Position ist (default: on)
        • +
        • ASC_WiggleValue - Wert um welchen sich die Position des Rollladens ändern soll (default: 5)
        • +
        • ASC_WindParameters - TRIGGERMAX[:HYSTERESE] [DRIVEPOSITION] / Angabe von Max Wert ab dem für Wind getriggert werden soll, Hytsrese Wert ab dem der Windschutz aufgehoben werden soll TRIGGERMAX - HYSTERESE / Ist es bei einigen Rollläden nicht gewünscht das gefahren werden soll, so ist der TRIGGERMAX Wert mit -1 an zu geben. (default: '50:20 ClosedPosition')
        • +
        • ASC_WindowRec_PosAfterDayClosed - open,lastManual / auf welche Position soll das Rollo nach dem schließen am Tag fahren. Open Position oder letzte gespeicherte manuelle Position (default: open)
        • +
        • ASC_WindowRec - WINDOWREC:[READING], Name des Fensterkontaktes, an dessen Fenster der Rollladen angebracht ist (default: none). Reading ist optional
        • +
        • ASC_WindowRec_subType - Typ des verwendeten Fensterkontaktes: twostate (optisch oder magnetisch) oder threestate (Drehgriffkontakt) (default: twostate)
        • +
        • ASC_SlatPosCmd_SlatDevice - Angaben zu einem Slat (Lamellen) CMD und sofern diese Lamellen über ein anderes Device gesteuert werden zum Slat Device. Beispiel: attr ROLLO ASC_SlatPosCmd_SlatDevice slatPct[:ROLLOSLATDEVICE] [ ] bedeutet optinal. Kann also auch weg gelassen werden. Wenn Ihr das SLAT Device mit angibt dann bitte ohne []. Beispiel: attr ROLLO ASC_SlatPosCmd_SlatDevice slatPct:ROLLOSLATDEVICE. Damit das ganze dann auch greift muss in den 6 Positionsangaben ASC_Open_Pos, ASC_Closed_Pos, ASC_Ventilate_Pos, ASC_ComfortOpen_Pos, ASC_Shading_Pos und ASC_Sleep_Pos ein weiterer Parameter für die Lamellenstellung mit angegeben werden.
        • +
        +
      +

      + Beschreibung der AutoShuttersControl API +
      Mit dem Aufruf der API Funktion und Übergabe der entsprechenden Parameter ist es möglich auf interne Daten zu zu greifen. +

      + Übersicht für das Rollladen-Device +
        + { ascAPIget('Getter','ROLLODEVICENAME') }
        +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      GetterErläuterung
      FreezeStatus1=soft, 2=Daytime, 3=hard
      AntiFreezePoskonfigurierte Position beim AntiFreeze Status
      AntiFreezePosAssignmentkonfigurierte Lamellen Position bei der AntiFreeze Position
      AntiFreezeaktuelle Konfiguration für AntiFreeze
      ShuttersPlaceaktuelle Konfiguration an welchem Platz sich das Rollo befindet, Fenster oder Terrasse
      SlatPosCmdwelcher PosCmd ist aktuell für den Lamellen Befehl konfiguriert
      SlatDevicewelches Device aktuell für die Lamellen Steuerung konfiguriert ist
      PrivacyUpTimePrivacy Zeit in Sekunden zum fahren in die Privacy Pos vor dem vollen öffnen
      PrivacyUpBrightnessValPrivacy Brightness Wert zum fahren in die Privacy Pos
      PrivacyUpPosPosition für die Privacy Up Fahrt
      PrivacyUpPositionAssignmentPosition für die Lamellenfahrt von Privacy Up
      PrivacyDownTimePrivacy Zeit in Sekunden zum fahren in die Privacy Pos vor dem vollen schließ
      PrivacyDownBrightnessValPrivacy Brightness Wert zum fahren in die Privacy Pos
      PrivacyDownPosPosition für die Privacy Down Fahrt
      PrivacyDownPositionAssignmentPosition für die Lamellenfahrt von Privacy Down
      SelfDefenseModeModus für den SelfDefense
      SelfDefenseAbsentDelayVerzögerungszeit der SelfDefense Fahrt bei absent
      WiggleValueum welchen Wert soll das Rollo bei einer wiggle Fahrt fahren
      AdvIst es in der definierten Weihnachtszeit
      ShadingPoskonfigurierte Position für die Beschattungsfahrt
      ShadingPositionAssignmentPosition für die Lamellenfahrt für die Beschattungsfahrt
      ShadingModewelcher aktuelle Modus für das Beschatten ist konfiguriert
      IdleDetectionValuewelcher Wert im IdleDetectionRading zeigt an dass das Rollo aktuell nicht in Bewegung ist
      ShadingAzimuthLeftab welchem Azimut beginnt die Beschattung
      ShadingAzimuthRightab welchem Azimut endet die Beschattung
      ShadingMinOutsideTemperatureüber welchem Temperaturwert beginnt die Beschattung
      ShadingMinElevationüber welchem Elevationwert beginnt die Beschattung
      ShadingMaxElevationüber welchem Elevationwert endet die Beschattung
      ShadingStateChangeSunnyüber welchem Brightnesswert beginnt die Beschattung
      ShadingStateChangeCloudyunter welchem Brightnesswert endet die Beschattung
      ShadingWaitingPeriodnach welcher Wartezeit werden Beschattungsrelevante Sensorwerte wieder beachtet und die Beschattungsroutine abgearbeitet
      ExternalTriggerDevicekonfiguriertes Triggerdevice
      ExternalTriggerReadingkofiguriertes Triggerdevice Reading
      ExternalTriggerValueActiveWert mit welchen der externe Trigger Prozess ausgel&uoml;st werden soll.
      ExternalTriggerValueActive2weiterer Wert mit welchen der externe zweite Trigger Prozess ausgel&uoml;st werden soll.
      ExternalTriggerValueInactiveWert mit welchen der externe Trigger Prozess beendet werden soll
      ExternalTriggerPosActiveRolloposition welche angefahren werden soll wenn der erste externe Trigger aktiv wird.
      ExternalTriggerPosActive2Rolloposition welche angefahren werden soll wenn der zweite externe Trigger aktiv wird.
      ExternalTriggerPosInactiveRolloposition welche angefahren werden soll wenn der externe Trigger inaktiv wird.
      ExternalTriggerStateaktueller Status des externen Triggers, 0 oder 1
      Delaykonfigurierte Verzögerungswert welcher für die Zufallsberechnung werwendet werden soll
      DelayStartkonfigurierter fester Verzögerungswert
      BlockingTimeAfterManualkonfigurierte Blockzeit nach einer manuellen Fahrt
      BlockingTimeBeforNightClosekonfigurierte Blockzeit vor dem nächtlichen schließen
      BlockingTimeBeforDayOpenkonfigurierte Blockzeit vor dem morgendlichen öffnen
      PosCmdwelches Kommando wird zum fahren der Rollos verwendet (pct, position?)
      OpenPosPosition für Rollo ganz auf
      OpenPositionAssignmentSlat-Position für Rollo ganz auf
      VentilatePosLüften Position
      VentilatePositionAssignmentLüften Slat-Position
      VentilatePosAfterDayClosedPosition des Rollos beim schließen des Fensters am Tag
      ClosedPosPosition für Rollo ganz geschlossen
      ClosedPositionAssignmentSlat-Position für Rollo ganz geschlossen
      SleepPosPosition für schlafen
      SleepPositionAssignmentSlat-Position für schlafen
      VentilateOpenLüften aktiv?
      ComfortOpenPosComfort Position
      ComfortOpenPositionAssignmentSlat-Comfort Position
      PartyModeAbfrage Party Mode
      RoommatesAbfrage Roommates / Antwort als String
      RoommatesReadingRoommates Reading
      RoommatesStatusRoommates Status unter Berücksichtigung aller Roommates und dessen Status
      RoommatesLastStatusRoommates letzter Status unter Berücksichtigung aller Roommates und dessen letzten Status
      WindPosRollo Position bei Windtrigger
      WindMaxWert über dem die Windprotection aktiviert werden soll
      WindMinWert unter dem die Windprotection aufgehoben werden soll
      WindProtectionWindprotection soll aktiv sein oder nicht
      WindProtectionStatusaktueller Status der Wind Protection „protected“ oder „unprotected“
      RainProtectionRain Protection soll aktiv sein oder nicht
      RainProtectionStatusaktueller Status der Regen Protection „unprotected“ oder „unprotected“
      ModeUp
      ModeDown
      LockOut
      LockOutCmd
      AutoAstroModeMorning
      AutoAstroModeEvening
      AutoAstroModeMorningHorizon
      AutoAstroModeEveningHorizon
      Up
      Down
      TimeUpEarly
      TimeUpLate
      TimeDownEarly
      TimeDownLate
      TimeUpWeHoliday
      NoDelayWurde die Behandlung von Offset deaktiviert (Beispiel bei Fahrten über Fensterevents)
      LastDriveGrund des letzten Fahrens
      LastPosdie letzte Position des Rollladens
      LastPosTimestampTimestamp der letzten festgestellten Position
      LastManPosPosition der letzten manuellen Fahrt
      LastManPosTimestampTimestamp der letzten manuellen Position
      SunsetUnixTimeberechnete Unixzeit für Abends (Sonnenuntergang)
      Sunset1=Abendfahrt wurde durchgeführt, 0=noch keine Abendfahrt durchgeführt
      SunriseUnixTimeberechnete Unixzeit für Morgens (Sonnenaufgang)
      Sunrise1=Morgenfahrt wurde durchgeführt, 0=noch keine Morgenfahrt durchgeführt
      RoommatesStatusaktueller Status der/des Roommate/s für den Rollladen
      RoommatesLastStatusletzter Status der/des Roommate/s für den Rollladen
      ShadingStatusAusgabe des aktuellen Shading Status, „in“, „out“, „in reserved“, „out reserved“
      ShadingStatusTimestampTimestamp des letzten Beschattungsstatus
      IfInShadingBefindet sich der Rollladen, in Abhängigkeit des Shading Mode, in der Beschattung
      DelayCmdletzter Fahrbefehl welcher in die Warteschlange kam. Grund z.B. Partymodus.
      StatusPosition des Rollladens
      ASCenableAbfrage ob für den Rollladen die ASC Steuerung aktiv ist.
      IsDayAbfrage ob das Rollo im Tag oder Nachtmodus ist. Also nach Sunset oder nach Sunrise
      PrivacyDownStatusAbfrage ob das Rollo aktuell im PrivacyDown Status steht
      OutTempaktuelle Außentemperatur sofern ein Sensor definiert ist, wenn nicht kommt -100 als Wert zurück
      +

      + Übersicht für das Rollladen-Device mit Parameterübergabe +
        + { ascAPIget('Getter','ROLLODEVICENAME',VALUE) }
        +
      + + + +
      GetterErläuterung
      QueryShuttersPosRückgabewert 1 bedeutet das die aktuelle Position des Rollos unterhalb der Valueposition ist. 0 oder nichts bedeutet oberhalb der Valueposition.
      +

      + Übersicht für das ASC Device +
        + { ascAPIget('Getter') }
        +
      + + + + + + + + +
      GetterErläuterung
      OutTemp aktuelle Außentemperatur sofern ein Sensor definiert ist, wenn nicht kommt -100 als Wert zurück
      ResidentsStatusaktueller Status des Residents Devices
      ResidentsLastStatusletzter Status des Residents Devices
      AzimuthAzimut Wert
      ElevationElevation Wert
      ASCenableist die ASC Steuerung global aktiv?
      +
    + +=end html_DE + +=for :application/json;q=META.json 73_AutoShuttersControl.pm +{ + "abstract": "Module for controlling shutters depending on various conditions", + "x_lang": { + "de": { + "abstract": "Modul zur Automatischen Rolladensteuerung auf Basis bestimmter Ereignisse" + } + }, + "keywords": [ + "fhem-mod-device", + "fhem-core", + "Shutter", + "Automation", + "Rollladen", + "Rollo", + "Control" + ], + "release_status": "testing", + "license": "GPL_2", + "version": "v0.9.20", + "author": [ + "Marko Oldenburg " + ], + "x_fhem_maintainer": [ + "CoolTux" + ], + "x_fhem_maintainer_github": [ + "LeonGaultier" + ], + "prereqs": { + "runtime": { + "requires": { + "FHEM": 5.00918799, + "perl": 5.016, + "Meta": 0, + "JSON": 0, + "Date::Parse": 0 + }, + "recommends": { + }, + "suggests": { + } + } + } +} +=end :application/json;q=META.json + +=cut diff --git a/73_AutoShuttersControl.pm b/lib/FHEM/Automation/ShuttersControl.pm similarity index 51% rename from 73_AutoShuttersControl.pm rename to lib/FHEM/Automation/ShuttersControl.pm index 83d2248..e9d29f0 100644 --- a/73_AutoShuttersControl.pm +++ b/lib/FHEM/Automation/ShuttersControl.pm @@ -60,7 +60,7 @@ sub ascAPIset { } ## unserer packagename -package FHEM::AutoShuttersControl; +package FHEM::Automation::ShuttersControl; use strict; use warnings; @@ -73,6 +73,9 @@ use GPUtils qw(GP_Import GP_Export); use Data::Dumper; #only for Debugging use Date::Parse; +use FHEM::Automation::ShuttersControl::Shutters; +use FHEM::Automation::ShuttersControl::Dev; + # try to use JSON::MaybeXS wrapper # for chance of better performance + open code eval { @@ -185,17 +188,18 @@ BEGIN { computeAlignTime ReplaceEventMap) ); + + #-- Export to main context with different name + GP_Export( + qw( + ascAPIget + ascAPIset + DevStateIcon + ) + ); } -#-- Export to main context with different name -GP_Export( - qw( - Initialize - ascAPIget - ascAPIset - DevStateIcon - ) -); + ## Die Attributsliste welche an die Rolläden verteilt wird. Zusammen mit Default Werten my %userAttrList = ( @@ -496,10 +500,10 @@ sub Notify { WriteReadingsShuttersList($hash); UserAttributs_Readings_ForShutters( $hash, 'add' ); InternalTimer( gettimeofday() + 3, - 'FHEM::AutoShuttersControl::RenewSunRiseSetShuttersTimer', + 'FHEM::Automation::ShuttersControl::RenewSunRiseSetShuttersTimer', $hash ); InternalTimer( gettimeofday() + 5, - 'FHEM::AutoShuttersControl::AutoSearchTwilightDev', $hash ); + 'FHEM::Automation::ShuttersControl::AutoSearchTwilightDev', $hash ); InternalTimer( gettimeofday() + 5, sub() { CommandSet( undef, $name . ' controlShading on' ) }, @@ -4944,7 +4948,7 @@ sub _CheckASC_ConditionsForShadingFn { my $count = 1; for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { InternalTimer( gettimeofday() + $count, - 'FHEM::AutoShuttersControl::_CheckShuttersConditionsForShadingFn', + 'FHEM::Automation::ShuttersControl::_CheckShuttersConditionsForShadingFn', $shuttersDev ); $count++; @@ -5022,4679 +5026,5 @@ sub _CheckShuttersConditionsForShadingFn { readingsEndUpdate( $shuttersDevHash, 1 ); } -###################################### -###################################### -########## Begin der Klassendeklarierungen für OOP (Objektorientierte Programmierung) ######################### -## Klasse Rolläden (Shutters) und die Subklassen Attr und Readings ## -## desweiteren wird noch die Klasse ASC_Roommate mit eingebunden - -package ASC_Shutters; -our @ISA = - qw(ASC_Shutters::Readings ASC_Shutters::Attr ASC_Roommate ASC_Window); - -use strict; -use warnings; -use utf8; - -use GPUtils qw(GP_Import); - -## Import der FHEM Funktionen -BEGIN { - GP_Import( - qw( - defs - ReadingsVal - readingsSingleUpdate - gettimeofday - InternalTimer - CommandSet - Log3) - ); -} - -sub new { - my $class = shift; - my $self = { - shuttersDev => undef, - defaultarg => undef, - roommate => undef, - }; - - bless $self, $class; - return $self; -} - -sub setShuttersDev { - my $self = shift; - my $shuttersDev = shift; - - $self->{shuttersDev} = $shuttersDev if ( defined($shuttersDev) ); - return $self->{shuttersDev}; -} - -sub getShuttersDev { - my $self = shift; - - return $self->{shuttersDev}; -} - -sub setAttrUpdateChanges { - my ( $self, $attr, $value ) = @_; - - $self->{ $self->{shuttersDev} }{AttrUpdateChanges}{$attr} = $value; - return; -} - -sub setHardLockOut { - my $self = shift; - my $cmd = shift; - - if ( $shutters->getLockOut eq 'hard' - && $shutters->getLockOutCmd ne 'none' ) - { - CommandSet( undef, $self->{shuttersDev} . ' inhibit ' . $cmd ) - if ( $shutters->getLockOutCmd eq 'inhibit' ); - CommandSet( undef, - $self->{shuttersDev} . ' ' - . ( $cmd eq 'on' ? 'blocked' : 'unblocked' ) ) - if ( $shutters->getLockOutCmd eq 'blocked' ); - CommandSet( undef, - $self->{shuttersDev} . ' ' - . ( $cmd eq 'on' ? 'protectionOn' : 'protectionOff' ) ) - if ( $shutters->getLockOutCmd eq 'protected' ); - } - return; -} - -sub setNoDelay { - my $self = shift; - my $noDelay = shift; - - $self->{ $self->{shuttersDev} }{noDelay} = $noDelay; - return; -} - -sub setSelfDefenseAbsent { - my ( $self, $timerrun, $active, $timerhash ) = @_; - - $self->{ $self->{shuttersDev} }{selfDefenseAbsent}{timerrun} = $timerrun; - $self->{ $self->{shuttersDev} }{selfDefenseAbsent}{active} = $active; - $self->{ $self->{shuttersDev} }{selfDefenseAbsent}{timerhash} = $timerhash - if ( defined($timerhash) ); - return; -} - -sub setDriveCmd { - my $self = shift; - my $posValue = shift; - - my $offSet; - my $offSetStart; - - if ( - ( $shutters->getPartyMode eq 'on' && $ascDev->getPartyMode eq 'on' ) - || ( $shutters->getAdv - && !$shutters->getQueryShuttersPos($posValue) - && !$shutters->getAdvDelay - && !$shutters->getExternalTriggerState - && !$shutters->getSelfDefenseState ) - ) - { - $shutters->setDelayCmd($posValue); - $ascDev->setDelayCmdReading; - $shutters->setNoDelay(0); - $shutters->setExternalTriggerState(0) - if ( $shutters->getExternalTriggerState ); - - FHEM::AutoShuttersControl::ASC_Debug( 'setDriveCmd: ' - . $shutters->getShuttersDev - . ' - Die Fahrt wird zurückgestellt. Grund kann ein geöffnetes Fenster sein oder ein aktivierter Party Modus oder Weihnachtszeit' - ); - } - else { - $shutters->setAdvDelay(0) - if ( $shutters->getAdvDelay ); - $shutters->setDelayCmd('none') - if ( $shutters->getDelayCmd ne 'none' ) - ; # setzt den Wert auf none da der Rolladen nun gesteuert werden kann. - $shutters->setExternalTriggerState(0) - if ( $shutters->getExternalTriggerState ); - - ### antifreeze Routine - if ( $shutters->getAntiFreezeStatus > 0 ) { - if ( $shutters->getAntiFreezeStatus != 1 ) { - - $posValue = $shutters->getStatus; - $shutters->setLastDrive('no drive - antifreeze defense'); - $shutters->setLastDriveReading; - $ascDev->setStateReading; - } - elsif ( $posValue == $shutters->getClosedPos ) { - $posValue = $shutters->getAntiFreezePos; - $shutters->setLastDrive( - $shutters->getLastDrive . ' - antifreeze mode' ); - } - } - - my %h = ( - shuttersDev => $self->{shuttersDev}, - posValue => $posValue, - ); - - $offSet = $shutters->getDelay if ( $shutters->getDelay > -1 ); - $offSet = $ascDev->getShuttersOffset if ( $shutters->getDelay < 0 ); - $offSetStart = $shutters->getDelayStart; - - if ( $shutters->getSelfDefenseAbsent - && !$shutters->getSelfDefenseAbsentTimerrun - && $shutters->getSelfDefenseMode ne 'off' - && $shutters->getSelfDefenseState - && $ascDev->getSelfDefense eq 'on' ) - { - InternalTimer( - gettimeofday() + $shutters->getSelfDefenseAbsentDelay, - \&FHEM::AutoShuttersControl::_SetCmdFn, \%h ); - $shutters->setSelfDefenseAbsent( 1, 0, \%h ); - } - elsif ( $offSetStart > 0 && !$shutters->getNoDelay ) { - InternalTimer( - gettimeofday() + - int( rand($offSet) + $shutters->getDelayStart ), - \&FHEM::AutoShuttersControl::_SetCmdFn, \%h - ); - - FHEM::AutoShuttersControl::ASC_Debug( 'FnSetDriveCmd: ' - . $shutters->getShuttersDev - . ' - versetztes fahren' ); - } - elsif ( $offSetStart < 1 || $shutters->getNoDelay ) { - FHEM::AutoShuttersControl::_SetCmdFn( \%h ); - FHEM::AutoShuttersControl::ASC_Debug( 'FnSetDriveCmd: ' - . $shutters->getShuttersDev - . ' - NICHT versetztes fahren' ); - } - - FHEM::AutoShuttersControl::ASC_Debug( 'FnSetDriveCmd: ' - . $shutters->getShuttersDev - . ' - NoDelay: ' - . ( $shutters->getNoDelay ? 'JA' : 'NEIN' ) ); - $shutters->setNoDelay(0); - } - - return; -} - -sub setSunsetUnixTime { - my $self = shift; - my $unixtime = shift; - - $self->{ $self->{shuttersDev} }{sunsettime} = $unixtime; - return; -} - -sub setSunset { - my $self = shift; - my $value = shift; - - $self->{ $self->{shuttersDev} }{sunset} = $value; - return; -} - -sub setSunriseUnixTime { - my $self = shift; - my $unixtime = shift; - - $self->{ $self->{shuttersDev} }{sunrisetime} = $unixtime; - return; -} - -sub setSunrise { - my $self = shift; - my $value = shift; - - $self->{ $self->{shuttersDev} }{sunrise} = $value; - return; -} - -sub setDelayCmd { - my $self = shift; - my $posValue = shift; - - $self->{ $self->{shuttersDev} }{delayCmd} = $posValue; - return; -} - -sub setLastDrive { - my $self = shift; - my $lastDrive = shift; - - $self->{ $self->{shuttersDev} }{lastDrive} = $lastDrive; - return; -} - -sub setPosSetCmd { - my $self = shift; - my $posSetCmd = shift; - - $self->{ $self->{shuttersDev} }{posSetCmd} = $posSetCmd; - return; -} - -sub setLastDriveReading { - my $self = shift; - my $shuttersDevHash = $defs{ $self->{shuttersDev} }; - - my %h = ( - devHash => $shuttersDevHash, - lastDrive => $shutters->getLastDrive, - ); - - InternalTimer( gettimeofday() + 0.1, - \&FHEM::AutoShuttersControl::_setShuttersLastDriveDelayed, \%h ); - return; -} - -sub setLastPos { - -# letzte ermittelte Position bevor die Position des Rolladen über ASC geändert wurde - my $self = shift; - my $position = shift; - - $self->{ $self->{shuttersDev} }{lastPos}{VAL} = $position - if ( defined($position) ); - $self->{ $self->{shuttersDev} }{lastPos}{TIME} = int( gettimeofday() ) - if ( defined( $self->{ $self->{shuttersDev} }{lastPos} ) ); - return; -} - -sub setLastManPos { - my $self = shift; - my $position = shift; - - $self->{ $self->{shuttersDev} }{lastManPos}{VAL} = $position - if ( defined($position) ); - $self->{ $self->{shuttersDev} }{lastManPos}{TIME} = int( gettimeofday() ) - if ( defined( $self->{ $self->{shuttersDev} }{lastManPos} ) - && defined( $self->{ $self->{shuttersDev} }{lastManPos}{TIME} ) ); - $self->{ $self->{shuttersDev} }{lastManPos}{TIME} = - int( gettimeofday() ) - 86400 - if ( defined( $self->{ $self->{shuttersDev} }{lastManPos} ) - && !defined( $self->{ $self->{shuttersDev} }{lastManPos}{TIME} ) ); - return; -} - -sub setDefault { - my $self = shift; - my $defaultarg = shift; - - $self->{defaultarg} = $defaultarg if ( defined($defaultarg) ); - return $self->{defaultarg}; -} - -sub setRoommate { - my $self = shift; - my $roommate = shift; - - $self->{roommate} = $roommate if ( defined($roommate) ); - return $self->{roommate}; -} - -sub setInTimerFuncHash { - my $self = shift; - my $inTimerFuncHash = shift; - - $self->{ $self->{shuttersDev} }{inTimerFuncHash} = $inTimerFuncHash - if ( defined($inTimerFuncHash) ); - return; -} - -sub setPrivacyDownStatus { - my $self = shift; - my $statusValue = shift; - - $self->{ $self->{shuttersDev} }->{privacyDownStatus} = $statusValue; - return; -} - -sub setPrivacyUpStatus { - my $self = shift; - my $statusValue = shift; - - $self->{ $self->{shuttersDev} }->{privacyUpStatus} = $statusValue; - return; -} - -sub setSelfDefenseState { - my $self = shift; - my $value = shift; - - $self->{ $self->{shuttersDev} }{selfDefenseState} = $value; - return; -} - -sub setAdvDelay { - my $self = shift; - my $advDelay = shift; - - $self->{ $self->{shuttersDev} }->{AdvDelay} = $advDelay; - return; -} - -sub getHomemode { - my $self = shift; - - my $homemode = $shutters->getRoommatesStatus; - $homemode = $ascDev->getResidentsStatus - if ( $homemode eq 'none' ); - return $homemode; -} - -sub getAdvDelay { - my $self = shift; - - return ( - defined( $self->{ $self->{shuttersDev} }->{AdvDelay} ) - ? $self->{ $self->{shuttersDev} }->{AdvDelay} - : 0 - ); -} - -sub getPrivacyDownStatus { - my $self = shift; - - return ( - defined( $self->{ $self->{shuttersDev} }->{privacyDownStatus} ) - ? $self->{ $self->{shuttersDev} }->{privacyDownStatus} - : undef - ); -} - -sub getPrivacyUpStatus { - my $self = shift; - - return ( - defined( $self->{ $self->{shuttersDev} }->{privacyUpStatus} ) - ? $self->{ $self->{shuttersDev} }->{privacyUpStatus} - : undef - ); -} - -sub getAttrUpdateChanges { - my $self = shift; - my $attr = shift; - - return ( - defined( $self->{ $self->{shuttersDev} }{AttrUpdateChanges} ) - && defined( - $self->{ $self->{shuttersDev} }{AttrUpdateChanges}{$attr} ) - ? $self->{ $self->{shuttersDev} }{AttrUpdateChanges}{$attr} - : 'none' - ); -} - -sub getIsDay { - my $self = shift; - - return FHEM::AutoShuttersControl::_IsDay( $self->{shuttersDev} ); -} - -sub getAntiFreezeStatus { - use POSIX qw(strftime); - my $self = shift; - my $daytime = strftime( "%P", localtime() ); - $daytime = ( - defined($daytime) && $daytime - ? $daytime - : ( strftime( "%k", localtime() ) < 12 ? 'am' : 'pm' ) - ); - my $outTemp = $ascDev->getOutTemp; - -# $outTemp = $shutters->getOutTemp if ( $shutters->getOutTemp != -100 ); sollte raus das der Sensor im Rollo auch ein Innentemperatursensor sein kann. - - if ( $shutters->getAntiFreeze ne 'off' - && $outTemp <= $ascDev->getFreezeTemp ) - { - - if ( $shutters->getAntiFreeze eq 'soft' ) { - return 1; - } - elsif ( $shutters->getAntiFreeze eq $daytime ) { - return 2; - } - elsif ( $shutters->getAntiFreeze eq 'hard' ) { - return 3; - } - } - else { return 0; } -} - -sub getShuttersPosCmdValueNegate { - my $self = shift; - - return ( $shutters->getOpenPos < $shutters->getClosedPos ? 1 : 0 ); -} - -sub getQueryShuttersPos -{ # Es wird geschaut ob die aktuelle Position des Rollos unterhalb der Zielposition ist - my $self = shift; - my $posValue = shift; # wenn dem so ist wird 1 zurück gegeben ansonsten 0 - - return ( - $shutters->getShuttersPosCmdValueNegate - ? $shutters->getStatus > $posValue - : $shutters->getStatus < $posValue - ); -} - -sub getPosSetCmd { - my $self = shift; - - return ( - defined( $self->{ $self->{shuttersDev} }{posSetCmd} ) - ? $self->{ $self->{shuttersDev} }{posSetCmd} - : $shutters->getPosCmd - ); -} - -sub getNoDelay { - my $self = shift; - - return $self->{ $self->{shuttersDev} }{noDelay}; -} - -sub getSelfDefenseState { - my $self = shift; - - return ( - defined( $self->{ $self->{shuttersDev} }{selfDefenseState} ) - ? $self->{ $self->{shuttersDev} }{selfDefenseState} - : 0 - ); -} - -sub getSelfDefenseAbsent { - my $self = shift; - - return $self->{ $self->{shuttersDev} }{selfDefenseAbsent}{active}; -} - -sub getSelfDefenseAbsentTimerrun { - my $self = shift; - - return $self->{ $self->{shuttersDev} }{selfDefenseAbsent}{timerrun}; -} - -sub getSelfDefenseAbsentTimerhash { - my $self = shift; - - return ( - defined( - $self->{ $self->{shuttersDev} }{selfDefenseAbsent}{timerhash} - ) - ? $self->{ $self->{shuttersDev} }{selfDefenseAbsent}{timerhash} - : undef - ); -} - -sub getLastDrive { - my $self = shift; - - $self->{ $self->{shuttersDev} }{lastDrive} = - ReadingsVal( $self->{shuttersDev}, 'ASC_ShuttersLastDrive', 'none' ) - if ( !defined( $self->{ $self->{shuttersDev} }{lastDrive} ) ); - - return $self->{ $self->{shuttersDev} }{lastDrive}; -} - -sub getLastPos -{ # letzte ermittelte Position bevor die Position des Rolladen über ASC geändert wurde - my $self = shift; - - return ( - defined( $self->{ $self->{shuttersDev} }{lastPos} ) - && defined( $self->{ $self->{shuttersDev} }{lastPos}{VAL} ) - ? $self->{ $self->{shuttersDev} }{lastPos}{VAL} - : 50 - ); -} - -sub getLastPosTimestamp { - my $self = shift; - - return ( - defined( $self->{ $self->{shuttersDev} } ) - && defined( $self->{ $self->{shuttersDev} }{lastPos} ) - && defined( $self->{ $self->{shuttersDev} }{lastPos}{TIME} ) - ? $self->{ $self->{shuttersDev} }{lastPos}{TIME} - : 0 - ); -} - -sub getLastManPos -{ # letzte ermittelte Position bevor die Position des Rolladen manuell (nicht über ASC) geändert wurde - my $self = shift; - - return ( - defined( $self->{ $self->{shuttersDev} }{lastManPos} ) - && defined( $self->{ $self->{shuttersDev} }{lastManPos}{VAL} ) - ? $self->{ $self->{shuttersDev} }{lastManPos}{VAL} - : 50 - ); -} - -sub getLastManPosTimestamp { - my $self = shift; - - return ( - defined( $self->{ $self->{shuttersDev} } ) - && defined( $self->{ $self->{shuttersDev} }{lastManPos} ) - && defined( $self->{ $self->{shuttersDev} }{lastManPos}{TIME} ) - ? $self->{ $self->{shuttersDev} }{lastManPos}{TIME} - : 0 - ); -} - -sub getInTimerFuncHash { - my $self = shift; - - return $self->{ $self->{shuttersDev} }{inTimerFuncHash}; -} - -sub getSunsetUnixTime { - my $self = shift; - - return $self->{ $self->{shuttersDev} }{sunsettime}; -} - -sub getSunset { - my $self = shift; - - return ( - defined( $self->{ $self->{shuttersDev} }{sunset} ) - ? $self->{ $self->{shuttersDev} }{sunset} - : 0 - ); -} - -sub getSunriseUnixTime { - my $self = shift; - - return $self->{ $self->{shuttersDev} }{sunrisetime}; -} - -sub getSunrise { - my $self = shift; - - return ( - defined( $self->{ $self->{shuttersDev} }{sunrise} ) - ? $self->{ $self->{shuttersDev} }{sunrise} - : 0 - ); -} - -sub getRoommatesStatus { - my $self = shift; - - my $loop = 0; - my @roState; - my %statePrio = ( - 'asleep' => 1, - 'gotosleep' => 2, - 'awoken' => 3, - 'home' => 4, - 'absent' => 5, - 'gone' => 6, - 'none' => 7 - ); - my $minPrio = 10; - - for my $ro ( split( ",", $shutters->getRoommates ) ) { - $shutters->setRoommate($ro); - my $currentPrio = $statePrio{ $shutters->_getRoommateStatus }; - $minPrio = $currentPrio if ( $minPrio > $currentPrio ); - } - - my %revStatePrio = reverse %statePrio; - return $revStatePrio{$minPrio}; -} - -sub getRoommatesLastStatus { - my $self = shift; - - my $loop = 0; - my @roState; - my %statePrio = ( - 'asleep' => 1, - 'gotosleep' => 2, - 'awoken' => 3, - 'home' => 6, - 'absent' => 5, - 'gone' => 4, - 'none' => 7 - ); - my $minPrio = 10; - - for my $ro ( split( ",", $shutters->getRoommates ) ) { - $shutters->setRoommate($ro); - my $currentPrio = $statePrio{ $shutters->_getRoommateLastStatus }; - $minPrio = $currentPrio if ( $minPrio > $currentPrio ); - } - - my %revStatePrio = reverse %statePrio; - return $revStatePrio{$minPrio}; -} - -sub getOutTemp { - my $self = shift; - - return ReadingsVal( $shutters->_getTempSensor, - $shutters->getTempSensorReading, -100 ); -} - -sub getIdleDetection { - my $self = shift; - - return ReadingsVal( $self->{shuttersDev}, - $shutters->_getIdleDetectionReading, 'none' ); -} - -### Begin Beschattung Objekt mit Daten befüllen -sub setShadingStatus { - my $self = shift; - my $value = shift; ### Werte für value = in, out, in reserved, out reserved - - return - if ( defined($value) - && exists( $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} ) - && $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} eq $value ); - - $shutters->setShadingLastStatus( ( $value eq 'in' ? 'out' : 'in' ) ) - if ( $value eq 'in' - || $value eq 'out' ); - - $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} = $value - if ( defined($value) ); - $self->{ $self->{shuttersDev} }{ShadingStatus}{TIME} = int( gettimeofday() ) - if ( defined( $self->{ $self->{shuttersDev} }{ShadingStatus} ) ); - - return; -} - -sub setShadingLastStatus { - my $self = shift; - my $value = shift; ### Werte für value = in, out - - return - if ( defined($value) - && exists( $self->{ $self->{shuttersDev} }{ShadingLastStatus}{VAL} ) - && $self->{ $self->{shuttersDev} }{ShadingLastStatus}{VAL} eq $value ); - - $self->{ $self->{shuttersDev} }{ShadingLastStatus}{VAL} = $value - if ( defined($value) ); - $self->{ $self->{shuttersDev} }{ShadingLastStatus}{TIME} = - int( gettimeofday() ) - if ( defined( $self->{ $self->{shuttersDev} }{ShadingLastStatus} ) ); - $self->{ $self->{shuttersDev} }{ShadingManualDriveStatus}{VAL} = 0 - if ( $value eq 'out' ); - - return; -} - -sub setShadingManualDriveStatus { - my $self = shift; - my $value = shift; ### Werte für value = 0, 1 - - $self->{ $self->{shuttersDev} }{ShadingManualDriveStatus}{VAL} = $value - if ( defined($value) ); - - return; -} - -sub setWindProtectionStatus { # Werte protected, unprotected - my $self = shift; - my $value = shift; - - $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{VAL} = $value - if ( defined($value) ); - - return; -} - -sub setRainProtectionStatus { # Werte protected, unprotected - my $self = shift; - my $value = shift; - - $self->{ $self->{shuttersDev} }->{RainProtection}->{VAL} = $value - if ( defined($value) ); - return; -} - -sub setExternalTriggerState { - my $self = shift; - my $value = shift; - - $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{event} = $value - if ( defined($value) ); - - return; -} - -sub setPushBrightnessInArray { - my $self = shift; - my $value = shift; - - unshift( - @{ $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL} }, - $value - ); - pop( @{ $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL} } ) - if ( - scalar( - @{ - $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL} - } - ) > $shutters->getMaxBrightnessAverageArrayObjects - ); - - return; -} - -sub getBrightnessAverage { - my $self = shift; - - return FHEM::AutoShuttersControl::_averageBrightness( - @{ $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL} } ) - if ( - ref( $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL} ) - eq 'ARRAY' - && scalar( - @{ - $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL} - } - ) > 0 - ); - - return; -} - -sub getShadingStatus { # Werte für value = in, out, in reserved, out reserved - my $self = shift; - - return ( - defined( $self->{ $self->{shuttersDev} }{ShadingStatus} ) - && defined( $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} ) - ? $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} - : 'out' - ); -} - -sub getShadingLastStatus { # Werte für value = in, out - my $self = shift; - - return ( - defined( $self->{ $self->{shuttersDev} }{ShadingLastStatus} ) - && defined( $self->{ $self->{shuttersDev} }{ShadingLastStatus}{VAL} ) - ? $self->{ $self->{shuttersDev} }{ShadingLastStatus}{VAL} - : 'out' - ); -} - -sub getShadingManualDriveStatus { # Werte für value = 0, 1 - my $self = shift; - - return ( - defined( $self->{ $self->{shuttersDev} }{ShadingManualDriveStatus} ) - && defined( - $self->{ $self->{shuttersDev} }{ShadingManualDriveStatus}{VAL} - ) - ? $self->{ $self->{shuttersDev} }{ShadingManualDriveStatus}{VAL} - : 0 - ); -} - -sub getIfInShading { - my $self = shift; - - return ( - ( - $shutters->getShadingMode ne 'off' - && $shutters->getShadingLastStatus eq 'out' - ) ? 1 : 0 - ); -} - -sub getWindProtectionStatus { # Werte protected, unprotected - my $self = shift; - - return ( - ( - defined( $self->{ $self->{shuttersDev} }->{ASC_WindParameters} ) - && defined( - $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{VAL} - ) - ) - ? $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{VAL} - : 'unprotected' - ); -} - -sub getRainProtectionStatus { # Werte protected, unprotected - my $self = shift; - - return ( - ( - defined( $self->{ $self->{shuttersDev} }->{RainProtection} ) - && defined( - $self->{ $self->{shuttersDev} }->{RainProtection}->{VAL} - ) - ) - ? $self->{ $self->{shuttersDev} }->{RainProtection}->{VAL} - : 'unprotected' - ); -} - -sub getShadingStatusTimestamp { - my $self = shift; - - return ( - defined( $self->{ $self->{shuttersDev} } ) - && defined( $self->{ $self->{shuttersDev} }{ShadingStatus} ) - && defined( $self->{ $self->{shuttersDev} }{ShadingStatus}{TIME} ) - ? $self->{ $self->{shuttersDev} }{ShadingStatus}{TIME} - : 0 - ); -} - -sub getShadingLastStatusTimestamp { - my $self = shift; - - return ( - defined( $self->{ $self->{shuttersDev} } ) - && defined( $self->{ $self->{shuttersDev} }{ShadingLastStatus} ) - && defined( $self->{ $self->{shuttersDev} }{ShadingLastStatus}{TIME} ) - ? $self->{ $self->{shuttersDev} }{ShadingLastStatus}{TIME} - : 0 - ); -} -### Ende Beschattung - -## Subklasse Attr von ASC_Shutters## -package ASC_Shutters::Attr; - -use strict; -use warnings; -use utf8; - -use GPUtils qw(GP_Import); - -## Import der FHEM Funktionen -BEGIN { - GP_Import( - qw( - AttrVal - CommandAttr - gettimeofday) - ); -} - -sub _setAttributs { - my $shuttersDev = shift; - my $attr = shift; - my $attrVal = shift; - - CommandAttr( undef, $shuttersDev . ' ' . $attr . ' ' . $attrVal ); - - return; -} - -sub _getPosition { - my $self = shift; - - my $attr = shift; - my $userAttrList = shift; - - return $self->{ $self->{shuttersDev} }->{$attr}->{position} - if ( - exists( $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} ) < 2 - ); - $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} = - int( gettimeofday() ); - - my $position; - my $posAssignment; - - if ( - AttrVal( $self->{shuttersDev}, $attr, - $userAttrList{$userAttrList} - [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] ) =~ - m{\A\{.+\}\z}xms - ) - { - my $response = FHEM::AutoShuttersControl::_perlCodeCheck( - AttrVal( - $self->{shuttersDev}, - $attr, - $userAttrList{$userAttrList} - [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] - ) - ); - - ( $position, $posAssignment ) = split ':', $response; - - $position = ( - $position =~ m{\A\d+(\.\d+)?\z}xms - ? $position - : $userAttrList{$userAttrList} - [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] - ); - - $posAssignment = ( - $posAssignment =~ m{\A\d+(\.\d+)?\z}xms - ? $posAssignment - : 'none' - ); - } - else { - ( $position, $posAssignment ) = - FHEM::AutoShuttersControl::GetAttrValues( - $self->{shuttersDev}, - $attr, - $userAttrList{$userAttrList} - [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] - ); - } - - ### erwartetes Ergebnis - # DEVICE:READING - $self->{ $self->{shuttersDev} }->{$attr}->{position} = $position; - $self->{ $self->{shuttersDev} }->{$attr}->{posAssignment} = - $posAssignment; - - return $self->{ $self->{shuttersDev} }->{$attr}->{position}; - - if ( - defined( - FHEM::AutoShuttersControl::_perlCodeCheck( - $self->{ $self->{shuttersDev} }->{$attr}->{position} - ) - ) - ) - { - $self->{ $self->{shuttersDev} }->{$attr}->{position} = - FHEM::AutoShuttersControl::_perlCodeCheck( - $self->{ $self->{shuttersDev} }->{$attr}->{position} ); - } - - return ( - $self->{ $self->{shuttersDev} }->{$attr}->{position} =~ - m{^\d+(\.\d+)?$}xms - ? $self->{ $self->{shuttersDev} }->{$attr}->{position} - : $userAttrList{$userAttrList} - [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] - ); -} - -sub _getPositionAssignment { - my $self = shift; - - my $attr = shift; - my $getFn = shift; - - return $self->{ $self->{shuttersDev} }->{$attr}->{posAssignment} - if ( - exists( $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} ) < 2 - ); - $shutters->$getFn; - - return ( $self->{ $self->{shuttersDev} }->{$attr}->{posAssignment} ); -} - -sub setAntiFreezePos { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_Antifreeze_Pos', $attrVal ); - - return; -} - -sub getAntiFreezePos { - my $self = shift; - - return $shutters->_getPosition( 'ASC_Antifreeze_Pos', -'ASC_Antifreeze_Pos:5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100' - ); -} - -sub getAntiFreezePosAssignment { - my $self = shift; - - return $shutters->_getPositionAssignment( 'ASC_Antifreeze_Pos', - 'getAntiFreezePos' ); -} - -sub setShuttersPlace { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_ShuttersPlace', $attrVal ); - - return; -} - -sub getShuttersPlace { - my $self = shift; - - return AttrVal( $self->{shuttersDev}, 'ASC_ShuttersPlace', 'window' ); -} - -sub setSlatPosCmd { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_SlatPosCmd_SlatDevice', - $attrVal ); - - return; -} - -sub getSlatPosCmd { - my $self = shift; - - return $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice} - ->{poscmd} - if ( - exists( - $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice} - ->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice} - ->{LASTGETTIME} ) < 2 - ); - $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}->{LASTGETTIME} - = int( gettimeofday() ); - my ( $slatPosCmd, $slatDevice ) = - FHEM::AutoShuttersControl::GetAttrValues( $self->{shuttersDev}, - 'ASC_SlatPosCmd_SlatDevice', 'none:none' ); - - ## Erwartetes Ergebnis - # upTime:upBrightnessVal - - $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}->{poscmd} = - $slatPosCmd; - $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}->{device} = - $slatDevice; - - return $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice} - ->{poscmd}; -} - -sub getSlatDevice { - my $self = shift; - - return $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice} - ->{device} - if ( - exists( - $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice} - ->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice} - ->{LASTGETTIME} ) < 2 - ); - $shutters->getSlatPosCmd; - - return ( - $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}->{device} - ); -} - -sub setPrivacyUpTime { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_PrivacyUpValue_beforeDayOpen', - $attrVal ); - - return; -} - -sub getPrivacyUpTime { - my $self = shift; - - return $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} - ->{uptime} - if ( - exists( - $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} - ->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} - ->{LASTGETTIME} ) < 2 - ); - $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} - ->{LASTGETTIME} = int( gettimeofday() ); - my ( $upTime, $upBrightnessVal ) = - FHEM::AutoShuttersControl::GetAttrValues( $self->{shuttersDev}, - 'ASC_PrivacyUpValue_beforeDayOpen', '-1:-1' ); - - ## Erwartetes Ergebnis - # upTime:upBrightnessVal - - $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} - ->{uptime} = $upTime; - $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} - ->{upbrightnessval} = - ( $upBrightnessVal ne 'none' ? $upBrightnessVal : -1 ); - - $shutters->setPrivacyUpStatus(0) - if ( defined( $shutters->getPrivacyUpStatus ) - && $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} - ->{uptime} == -1 ); - - return $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} - ->{uptime}; -} - -sub getPrivacyUpBrightnessVal { - my $self = shift; - - return $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} - ->{upbrightnessval} - if ( - exists( - $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} - ->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} - ->{LASTGETTIME} ) < 2 - ); - $shutters->getPrivacyUpTime; - - return ( - defined( - $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} - ->{upbrightnessval} - ) - ? $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} - ->{upbrightnessval} - : -1 - ); -} - -sub setPrivacyDownTime { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, - 'ASC_PrivacyDownValue_beforeNightClose', $attrVal ); - - return; -} - -sub getPrivacyDownTime { - my $self = shift; - - return $self->{ $self->{shuttersDev} } - ->{ASC_PrivacyDownValue_beforeNightClose}->{downtime} - if ( - exists( - $self->{ $self->{shuttersDev} } - ->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} } - ->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME} ) < 2 - ); - $self->{ $self->{shuttersDev} }->{ASC_PrivacyDownValue_beforeNightClose} - ->{LASTGETTIME} = int( gettimeofday() ); - my ( $downTime, $downBrightnessVal ) = - FHEM::AutoShuttersControl::GetAttrValues( $self->{shuttersDev}, - 'ASC_PrivacyDownValue_beforeNightClose', '-1:-1' ); - - ## Erwartetes Ergebnis - # downTime:downBrightnessVal - - $self->{ $self->{shuttersDev} }->{ASC_PrivacyDownValue_beforeNightClose} - ->{downtime} = $downTime; - $self->{ $self->{shuttersDev} }->{ASC_PrivacyDownValue_beforeNightClose} - ->{downbrightnessval} = - ( $downBrightnessVal ne 'none' ? $downBrightnessVal : -1 ); - - $shutters->setPrivacyDownStatus(0) - if ( defined( $shutters->getPrivacyDownStatus ) - && $self->{ $self->{shuttersDev} } - ->{ASC_PrivacyDownValue_beforeNightClose}->{downtime} == -1 ); - - return $self->{ $self->{shuttersDev} } - ->{ASC_PrivacyDownValue_beforeNightClose}->{downtime}; -} - -sub getPrivacyDownBrightnessVal { - my $self = shift; - - return $self->{ $self->{shuttersDev} } - ->{ASC_PrivacyDownValue_beforeNightClose}->{downbrightnessval} - if ( - exists( - $self->{ $self->{shuttersDev} } - ->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} } - ->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME} ) < 2 - ); - $shutters->getPrivacyDownTime; - - return ( - defined( - $self->{ $self->{shuttersDev} } - ->{ASC_PrivacyDownValue_beforeNightClose}->{downbrightnessval} - ) - ? $self->{ $self->{shuttersDev} } - ->{ASC_PrivacyDownValue_beforeNightClose}->{downbrightnessval} - : -1 - ); -} - -sub setPrivacyUpPos { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_PrivacyUp_Pos', $attrVal ); - - return; -} - -sub getPrivacyUpPos { - my $self = shift; - - return $shutters->_getPosition( 'ASC_PrivacyUp_Pos', 'ASC_PrivacyUp_Pos' ); -} - -sub getPrivacyUpPositionAssignment { - my $self = shift; - - return $shutters->_getPositionAssignment( 'ASC_PrivacyUp_Pos', - 'getPrivacyUpPos' ); -} - -sub setPrivacyDownPos { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_PrivacyDown_Pos', $attrVal ); - - return; -} - -sub getPrivacyDownPos { - my $self = shift; - - return $shutters->_getPosition( 'ASC_PrivacyDown_Pos', - 'ASC_PrivacyDown_Pos' ); -} - -sub getPrivacyDownPositionAssignment { - my $self = shift; - - return $shutters->_getPositionAssignment( 'ASC_PrivacyDown_Pos', - 'getPrivacyDownPos' ); -} - -sub setSelfDefenseMode { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_Self_Defense_Mode', $attrVal ); - - return; -} - -sub getSelfDefenseMode { - my $self = shift; - - return AttrVal( $self->{shuttersDev}, 'ASC_Self_Defense_Mode', 'gone' ); -} - -sub setSelfDefenseAbsentDelay { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_Self_Defense_AbsentDelay', - $attrVal ); - - return; -} - -sub getSelfDefenseAbsentDelay { - my $self = shift; - - return AttrVal( $self->{shuttersDev}, 'ASC_Self_Defense_AbsentDelay', 300 ); -} - -sub setWiggleValue { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_WiggleValue', $attrVal ); - - return; -} - -sub getWiggleValue { - my $self = shift; - - return AttrVal( $self->{shuttersDev}, 'ASC_WiggleValue', 5 ); -} - -sub setAdv { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_Adv', $attrVal ); - - return; -} - -sub getAdv { - my $self = shift; - - return ( - AttrVal( $self->{shuttersDev}, 'ASC_Adv', 'off' ) eq 'on' - ? ( FHEM::AutoShuttersControl::_IsAdv == 1 ? 1 : 0 ) - : 0 - ); -} - -### Begin Beschattung -sub setShadingPos { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_Shading_Pos', $attrVal ); - - return; -} - -sub getShadingPos { - my $self = shift; - - return $shutters->_getPosition( 'ASC_Shading_Pos', - 'ASC_Shading_Pos:10,20,30,40,50,60,70,80,90,100' ); -} - -sub getShadingPositionAssignment { - my $self = shift; - - return $shutters->_getPositionAssignment( 'ASC_Shading_Pos', - 'getShadingPos' ); -} - -sub setShadingMode { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_Shading_Mode', $attrVal ); - - return; -} - -sub getShadingMode { - my $self = shift; - - return AttrVal( $self->{shuttersDev}, 'ASC_Shading_Mode', 'off' ); -} - -sub _getTempSensor { - my $self = shift; - - return $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{device} - if ( - exists( - $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} ) - < 2 - ); - $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} = - int( gettimeofday() ); - my ( $device, $reading ) = - FHEM::AutoShuttersControl::GetAttrValues( $self->{shuttersDev}, - 'ASC_TempSensor', 'none' ); - - ### erwartetes Ergebnis - # DEVICE:READING - $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{device} = $device; - $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{reading} = - ( $reading ne 'none' ? $reading : 'temperature' ); - - return $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{device}; -} - -sub getTempSensorReading { - my $self = shift; - - return $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{reading} - if ( - exists( - $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} ) - < 2 - ); - $shutters->_getTempSensor; - - return ( - defined( $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{reading} ) - ? $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{reading} - : 'temperature' - ); -} - -sub setIdleDetectionReading { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_Shutter_IdleDetection', - $attrVal ); - - return; -} - -sub _getIdleDetectionReading { - my $self = shift; - - return $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection} - ->{reading} - if ( - exists( - $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection} - ->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection} - ->{LASTGETTIME} ) < 2 - ); - $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}->{LASTGETTIME} - = int( gettimeofday() ); - my ( $reading, $value ) = - FHEM::AutoShuttersControl::GetAttrValues( $self->{shuttersDev}, - 'ASC_Shutter_IdleDetection', 'none' ); - - ### erwartetes Ergebnis - # READING:VALUE - $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}->{reading} = - $reading; - $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}->{value} = - $value; - - return $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection} - ->{reading}; -} - -sub getIdleDetectionValue { - my $self = shift; - - return $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}->{value} - if ( - exists( - $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection} - ->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection} - ->{LASTGETTIME} ) < 2 - ); - $shutters->_getIdleDetectionReading; - - return ( - defined( - $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection} - ->{value} - ) - ? $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}->{value} - : 'none' - ); -} - -sub setBrightnessSensor { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_BrightnessSensor', $attrVal ); - - return; -} - -sub _getBrightnessSensor { - my $self = shift; - - return $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{device} - if ( - exists( - $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor} - ->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor} - ->{LASTGETTIME} ) < 2 - ); - $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{LASTGETTIME} = - int( gettimeofday() ); - my ( $device, $reading, $max, $min ) = - FHEM::AutoShuttersControl::GetAttrValues( $self->{shuttersDev}, - 'ASC_BrightnessSensor', 'none' ); - - ### erwartetes Ergebnis - # DEVICE:READING MAX:MIN - $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{device} = $device; - $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{reading} = - ( $reading ne 'none' ? $reading : 'brightness' ); - $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{triggermin} = - ( $min ne 'none' ? $min : -1 ); - $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{triggermax} = - ( $max ne 'none' ? $max : -1 ); - - return $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{device}; -} - -sub getBrightnessReading { - my $self = shift; - - return $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{reading} - if ( - exists( - $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor} - ->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor} - ->{LASTGETTIME} ) < 2 - ); - $shutters->_getBrightnessSensor; - - return ( - defined( - $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{reading} - ) - ? $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{reading} - : 'brightness' - ); -} - -sub getShadingAzimuthLeft { - my $self = shift; - - return $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth} - ->{leftVal} - if ( - exists( - $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth} - ->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth} - ->{LASTGETTIME} ) < 2 - ); - $shutters->getShadingAzimuthRight; - - return $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth} - ->{leftVal}; -} - -sub setShadingInOutAzimuth { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_Shading_InOutAzimuth', $attrVal ); - - return; -} - -sub getShadingAzimuthRight { - my $self = shift; - - return $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth} - ->{rightVal} - if ( - exists( - $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth} - ->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth} - ->{LASTGETTIME} ) < 2 - ); - $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}->{LASTGETTIME} - = int( gettimeofday() ); - my ( $left, $right ) = - FHEM::AutoShuttersControl::GetAttrValues( $self->{shuttersDev}, - 'ASC_Shading_InOutAzimuth', '95:265' ); - - ### erwartetes Ergebnis - # MIN:MAX - - $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}->{leftVal} = - $left; - $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}->{rightVal} = - $right; - - return $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth} - ->{rightVal}; -} - -sub setShadingMinOutsideTemperature { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_Shading_Min_OutsideTemperature', - $attrVal ); - - return; -} - -sub getShadingMinOutsideTemperature { - my $self = shift; - - return AttrVal( $self->{shuttersDev}, 'ASC_Shading_Min_OutsideTemperature', - 18 ); -} - -sub setShadingMinMaxElevation { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_Shading_MinMax_Elevation', - $attrVal ); - - return; -} - -sub getShadingMinElevation { - my $self = shift; - - return $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation} - ->{minVal} - if ( - exists( - $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation} - ->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation} - ->{LASTGETTIME} ) < 2 - ); - $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation} - ->{LASTGETTIME} = int( gettimeofday() ); - my ( $min, $max ) = - FHEM::AutoShuttersControl::GetAttrValues( $self->{shuttersDev}, - 'ASC_Shading_MinMax_Elevation', '25.0:100.0' ); - - ### erwartetes Ergebnis - # MIN:MAX - - $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}->{minVal} = - $min; - $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}->{maxVal} = - ( $max ne 'none' ? $max : 100 ); - - return $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation} - ->{minVal}; -} - -sub getShadingMaxElevation { - my $self = shift; - - return $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation} - ->{maxVal} - if ( - exists( - $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation} - ->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation} - ->{LASTGETTIME} ) < 2 - ); - $shutters->getShadingMinElevation; - - return $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation} - ->{maxVal}; -} - -sub setShadingStateChangeSunnyCloudy { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_Shading_StateChange_SunnyCloudy', - $attrVal ); - - return; -} - -sub getShadingStateChangeSunny { - my $self = shift; - - return $self->{ $self->{shuttersDev} } - ->{ASC_Shading_StateChange_SunnyCloudy}->{sunny} - if ( - exists( - $self->{ $self->{shuttersDev} } - ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} } - ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} ) < 2 - ); - $self->{ $self->{shuttersDev} }->{ASC_Shading_StateChange_SunnyCloudy} - ->{LASTGETTIME} = int( gettimeofday() ); - my ( $sunny, $cloudy, $maxBrightnessAverageArrayObjects ) = - FHEM::AutoShuttersControl::GetAttrValues( $self->{shuttersDev}, - 'ASC_Shading_StateChange_SunnyCloudy', - '35000:20000' ); - - ### erwartetes Ergebnis - # SUNNY:CLOUDY [BrightnessAverage] - - $self->{ $self->{shuttersDev} }->{ASC_Shading_StateChange_SunnyCloudy} - ->{sunny} = $sunny; - $self->{ $self->{shuttersDev} }->{ASC_Shading_StateChange_SunnyCloudy} - ->{cloudy} = $cloudy; - $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{MAXOBJECT} = ( - defined($maxBrightnessAverageArrayObjects) - && $maxBrightnessAverageArrayObjects ne 'none' - ? $maxBrightnessAverageArrayObjects - : 3 - ); - - return $self->{ $self->{shuttersDev} } - ->{ASC_Shading_StateChange_SunnyCloudy}->{sunny}; -} - -sub getShadingStateChangeCloudy { - my $self = shift; - - return $self->{ $self->{shuttersDev} } - ->{ASC_Shading_StateChange_SunnyCloudy}->{cloudy} - if ( - exists( - $self->{ $self->{shuttersDev} } - ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} } - ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} ) < 2 - ); - $shutters->getShadingStateChangeSunny; - - return $self->{ $self->{shuttersDev} } - ->{ASC_Shading_StateChange_SunnyCloudy}->{cloudy}; -} - -sub getMaxBrightnessAverageArrayObjects { - my $self = shift; - - return $self->{ $self->{shuttersDev} }->{BrightnessAverageArray} - ->{MAXOBJECT} - if ( - exists( - $self->{ $self->{shuttersDev} } - ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} } - ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} ) < 2 - ); - $shutters->getShadingStateChangeSunny; - - return $self->{ $self->{shuttersDev} }->{BrightnessAverageArray} - ->{MAXOBJECT}; -} - -sub setShadingWaitingPeriod { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_Shading_WaitingPeriod', - $attrVal ); - - return; -} - -sub getShadingWaitingPeriod { - my $self = shift; - - return AttrVal( $self->{shuttersDev}, 'ASC_Shading_WaitingPeriod', 1200 ); -} -### Ende Beschattung -sub setExternalTrigger { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_ExternalTrigger', $attrVal ); - - return; -} - -sub getExternalTriggerDevice { - my $self = shift; - - return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{device} - if ( - exists( - $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} - ->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} - ->{LASTGETTIME} ) < 2 - ); - $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{LASTGETTIME} = - int( gettimeofday() ); - my ( $device, $reading, $valueActive, $valueInactive, $posActive, - $posInactive, $valueActive2, $posActive2 ) - = FHEM::AutoShuttersControl::GetAttrValues( $self->{shuttersDev}, - 'ASC_ExternalTrigger', 'none' ); - - ### erwartetes Ergebnis -# DEVICE:READING VALUEACTIVE:VALUEINACTIVE POSACTIVE:POSINACTIVE VALUEACTIVE2:POSACTIVE2 - - $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{device} = - $device; - $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{reading} = - $reading; - $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{valueactive} = - $valueActive; - $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{valueinactive} = - $valueInactive; - $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive} = - $posActive; - $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posinactive} = - ( $posInactive ne 'none' ? $posInactive : $shutters->getLastPos ); - $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{valueactive2} = - $valueActive2; - $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive2} = - $posActive2; - - return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{device}; - -} - -sub getExternalTriggerReading { - my $self = shift; - - return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{reading} - if ( - exists( - $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} - ->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} - ->{LASTGETTIME} ) < 2 - ); - $shutters->getExternalTriggerDevice; - - return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{reading}; -} - -sub getExternalTriggerValueActive { - my $self = shift; - - return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{valueactive} - if ( - exists( - $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} - ->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} - ->{LASTGETTIME} ) < 2 - ); - $shutters->getExternalTriggerDevice; - - return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} - ->{valueactive}; -} - -sub getExternalTriggerValueActive2 { - my $self = shift; - - return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} - ->{valueactive2} - if ( - exists( - $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} - ->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} - ->{LASTGETTIME} ) < 2 - ); - $shutters->getExternalTriggerDevice; - - return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} - ->{valueactive2}; -} - -sub getExternalTriggerValueInactive { - my $self = shift; - - return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} - ->{valueinactive} - if ( - exists( - $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} - ->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} - ->{LASTGETTIME} ) < 2 - ); - $shutters->getExternalTriggerDevice; - - return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} - ->{valueinactive}; -} - -sub getExternalTriggerPosActive { - my $self = shift; - - return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive} - if ( - exists( - $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} - ->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} - ->{LASTGETTIME} ) < 2 - ); - $shutters->getExternalTriggerDevice; - - return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive}; -} - -sub getExternalTriggerPosActive2 { - my $self = shift; - - return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive2} - if ( - exists( - $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} - ->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} - ->{LASTGETTIME} ) < 2 - ); - $shutters->getExternalTriggerDevice; - - return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive2}; -} - -sub getExternalTriggerPosInactive { - my $self = shift; - - return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posinactive} - if ( - exists( - $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} - ->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} - ->{LASTGETTIME} ) < 2 - ); - $shutters->getExternalTriggerDevice; - - return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} - ->{posinactive}; -} - -sub getExternalTriggerState { - my $self = shift; - - return ( - ( - defined( - $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{event} - ) - and - $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{event} - ) ? 1 : 0 - ); -} - -sub setDelay { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_Drive_Delay', $attrVal ); - - return; -} - -sub getDelay { - my $self = shift; - - my $val = AttrVal( $self->{shuttersDev}, 'ASC_Drive_Delay', -1 ); - return ( $val =~ m{^\d+$}xms ? $val : -1 ); -} - -sub setDelayStart { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_Drive_DelayStart', $attrVal ); - - return; -} - -sub getDelayStart { - my $self = shift; - - my $val = AttrVal( $self->{shuttersDev}, 'ASC_Drive_DelayStart', -1 ); - return ( ( $val > 0 && $val =~ m{^\d+$}xms ) ? $val : -1 ); -} - -sub setBlockingTimeAfterManual { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_BlockingTime_afterManual', - $attrVal ); - - return; -} - -sub getBlockingTimeAfterManual { - my $self = shift; - - return AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_afterManual', - 1200 ); -} - -sub setBlockingTimeBeforNightClose { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_BlockingTime_beforNightClose', - $attrVal ); - - return; -} - -sub getBlockingTimeBeforNightClose { - my $self = shift; - - return AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_beforNightClose', - 3600 ); -} - -sub setBlockingTimeBeforDayOpen { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_BlockingTime_beforDayOpen', - $attrVal ); - - return; -} - -sub getBlockingTimeBeforDayOpen { - my $self = shift; - - return AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_beforDayOpen', - 3600 ); -} - -sub setPosCmd { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_Pos_Reading', $attrVal ); - - return; -} - -sub getPosCmd { - my $self = shift; - - return AttrVal( $self->{shuttersDev}, 'ASC_Pos_Reading', - $userAttrList{'ASC_Pos_Reading'} - [ AttrVal( $self->{shuttersDev}, 'ASC', 1 ) ] ); -} - -sub setOpenPos { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_Open_Pos', $attrVal ); - - return; -} - -sub getOpenPos { - my $self = shift; - - return $shutters->_getPosition( 'ASC_Open_Pos', - 'ASC_Open_Pos:0,10,20,30,40,50,60,70,80,90,100' ); -} - -sub getOpenPositionAssignment { - my $self = shift; - - return $shutters->_getPositionAssignment( 'ASC_Open_Pos', 'getOpenPos' ); -} - -sub setVentilatePos { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_Ventilate_Pos', $attrVal ); - - return; -} - -sub getVentilatePos { - my $self = shift; - - return $shutters->_getPosition( 'ASC_Ventilate_Pos', - 'ASC_Ventilate_Pos:10,20,30,40,50,60,70,80,90,100' ); -} - -sub getVentilatePositionAssignment { - my $self = shift; - - return $shutters->_getPositionAssignment( 'ASC_Ventilate_Pos', - 'getVentilatePos' ); -} - -sub setVentilatePosAfterDayClosed { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_WindowRec_PosAfterDayClosed', - $attrVal ); - - return; -} - -sub getVentilatePosAfterDayClosed { - my $self = shift; - - return AttrVal( $self->{shuttersDev}, 'ASC_WindowRec_PosAfterDayClosed', - 'open' ); -} - -sub setClosedPos { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_Closed_Pos', $attrVal ); - - return; -} - -sub getClosedPos { - my $self = shift; - - return $shutters->_getPosition( 'ASC_Closed_Pos', - 'ASC_Closed_Pos:0,10,20,30,40,50,60,70,80,90,100' ); -} - -sub getClosedPositionAssignment { - my $self = shift; - - return $shutters->_getPositionAssignment( 'ASC_Closed_Pos', - 'getClosedPos' ); -} - -sub setSleepPos { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_Sleep_Pos', $attrVal ); - - return; -} - -sub getSleepPos { - my $self = shift; - - return $shutters->_getPosition( 'ASC_Sleep_Pos', - 'ASC_Sleep_Pos:0,10,20,30,40,50,60,70,80,90,100' ); -} - -sub getSleepPositionAssignment { - my $self = shift; - - return $shutters->_getPositionAssignment( 'ASC_Sleep_Pos', 'getSleepPos' ); -} - -sub setVentilateOpen { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_Ventilate_Window_Open', - $attrVal ); - - return; -} - -sub getVentilateOpen { - my $self = shift; - - return AttrVal( $self->{shuttersDev}, 'ASC_Ventilate_Window_Open', 'on' ); -} - -sub setComfortOpenPos { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_ComfortOpen_Pos', $attrVal ); - - return; -} - -sub getComfortOpenPos { - my $self = shift; - - return $shutters->_getPosition( 'ASC_ComfortOpen_Pos', - 'ASC_ComfortOpen_Pos:0,10,20,30,40,50,60,70,80,90,100' ); -} - -sub getComfortOpenPositionAssignment { - my $self = shift; - - return $shutters->_getPositionAssignment( 'ASC_ComfortOpen_Pos', - 'getComfortOpenPos' ); -} - -sub setPartyMode { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_Partymode', $attrVal ); - - return; -} - -sub getPartyMode { - my $self = shift; - - return AttrVal( $self->{shuttersDev}, 'ASC_Partymode', 'off' ); -} - -sub setRoommates { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_Roommate_Device', $attrVal ); - - return; -} - -sub getRoommates { - my $self = shift; - - return AttrVal( $self->{shuttersDev}, 'ASC_Roommate_Device', 'none' ); -} - -sub setRoommatesReading { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_Roommate_Reading', $attrVal ); - - return; -} - -sub getRoommatesReading { - my $self = shift; - - return AttrVal( $self->{shuttersDev}, 'ASC_Roommate_Reading', 'state' ); -} - -sub getWindPos { - my $self = shift; - - my $name = $self->{name}; - - return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{closedPos} - if ( - exists( - $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME} - ) < 2 - ); - $shutters->getWindMax; - - return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{closedPos}; -} - -sub getWindMax { - my $self = shift; - - my $name = $self->{name}; - - return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggermax} - if ( - exists( - $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME} - ) < 2 - ); - $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME} = - int( gettimeofday() ); - my ( $max, $hyst, $pos ) = - FHEM::AutoShuttersControl::GetAttrValues( $self->{shuttersDev}, - 'ASC_WindParameters', '50:20' ); - - ## Erwartetes Ergebnis - # max:hyst pos - - $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggermax} = $max; - $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggerhyst} = - ( $hyst ne 'none' ? $max - $hyst : $max - 20 ); - $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{closedPos} = - ( $pos ne 'none' ? $pos : $shutters->getOpenPos ); - - return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggermax}; -} - -sub setWindParameters { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_WindParameters', $attrVal ); - - return; -} - -sub getWindMin { - my $self = shift; - - my $name = $self->{name}; - - return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggerhyst} - if ( - exists( - $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME} - ) < 2 - ); - $shutters->getWindMax; - - return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggerhyst}; -} - -sub setWindProtection { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_WindProtection', $attrVal ); - - return; -} - -sub getWindProtection { - my $self = shift; - - return AttrVal( $self->{shuttersDev}, 'ASC_WindProtection', 'off' ); -} - -sub setRainProtection { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_RainProtection', $attrVal ); - - return; -} - -sub getRainProtection { - my $self = shift; - - return AttrVal( $self->{shuttersDev}, 'ASC_RainProtection', 'off' ); -} - -sub setModeUp { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_Mode_Up', $attrVal ); - - return; -} - -sub getModeUp { - my $self = shift; - - return AttrVal( $self->{shuttersDev}, 'ASC_Mode_Up', 'always' ); -} - -sub setModeDown { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_Mode_Down', $attrVal ); - - return; -} - -sub getModeDown { - my $self = shift; - - return AttrVal( $self->{shuttersDev}, 'ASC_Mode_Down', 'always' ); -} - -sub setLockOut { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_LockOut', $attrVal ); - - return; -} - -sub getLockOut { - my $self = shift; - - return AttrVal( $self->{shuttersDev}, 'ASC_LockOut', 'off' ); -} - -sub setLockOutCmd { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_LockOut_Cmd', $attrVal ); - - return; -} - -sub getLockOutCmd { - my $self = shift; - - return AttrVal( $self->{shuttersDev}, 'ASC_LockOut_Cmd', 'none' ); -} - -sub setAntiFreeze { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_Antifreeze', $attrVal ); - - return; -} - -sub getAntiFreeze { - my $self = shift; - - return AttrVal( $self->{shuttersDev}, 'ASC_Antifreeze', 'off' ); -} - -sub setAutoAstroModeMorning { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_AutoAstroModeMorning', $attrVal ); - - return; -} - -sub getAutoAstroModeMorning { - my $self = shift; - - return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeMorning', 'none' ); -} - -sub setAutoAstroModeEvening { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_AutoAstroModeEvening', $attrVal ); - - return; -} - -sub getAutoAstroModeEvening { - my $self = shift; - - return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeEvening', 'none' ); -} - -sub setAutoAstroModeMorningHorizon { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_AutoAstroModeMorningHorizon', - $attrVal ); - - return; -} - -sub getAutoAstroModeMorningHorizon { - my $self = shift; - - return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeMorningHorizon', - 0 ); -} - -sub setAutoAstroModeEveningHorizon { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_AutoAstroModeEveningHorizon', - $attrVal ); - - return; -} - -sub getAutoAstroModeEveningHorizon { - my $self = shift; - - return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeEveningHorizon', - 0 ); -} - -sub setUp { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_Up', $attrVal ); - - return; -} - -sub getUp { - my $self = shift; - - return AttrVal( $self->{shuttersDev}, 'ASC_Up', 'astro' ); -} - -sub setDown { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_Down', $attrVal ); - - return; -} - -sub getDown { - my $self = shift; - - return AttrVal( $self->{shuttersDev}, 'ASC_Down', 'astro' ); -} - -sub setTimeUpEarly { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_Time_Up_Early', $attrVal ); - - return; -} - -sub getTimeUpEarly { - my $self = shift; - - my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_Early', '05:00' ); - - if ( defined( FHEM::AutoShuttersControl::_perlCodeCheck($val) ) ) { - $val = FHEM::AutoShuttersControl::_perlCodeCheck($val); - } - - return ( - $val =~ m{^(?:[01]?\d|2[0-3]):(?:[0-5]\d)(:(?:[0-5]\d))?$}xms - ? $val - : '05:00' - ); -} - -sub setTimeUpLate { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_Time_Up_Late', $attrVal ); - - return; -} - -sub getTimeUpLate { - my $self = shift; - - my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_Late', '08:30' ); - - if ( defined( FHEM::AutoShuttersControl::_perlCodeCheck($val) ) ) { - $val = FHEM::AutoShuttersControl::_perlCodeCheck($val); - } - - return ( - $val =~ m{^(?:[01]?\d|2[0-3]):(?:[0-5]\d)(:(?:[0-5]\d))?$}xms - ? $val - : '08:30' - ); -} - -sub setTimeDownEarly { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_Time_Down_Early', $attrVal ); - - return; -} - -sub getTimeDownEarly { - my $self = shift; - - my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Down_Early', '16:00' ); - - if ( defined( FHEM::AutoShuttersControl::_perlCodeCheck($val) ) ) { - $val = FHEM::AutoShuttersControl::_perlCodeCheck($val); - } - - return ( - $val =~ m{^(?:[01]?\d|2[0-3]):(?:[0-5]\d)(:(?:[0-5]\d))?$}xms - ? $val - : '16:00' - ); -} - -sub setTimeDownLate { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_Time_Down_Late', $attrVal ); - - return; -} - -sub getTimeDownLate { - my $self = shift; - - my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Down_Late', '22:00' ); - - if ( defined( FHEM::AutoShuttersControl::_perlCodeCheck($val) ) ) { - $val = FHEM::AutoShuttersControl::_perlCodeCheck($val); - } - - return ( - $val =~ m{^(?:[01]?\d|2[0-3]):(?:[0-5]\d)(:(?:[0-5]\d))?$}xms - ? $val - : '22:00' - ); -} - -sub setTimeUpWeHoliday { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_Time_Up_WE_Holiday', $attrVal ); - - return; -} - -sub getTimeUpWeHoliday { - my $self = shift; - - my $val = - AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_WE_Holiday', '01:25' ); - - if ( defined( FHEM::AutoShuttersControl::_perlCodeCheck($val) ) ) { - $val = FHEM::AutoShuttersControl::_perlCodeCheck($val); - } - - return ( - $val =~ m{^(?:[01]?\d|2[0-3]):(?:[0-5]\d)(:(?:[0-5]\d))?$}xms - ? $val - : '01:25' - ); -} - -sub getBrightnessMinVal { - my $self = shift; - - return $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{triggermin} - if ( - exists( - $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor} - ->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor} - ->{LASTGETTIME} ) < 2 - ); - $shutters->_getBrightnessSensor; - - return $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor} - ->{triggermin}; -} - -sub getBrightnessMaxVal { - my $self = shift; - - return $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{triggermax} - if ( - exists( - $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor} - ->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor} - ->{LASTGETTIME} ) < 2 - ); - $shutters->_getBrightnessSensor; - - return $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor} - ->{triggermax}; -} - -sub setDriveUpMaxDuration { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_DriveUpMaxDuration', $attrVal ); - - return; -} - -sub getDriveUpMaxDuration { - my $self = shift; - - return AttrVal( $self->{shuttersDev}, 'ASC_DriveUpMaxDuration', 60 ); -} - -## Subklasse Readings von ASC_Shutters ## -package ASC_Shutters::Readings; - -use strict; -use warnings; -use utf8; - -use GPUtils qw(GP_Import); - -## Import der FHEM Funktionen -BEGIN { - GP_Import( - qw( - ReadingsVal - ReadingsNum) - ); -} - -sub getBrightness { - my $self = shift; - - return ReadingsNum( $shutters->_getBrightnessSensor, - $shutters->getBrightnessReading, -1 ); -} - -sub getWindStatus { - my $self = shift; - - return ReadingsVal( $ascDev->_getWindSensor, - $ascDev->getWindSensorReading, -1 ); -} - -sub getStatus { - my $self = shift; - - return ReadingsNum( $self->{shuttersDev}, $shutters->getPosCmd, 0 ); -} - -sub getDelayCmd { - my $self = shift; - - return $self->{ $self->{shuttersDev} }{delayCmd}; -} - -sub getASCenable { - my $self = shift; - - return ReadingsVal( $self->{shuttersDev}, 'ASC_Enable', 'on' ); -} - -## Klasse Fenster (Window) und die Subklassen Attr und Readings ## -package ASC_Window; - -use strict; -use warnings; -use utf8; - -our @ISA = qw(ASC_Window::Attr ASC_Window::Readings); - -## Subklasse Attr von Klasse ASC_Window ## -package ASC_Window::Attr; - -use strict; -use warnings; -use utf8; - -use GPUtils qw(GP_Import); - -## Import der FHEM Funktionen -BEGIN { - GP_Import( - qw( - AttrVal - gettimeofday) - ); -} - -sub setSubTyp { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_WindowRec_subType', $attrVal ); - - return; -} - -sub getSubTyp { - my $self = shift; - - return AttrVal( $self->{shuttersDev}, 'ASC_WindowRec_subType', 'twostate' ); -} - -sub setWinDev { - my $self = shift; - my $attrVal = shift; - - _setAttributs( $self->{shuttersDev}, 'ASC_WindowRec', $attrVal ); - - return; -} - -sub _getWinDev { - my $self = shift; - - return $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{device} - if ( - exists( - $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} ) < - 2 - ); - $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} = - int( gettimeofday() ); - my ( $device, $reading ) = - FHEM::AutoShuttersControl::GetAttrValues( $self->{shuttersDev}, - 'ASC_WindowRec', 'none' ); - - ### erwartetes Ergebnis - # DEVICE:READING VALUEACTIVE:VALUEINACTIVE POSACTIVE:POSINACTIVE - - $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{device} = - $device; - $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{reading} = - ( $reading ne 'none' ? $reading : 'state' ); - - return $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{device}; -} - -sub getWinDevReading { - my $self = shift; - - return $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{reading} - if ( - exists( - $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} - ) - && ( gettimeofday() - - $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} ) < - 2 - ); - $shutters->_getWinDev; - - return $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{reading}; -} - -## Subklasse Readings von Klasse ASC_Window ## -package ASC_Window::Readings; - -use strict; -use warnings; -use utf8; - -use GPUtils qw(GP_Import); - -## Import der FHEM Funktionen -BEGIN { - GP_Import( - qw( - ReadingsVal) - ); -} - -sub getWinStatus { - my $self = shift; - - return ReadingsVal( $shutters->_getWinDev, $shutters->getWinDevReading, - 'closed' ); -} - -## Klasse ASC_Roommate ## -package ASC_Roommate; - -use strict; -use warnings; -use utf8; - -use GPUtils qw(GP_Import); - -## Import der FHEM Funktionen -BEGIN { - GP_Import( - qw( - ReadingsVal) - ); -} - -sub _getRoommateStatus { - my $self = shift; - - my $roommate = $self->{roommate}; - - return ReadingsVal( $roommate, $shutters->getRoommatesReading, 'none' ); -} - -sub _getRoommateLastStatus { - my $self = shift; - - my $roommate = $self->{roommate}; - my $default = $self->{defaultarg}; - - $default = 'none' if ( !defined($default) ); - return ReadingsVal( $roommate, 'lastState', $default ); -} - -## Klasse ASC_Dev plus Subklassen ASC_Attr_Dev und ASC_Readings_Dev## -package ASC_Dev; -our @ISA = qw(ASC_Dev::Readings ASC_Dev::Attr); - -use strict; -use warnings; -use utf8; - -sub new { - my $class = shift; - - my $self = { name => undef, }; - - bless $self, $class; - return $self; -} - -sub setName { - my $self = shift; - my $name = shift; - - $self->{name} = $name if ( defined($name) ); - return $self->{name}; -} - -sub setDefault { - my $self = shift; - my $defaultarg = shift; - - $self->{defaultarg} = $defaultarg if ( defined($defaultarg) ); - return $self->{defaultarg}; -} - -sub getName { - my $self = shift; - return $self->{name}; -} - -## Subklasse Readings ## -package ASC_Dev::Readings; - -use strict; -use warnings; -use utf8; - -use GPUtils qw(GP_Import); - -## Import der FHEM Funktionen -BEGIN { - GP_Import( - qw( - readingsSingleUpdate - ReadingsVal - defs) - ); -} - -sub setDelayCmdReading { - my $self = shift; - - my $name = $self->{name}; - my $hash = $defs{$name}; - - readingsSingleUpdate( $hash, - $shutters->getShuttersDev . '_lastDelayPosValue', - $shutters->getDelayCmd, 1 ); - return; -} - -sub setStateReading { - my $self = shift; - my $value = shift; - - my $name = $self->{name}; - my $hash = $defs{$name}; - - readingsSingleUpdate( $hash, 'state', - ( defined($value) ? $value : $shutters->getLastDrive ), 1 ); - return; -} - -sub setPosReading { - my $self = shift; - - my $name = $self->{name}; - my $hash = $defs{$name}; - - readingsSingleUpdate( $hash, $shutters->getShuttersDev . '_PosValue', - $shutters->getStatus, 1 ); - return; -} - -sub setLastPosReading { - my $self = shift; - - my $name = $self->{name}; - my $hash = $defs{$name}; - - readingsSingleUpdate( $hash, $shutters->getShuttersDev . '_lastPosValue', - $shutters->getLastPos, 1 ); - return; -} - -sub getPartyMode { - my $self = shift; - - my $name = $self->{name}; - - return ReadingsVal( $name, 'partyMode', 'off' ); -} - -sub getHardLockOut { - my $self = shift; - - my $name = $self->{name}; - - return ReadingsVal( $name, 'hardLockOut', 'none' ); -} - -sub getSunriseTimeWeHoliday { - my $self = shift; - - my $name = $self->{name}; - - return ReadingsVal( $name, 'sunriseTimeWeHoliday', 'none' ); -} - -sub getMonitoredDevs { - my $self = shift; - - my $name = $self->{name}; - - $self->{monitoredDevs} = ReadingsVal( $name, '.monitoredDevs', 'none' ); - return $self->{monitoredDevs}; -} - -sub getOutTemp { - my $self = shift; - - return ReadingsVal( $ascDev->_getTempSensor, $ascDev->getTempSensorReading, - -100 ); -} - -sub getResidentsStatus { - my $self = shift; - - my $val = - ReadingsVal( $ascDev->_getResidentsDev, $ascDev->getResidentsReading, - 'none' ); - - if ( $val =~ m{^(?:(.+)_)?(.+)$}xms ) { - return ( $1, $2 ) if (wantarray); - return $1 && $1 eq 'pet' ? 'absent' : $2; - } - elsif ( - ReadingsVal( $ascDev->_getResidentsDev, 'homealoneType', '-' ) eq - 'PET' ) - { - return ( 'pet', 'absent' ) if (wantarray); - return 'absent'; - } - else { - return ( undef, $val ) if (wantarray); - return $val; - } -} - -sub getResidentsLastStatus { - my $self = shift; - - my $val = ReadingsVal( $ascDev->_getResidentsDev, 'lastState', 'none' ); - - if ( $val =~ m{^(?:(.+)_)?(.+)$}xms ) { - return ( $1, $2 ) if (wantarray); - return $1 && $1 eq 'pet' ? 'absent' : $2; - } - elsif ( - ReadingsVal( $ascDev->_getResidentsDev, 'lastHomealoneType', '-' ) eq - 'PET' ) - { - return ( 'pet', 'absent' ) if (wantarray); - return 'absent'; - } - else { - return ( undef, $val ) if (wantarray); - return $val; - } -} - -sub getAutoShuttersControlShading { - my $self = shift; - - my $name = $self->{name}; - - return ReadingsVal( $name, 'controlShading', 'none' ); -} - -sub getSelfDefense { - my $self = shift; - - my $name = $self->{name}; - - return ReadingsVal( $name, 'selfDefense', 'none' ); -} - -sub getAzimuth { - my $self = shift; - - my $azimuth; - - $azimuth = ReadingsVal( $ascDev->_getTwilightDevice, 'azimuth', -1 ) - if ( $defs{ $ascDev->_getTwilightDevice }->{TYPE} eq 'Twilight' ); - $azimuth = ReadingsVal( $ascDev->_getTwilightDevice, 'SunAz', -1 ) - if ( $defs{ $ascDev->_getTwilightDevice }->{TYPE} eq 'Astro' ); - - return $azimuth; -} - -sub getElevation { - my $self = shift; - - my $elevation; - - $elevation = ReadingsVal( $ascDev->_getTwilightDevice, 'elevation', -1 ) - if ( $defs{ $ascDev->_getTwilightDevice }->{TYPE} eq 'Twilight' ); - $elevation = ReadingsVal( $ascDev->_getTwilightDevice, 'SunAlt', -1 ) - if ( $defs{ $ascDev->_getTwilightDevice }->{TYPE} eq 'Astro' ); - - return $elevation; -} - -sub getASCenable { - my $self = shift; - - my $name = $self->{name}; - - return ReadingsVal( $name, 'ascEnable', 'none' ); -} - -## Subklasse Attr ## -package ASC_Dev::Attr; - -use strict; -use warnings; -use utf8; - -use GPUtils qw(GP_Import); - -## Import der FHEM Funktionen -BEGIN { - GP_Import( - qw( - AttrVal - gettimeofday) - ); -} - -sub getShuttersOffset { - my $self = shift; - - my $name = $self->{name}; - - return AttrVal( $name, 'ASC_shuttersDriveDelay', -1 ); -} - -sub getBrightnessMinVal { - my $self = shift; - - my $name = $self->{name}; - - return $self->{ASC_brightness}->{triggermin} - if ( exists( $self->{ASC_brightness}->{LASTGETTIME} ) - && ( gettimeofday() - $self->{ASC_brightness}->{LASTGETTIME} ) < 2 ); - $ascDev->getBrightnessMaxVal; - - return $self->{ASC_brightness}->{triggermin}; -} - -sub getBrightnessMaxVal { - my $self = shift; - - my $name = $self->{name}; - - return $self->{ASC_brightness}->{triggermax} - if ( exists( $self->{ASC_brightness}->{LASTGETTIME} ) - && ( gettimeofday() - $self->{ASC_brightness}->{LASTGETTIME} ) < 2 ); - $self->{ASC_brightness}->{LASTGETTIME} = int( gettimeofday() ); - - my ( $triggermax, $triggermin ) = - FHEM::AutoShuttersControl::GetAttrValues( $name, - 'ASC_brightnessDriveUpDown', '800:500' ); - - ## erwartetes Ergebnis - # max:min - - $self->{ASC_brightness}->{triggermin} = $triggermin; - $self->{ASC_brightness}->{triggermax} = $triggermax; - - return $self->{ASC_brightness}->{triggermax}; -} - -sub _getTwilightDevice { - my $self = shift; - - my $name = $self->{name}; - - return AttrVal( $name, 'ASC_twilightDevice', 'none' ); -} - -sub getAutoAstroModeEvening { - my $self = shift; - - my $name = $self->{name}; - - return AttrVal( $name, 'ASC_autoAstroModeEvening', 'REAL' ); -} - -sub getAutoAstroModeEveningHorizon { - my $self = shift; - - my $name = $self->{name}; - - return AttrVal( $name, 'ASC_autoAstroModeEveningHorizon', 0 ); -} - -sub getAutoAstroModeMorning { - my $self = shift; - - my $name = $self->{name}; - - return AttrVal( $name, 'ASC_autoAstroModeMorning', 'REAL' ); -} - -sub getAutoAstroModeMorningHorizon { - my $self = shift; - - my $name = $self->{name}; - - return AttrVal( $name, 'ASC_autoAstroModeMorningHorizon', 0 ); -} - -sub getAutoShuttersControlMorning { - my $self = shift; - - my $name = $self->{name}; - - return AttrVal( $name, 'ASC_autoShuttersControlMorning', 'on' ); -} - -sub getAutoShuttersControlEvening { - my $self = shift; - - my $name = $self->{name}; - - return AttrVal( $name, 'ASC_autoShuttersControlEvening', 'on' ); -} - -sub getAutoShuttersControlComfort { - my $self = shift; - - my $name = $self->{name}; - - return AttrVal( $name, 'ASC_autoShuttersControlComfort', 'off' ); -} - -sub getFreezeTemp { - my $self = shift; - - my $name = $self->{name}; - - return AttrVal( $name, 'ASC_freezeTemp', 3 ); -} - -sub getSlatDriveCmdInverse { - my $self = shift; - - my $name = $self->{name}; - - return AttrVal( $name, 'ASC_slatDriveCmdInverse', 0 ); -} - -sub _getTempSensor { - my $self = shift; - - my $name = $self->{name}; - - return $self->{ASC_tempSensor}->{device} - if ( exists( $self->{ASC_tempSensor}->{LASTGETTIME} ) - && ( gettimeofday() - $self->{ASC_tempSensor}->{LASTGETTIME} ) < 2 ); - $self->{ASC_tempSensor}->{LASTGETTIME} = int( gettimeofday() ); - my ( $device, $reading ) = - FHEM::AutoShuttersControl::GetAttrValues( $name, 'ASC_tempSensor', - 'none' ); - - ## erwartetes Ergebnis - # DEVICE:READING - $self->{ASC_tempSensor}->{device} = $device; - $self->{ASC_tempSensor}->{reading} = - ( $reading ne 'none' ? $reading : 'temperature' ); - - return $self->{ASC_tempSensor}->{device}; -} - -sub getTempSensorReading { - my $self = shift; - - my $name = $self->{name}; - - return $self->{ASC_tempSensor}->{reading} - if ( exists( $self->{ASC_tempSensor}->{LASTGETTIME} ) - && ( gettimeofday() - $self->{ASC_tempSensor}->{LASTGETTIME} ) < 2 ); - $ascDev->_getTempSensor; - return $self->{ASC_tempSensor}->{reading}; -} - -sub _getResidentsDev { - my $self = shift; - - my $name = $self->{name}; - - return $self->{ASC_residentsDev}->{device} - if ( exists( $self->{ASC_residentsDev}->{LASTGETTIME} ) - && ( gettimeofday() - $self->{ASC_residentsDev}->{LASTGETTIME} ) < 2 ); - $self->{ASC_residentsDev}->{LASTGETTIME} = int( gettimeofday() ); - my ( $device, $reading ) = - FHEM::AutoShuttersControl::GetAttrValues( $name, 'ASC_residentsDev', - 'none' ); - - $self->{ASC_residentsDev}->{device} = $device; - $self->{ASC_residentsDev}->{reading} = - ( $reading ne 'none' ? $reading : 'state' ); - - return $self->{ASC_residentsDev}->{device}; -} - -sub getResidentsReading { - my $self = shift; - - my $name = $self->{name}; - - return $self->{ASC_residentsDev}->{reading} - if ( exists( $self->{ASC_residentsDev}->{LASTGETTIME} ) - && ( gettimeofday() - $self->{ASC_residentsDev}->{LASTGETTIME} ) < 2 ); - $ascDev->_getResidentsDev; - return $self->{ASC_residentsDev}->{reading}; -} - -sub _getRainSensor { - my $self = shift; - - my $name = $self->{name}; - - return $self->{ASC_rainSensor}->{device} - if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} ) - && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 ); - $self->{ASC_rainSensor}->{LASTGETTIME} = int( gettimeofday() ); - my ( $device, $reading, $max, $hyst, $pos, $wait ) = - FHEM::AutoShuttersControl::GetAttrValues( $name, 'ASC_rainSensor', - 'none' ); - - ## erwartetes Ergebnis - # DEVICE:READING MAX:HYST - - return $device if ( $device eq 'none' ); - $self->{ASC_rainSensor}->{device} = $device; - $self->{ASC_rainSensor}->{reading} = - ( $reading ne 'none' ? $reading : 'state' ); - $self->{ASC_rainSensor}->{triggermax} = ( $max ne 'none' ? $max : 1000 ); - $self->{ASC_rainSensor}->{triggerhyst} = ( - $hyst ne 'none' - ? $max - $hyst - : ( $self->{ASC_rainSensor}->{triggermax} * 0 ) - ); - $self->{ASC_rainSensor}->{shuttersClosedPos} = - ( $pos ne 'none' ? $pos : $shutters->getClosedPos ); - $self->{ASC_rainSensor}->{waitingTime} = - ( $pos ne 'none' ? $wait : 900 ); - - return $self->{ASC_rainSensor}->{device}; -} - -sub getRainSensorReading { - my $self = shift; - - my $name = $self->{name}; - - return $self->{ASC_rainSensor}->{reading} - if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} ) - && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 ); - $ascDev->_getRainSensor; - return $self->{ASC_rainSensor}->{reading}; -} - -sub getRainTriggerMax { - my $self = shift; - - my $name = $self->{name}; - - return $self->{ASC_rainSensor}->{triggermax} - if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} ) - && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 ); - $ascDev->_getRainSensor; - return $self->{ASC_rainSensor}->{triggermax}; -} - -sub getRainTriggerMin { - my $self = shift; - - my $name = $self->{name}; - - return $self->{ASC_rainSensor}->{triggerhyst} - if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} ) - && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 ); - $ascDev->_getRainSensor; - return $self->{ASC_rainSensor}->{triggerhyst}; -} - -sub getRainSensorShuttersClosedPos { - my $self = shift; - - my $name = $self->{name}; - - return $self->{ASC_rainSensor}->{shuttersClosedPos} - if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} ) - && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 ); - $ascDev->_getRainSensor; - return $self->{ASC_rainSensor}->{shuttersClosedPos}; -} - -sub getRainWaitingTime { - my $self = shift; - - my $name = $self->{name}; - - return $self->{ASC_rainSensor}->{waitingTime} - if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} ) - && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 ); - $ascDev->_getRainSensor; - return $self->{ASC_rainSensor}->{waitingTime}; -} - -sub _getWindSensor { - my $self = shift; - - my $name = $self->{name}; - - return $self->{ASC_windSensor}->{device} - if ( exists( $self->{ASC_windSensor}->{LASTGETTIME} ) - && ( gettimeofday() - $self->{ASC_windSensor}->{LASTGETTIME} ) < 2 ); - $self->{ASC_windSensor}->{LASTGETTIME} = int( gettimeofday() ); - my ( $device, $reading ) = - FHEM::AutoShuttersControl::GetAttrValues( $name, 'ASC_windSensor', - 'none' ); - - return $device if ( $device eq 'none' ); - $self->{ASC_windSensor}->{device} = $device; - $self->{ASC_windSensor}->{reading} = - ( $reading ne 'none' ? $reading : 'wind' ); - - return $self->{ASC_windSensor}->{device}; -} - -sub getWindSensorReading { - my $self = shift; - - my $name = $self->{name}; - - return $self->{ASC_windSensor}->{reading} - if ( exists( $self->{ASC_windSensor}->{LASTGETTIME} ) - && ( gettimeofday() - $self->{ASC_windSensor}->{LASTGETTIME} ) < 2 ); - $ascDev->_getWindSensor; - return ( - defined( $self->{ASC_windSensor}->{reading} ) - ? $self->{ASC_windSensor}->{reading} - : 'wind' - ); -} - -sub getBlockAscDrivesAfterManual { - my $self = shift; - - my $name = $self->{name}; - - return AttrVal( $name, 'ASC_blockAscDrivesAfterManual', 0 ); -} 1; - -=pod -=item device -=item summary Module for controlling shutters depending on various conditions -=item summary_DE Modul zur automatischen Rolladensteuerung auf Basis bestimmter Ereignisse - - -=begin html - - -

    AutoShuttersControl

    -
      -

      - AutoShuttersControl (ASC) provides a complete automation for shutters with comprehensive - configuration options, e.g. open or close shutters depending on the sunrise or sunset, - by outdoor brightness or randomly for simulate presence. -
      - So that ASC can drive the blinds on the basis of the astronomical times, it is very important to - correctly set the location (latitude, longitude) in the device "global". -

      -

      - After telling ASC which shutters should be controlled, several in-depth configuration options - are provided. With these and in combination with a resident presence state, complex scenarios are possible: - For example, shutters could be opened if a resident awakes from sleep and the sun is already rosen. Or if a - closed window with shutters down is tilted, the shutters could be half opened for ventilation. - Many more is possible. -

      - - Define -
        -

        - define <name> AutoShuttersControl -

        - - Usage: -

        -

          - define myASControl AutoShuttersControl
          -
        -

        -

        - This creates an new AutoShuttersControl device, called myASControl.
        - Now was the new global attribute ASC added to the FHEM installation. - Each shutter that is to be controlled by AutoShuttersControl must now have the attribute ASC set to 1 or 2. - The value 1 is to be used with devices whose state is given as position (i.e. ROLLO or Siro, shutters - openend is 0, shutters closed is 100), 2 with devices whose state is given as percent closed (i.e. HomeMatic, - shutters opened is 100, closed is 0). -

        -

        - After setting the attributes to all devices who should be controlled, the automatic scan at the main device - can be started for example with
        - set myASControl scanForShutters -

        -
      -
      - - Readings -
        -

        Within the ASC device:

        -
          -
        • ..._nextAstroTimeEvent - Next astro event: sunrise, sunset or fixed time
        • -
        • ..._PosValue - current position
        • -
        • ..._lastPosValue - shutters last position
        • -
        • ..._lastDelayPosValue - last specified order, will be executed with the next matching - event -
        • -
        • partyMode on|off - is working mode set to part?y
        • -
        • ascEnable on|off - are the associated shutters control by ASC completely?
        • -
        • controlShading on|off - are the associated shutters controlled for shading by ASC? -
        • -
        • hardLockOut on|off - switch for preventing a global hard lock out
        • -
        • room_... - list of every found shutter for every room: room_Sleeping: Patio
        • -
        • selfDefense - state of the self defense mode
        • -
        • state - state of the ASC device: active, enabled, disabled or other state information -
        • -
        • sunriseTimeWeHoliday on|off - state of the weekend and holiday support
        • -
        • userAttrList - ASC sets some user defined attributes (userattr) - for the shutter devices. This readings shows the current state of the given user attributes to the - shutter devices. -
        • -
        - -

        Within the shutter devices:

        -
          -
        • ASC_Enable on|off - shutter is controlled by ASC or not
        • -
        • ASC_Time_DriveUp - if the astro mode is used, the next sunrise is shown. - If the brightness or time mode is used, the value from ASC_Time_Up_Late is shown. -
        • -
        • ASC_Time_DriveDown - if the astro mode is used, the next sunset is shown. - If the brightness or time mode is used, the value from ASC_TASC_Time_Down_Lateime_Up_Late is - shown. -
        • -
        • ASC_ShuttersLastDrive - initiator for the last action
        • -
        -
      -

      - - Set -
        -
      • ascEnable on|off - enable or disable the global control by ASC
      • -
      • controlShading on|off - enable or disable the global shading control by ASC
      • -
      • createNewNotifyDev - re-creates the internal structure for NOTIFYDEV. Is only present if - the - ASC_Expert attribute is set to 1. -
      • -
      • hardLockOut on|off -
      • hardLockOut - on/off - Aktiviert den hardwareseitigen Aussperrschutz für die Rollläden, bei denen das Attributs ASC_LockOut entsprechend auf hard gesetzt ist. Mehr Informationen in der Beschreibung bei den Attributen für die Rollladengeräten.
      • - -
      • partyMode on|off - controls the global party mode for shutters. Every shutters whose - ASC_Partymode attribute is set to on, is not longer controlled by ASC. The last saved - working command send to the device, i.e. by a event, created by a window or presence event, will be executed - once the party mode is disabled. -
      • -
      • renewAllTimer - resets the sunrise and sunset timers for every associated - shutter device and creates new internal FHEM timers. -
      • -
      • renewTimer - resets the sunrise and sunset timers for selected shutter - device and creates new internal FHEM timers. -
      • -
      • scanForShutters - scans the whole FHEM installation for (new) devices whose ASC - attribute is set (to 1 or 2, see above). -
      • -
      • selfDefense on|off - controls the self defense function. This function listens for - example on a residents device. If this device is set to absent and a window is still open, ASC will close - the shutter for a rudimentary burglary protection. -
      • -
      • shutterASCenableToggle on|off - controls if the ASC controls are shown at a associated - shutter device. -
      • -
      • sunriseTimeWeHoliday on|off - controls the weekend and holiday support. If enabled, the - ASC_Time_Up_WE_Holiday attribute is considered. -
      • -
      • wiggle - wiggles a device for a given value (default 5%, controlled by - ASC_WiggleValue) up or down and back after a minute. Useful as a deterrence in combination with - alarm system. -
      • -
      -

      - - Get -
        -
      • showNotifyDevsInformations - shows the generated NOTIFYDEV structure. Useful for - debugging and only shown if the ASC_expert attribute is set to 1. -
      • -
      -

      - - Attributes -
        -

        At the global ASC device:

        - -
          - -
        • ASC_autoAstroModeEvening - REAL, CIVIL, NAUTIC, ASTRONOMIC or HORIZON
        • - -
        • ASC_autoAstroModeEveningHorizon - Height above the horizon. Is only considered - if the ASC_autoAstroModeEvening attribute is set to HORIZON. Defaults to 0. -
        • - -
        • ASC_autoAstroModeMorning - REAL, CIVIL, NAUTIC, ASTRONOMIC or HORIZON
        • - -
        • ASC_autoAstroModeMorningHorizon - Height above the horizon. Is only considered - if the ASC_autoAstroModeMorning attribute is set to HORIZON. Defaults to 0. -
        • - -
        • ASC_autoShuttersControlComfort - on|off - - Controls the comfort functions: If a three state sensor, like the HmIP-SRH window handle - sensor, is installed, ASC will open the window if the sensor signals open position. The - ASC_ComfortOpen_Pos attribute has to be set for the shutter to on, defaults to off. -
        • - -
        • ASC_autoShuttersControlEvening - on|off - Enables the automatic control by ASC - at the evenings. -
        • - -
        • ASC_autoShuttersControlMorning - on|off - Enables the automatic control by ASC - at the mornings. -
        • - -
        • ASC_blockAscDrivesAfterManual 0|1 - If set to 1, ASC will not - automatically control a shutter if there was an manual control to the shutter. To be considered, the - ASC_ShuttersLastDrive reading has to contain the value manual and the shutter is in - an unknown (i.e. not otherwise configured in ASC) position. -
        • - -
        • ASC_brightnessDriveUpDown - VALUE-MORNING:VALUE-EVENING - Drive the shutters by - brightness. VALUE-MORNING sets the brightness threshold for the morning. If the value is - reached in the morning, the shutter will go up. Vice versa in the evening. This is a global setting - and can be overwritte per device with the ASC_BrightnessSensor attribute (see below). -
        • - -
        • ASC_debug - - Extendend logging for debugging purposes -
        • - -
        • ASC_expert - Switches the export mode on. Currently, if set to 1, get - and set will contain additional functions regarding the NOTIFYDEFs. -
        • - -
        • ASC_freezeTemp - Temperature threshold for the freeze protection. The freeze protection - prevents the shutter to be operated by ASC. Last operating order will be kept. -
        • - -
        • ASC_rainSensor DEVICENAME[:READINGNAME] MAXTRIGGER[:HYSTERESE] [CLOSEDPOS] - Contains - settings for the rain protection. DEVICNAME specifies a rain sensor, the optional - READINGNAME the name of the reading at the DEVICENAME. The READINGNAME - should contain the values rain and dry or a numeral rain amount. MAXTRIGGER - sets the threshold for the amount of rain for when the shutter is driven to CLOSEDPOS as soon - the threshold is reached. HYSTERESE sets a hysteresis for MAXTRIGGER. -
        • - -
        • ASC_residentsDev DEVICENAME[:READINGNAME] - DEVICENAME points to a device - for presence, e.g. of type RESIDENTS. READINGNAME points to a reading at - DEVICENAME which contains a presence state, e.g. rgr_Residents:state. The target - should contain values alike the RESIDENTS family. -
        • - -
        • ASC_shuttersDriveDelay - Maximum random drive delay in seconds for calculating - the operating time. 0 equals to no delay. -
        • - -
        • ASC_tempSensor DEVICENAME[:READINGNAME] - DEVICENAME points to a device - with a temperature, READINGNAME to a reading located at the DEVICENAME, for example - OUTDOOR_TEMP:measured-temp. READINGNAME defaults to temperature. -
        • - -
        • ASC_twilightDevice - points to a DEVICENAME containing values regarding - the sun position. Supports currently devices of type Twilight or Astro. -
        • - -
        • ASC_windSensor DEVICENAME[:READINGNAME] - DEVICENAME points to a device - containing a wind speed. Reads from the wind reading, if not otherwise specified by - READINGNAME. -
        • -
        -
        -

        At shutter devices, controlled by ASC:

        -
          -
        • ASC - 0|1|2 -
            -
          • 0 - don't create attributes for ASC at the first scan and don't be controlled - by ASC
          • -
          • 1 - inverse or venetian type blind mode. Shutter is open equals to 0, shutter is closed equals - to 100, is controlled by position values.
          • -
          • 2 - HomeMatic mode. Shutter is open equals to 100, shutter is closed equals to 0, is - controlled by pct values.
          • -
          -
        • -
        • ASC_Antifreeze - soft|am|pm|hard|off - Freeze protection. -
            -
          • soft - see ASC_Antifreeze_Pos.
          • -
          • hard / am / pm - freeze protection will be active (everytime, - ante meridiem or post meridiem).
          • -
          • off - freeze protection is disabled, default value
          • -
          -
        • -
        • ASC_Antifreeze_Pos - Position to be operated if the shutter should be closed, - but ASC_Antifreeze is not set to off. (Default: dependent on attributASC 85/15). -
        • -
        • ASC_AutoAstroModeEvening - Can be set to REAL, CIVIL, - NAUTIC, ASTRONOMIC or HORIZON. Defaults to none of those.
        • -
        • ASC_AutoAstroModeEveningHorizon - If this value is reached by the sun, a sunset is - presumed. Is used if ASC_autoAstroModeEvening is set to HORIZON. Defaults to none. -
        • -
        • ASC_AutoAstroModeMorning - Can be set to REAL, CIVIL, - NAUTIC, ASTRONOMIC or HORIZON. Defaults to none of those.
        • -
        • ASC_AutoAstroModeMorningHorizon - If this value is reached by the sun, a sunrise is - presumed. Is used if ASC_AutoAstroModeMorning is set to HORIZON. Defaults to none. -
        • -
        • ASC_Shutter_IdleDetection - indicates the Reading which gives information about the running status of the roller blind, as well as secondly the value in the Reading which says that the roller blind does not run. -
        • -
        • ASC_BlockingTime_afterManual - Time in which operations by ASC are blocked - after the last manual operation in seconds. Defaults to 1200 (20 minutes). -
        • -
        • ASC_BlockingTime_beforDayOpen - Time in which no closing operation is made by - ASC after opening at the morning in seconds. Defaults to 3600 (one hour). -
        • -
        • ASC_BlockingTime_beforNightClose - Time in which no closing operation is made by - ASC before closing at the evening in seconds. Defaults to 3600 (one hour). -
        • -
        • ASC_BrightnessSensor - DEVICE[:READING] MORNING-VALUE:EVENING-VALUE - - Drive this shutter by brightness. MORNING-VALUE sets the brightness threshold for the morning. - If the value is reached in the morning, the shutter will go up. Vice versa in the evening, specified by - EVENING-VALUE. Gets the brightness from DEVICE, reads by default from the - brightness reading, unless READING is specified. Defaults to none. -
        • -
        • ASC_Closed_Pos - The closed position value from 0 to 100 percent in increments of 10. - (Default: dependent on attributASC 100/0). -
        • -
        • ASC_ComfortOpen_Pos - The comfort opening position, ranging - from 0 to 100 percent in increments of 10. (Default: dependent on attributASC 20/80). -
        • -
        • ASC_Down - astro|time|brightness|roommate - Drive the shutter depending on this setting: -
            -
          • astro - drive down at sunset
          • -
          • time - drive at ASC_Time_Down_Early
          • -
          • brightness - drive between ASC_Time_Down_Early and ASC_Time_Down_Late, - depending on the settings of ASC_BrightnessSensor (see above).
          • -
          • roommate - no drive by time or brightness, roommate trigger only
          • -
          - Defaults to astro. -
        • -
        • ASC_DriveUpMaxDuration - Drive up duration of the shutter plus 5 seconds. Defaults - to 60 seconds if not set. -
        • -
        • ASC_LockOut soft|hard|off - Configures the lock out protection for the current - shutter. Values are: -
            -
          • soft - works if the global lock out protection lockOut soft is set and a sensor - specified by ASC_WindowRec is set. If the sensor is set to open, the shutter will not - be closed. Affects only commands issued by ASC. -
          • -
          • - hard - see soft, but ASC tries also to block manual issued commands by a switch. -
          • -
          • - off - lock out protection is disabled. Default. -
          • -
          -
        • -
        • ASC_LockOut_Cmd inhibit|blocked|protection - Configures the lock out command for - ASC_LockOut if hard is chosen as a value. Defaults to none. -
        • -
        • ASC_Mode_Down always|home|absent|off - When will a shutter be driven down: -
            -
          • always - ASC will drive always. Default value.
          • -
          • off - don't drive
          • -
          • home / absent - considers a residents status set by ASC_residentsDev. If no - resident is configured and this attribute is set to absent, ASC will not - operate the shutter.
          • -
          -
        • -
        • ASC_Mode_Up always|home|absent|off - When will a shutter be driven up: -
            -
          • always - ASC will drive always. Default value.
          • -
          • off - don't drive
          • -
          • home / absent - considers a residents status set by ASC_residentsDev. If no - resident is configured and this attribute is set to absent, ASC will not - operate the shutter.
          • -
          -
        • -
        • ASC_Open_Pos - The opening position value from 0 to 100 percent in increments of 10. - (Default: dependent on attributASC 0/100). -
        • -
        • ASC_Sleep_Pos - The opening position value from 0 to 100 percent in increments of 10. - (Default: dependent on attributASC 75/25). -
        • -
        • ASC_Partymode on|off - Party mode. If configured to on, driving orders for the - shutter by ASC will be queued if partyMode is set to on at the - global ASC device. Will execute the driving orders after partyMode is disabled. - Defaults to off. -
        • -
        • ASC_Pos_Reading - Points to the reading name, which contains the current - position for the shutter in percent. Will be used for set at devices of unknown kind. -
        • -
        • ASC_PrivacyDownValue_beforeNightClose - How many seconds is the privacy mode activated - before the shutter is closed in the evening. For Brightness, in addition to the time value, - the Brightness value must also be specified. 1800:300 means 30 min before night close or above a brightness - value of 300. -1 is the default - value. -
        • -
        • ASC_PrivacyDown_Pos - - Position in percent for privacy mode, defaults to 50. -
        • -
        • ASC_PrivacyUpValue_beforeDayOpen - How many seconds is the privacy mode activated - before the shutter is open in the morning. For Brightness, in addition to the time value, - the Brightness value must also be specified. 1800:600 means 30 min before day open or above a brightness - value of 600. -1 is the default - value. -
        • -
        • ASC_PrivacyUp_Pos - - Position in percent for privacy mode, defaults to 50. -
        • -
        • ASC_WindProtection on|off - Shutter is protected by the wind protection. Defaults - to off. -
        • -
        • ASC_RainProtection on|off - Shutter is protected by the rain protection. Defaults - to off. -
        • -
        • ASC_Roommate_Device - Comma separated list of ROOMMATE devices, representing - the inhabitants of the room to which the shutter belongs. Especially useful for bedrooms. Defaults - to none. -
        • -
        • ASC_Roommate_Reading - Specifies a reading name to ASC_Roommate_Device. - Defaults to state. -
        • -
        • ASC_Self_Defense_Mode - absent/gone/off - which Residents status Self Defense should become - active without the window being open. (default: gone) off exclude from self defense -
        • -
        • ASC_Self_Defense_AbsentDelay - um wie viele Sekunden soll das fahren in Selfdefense bei - Residents absent verzögert werden. (default: 300) -
        • -
        • ASC_ShuttersPlace window|terrace - If set to terrace, and the - residents device is set to gone, and selfDefense is activated, the shutter will - be closed. If set to window, will not. Defaults to window. -
        • -
        • ASC_Time_Down_Early - Will not drive before time is ASC_Time_Down_Early - or later, even the sunset occurs earlier. To be set in military time. Defaults to 16:00. -
        • -
        • ASC_Time_Down_Late - Will not drive after time is ASC_Time_Down_Late - or earlier, even the sunset occurs later. To be set in military time. Defaults to 22:00. -
        • -
        • ASC_Time_Up_Early - Will not drive before time is ASC_Time_Up_Early - or earlier, even the sunrise occurs earlier. To be set in military time. Defaults to 05:00. -
        • -
        • ASC_Time_Up_Late - Will not drive after time is ASC_Time_Up_Late - or earlier, even the sunrise occurs later. To be set in military time. Defaults to 08:30. -
        • -
        • ASC_Time_Up_WE_Holiday - Will not drive before time is ASC_Time_Up_WE_Holiday - on weekends and holidays (holiday2we is considered). Defaults to 08:00. Warning! - If ASC_Up set to brightness, the time for ASC_Time_Up_WE_Holiday - must be earlier then ASC_Time_Up_Late. -
        • -
        • ASC_Up astro|time|brightness|roommate - Drive the shutter depending on this setting: -
            -
          • astro - drive up at sunrise
          • -
          • time - drive at ASC_Time_Up_Early
          • -
          • brightness - drive between ASC_Time_Up_Early and ASC_Time_Up_Late, - depending on the settings of ASC_BrightnessSensor (see above).
          • -
          • roommate - no drive by time or brightness, roommate trigger only
          • -
          - Defaults to astro. -
        • -
        • ASC_Ventilate_Pos - The opening position value for ventilation - from 0 to 100 percent in increments of 10. (Default: dependent on attributASC 70/30). -
        • -
        • ASC_Ventilate_Window_Open on|off - Drive to ventilation position as window is opened - or tilted, even when the current shutter position is lower than the ASC_Ventilate_Pos. - Defaults to on. -
        • -
        • ASC_WiggleValue - How many percent should the shutter be driven if a wiggle drive - is operated. Defaults to 5. -
        • -
        • ASC_WindParameters THRESHOLD-ON[:THRESHOLD-OFF] [DRIVEPOSITION] - - Threshold for when the shutter is driven to the wind protection position. Optional - THRESHOLD-OFF sets the complementary value when the wind protection is disabled. Disabled - if THRESHOLD-ON is set to -1. Defaults to 50:20 ASC_Closed_Pos. -
        • -
        • ASC_WindowRec - WINDOWREC:[READING], Points to the window contact device, associated with the shutter. - Defaults to none. Reading is optional -
        • -
        • ASC_WindowRec_subType - Model type of the used ASC_WindowRec: -
            -
          • twostate - optical or magnetical sensors with two states: opened or closed
          • -
          • threestate - sensors with three states: opened, tilted, closed
          • -
          - Defaults to twostate. -
        • -
        • ASC_WindowRec_PosAfterDayClosed - open,lastManual / auf welche Position soll das Rollo nach dem schließen am Tag fahren. Open Position oder letzte gespeicherte manuelle Position (default: open)
        • -
          -

          - Shading -

          -

          - Shading is only available if the following prerequests are met: -

            -
          • - The controlShading reading is set to on, and there is a device - of type Astro or Twilight configured to ASC_twilightDevice, and ASC_tempSensor - is set. -
          • -
          • - ASC_BrightnessSensor is configured to any shutter device. -
          • -
          • - All other attributes are optional and the default value for them is used, if they are not - otherwise configured. Please review the settings carefully, especially the values for - StateChange_Cloudy and StateChange_Sunny. -
          • -
          -

          -

          - The following attributes are available: -

          -
            -
          • ASC_Shading_InOutAzimuth - Azimuth value from which shading is to be used when shading is exceeded and shading when undershooting is required. - Defaults to 95:265. -
          • -
          • ASC_Shading_MinMax_Elevation - Shading starts as min point of sun elevation is - reached and end as max point of sun elevation is reached, depending also on other sensor values. Defaults to 25.0:100.0. -
          • -
          • ASC_Shading_Min_OutsideTemperature - Shading starts at this outdoor temperature, - depending also on other sensor values. Defaults to 18.0. -
          • -
          • ASC_Shading_Mode absent|always|off|home - see ASC_Mode_Down above, - but for shading. Defaults to off. -
          • -
          • ASC_Shading_Pos - Shading position in percent. (Default: dependent on attributASC 85/15)
          • -
          • ASC_Shading_StateChange_Cloudy - Shading ends at this - outdoor brightness, depending also on other sensor values. Defaults to 20000. -
          • -
          • ASC_Shading_StateChange_SunnyCloudy - Shading starts/stops at this - outdoor brightness, depending also on other sensor values. An optional parameter specifies how many successive brightness reading values should be used to average the brightness value. Defaults to 35000:20000 [3]. -
          • -
          • ASC_Shading_WaitingPeriod - Waiting time in seconds before additional sensor values - to ASC_Shading_StateChange_Sunny or ASC_Shading_StateChange_Cloudy - are used for shading. Defaults to 120. -
          • -
          -
          -
        -
      -

      - AutoShuttersControl API description -

      -

      - It's possible to access internal data of the ASC module by calling the API function. -

      - Data points of a shutter device, controlled by ASC -

      -

      { ascAPIget('Getter','SHUTTERS_DEVICENAME') }
      -

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      GetterDescription
      FreezeStatus1 = soft, 2 = daytime, 3 = hard
      NoDelayWas the offset handling deactivated (e.g. by operations triggered by a window event)
      LastDriveReason for the last action caused by ASC
      LastPosLast position of the shutter
      LastPosTimestampTimestamp of the last position
      LastManPosLast position manually set of the shutter
      LastManPosTimestampTimestamp of the last position manually set
      SunsetUnixTimeCalculated sunset time in seconds since the UNIX epoche
      Sunset1 = operation in the evening was made, 0 = operation in the evening was not yet made
      SunriseUnixTimeCalculated sunrise time in seconds since the UNIX epoche
      Sunrise1 = operation in the morning was made, 0 = operation in the morning was not yet made
      RoommatesStatusCurrent state of the room mate set for this shutter
      RoommatesLastStatusLast state of the room mate set for this shutter
      ShadingStatusValue of the current shading state. Can hold in, out, in reserved or - out reserved
      ShadingStatusTimestampTimestamp of the last shading state
      IfInShadingIs the shutter currently in shading (depends on the shading mode)
      WindProtectionStatusCurrent state of the wind protection. Can hold protection or unprotection
      RainProtectionStatusCurrent state of the rain protection. Can hold protection or unprotection
      DelayCmdLast operation order in the waiting queue. Set for example by the party mode
      StatusPosition of the shutter
      ASCenableDoes ASC control the shutter?
      PrivacyDownStatusIs the shutter currently in privacyDown mode
      outTempCurrent temperature of a configured temperature device, return -100 is no device configured
      -

      - Übersicht für das Rollladen-Device mit Parameterübergabe -
        - { ascAPIget('Getter','ROLLODEVICENAME',VALUE) }
        -
      - - - - - - - -
      GetterErläuterung
      QueryShuttersPosRückgabewert 1 bedeutet das die aktuelle Position des Rollos unterhalb der Valueposition ist. 0 oder nichts bedeutet oberhalb der Valueposition.
      -

      - Data points of the ASC device -

      - { ascAPIget('Getter') }
      -

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      GetterDescription
      OutTempCurrent temperature of a configured temperature device, return -100 is no device configured
      ResidentsStatusCurrent state of a configured resident device
      ResidentsLastStatusLast state of a configured resident device
      AzimuthCurrent azimuth of the sun
      ElevationCurrent elevation of the sun
      ASCenableIs ASC globally activated?
      -
    - -=end html - -=begin html_DE - - -

    AutoShuttersControl

    -
      -

      AutoShuttersControl (ASC) ermöglicht eine vollständige Automatisierung der vorhandenen Rollläden. Das Modul bietet umfangreiche Konfigurationsmöglichkeiten, um Rollläden bspw. nach Sonnenauf- und untergangszeiten, nach Helligkeitswerten oder rein zeitgesteuert zu steuern. -
      Damit ASC auf Basis der astronomischen Zeiten die Rollos fahren kann, ist es ganz wichtig im Device "global" die Location (Latitude,Longitude) korrekt zu setzen. -

      -

      - Man kann festlegen, welche Rollläden von ASC in die Automatisierung mit aufgenommen werden sollen. Daraufhin stehen diverse Attribute zur Feinkonfiguration zur Verfügung. So sind unter anderem komplexe Lösungen wie Fahrten in Abhängigkeit des Bewohnerstatus einfach umsetzbar. Beispiel: Hochfahren von Rollläden, wenn der Bewohner erwacht ist und draußen bereits die Sonne aufgegangen ist. Weiterhin ist es möglich, dass der geschlossene Rollladen z.B. nach dem Ankippen eines Fensters in eine Lüftungsposition fährt. Und vieles mehr. -

      - - Define -
        - define <name> AutoShuttersControl -

        - Beispiel: -
          -
          - define myASControl AutoShuttersControl
          -
        -
        - Der Befehl erstellt ein AutoShuttersControl Device mit Namen myASControl.
        - Nachdem das Device angelegt wurde, muss in allen Rollläden Devices, welche gesteuert werden sollen, das Attribut ASC mit Wert 1 oder 2 gesetzt werden. - Dabei bedeutet 1 = "Prozent geschlossen" (z.B. ROLLO oder Siro Modul) - Rollo Oben 0, Rollo Unten 100, 2 = "Prozent geöffnet" (z.B. Homematic) - Rollo Oben 100, Rollo Unten 0. - Die Voreinstellung für den Befehl zum prozentualen Fahren ist in beiden Fällen unterschiedlich. 1="position" und 2="pct". Dies kann, soweit erforderlich, zu späterer Zeit noch angepasst werden. - Habt Ihr das Attribut gesetzt, könnt Ihr den automatischen Scan nach den Devices anstoßen. -
      -
      - - Readings -
        - Im ASC-Device -
          -
        • ..._nextAstroTimeEvent - Uhrzeit des nächsten Astro-Events: Sonnenauf- oder Sonnenuntergang oder feste Zeit
        • -
        • ..._PosValue - aktuelle Position des Rollladens
        • -
        • ..._lastPosValue - letzte Position des Rollladens
        • -
        • ..._lastDelayPosValue - letzter abgesetzter Fahrbefehl, welcher beim nächsten zulässigen Event ausgeführt wird.
        • -
        • partyMode - on/off - Partymodus-Status
        • -
        • ascEnable - on/off - globale ASC Steuerung bei den Rollläden aktiv oder inaktiv
        • -
        • controlShading - on/off - globale Beschattungsfunktion aktiv oder inaktiv
        • -
        • hardLockOut - on/off - Status des hardwareseitigen Aussperrschutzes / gilt nur für Rolläden mit dem Attribut bei denen das Attributs ASC_LockOut entsprechend auf hard gesetzt ist
        • -
        • room_... - Auflistung aller Rollläden, die in den jeweiligen Rämen gefunden wurde. Beispiel: room_Schlafzimmer: Terrasse
        • -
        • selfDefense - Selbstschutz-Status
        • -
        • state - Status des ASC-Devices: active, enabled, disabled oder weitere Statusinformationen
        • -
        • sunriseTimeWeHoliday - on/off - Status der Wochenendunterstützung
        • -
        • userAttrList - Das ASC-Modul verteilt an die gesteuerten Rollladen-Geräte diverse Benutzerattribute (userattr). In diesem Reading kann der Status dieser Verteilung geprüft werden.
        • -

        - In den Rollläden-Geräten -
          -
        • ASC_Enable - on/off - wird der Rollladen über ASC gesteuert oder nicht
        • -
        • ASC_Time_DriveUp - Im Astro-Modus ist hier die Sonnenaufgangszeit für das Rollo gespeichert. Im Brightnessmodus ist hier der Zeitpunkt aus dem Attribut ASC_Time_Up_Late gespeichert. Im Timemodus ist hier der Zeitpunkt aus dem Attribut ASC_Time_Up_Early gespeichert.
        • -
        • ASC_Time_DriveDown - Im Astro-Modus ist hier die Sonnenuntergangszeit für das Rollo gespeichert. Im Brightnessmodus ist hier der Zeitpunkt aus dem Attribut ASC_Time_Down_Late gespeichert. Im Timemodus ist hier der Zeitpunkt aus dem Attribut ASC_Time_Down_Early gespeichert.
        • -
        • ASC_ShuttersLastDrive - Grund der letzten Fahrt vom Rollladen
        • -
        • ASC_ShadingMessage -
        • -
        • ASC_Time_PrivacyDriveDown -
        • -
        • ASC_Time_PrivacyDriveUp -
        • -
        -
      -

      - - Set -
        -
      • advDriveDown - holt bei allen Rollläden durch ASC_Adv on ausgesetzte Fahrten nach.
      • -
      • ascEnable - on/off - Aktivieren oder deaktivieren der globalen ASC Steuerung
      • -
      • controlShading - on/off - Aktiviert oder deaktiviert die globale Beschattungssteuerung
      • -
      • createNewNotifyDev - Legt die interne Struktur für NOTIFYDEV neu an. Diese Funktion steht nur zur Verfügung, wenn Attribut ASC_expert auf 1 gesetzt ist.
      • -
      • hardLockOut - on/off - Aktiviert den hardwareseitigen Aussperrschutz für die Rollläden, bei denen das Attributs ASC_LockOut entsprechend auf hard gesetzt ist. Mehr Informationen in der Beschreibung bei den Attributen für die Rollladengeräten.
      • -
      • partyMode - on/off - Aktiviert den globalen Partymodus. Alle Rollladen-Geräten, in welchen das Attribut ASC_Partymode auf on gesetzt ist, werden durch ASC nicht mehr gesteuert. Der letzte Schaltbefehl, der bspw. durch ein Fensterevent oder Wechsel des Bewohnerstatus an die Rollläden gesendet wurde, wird beim Deaktivieren des Partymodus ausgeführt
      • -
      • renewTimer - erneuert beim ausgewählten Rollladen die Zeiten für Sonnenauf- und -untergang und setzt die internen Timer neu.
      • -
      • renewAllTimer - erneuert bei allen Rollläden die Zeiten für Sonnenauf- und -untergang und setzt die internen Timer neu.
      • -
      • scanForShutters - Durchsucht das System nach GerätenRo mit dem Attribut ASC = 1 oder ASC = 2
      • -
      • selfDefense - on/off - Aktiviert bzw. deaktiviert die Selbstschutzfunktion. Beispiel: Wenn das Residents-Gerät absent meldet, die Selbstschutzfunktion aktiviert wurde und ein Fenster im Haus noch geöffnet ist, so wird an diesem Fenster der Rollladen deaktivieren dann heruntergefahren.
      • -
      • shutterASCenableToggle - on/off - Aktivieren oder deaktivieren der ASC Kontrolle beim einzelnen Rollladens
      • -
      • sunriseTimeWeHoliday - on/off - Aktiviert die Wochenendunterstützung und somit, ob im Rollladengerät das Attribut ASC_Time_Up_WE_Holiday beachtet werden soll oder nicht.
      • -
      • wiggle - bewegt einen oder mehrere Rollläden um einen definierten Wert (Default: 5%) und nach einer Minute wieder zurück in die Ursprungsposition. Diese Funktion könnte bspw. zur Abschreckung in einem Alarmsystem eingesetzt werden.
      • -
      -

      - - Get -
        -
      • showNotifyDevsInformations - zeigt eine Übersicht der abgelegten NOTIFYDEV Struktur. Diese Funktion wird primär fürs Debugging genutzt. Hierzu ist das Attribut ASC_expert = 1 zu setzen.
      • -
      -

      - - Attributes -
        - Im ASC-Device -
          - -
        • ASC_autoAstroModeEvening - REAL, CIVIL, NAUTIC, ASTRONOMIC oder HORIZON
        • - -
        • ASC_autoAstroModeEveningHorizon - Höhe über dem Horizont. Wird nur berücksichtigt, wenn im Attribut ASC_autoAstroModeEvening der Wert HORIZON ausgewählt wurde. (default: 0)
        • - -
        • ASC_autoAstroModeMorning - REAL, CIVIL, NAUTIC, ASTRONOMIC oder HORIZON
        • - -
        • ASC_autoAstroModeMorningHorizon - Höhe über dem Horizont. Wird nur berücksichtigt, wenn im Attribut ASC_autoAstroModeMorning der Wert HORIZON ausgewählt wurde. (default: 0)
        • - -
        • ASC_autoShuttersControlComfort - on/off - schaltet die Komfortfunktion an. Bedeutet, dass ein Rollladen mit einem threestate-Sensor am Fenster beim Öffnen in eine Offenposition fährt. Hierzu muss beim Rollladen das Attribut ASC_ComfortOpen_Pos entsprechend konfiguriert sein. (default: off)
        • - -
        • ASC_autoShuttersControlEvening - on/off - Aktiviert die automatische Steuerung durch das ASC-Modul am Abend.
        • - -
        • ASC_autoShuttersControlMorning - on/off - Aktiviert die automatische Steuerung durch das ASC-Modul am Morgen.
        • - -
        • ASC_blockAscDrivesAfterManual - 0,1 - wenn dieser Wert auf 1 gesetzt ist, dann werden Rollläden vom ASC-Modul nicht mehr gesteuert, wenn zuvor manuell eingegriffen wurde. Voraussetzung hierfür ist jedoch, dass im Reading ASC_ShuttersLastDrive der Status manual enthalten ist und sich der Rollladen auf eine unbekannte (nicht in den Attributen anderweitig konfigurierte) Position befindet.
        • - -
        • ASC_brightnessDriveUpDown - WERT-MORGENS:WERT-ABENDS - Werte bei dem Schaltbedingungen für Sonnenauf- und -untergang geprüft werden sollen. Diese globale Einstellung kann durch die WERT-MORGENS:WERT-ABENDS Einstellung von ASC_BrightnessSensor im Rollladen selbst überschrieben werden.
        • - -
        • ASC_debug - Aktiviert die erweiterte Logausgabe für Debugausgaben
        • - -
        • ASC_expert - ist der Wert 1, so werden erweiterte Informationen bezüglich des NotifyDevs unter set und get angezeigt
        • - -
        • ASC_freezeTemp - Temperatur, ab welcher der Frostschutz greifen soll und der Rollladen nicht mehr fährt. Der letzte Fahrbefehl wird gespeichert.
        • - -
        • ASC_rainSensor - DEVICENAME[:READINGNAME] MAXTRIGGER[:HYSTERESE] [CLOSEDPOS] - der Inhalt ist eine Kombination aus Devicename, Readingname, Wert ab dem getriggert werden soll, Hysterese Wert ab dem der Status Regenschutz aufgehoben werden soll und der "wegen Regen geschlossen Position".
        • - -
        • ASC_residentsDev - DEVICENAME[:READINGNAME] - der Inhalt ist eine Kombination aus Devicenamen und Readingnamen des Residents-Device der obersten Ebene (z.B. rgr_Residents:state)
        • - -
        • ASC_shuttersDriveDelay - maximale Zufallsverzögerung in Sekunden bei der Berechnung der Fahrzeiten. 0 bedeutet keine Verzögerung
        • - -
        • ASC_tempSensor - DEVICENAME[:READINGNAME] - der Inhalt ist eine Kombination aus Device und Reading für die Außentemperatur
        • - -
        • ASC_twilightDevice - das Device, welches die Informationen zum Sonnenstand liefert. Wird unter anderem für die Beschattung verwendet.
        • - -
        • ASC_windSensor - DEVICE[:READING] - Sensor für die Windgeschwindigkeit. Kombination aus Device und Reading.
        • -
        • ASC_slatDriveCmdInverse - Vertauscht wie Reihnfolge der Fahrbefehle für Slat und Drive
        • -
        -
        -
        - In den Rollläden-Geräten -
          -
        • ASC - 0/1/2 0 = "kein Anlegen der Attribute beim ersten Scan bzw. keine Beachtung eines Fahrbefehles",1 = "Inverse oder Rollo - Bsp.: Rollo oben 0, Rollo unten 100 und der Befehl zum prozentualen Fahren ist position",2 = "Homematic Style - Bsp.: Rollo oben 100, Rollo unten 0 und der Befehl zum prozentualen Fahren ist pct
        • -
        • ASC_Antifreeze - soft/am/pm/hard/off - Frostschutz, wenn soft fährt der Rollladen in die ASC_Antifreeze_Pos und wenn hard/am/pm wird gar nicht oder innerhalb der entsprechenden Tageszeit nicht gefahren (default: off)
        • -
        • ASC_Antifreeze_Pos - Position die angefahren werden soll, wenn der Fahrbefehl komplett schließen lautet, aber der Frostschutz aktiv ist (Default: ist abhängig vom AttributASC 85/15) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
        • -
        • ASC_AutoAstroModeEvening - aktuell REAL,CIVIL,NAUTIC,ASTRONOMIC (default: none)
        • -
        • ASC_AutoAstroModeEveningHorizon - Höhe über Horizont, wenn beim Attribut ASC_autoAstroModeEvening HORIZON ausgewählt (default: none)
        • -
        • ASC_AutoAstroModeMorning - aktuell REAL,CIVIL,NAUTIC,ASTRONOMIC (default: none)
        • -
        • ASC_AutoAstroModeMorningHorizon - Höhe über Horizont,a wenn beim Attribut ASC_autoAstroModeMorning HORIZON ausgewählt (default: none)
        • -
        • ASC_BlockingTime_afterManual - wie viel Sekunden soll die Automatik nach einer manuellen Fahrt aussetzen. (default: 1200)
        • -
        • ASC_BlockingTime_beforDayOpen - wie viel Sekunden vor dem morgendlichen öffnen soll keine schließen Fahrt mehr stattfinden. (default: 3600)
        • -
        • ASC_BlockingTime_beforNightClose - wie viel Sekunden vor dem nächtlichen schließen soll keine öffnen Fahrt mehr stattfinden. (default: 3600)
        • -
        • ASC_BrightnessSensor - DEVICE[:READING] WERT-MORGENS:WERT-ABENDS / 'Sensorname[:brightness [400:800]]' Angaben zum Helligkeitssensor mit (Readingname, optional) für die Beschattung und dem Fahren der Rollladen nach brightness und den optionalen Brightnesswerten für Sonnenauf- und Sonnenuntergang. (default: none)
        • -
        • ASC_Down - astro/time/brightness - bei astro wird Sonnenuntergang berechnet, bei time wird der Wert aus ASC_Time_Down_Early als Fahrzeit verwendet und bei brightness muss ASC_Time_Down_Early und ASC_Time_Down_Late korrekt gesetzt werden. Der Timer läuft dann nach ASC_Time_Down_Late Zeit, es wird aber in der Zeit zwischen ASC_Time_Down_Early und ASC_Time_Down_Late geschaut, ob die als Attribut im Moduldevice hinterlegte ASC_brightnessDriveUpDown der Down Wert erreicht wurde. Wenn ja, wird der Rollladen runter gefahren (default: astro)
        • -

            - Beschreibung der besonderen Positionsattribute -
          • ASC_Closed_Pos - in 10 Schritten von 0 bis 100 (Default: ist abhängig vom AttributASC 0/100)
          • -
          • ASC_Open_Pos - in 10 Schritten von 0 bis 100 (default: ist abhängig vom AttributASC 100/0)
          • -
          • ASC_Sleep_Pos - in 10 Schritten von 0 bis 100 (default: ist abhängig vom AttributASC 75/25) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
          • -
          • ASC_ComfortOpen_Pos - in 10 Schritten von 0 bis 100 (Default: ist abhängig vom AttributASC 20/80) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
          • -
          • ASC_Shading_Pos - Position des Rollladens für die Beschattung (Default: ist abhängig vom AttributASC 80/20) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
          • -
          • ASC_Ventilate_Pos - in 10 Schritten von 0 bis 100 (default: ist abhängig vom Attribut ASC 70/30) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
          • -

            - In Bezug auf die Verwendung mit Lamellen gibt es folgende ergänzende Parameter. -
              -
            • Wird die gesamte Position inklusive der Lamellen mit Hilfe einer "festen Zurdnung" angefahren, so z.B. set ROLLONAME Beschattung dann wird hinter dem Positionswert mittels : getrennt die "feste Zuordnung" geschrieben. Beispiel: attr ROLLONAME ASC_Shading_Pos 30:Beschattung
            • -
            • Wird hingegen ein ander Command verwendet z.B. slatPct oder ähnliches dann muss hinter der normalen Positionsangebe noch die Position für die Lamellen mit angegeb werden. Beispiel: attr ROLLONAME ASC_Shading_Pos 30:75. Bitte beachtet in diesem Zusammenhang auch das Attribut ASC_SlatPosCmd_SlatDevice wo mindesten die Angabe des SlatPosCMD Voraussetzung ist.
            • -
            -

          -
        • ASC_Shutter_IdleDetection - READING:VALUE gibt das Reading an welches Auskunft über den Fahrstatus des Rollos gibt, sowie als zweites den Wert im Reading welcher aus sagt das das Rollo nicht fährt
        • -
        • ASC_DriveUpMaxDuration - die Dauer des Hochfahrens des Rollladens plus 5 Sekunden (default: 60)
        • -
        • ASC_Drive_Delay - maximaler Wert für einen zufällig ermittelte Verzögerungswert in Sekunden bei der Berechnung der Fahrzeiten.
        • -
        • ASC_Drive_DelayStart - in Sekunden verzögerter Wert ab welchen das Rollo gefahren werden soll.
        • -
        • ASC_LockOut - soft/hard/off - stellt entsprechend den Aussperrschutz ein. Bei global aktivem Aussperrschutz (set ASC-Device lockOut soft) und einem Fensterkontakt open bleibt dann der Rollladen oben. Dies gilt nur bei Steuerbefehlen über das ASC Modul. Stellt man global auf hard, wird bei entsprechender Möglichkeit versucht den Rollladen hardwareseitig zu blockieren. Dann ist auch ein Fahren über die Taster nicht mehr möglich. (default: off)
        • -
        • ASC_LockOut_Cmd - inhibit/blocked/protection - set Befehl für das Rollladen-Device zum Hardware sperren. Dieser Befehl wird gesetzt werden, wenn man "ASC_LockOut" auf hard setzt (default: none)
        • -
        • ASC_Mode_Down - always/home/absent/off - Wann darf die Automatik steuern. immer, niemals, bei Abwesenheit des Roommate (ist kein Roommate und absent eingestellt, wird gar nicht gesteuert) (default: always)
        • -
        • ASC_Mode_Up - always/home/absent/off - Wann darf die Automatik steuern. immer, niemals, bei Abwesenheit des Roommate (ist kein Roommate und absent eingestellt, wird gar nicht gesteuert) (default: always)
        • -
        • ASC_Partymode - on/off - schaltet den Partymodus an oder aus. Wird am ASC Device set ASC-DEVICE partyMode on geschalten, werden alle Fahrbefehle an den Rollläden, welche das Attribut auf on haben, zwischengespeichert und später erst ausgeführt (default: off)
        • -
        • ASC_Pos_Reading - Name des Readings, welches die Position des Rollladen in Prozent an gibt; wird bei unbekannten Device Typen auch als set Befehl zum fahren verwendet
        • -
        • ASC_PrivacyUpValue_beforeDayOpen - wie viele Sekunden vor dem morgendlichen öffnen soll der Rollladen in die Sichtschutzposition fahren, oder bei Brightness ab welchem minimum Brightnesswert soll das Rollo in die Privacy Position fahren. Bei Brightness muss zusätzlich zum Zeitwert der Brightnesswert mit angegeben werden 1800:600 bedeutet 30 min vor day open oder bei über einem Brightnesswert von 600 (default: -1)
        • -
        • ASC_PrivacyDownValue_beforeNightClose - wie viele Sekunden vor dem abendlichen schließen soll der Rollladen in die Sichtschutzposition fahren, oder bei Brightness ab welchem minimum Brightnesswert soll das Rollo in die Privacy Position fahren. Bei Brightness muss zusätzlich zum Zeitwert der Brightnesswert mit angegeben werden 1800:300 bedeutet 30 min vor night close oder bei unter einem Brightnesswert von 300 (default: -1)
        • -
        • ASC_PrivacyUp_Pos - Position den Rollladens für den morgendlichen Sichtschutz (default: 50) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
        • -
        • ASC_PrivacyDown_Pos - Position den Rollladens für den abendlichen Sichtschutz (default: 50) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
        • -
        • ASC_ExternalTrigger - DEVICE:READING VALUEACTIVE:VALUEINACTIVE POSACTIVE:[POSINACTIVE VALUEACTIVE2:POSACTIVE2], Beispiel: "WohnzimmerTV:state on:off 66:100" bedeutet das wenn ein "state:on" Event kommt soll das Rollo in Position 66 fahren, kommt ein "state:off" Event soll es in Position 100 fahren. Es ist möglich die POSINACTIVE weg zu lassen dann fährt das Rollo in LastStatus Position.
        • -
        • ASC_WindProtection - on/off - soll der Rollladen beim Windschutz beachtet werden. on=JA, off=NEIN. (default off)
        • -
        • ASC_RainProtection - on/off - soll der Rollladen beim Regenschutz beachtet werden. on=JA, off=NEIN. (default off)
        • -
        • ASC_Roommate_Device - mit Komma getrennte Namen des/der Roommate Device/s, welche den/die Bewohner des Raumes vom Rollladen wiedergibt. Es macht nur Sinn in Schlaf- oder Kinderzimmern (default: none)
        • -
        • ASC_Adv - on/off bei on wird das runterfahren des Rollos während der Weihnachtszeit (1. Advent bis 6. Januar) ausgesetzt! Durch set ASCDEVICE advDriveDown werden alle ausgesetzten Fahrten nachgeholt.
        • -
        • ASC_Roommate_Reading - das Reading zum Roommate Device, welches den Status wieder gibt (default: state)
        • -
        • ASC_Self_Defense_Mode - absent/gone/off - ab welchen Residents Status soll Selfdefense aktiv werden ohne das Fenster auf sind. (default: gone)
        • -
        • ASC_Self_Defense_AbsentDelay - um wie viele Sekunden soll das fahren in Selfdefense bei Residents absent verzögert werden. (default: 300)
        • -
        • ASC_Self_Defense_Exclude - on/off - bei on Wert wird dieser Rollladen bei aktiven Self Defense und offenen Fenster nicht runter gefahren, wenn Residents absent ist. (default: off), off bedeutet das es ausgeschlossen ist vom Self Defense
        • -
            - Beschreibung der Beschattungsfunktion -
            Damit die Beschattung Funktion hat, müssen folgende Anforderungen erfüllt sein. -
            Im ASC Device das Reading "controlShading" mit dem Wert on, sowie ein Astro/Twilight Device im Attribut "ASC_twilightDevice" und das Attribut "ASC_tempSensor". -
            In den Rollladendevices benötigt ihr ein Helligkeitssensor als Attribut "ASC_BrightnessSensor", sofern noch nicht vorhanden. Findet der Sensor nur für die Beschattung Verwendung ist der Wert DEVICENAME[:READING] ausreichend. -
            Alle weiteren Attribute sind optional und wenn nicht gesetzt mit Default-Werten belegt. Ihr solltet sie dennoch einmal anschauen und entsprechend Euren Gegebenheiten setzen. Die Werte für die Fensterposition und den Vor- Nachlaufwinkel sowie die Grenzwerte für die StateChange_Cloudy und StateChange_Sunny solltet ihr besondere Beachtung dabei schenken. -
          • ASC_Shading_InOutAzimuth - Azimut Wert ab dem bei Überschreiten Beschattet und bei Unterschreiten Endschattet werden soll. (default: 95:265)
          • -
          • ASC_Shading_MinMax_Elevation - ab welcher min Höhe des Sonnenstandes soll beschattet und ab welcher max Höhe wieder beendet werden, immer in Abhängigkeit der anderen einbezogenen Sensorwerte (default: 25.0:100.0)
          • -
          • ASC_Shading_Min_OutsideTemperature - ab welcher Temperatur soll Beschattet werden, immer in Abhängigkeit der anderen einbezogenen Sensorwerte (default: 18)
          • -
          • ASC_Shading_Mode - absent,always,off,home / wann soll die Beschattung nur stattfinden. (default: off)
          • -
          • ASC_Shading_Pos - Position des Rollladens für die Beschattung (Default: ist abhängig vom AttributASC 80/20) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
          • -
          • ASC_Shading_StateChange_SunnyCloudy - Brightness Wert ab welchen die Beschattung stattfinden und aufgehoben werden soll, immer in Abhängigkeit der anderen einbezogenen Sensorwerte. Ein optionaler dritter Wert gibt an wie, viele Brightnesswerte für den aktuellen Brightness-Durchschnitt berücksichtigt werden. Standard ist 3, es sollten nicht mehr als 5 berücksichtigt werden. (default: 35000:20000 [3])
          • -
          • ASC_Shading_WaitingPeriod - wie viele Sekunden soll gewartet werden bevor eine weitere Auswertung der Sensordaten für die Beschattung stattfinden soll (default: 1200)
          • -

          -
        • ASC_ShuttersPlace - window/terrace - Wenn dieses Attribut auf terrace gesetzt ist, das Residence Device in den Status "gone" geht und SelfDefense aktiv ist (ohne das das Reading selfDefense gesetzt sein muss), wird das Rollo geschlossen (default: window)
        • -
        • ASC_Time_Down_Early - Sonnenuntergang frühste Zeit zum Runterfahren (default: 16:00) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!
        • -
        • ASC_Time_Down_Late - Sonnenuntergang späteste Zeit zum Runterfahren (default: 22:00) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!
        • -
        • ASC_Time_Up_Early - Sonnenaufgang frühste Zeit zum Hochfahren (default: 05:00) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!
        • -
        • ASC_Time_Up_Late - Sonnenaufgang späteste Zeit zum Hochfahren (default: 08:30) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!
        • -
        • ASC_Time_Up_WE_Holiday - Sonnenaufgang frühste Zeit zum Hochfahren am Wochenende und/oder Urlaub (holiday2we wird beachtet). (default: 08:00) ACHTUNG!!! in Verbindung mit Brightness für ASC_Up muss die Uhrzeit kleiner sein wie die Uhrzeit aus ASC_Time_Up_Late !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!
        • -
        • ASC_Up - astro/time/brightness - bei astro wird Sonnenaufgang berechnet, bei time wird der Wert aus ASC_Time_Up_Early als Fahrzeit verwendet und bei brightness muss ASC_Time_Up_Early und ASC_Time_Up_Late korrekt gesetzt werden. Der Timer läuft dann nach ASC_Time_Up_Late Zeit, es wird aber in der Zeit zwischen ASC_Time_Up_Early und ASC_Time_Up_Late geschaut, ob die als Attribut im Moduldevice hinterlegte Down Wert von ASC_brightnessDriveUpDown erreicht wurde. Wenn ja, wird der Rollladen hoch gefahren (default: astro)
        • -
        • ASC_Ventilate_Window_Open - auf lüften, wenn das Fenster gekippt/geöffnet wird und aktuelle Position unterhalb der Lüften-Position ist (default: on)
        • -
        • ASC_WiggleValue - Wert um welchen sich die Position des Rollladens ändern soll (default: 5)
        • -
        • ASC_WindParameters - TRIGGERMAX[:HYSTERESE] [DRIVEPOSITION] / Angabe von Max Wert ab dem für Wind getriggert werden soll, Hytsrese Wert ab dem der Windschutz aufgehoben werden soll TRIGGERMAX - HYSTERESE / Ist es bei einigen Rollläden nicht gewünscht das gefahren werden soll, so ist der TRIGGERMAX Wert mit -1 an zu geben. (default: '50:20 ClosedPosition')
        • -
        • ASC_WindowRec_PosAfterDayClosed - open,lastManual / auf welche Position soll das Rollo nach dem schließen am Tag fahren. Open Position oder letzte gespeicherte manuelle Position (default: open)
        • -
        • ASC_WindowRec - WINDOWREC:[READING], Name des Fensterkontaktes, an dessen Fenster der Rollladen angebracht ist (default: none). Reading ist optional
        • -
        • ASC_WindowRec_subType - Typ des verwendeten Fensterkontaktes: twostate (optisch oder magnetisch) oder threestate (Drehgriffkontakt) (default: twostate)
        • -
        • ASC_SlatPosCmd_SlatDevice - Angaben zu einem Slat (Lamellen) CMD und sofern diese Lamellen über ein anderes Device gesteuert werden zum Slat Device. Beispiel: attr ROLLO ASC_SlatPosCmd_SlatDevice slatPct[:ROLLOSLATDEVICE] [ ] bedeutet optinal. Kann also auch weg gelassen werden. Wenn Ihr das SLAT Device mit angibt dann bitte ohne []. Beispiel: attr ROLLO ASC_SlatPosCmd_SlatDevice slatPct:ROLLOSLATDEVICE. Damit das ganze dann auch greift muss in den 6 Positionsangaben ASC_Open_Pos, ASC_Closed_Pos, ASC_Ventilate_Pos, ASC_ComfortOpen_Pos, ASC_Shading_Pos und ASC_Sleep_Pos ein weiterer Parameter für die Lamellenstellung mit angegeben werden.
        • -
        -
      -

      - Beschreibung der AutoShuttersControl API -
      Mit dem Aufruf der API Funktion und Übergabe der entsprechenden Parameter ist es möglich auf interne Daten zu zu greifen. -

      - Übersicht für das Rollladen-Device -
        - { ascAPIget('Getter','ROLLODEVICENAME') }
        -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      GetterErläuterung
      FreezeStatus1=soft, 2=Daytime, 3=hard
      AntiFreezePoskonfigurierte Position beim AntiFreeze Status
      AntiFreezePosAssignmentkonfigurierte Lamellen Position bei der AntiFreeze Position
      AntiFreezeaktuelle Konfiguration für AntiFreeze
      ShuttersPlaceaktuelle Konfiguration an welchem Platz sich das Rollo befindet, Fenster oder Terrasse
      SlatPosCmdwelcher PosCmd ist aktuell für den Lamellen Befehl konfiguriert
      SlatDevicewelches Device aktuell für die Lamellen Steuerung konfiguriert ist
      PrivacyUpTimePrivacy Zeit in Sekunden zum fahren in die Privacy Pos vor dem vollen öffnen
      PrivacyUpBrightnessValPrivacy Brightness Wert zum fahren in die Privacy Pos
      PrivacyUpPosPosition für die Privacy Up Fahrt
      PrivacyUpPositionAssignmentPosition für die Lamellenfahrt von Privacy Up
      PrivacyDownTimePrivacy Zeit in Sekunden zum fahren in die Privacy Pos vor dem vollen schließ
      PrivacyDownBrightnessValPrivacy Brightness Wert zum fahren in die Privacy Pos
      PrivacyDownPosPosition für die Privacy Down Fahrt
      PrivacyDownPositionAssignmentPosition für die Lamellenfahrt von Privacy Down
      SelfDefenseModeModus für den SelfDefense
      SelfDefenseAbsentDelayVerzögerungszeit der SelfDefense Fahrt bei absent
      WiggleValueum welchen Wert soll das Rollo bei einer wiggle Fahrt fahren
      AdvIst es in der definierten Weihnachtszeit
      ShadingPoskonfigurierte Position für die Beschattungsfahrt
      ShadingPositionAssignmentPosition für die Lamellenfahrt für die Beschattungsfahrt
      ShadingModewelcher aktuelle Modus für das Beschatten ist konfiguriert
      IdleDetectionValuewelcher Wert im IdleDetectionRading zeigt an dass das Rollo aktuell nicht in Bewegung ist
      ShadingAzimuthLeftab welchem Azimut beginnt die Beschattung
      ShadingAzimuthRightab welchem Azimut endet die Beschattung
      ShadingMinOutsideTemperatureüber welchem Temperaturwert beginnt die Beschattung
      ShadingMinElevationüber welchem Elevationwert beginnt die Beschattung
      ShadingMaxElevationüber welchem Elevationwert endet die Beschattung
      ShadingStateChangeSunnyüber welchem Brightnesswert beginnt die Beschattung
      ShadingStateChangeCloudyunter welchem Brightnesswert endet die Beschattung
      ShadingWaitingPeriodnach welcher Wartezeit werden Beschattungsrelevante Sensorwerte wieder beachtet und die Beschattungsroutine abgearbeitet
      ExternalTriggerDevicekonfiguriertes Triggerdevice
      ExternalTriggerReadingkofiguriertes Triggerdevice Reading
      ExternalTriggerValueActiveWert mit welchen der externe Trigger Prozess ausgel&uoml;st werden soll.
      ExternalTriggerValueActive2weiterer Wert mit welchen der externe zweite Trigger Prozess ausgel&uoml;st werden soll.
      ExternalTriggerValueInactiveWert mit welchen der externe Trigger Prozess beendet werden soll
      ExternalTriggerPosActiveRolloposition welche angefahren werden soll wenn der erste externe Trigger aktiv wird.
      ExternalTriggerPosActive2Rolloposition welche angefahren werden soll wenn der zweite externe Trigger aktiv wird.
      ExternalTriggerPosInactiveRolloposition welche angefahren werden soll wenn der externe Trigger inaktiv wird.
      ExternalTriggerStateaktueller Status des externen Triggers, 0 oder 1
      Delaykonfigurierte Verzögerungswert welcher für die Zufallsberechnung werwendet werden soll
      DelayStartkonfigurierter fester Verzögerungswert
      BlockingTimeAfterManualkonfigurierte Blockzeit nach einer manuellen Fahrt
      BlockingTimeBeforNightClosekonfigurierte Blockzeit vor dem nächtlichen schließen
      BlockingTimeBeforDayOpenkonfigurierte Blockzeit vor dem morgendlichen öffnen
      PosCmdwelches Kommando wird zum fahren der Rollos verwendet (pct, position?)
      OpenPosPosition für Rollo ganz auf
      OpenPositionAssignmentSlat-Position für Rollo ganz auf
      VentilatePosLüften Position
      VentilatePositionAssignmentLüften Slat-Position
      VentilatePosAfterDayClosedPosition des Rollos beim schließen des Fensters am Tag
      ClosedPosPosition für Rollo ganz geschlossen
      ClosedPositionAssignmentSlat-Position für Rollo ganz geschlossen
      SleepPosPosition für schlafen
      SleepPositionAssignmentSlat-Position für schlafen
      VentilateOpenLüften aktiv?
      ComfortOpenPosComfort Position
      ComfortOpenPositionAssignmentSlat-Comfort Position
      PartyModeAbfrage Party Mode
      RoommatesAbfrage Roommates / Antwort als String
      RoommatesReadingRoommates Reading
      RoommatesStatusRoommates Status unter Berücksichtigung aller Roommates und dessen Status
      RoommatesLastStatusRoommates letzter Status unter Berücksichtigung aller Roommates und dessen letzten Status
      WindPosRollo Position bei Windtrigger
      WindMaxWert über dem die Windprotection aktiviert werden soll
      WindMinWert unter dem die Windprotection aufgehoben werden soll
      WindProtectionWindprotection soll aktiv sein oder nicht
      WindProtectionStatusaktueller Status der Wind Protection „protected“ oder „unprotected“
      RainProtectionRain Protection soll aktiv sein oder nicht
      RainProtectionStatusaktueller Status der Regen Protection „unprotected“ oder „unprotected“
      ModeUp
      ModeDown
      LockOut
      LockOutCmd
      AutoAstroModeMorning
      AutoAstroModeEvening
      AutoAstroModeMorningHorizon
      AutoAstroModeEveningHorizon
      Up
      Down
      TimeUpEarly
      TimeUpLate
      TimeDownEarly
      TimeDownLate
      TimeUpWeHoliday
      NoDelayWurde die Behandlung von Offset deaktiviert (Beispiel bei Fahrten über Fensterevents)
      LastDriveGrund des letzten Fahrens
      LastPosdie letzte Position des Rollladens
      LastPosTimestampTimestamp der letzten festgestellten Position
      LastManPosPosition der letzten manuellen Fahrt
      LastManPosTimestampTimestamp der letzten manuellen Position
      SunsetUnixTimeberechnete Unixzeit für Abends (Sonnenuntergang)
      Sunset1=Abendfahrt wurde durchgeführt, 0=noch keine Abendfahrt durchgeführt
      SunriseUnixTimeberechnete Unixzeit für Morgens (Sonnenaufgang)
      Sunrise1=Morgenfahrt wurde durchgeführt, 0=noch keine Morgenfahrt durchgeführt
      RoommatesStatusaktueller Status der/des Roommate/s für den Rollladen
      RoommatesLastStatusletzter Status der/des Roommate/s für den Rollladen
      ShadingStatusAusgabe des aktuellen Shading Status, „in“, „out“, „in reserved“, „out reserved“
      ShadingStatusTimestampTimestamp des letzten Beschattungsstatus
      IfInShadingBefindet sich der Rollladen, in Abhängigkeit des Shading Mode, in der Beschattung
      DelayCmdletzter Fahrbefehl welcher in die Warteschlange kam. Grund z.B. Partymodus.
      StatusPosition des Rollladens
      ASCenableAbfrage ob für den Rollladen die ASC Steuerung aktiv ist.
      IsDayAbfrage ob das Rollo im Tag oder Nachtmodus ist. Also nach Sunset oder nach Sunrise
      PrivacyDownStatusAbfrage ob das Rollo aktuell im PrivacyDown Status steht
      OutTempaktuelle Außentemperatur sofern ein Sensor definiert ist, wenn nicht kommt -100 als Wert zurück
      -

      - Übersicht für das Rollladen-Device mit Parameterübergabe -
        - { ascAPIget('Getter','ROLLODEVICENAME',VALUE) }
        -
      - - - -
      GetterErläuterung
      QueryShuttersPosRückgabewert 1 bedeutet das die aktuelle Position des Rollos unterhalb der Valueposition ist. 0 oder nichts bedeutet oberhalb der Valueposition.
      -

      - Übersicht für das ASC Device -
        - { ascAPIget('Getter') }
        -
      - - - - - - - - -
      GetterErläuterung
      OutTemp aktuelle Außentemperatur sofern ein Sensor definiert ist, wenn nicht kommt -100 als Wert zurück
      ResidentsStatusaktueller Status des Residents Devices
      ResidentsLastStatusletzter Status des Residents Devices
      AzimuthAzimut Wert
      ElevationElevation Wert
      ASCenableist die ASC Steuerung global aktiv?
      -
    - -=end html_DE - -=for :application/json;q=META.json 73_AutoShuttersControl.pm -{ - "abstract": "Module for controlling shutters depending on various conditions", - "x_lang": { - "de": { - "abstract": "Modul zur Automatischen Rolladensteuerung auf Basis bestimmter Ereignisse" - } - }, - "keywords": [ - "fhem-mod-device", - "fhem-core", - "Shutter", - "Automation", - "Rollladen", - "Rollo", - "Control" - ], - "release_status": "testing", - "license": "GPL_2", - "version": "v0.9.20", - "author": [ - "Marko Oldenburg " - ], - "x_fhem_maintainer": [ - "CoolTux" - ], - "x_fhem_maintainer_github": [ - "LeonGaultier" - ], - "prereqs": { - "runtime": { - "requires": { - "FHEM": 5.00918799, - "perl": 5.016, - "Meta": 0, - "JSON": 0, - "Date::Parse": 0 - }, - "recommends": { - }, - "suggests": { - } - } - } -} -=end :application/json;q=META.json - -=cut diff --git a/lib/FHEM/Automation/ShuttersControl/Dev.pm b/lib/FHEM/Automation/ShuttersControl/Dev.pm new file mode 100644 index 0000000..71a92bb --- /dev/null +++ b/lib/FHEM/Automation/ShuttersControl/Dev.pm @@ -0,0 +1,79 @@ +############################################################################### +# +# Developed with Kate +# +# (c) 2018-2020 Copyright: Marko Oldenburg (leongaultier at gmail dot com) +# All rights reserved +# +# Special thanks goes to: +# - Bernd (Cluni) this module is based on the logic of his script "Rollladensteuerung für HM/ROLLO inkl. Abschattung und Komfortfunktionen in Perl" (https://forum.fhem.de/index.php/topic,73964.0.html) +# - Beta-User for many tests, many suggestions and good discussions +# - pc1246 write english commandref +# - FunkOdyssey commandref style +# - sledge fix many typo in commandref +# - many User that use with modul and report bugs +# - Christoph (christoph.kaiser.in) Patch that expand RegEx for Window Events +# - Julian (Loredo) expand Residents Events for new Residents functions +# - Christoph (Christoph Morrison) for fix Commandref, many suggestions and good discussions +# +# +# This script is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License,or +# any later version. +# +# The GNU General Public License can be found at +# http://www.gnu.org/copyleft/gpl.html. +# A copy is found in the textfile GPL.txt and important notices to the license +# from the author is found in LICENSE.txt distributed with these scripts. +# +# This script is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# +# $Id$ +# +############################################################################### + +## Klasse ASC_Dev plus Subklassen ASC_Attr_Dev und ASC_Readings_Dev## +package FHEM::Automation::ShuttersControl::Dev; +our @ISA = qw(FHEM::Automation::ShuttersControl::Dev::Readings FHEM::Automation::ShuttersControl::Dev::Attr); + +use strict; +use warnings; +use utf8; + +sub new { + my $class = shift; + + my $self = { name => undef, }; + + bless $self, $class; + return $self; +} + +sub setName { + my $self = shift; + my $name = shift; + + $self->{name} = $name if ( defined($name) ); + return $self->{name}; +} + +sub setDefault { + my $self = shift; + my $defaultarg = shift; + + $self->{defaultarg} = $defaultarg if ( defined($defaultarg) ); + return $self->{defaultarg}; +} + +sub getName { + my $self = shift; + return $self->{name}; +} + + +1; diff --git a/lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm b/lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm new file mode 100644 index 0000000..3825771 --- /dev/null +++ b/lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm @@ -0,0 +1,388 @@ +############################################################################### +# +# Developed with Kate +# +# (c) 2018-2020 Copyright: Marko Oldenburg (leongaultier at gmail dot com) +# All rights reserved +# +# Special thanks goes to: +# - Bernd (Cluni) this module is based on the logic of his script "Rollladensteuerung für HM/ROLLO inkl. Abschattung und Komfortfunktionen in Perl" (https://forum.fhem.de/index.php/topic,73964.0.html) +# - Beta-User for many tests, many suggestions and good discussions +# - pc1246 write english commandref +# - FunkOdyssey commandref style +# - sledge fix many typo in commandref +# - many User that use with modul and report bugs +# - Christoph (christoph.kaiser.in) Patch that expand RegEx for Window Events +# - Julian (Loredo) expand Residents Events for new Residents functions +# - Christoph (Christoph Morrison) for fix Commandref, many suggestions and good discussions +# +# +# This script is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License,or +# any later version. +# +# The GNU General Public License can be found at +# http://www.gnu.org/copyleft/gpl.html. +# A copy is found in the textfile GPL.txt and important notices to the license +# from the author is found in LICENSE.txt distributed with these scripts. +# +# This script is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# +# $Id$ +# +############################################################################### + +## Subklasse Attr ## +package ASC_Dev::Attr; + +use strict; +use warnings; +use utf8; + +use GPUtils qw(GP_Import); + +## Import der FHEM Funktionen +BEGIN { + GP_Import( + qw( + AttrVal + gettimeofday) + ); +} + +sub getShuttersOffset { + my $self = shift; + + my $name = $self->{name}; + + return AttrVal( $name, 'ASC_shuttersDriveDelay', -1 ); +} + +sub getBrightnessMinVal { + my $self = shift; + + my $name = $self->{name}; + + return $self->{ASC_brightness}->{triggermin} + if ( exists( $self->{ASC_brightness}->{LASTGETTIME} ) + && ( gettimeofday() - $self->{ASC_brightness}->{LASTGETTIME} ) < 2 ); + $ascDev->getBrightnessMaxVal; + + return $self->{ASC_brightness}->{triggermin}; +} + +sub getBrightnessMaxVal { + my $self = shift; + + my $name = $self->{name}; + + return $self->{ASC_brightness}->{triggermax} + if ( exists( $self->{ASC_brightness}->{LASTGETTIME} ) + && ( gettimeofday() - $self->{ASC_brightness}->{LASTGETTIME} ) < 2 ); + $self->{ASC_brightness}->{LASTGETTIME} = int( gettimeofday() ); + + my ( $triggermax, $triggermin ) = + FHEM::Automation::ShuttersControl::GetAttrValues( $name, + 'ASC_brightnessDriveUpDown', '800:500' ); + + ## erwartetes Ergebnis + # max:min + + $self->{ASC_brightness}->{triggermin} = $triggermin; + $self->{ASC_brightness}->{triggermax} = $triggermax; + + return $self->{ASC_brightness}->{triggermax}; +} + +sub _getTwilightDevice { + my $self = shift; + + my $name = $self->{name}; + + return AttrVal( $name, 'ASC_twilightDevice', 'none' ); +} + +sub getAutoAstroModeEvening { + my $self = shift; + + my $name = $self->{name}; + + return AttrVal( $name, 'ASC_autoAstroModeEvening', 'REAL' ); +} + +sub getAutoAstroModeEveningHorizon { + my $self = shift; + + my $name = $self->{name}; + + return AttrVal( $name, 'ASC_autoAstroModeEveningHorizon', 0 ); +} + +sub getAutoAstroModeMorning { + my $self = shift; + + my $name = $self->{name}; + + return AttrVal( $name, 'ASC_autoAstroModeMorning', 'REAL' ); +} + +sub getAutoAstroModeMorningHorizon { + my $self = shift; + + my $name = $self->{name}; + + return AttrVal( $name, 'ASC_autoAstroModeMorningHorizon', 0 ); +} + +sub getAutoShuttersControlMorning { + my $self = shift; + + my $name = $self->{name}; + + return AttrVal( $name, 'ASC_autoShuttersControlMorning', 'on' ); +} + +sub getAutoShuttersControlEvening { + my $self = shift; + + my $name = $self->{name}; + + return AttrVal( $name, 'ASC_autoShuttersControlEvening', 'on' ); +} + +sub getAutoShuttersControlComfort { + my $self = shift; + + my $name = $self->{name}; + + return AttrVal( $name, 'ASC_autoShuttersControlComfort', 'off' ); +} + +sub getFreezeTemp { + my $self = shift; + + my $name = $self->{name}; + + return AttrVal( $name, 'ASC_freezeTemp', 3 ); +} + +sub getSlatDriveCmdInverse { + my $self = shift; + + my $name = $self->{name}; + + return AttrVal( $name, 'ASC_slatDriveCmdInverse', 0 ); +} + +sub _getTempSensor { + my $self = shift; + + my $name = $self->{name}; + + return $self->{ASC_tempSensor}->{device} + if ( exists( $self->{ASC_tempSensor}->{LASTGETTIME} ) + && ( gettimeofday() - $self->{ASC_tempSensor}->{LASTGETTIME} ) < 2 ); + $self->{ASC_tempSensor}->{LASTGETTIME} = int( gettimeofday() ); + my ( $device, $reading ) = + FHEM::Automation::ShuttersControl::GetAttrValues( $name, 'ASC_tempSensor', + 'none' ); + + ## erwartetes Ergebnis + # DEVICE:READING + $self->{ASC_tempSensor}->{device} = $device; + $self->{ASC_tempSensor}->{reading} = + ( $reading ne 'none' ? $reading : 'temperature' ); + + return $self->{ASC_tempSensor}->{device}; +} + +sub getTempSensorReading { + my $self = shift; + + my $name = $self->{name}; + + return $self->{ASC_tempSensor}->{reading} + if ( exists( $self->{ASC_tempSensor}->{LASTGETTIME} ) + && ( gettimeofday() - $self->{ASC_tempSensor}->{LASTGETTIME} ) < 2 ); + $ascDev->_getTempSensor; + return $self->{ASC_tempSensor}->{reading}; +} + +sub _getResidentsDev { + my $self = shift; + + my $name = $self->{name}; + + return $self->{ASC_residentsDev}->{device} + if ( exists( $self->{ASC_residentsDev}->{LASTGETTIME} ) + && ( gettimeofday() - $self->{ASC_residentsDev}->{LASTGETTIME} ) < 2 ); + $self->{ASC_residentsDev}->{LASTGETTIME} = int( gettimeofday() ); + my ( $device, $reading ) = + FHEM::Automation::ShuttersControl::GetAttrValues( $name, 'ASC_residentsDev', + 'none' ); + + $self->{ASC_residentsDev}->{device} = $device; + $self->{ASC_residentsDev}->{reading} = + ( $reading ne 'none' ? $reading : 'state' ); + + return $self->{ASC_residentsDev}->{device}; +} + +sub getResidentsReading { + my $self = shift; + + my $name = $self->{name}; + + return $self->{ASC_residentsDev}->{reading} + if ( exists( $self->{ASC_residentsDev}->{LASTGETTIME} ) + && ( gettimeofday() - $self->{ASC_residentsDev}->{LASTGETTIME} ) < 2 ); + $ascDev->_getResidentsDev; + return $self->{ASC_residentsDev}->{reading}; +} + +sub _getRainSensor { + my $self = shift; + + my $name = $self->{name}; + + return $self->{ASC_rainSensor}->{device} + if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} ) + && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 ); + $self->{ASC_rainSensor}->{LASTGETTIME} = int( gettimeofday() ); + my ( $device, $reading, $max, $hyst, $pos, $wait ) = + FHEM::Automation::ShuttersControl::GetAttrValues( $name, 'ASC_rainSensor', + 'none' ); + + ## erwartetes Ergebnis + # DEVICE:READING MAX:HYST + + return $device if ( $device eq 'none' ); + $self->{ASC_rainSensor}->{device} = $device; + $self->{ASC_rainSensor}->{reading} = + ( $reading ne 'none' ? $reading : 'state' ); + $self->{ASC_rainSensor}->{triggermax} = ( $max ne 'none' ? $max : 1000 ); + $self->{ASC_rainSensor}->{triggerhyst} = ( + $hyst ne 'none' + ? $max - $hyst + : ( $self->{ASC_rainSensor}->{triggermax} * 0 ) + ); + $self->{ASC_rainSensor}->{shuttersClosedPos} = + ( $pos ne 'none' ? $pos : $shutters->getClosedPos ); + $self->{ASC_rainSensor}->{waitingTime} = + ( $pos ne 'none' ? $wait : 900 ); + + return $self->{ASC_rainSensor}->{device}; +} + +sub getRainSensorReading { + my $self = shift; + + my $name = $self->{name}; + + return $self->{ASC_rainSensor}->{reading} + if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} ) + && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 ); + $ascDev->_getRainSensor; + return $self->{ASC_rainSensor}->{reading}; +} + +sub getRainTriggerMax { + my $self = shift; + + my $name = $self->{name}; + + return $self->{ASC_rainSensor}->{triggermax} + if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} ) + && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 ); + $ascDev->_getRainSensor; + return $self->{ASC_rainSensor}->{triggermax}; +} + +sub getRainTriggerMin { + my $self = shift; + + my $name = $self->{name}; + + return $self->{ASC_rainSensor}->{triggerhyst} + if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} ) + && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 ); + $ascDev->_getRainSensor; + return $self->{ASC_rainSensor}->{triggerhyst}; +} + +sub getRainSensorShuttersClosedPos { + my $self = shift; + + my $name = $self->{name}; + + return $self->{ASC_rainSensor}->{shuttersClosedPos} + if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} ) + && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 ); + $ascDev->_getRainSensor; + return $self->{ASC_rainSensor}->{shuttersClosedPos}; +} + +sub getRainWaitingTime { + my $self = shift; + + my $name = $self->{name}; + + return $self->{ASC_rainSensor}->{waitingTime} + if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} ) + && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 ); + $ascDev->_getRainSensor; + return $self->{ASC_rainSensor}->{waitingTime}; +} + +sub _getWindSensor { + my $self = shift; + + my $name = $self->{name}; + + return $self->{ASC_windSensor}->{device} + if ( exists( $self->{ASC_windSensor}->{LASTGETTIME} ) + && ( gettimeofday() - $self->{ASC_windSensor}->{LASTGETTIME} ) < 2 ); + $self->{ASC_windSensor}->{LASTGETTIME} = int( gettimeofday() ); + my ( $device, $reading ) = + FHEM::Automation::ShuttersControl::GetAttrValues( $name, 'ASC_windSensor', + 'none' ); + + return $device if ( $device eq 'none' ); + $self->{ASC_windSensor}->{device} = $device; + $self->{ASC_windSensor}->{reading} = + ( $reading ne 'none' ? $reading : 'wind' ); + + return $self->{ASC_windSensor}->{device}; +} + +sub getWindSensorReading { + my $self = shift; + + my $name = $self->{name}; + + return $self->{ASC_windSensor}->{reading} + if ( exists( $self->{ASC_windSensor}->{LASTGETTIME} ) + && ( gettimeofday() - $self->{ASC_windSensor}->{LASTGETTIME} ) < 2 ); + $ascDev->_getWindSensor; + return ( + defined( $self->{ASC_windSensor}->{reading} ) + ? $self->{ASC_windSensor}->{reading} + : 'wind' + ); +} + +sub getBlockAscDrivesAfterManual { + my $self = shift; + + my $name = $self->{name}; + + return AttrVal( $name, 'ASC_blockAscDrivesAfterManual', 0 ); +} + + +1; diff --git a/lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm b/lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm new file mode 100644 index 0000000..c433750 --- /dev/null +++ b/lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm @@ -0,0 +1,242 @@ +############################################################################### +# +# Developed with Kate +# +# (c) 2018-2020 Copyright: Marko Oldenburg (leongaultier at gmail dot com) +# All rights reserved +# +# Special thanks goes to: +# - Bernd (Cluni) this module is based on the logic of his script "Rollladensteuerung für HM/ROLLO inkl. Abschattung und Komfortfunktionen in Perl" (https://forum.fhem.de/index.php/topic,73964.0.html) +# - Beta-User for many tests, many suggestions and good discussions +# - pc1246 write english commandref +# - FunkOdyssey commandref style +# - sledge fix many typo in commandref +# - many User that use with modul and report bugs +# - Christoph (christoph.kaiser.in) Patch that expand RegEx for Window Events +# - Julian (Loredo) expand Residents Events for new Residents functions +# - Christoph (Christoph Morrison) for fix Commandref, many suggestions and good discussions +# +# +# This script is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License,or +# any later version. +# +# The GNU General Public License can be found at +# http://www.gnu.org/copyleft/gpl.html. +# A copy is found in the textfile GPL.txt and important notices to the license +# from the author is found in LICENSE.txt distributed with these scripts. +# +# This script is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# +# $Id$ +# +############################################################################### + +## Subklasse Readings ## +package FHEM::Automation::ShuttersControl::Dev::Readings; + +use strict; +use warnings; +use utf8; + +use GPUtils qw(GP_Import); + +## Import der FHEM Funktionen +BEGIN { + GP_Import( + qw( + readingsSingleUpdate + ReadingsVal + defs) + ); +} + +sub setDelayCmdReading { + my $self = shift; + + my $name = $self->{name}; + my $hash = $defs{$name}; + + readingsSingleUpdate( $hash, + $shutters->getShuttersDev . '_lastDelayPosValue', + $shutters->getDelayCmd, 1 ); + return; +} + +sub setStateReading { + my $self = shift; + my $value = shift; + + my $name = $self->{name}; + my $hash = $defs{$name}; + + readingsSingleUpdate( $hash, 'state', + ( defined($value) ? $value : $shutters->getLastDrive ), 1 ); + return; +} + +sub setPosReading { + my $self = shift; + + my $name = $self->{name}; + my $hash = $defs{$name}; + + readingsSingleUpdate( $hash, $shutters->getShuttersDev . '_PosValue', + $shutters->getStatus, 1 ); + return; +} + +sub setLastPosReading { + my $self = shift; + + my $name = $self->{name}; + my $hash = $defs{$name}; + + readingsSingleUpdate( $hash, $shutters->getShuttersDev . '_lastPosValue', + $shutters->getLastPos, 1 ); + return; +} + +sub getPartyMode { + my $self = shift; + + my $name = $self->{name}; + + return ReadingsVal( $name, 'partyMode', 'off' ); +} + +sub getHardLockOut { + my $self = shift; + + my $name = $self->{name}; + + return ReadingsVal( $name, 'hardLockOut', 'none' ); +} + +sub getSunriseTimeWeHoliday { + my $self = shift; + + my $name = $self->{name}; + + return ReadingsVal( $name, 'sunriseTimeWeHoliday', 'none' ); +} + +sub getMonitoredDevs { + my $self = shift; + + my $name = $self->{name}; + + $self->{monitoredDevs} = ReadingsVal( $name, '.monitoredDevs', 'none' ); + return $self->{monitoredDevs}; +} + +sub getOutTemp { + my $self = shift; + + return ReadingsVal( $ascDev->_getTempSensor, $ascDev->getTempSensorReading, + -100 ); +} + +sub getResidentsStatus { + my $self = shift; + + my $val = + ReadingsVal( $ascDev->_getResidentsDev, $ascDev->getResidentsReading, + 'none' ); + + if ( $val =~ m{^(?:(.+)_)?(.+)$}xms ) { + return ( $1, $2 ) if (wantarray); + return $1 && $1 eq 'pet' ? 'absent' : $2; + } + elsif ( + ReadingsVal( $ascDev->_getResidentsDev, 'homealoneType', '-' ) eq + 'PET' ) + { + return ( 'pet', 'absent' ) if (wantarray); + return 'absent'; + } + else { + return ( undef, $val ) if (wantarray); + return $val; + } +} + +sub getResidentsLastStatus { + my $self = shift; + + my $val = ReadingsVal( $ascDev->_getResidentsDev, 'lastState', 'none' ); + + if ( $val =~ m{^(?:(.+)_)?(.+)$}xms ) { + return ( $1, $2 ) if (wantarray); + return $1 && $1 eq 'pet' ? 'absent' : $2; + } + elsif ( + ReadingsVal( $ascDev->_getResidentsDev, 'lastHomealoneType', '-' ) eq + 'PET' ) + { + return ( 'pet', 'absent' ) if (wantarray); + return 'absent'; + } + else { + return ( undef, $val ) if (wantarray); + return $val; + } +} + +sub getAutoShuttersControlShading { + my $self = shift; + + my $name = $self->{name}; + + return ReadingsVal( $name, 'controlShading', 'none' ); +} + +sub getSelfDefense { + my $self = shift; + + my $name = $self->{name}; + + return ReadingsVal( $name, 'selfDefense', 'none' ); +} + +sub getAzimuth { + my $self = shift; + + my $azimuth; + + $azimuth = ReadingsVal( $ascDev->_getTwilightDevice, 'azimuth', -1 ) + if ( $defs{ $ascDev->_getTwilightDevice }->{TYPE} eq 'Twilight' ); + $azimuth = ReadingsVal( $ascDev->_getTwilightDevice, 'SunAz', -1 ) + if ( $defs{ $ascDev->_getTwilightDevice }->{TYPE} eq 'Astro' ); + + return $azimuth; +} + +sub getElevation { + my $self = shift; + + my $elevation; + + $elevation = ReadingsVal( $ascDev->_getTwilightDevice, 'elevation', -1 ) + if ( $defs{ $ascDev->_getTwilightDevice }->{TYPE} eq 'Twilight' ); + $elevation = ReadingsVal( $ascDev->_getTwilightDevice, 'SunAlt', -1 ) + if ( $defs{ $ascDev->_getTwilightDevice }->{TYPE} eq 'Astro' ); + + return $elevation; +} + +sub getASCenable { + my $self = shift; + + my $name = $self->{name}; + + return ReadingsVal( $name, 'ascEnable', 'none' ); +} + + +1; diff --git a/lib/FHEM/Automation/ShuttersControl/Roommate.pm b/lib/FHEM/Automation/ShuttersControl/Roommate.pm new file mode 100644 index 0000000..071da3f --- /dev/null +++ b/lib/FHEM/Automation/ShuttersControl/Roommate.pm @@ -0,0 +1,76 @@ +############################################################################### +# +# Developed with Kate +# +# (c) 2018-2020 Copyright: Marko Oldenburg (leongaultier at gmail dot com) +# All rights reserved +# +# Special thanks goes to: +# - Bernd (Cluni) this module is based on the logic of his script "Rollladensteuerung für HM/ROLLO inkl. Abschattung und Komfortfunktionen in Perl" (https://forum.fhem.de/index.php/topic,73964.0.html) +# - Beta-User for many tests, many suggestions and good discussions +# - pc1246 write english commandref +# - FunkOdyssey commandref style +# - sledge fix many typo in commandref +# - many User that use with modul and report bugs +# - Christoph (christoph.kaiser.in) Patch that expand RegEx for Window Events +# - Julian (Loredo) expand Residents Events for new Residents functions +# - Christoph (Christoph Morrison) for fix Commandref, many suggestions and good discussions +# +# +# This script is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License,or +# any later version. +# +# The GNU General Public License can be found at +# http://www.gnu.org/copyleft/gpl.html. +# A copy is found in the textfile GPL.txt and important notices to the license +# from the author is found in LICENSE.txt distributed with these scripts. +# +# This script is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# +# $Id$ +# +############################################################################### + +## Klasse ASC_Roommate ## +package FHEM::Automation::ShuttersControl::Roommate; + +use strict; +use warnings; +use utf8; + +use GPUtils qw(GP_Import); + +## Import der FHEM Funktionen +BEGIN { + GP_Import( + qw( + ReadingsVal) + ); +} + +sub _getRoommateStatus { + my $self = shift; + + my $roommate = $self->{roommate}; + + return ReadingsVal( $roommate, $shutters->getRoommatesReading, 'none' ); +} + +sub _getRoommateLastStatus { + my $self = shift; + + my $roommate = $self->{roommate}; + my $default = $self->{defaultarg}; + + $default = 'none' if ( !defined($default) ); + return ReadingsVal( $roommate, 'lastState', $default ); +} + + +1; diff --git a/lib/FHEM/Automation/ShuttersControl/Shutters.pm b/lib/FHEM/Automation/ShuttersControl/Shutters.pm new file mode 100644 index 0000000..058a1fa --- /dev/null +++ b/lib/FHEM/Automation/ShuttersControl/Shutters.pm @@ -0,0 +1,937 @@ +############################################################################### +# +# Developed with Kate +# +# (c) 2018-2020 Copyright: Marko Oldenburg (leongaultier at gmail dot com) +# All rights reserved +# +# Special thanks goes to: +# - Bernd (Cluni) this module is based on the logic of his script "Rollladensteuerung für HM/ROLLO inkl. Abschattung und Komfortfunktionen in Perl" (https://forum.fhem.de/index.php/topic,73964.0.html) +# - Beta-User for many tests, many suggestions and good discussions +# - pc1246 write english commandref +# - FunkOdyssey commandref style +# - sledge fix many typo in commandref +# - many User that use with modul and report bugs +# - Christoph (christoph.kaiser.in) Patch that expand RegEx for Window Events +# - Julian (Loredo) expand Residents Events for new Residents functions +# - Christoph (Christoph Morrison) for fix Commandref, many suggestions and good discussions +# +# +# This script is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License,or +# any later version. +# +# The GNU General Public License can be found at +# http://www.gnu.org/copyleft/gpl.html. +# A copy is found in the textfile GPL.txt and important notices to the license +# from the author is found in LICENSE.txt distributed with these scripts. +# +# This script is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# +# $Id$ +# +############################################################################### + +###################################### +###################################### +########## Begin der Klassendeklarierungen für OOP (Objektorientierte Programmierung) ######################### +## Klasse Rolläden (Shutters) und die Subklassen Attr und Readings ## +## desweiteren wird noch die Klasse ASC_Roommate mit eingebunden + +package FHEM::Automation::ShuttersControl::Shutters; +our @ISA = + qw(FHEM::Automation::ShuttersControl::Shutters::Readings FHEM::Automation::ShuttersControl::Shutters::Attr FHEM::Automation::ShuttersControl::Roommate FHEM::Automation::ShuttersControl::Window); + +use strict; +use warnings; +use utf8; + +use GPUtils qw(GP_Import); + +## Import der FHEM Funktionen +BEGIN { + GP_Import( + qw( + defs + ReadingsVal + readingsSingleUpdate + gettimeofday + InternalTimer + CommandSet + Log3) + ); +} + +sub new { + my $class = shift; + my $self = { + shuttersDev => undef, + defaultarg => undef, + roommate => undef, + }; + + bless $self, $class; + return $self; +} + +sub setShuttersDev { + my $self = shift; + my $shuttersDev = shift; + + $self->{shuttersDev} = $shuttersDev if ( defined($shuttersDev) ); + return $self->{shuttersDev}; +} + +sub getShuttersDev { + my $self = shift; + + return $self->{shuttersDev}; +} + +sub setAttrUpdateChanges { + my ( $self, $attr, $value ) = @_; + + $self->{ $self->{shuttersDev} }{AttrUpdateChanges}{$attr} = $value; + return; +} + +sub setHardLockOut { + my $self = shift; + my $cmd = shift; + + if ( $shutters->getLockOut eq 'hard' + && $shutters->getLockOutCmd ne 'none' ) + { + CommandSet( undef, $self->{shuttersDev} . ' inhibit ' . $cmd ) + if ( $shutters->getLockOutCmd eq 'inhibit' ); + CommandSet( undef, + $self->{shuttersDev} . ' ' + . ( $cmd eq 'on' ? 'blocked' : 'unblocked' ) ) + if ( $shutters->getLockOutCmd eq 'blocked' ); + CommandSet( undef, + $self->{shuttersDev} . ' ' + . ( $cmd eq 'on' ? 'protectionOn' : 'protectionOff' ) ) + if ( $shutters->getLockOutCmd eq 'protected' ); + } + return; +} + +sub setNoDelay { + my $self = shift; + my $noDelay = shift; + + $self->{ $self->{shuttersDev} }{noDelay} = $noDelay; + return; +} + +sub setSelfDefenseAbsent { + my ( $self, $timerrun, $active, $timerhash ) = @_; + + $self->{ $self->{shuttersDev} }{selfDefenseAbsent}{timerrun} = $timerrun; + $self->{ $self->{shuttersDev} }{selfDefenseAbsent}{active} = $active; + $self->{ $self->{shuttersDev} }{selfDefenseAbsent}{timerhash} = $timerhash + if ( defined($timerhash) ); + return; +} + +sub setDriveCmd { + my $self = shift; + my $posValue = shift; + + my $offSet; + my $offSetStart; + + if ( + ( $shutters->getPartyMode eq 'on' && $ascDev->getPartyMode eq 'on' ) + || ( $shutters->getAdv + && !$shutters->getQueryShuttersPos($posValue) + && !$shutters->getAdvDelay + && !$shutters->getExternalTriggerState + && !$shutters->getSelfDefenseState ) + ) + { + $shutters->setDelayCmd($posValue); + $ascDev->setDelayCmdReading; + $shutters->setNoDelay(0); + $shutters->setExternalTriggerState(0) + if ( $shutters->getExternalTriggerState ); + + FHEM::AutoShuttersControl::ASC_Debug( 'setDriveCmd: ' + . $shutters->getShuttersDev + . ' - Die Fahrt wird zurückgestellt. Grund kann ein geöffnetes Fenster sein oder ein aktivierter Party Modus oder Weihnachtszeit' + ); + } + else { + $shutters->setAdvDelay(0) + if ( $shutters->getAdvDelay ); + $shutters->setDelayCmd('none') + if ( $shutters->getDelayCmd ne 'none' ) + ; # setzt den Wert auf none da der Rolladen nun gesteuert werden kann. + $shutters->setExternalTriggerState(0) + if ( $shutters->getExternalTriggerState ); + + ### antifreeze Routine + if ( $shutters->getAntiFreezeStatus > 0 ) { + if ( $shutters->getAntiFreezeStatus != 1 ) { + + $posValue = $shutters->getStatus; + $shutters->setLastDrive('no drive - antifreeze defense'); + $shutters->setLastDriveReading; + $ascDev->setStateReading; + } + elsif ( $posValue == $shutters->getClosedPos ) { + $posValue = $shutters->getAntiFreezePos; + $shutters->setLastDrive( + $shutters->getLastDrive . ' - antifreeze mode' ); + } + } + + my %h = ( + shuttersDev => $self->{shuttersDev}, + posValue => $posValue, + ); + + $offSet = $shutters->getDelay if ( $shutters->getDelay > -1 ); + $offSet = $ascDev->getShuttersOffset if ( $shutters->getDelay < 0 ); + $offSetStart = $shutters->getDelayStart; + + if ( $shutters->getSelfDefenseAbsent + && !$shutters->getSelfDefenseAbsentTimerrun + && $shutters->getSelfDefenseMode ne 'off' + && $shutters->getSelfDefenseState + && $ascDev->getSelfDefense eq 'on' ) + { + InternalTimer( + gettimeofday() + $shutters->getSelfDefenseAbsentDelay, + \&FHEM::Automation::ShuttersControl::_SetCmdFn, \%h ); + $shutters->setSelfDefenseAbsent( 1, 0, \%h ); + } + elsif ( $offSetStart > 0 && !$shutters->getNoDelay ) { + InternalTimer( + gettimeofday() + + int( rand($offSet) + $shutters->getDelayStart ), + \&FHEM::Automation::ShuttersControl::_SetCmdFn, \%h + ); + + FHEM::AutoShuttersControl::ASC_Debug( 'FnSetDriveCmd: ' + . $shutters->getShuttersDev + . ' - versetztes fahren' ); + } + elsif ( $offSetStart < 1 || $shutters->getNoDelay ) { + FHEM::Automation::ShuttersControl::_SetCmdFn( \%h ); + FHEM::AutoShuttersControl::ASC_Debug( 'FnSetDriveCmd: ' + . $shutters->getShuttersDev + . ' - NICHT versetztes fahren' ); + } + + FHEM::AutoShuttersControl::ASC_Debug( 'FnSetDriveCmd: ' + . $shutters->getShuttersDev + . ' - NoDelay: ' + . ( $shutters->getNoDelay ? 'JA' : 'NEIN' ) ); + $shutters->setNoDelay(0); + } + + return; +} + +sub setSunsetUnixTime { + my $self = shift; + my $unixtime = shift; + + $self->{ $self->{shuttersDev} }{sunsettime} = $unixtime; + return; +} + +sub setSunset { + my $self = shift; + my $value = shift; + + $self->{ $self->{shuttersDev} }{sunset} = $value; + return; +} + +sub setSunriseUnixTime { + my $self = shift; + my $unixtime = shift; + + $self->{ $self->{shuttersDev} }{sunrisetime} = $unixtime; + return; +} + +sub setSunrise { + my $self = shift; + my $value = shift; + + $self->{ $self->{shuttersDev} }{sunrise} = $value; + return; +} + +sub setDelayCmd { + my $self = shift; + my $posValue = shift; + + $self->{ $self->{shuttersDev} }{delayCmd} = $posValue; + return; +} + +sub setLastDrive { + my $self = shift; + my $lastDrive = shift; + + $self->{ $self->{shuttersDev} }{lastDrive} = $lastDrive; + return; +} + +sub setPosSetCmd { + my $self = shift; + my $posSetCmd = shift; + + $self->{ $self->{shuttersDev} }{posSetCmd} = $posSetCmd; + return; +} + +sub setLastDriveReading { + my $self = shift; + my $shuttersDevHash = $defs{ $self->{shuttersDev} }; + + my %h = ( + devHash => $shuttersDevHash, + lastDrive => $shutters->getLastDrive, + ); + + InternalTimer( gettimeofday() + 0.1, + \&FHEM::Automation::ShuttersControl::_setShuttersLastDriveDelayed, \%h ); + return; +} + +sub setLastPos { + +# letzte ermittelte Position bevor die Position des Rolladen über ASC geändert wurde + my $self = shift; + my $position = shift; + + $self->{ $self->{shuttersDev} }{lastPos}{VAL} = $position + if ( defined($position) ); + $self->{ $self->{shuttersDev} }{lastPos}{TIME} = int( gettimeofday() ) + if ( defined( $self->{ $self->{shuttersDev} }{lastPos} ) ); + return; +} + +sub setLastManPos { + my $self = shift; + my $position = shift; + + $self->{ $self->{shuttersDev} }{lastManPos}{VAL} = $position + if ( defined($position) ); + $self->{ $self->{shuttersDev} }{lastManPos}{TIME} = int( gettimeofday() ) + if ( defined( $self->{ $self->{shuttersDev} }{lastManPos} ) + && defined( $self->{ $self->{shuttersDev} }{lastManPos}{TIME} ) ); + $self->{ $self->{shuttersDev} }{lastManPos}{TIME} = + int( gettimeofday() ) - 86400 + if ( defined( $self->{ $self->{shuttersDev} }{lastManPos} ) + && !defined( $self->{ $self->{shuttersDev} }{lastManPos}{TIME} ) ); + return; +} + +sub setDefault { + my $self = shift; + my $defaultarg = shift; + + $self->{defaultarg} = $defaultarg if ( defined($defaultarg) ); + return $self->{defaultarg}; +} + +sub setRoommate { + my $self = shift; + my $roommate = shift; + + $self->{roommate} = $roommate if ( defined($roommate) ); + return $self->{roommate}; +} + +sub setInTimerFuncHash { + my $self = shift; + my $inTimerFuncHash = shift; + + $self->{ $self->{shuttersDev} }{inTimerFuncHash} = $inTimerFuncHash + if ( defined($inTimerFuncHash) ); + return; +} + +sub setPrivacyDownStatus { + my $self = shift; + my $statusValue = shift; + + $self->{ $self->{shuttersDev} }->{privacyDownStatus} = $statusValue; + return; +} + +sub setPrivacyUpStatus { + my $self = shift; + my $statusValue = shift; + + $self->{ $self->{shuttersDev} }->{privacyUpStatus} = $statusValue; + return; +} + +sub setSelfDefenseState { + my $self = shift; + my $value = shift; + + $self->{ $self->{shuttersDev} }{selfDefenseState} = $value; + return; +} + +sub setAdvDelay { + my $self = shift; + my $advDelay = shift; + + $self->{ $self->{shuttersDev} }->{AdvDelay} = $advDelay; + return; +} + +sub getHomemode { + my $self = shift; + + my $homemode = $shutters->getRoommatesStatus; + $homemode = $ascDev->getResidentsStatus + if ( $homemode eq 'none' ); + return $homemode; +} + +sub getAdvDelay { + my $self = shift; + + return ( + defined( $self->{ $self->{shuttersDev} }->{AdvDelay} ) + ? $self->{ $self->{shuttersDev} }->{AdvDelay} + : 0 + ); +} + +sub getPrivacyDownStatus { + my $self = shift; + + return ( + defined( $self->{ $self->{shuttersDev} }->{privacyDownStatus} ) + ? $self->{ $self->{shuttersDev} }->{privacyDownStatus} + : undef + ); +} + +sub getPrivacyUpStatus { + my $self = shift; + + return ( + defined( $self->{ $self->{shuttersDev} }->{privacyUpStatus} ) + ? $self->{ $self->{shuttersDev} }->{privacyUpStatus} + : undef + ); +} + +sub getAttrUpdateChanges { + my $self = shift; + my $attr = shift; + + return ( + defined( $self->{ $self->{shuttersDev} }{AttrUpdateChanges} ) + && defined( + $self->{ $self->{shuttersDev} }{AttrUpdateChanges}{$attr} ) + ? $self->{ $self->{shuttersDev} }{AttrUpdateChanges}{$attr} + : 'none' + ); +} + +sub getIsDay { + my $self = shift; + + return FHEM::AutoShuttersControl::_IsDay( $self->{shuttersDev} ); +} + +sub getAntiFreezeStatus { + use POSIX qw(strftime); + my $self = shift; + my $daytime = strftime( "%P", localtime() ); + $daytime = ( + defined($daytime) && $daytime + ? $daytime + : ( strftime( "%k", localtime() ) < 12 ? 'am' : 'pm' ) + ); + my $outTemp = $ascDev->getOutTemp; + +# $outTemp = $shutters->getOutTemp if ( $shutters->getOutTemp != -100 ); sollte raus das der Sensor im Rollo auch ein Innentemperatursensor sein kann. + + if ( $shutters->getAntiFreeze ne 'off' + && $outTemp <= $ascDev->getFreezeTemp ) + { + + if ( $shutters->getAntiFreeze eq 'soft' ) { + return 1; + } + elsif ( $shutters->getAntiFreeze eq $daytime ) { + return 2; + } + elsif ( $shutters->getAntiFreeze eq 'hard' ) { + return 3; + } + } + else { return 0; } +} + +sub getShuttersPosCmdValueNegate { + my $self = shift; + + return ( $shutters->getOpenPos < $shutters->getClosedPos ? 1 : 0 ); +} + +sub getQueryShuttersPos +{ # Es wird geschaut ob die aktuelle Position des Rollos unterhalb der Zielposition ist + my $self = shift; + my $posValue = shift; # wenn dem so ist wird 1 zurück gegeben ansonsten 0 + + return ( + $shutters->getShuttersPosCmdValueNegate + ? $shutters->getStatus > $posValue + : $shutters->getStatus < $posValue + ); +} + +sub getPosSetCmd { + my $self = shift; + + return ( + defined( $self->{ $self->{shuttersDev} }{posSetCmd} ) + ? $self->{ $self->{shuttersDev} }{posSetCmd} + : $shutters->getPosCmd + ); +} + +sub getNoDelay { + my $self = shift; + + return $self->{ $self->{shuttersDev} }{noDelay}; +} + +sub getSelfDefenseState { + my $self = shift; + + return ( + defined( $self->{ $self->{shuttersDev} }{selfDefenseState} ) + ? $self->{ $self->{shuttersDev} }{selfDefenseState} + : 0 + ); +} + +sub getSelfDefenseAbsent { + my $self = shift; + + return $self->{ $self->{shuttersDev} }{selfDefenseAbsent}{active}; +} + +sub getSelfDefenseAbsentTimerrun { + my $self = shift; + + return $self->{ $self->{shuttersDev} }{selfDefenseAbsent}{timerrun}; +} + +sub getSelfDefenseAbsentTimerhash { + my $self = shift; + + return ( + defined( + $self->{ $self->{shuttersDev} }{selfDefenseAbsent}{timerhash} + ) + ? $self->{ $self->{shuttersDev} }{selfDefenseAbsent}{timerhash} + : undef + ); +} + +sub getLastDrive { + my $self = shift; + + $self->{ $self->{shuttersDev} }{lastDrive} = + ReadingsVal( $self->{shuttersDev}, 'ASC_ShuttersLastDrive', 'none' ) + if ( !defined( $self->{ $self->{shuttersDev} }{lastDrive} ) ); + + return $self->{ $self->{shuttersDev} }{lastDrive}; +} + +sub getLastPos +{ # letzte ermittelte Position bevor die Position des Rolladen über ASC geändert wurde + my $self = shift; + + return ( + defined( $self->{ $self->{shuttersDev} }{lastPos} ) + && defined( $self->{ $self->{shuttersDev} }{lastPos}{VAL} ) + ? $self->{ $self->{shuttersDev} }{lastPos}{VAL} + : 50 + ); +} + +sub getLastPosTimestamp { + my $self = shift; + + return ( + defined( $self->{ $self->{shuttersDev} } ) + && defined( $self->{ $self->{shuttersDev} }{lastPos} ) + && defined( $self->{ $self->{shuttersDev} }{lastPos}{TIME} ) + ? $self->{ $self->{shuttersDev} }{lastPos}{TIME} + : 0 + ); +} + +sub getLastManPos +{ # letzte ermittelte Position bevor die Position des Rolladen manuell (nicht über ASC) geändert wurde + my $self = shift; + + return ( + defined( $self->{ $self->{shuttersDev} }{lastManPos} ) + && defined( $self->{ $self->{shuttersDev} }{lastManPos}{VAL} ) + ? $self->{ $self->{shuttersDev} }{lastManPos}{VAL} + : 50 + ); +} + +sub getLastManPosTimestamp { + my $self = shift; + + return ( + defined( $self->{ $self->{shuttersDev} } ) + && defined( $self->{ $self->{shuttersDev} }{lastManPos} ) + && defined( $self->{ $self->{shuttersDev} }{lastManPos}{TIME} ) + ? $self->{ $self->{shuttersDev} }{lastManPos}{TIME} + : 0 + ); +} + +sub getInTimerFuncHash { + my $self = shift; + + return $self->{ $self->{shuttersDev} }{inTimerFuncHash}; +} + +sub getSunsetUnixTime { + my $self = shift; + + return $self->{ $self->{shuttersDev} }{sunsettime}; +} + +sub getSunset { + my $self = shift; + + return ( + defined( $self->{ $self->{shuttersDev} }{sunset} ) + ? $self->{ $self->{shuttersDev} }{sunset} + : 0 + ); +} + +sub getSunriseUnixTime { + my $self = shift; + + return $self->{ $self->{shuttersDev} }{sunrisetime}; +} + +sub getSunrise { + my $self = shift; + + return ( + defined( $self->{ $self->{shuttersDev} }{sunrise} ) + ? $self->{ $self->{shuttersDev} }{sunrise} + : 0 + ); +} + +sub getRoommatesStatus { + my $self = shift; + + my $loop = 0; + my @roState; + my %statePrio = ( + 'asleep' => 1, + 'gotosleep' => 2, + 'awoken' => 3, + 'home' => 4, + 'absent' => 5, + 'gone' => 6, + 'none' => 7 + ); + my $minPrio = 10; + + for my $ro ( split( ",", $shutters->getRoommates ) ) { + $shutters->setRoommate($ro); + my $currentPrio = $statePrio{ $shutters->_getRoommateStatus }; + $minPrio = $currentPrio if ( $minPrio > $currentPrio ); + } + + my %revStatePrio = reverse %statePrio; + return $revStatePrio{$minPrio}; +} + +sub getRoommatesLastStatus { + my $self = shift; + + my $loop = 0; + my @roState; + my %statePrio = ( + 'asleep' => 1, + 'gotosleep' => 2, + 'awoken' => 3, + 'home' => 6, + 'absent' => 5, + 'gone' => 4, + 'none' => 7 + ); + my $minPrio = 10; + + for my $ro ( split( ",", $shutters->getRoommates ) ) { + $shutters->setRoommate($ro); + my $currentPrio = $statePrio{ $shutters->_getRoommateLastStatus }; + $minPrio = $currentPrio if ( $minPrio > $currentPrio ); + } + + my %revStatePrio = reverse %statePrio; + return $revStatePrio{$minPrio}; +} + +sub getOutTemp { + my $self = shift; + + return ReadingsVal( $shutters->_getTempSensor, + $shutters->getTempSensorReading, -100 ); +} + +sub getIdleDetection { + my $self = shift; + + return ReadingsVal( $self->{shuttersDev}, + $shutters->_getIdleDetectionReading, 'none' ); +} + +### Begin Beschattung Objekt mit Daten befüllen +sub setShadingStatus { + my $self = shift; + my $value = shift; ### Werte für value = in, out, in reserved, out reserved + + return + if ( defined($value) + && exists( $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} ) + && $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} eq $value ); + + $shutters->setShadingLastStatus( ( $value eq 'in' ? 'out' : 'in' ) ) + if ( $value eq 'in' + || $value eq 'out' ); + + $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} = $value + if ( defined($value) ); + $self->{ $self->{shuttersDev} }{ShadingStatus}{TIME} = int( gettimeofday() ) + if ( defined( $self->{ $self->{shuttersDev} }{ShadingStatus} ) ); + + return; +} + +sub setShadingLastStatus { + my $self = shift; + my $value = shift; ### Werte für value = in, out + + return + if ( defined($value) + && exists( $self->{ $self->{shuttersDev} }{ShadingLastStatus}{VAL} ) + && $self->{ $self->{shuttersDev} }{ShadingLastStatus}{VAL} eq $value ); + + $self->{ $self->{shuttersDev} }{ShadingLastStatus}{VAL} = $value + if ( defined($value) ); + $self->{ $self->{shuttersDev} }{ShadingLastStatus}{TIME} = + int( gettimeofday() ) + if ( defined( $self->{ $self->{shuttersDev} }{ShadingLastStatus} ) ); + $self->{ $self->{shuttersDev} }{ShadingManualDriveStatus}{VAL} = 0 + if ( $value eq 'out' ); + + return; +} + +sub setShadingManualDriveStatus { + my $self = shift; + my $value = shift; ### Werte für value = 0, 1 + + $self->{ $self->{shuttersDev} }{ShadingManualDriveStatus}{VAL} = $value + if ( defined($value) ); + + return; +} + +sub setWindProtectionStatus { # Werte protected, unprotected + my $self = shift; + my $value = shift; + + $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{VAL} = $value + if ( defined($value) ); + + return; +} + +sub setRainProtectionStatus { # Werte protected, unprotected + my $self = shift; + my $value = shift; + + $self->{ $self->{shuttersDev} }->{RainProtection}->{VAL} = $value + if ( defined($value) ); + return; +} + +sub setExternalTriggerState { + my $self = shift; + my $value = shift; + + $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{event} = $value + if ( defined($value) ); + + return; +} + +sub setPushBrightnessInArray { + my $self = shift; + my $value = shift; + + unshift( + @{ $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL} }, + $value + ); + pop( @{ $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL} } ) + if ( + scalar( + @{ + $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL} + } + ) > $shutters->getMaxBrightnessAverageArrayObjects + ); + + return; +} + +sub getBrightnessAverage { + my $self = shift; + + return FHEM::AutoShuttersControl::_averageBrightness( + @{ $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL} } ) + if ( + ref( $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL} ) + eq 'ARRAY' + && scalar( + @{ + $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL} + } + ) > 0 + ); + + return; +} + +sub getShadingStatus { # Werte für value = in, out, in reserved, out reserved + my $self = shift; + + return ( + defined( $self->{ $self->{shuttersDev} }{ShadingStatus} ) + && defined( $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} ) + ? $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} + : 'out' + ); +} + +sub getShadingLastStatus { # Werte für value = in, out + my $self = shift; + + return ( + defined( $self->{ $self->{shuttersDev} }{ShadingLastStatus} ) + && defined( $self->{ $self->{shuttersDev} }{ShadingLastStatus}{VAL} ) + ? $self->{ $self->{shuttersDev} }{ShadingLastStatus}{VAL} + : 'out' + ); +} + +sub getShadingManualDriveStatus { # Werte für value = 0, 1 + my $self = shift; + + return ( + defined( $self->{ $self->{shuttersDev} }{ShadingManualDriveStatus} ) + && defined( + $self->{ $self->{shuttersDev} }{ShadingManualDriveStatus}{VAL} + ) + ? $self->{ $self->{shuttersDev} }{ShadingManualDriveStatus}{VAL} + : 0 + ); +} + +sub getIfInShading { + my $self = shift; + + return ( + ( + $shutters->getShadingMode ne 'off' + && $shutters->getShadingLastStatus eq 'out' + ) ? 1 : 0 + ); +} + +sub getWindProtectionStatus { # Werte protected, unprotected + my $self = shift; + + return ( + ( + defined( $self->{ $self->{shuttersDev} }->{ASC_WindParameters} ) + && defined( + $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{VAL} + ) + ) + ? $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{VAL} + : 'unprotected' + ); +} + +sub getRainProtectionStatus { # Werte protected, unprotected + my $self = shift; + + return ( + ( + defined( $self->{ $self->{shuttersDev} }->{RainProtection} ) + && defined( + $self->{ $self->{shuttersDev} }->{RainProtection}->{VAL} + ) + ) + ? $self->{ $self->{shuttersDev} }->{RainProtection}->{VAL} + : 'unprotected' + ); +} + +sub getShadingStatusTimestamp { + my $self = shift; + + return ( + defined( $self->{ $self->{shuttersDev} } ) + && defined( $self->{ $self->{shuttersDev} }{ShadingStatus} ) + && defined( $self->{ $self->{shuttersDev} }{ShadingStatus}{TIME} ) + ? $self->{ $self->{shuttersDev} }{ShadingStatus}{TIME} + : 0 + ); +} + +sub getShadingLastStatusTimestamp { + my $self = shift; + + return ( + defined( $self->{ $self->{shuttersDev} } ) + && defined( $self->{ $self->{shuttersDev} }{ShadingLastStatus} ) + && defined( $self->{ $self->{shuttersDev} }{ShadingLastStatus}{TIME} ) + ? $self->{ $self->{shuttersDev} }{ShadingLastStatus}{TIME} + : 0 + ); +} +### Ende Beschattung + + +1; diff --git a/lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm b/lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm new file mode 100644 index 0000000..d132347 --- /dev/null +++ b/lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm @@ -0,0 +1,1948 @@ +############################################################################### +# +# Developed with Kate +# +# (c) 2018-2020 Copyright: Marko Oldenburg (leongaultier at gmail dot com) +# All rights reserved +# +# Special thanks goes to: +# - Bernd (Cluni) this module is based on the logic of his script "Rollladensteuerung für HM/ROLLO inkl. Abschattung und Komfortfunktionen in Perl" (https://forum.fhem.de/index.php/topic,73964.0.html) +# - Beta-User for many tests, many suggestions and good discussions +# - pc1246 write english commandref +# - FunkOdyssey commandref style +# - sledge fix many typo in commandref +# - many User that use with modul and report bugs +# - Christoph (christoph.kaiser.in) Patch that expand RegEx for Window Events +# - Julian (Loredo) expand Residents Events for new Residents functions +# - Christoph (Christoph Morrison) for fix Commandref, many suggestions and good discussions +# +# +# This script is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License,or +# any later version. +# +# The GNU General Public License can be found at +# http://www.gnu.org/copyleft/gpl.html. +# A copy is found in the textfile GPL.txt and important notices to the license +# from the author is found in LICENSE.txt distributed with these scripts. +# +# This script is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# +# $Id$ +# +############################################################################### + +## Subklasse Attr von ASC_Shutters## +package FHEM::Automation::ShuttersControl::Shutters::Attr; + +use strict; +use warnings; +use utf8; + +use GPUtils qw(GP_Import); + +## Import der FHEM Funktionen +BEGIN { + GP_Import( + qw( + AttrVal + CommandAttr + gettimeofday) + ); +} + +sub _setAttributs { + my $shuttersDev = shift; + my $attr = shift; + my $attrVal = shift; + + CommandAttr( undef, $shuttersDev . ' ' . $attr . ' ' . $attrVal ); + + return; +} + +sub _getPosition { + my $self = shift; + + my $attr = shift; + my $userAttrList = shift; + + return $self->{ $self->{shuttersDev} }->{$attr}->{position} + if ( + exists( $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} ) < 2 + ); + $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} = + int( gettimeofday() ); + + my $position; + my $posAssignment; + + if ( + AttrVal( $self->{shuttersDev}, $attr, + $userAttrList{$userAttrList} + [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] ) =~ + m{\A\{.+\}\z}xms + ) + { + my $response = FHEM::Automation::ShuttersControl::_perlCodeCheck( + AttrVal( + $self->{shuttersDev}, + $attr, + $userAttrList{$userAttrList} + [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] + ) + ); + + ( $position, $posAssignment ) = split ':', $response; + + $position = ( + $position =~ m{\A\d+(\.\d+)?\z}xms + ? $position + : $userAttrList{$userAttrList} + [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] + ); + + $posAssignment = ( + $posAssignment =~ m{\A\d+(\.\d+)?\z}xms + ? $posAssignment + : 'none' + ); + } + else { + ( $position, $posAssignment ) = + FHEM::Automation::ShuttersControl::GetAttrValues( + $self->{shuttersDev}, + $attr, + $userAttrList{$userAttrList} + [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] + ); + } + + ### erwartetes Ergebnis + # DEVICE:READING + $self->{ $self->{shuttersDev} }->{$attr}->{position} = $position; + $self->{ $self->{shuttersDev} }->{$attr}->{posAssignment} = + $posAssignment; + + return $self->{ $self->{shuttersDev} }->{$attr}->{position}; + + if ( + defined( + FHEM::Automation::ShuttersControl::_perlCodeCheck( + $self->{ $self->{shuttersDev} }->{$attr}->{position} + ) + ) + ) + { + $self->{ $self->{shuttersDev} }->{$attr}->{position} = + FHEM::Automation::ShuttersControl::_perlCodeCheck( + $self->{ $self->{shuttersDev} }->{$attr}->{position} ); + } + + return ( + $self->{ $self->{shuttersDev} }->{$attr}->{position} =~ + m{^\d+(\.\d+)?$}xms + ? $self->{ $self->{shuttersDev} }->{$attr}->{position} + : $userAttrList{$userAttrList} + [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] + ); +} + +sub _getPositionAssignment { + my $self = shift; + + my $attr = shift; + my $getFn = shift; + + return $self->{ $self->{shuttersDev} }->{$attr}->{posAssignment} + if ( + exists( $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} ) < 2 + ); + $shutters->$getFn; + + return ( $self->{ $self->{shuttersDev} }->{$attr}->{posAssignment} ); +} + +sub setAntiFreezePos { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Antifreeze_Pos', $attrVal ); + + return; +} + +sub getAntiFreezePos { + my $self = shift; + + return $shutters->_getPosition( 'ASC_Antifreeze_Pos', +'ASC_Antifreeze_Pos:5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100' + ); +} + +sub getAntiFreezePosAssignment { + my $self = shift; + + return $shutters->_getPositionAssignment( 'ASC_Antifreeze_Pos', + 'getAntiFreezePos' ); +} + +sub setShuttersPlace { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_ShuttersPlace', $attrVal ); + + return; +} + +sub getShuttersPlace { + my $self = shift; + + return AttrVal( $self->{shuttersDev}, 'ASC_ShuttersPlace', 'window' ); +} + +sub setSlatPosCmd { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_SlatPosCmd_SlatDevice', + $attrVal ); + + return; +} + +sub getSlatPosCmd { + my $self = shift; + + return $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice} + ->{poscmd} + if ( + exists( + $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice} + ->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice} + ->{LASTGETTIME} ) < 2 + ); + $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}->{LASTGETTIME} + = int( gettimeofday() ); + my ( $slatPosCmd, $slatDevice ) = + FHEM::Automation::ShuttersControl::GetAttrValues( $self->{shuttersDev}, + 'ASC_SlatPosCmd_SlatDevice', 'none:none' ); + + ## Erwartetes Ergebnis + # upTime:upBrightnessVal + + $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}->{poscmd} = + $slatPosCmd; + $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}->{device} = + $slatDevice; + + return $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice} + ->{poscmd}; +} + +sub getSlatDevice { + my $self = shift; + + return $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice} + ->{device} + if ( + exists( + $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice} + ->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice} + ->{LASTGETTIME} ) < 2 + ); + $shutters->getSlatPosCmd; + + return ( + $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}->{device} + ); +} + +sub setPrivacyUpTime { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_PrivacyUpValue_beforeDayOpen', + $attrVal ); + + return; +} + +sub getPrivacyUpTime { + my $self = shift; + + return $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} + ->{uptime} + if ( + exists( + $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} + ->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} + ->{LASTGETTIME} ) < 2 + ); + $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} + ->{LASTGETTIME} = int( gettimeofday() ); + my ( $upTime, $upBrightnessVal ) = + FHEM::Automation::ShuttersControl::GetAttrValues( $self->{shuttersDev}, + 'ASC_PrivacyUpValue_beforeDayOpen', '-1:-1' ); + + ## Erwartetes Ergebnis + # upTime:upBrightnessVal + + $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} + ->{uptime} = $upTime; + $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} + ->{upbrightnessval} = + ( $upBrightnessVal ne 'none' ? $upBrightnessVal : -1 ); + + $shutters->setPrivacyUpStatus(0) + if ( defined( $shutters->getPrivacyUpStatus ) + && $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} + ->{uptime} == -1 ); + + return $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} + ->{uptime}; +} + +sub getPrivacyUpBrightnessVal { + my $self = shift; + + return $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} + ->{upbrightnessval} + if ( + exists( + $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} + ->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} + ->{LASTGETTIME} ) < 2 + ); + $shutters->getPrivacyUpTime; + + return ( + defined( + $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} + ->{upbrightnessval} + ) + ? $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} + ->{upbrightnessval} + : -1 + ); +} + +sub setPrivacyDownTime { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, + 'ASC_PrivacyDownValue_beforeNightClose', $attrVal ); + + return; +} + +sub getPrivacyDownTime { + my $self = shift; + + return $self->{ $self->{shuttersDev} } + ->{ASC_PrivacyDownValue_beforeNightClose}->{downtime} + if ( + exists( + $self->{ $self->{shuttersDev} } + ->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} } + ->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME} ) < 2 + ); + $self->{ $self->{shuttersDev} }->{ASC_PrivacyDownValue_beforeNightClose} + ->{LASTGETTIME} = int( gettimeofday() ); + my ( $downTime, $downBrightnessVal ) = + FHEM::Automation::ShuttersControl::GetAttrValues( $self->{shuttersDev}, + 'ASC_PrivacyDownValue_beforeNightClose', '-1:-1' ); + + ## Erwartetes Ergebnis + # downTime:downBrightnessVal + + $self->{ $self->{shuttersDev} }->{ASC_PrivacyDownValue_beforeNightClose} + ->{downtime} = $downTime; + $self->{ $self->{shuttersDev} }->{ASC_PrivacyDownValue_beforeNightClose} + ->{downbrightnessval} = + ( $downBrightnessVal ne 'none' ? $downBrightnessVal : -1 ); + + $shutters->setPrivacyDownStatus(0) + if ( defined( $shutters->getPrivacyDownStatus ) + && $self->{ $self->{shuttersDev} } + ->{ASC_PrivacyDownValue_beforeNightClose}->{downtime} == -1 ); + + return $self->{ $self->{shuttersDev} } + ->{ASC_PrivacyDownValue_beforeNightClose}->{downtime}; +} + +sub getPrivacyDownBrightnessVal { + my $self = shift; + + return $self->{ $self->{shuttersDev} } + ->{ASC_PrivacyDownValue_beforeNightClose}->{downbrightnessval} + if ( + exists( + $self->{ $self->{shuttersDev} } + ->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} } + ->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME} ) < 2 + ); + $shutters->getPrivacyDownTime; + + return ( + defined( + $self->{ $self->{shuttersDev} } + ->{ASC_PrivacyDownValue_beforeNightClose}->{downbrightnessval} + ) + ? $self->{ $self->{shuttersDev} } + ->{ASC_PrivacyDownValue_beforeNightClose}->{downbrightnessval} + : -1 + ); +} + +sub setPrivacyUpPos { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_PrivacyUp_Pos', $attrVal ); + + return; +} + +sub getPrivacyUpPos { + my $self = shift; + + return $shutters->_getPosition( 'ASC_PrivacyUp_Pos', 'ASC_PrivacyUp_Pos' ); +} + +sub getPrivacyUpPositionAssignment { + my $self = shift; + + return $shutters->_getPositionAssignment( 'ASC_PrivacyUp_Pos', + 'getPrivacyUpPos' ); +} + +sub setPrivacyDownPos { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_PrivacyDown_Pos', $attrVal ); + + return; +} + +sub getPrivacyDownPos { + my $self = shift; + + return $shutters->_getPosition( 'ASC_PrivacyDown_Pos', + 'ASC_PrivacyDown_Pos' ); +} + +sub getPrivacyDownPositionAssignment { + my $self = shift; + + return $shutters->_getPositionAssignment( 'ASC_PrivacyDown_Pos', + 'getPrivacyDownPos' ); +} + +sub setSelfDefenseMode { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Self_Defense_Mode', $attrVal ); + + return; +} + +sub getSelfDefenseMode { + my $self = shift; + + return AttrVal( $self->{shuttersDev}, 'ASC_Self_Defense_Mode', 'gone' ); +} + +sub setSelfDefenseAbsentDelay { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Self_Defense_AbsentDelay', + $attrVal ); + + return; +} + +sub getSelfDefenseAbsentDelay { + my $self = shift; + + return AttrVal( $self->{shuttersDev}, 'ASC_Self_Defense_AbsentDelay', 300 ); +} + +sub setWiggleValue { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_WiggleValue', $attrVal ); + + return; +} + +sub getWiggleValue { + my $self = shift; + + return AttrVal( $self->{shuttersDev}, 'ASC_WiggleValue', 5 ); +} + +sub setAdv { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Adv', $attrVal ); + + return; +} + +sub getAdv { + my $self = shift; + + return ( + AttrVal( $self->{shuttersDev}, 'ASC_Adv', 'off' ) eq 'on' + ? ( FHEM::Automation::ShuttersControl::_IsAdv == 1 ? 1 : 0 ) + : 0 + ); +} + +### Begin Beschattung +sub setShadingPos { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Shading_Pos', $attrVal ); + + return; +} + +sub getShadingPos { + my $self = shift; + + return $shutters->_getPosition( 'ASC_Shading_Pos', + 'ASC_Shading_Pos:10,20,30,40,50,60,70,80,90,100' ); +} + +sub getShadingPositionAssignment { + my $self = shift; + + return $shutters->_getPositionAssignment( 'ASC_Shading_Pos', + 'getShadingPos' ); +} + +sub setShadingMode { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Shading_Mode', $attrVal ); + + return; +} + +sub getShadingMode { + my $self = shift; + + return AttrVal( $self->{shuttersDev}, 'ASC_Shading_Mode', 'off' ); +} + +sub _getTempSensor { + my $self = shift; + + return $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{device} + if ( + exists( + $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} ) + < 2 + ); + $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} = + int( gettimeofday() ); + my ( $device, $reading ) = + FHEM::Automation::ShuttersControl::GetAttrValues( $self->{shuttersDev}, + 'ASC_TempSensor', 'none' ); + + ### erwartetes Ergebnis + # DEVICE:READING + $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{device} = $device; + $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{reading} = + ( $reading ne 'none' ? $reading : 'temperature' ); + + return $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{device}; +} + +sub getTempSensorReading { + my $self = shift; + + return $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{reading} + if ( + exists( + $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} ) + < 2 + ); + $shutters->_getTempSensor; + + return ( + defined( $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{reading} ) + ? $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{reading} + : 'temperature' + ); +} + +sub setIdleDetectionReading { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Shutter_IdleDetection', + $attrVal ); + + return; +} + +sub _getIdleDetectionReading { + my $self = shift; + + return $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection} + ->{reading} + if ( + exists( + $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection} + ->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection} + ->{LASTGETTIME} ) < 2 + ); + $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}->{LASTGETTIME} + = int( gettimeofday() ); + my ( $reading, $value ) = + FHEM::Automation::ShuttersControl::GetAttrValues( $self->{shuttersDev}, + 'ASC_Shutter_IdleDetection', 'none' ); + + ### erwartetes Ergebnis + # READING:VALUE + $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}->{reading} = + $reading; + $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}->{value} = + $value; + + return $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection} + ->{reading}; +} + +sub getIdleDetectionValue { + my $self = shift; + + return $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}->{value} + if ( + exists( + $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection} + ->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection} + ->{LASTGETTIME} ) < 2 + ); + $shutters->_getIdleDetectionReading; + + return ( + defined( + $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection} + ->{value} + ) + ? $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}->{value} + : 'none' + ); +} + +sub setBrightnessSensor { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_BrightnessSensor', $attrVal ); + + return; +} + +sub _getBrightnessSensor { + my $self = shift; + + return $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{device} + if ( + exists( + $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor} + ->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor} + ->{LASTGETTIME} ) < 2 + ); + $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{LASTGETTIME} = + int( gettimeofday() ); + my ( $device, $reading, $max, $min ) = + FHEM::Automation::ShuttersControl::GetAttrValues( $self->{shuttersDev}, + 'ASC_BrightnessSensor', 'none' ); + + ### erwartetes Ergebnis + # DEVICE:READING MAX:MIN + $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{device} = $device; + $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{reading} = + ( $reading ne 'none' ? $reading : 'brightness' ); + $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{triggermin} = + ( $min ne 'none' ? $min : -1 ); + $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{triggermax} = + ( $max ne 'none' ? $max : -1 ); + + return $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{device}; +} + +sub getBrightnessReading { + my $self = shift; + + return $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{reading} + if ( + exists( + $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor} + ->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor} + ->{LASTGETTIME} ) < 2 + ); + $shutters->_getBrightnessSensor; + + return ( + defined( + $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{reading} + ) + ? $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{reading} + : 'brightness' + ); +} + +sub getShadingAzimuthLeft { + my $self = shift; + + return $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth} + ->{leftVal} + if ( + exists( + $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth} + ->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth} + ->{LASTGETTIME} ) < 2 + ); + $shutters->getShadingAzimuthRight; + + return $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth} + ->{leftVal}; +} + +sub setShadingInOutAzimuth { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Shading_InOutAzimuth', $attrVal ); + + return; +} + +sub getShadingAzimuthRight { + my $self = shift; + + return $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth} + ->{rightVal} + if ( + exists( + $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth} + ->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth} + ->{LASTGETTIME} ) < 2 + ); + $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}->{LASTGETTIME} + = int( gettimeofday() ); + my ( $left, $right ) = + FHEM::Automation::ShuttersControl::GetAttrValues( $self->{shuttersDev}, + 'ASC_Shading_InOutAzimuth', '95:265' ); + + ### erwartetes Ergebnis + # MIN:MAX + + $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}->{leftVal} = + $left; + $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}->{rightVal} = + $right; + + return $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth} + ->{rightVal}; +} + +sub setShadingMinOutsideTemperature { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Shading_Min_OutsideTemperature', + $attrVal ); + + return; +} + +sub getShadingMinOutsideTemperature { + my $self = shift; + + return AttrVal( $self->{shuttersDev}, 'ASC_Shading_Min_OutsideTemperature', + 18 ); +} + +sub setShadingMinMaxElevation { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Shading_MinMax_Elevation', + $attrVal ); + + return; +} + +sub getShadingMinElevation { + my $self = shift; + + return $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation} + ->{minVal} + if ( + exists( + $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation} + ->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation} + ->{LASTGETTIME} ) < 2 + ); + $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation} + ->{LASTGETTIME} = int( gettimeofday() ); + my ( $min, $max ) = + FHEM::Automation::ShuttersControl::GetAttrValues( $self->{shuttersDev}, + 'ASC_Shading_MinMax_Elevation', '25.0:100.0' ); + + ### erwartetes Ergebnis + # MIN:MAX + + $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}->{minVal} = + $min; + $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}->{maxVal} = + ( $max ne 'none' ? $max : 100 ); + + return $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation} + ->{minVal}; +} + +sub getShadingMaxElevation { + my $self = shift; + + return $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation} + ->{maxVal} + if ( + exists( + $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation} + ->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation} + ->{LASTGETTIME} ) < 2 + ); + $shutters->getShadingMinElevation; + + return $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation} + ->{maxVal}; +} + +sub setShadingStateChangeSunnyCloudy { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Shading_StateChange_SunnyCloudy', + $attrVal ); + + return; +} + +sub getShadingStateChangeSunny { + my $self = shift; + + return $self->{ $self->{shuttersDev} } + ->{ASC_Shading_StateChange_SunnyCloudy}->{sunny} + if ( + exists( + $self->{ $self->{shuttersDev} } + ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} } + ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} ) < 2 + ); + $self->{ $self->{shuttersDev} }->{ASC_Shading_StateChange_SunnyCloudy} + ->{LASTGETTIME} = int( gettimeofday() ); + my ( $sunny, $cloudy, $maxBrightnessAverageArrayObjects ) = + FHEM::Automation::ShuttersControl::GetAttrValues( $self->{shuttersDev}, + 'ASC_Shading_StateChange_SunnyCloudy', + '35000:20000' ); + + ### erwartetes Ergebnis + # SUNNY:CLOUDY [BrightnessAverage] + + $self->{ $self->{shuttersDev} }->{ASC_Shading_StateChange_SunnyCloudy} + ->{sunny} = $sunny; + $self->{ $self->{shuttersDev} }->{ASC_Shading_StateChange_SunnyCloudy} + ->{cloudy} = $cloudy; + $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{MAXOBJECT} = ( + defined($maxBrightnessAverageArrayObjects) + && $maxBrightnessAverageArrayObjects ne 'none' + ? $maxBrightnessAverageArrayObjects + : 3 + ); + + return $self->{ $self->{shuttersDev} } + ->{ASC_Shading_StateChange_SunnyCloudy}->{sunny}; +} + +sub getShadingStateChangeCloudy { + my $self = shift; + + return $self->{ $self->{shuttersDev} } + ->{ASC_Shading_StateChange_SunnyCloudy}->{cloudy} + if ( + exists( + $self->{ $self->{shuttersDev} } + ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} } + ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} ) < 2 + ); + $shutters->getShadingStateChangeSunny; + + return $self->{ $self->{shuttersDev} } + ->{ASC_Shading_StateChange_SunnyCloudy}->{cloudy}; +} + +sub getMaxBrightnessAverageArrayObjects { + my $self = shift; + + return $self->{ $self->{shuttersDev} }->{BrightnessAverageArray} + ->{MAXOBJECT} + if ( + exists( + $self->{ $self->{shuttersDev} } + ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} } + ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} ) < 2 + ); + $shutters->getShadingStateChangeSunny; + + return $self->{ $self->{shuttersDev} }->{BrightnessAverageArray} + ->{MAXOBJECT}; +} + +sub setShadingWaitingPeriod { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Shading_WaitingPeriod', + $attrVal ); + + return; +} + +sub getShadingWaitingPeriod { + my $self = shift; + + return AttrVal( $self->{shuttersDev}, 'ASC_Shading_WaitingPeriod', 1200 ); +} +### Ende Beschattung +sub setExternalTrigger { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_ExternalTrigger', $attrVal ); + + return; +} + +sub getExternalTriggerDevice { + my $self = shift; + + return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{device} + if ( + exists( + $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} + ->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} + ->{LASTGETTIME} ) < 2 + ); + $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{LASTGETTIME} = + int( gettimeofday() ); + my ( $device, $reading, $valueActive, $valueInactive, $posActive, + $posInactive, $valueActive2, $posActive2 ) + = FHEM::Automation::ShuttersControl::GetAttrValues( $self->{shuttersDev}, + 'ASC_ExternalTrigger', 'none' ); + + ### erwartetes Ergebnis +# DEVICE:READING VALUEACTIVE:VALUEINACTIVE POSACTIVE:POSINACTIVE VALUEACTIVE2:POSACTIVE2 + + $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{device} = + $device; + $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{reading} = + $reading; + $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{valueactive} = + $valueActive; + $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{valueinactive} = + $valueInactive; + $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive} = + $posActive; + $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posinactive} = + ( $posInactive ne 'none' ? $posInactive : $shutters->getLastPos ); + $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{valueactive2} = + $valueActive2; + $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive2} = + $posActive2; + + return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{device}; + +} + +sub getExternalTriggerReading { + my $self = shift; + + return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{reading} + if ( + exists( + $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} + ->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} + ->{LASTGETTIME} ) < 2 + ); + $shutters->getExternalTriggerDevice; + + return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{reading}; +} + +sub getExternalTriggerValueActive { + my $self = shift; + + return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{valueactive} + if ( + exists( + $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} + ->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} + ->{LASTGETTIME} ) < 2 + ); + $shutters->getExternalTriggerDevice; + + return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} + ->{valueactive}; +} + +sub getExternalTriggerValueActive2 { + my $self = shift; + + return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} + ->{valueactive2} + if ( + exists( + $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} + ->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} + ->{LASTGETTIME} ) < 2 + ); + $shutters->getExternalTriggerDevice; + + return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} + ->{valueactive2}; +} + +sub getExternalTriggerValueInactive { + my $self = shift; + + return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} + ->{valueinactive} + if ( + exists( + $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} + ->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} + ->{LASTGETTIME} ) < 2 + ); + $shutters->getExternalTriggerDevice; + + return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} + ->{valueinactive}; +} + +sub getExternalTriggerPosActive { + my $self = shift; + + return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive} + if ( + exists( + $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} + ->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} + ->{LASTGETTIME} ) < 2 + ); + $shutters->getExternalTriggerDevice; + + return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive}; +} + +sub getExternalTriggerPosActive2 { + my $self = shift; + + return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive2} + if ( + exists( + $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} + ->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} + ->{LASTGETTIME} ) < 2 + ); + $shutters->getExternalTriggerDevice; + + return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive2}; +} + +sub getExternalTriggerPosInactive { + my $self = shift; + + return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posinactive} + if ( + exists( + $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} + ->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} + ->{LASTGETTIME} ) < 2 + ); + $shutters->getExternalTriggerDevice; + + return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} + ->{posinactive}; +} + +sub getExternalTriggerState { + my $self = shift; + + return ( + ( + defined( + $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{event} + ) + and + $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{event} + ) ? 1 : 0 + ); +} + +sub setDelay { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Drive_Delay', $attrVal ); + + return; +} + +sub getDelay { + my $self = shift; + + my $val = AttrVal( $self->{shuttersDev}, 'ASC_Drive_Delay', -1 ); + return ( $val =~ m{^\d+$}xms ? $val : -1 ); +} + +sub setDelayStart { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Drive_DelayStart', $attrVal ); + + return; +} + +sub getDelayStart { + my $self = shift; + + my $val = AttrVal( $self->{shuttersDev}, 'ASC_Drive_DelayStart', -1 ); + return ( ( $val > 0 && $val =~ m{^\d+$}xms ) ? $val : -1 ); +} + +sub setBlockingTimeAfterManual { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_BlockingTime_afterManual', + $attrVal ); + + return; +} + +sub getBlockingTimeAfterManual { + my $self = shift; + + return AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_afterManual', + 1200 ); +} + +sub setBlockingTimeBeforNightClose { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_BlockingTime_beforNightClose', + $attrVal ); + + return; +} + +sub getBlockingTimeBeforNightClose { + my $self = shift; + + return AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_beforNightClose', + 3600 ); +} + +sub setBlockingTimeBeforDayOpen { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_BlockingTime_beforDayOpen', + $attrVal ); + + return; +} + +sub getBlockingTimeBeforDayOpen { + my $self = shift; + + return AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_beforDayOpen', + 3600 ); +} + +sub setPosCmd { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Pos_Reading', $attrVal ); + + return; +} + +sub getPosCmd { + my $self = shift; + + return AttrVal( $self->{shuttersDev}, 'ASC_Pos_Reading', + $userAttrList{'ASC_Pos_Reading'} + [ AttrVal( $self->{shuttersDev}, 'ASC', 1 ) ] ); +} + +sub setOpenPos { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Open_Pos', $attrVal ); + + return; +} + +sub getOpenPos { + my $self = shift; + + return $shutters->_getPosition( 'ASC_Open_Pos', + 'ASC_Open_Pos:0,10,20,30,40,50,60,70,80,90,100' ); +} + +sub getOpenPositionAssignment { + my $self = shift; + + return $shutters->_getPositionAssignment( 'ASC_Open_Pos', 'getOpenPos' ); +} + +sub setVentilatePos { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Ventilate_Pos', $attrVal ); + + return; +} + +sub getVentilatePos { + my $self = shift; + + return $shutters->_getPosition( 'ASC_Ventilate_Pos', + 'ASC_Ventilate_Pos:10,20,30,40,50,60,70,80,90,100' ); +} + +sub getVentilatePositionAssignment { + my $self = shift; + + return $shutters->_getPositionAssignment( 'ASC_Ventilate_Pos', + 'getVentilatePos' ); +} + +sub setVentilatePosAfterDayClosed { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_WindowRec_PosAfterDayClosed', + $attrVal ); + + return; +} + +sub getVentilatePosAfterDayClosed { + my $self = shift; + + return AttrVal( $self->{shuttersDev}, 'ASC_WindowRec_PosAfterDayClosed', + 'open' ); +} + +sub setClosedPos { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Closed_Pos', $attrVal ); + + return; +} + +sub getClosedPos { + my $self = shift; + + return $shutters->_getPosition( 'ASC_Closed_Pos', + 'ASC_Closed_Pos:0,10,20,30,40,50,60,70,80,90,100' ); +} + +sub getClosedPositionAssignment { + my $self = shift; + + return $shutters->_getPositionAssignment( 'ASC_Closed_Pos', + 'getClosedPos' ); +} + +sub setSleepPos { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Sleep_Pos', $attrVal ); + + return; +} + +sub getSleepPos { + my $self = shift; + + return $shutters->_getPosition( 'ASC_Sleep_Pos', + 'ASC_Sleep_Pos:0,10,20,30,40,50,60,70,80,90,100' ); +} + +sub getSleepPositionAssignment { + my $self = shift; + + return $shutters->_getPositionAssignment( 'ASC_Sleep_Pos', 'getSleepPos' ); +} + +sub setVentilateOpen { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Ventilate_Window_Open', + $attrVal ); + + return; +} + +sub getVentilateOpen { + my $self = shift; + + return AttrVal( $self->{shuttersDev}, 'ASC_Ventilate_Window_Open', 'on' ); +} + +sub setComfortOpenPos { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_ComfortOpen_Pos', $attrVal ); + + return; +} + +sub getComfortOpenPos { + my $self = shift; + + return $shutters->_getPosition( 'ASC_ComfortOpen_Pos', + 'ASC_ComfortOpen_Pos:0,10,20,30,40,50,60,70,80,90,100' ); +} + +sub getComfortOpenPositionAssignment { + my $self = shift; + + return $shutters->_getPositionAssignment( 'ASC_ComfortOpen_Pos', + 'getComfortOpenPos' ); +} + +sub setPartyMode { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Partymode', $attrVal ); + + return; +} + +sub getPartyMode { + my $self = shift; + + return AttrVal( $self->{shuttersDev}, 'ASC_Partymode', 'off' ); +} + +sub setRoommates { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Roommate_Device', $attrVal ); + + return; +} + +sub getRoommates { + my $self = shift; + + return AttrVal( $self->{shuttersDev}, 'ASC_Roommate_Device', 'none' ); +} + +sub setRoommatesReading { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Roommate_Reading', $attrVal ); + + return; +} + +sub getRoommatesReading { + my $self = shift; + + return AttrVal( $self->{shuttersDev}, 'ASC_Roommate_Reading', 'state' ); +} + +sub getWindPos { + my $self = shift; + + my $name = $self->{name}; + + return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{closedPos} + if ( + exists( + $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME} + ) < 2 + ); + $shutters->getWindMax; + + return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{closedPos}; +} + +sub getWindMax { + my $self = shift; + + my $name = $self->{name}; + + return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggermax} + if ( + exists( + $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME} + ) < 2 + ); + $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME} = + int( gettimeofday() ); + my ( $max, $hyst, $pos ) = + FHEM::Automation::ShuttersControl::GetAttrValues( $self->{shuttersDev}, + 'ASC_WindParameters', '50:20' ); + + ## Erwartetes Ergebnis + # max:hyst pos + + $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggermax} = $max; + $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggerhyst} = + ( $hyst ne 'none' ? $max - $hyst : $max - 20 ); + $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{closedPos} = + ( $pos ne 'none' ? $pos : $shutters->getOpenPos ); + + return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggermax}; +} + +sub setWindParameters { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_WindParameters', $attrVal ); + + return; +} + +sub getWindMin { + my $self = shift; + + my $name = $self->{name}; + + return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggerhyst} + if ( + exists( + $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME} + ) < 2 + ); + $shutters->getWindMax; + + return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggerhyst}; +} + +sub setWindProtection { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_WindProtection', $attrVal ); + + return; +} + +sub getWindProtection { + my $self = shift; + + return AttrVal( $self->{shuttersDev}, 'ASC_WindProtection', 'off' ); +} + +sub setRainProtection { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_RainProtection', $attrVal ); + + return; +} + +sub getRainProtection { + my $self = shift; + + return AttrVal( $self->{shuttersDev}, 'ASC_RainProtection', 'off' ); +} + +sub setModeUp { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Mode_Up', $attrVal ); + + return; +} + +sub getModeUp { + my $self = shift; + + return AttrVal( $self->{shuttersDev}, 'ASC_Mode_Up', 'always' ); +} + +sub setModeDown { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Mode_Down', $attrVal ); + + return; +} + +sub getModeDown { + my $self = shift; + + return AttrVal( $self->{shuttersDev}, 'ASC_Mode_Down', 'always' ); +} + +sub setLockOut { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_LockOut', $attrVal ); + + return; +} + +sub getLockOut { + my $self = shift; + + return AttrVal( $self->{shuttersDev}, 'ASC_LockOut', 'off' ); +} + +sub setLockOutCmd { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_LockOut_Cmd', $attrVal ); + + return; +} + +sub getLockOutCmd { + my $self = shift; + + return AttrVal( $self->{shuttersDev}, 'ASC_LockOut_Cmd', 'none' ); +} + +sub setAntiFreeze { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Antifreeze', $attrVal ); + + return; +} + +sub getAntiFreeze { + my $self = shift; + + return AttrVal( $self->{shuttersDev}, 'ASC_Antifreeze', 'off' ); +} + +sub setAutoAstroModeMorning { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_AutoAstroModeMorning', $attrVal ); + + return; +} + +sub getAutoAstroModeMorning { + my $self = shift; + + return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeMorning', 'none' ); +} + +sub setAutoAstroModeEvening { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_AutoAstroModeEvening', $attrVal ); + + return; +} + +sub getAutoAstroModeEvening { + my $self = shift; + + return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeEvening', 'none' ); +} + +sub setAutoAstroModeMorningHorizon { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_AutoAstroModeMorningHorizon', + $attrVal ); + + return; +} + +sub getAutoAstroModeMorningHorizon { + my $self = shift; + + return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeMorningHorizon', + 0 ); +} + +sub setAutoAstroModeEveningHorizon { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_AutoAstroModeEveningHorizon', + $attrVal ); + + return; +} + +sub getAutoAstroModeEveningHorizon { + my $self = shift; + + return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeEveningHorizon', + 0 ); +} + +sub setUp { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Up', $attrVal ); + + return; +} + +sub getUp { + my $self = shift; + + return AttrVal( $self->{shuttersDev}, 'ASC_Up', 'astro' ); +} + +sub setDown { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Down', $attrVal ); + + return; +} + +sub getDown { + my $self = shift; + + return AttrVal( $self->{shuttersDev}, 'ASC_Down', 'astro' ); +} + +sub setTimeUpEarly { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Time_Up_Early', $attrVal ); + + return; +} + +sub getTimeUpEarly { + my $self = shift; + + my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_Early', '05:00' ); + + if ( defined( FHEM::Automation::ShuttersControl::_perlCodeCheck($val) ) ) { + $val = FHEM::Automation::ShuttersControl::_perlCodeCheck($val); + } + + return ( + $val =~ m{^(?:[01]?\d|2[0-3]):(?:[0-5]\d)(:(?:[0-5]\d))?$}xms + ? $val + : '05:00' + ); +} + +sub setTimeUpLate { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Time_Up_Late', $attrVal ); + + return; +} + +sub getTimeUpLate { + my $self = shift; + + my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_Late', '08:30' ); + + if ( defined( FHEM::Automation::ShuttersControl::_perlCodeCheck($val) ) ) { + $val = FHEM::Automation::ShuttersControl::_perlCodeCheck($val); + } + + return ( + $val =~ m{^(?:[01]?\d|2[0-3]):(?:[0-5]\d)(:(?:[0-5]\d))?$}xms + ? $val + : '08:30' + ); +} + +sub setTimeDownEarly { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Time_Down_Early', $attrVal ); + + return; +} + +sub getTimeDownEarly { + my $self = shift; + + my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Down_Early', '16:00' ); + + if ( defined( FHEM::Automation::ShuttersControl::_perlCodeCheck($val) ) ) { + $val = FHEM::Automation::ShuttersControl::_perlCodeCheck($val); + } + + return ( + $val =~ m{^(?:[01]?\d|2[0-3]):(?:[0-5]\d)(:(?:[0-5]\d))?$}xms + ? $val + : '16:00' + ); +} + +sub setTimeDownLate { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Time_Down_Late', $attrVal ); + + return; +} + +sub getTimeDownLate { + my $self = shift; + + my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Down_Late', '22:00' ); + + if ( defined( FHEM::Automation::ShuttersControl::_perlCodeCheck($val) ) ) { + $val = FHEM::Automation::ShuttersControl::_perlCodeCheck($val); + } + + return ( + $val =~ m{^(?:[01]?\d|2[0-3]):(?:[0-5]\d)(:(?:[0-5]\d))?$}xms + ? $val + : '22:00' + ); +} + +sub setTimeUpWeHoliday { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_Time_Up_WE_Holiday', $attrVal ); + + return; +} + +sub getTimeUpWeHoliday { + my $self = shift; + + my $val = + AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_WE_Holiday', '01:25' ); + + if ( defined( FHEM::Automation::ShuttersControl::_perlCodeCheck($val) ) ) { + $val = FHEM::Automation::ShuttersControl::_perlCodeCheck($val); + } + + return ( + $val =~ m{^(?:[01]?\d|2[0-3]):(?:[0-5]\d)(:(?:[0-5]\d))?$}xms + ? $val + : '01:25' + ); +} + +sub getBrightnessMinVal { + my $self = shift; + + return $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{triggermin} + if ( + exists( + $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor} + ->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor} + ->{LASTGETTIME} ) < 2 + ); + $shutters->_getBrightnessSensor; + + return $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor} + ->{triggermin}; +} + +sub getBrightnessMaxVal { + my $self = shift; + + return $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{triggermax} + if ( + exists( + $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor} + ->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor} + ->{LASTGETTIME} ) < 2 + ); + $shutters->_getBrightnessSensor; + + return $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor} + ->{triggermax}; +} + +sub setDriveUpMaxDuration { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_DriveUpMaxDuration', $attrVal ); + + return; +} + +sub getDriveUpMaxDuration { + my $self = shift; + + return AttrVal( $self->{shuttersDev}, 'ASC_DriveUpMaxDuration', 60 ); +} + + +1; diff --git a/lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm b/lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm new file mode 100644 index 0000000..00d7e16 --- /dev/null +++ b/lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm @@ -0,0 +1,92 @@ +############################################################################### +# +# Developed with Kate +# +# (c) 2018-2020 Copyright: Marko Oldenburg (leongaultier at gmail dot com) +# All rights reserved +# +# Special thanks goes to: +# - Bernd (Cluni) this module is based on the logic of his script "Rollladensteuerung für HM/ROLLO inkl. Abschattung und Komfortfunktionen in Perl" (https://forum.fhem.de/index.php/topic,73964.0.html) +# - Beta-User for many tests, many suggestions and good discussions +# - pc1246 write english commandref +# - FunkOdyssey commandref style +# - sledge fix many typo in commandref +# - many User that use with modul and report bugs +# - Christoph (christoph.kaiser.in) Patch that expand RegEx for Window Events +# - Julian (Loredo) expand Residents Events for new Residents functions +# - Christoph (Christoph Morrison) for fix Commandref, many suggestions and good discussions +# +# +# This script is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License,or +# any later version. +# +# The GNU General Public License can be found at +# http://www.gnu.org/copyleft/gpl.html. +# A copy is found in the textfile GPL.txt and important notices to the license +# from the author is found in LICENSE.txt distributed with these scripts. +# +# This script is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# +# $Id$ +# +############################################################################### + + +## Subklasse Readings von ASC_Shutters ## +package FHEM::Automation::ShuttersControl::Shutters::Readings; + +use strict; +use warnings; +use utf8; + +use GPUtils qw(GP_Import); + +## Import der FHEM Funktionen +BEGIN { + GP_Import( + qw( + ReadingsVal + ReadingsNum) + ); +} + +sub getBrightness { + my $self = shift; + + return ReadingsNum( $shutters->_getBrightnessSensor, + $shutters->getBrightnessReading, -1 ); +} + +sub getWindStatus { + my $self = shift; + + return ReadingsVal( $ascDev->_getWindSensor, + $ascDev->getWindSensorReading, -1 ); +} + +sub getStatus { + my $self = shift; + + return ReadingsNum( $self->{shuttersDev}, $shutters->getPosCmd, 0 ); +} + +sub getDelayCmd { + my $self = shift; + + return $self->{ $self->{shuttersDev} }{delayCmd}; +} + +sub getASCenable { + my $self = shift; + + return ReadingsVal( $self->{shuttersDev}, 'ASC_Enable', 'on' ); +} + + +1; diff --git a/lib/FHEM/Automation/ShuttersControl/Window.pm b/lib/FHEM/Automation/ShuttersControl/Window.pm new file mode 100644 index 0000000..9b4caae --- /dev/null +++ b/lib/FHEM/Automation/ShuttersControl/Window.pm @@ -0,0 +1,50 @@ +############################################################################### +# +# Developed with Kate +# +# (c) 2018-2020 Copyright: Marko Oldenburg (leongaultier at gmail dot com) +# All rights reserved +# +# Special thanks goes to: +# - Bernd (Cluni) this module is based on the logic of his script "Rollladensteuerung für HM/ROLLO inkl. Abschattung und Komfortfunktionen in Perl" (https://forum.fhem.de/index.php/topic,73964.0.html) +# - Beta-User for many tests, many suggestions and good discussions +# - pc1246 write english commandref +# - FunkOdyssey commandref style +# - sledge fix many typo in commandref +# - many User that use with modul and report bugs +# - Christoph (christoph.kaiser.in) Patch that expand RegEx for Window Events +# - Julian (Loredo) expand Residents Events for new Residents functions +# - Christoph (Christoph Morrison) for fix Commandref, many suggestions and good discussions +# +# +# This script is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License,or +# any later version. +# +# The GNU General Public License can be found at +# http://www.gnu.org/copyleft/gpl.html. +# A copy is found in the textfile GPL.txt and important notices to the license +# from the author is found in LICENSE.txt distributed with these scripts. +# +# This script is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# +# $Id$ +# +############################################################################### + +## Klasse Fenster (Window) und die Subklassen Attr und Readings ## +package FHEM::Automation::ShuttersControl::Window; + +use strict; +use warnings; +use utf8; + +our @ISA = qw(FHEM::Automation::ShuttersControl::Window::Attr FHEM::Automation::ShuttersControl::Window::Readings); + + +1; diff --git a/lib/FHEM/Automation/ShuttersControl/Window/Attr.pm b/lib/FHEM/Automation/ShuttersControl/Window/Attr.pm new file mode 100644 index 0000000..9e08d62 --- /dev/null +++ b/lib/FHEM/Automation/ShuttersControl/Window/Attr.pm @@ -0,0 +1,129 @@ +############################################################################### +# +# Developed with Kate +# +# (c) 2018-2020 Copyright: Marko Oldenburg (leongaultier at gmail dot com) +# All rights reserved +# +# Special thanks goes to: +# - Bernd (Cluni) this module is based on the logic of his script "Rollladensteuerung für HM/ROLLO inkl. Abschattung und Komfortfunktionen in Perl" (https://forum.fhem.de/index.php/topic,73964.0.html) +# - Beta-User for many tests, many suggestions and good discussions +# - pc1246 write english commandref +# - FunkOdyssey commandref style +# - sledge fix many typo in commandref +# - many User that use with modul and report bugs +# - Christoph (christoph.kaiser.in) Patch that expand RegEx for Window Events +# - Julian (Loredo) expand Residents Events for new Residents functions +# - Christoph (Christoph Morrison) for fix Commandref, many suggestions and good discussions +# +# +# This script is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License,or +# any later version. +# +# The GNU General Public License can be found at +# http://www.gnu.org/copyleft/gpl.html. +# A copy is found in the textfile GPL.txt and important notices to the license +# from the author is found in LICENSE.txt distributed with these scripts. +# +# This script is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# +# $Id$ +# +############################################################################### + +## Subklasse Attr von Klasse ASC_Window ## +package FHEM::Automation::ShuttersControl::Window::Attr; + +use strict; +use warnings; +use utf8; + +use GPUtils qw(GP_Import); + +## Import der FHEM Funktionen +BEGIN { + GP_Import( + qw( + AttrVal + gettimeofday) + ); +} + +sub setSubTyp { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_WindowRec_subType', $attrVal ); + + return; +} + +sub getSubTyp { + my $self = shift; + + return AttrVal( $self->{shuttersDev}, 'ASC_WindowRec_subType', 'twostate' ); +} + +sub setWinDev { + my $self = shift; + my $attrVal = shift; + + _setAttributs( $self->{shuttersDev}, 'ASC_WindowRec', $attrVal ); + + return; +} + +sub _getWinDev { + my $self = shift; + + return $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{device} + if ( + exists( + $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} ) < + 2 + ); + $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} = + int( gettimeofday() ); + my ( $device, $reading ) = + FHEM::Automation::ShuttersControl::GetAttrValues( $self->{shuttersDev}, + 'ASC_WindowRec', 'none' ); + + ### erwartetes Ergebnis + # DEVICE:READING VALUEACTIVE:VALUEINACTIVE POSACTIVE:POSINACTIVE + + $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{device} = + $device; + $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{reading} = + ( $reading ne 'none' ? $reading : 'state' ); + + return $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{device}; +} + +sub getWinDevReading { + my $self = shift; + + return $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{reading} + if ( + exists( + $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} + ) + && ( gettimeofday() - + $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} ) < + 2 + ); + $shutters->_getWinDev; + + return $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{reading}; +} + + +1; diff --git a/lib/FHEM/Automation/ShuttersControl/Window/Readings.pm b/lib/FHEM/Automation/ShuttersControl/Window/Readings.pm new file mode 100644 index 0000000..5e8ff5f --- /dev/null +++ b/lib/FHEM/Automation/ShuttersControl/Window/Readings.pm @@ -0,0 +1,65 @@ +############################################################################### +# +# Developed with Kate +# +# (c) 2018-2020 Copyright: Marko Oldenburg (leongaultier at gmail dot com) +# All rights reserved +# +# Special thanks goes to: +# - Bernd (Cluni) this module is based on the logic of his script "Rollladensteuerung für HM/ROLLO inkl. Abschattung und Komfortfunktionen in Perl" (https://forum.fhem.de/index.php/topic,73964.0.html) +# - Beta-User for many tests, many suggestions and good discussions +# - pc1246 write english commandref +# - FunkOdyssey commandref style +# - sledge fix many typo in commandref +# - many User that use with modul and report bugs +# - Christoph (christoph.kaiser.in) Patch that expand RegEx for Window Events +# - Julian (Loredo) expand Residents Events for new Residents functions +# - Christoph (Christoph Morrison) for fix Commandref, many suggestions and good discussions +# +# +# This script is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License,or +# any later version. +# +# The GNU General Public License can be found at +# http://www.gnu.org/copyleft/gpl.html. +# A copy is found in the textfile GPL.txt and important notices to the license +# from the author is found in LICENSE.txt distributed with these scripts. +# +# This script is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# +# $Id$ +# +############################################################################### + +## Subklasse Readings von Klasse ASC_Window ## +package FHEM::Automation::ShuttersControl::Window::Readings; + +use strict; +use warnings; +use utf8; + +use GPUtils qw(GP_Import); + +## Import der FHEM Funktionen +BEGIN { + GP_Import( + qw( + ReadingsVal) + ); +} + +sub getWinStatus { + my $self = shift; + + return ReadingsVal( $shutters->_getWinDev, $shutters->getWinDevReading, + 'closed' ); +} + + +1; From 4e0e9203c98b4282e24588b2631202844ed57bbe Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Wed, 3 Jun 2020 16:31:54 +0200 Subject: [PATCH 31/60] fix diverse Fehlermeldungen --- FHEM/73_AutoShuttersControl.pm | 19 ++++--- lib/FHEM/Automation/ShuttersControl.pm | 50 +++---------------- lib/FHEM/Automation/ShuttersControl/Dev.pm | 4 ++ .../Automation/ShuttersControl/Dev/Attr.pm | 5 +- .../ShuttersControl/Dev/Readings.pm | 3 ++ .../Automation/ShuttersControl/Roommate.pm | 2 + .../Automation/ShuttersControl/Shutters.pm | 9 ++++ .../ShuttersControl/Shutters/Attr.pm | 11 ++-- .../ShuttersControl/Shutters/Readings.pm | 3 ++ lib/FHEM/Automation/ShuttersControl/Window.pm | 3 ++ .../Automation/ShuttersControl/Window/Attr.pm | 2 + .../ShuttersControl/Window/Readings.pm | 2 + 12 files changed, 60 insertions(+), 53 deletions(-) diff --git a/FHEM/73_AutoShuttersControl.pm b/FHEM/73_AutoShuttersControl.pm index c8c716f..9468319 100644 --- a/FHEM/73_AutoShuttersControl.pm +++ b/FHEM/73_AutoShuttersControl.pm @@ -54,6 +54,13 @@ use GPUtils qw(GP_Import GP_Export); ## Import der FHEM Funktionen #-- Run before package compilation BEGIN { + # Import from main context + GP_Import( + qw( + readingFnAttributes + ) + ); + #-- Export to main context with different name GP_Export( qw( @@ -67,11 +74,11 @@ sub Initialize { ## Da ich mit package arbeite müssen in die Initialize für die jeweiligen hash Fn Funktionen der Funktionsname # und davor mit :: getrennt der eigentliche package Name des Modules - $hash->{SetFn} = \&Set; - $hash->{GetFn} = \&Get; - $hash->{DefFn} = \&Define; - $hash->{NotifyFn} = \&Notify; - $hash->{UndefFn} = \&Undef; + $hash->{SetFn} = \&FHEM::Automation::ShuttersControl::Set; + $hash->{GetFn} = \&FHEM::Automation::ShuttersControl::Get; + $hash->{DefFn} = \&FHEM::Automation::ShuttersControl::Define; + $hash->{NotifyFn} = \&FHEM::Automation::ShuttersControl::Notify; + $hash->{UndefFn} = \&FHEM::Automation::ShuttersControl::Undef; $hash->{AttrList} = 'ASC_tempSensor ' . 'ASC_brightnessDriveUpDown ' @@ -94,7 +101,7 @@ sub Initialize { . 'ASC_slatDriveCmdInverse:0,1 ' . $readingFnAttributes; $hash->{NotifyOrderPrefix} = '51-'; # Order Nummer für NotifyFn - $hash->{FW_detailFn} = \&ShuttersInformation; + $hash->{FW_detailFn} = \&FHEM::Automation::ShuttersControl::ShuttersInformation; $hash->{parseParams} = 1; return FHEM::Meta::InitMod( __FILE__, $hash ); diff --git a/lib/FHEM/Automation/ShuttersControl.pm b/lib/FHEM/Automation/ShuttersControl.pm index e9d29f0..6711034 100644 --- a/lib/FHEM/Automation/ShuttersControl.pm +++ b/lib/FHEM/Automation/ShuttersControl.pm @@ -76,6 +76,10 @@ use Date::Parse; use FHEM::Automation::ShuttersControl::Shutters; use FHEM::Automation::ShuttersControl::Dev; +require Exporter; +our @ISA = qw(Exporter); +our @Export = qw($shutters $ascDev %userAttrList); + # try to use JSON::MaybeXS wrapper # for chance of better performance + open code eval { @@ -202,7 +206,7 @@ BEGIN { ## Die Attributsliste welche an die Rolläden verteilt wird. Zusammen mit Default Werten -my %userAttrList = ( +our %userAttrList = ( 'ASC_Mode_Up:absent,always,off,home' => '-', 'ASC_Mode_Down:absent,always,off,home' => '-', 'ASC_Up:time,astro,brightness,roommate' => '-', @@ -285,8 +289,8 @@ my %posSetCmds = ( ); ## 2 Objekte werden erstellt -my $shutters = ASC_Shutters->new(); -my $ascDev = ASC_Dev->new(); +our $shutters = FHEM::Automation::ShuttersControl::Shutters->new(); +our $ascDev = FHEM::Automation::ShuttersControl::Dev->new(); sub ascAPIget { my ( $getCommand, $shutterDev, $value ) = @_; @@ -325,44 +329,6 @@ sub ascAPIset { return; } -sub Initialize { - my $hash = shift; - -## Da ich mit package arbeite müssen in die Initialize für die jeweiligen hash Fn Funktionen der Funktionsname - # und davor mit :: getrennt der eigentliche package Name des Modules - $hash->{SetFn} = \&Set; - $hash->{GetFn} = \&Get; - $hash->{DefFn} = \&Define; - $hash->{NotifyFn} = \&Notify; - $hash->{UndefFn} = \&Undef; - $hash->{AttrList} = - 'ASC_tempSensor ' - . 'ASC_brightnessDriveUpDown ' - . 'ASC_autoShuttersControlMorning:on,off ' - . 'ASC_autoShuttersControlEvening:on,off ' - . 'ASC_autoShuttersControlComfort:on,off ' - . 'ASC_residentsDev ' - . 'ASC_rainSensor ' - . 'ASC_autoAstroModeMorning:REAL,CIVIL,NAUTIC,ASTRONOMIC,HORIZON ' - . 'ASC_autoAstroModeMorningHorizon:-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9 ' - . 'ASC_autoAstroModeEvening:REAL,CIVIL,NAUTIC,ASTRONOMIC,HORIZON ' - . 'ASC_autoAstroModeEveningHorizon:-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9 ' - . 'ASC_freezeTemp:-5,-4,-3,-2,-1,0,1,2,3,4,5 ' - . 'ASC_shuttersDriveDelay ' - . 'ASC_twilightDevice ' - . 'ASC_windSensor ' - . 'ASC_expert:1 ' - . 'ASC_blockAscDrivesAfterManual:0,1 ' - . 'ASC_debug:1 ' - . 'ASC_slatDriveCmdInverse:0,1 ' - . $readingFnAttributes; - $hash->{NotifyOrderPrefix} = '51-'; # Order Nummer für NotifyFn - $hash->{FW_detailFn} = \&ShuttersInformation; - $hash->{parseParams} = 1; - - return FHEM::Meta::InitMod( __FILE__, $hash ); -} - sub Define { my $hash = shift // return; my $aArg = shift // return; @@ -398,7 +364,7 @@ sub Define { CommandAttr( undef, $name . ' icon fts_shutter_automatic' ) if ( AttrVal( $name, 'icon', 'none' ) eq 'none' ); CommandAttr( undef, - $name . ' devStateIcon { AutoShuttersControl_DevStateIcon($name) }' ) + $name . ' devStateIcon { ShuttersControl_DevStateIcon($name) }' ) if ( AttrVal( $name, 'devStateIcon', 'none' ) eq 'none' ); addToAttrList('ASC:0,1,2'); diff --git a/lib/FHEM/Automation/ShuttersControl/Dev.pm b/lib/FHEM/Automation/ShuttersControl/Dev.pm index 71a92bb..a426d96 100644 --- a/lib/FHEM/Automation/ShuttersControl/Dev.pm +++ b/lib/FHEM/Automation/ShuttersControl/Dev.pm @@ -39,6 +39,10 @@ ## Klasse ASC_Dev plus Subklassen ASC_Attr_Dev und ASC_Readings_Dev## package FHEM::Automation::ShuttersControl::Dev; + +use FHEM::Automation::ShuttersControl::Dev::Readings; +use FHEM::Automation::ShuttersControl::Dev::Attr; + our @ISA = qw(FHEM::Automation::ShuttersControl::Dev::Readings FHEM::Automation::ShuttersControl::Dev::Attr); use strict; diff --git a/lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm b/lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm index 3825771..fbfe5af 100644 --- a/lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm +++ b/lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm @@ -38,7 +38,7 @@ ############################################################################### ## Subklasse Attr ## -package ASC_Dev::Attr; +package FHEM::Automation::ShuttersControl::Dev::Attr; use strict; use warnings; @@ -46,6 +46,9 @@ use utf8; use GPUtils qw(GP_Import); +my $shutters = $FHEM::Automation::ShuttersControl::shutters; +my $ascDev = $FHEM::Automation::ShuttersControl::ascDev; + ## Import der FHEM Funktionen BEGIN { GP_Import( diff --git a/lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm b/lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm index c433750..c893a16 100644 --- a/lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm +++ b/lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm @@ -46,6 +46,9 @@ use utf8; use GPUtils qw(GP_Import); +my $shutters = $FHEM::Automation::ShuttersControl::shutters; +my $ascDev = $FHEM::Automation::ShuttersControl::ascDev; + ## Import der FHEM Funktionen BEGIN { GP_Import( diff --git a/lib/FHEM/Automation/ShuttersControl/Roommate.pm b/lib/FHEM/Automation/ShuttersControl/Roommate.pm index 071da3f..43f1f1f 100644 --- a/lib/FHEM/Automation/ShuttersControl/Roommate.pm +++ b/lib/FHEM/Automation/ShuttersControl/Roommate.pm @@ -46,6 +46,8 @@ use utf8; use GPUtils qw(GP_Import); +my $shutters = $FHEM::Automation::ShuttersControl::shutters; + ## Import der FHEM Funktionen BEGIN { GP_Import( diff --git a/lib/FHEM/Automation/ShuttersControl/Shutters.pm b/lib/FHEM/Automation/ShuttersControl/Shutters.pm index 058a1fa..37dd0d3 100644 --- a/lib/FHEM/Automation/ShuttersControl/Shutters.pm +++ b/lib/FHEM/Automation/ShuttersControl/Shutters.pm @@ -44,6 +44,12 @@ ## desweiteren wird noch die Klasse ASC_Roommate mit eingebunden package FHEM::Automation::ShuttersControl::Shutters; + +use FHEM::Automation::ShuttersControl::Shutters::Readings; +use FHEM::Automation::ShuttersControl::Shutters::Attr; +use FHEM::Automation::ShuttersControl::Roommate; +use FHEM::Automation::ShuttersControl::Window; + our @ISA = qw(FHEM::Automation::ShuttersControl::Shutters::Readings FHEM::Automation::ShuttersControl::Shutters::Attr FHEM::Automation::ShuttersControl::Roommate FHEM::Automation::ShuttersControl::Window); @@ -53,6 +59,9 @@ use utf8; use GPUtils qw(GP_Import); +my $shutters = $FHEM::Automation::ShuttersControl::shutters; +my $ascDev = $FHEM::Automation::ShuttersControl::ascDev; + ## Import der FHEM Funktionen BEGIN { GP_Import( diff --git a/lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm b/lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm index d132347..a60a1f5 100644 --- a/lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm +++ b/lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm @@ -46,6 +46,9 @@ use utf8; use GPUtils qw(GP_Import); +my $shutters = $FHEM::Automation::ShuttersControl::shutters; +my %userAttrList = %FHEM::Automation::ShuttersControl::userAttrList; + ## Import der FHEM Funktionen BEGIN { GP_Import( @@ -67,10 +70,10 @@ sub _setAttributs { } sub _getPosition { - my $self = shift; + my $self = shift; - my $attr = shift; - my $userAttrList = shift; + my $attr = shift; + my $userAttrList = shift; return $self->{ $self->{shuttersDev} }->{$attr}->{position} if ( @@ -529,7 +532,7 @@ sub getAdv { return ( AttrVal( $self->{shuttersDev}, 'ASC_Adv', 'off' ) eq 'on' - ? ( FHEM::Automation::ShuttersControl::_IsAdv == 1 ? 1 : 0 ) + ? ( \&FHEM::Automation::ShuttersControl::_IsAdv == 1 ? 1 : 0 ) : 0 ); } diff --git a/lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm b/lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm index 00d7e16..8ce109e 100644 --- a/lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm +++ b/lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm @@ -47,6 +47,9 @@ use utf8; use GPUtils qw(GP_Import); +my $shutters = $FHEM::Automation::ShuttersControl::shutters; +my $ascDev = $FHEM::Automation::ShuttersControl::ascDev; + ## Import der FHEM Funktionen BEGIN { GP_Import( diff --git a/lib/FHEM/Automation/ShuttersControl/Window.pm b/lib/FHEM/Automation/ShuttersControl/Window.pm index 9b4caae..a927849 100644 --- a/lib/FHEM/Automation/ShuttersControl/Window.pm +++ b/lib/FHEM/Automation/ShuttersControl/Window.pm @@ -44,6 +44,9 @@ use strict; use warnings; use utf8; +use FHEM::Automation::ShuttersControl::Window::Attr; +use FHEM::Automation::ShuttersControl::Window::Readings; + our @ISA = qw(FHEM::Automation::ShuttersControl::Window::Attr FHEM::Automation::ShuttersControl::Window::Readings); diff --git a/lib/FHEM/Automation/ShuttersControl/Window/Attr.pm b/lib/FHEM/Automation/ShuttersControl/Window/Attr.pm index 9e08d62..c388748 100644 --- a/lib/FHEM/Automation/ShuttersControl/Window/Attr.pm +++ b/lib/FHEM/Automation/ShuttersControl/Window/Attr.pm @@ -46,6 +46,8 @@ use utf8; use GPUtils qw(GP_Import); +my $shutters = $FHEM::Automation::ShuttersControl::shutters; + ## Import der FHEM Funktionen BEGIN { GP_Import( diff --git a/lib/FHEM/Automation/ShuttersControl/Window/Readings.pm b/lib/FHEM/Automation/ShuttersControl/Window/Readings.pm index 5e8ff5f..5789314 100644 --- a/lib/FHEM/Automation/ShuttersControl/Window/Readings.pm +++ b/lib/FHEM/Automation/ShuttersControl/Window/Readings.pm @@ -46,6 +46,8 @@ use utf8; use GPUtils qw(GP_Import); +my $shutters = $FHEM::Automation::ShuttersControl::shutters; + ## Import der FHEM Funktionen BEGIN { GP_Import( From c19f9728a0a74967ef308f1f0731f4d27d89dadc Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Wed, 3 Jun 2020 18:00:56 +0200 Subject: [PATCH 32/60] Ready for package and object methode --- .../Automation/ShuttersControl/Dev/Attr.pm | 23 +-- .../ShuttersControl/Dev/Readings.pm | 43 ++--- .../Automation/ShuttersControl/Roommate.pm | 4 +- .../Automation/ShuttersControl/Shutters.pm | 173 +++++++++--------- .../ShuttersControl/Shutters/Attr.pm | 107 ++++++----- .../ShuttersControl/Shutters/Readings.pm | 13 +- .../Automation/ShuttersControl/Window/Attr.pm | 4 +- .../ShuttersControl/Window/Readings.pm | 4 +- 8 files changed, 175 insertions(+), 196 deletions(-) diff --git a/lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm b/lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm index fbfe5af..3ae90b1 100644 --- a/lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm +++ b/lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm @@ -46,9 +46,6 @@ use utf8; use GPUtils qw(GP_Import); -my $shutters = $FHEM::Automation::ShuttersControl::shutters; -my $ascDev = $FHEM::Automation::ShuttersControl::ascDev; - ## Import der FHEM Funktionen BEGIN { GP_Import( @@ -74,7 +71,7 @@ sub getBrightnessMinVal { return $self->{ASC_brightness}->{triggermin} if ( exists( $self->{ASC_brightness}->{LASTGETTIME} ) && ( gettimeofday() - $self->{ASC_brightness}->{LASTGETTIME} ) < 2 ); - $ascDev->getBrightnessMaxVal; + $FHEM::Automation::ShuttersControl::ascDev->getBrightnessMaxVal; return $self->{ASC_brightness}->{triggermin}; } @@ -212,7 +209,7 @@ sub getTempSensorReading { return $self->{ASC_tempSensor}->{reading} if ( exists( $self->{ASC_tempSensor}->{LASTGETTIME} ) && ( gettimeofday() - $self->{ASC_tempSensor}->{LASTGETTIME} ) < 2 ); - $ascDev->_getTempSensor; + $FHEM::Automation::ShuttersControl::ascDev->_getTempSensor; return $self->{ASC_tempSensor}->{reading}; } @@ -244,7 +241,7 @@ sub getResidentsReading { return $self->{ASC_residentsDev}->{reading} if ( exists( $self->{ASC_residentsDev}->{LASTGETTIME} ) && ( gettimeofday() - $self->{ASC_residentsDev}->{LASTGETTIME} ) < 2 ); - $ascDev->_getResidentsDev; + $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev; return $self->{ASC_residentsDev}->{reading}; } @@ -275,7 +272,7 @@ sub _getRainSensor { : ( $self->{ASC_rainSensor}->{triggermax} * 0 ) ); $self->{ASC_rainSensor}->{shuttersClosedPos} = - ( $pos ne 'none' ? $pos : $shutters->getClosedPos ); + ( $pos ne 'none' ? $pos : $FHEM::Automation::ShuttersControl::shutters->getClosedPos ); $self->{ASC_rainSensor}->{waitingTime} = ( $pos ne 'none' ? $wait : 900 ); @@ -290,7 +287,7 @@ sub getRainSensorReading { return $self->{ASC_rainSensor}->{reading} if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} ) && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 ); - $ascDev->_getRainSensor; + $FHEM::Automation::ShuttersControl::ascDev->_getRainSensor; return $self->{ASC_rainSensor}->{reading}; } @@ -302,7 +299,7 @@ sub getRainTriggerMax { return $self->{ASC_rainSensor}->{triggermax} if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} ) && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 ); - $ascDev->_getRainSensor; + $FHEM::Automation::ShuttersControl::ascDev->_getRainSensor; return $self->{ASC_rainSensor}->{triggermax}; } @@ -314,7 +311,7 @@ sub getRainTriggerMin { return $self->{ASC_rainSensor}->{triggerhyst} if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} ) && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 ); - $ascDev->_getRainSensor; + $FHEM::Automation::ShuttersControl::ascDev->_getRainSensor; return $self->{ASC_rainSensor}->{triggerhyst}; } @@ -326,7 +323,7 @@ sub getRainSensorShuttersClosedPos { return $self->{ASC_rainSensor}->{shuttersClosedPos} if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} ) && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 ); - $ascDev->_getRainSensor; + $FHEM::Automation::ShuttersControl::ascDev->_getRainSensor; return $self->{ASC_rainSensor}->{shuttersClosedPos}; } @@ -338,7 +335,7 @@ sub getRainWaitingTime { return $self->{ASC_rainSensor}->{waitingTime} if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} ) && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 ); - $ascDev->_getRainSensor; + $FHEM::Automation::ShuttersControl::ascDev->_getRainSensor; return $self->{ASC_rainSensor}->{waitingTime}; } @@ -371,7 +368,7 @@ sub getWindSensorReading { return $self->{ASC_windSensor}->{reading} if ( exists( $self->{ASC_windSensor}->{LASTGETTIME} ) && ( gettimeofday() - $self->{ASC_windSensor}->{LASTGETTIME} ) < 2 ); - $ascDev->_getWindSensor; + $FHEM::Automation::ShuttersControl::ascDev->_getWindSensor; return ( defined( $self->{ASC_windSensor}->{reading} ) ? $self->{ASC_windSensor}->{reading} diff --git a/lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm b/lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm index c893a16..ef3cddf 100644 --- a/lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm +++ b/lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm @@ -46,9 +46,6 @@ use utf8; use GPUtils qw(GP_Import); -my $shutters = $FHEM::Automation::ShuttersControl::shutters; -my $ascDev = $FHEM::Automation::ShuttersControl::ascDev; - ## Import der FHEM Funktionen BEGIN { GP_Import( @@ -66,8 +63,8 @@ sub setDelayCmdReading { my $hash = $defs{$name}; readingsSingleUpdate( $hash, - $shutters->getShuttersDev . '_lastDelayPosValue', - $shutters->getDelayCmd, 1 ); + $FHEM::Automation::ShuttersControl::shutters->getShuttersDev . '_lastDelayPosValue', + $FHEM::Automation::ShuttersControl::shutters->getDelayCmd, 1 ); return; } @@ -79,7 +76,7 @@ sub setStateReading { my $hash = $defs{$name}; readingsSingleUpdate( $hash, 'state', - ( defined($value) ? $value : $shutters->getLastDrive ), 1 ); + ( defined($value) ? $value : $FHEM::Automation::ShuttersControl::shutters->getLastDrive ), 1 ); return; } @@ -89,8 +86,8 @@ sub setPosReading { my $name = $self->{name}; my $hash = $defs{$name}; - readingsSingleUpdate( $hash, $shutters->getShuttersDev . '_PosValue', - $shutters->getStatus, 1 ); + readingsSingleUpdate( $hash, $FHEM::Automation::ShuttersControl::shutters->getShuttersDev . '_PosValue', + $FHEM::Automation::ShuttersControl::shutters->getStatus, 1 ); return; } @@ -100,8 +97,8 @@ sub setLastPosReading { my $name = $self->{name}; my $hash = $defs{$name}; - readingsSingleUpdate( $hash, $shutters->getShuttersDev . '_lastPosValue', - $shutters->getLastPos, 1 ); + readingsSingleUpdate( $hash, $FHEM::Automation::ShuttersControl::shutters->getShuttersDev . '_lastPosValue', + $FHEM::Automation::ShuttersControl::shutters->getLastPos, 1 ); return; } @@ -141,7 +138,7 @@ sub getMonitoredDevs { sub getOutTemp { my $self = shift; - return ReadingsVal( $ascDev->_getTempSensor, $ascDev->getTempSensorReading, + return ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getTempSensor, $FHEM::Automation::ShuttersControl::ascDev->getTempSensorReading, -100 ); } @@ -149,7 +146,7 @@ sub getResidentsStatus { my $self = shift; my $val = - ReadingsVal( $ascDev->_getResidentsDev, $ascDev->getResidentsReading, + ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev, $FHEM::Automation::ShuttersControl::ascDev->getResidentsReading, 'none' ); if ( $val =~ m{^(?:(.+)_)?(.+)$}xms ) { @@ -157,7 +154,7 @@ sub getResidentsStatus { return $1 && $1 eq 'pet' ? 'absent' : $2; } elsif ( - ReadingsVal( $ascDev->_getResidentsDev, 'homealoneType', '-' ) eq + ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev, 'homealoneType', '-' ) eq 'PET' ) { return ( 'pet', 'absent' ) if (wantarray); @@ -172,14 +169,14 @@ sub getResidentsStatus { sub getResidentsLastStatus { my $self = shift; - my $val = ReadingsVal( $ascDev->_getResidentsDev, 'lastState', 'none' ); + my $val = ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev, 'lastState', 'none' ); if ( $val =~ m{^(?:(.+)_)?(.+)$}xms ) { return ( $1, $2 ) if (wantarray); return $1 && $1 eq 'pet' ? 'absent' : $2; } elsif ( - ReadingsVal( $ascDev->_getResidentsDev, 'lastHomealoneType', '-' ) eq + ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev, 'lastHomealoneType', '-' ) eq 'PET' ) { return ( 'pet', 'absent' ) if (wantarray); @@ -212,10 +209,10 @@ sub getAzimuth { my $azimuth; - $azimuth = ReadingsVal( $ascDev->_getTwilightDevice, 'azimuth', -1 ) - if ( $defs{ $ascDev->_getTwilightDevice }->{TYPE} eq 'Twilight' ); - $azimuth = ReadingsVal( $ascDev->_getTwilightDevice, 'SunAz', -1 ) - if ( $defs{ $ascDev->_getTwilightDevice }->{TYPE} eq 'Astro' ); + $azimuth = ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice, 'azimuth', -1 ) + if ( $defs{ $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice }->{TYPE} eq 'Twilight' ); + $azimuth = ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice, 'SunAz', -1 ) + if ( $defs{ $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice }->{TYPE} eq 'Astro' ); return $azimuth; } @@ -225,10 +222,10 @@ sub getElevation { my $elevation; - $elevation = ReadingsVal( $ascDev->_getTwilightDevice, 'elevation', -1 ) - if ( $defs{ $ascDev->_getTwilightDevice }->{TYPE} eq 'Twilight' ); - $elevation = ReadingsVal( $ascDev->_getTwilightDevice, 'SunAlt', -1 ) - if ( $defs{ $ascDev->_getTwilightDevice }->{TYPE} eq 'Astro' ); + $elevation = ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice, 'elevation', -1 ) + if ( $defs{ $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice }->{TYPE} eq 'Twilight' ); + $elevation = ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice, 'SunAlt', -1 ) + if ( $defs{ $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice }->{TYPE} eq 'Astro' ); return $elevation; } diff --git a/lib/FHEM/Automation/ShuttersControl/Roommate.pm b/lib/FHEM/Automation/ShuttersControl/Roommate.pm index 43f1f1f..b01aaf0 100644 --- a/lib/FHEM/Automation/ShuttersControl/Roommate.pm +++ b/lib/FHEM/Automation/ShuttersControl/Roommate.pm @@ -46,8 +46,6 @@ use utf8; use GPUtils qw(GP_Import); -my $shutters = $FHEM::Automation::ShuttersControl::shutters; - ## Import der FHEM Funktionen BEGIN { GP_Import( @@ -61,7 +59,7 @@ sub _getRoommateStatus { my $roommate = $self->{roommate}; - return ReadingsVal( $roommate, $shutters->getRoommatesReading, 'none' ); + return ReadingsVal( $roommate, $FHEM::Automation::ShuttersControl::shutters->getRoommatesReading, 'none' ); } sub _getRoommateLastStatus { diff --git a/lib/FHEM/Automation/ShuttersControl/Shutters.pm b/lib/FHEM/Automation/ShuttersControl/Shutters.pm index 37dd0d3..caa9c65 100644 --- a/lib/FHEM/Automation/ShuttersControl/Shutters.pm +++ b/lib/FHEM/Automation/ShuttersControl/Shutters.pm @@ -59,9 +59,6 @@ use utf8; use GPUtils qw(GP_Import); -my $shutters = $FHEM::Automation::ShuttersControl::shutters; -my $ascDev = $FHEM::Automation::ShuttersControl::ascDev; - ## Import der FHEM Funktionen BEGIN { GP_Import( @@ -113,19 +110,19 @@ sub setHardLockOut { my $self = shift; my $cmd = shift; - if ( $shutters->getLockOut eq 'hard' - && $shutters->getLockOutCmd ne 'none' ) + if ( $FHEM::Automation::ShuttersControl::shutters->getLockOut eq 'hard' + && $FHEM::Automation::ShuttersControl::shutters->getLockOutCmd ne 'none' ) { CommandSet( undef, $self->{shuttersDev} . ' inhibit ' . $cmd ) - if ( $shutters->getLockOutCmd eq 'inhibit' ); + if ( $FHEM::Automation::ShuttersControl::shutters->getLockOutCmd eq 'inhibit' ); CommandSet( undef, $self->{shuttersDev} . ' ' . ( $cmd eq 'on' ? 'blocked' : 'unblocked' ) ) - if ( $shutters->getLockOutCmd eq 'blocked' ); + if ( $FHEM::Automation::ShuttersControl::shutters->getLockOutCmd eq 'blocked' ); CommandSet( undef, $self->{shuttersDev} . ' ' . ( $cmd eq 'on' ? 'protectionOn' : 'protectionOff' ) ) - if ( $shutters->getLockOutCmd eq 'protected' ); + if ( $FHEM::Automation::ShuttersControl::shutters->getLockOutCmd eq 'protected' ); } return; } @@ -156,47 +153,47 @@ sub setDriveCmd { my $offSetStart; if ( - ( $shutters->getPartyMode eq 'on' && $ascDev->getPartyMode eq 'on' ) - || ( $shutters->getAdv - && !$shutters->getQueryShuttersPos($posValue) - && !$shutters->getAdvDelay - && !$shutters->getExternalTriggerState - && !$shutters->getSelfDefenseState ) + ( $FHEM::Automation::ShuttersControl::shutters->getPartyMode eq 'on' && $FHEM::Automation::ShuttersControl::ascDev->getPartyMode eq 'on' ) + || ( $FHEM::Automation::ShuttersControl::shutters->getAdv + && !$FHEM::Automation::ShuttersControl::shutters->getQueryShuttersPos($posValue) + && !$FHEM::Automation::ShuttersControl::shutters->getAdvDelay + && !$FHEM::Automation::ShuttersControl::shutters->getExternalTriggerState + && !$FHEM::Automation::ShuttersControl::shutters->getSelfDefenseState ) ) { - $shutters->setDelayCmd($posValue); - $ascDev->setDelayCmdReading; - $shutters->setNoDelay(0); - $shutters->setExternalTriggerState(0) - if ( $shutters->getExternalTriggerState ); + $FHEM::Automation::ShuttersControl::shutters->setDelayCmd($posValue); + $FHEM::Automation::ShuttersControl::ascDev->setDelayCmdReading; + $FHEM::Automation::ShuttersControl::shutters->setNoDelay(0); + $FHEM::Automation::ShuttersControl::shutters->setExternalTriggerState(0) + if ( $FHEM::Automation::ShuttersControl::shutters->getExternalTriggerState ); - FHEM::AutoShuttersControl::ASC_Debug( 'setDriveCmd: ' - . $shutters->getShuttersDev + FHEM::Automation::ShuttersControl::ASC_Debug( 'setDriveCmd: ' + . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev . ' - Die Fahrt wird zurückgestellt. Grund kann ein geöffnetes Fenster sein oder ein aktivierter Party Modus oder Weihnachtszeit' ); } else { - $shutters->setAdvDelay(0) - if ( $shutters->getAdvDelay ); - $shutters->setDelayCmd('none') - if ( $shutters->getDelayCmd ne 'none' ) + $FHEM::Automation::ShuttersControl::shutters->setAdvDelay(0) + if ( $FHEM::Automation::ShuttersControl::shutters->getAdvDelay ); + $FHEM::Automation::ShuttersControl::shutters->setDelayCmd('none') + if ( $FHEM::Automation::ShuttersControl::shutters->getDelayCmd ne 'none' ) ; # setzt den Wert auf none da der Rolladen nun gesteuert werden kann. - $shutters->setExternalTriggerState(0) - if ( $shutters->getExternalTriggerState ); + $FHEM::Automation::ShuttersControl::shutters->setExternalTriggerState(0) + if ( $FHEM::Automation::ShuttersControl::shutters->getExternalTriggerState ); ### antifreeze Routine - if ( $shutters->getAntiFreezeStatus > 0 ) { - if ( $shutters->getAntiFreezeStatus != 1 ) { + if ( $FHEM::Automation::ShuttersControl::shutters->getAntiFreezeStatus > 0 ) { + if ( $FHEM::Automation::ShuttersControl::shutters->getAntiFreezeStatus != 1 ) { - $posValue = $shutters->getStatus; - $shutters->setLastDrive('no drive - antifreeze defense'); - $shutters->setLastDriveReading; - $ascDev->setStateReading; + $posValue = $FHEM::Automation::ShuttersControl::shutters->getStatus; + $FHEM::Automation::ShuttersControl::shutters->setLastDrive('no drive - antifreeze defense'); + $FHEM::Automation::ShuttersControl::shutters->setLastDriveReading; + $FHEM::Automation::ShuttersControl::ascDev->setStateReading; } - elsif ( $posValue == $shutters->getClosedPos ) { - $posValue = $shutters->getAntiFreezePos; - $shutters->setLastDrive( - $shutters->getLastDrive . ' - antifreeze mode' ); + elsif ( $posValue == $FHEM::Automation::ShuttersControl::shutters->getClosedPos ) { + $posValue = $FHEM::Automation::ShuttersControl::shutters->getAntiFreezePos; + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + $FHEM::Automation::ShuttersControl::shutters->getLastDrive . ' - antifreeze mode' ); } } @@ -205,44 +202,44 @@ sub setDriveCmd { posValue => $posValue, ); - $offSet = $shutters->getDelay if ( $shutters->getDelay > -1 ); - $offSet = $ascDev->getShuttersOffset if ( $shutters->getDelay < 0 ); - $offSetStart = $shutters->getDelayStart; + $offSet = $FHEM::Automation::ShuttersControl::shutters->getDelay if ( $FHEM::Automation::ShuttersControl::shutters->getDelay > -1 ); + $offSet = $FHEM::Automation::ShuttersControl::ascDev->getShuttersOffset if ( $FHEM::Automation::ShuttersControl::shutters->getDelay < 0 ); + $offSetStart = $FHEM::Automation::ShuttersControl::shutters->getDelayStart; - if ( $shutters->getSelfDefenseAbsent - && !$shutters->getSelfDefenseAbsentTimerrun - && $shutters->getSelfDefenseMode ne 'off' - && $shutters->getSelfDefenseState - && $ascDev->getSelfDefense eq 'on' ) + if ( $FHEM::Automation::ShuttersControl::shutters->getSelfDefenseAbsent + && !$FHEM::Automation::ShuttersControl::shutters->getSelfDefenseAbsentTimerrun + && $FHEM::Automation::ShuttersControl::shutters->getSelfDefenseMode ne 'off' + && $FHEM::Automation::ShuttersControl::shutters->getSelfDefenseState + && $FHEM::Automation::ShuttersControl::ascDev->getSelfDefense eq 'on' ) { InternalTimer( - gettimeofday() + $shutters->getSelfDefenseAbsentDelay, + gettimeofday() + $FHEM::Automation::ShuttersControl::shutters->getSelfDefenseAbsentDelay, \&FHEM::Automation::ShuttersControl::_SetCmdFn, \%h ); - $shutters->setSelfDefenseAbsent( 1, 0, \%h ); + $FHEM::Automation::ShuttersControl::shutters->setSelfDefenseAbsent( 1, 0, \%h ); } - elsif ( $offSetStart > 0 && !$shutters->getNoDelay ) { + elsif ( $offSetStart > 0 && !$FHEM::Automation::ShuttersControl::shutters->getNoDelay ) { InternalTimer( gettimeofday() + - int( rand($offSet) + $shutters->getDelayStart ), + int( rand($offSet) + $FHEM::Automation::ShuttersControl::shutters->getDelayStart ), \&FHEM::Automation::ShuttersControl::_SetCmdFn, \%h ); - FHEM::AutoShuttersControl::ASC_Debug( 'FnSetDriveCmd: ' - . $shutters->getShuttersDev + FHEM::Automation::ShuttersControl::ASC_Debug( 'FnSetDriveCmd: ' + . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev . ' - versetztes fahren' ); } - elsif ( $offSetStart < 1 || $shutters->getNoDelay ) { + elsif ( $offSetStart < 1 || $FHEM::Automation::ShuttersControl::shutters->getNoDelay ) { FHEM::Automation::ShuttersControl::_SetCmdFn( \%h ); - FHEM::AutoShuttersControl::ASC_Debug( 'FnSetDriveCmd: ' - . $shutters->getShuttersDev + FHEM::Automation::ShuttersControl::ASC_Debug( 'FnSetDriveCmd: ' + . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev . ' - NICHT versetztes fahren' ); } - FHEM::AutoShuttersControl::ASC_Debug( 'FnSetDriveCmd: ' - . $shutters->getShuttersDev + FHEM::Automation::ShuttersControl::ASC_Debug( 'FnSetDriveCmd: ' + . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev . ' - NoDelay: ' - . ( $shutters->getNoDelay ? 'JA' : 'NEIN' ) ); - $shutters->setNoDelay(0); + . ( $FHEM::Automation::ShuttersControl::shutters->getNoDelay ? 'JA' : 'NEIN' ) ); + $FHEM::Automation::ShuttersControl::shutters->setNoDelay(0); } return; @@ -310,7 +307,7 @@ sub setLastDriveReading { my %h = ( devHash => $shuttersDevHash, - lastDrive => $shutters->getLastDrive, + lastDrive => $FHEM::Automation::ShuttersControl::shutters->getLastDrive, ); InternalTimer( gettimeofday() + 0.1, @@ -407,8 +404,8 @@ sub setAdvDelay { sub getHomemode { my $self = shift; - my $homemode = $shutters->getRoommatesStatus; - $homemode = $ascDev->getResidentsStatus + my $homemode = $FHEM::Automation::ShuttersControl::shutters->getRoommatesStatus; + $homemode = $FHEM::Automation::ShuttersControl::ascDev->getResidentsStatus if ( $homemode eq 'none' ); return $homemode; } @@ -459,7 +456,7 @@ sub getAttrUpdateChanges { sub getIsDay { my $self = shift; - return FHEM::AutoShuttersControl::_IsDay( $self->{shuttersDev} ); + return FHEM::Automation::ShuttersControl::_IsDay( $self->{shuttersDev} ); } sub getAntiFreezeStatus { @@ -471,21 +468,21 @@ sub getAntiFreezeStatus { ? $daytime : ( strftime( "%k", localtime() ) < 12 ? 'am' : 'pm' ) ); - my $outTemp = $ascDev->getOutTemp; + my $outTemp = $FHEM::Automation::ShuttersControl::ascDev->getOutTemp; -# $outTemp = $shutters->getOutTemp if ( $shutters->getOutTemp != -100 ); sollte raus das der Sensor im Rollo auch ein Innentemperatursensor sein kann. +# $outTemp = $FHEM::Automation::ShuttersControl::shutters->getOutTemp if ( $FHEM::Automation::ShuttersControl::shutters->getOutTemp != -100 ); sollte raus das der Sensor im Rollo auch ein Innentemperatursensor sein kann. - if ( $shutters->getAntiFreeze ne 'off' - && $outTemp <= $ascDev->getFreezeTemp ) + if ( $FHEM::Automation::ShuttersControl::shutters->getAntiFreeze ne 'off' + && $outTemp <= $FHEM::Automation::ShuttersControl::ascDev->getFreezeTemp ) { - if ( $shutters->getAntiFreeze eq 'soft' ) { + if ( $FHEM::Automation::ShuttersControl::shutters->getAntiFreeze eq 'soft' ) { return 1; } - elsif ( $shutters->getAntiFreeze eq $daytime ) { + elsif ( $FHEM::Automation::ShuttersControl::shutters->getAntiFreeze eq $daytime ) { return 2; } - elsif ( $shutters->getAntiFreeze eq 'hard' ) { + elsif ( $FHEM::Automation::ShuttersControl::shutters->getAntiFreeze eq 'hard' ) { return 3; } } @@ -495,7 +492,7 @@ sub getAntiFreezeStatus { sub getShuttersPosCmdValueNegate { my $self = shift; - return ( $shutters->getOpenPos < $shutters->getClosedPos ? 1 : 0 ); + return ( $FHEM::Automation::ShuttersControl::shutters->getOpenPos < $FHEM::Automation::ShuttersControl::shutters->getClosedPos ? 1 : 0 ); } sub getQueryShuttersPos @@ -504,9 +501,9 @@ sub getQueryShuttersPos my $posValue = shift; # wenn dem so ist wird 1 zurück gegeben ansonsten 0 return ( - $shutters->getShuttersPosCmdValueNegate - ? $shutters->getStatus > $posValue - : $shutters->getStatus < $posValue + $FHEM::Automation::ShuttersControl::shutters->getShuttersPosCmdValueNegate + ? $FHEM::Automation::ShuttersControl::shutters->getStatus > $posValue + : $FHEM::Automation::ShuttersControl::shutters->getStatus < $posValue ); } @@ -516,7 +513,7 @@ sub getPosSetCmd { return ( defined( $self->{ $self->{shuttersDev} }{posSetCmd} ) ? $self->{ $self->{shuttersDev} }{posSetCmd} - : $shutters->getPosCmd + : $FHEM::Automation::ShuttersControl::shutters->getPosCmd ); } @@ -672,9 +669,9 @@ sub getRoommatesStatus { ); my $minPrio = 10; - for my $ro ( split( ",", $shutters->getRoommates ) ) { - $shutters->setRoommate($ro); - my $currentPrio = $statePrio{ $shutters->_getRoommateStatus }; + for my $ro ( split( ",", $FHEM::Automation::ShuttersControl::shutters->getRoommates ) ) { + $FHEM::Automation::ShuttersControl::shutters->setRoommate($ro); + my $currentPrio = $statePrio{ $FHEM::Automation::ShuttersControl::shutters->_getRoommateStatus }; $minPrio = $currentPrio if ( $minPrio > $currentPrio ); } @@ -698,9 +695,9 @@ sub getRoommatesLastStatus { ); my $minPrio = 10; - for my $ro ( split( ",", $shutters->getRoommates ) ) { - $shutters->setRoommate($ro); - my $currentPrio = $statePrio{ $shutters->_getRoommateLastStatus }; + for my $ro ( split( ",", $FHEM::Automation::ShuttersControl::shutters->getRoommates ) ) { + $FHEM::Automation::ShuttersControl::shutters->setRoommate($ro); + my $currentPrio = $statePrio{ $FHEM::Automation::ShuttersControl::shutters->_getRoommateLastStatus }; $minPrio = $currentPrio if ( $minPrio > $currentPrio ); } @@ -711,15 +708,15 @@ sub getRoommatesLastStatus { sub getOutTemp { my $self = shift; - return ReadingsVal( $shutters->_getTempSensor, - $shutters->getTempSensorReading, -100 ); + return ReadingsVal( $FHEM::Automation::ShuttersControl::shutters->_getTempSensor, + $FHEM::Automation::ShuttersControl::shutters->getTempSensorReading, -100 ); } sub getIdleDetection { my $self = shift; return ReadingsVal( $self->{shuttersDev}, - $shutters->_getIdleDetectionReading, 'none' ); + $FHEM::Automation::ShuttersControl::shutters->_getIdleDetectionReading, 'none' ); } ### Begin Beschattung Objekt mit Daten befüllen @@ -732,7 +729,7 @@ sub setShadingStatus { && exists( $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} ) && $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} eq $value ); - $shutters->setShadingLastStatus( ( $value eq 'in' ? 'out' : 'in' ) ) + $FHEM::Automation::ShuttersControl::shutters->setShadingLastStatus( ( $value eq 'in' ? 'out' : 'in' ) ) if ( $value eq 'in' || $value eq 'out' ); @@ -817,7 +814,7 @@ sub setPushBrightnessInArray { @{ $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL} } - ) > $shutters->getMaxBrightnessAverageArrayObjects + ) > $FHEM::Automation::ShuttersControl::shutters->getMaxBrightnessAverageArrayObjects ); return; @@ -826,7 +823,7 @@ sub setPushBrightnessInArray { sub getBrightnessAverage { my $self = shift; - return FHEM::AutoShuttersControl::_averageBrightness( + return FHEM::Automation::ShuttersControl::_averageBrightness( @{ $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL} } ) if ( ref( $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL} ) @@ -881,8 +878,8 @@ sub getIfInShading { return ( ( - $shutters->getShadingMode ne 'off' - && $shutters->getShadingLastStatus eq 'out' + $FHEM::Automation::ShuttersControl::shutters->getShadingMode ne 'off' + && $FHEM::Automation::ShuttersControl::shutters->getShadingLastStatus eq 'out' ) ? 1 : 0 ); } diff --git a/lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm b/lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm index a60a1f5..a92c45f 100644 --- a/lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm +++ b/lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm @@ -46,9 +46,6 @@ use utf8; use GPUtils qw(GP_Import); -my $shutters = $FHEM::Automation::ShuttersControl::shutters; -my %userAttrList = %FHEM::Automation::ShuttersControl::userAttrList; - ## Import der FHEM Funktionen BEGIN { GP_Import( @@ -89,7 +86,7 @@ sub _getPosition { if ( AttrVal( $self->{shuttersDev}, $attr, - $userAttrList{$userAttrList} + $FHEM::Automation::ShuttersControl::userAttrList{$userAttrList} [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] ) =~ m{\A\{.+\}\z}xms ) @@ -98,7 +95,7 @@ sub _getPosition { AttrVal( $self->{shuttersDev}, $attr, - $userAttrList{$userAttrList} + $FHEM::Automation::ShuttersControl::userAttrList{$userAttrList} [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] ) ); @@ -108,7 +105,7 @@ sub _getPosition { $position = ( $position =~ m{\A\d+(\.\d+)?\z}xms ? $position - : $userAttrList{$userAttrList} + : $FHEM::Automation::ShuttersControl::userAttrList{$userAttrList} [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] ); @@ -123,7 +120,7 @@ sub _getPosition { FHEM::Automation::ShuttersControl::GetAttrValues( $self->{shuttersDev}, $attr, - $userAttrList{$userAttrList} + $FHEM::Automation::ShuttersControl::userAttrList{$userAttrList} [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] ); } @@ -153,7 +150,7 @@ sub _getPosition { $self->{ $self->{shuttersDev} }->{$attr}->{position} =~ m{^\d+(\.\d+)?$}xms ? $self->{ $self->{shuttersDev} }->{$attr}->{position} - : $userAttrList{$userAttrList} + : $FHEM::Automation::ShuttersControl::userAttrList{$userAttrList} [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] ); } @@ -170,7 +167,7 @@ sub _getPositionAssignment { && ( gettimeofday() - $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} ) < 2 ); - $shutters->$getFn; + $FHEM::Automation::ShuttersControl::shutters->$getFn; return ( $self->{ $self->{shuttersDev} }->{$attr}->{posAssignment} ); } @@ -187,7 +184,7 @@ sub setAntiFreezePos { sub getAntiFreezePos { my $self = shift; - return $shutters->_getPosition( 'ASC_Antifreeze_Pos', + return $FHEM::Automation::ShuttersControl::shutters->_getPosition( 'ASC_Antifreeze_Pos', 'ASC_Antifreeze_Pos:5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100' ); } @@ -195,7 +192,7 @@ sub getAntiFreezePos { sub getAntiFreezePosAssignment { my $self = shift; - return $shutters->_getPositionAssignment( 'ASC_Antifreeze_Pos', + return $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( 'ASC_Antifreeze_Pos', 'getAntiFreezePos' ); } @@ -270,7 +267,7 @@ sub getSlatDevice { $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice} ->{LASTGETTIME} ) < 2 ); - $shutters->getSlatPosCmd; + $FHEM::Automation::ShuttersControl::shutters->getSlatPosCmd; return ( $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}->{device} @@ -316,8 +313,8 @@ sub getPrivacyUpTime { ->{upbrightnessval} = ( $upBrightnessVal ne 'none' ? $upBrightnessVal : -1 ); - $shutters->setPrivacyUpStatus(0) - if ( defined( $shutters->getPrivacyUpStatus ) + $FHEM::Automation::ShuttersControl::shutters->setPrivacyUpStatus(0) + if ( defined( $FHEM::Automation::ShuttersControl::shutters->getPrivacyUpStatus ) && $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} ->{uptime} == -1 ); @@ -339,7 +336,7 @@ sub getPrivacyUpBrightnessVal { $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} ->{LASTGETTIME} ) < 2 ); - $shutters->getPrivacyUpTime; + $FHEM::Automation::ShuttersControl::shutters->getPrivacyUpTime; return ( defined( @@ -391,8 +388,8 @@ sub getPrivacyDownTime { ->{downbrightnessval} = ( $downBrightnessVal ne 'none' ? $downBrightnessVal : -1 ); - $shutters->setPrivacyDownStatus(0) - if ( defined( $shutters->getPrivacyDownStatus ) + $FHEM::Automation::ShuttersControl::shutters->setPrivacyDownStatus(0) + if ( defined( $FHEM::Automation::ShuttersControl::shutters->getPrivacyDownStatus ) && $self->{ $self->{shuttersDev} } ->{ASC_PrivacyDownValue_beforeNightClose}->{downtime} == -1 ); @@ -414,7 +411,7 @@ sub getPrivacyDownBrightnessVal { $self->{ $self->{shuttersDev} } ->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME} ) < 2 ); - $shutters->getPrivacyDownTime; + $FHEM::Automation::ShuttersControl::shutters->getPrivacyDownTime; return ( defined( @@ -439,13 +436,13 @@ sub setPrivacyUpPos { sub getPrivacyUpPos { my $self = shift; - return $shutters->_getPosition( 'ASC_PrivacyUp_Pos', 'ASC_PrivacyUp_Pos' ); + return $FHEM::Automation::ShuttersControl::shutters->_getPosition( 'ASC_PrivacyUp_Pos', 'ASC_PrivacyUp_Pos' ); } sub getPrivacyUpPositionAssignment { my $self = shift; - return $shutters->_getPositionAssignment( 'ASC_PrivacyUp_Pos', + return $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( 'ASC_PrivacyUp_Pos', 'getPrivacyUpPos' ); } @@ -461,14 +458,14 @@ sub setPrivacyDownPos { sub getPrivacyDownPos { my $self = shift; - return $shutters->_getPosition( 'ASC_PrivacyDown_Pos', + return $FHEM::Automation::ShuttersControl::shutters->_getPosition( 'ASC_PrivacyDown_Pos', 'ASC_PrivacyDown_Pos' ); } sub getPrivacyDownPositionAssignment { my $self = shift; - return $shutters->_getPositionAssignment( 'ASC_PrivacyDown_Pos', + return $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( 'ASC_PrivacyDown_Pos', 'getPrivacyDownPos' ); } @@ -550,14 +547,14 @@ sub setShadingPos { sub getShadingPos { my $self = shift; - return $shutters->_getPosition( 'ASC_Shading_Pos', + return $FHEM::Automation::ShuttersControl::shutters->_getPosition( 'ASC_Shading_Pos', 'ASC_Shading_Pos:10,20,30,40,50,60,70,80,90,100' ); } sub getShadingPositionAssignment { my $self = shift; - return $shutters->_getPositionAssignment( 'ASC_Shading_Pos', + return $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( 'ASC_Shading_Pos', 'getShadingPos' ); } @@ -615,7 +612,7 @@ sub getTempSensorReading { $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} ) < 2 ); - $shutters->_getTempSensor; + $FHEM::Automation::ShuttersControl::shutters->_getTempSensor; return ( defined( $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{reading} ) @@ -678,7 +675,7 @@ sub getIdleDetectionValue { $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection} ->{LASTGETTIME} ) < 2 ); - $shutters->_getIdleDetectionReading; + $FHEM::Automation::ShuttersControl::shutters->_getIdleDetectionReading; return ( defined( @@ -744,7 +741,7 @@ sub getBrightnessReading { $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor} ->{LASTGETTIME} ) < 2 ); - $shutters->_getBrightnessSensor; + $FHEM::Automation::ShuttersControl::shutters->_getBrightnessSensor; return ( defined( @@ -769,7 +766,7 @@ sub getShadingAzimuthLeft { $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth} ->{LASTGETTIME} ) < 2 ); - $shutters->getShadingAzimuthRight; + $FHEM::Automation::ShuttersControl::shutters->getShadingAzimuthRight; return $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth} ->{leftVal}; @@ -889,7 +886,7 @@ sub getShadingMaxElevation { $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation} ->{LASTGETTIME} ) < 2 ); - $shutters->getShadingMinElevation; + $FHEM::Automation::ShuttersControl::shutters->getShadingMinElevation; return $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation} ->{maxVal}; @@ -958,7 +955,7 @@ sub getShadingStateChangeCloudy { $self->{ $self->{shuttersDev} } ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} ) < 2 ); - $shutters->getShadingStateChangeSunny; + $FHEM::Automation::ShuttersControl::shutters->getShadingStateChangeSunny; return $self->{ $self->{shuttersDev} } ->{ASC_Shading_StateChange_SunnyCloudy}->{cloudy}; @@ -978,7 +975,7 @@ sub getMaxBrightnessAverageArrayObjects { $self->{ $self->{shuttersDev} } ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} ) < 2 ); - $shutters->getShadingStateChangeSunny; + $FHEM::Automation::ShuttersControl::shutters->getShadingStateChangeSunny; return $self->{ $self->{shuttersDev} }->{BrightnessAverageArray} ->{MAXOBJECT}; @@ -1043,7 +1040,7 @@ sub getExternalTriggerDevice { $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive} = $posActive; $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posinactive} = - ( $posInactive ne 'none' ? $posInactive : $shutters->getLastPos ); + ( $posInactive ne 'none' ? $posInactive : $FHEM::Automation::ShuttersControl::shutters->getLastPos ); $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{valueactive2} = $valueActive2; $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive2} = @@ -1066,7 +1063,7 @@ sub getExternalTriggerReading { $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} ->{LASTGETTIME} ) < 2 ); - $shutters->getExternalTriggerDevice; + $FHEM::Automation::ShuttersControl::shutters->getExternalTriggerDevice; return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{reading}; } @@ -1084,7 +1081,7 @@ sub getExternalTriggerValueActive { $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} ->{LASTGETTIME} ) < 2 ); - $shutters->getExternalTriggerDevice; + $FHEM::Automation::ShuttersControl::shutters->getExternalTriggerDevice; return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} ->{valueactive}; @@ -1104,7 +1101,7 @@ sub getExternalTriggerValueActive2 { $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} ->{LASTGETTIME} ) < 2 ); - $shutters->getExternalTriggerDevice; + $FHEM::Automation::ShuttersControl::shutters->getExternalTriggerDevice; return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} ->{valueactive2}; @@ -1124,7 +1121,7 @@ sub getExternalTriggerValueInactive { $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} ->{LASTGETTIME} ) < 2 ); - $shutters->getExternalTriggerDevice; + $FHEM::Automation::ShuttersControl::shutters->getExternalTriggerDevice; return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} ->{valueinactive}; @@ -1143,7 +1140,7 @@ sub getExternalTriggerPosActive { $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} ->{LASTGETTIME} ) < 2 ); - $shutters->getExternalTriggerDevice; + $FHEM::Automation::ShuttersControl::shutters->getExternalTriggerDevice; return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive}; } @@ -1161,7 +1158,7 @@ sub getExternalTriggerPosActive2 { $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} ->{LASTGETTIME} ) < 2 ); - $shutters->getExternalTriggerDevice; + $FHEM::Automation::ShuttersControl::shutters->getExternalTriggerDevice; return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive2}; } @@ -1179,7 +1176,7 @@ sub getExternalTriggerPosInactive { $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} ->{LASTGETTIME} ) < 2 ); - $shutters->getExternalTriggerDevice; + $FHEM::Automation::ShuttersControl::shutters->getExternalTriggerDevice; return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} ->{posinactive}; @@ -1295,7 +1292,7 @@ sub getPosCmd { my $self = shift; return AttrVal( $self->{shuttersDev}, 'ASC_Pos_Reading', - $userAttrList{'ASC_Pos_Reading'} + $FHEM::Automation::ShuttersControl::userAttrList{'ASC_Pos_Reading'} [ AttrVal( $self->{shuttersDev}, 'ASC', 1 ) ] ); } @@ -1311,14 +1308,14 @@ sub setOpenPos { sub getOpenPos { my $self = shift; - return $shutters->_getPosition( 'ASC_Open_Pos', + return $FHEM::Automation::ShuttersControl::shutters->_getPosition( 'ASC_Open_Pos', 'ASC_Open_Pos:0,10,20,30,40,50,60,70,80,90,100' ); } sub getOpenPositionAssignment { my $self = shift; - return $shutters->_getPositionAssignment( 'ASC_Open_Pos', 'getOpenPos' ); + return $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( 'ASC_Open_Pos', 'getOpenPos' ); } sub setVentilatePos { @@ -1333,14 +1330,14 @@ sub setVentilatePos { sub getVentilatePos { my $self = shift; - return $shutters->_getPosition( 'ASC_Ventilate_Pos', + return $FHEM::Automation::ShuttersControl::shutters->_getPosition( 'ASC_Ventilate_Pos', 'ASC_Ventilate_Pos:10,20,30,40,50,60,70,80,90,100' ); } sub getVentilatePositionAssignment { my $self = shift; - return $shutters->_getPositionAssignment( 'ASC_Ventilate_Pos', + return $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( 'ASC_Ventilate_Pos', 'getVentilatePos' ); } @@ -1373,14 +1370,14 @@ sub setClosedPos { sub getClosedPos { my $self = shift; - return $shutters->_getPosition( 'ASC_Closed_Pos', + return $FHEM::Automation::ShuttersControl::shutters->_getPosition( 'ASC_Closed_Pos', 'ASC_Closed_Pos:0,10,20,30,40,50,60,70,80,90,100' ); } sub getClosedPositionAssignment { my $self = shift; - return $shutters->_getPositionAssignment( 'ASC_Closed_Pos', + return $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( 'ASC_Closed_Pos', 'getClosedPos' ); } @@ -1396,14 +1393,14 @@ sub setSleepPos { sub getSleepPos { my $self = shift; - return $shutters->_getPosition( 'ASC_Sleep_Pos', + return $FHEM::Automation::ShuttersControl::shutters->_getPosition( 'ASC_Sleep_Pos', 'ASC_Sleep_Pos:0,10,20,30,40,50,60,70,80,90,100' ); } sub getSleepPositionAssignment { my $self = shift; - return $shutters->_getPositionAssignment( 'ASC_Sleep_Pos', 'getSleepPos' ); + return $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( 'ASC_Sleep_Pos', 'getSleepPos' ); } sub setVentilateOpen { @@ -1434,14 +1431,14 @@ sub setComfortOpenPos { sub getComfortOpenPos { my $self = shift; - return $shutters->_getPosition( 'ASC_ComfortOpen_Pos', + return $FHEM::Automation::ShuttersControl::shutters->_getPosition( 'ASC_ComfortOpen_Pos', 'ASC_ComfortOpen_Pos:0,10,20,30,40,50,60,70,80,90,100' ); } sub getComfortOpenPositionAssignment { my $self = shift; - return $shutters->_getPositionAssignment( 'ASC_ComfortOpen_Pos', + return $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( 'ASC_ComfortOpen_Pos', 'getComfortOpenPos' ); } @@ -1504,7 +1501,7 @@ sub getWindPos { $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME} ) < 2 ); - $shutters->getWindMax; + $FHEM::Automation::ShuttersControl::shutters->getWindMax; return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{closedPos}; } @@ -1536,7 +1533,7 @@ sub getWindMax { $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggerhyst} = ( $hyst ne 'none' ? $max - $hyst : $max - 20 ); $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{closedPos} = - ( $pos ne 'none' ? $pos : $shutters->getOpenPos ); + ( $pos ne 'none' ? $pos : $FHEM::Automation::ShuttersControl::shutters->getOpenPos ); return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggermax}; } @@ -1564,7 +1561,7 @@ sub getWindMin { $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME} ) < 2 ); - $shutters->getWindMax; + $FHEM::Automation::ShuttersControl::shutters->getWindMax; return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggerhyst}; } @@ -1907,7 +1904,7 @@ sub getBrightnessMinVal { $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor} ->{LASTGETTIME} ) < 2 ); - $shutters->_getBrightnessSensor; + $FHEM::Automation::ShuttersControl::shutters->_getBrightnessSensor; return $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor} ->{triggermin}; @@ -1926,7 +1923,7 @@ sub getBrightnessMaxVal { $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor} ->{LASTGETTIME} ) < 2 ); - $shutters->_getBrightnessSensor; + $FHEM::Automation::ShuttersControl::shutters->_getBrightnessSensor; return $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor} ->{triggermax}; diff --git a/lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm b/lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm index 8ce109e..96b0390 100644 --- a/lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm +++ b/lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm @@ -47,9 +47,6 @@ use utf8; use GPUtils qw(GP_Import); -my $shutters = $FHEM::Automation::ShuttersControl::shutters; -my $ascDev = $FHEM::Automation::ShuttersControl::ascDev; - ## Import der FHEM Funktionen BEGIN { GP_Import( @@ -62,21 +59,21 @@ BEGIN { sub getBrightness { my $self = shift; - return ReadingsNum( $shutters->_getBrightnessSensor, - $shutters->getBrightnessReading, -1 ); + return ReadingsNum( $FHEM::Automation::ShuttersControl::shutters->_getBrightnessSensor, + $FHEM::Automation::ShuttersControl::shutters->getBrightnessReading, -1 ); } sub getWindStatus { my $self = shift; - return ReadingsVal( $ascDev->_getWindSensor, - $ascDev->getWindSensorReading, -1 ); + return ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getWindSensor, + $FHEM::Automation::ShuttersControl::ascDev->getWindSensorReading, -1 ); } sub getStatus { my $self = shift; - return ReadingsNum( $self->{shuttersDev}, $shutters->getPosCmd, 0 ); + return ReadingsNum( $self->{shuttersDev}, $FHEM::Automation::ShuttersControl::shutters->getPosCmd, 0 ); } sub getDelayCmd { diff --git a/lib/FHEM/Automation/ShuttersControl/Window/Attr.pm b/lib/FHEM/Automation/ShuttersControl/Window/Attr.pm index c388748..dd8fbff 100644 --- a/lib/FHEM/Automation/ShuttersControl/Window/Attr.pm +++ b/lib/FHEM/Automation/ShuttersControl/Window/Attr.pm @@ -46,8 +46,6 @@ use utf8; use GPUtils qw(GP_Import); -my $shutters = $FHEM::Automation::ShuttersControl::shutters; - ## Import der FHEM Funktionen BEGIN { GP_Import( @@ -122,7 +120,7 @@ sub getWinDevReading { $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} ) < 2 ); - $shutters->_getWinDev; + $FHEM::Automation::ShuttersControl::shutters->_getWinDev; return $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{reading}; } diff --git a/lib/FHEM/Automation/ShuttersControl/Window/Readings.pm b/lib/FHEM/Automation/ShuttersControl/Window/Readings.pm index 5789314..8a9c1ff 100644 --- a/lib/FHEM/Automation/ShuttersControl/Window/Readings.pm +++ b/lib/FHEM/Automation/ShuttersControl/Window/Readings.pm @@ -46,8 +46,6 @@ use utf8; use GPUtils qw(GP_Import); -my $shutters = $FHEM::Automation::ShuttersControl::shutters; - ## Import der FHEM Funktionen BEGIN { GP_Import( @@ -59,7 +57,7 @@ BEGIN { sub getWinStatus { my $self = shift; - return ReadingsVal( $shutters->_getWinDev, $shutters->getWinDevReading, + return ReadingsVal( $FHEM::Automation::ShuttersControl::shutters->_getWinDev, $FHEM::Automation::ShuttersControl::shutters->getWinDevReading, 'closed' ); } From f3979f090fd436e93fc85b1548e4d4acff66d43d Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Wed, 3 Jun 2020 18:07:16 +0200 Subject: [PATCH 33/60] fix devStateIcon --- lib/FHEM/Automation/ShuttersControl.pm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/FHEM/Automation/ShuttersControl.pm b/lib/FHEM/Automation/ShuttersControl.pm index 6711034..67864ad 100644 --- a/lib/FHEM/Automation/ShuttersControl.pm +++ b/lib/FHEM/Automation/ShuttersControl.pm @@ -436,12 +436,12 @@ sub Notify { if ( $ascDev->getASCenable eq 'none' ); CommandAttr( undef, $name - . ' devStateIcon { AutoShuttersControl_DevStateIcon($name) }' ) + . ' devStateIcon { ShuttersControl_DevStateIcon($name) }' ) unless ( AttrVal( $name, 'devStateIcon', - '{ AutoShuttersControl_DevStateIcon($name) }' - ) eq '{ AutoShuttersControl_DevStateIcon($name) }' + '{ ShuttersControl_DevStateIcon($name) }' + ) eq '{ ShuttersControl_DevStateIcon($name) }' ); CommandDeleteAttr( undef, $name . ' event-on-change-reading' ) unless ( From 3b31474e1866758e7e057c80280f1a94a4f8bfb5 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Wed, 3 Jun 2020 18:36:40 +0200 Subject: [PATCH 34/60] add controls file for FHEM update --- controls_AutoShuttersControl.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 controls_AutoShuttersControl.txt diff --git a/controls_AutoShuttersControl.txt b/controls_AutoShuttersControl.txt new file mode 100644 index 0000000..295b1d1 --- /dev/null +++ b/controls_AutoShuttersControl.txt @@ -0,0 +1,12 @@ +UPD 2020-06-03_16:33:32 88738 FHEM/73_AutoShuttersControl.pm +UPD 2020-06-03_18:07:03 186007 lib/FHEM/Automation/ShuttersControl.pm +UPD 2020-06-03_16:33:32 2656 lib/FHEM/Automation/ShuttersControl/Dev.pm +UPD 2020-06-03_17:33:24 2478 lib/FHEM/Automation/ShuttersControl/Roommate.pm +UPD 2020-06-03_17:46:59 28839 lib/FHEM/Automation/ShuttersControl/Shutters.pm +UPD 2020-06-03_16:33:32 2174 lib/FHEM/Automation/ShuttersControl/Window.pm +UPD 2020-06-03_17:35:57 11437 lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm +UPD 2020-06-03_17:36:44 6868 lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm +UPD 2020-06-03_17:51:29 52473 lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm +UPD 2020-06-03_17:39:44 2873 lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm +UPD 2020-06-03_17:40:22 3973 lib/FHEM/Automation/ShuttersControl/Window/Attr.pm +UPD 2020-06-03_17:40:59 2273 lib/FHEM/Automation/ShuttersControl/Window/Readings.pm From 5ddf5adfad92cf265c03f2264e71adde4659c457 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Wed, 3 Jun 2020 21:26:36 +0200 Subject: [PATCH 35/60] remove use Meta in 73_AutoShuttersControl --- FHEM/73_AutoShuttersControl.pm | 3 +-- controls_AutoShuttersControl.txt | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/FHEM/73_AutoShuttersControl.pm b/FHEM/73_AutoShuttersControl.pm index 9468319..073446e 100644 --- a/FHEM/73_AutoShuttersControl.pm +++ b/FHEM/73_AutoShuttersControl.pm @@ -48,7 +48,6 @@ use warnings; use utf8; use FHEM::Automation::ShuttersControl; -use FHEM::Meta; use GPUtils qw(GP_Import GP_Export); ## Import der FHEM Funktionen @@ -1160,7 +1159,7 @@ sub Initialize { ], "release_status": "testing", "license": "GPL_2", - "version": "v0.9.20", + "version": "v0.9.21", "author": [ "Marko Oldenburg " ], diff --git a/controls_AutoShuttersControl.txt b/controls_AutoShuttersControl.txt index 295b1d1..48ce6e5 100644 --- a/controls_AutoShuttersControl.txt +++ b/controls_AutoShuttersControl.txt @@ -1,4 +1,4 @@ -UPD 2020-06-03_16:33:32 88738 FHEM/73_AutoShuttersControl.pm +UPD 2020-06-03_21:24:54 88722 FHEM/73_AutoShuttersControl.pm UPD 2020-06-03_18:07:03 186007 lib/FHEM/Automation/ShuttersControl.pm UPD 2020-06-03_16:33:32 2656 lib/FHEM/Automation/ShuttersControl/Dev.pm UPD 2020-06-03_17:33:24 2478 lib/FHEM/Automation/ShuttersControl/Roommate.pm From 9b3ca6618a78864b4d98dd607467dec79fb4125b Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Wed, 3 Jun 2020 21:59:55 +0200 Subject: [PATCH 36/60] fix shading drive out of closed Pos --- controls_AutoShuttersControl.txt | 2 +- lib/FHEM/Automation/ShuttersControl.pm | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/controls_AutoShuttersControl.txt b/controls_AutoShuttersControl.txt index 48ce6e5..771da8d 100644 --- a/controls_AutoShuttersControl.txt +++ b/controls_AutoShuttersControl.txt @@ -1,5 +1,5 @@ UPD 2020-06-03_21:24:54 88722 FHEM/73_AutoShuttersControl.pm -UPD 2020-06-03_18:07:03 186007 lib/FHEM/Automation/ShuttersControl.pm +UPD 2020-06-03_21:58:45 186066 lib/FHEM/Automation/ShuttersControl.pm UPD 2020-06-03_16:33:32 2656 lib/FHEM/Automation/ShuttersControl/Dev.pm UPD 2020-06-03_17:33:24 2478 lib/FHEM/Automation/ShuttersControl/Roommate.pm UPD 2020-06-03_17:46:59 28839 lib/FHEM/Automation/ShuttersControl/Shutters.pm diff --git a/lib/FHEM/Automation/ShuttersControl.pm b/lib/FHEM/Automation/ShuttersControl.pm index 67864ad..54341d4 100644 --- a/lib/FHEM/Automation/ShuttersControl.pm +++ b/lib/FHEM/Automation/ShuttersControl.pm @@ -2578,6 +2578,7 @@ sub ShadingProcessing { && !$shutters->getShadingManualDriveStatus && $shutters->getRoommatesStatus ne 'gotosleep' && $shutters->getRoommatesStatus ne 'asleep' + && $shutters->getStatus != $shutters->getClosedPos && ( ( $shutters->getShadingStatus eq 'out' From 1b90829744d3d1ce87c2716b0aa7f56bc9802078 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Wed, 3 Jun 2020 22:12:34 +0200 Subject: [PATCH 37/60] change execute condition for ShadingProcessingDriveCommand --- controls_AutoShuttersControl.txt | 2 +- lib/FHEM/Automation/ShuttersControl.pm | 47 +++++++++++++++----------- 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/controls_AutoShuttersControl.txt b/controls_AutoShuttersControl.txt index 771da8d..1c17a42 100644 --- a/controls_AutoShuttersControl.txt +++ b/controls_AutoShuttersControl.txt @@ -1,5 +1,5 @@ UPD 2020-06-03_21:24:54 88722 FHEM/73_AutoShuttersControl.pm -UPD 2020-06-03_21:58:45 186066 lib/FHEM/Automation/ShuttersControl.pm +UPD 2020-06-03_22:10:45 186158 lib/FHEM/Automation/ShuttersControl.pm UPD 2020-06-03_16:33:32 2656 lib/FHEM/Automation/ShuttersControl/Dev.pm UPD 2020-06-03_17:33:24 2478 lib/FHEM/Automation/ShuttersControl/Roommate.pm UPD 2020-06-03_17:46:59 28839 lib/FHEM/Automation/ShuttersControl/Shutters.pm diff --git a/lib/FHEM/Automation/ShuttersControl.pm b/lib/FHEM/Automation/ShuttersControl.pm index 54341d4..a4b7059 100644 --- a/lib/FHEM/Automation/ShuttersControl.pm +++ b/lib/FHEM/Automation/ShuttersControl.pm @@ -77,7 +77,7 @@ use FHEM::Automation::ShuttersControl::Shutters; use FHEM::Automation::ShuttersControl::Dev; require Exporter; -our @ISA = qw(Exporter); +our @ISA = qw(Exporter); our @Export = qw($shutters $ascDev %userAttrList); # try to use JSON::MaybeXS wrapper @@ -192,19 +192,17 @@ BEGIN { computeAlignTime ReplaceEventMap) ); - + #-- Export to main context with different name GP_Export( qw( ascAPIget ascAPIset DevStateIcon - ) + ) ); } - - ## Die Attributsliste welche an die Rolläden verteilt wird. Zusammen mit Default Werten our %userAttrList = ( 'ASC_Mode_Up:absent,always,off,home' => '-', @@ -435,8 +433,7 @@ sub Notify { readingsSingleUpdate( $hash, 'ascEnable', 'on', 0 ) if ( $ascDev->getASCenable eq 'none' ); CommandAttr( undef, - $name - . ' devStateIcon { ShuttersControl_DevStateIcon($name) }' ) + $name . ' devStateIcon { ShuttersControl_DevStateIcon($name) }' ) unless ( AttrVal( $name, 'devStateIcon', @@ -465,11 +462,16 @@ sub Notify { unless ( scalar( @{ $hash->{helper}{shuttersList} } ) == 0 ) { WriteReadingsShuttersList($hash); UserAttributs_Readings_ForShutters( $hash, 'add' ); - InternalTimer( gettimeofday() + 3, - 'FHEM::Automation::ShuttersControl::RenewSunRiseSetShuttersTimer', - $hash ); - InternalTimer( gettimeofday() + 5, - 'FHEM::Automation::ShuttersControl::AutoSearchTwilightDev', $hash ); + InternalTimer( + gettimeofday() + 3, +'FHEM::Automation::ShuttersControl::RenewSunRiseSetShuttersTimer', + $hash + ); + InternalTimer( + gettimeofday() + 5, + 'FHEM::Automation::ShuttersControl::AutoSearchTwilightDev', + $hash + ); InternalTimer( gettimeofday() + 5, sub() { CommandSet( undef, $name . ' controlShading on' ) }, @@ -2578,7 +2580,6 @@ sub ShadingProcessing { && !$shutters->getShadingManualDriveStatus && $shutters->getRoommatesStatus ne 'gotosleep' && $shutters->getRoommatesStatus ne 'asleep' - && $shutters->getStatus != $shutters->getClosedPos && ( ( $shutters->getShadingStatus eq 'out' @@ -2597,10 +2598,15 @@ sub ShadingProcessing { || $shutters->getModeUp eq 'off' ) && ( - ( int( gettimeofday() ) - $shutters->getShadingStatusTimestamp ) < 2 + ( + ( + int( gettimeofday() ) - + $shutters->getShadingStatusTimestamp + ) < 2 + && $shutters->getStatus != $shutters->getClosedPos + ) || ( !$shutters->getQueryShuttersPos( $shutters->getShadingPos ) - && $shutters->getIfInShading - && $shutters->getStatus != $shutters->getShadingPos ) + && $shutters->getIfInShading ) || ( !$shutters->getIfInShading && $shutters->getStatus == $shutters->getShadingPos ) ) @@ -4914,9 +4920,11 @@ sub _CheckASC_ConditionsForShadingFn { my $count = 1; for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { - InternalTimer( gettimeofday() + $count, - 'FHEM::Automation::ShuttersControl::_CheckShuttersConditionsForShadingFn', - $shuttersDev ); + InternalTimer( + gettimeofday() + $count, +'FHEM::Automation::ShuttersControl::_CheckShuttersConditionsForShadingFn', + $shuttersDev + ); $count++; } @@ -4993,5 +5001,4 @@ sub _CheckShuttersConditionsForShadingFn { readingsEndUpdate( $shuttersDevHash, 1 ); } - 1; From 4e493e6a4b1e67d1189492be93695c88501db73e Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Thu, 4 Jun 2020 07:26:33 +0200 Subject: [PATCH 38/60] new controls --- controls_AutoShuttersControl.txt | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/controls_AutoShuttersControl.txt b/controls_AutoShuttersControl.txt index 1c17a42..bc89818 100644 --- a/controls_AutoShuttersControl.txt +++ b/controls_AutoShuttersControl.txt @@ -1,12 +1,12 @@ -UPD 2020-06-03_21:24:54 88722 FHEM/73_AutoShuttersControl.pm -UPD 2020-06-03_22:10:45 186158 lib/FHEM/Automation/ShuttersControl.pm -UPD 2020-06-03_16:33:32 2656 lib/FHEM/Automation/ShuttersControl/Dev.pm -UPD 2020-06-03_17:33:24 2478 lib/FHEM/Automation/ShuttersControl/Roommate.pm -UPD 2020-06-03_17:46:59 28839 lib/FHEM/Automation/ShuttersControl/Shutters.pm -UPD 2020-06-03_16:33:32 2174 lib/FHEM/Automation/ShuttersControl/Window.pm -UPD 2020-06-03_17:35:57 11437 lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm -UPD 2020-06-03_17:36:44 6868 lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm -UPD 2020-06-03_17:51:29 52473 lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm -UPD 2020-06-03_17:39:44 2873 lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm -UPD 2020-06-03_17:40:22 3973 lib/FHEM/Automation/ShuttersControl/Window/Attr.pm -UPD 2020-06-03_17:40:59 2273 lib/FHEM/Automation/ShuttersControl/Window/Readings.pm +UPD 2020-06-04_07:25:11 88722 FHEM/73_AutoShuttersControl.pm +UPD 2020-06-04_07:25:11 186158 lib/FHEM/Automation/ShuttersControl.pm +UPD 2020-06-04_07:25:11 2656 lib/FHEM/Automation/ShuttersControl/Dev.pm +UPD 2020-06-04_07:25:11 2478 lib/FHEM/Automation/ShuttersControl/Roommate.pm +UPD 2020-06-04_07:25:11 28839 lib/FHEM/Automation/ShuttersControl/Shutters.pm +UPD 2020-06-04_07:25:11 2174 lib/FHEM/Automation/ShuttersControl/Window.pm +UPD 2020-06-04_07:25:11 11437 lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm +UPD 2020-06-04_07:25:11 6868 lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm +UPD 2020-06-04_07:25:11 52473 lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm +UPD 2020-06-04_07:25:11 2873 lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm +UPD 2020-06-04_07:25:11 3973 lib/FHEM/Automation/ShuttersControl/Window/Attr.pm +UPD 2020-06-04_07:25:11 2273 lib/FHEM/Automation/ShuttersControl/Window/Readings.pm From 5ab7c09712a7192fded2e4ed50d27d0a8599440d Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Thu, 4 Jun 2020 08:22:14 +0200 Subject: [PATCH 39/60] change controls --- controls_AutoShuttersControl.txt | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/controls_AutoShuttersControl.txt b/controls_AutoShuttersControl.txt index bc89818..a35ea46 100644 --- a/controls_AutoShuttersControl.txt +++ b/controls_AutoShuttersControl.txt @@ -1,12 +1,12 @@ -UPD 2020-06-04_07:25:11 88722 FHEM/73_AutoShuttersControl.pm -UPD 2020-06-04_07:25:11 186158 lib/FHEM/Automation/ShuttersControl.pm -UPD 2020-06-04_07:25:11 2656 lib/FHEM/Automation/ShuttersControl/Dev.pm -UPD 2020-06-04_07:25:11 2478 lib/FHEM/Automation/ShuttersControl/Roommate.pm -UPD 2020-06-04_07:25:11 28839 lib/FHEM/Automation/ShuttersControl/Shutters.pm -UPD 2020-06-04_07:25:11 2174 lib/FHEM/Automation/ShuttersControl/Window.pm -UPD 2020-06-04_07:25:11 11437 lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm -UPD 2020-06-04_07:25:11 6868 lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm -UPD 2020-06-04_07:25:11 52473 lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm -UPD 2020-06-04_07:25:11 2873 lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm -UPD 2020-06-04_07:25:11 3973 lib/FHEM/Automation/ShuttersControl/Window/Attr.pm -UPD 2020-06-04_07:25:11 2273 lib/FHEM/Automation/ShuttersControl/Window/Readings.pm +UPD 2020-06-04_08:15:31 88722 FHEM/73_AutoShuttersControl.pm +UPD 2020-06-04_08:15:31 186158 lib/FHEM/Automation/ShuttersControl.pm +UPD 2020-06-04_08:15:31 2656 lib/FHEM/Automation/ShuttersControl/Dev.pm +UPD 2020-06-04_08:15:31 2478 lib/FHEM/Automation/ShuttersControl/Roommate.pm +UPD 2020-06-04_08:15:31 28839 lib/FHEM/Automation/ShuttersControl/Shutters.pm +UPD 2020-06-04_08:15:31 2174 lib/FHEM/Automation/ShuttersControl/Window.pm +UPD 2020-06-04_08:15:31 11437 lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm +UPD 2020-06-04_08:15:31 6868 lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm +UPD 2020-06-04_08:15:31 52473 lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm +UPD 2020-06-04_08:15:31 2873 lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm +UPD 2020-06-04_08:15:31 3973 lib/FHEM/Automation/ShuttersControl/Window/Attr.pm +UPD 2020-06-04_08:15:31 2273 lib/FHEM/Automation/ShuttersControl/Window/Readings.pm From 80831c167bbc5ccf37d65632f5b73ccc4cf668de Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Thu, 4 Jun 2020 09:32:07 +0200 Subject: [PATCH 40/60] test hook und change commandref --- FHEM/73_AutoShuttersControl.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FHEM/73_AutoShuttersControl.pm b/FHEM/73_AutoShuttersControl.pm index 073446e..bcc7db3 100644 --- a/FHEM/73_AutoShuttersControl.pm +++ b/FHEM/73_AutoShuttersControl.pm @@ -1061,7 +1061,7 @@ sub Initialize { WindProtectionStatusaktueller Status der Wind Protection „protected“ oder „unprotected“ RainProtectionRain Protection soll aktiv sein oder nicht RainProtectionStatusaktueller Status der Regen Protection „unprotected“ oder „unprotected“ - ModeUp + ModeUpaktuelle Einstellung für den Modus des Morgens Hochfahren ModeDown LockOut LockOutCmd From d34d71277c7469328ad5403907fcab280e94f0ec Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Thu, 4 Jun 2020 09:36:29 +0200 Subject: [PATCH 41/60] test hook und change commandref --- FHEM/73_AutoShuttersControl.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FHEM/73_AutoShuttersControl.pm b/FHEM/73_AutoShuttersControl.pm index bcc7db3..bfa3e8f 100644 --- a/FHEM/73_AutoShuttersControl.pm +++ b/FHEM/73_AutoShuttersControl.pm @@ -1062,7 +1062,7 @@ sub Initialize { RainProtectionRain Protection soll aktiv sein oder nicht RainProtectionStatusaktueller Status der Regen Protection „unprotected“ oder „unprotected“ ModeUpaktuelle Einstellung für den Modus des Morgens Hochfahren - ModeDown + ModeDown LockOut LockOutCmd AutoAstroModeMorning From 6d755015aa883ffca72459cf35013ac091a6cd87 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Thu, 4 Jun 2020 09:50:33 +0200 Subject: [PATCH 42/60] test hook und change commandref --- FHEM/73_AutoShuttersControl.pm | 2 +- controls_AutoShuttersControl.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/FHEM/73_AutoShuttersControl.pm b/FHEM/73_AutoShuttersControl.pm index bfa3e8f..8feaeeb 100644 --- a/FHEM/73_AutoShuttersControl.pm +++ b/FHEM/73_AutoShuttersControl.pm @@ -1063,7 +1063,7 @@ sub Initialize { RainProtectionStatusaktueller Status der Regen Protection „unprotected“ oder „unprotected“ ModeUpaktuelle Einstellung für den Modus des Morgens Hochfahren ModeDown - LockOut + LockOut LockOutCmd AutoAstroModeMorning AutoAstroModeEvening diff --git a/controls_AutoShuttersControl.txt b/controls_AutoShuttersControl.txt index a35ea46..f4ba088 100644 --- a/controls_AutoShuttersControl.txt +++ b/controls_AutoShuttersControl.txt @@ -1,4 +1,4 @@ -UPD 2020-06-04_08:15:31 88722 FHEM/73_AutoShuttersControl.pm +UPD 2020-06-04_09:36:05 88780 FHEM/73_AutoShuttersControl.pm UPD 2020-06-04_08:15:31 186158 lib/FHEM/Automation/ShuttersControl.pm UPD 2020-06-04_08:15:31 2656 lib/FHEM/Automation/ShuttersControl/Dev.pm UPD 2020-06-04_08:15:31 2478 lib/FHEM/Automation/ShuttersControl/Roommate.pm From b2a70e69179e666607a427d238e2a7785efc2f82 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Thu, 4 Jun 2020 10:11:08 +0200 Subject: [PATCH 43/60] more commandref --- FHEM/73_AutoShuttersControl.pm | 36 ++++++++++++++++---------------- controls_AutoShuttersControl.txt | 2 +- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/FHEM/73_AutoShuttersControl.pm b/FHEM/73_AutoShuttersControl.pm index 8feaeeb..1e1f126 100644 --- a/FHEM/73_AutoShuttersControl.pm +++ b/FHEM/73_AutoShuttersControl.pm @@ -57,14 +57,14 @@ BEGIN { GP_Import( qw( readingFnAttributes - ) + ) ); #-- Export to main context with different name GP_Export( qw( Initialize - ) + ) ); } @@ -100,13 +100,13 @@ sub Initialize { . 'ASC_slatDriveCmdInverse:0,1 ' . $readingFnAttributes; $hash->{NotifyOrderPrefix} = '51-'; # Order Nummer für NotifyFn - $hash->{FW_detailFn} = \&FHEM::Automation::ShuttersControl::ShuttersInformation; + $hash->{FW_detailFn} = + \&FHEM::Automation::ShuttersControl::ShuttersInformation; $hash->{parseParams} = 1; return FHEM::Meta::InitMod( __FILE__, $hash ); } - 1; =pod @@ -1061,20 +1061,20 @@ sub Initialize { WindProtectionStatusaktueller Status der Wind Protection „protected“ oder „unprotected“ RainProtectionRain Protection soll aktiv sein oder nicht RainProtectionStatusaktueller Status der Regen Protection „unprotected“ oder „unprotected“ - ModeUpaktuelle Einstellung für den Modus des Morgens Hochfahren - ModeDown - LockOut - LockOutCmd - AutoAstroModeMorning - AutoAstroModeEvening - AutoAstroModeMorningHorizon - AutoAstroModeEveningHorizon - Up - Down - TimeUpEarly - TimeUpLate - TimeDownEarly - TimeDownLate + ModeUpaktuelle Einstellung für den Modus des Morgens hoch fahren + ModeDownaktuelle Einstellung für den Modus des Abends runter fahren + LockOutaktuelle Einstellung für den Aussperrschutz + LockOutCmdAussperrschutz Kommando am Aktor + AutoAstroModeMorningaktuell engestellter Wert für Astro Morgens + AutoAstroModeEveningaktuell engestellter Wert für Astro Abends + AutoAstroModeMorningHorizonHORIZON Wert Morgens + AutoAstroModeEveningHorizonHORIZON Wert Abends + Upaktueller Wert für Morgenfahrten + Downaktueller Wert für Abendfahrten + TimeUpEarlyaktueller Wert für frühste Morgenfahrt + TimeUpLateaktueller Wert für späteste Morgenfahrt + TimeDownEarlyaktueller Wert für frühste Abendfahrt + TimeDownLateaktueller Wert für späteste Abendfahrt TimeUpWeHoliday diff --git a/controls_AutoShuttersControl.txt b/controls_AutoShuttersControl.txt index f4ba088..78ee895 100644 --- a/controls_AutoShuttersControl.txt +++ b/controls_AutoShuttersControl.txt @@ -1,4 +1,4 @@ -UPD 2020-06-04_09:36:05 88780 FHEM/73_AutoShuttersControl.pm +UPD 2020-06-04_09:50:24 88779 FHEM/73_AutoShuttersControl.pm UPD 2020-06-04_08:15:31 186158 lib/FHEM/Automation/ShuttersControl.pm UPD 2020-06-04_08:15:31 2656 lib/FHEM/Automation/ShuttersControl/Dev.pm UPD 2020-06-04_08:15:31 2478 lib/FHEM/Automation/ShuttersControl/Roommate.pm From 60db9c4f5d34ce424411cdf9074236cc1e69aebe Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Thu, 4 Jun 2020 10:17:25 +0200 Subject: [PATCH 44/60] test --- controls_AutoShuttersControl.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/controls_AutoShuttersControl.txt b/controls_AutoShuttersControl.txt index 78ee895..8e73944 100644 --- a/controls_AutoShuttersControl.txt +++ b/controls_AutoShuttersControl.txt @@ -1,4 +1,4 @@ -UPD 2020-06-04_09:50:24 88779 FHEM/73_AutoShuttersControl.pm +UPD 2020-06-04_10:09:57 89295 FHEM/73_AutoShuttersControl.pm UPD 2020-06-04_08:15:31 186158 lib/FHEM/Automation/ShuttersControl.pm UPD 2020-06-04_08:15:31 2656 lib/FHEM/Automation/ShuttersControl/Dev.pm UPD 2020-06-04_08:15:31 2478 lib/FHEM/Automation/ShuttersControl/Roommate.pm From 2bd44d3073186dde832743dad754199951bee81b Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Thu, 4 Jun 2020 10:50:39 +0200 Subject: [PATCH 45/60] add more ascAPIget commands to commandref --- API_Uebersicht.txt | 152 --------------------------------- FHEM/73_AutoShuttersControl.pm | 68 +++++++++++---- 2 files changed, 52 insertions(+), 168 deletions(-) delete mode 100644 API_Uebersicht.txt diff --git a/API_Uebersicht.txt b/API_Uebersicht.txt deleted file mode 100644 index c15b30e..0000000 --- a/API_Uebersicht.txt +++ /dev/null @@ -1,152 +0,0 @@ ---- In den Rolläden --- -AntiFreezePos -AntiFreezePosAssignment - nur getter -AntiFreeze -ShuttersPlace -SlatPosCmd -SlatDevice - nur getter -PrivacyUpTime -PrivacyUpBrightnessVal - nur getter -PrivacyDownTime -PrivacyDownBrightnessVal - nur getter -PrivacyDownPos -PrivacyDownPositionAssignment - nur getter -PrivacyUpPos -PrivacyUpPositionAssignment - nur getter -SelfDefenseMode -SelfDefenseAbsentDelay -WiggleValue -Adv -ShadingPos -ShadingPositionAssignment - nur getter -ShadingMode -IdleDetectionReading - nur setter -IdleDetectionValue - nur getter -BrightnessSensor - nur setter -ShadingInOutAzimuth - nur setter -ShadingAzimuthRight - nur getter -ShadingAzimuthLeft - nur getter -ShadingMinOutsideTemperature -ShadingMinMaxElevation - nur setter -ShadingMinElevation - nur getter -ShadingMaxElevation - nur getter -ShadingStateChangeSunnyCloudy - nur setter -ShadingStateChangeSunny - nur getter -ShadingStateChangeCloudy - nur getter -ShadingWaitingPeriod -ExternalTrigger - nur setter -ExternalTriggerDevice - nur getter -ExternalTriggerReading - nur getter -ExternalTriggerValueActive - nur getter -ExternalTriggerValueActive2 - nur getter -ExternalTriggerValueInactive - nur getter -ExternalTriggerPosActive - nur getter -ExternalTriggerPosActive2 - nur getter -ExternalTriggerPosInactive - nur getter -ExternalTriggerState - nur getter -Delay -DelayStart -BlockingTimeAfterManual -BlockingTimeBeforNightClose -BlockingTimeBeforDayOpen -PosCmd - ASC_Pos_Reading -OpenPos -OpenPositionAssignment - nur getter -VentilatePos -VentilatePositionAssignment - nur getter -VentilatePosAfterDayClosed -ClosedPos -ClosedPositionAssignment - nur getter -SleepPos -SleepPositionAssignment - nur getter -VentilateOpen -ComfortOpenPos -ComfortOpenPositionAssignment - nur getter -PartyMode -Roommates -RoommatesReading -RoommatesStatus - nur getter -RoommatesLastStatus - nur getter -WindParameters - nur setter -WindPos - nur getter -WindMax - nur getter -WindMin - nur getter -WindProtection -RainProtection -ModeUp -ModeDown -LockOut -LockOutCmd -AutoAstroModeMorning -AutoAstroModeEvening -AutoAstroModeMorningHorizon -AutoAstroModeEveningHorizon -Up -Down -TimeUpEarly -TimeUpLate -TimeDownEarly -TimeDownLate -TimeUpWeHoliday -getBrightnessMinVal - nur getter -BrightnessMaxVal - nur getter -DriveUpMaxDuration -Homemode - nur getter -PrivacyDownStatus - nur getter -PrivacyUpStatus - nur getter -IsDay - nur getter -SelfDefenseState - nur getter -LastDrive - nur getter -LastPos - nur getter -Sunset - nur getter -Sunrise - nur getter -OutTemp - nur getter -IdleDetection - nur getter -BrightnessAverage - nur getter nur für die Beschattung relevant -ShadingStatus - nur getter -ShadingLastStatus - nur getter -ShadingManualDriveStatus - nur getter -IfInShading - nur getter -WindProtectionStatus - nur getter -RainProtectionStatus - nur getter -Brightness - nur getter -WindStatus - nur getter -Status - nur getter, aktuelle Position des Rollos -DelayCmd - nur getter, Status der Query von ausgesetzten Fahrten wegen PartyMod oder offnen Fenster -ASCenable - nur getter, Status der ASC Steuerung vom Rollo -SubTyp - Fenster SubType -WinDevReading - nur getter, Reading für das Fenster ExternalTriggerDevice -WinDev - nur setter, ASC_WindowRec -WinStatus - nur getter, Fensterstatus - - - - ---- Im ASC Device --- - alles nur getter für das ASC Device -PartyMode - Party Mode Reading -HardLockOut - Hard Lock Out Reading -SunriseTimeWeHoliday - Feiertags und Wochenend Sunrise Zeiten beachten -OutTemp - Wert vom Tempsensor für Aussen -ResidentsStatus - aktueller Staus des Residents Devices -ResidentsLastStatus - vorheriger Staus des Residents Devices -AutoShuttersControlShading - globale Beschattung on/off -SelfDefense - global Self Defense on/off -Azimuth - aktueller Azimutwert vom Twilight Device -Elevation - aktueller Elevationwert vom Twilight Device -ASCenable - globaler ASC Status -ShuttersOffset - globales Drive Delay -BrightnessMinVal - Brightness Wert für Sonnenuntergang -BrightnessMaxVal - Brightness Wert für Sonnenaufgang -AutoAstroModeEvening -AutoAstroModeEveningHorizon -AutoAstroModeMorning -AutoAstroModeMorningHorizon -AutoShuttersControlMorning -AutoShuttersControlEvening -AutoShuttersControlComfort -FreezeTemp -RainTriggerMax -RainTriggerMin -RainSensorShuttersClosedPos -RainWaitingTime -BlockAscDrivesAfterManual diff --git a/FHEM/73_AutoShuttersControl.pm b/FHEM/73_AutoShuttersControl.pm index 1e1f126..0c97066 100644 --- a/FHEM/73_AutoShuttersControl.pm +++ b/FHEM/73_AutoShuttersControl.pm @@ -1075,22 +1075,37 @@ sub Initialize { TimeUpLateaktueller Wert für späteste Morgenfahrt TimeDownEarlyaktueller Wert für frühste Abendfahrt TimeDownLateaktueller Wert für späteste Abendfahrt - TimeUpWeHoliday - - - - - - - - - - - - - - - + TimeUpWeHolidayaktueller Wert für Wochenende und Feiertags Morgenfahrten + BrightnessMinVal + BrightnessMaxVal + DriveUpMaxDuration + Homemode + PrivacyDownStatus + PrivacyUpStatus + IsDay + SelfDefenseState + LastDrive + LastPos + Sunset + Sunrise + OutTemp + IdleDetection + BrightnessAverageNur für die Beschattung relevant + ShadingStatus + ShadingLastStatus + ShadingManualDriveStatus + IfInShading + WindProtectionStatus + RainProtectionStatus + Brightness + WindStatus + Statusaktuelle Position des Rollos + DelayCmdStatus der Query von ausgesetzten Fahrten wegen PartyMod oder offnen Fenster + ASCenableStatus der ASC Steuerung vom Rollo + SubTypSubtype vom Rollo + WinDevReading + WinDev + WinStatus NoDelayWurde die Behandlung von Offset deaktiviert (Beispiel bei Fahrten über Fensterevents) LastDriveGrund des letzten Fahrens LastPosdie letzte Position des Rollladens @@ -1135,6 +1150,27 @@ sub Initialize { AzimuthAzimut Wert ElevationElevation Wert ASCenableist die ASC Steuerung global aktiv? + PartyModeParty Mode Reading + HardLockOutHard Lock Out Reading + SunriseTimeWeHolidayFeiertags und Wochenend Sunrise Zeiten beachten + AutoShuttersControlShadingglobale Beschattung on/off + SelfDefenseglobal Self Defense on/off + ShuttersOffsetglobales Drive Delay + BrightnessMinValBrightness Wert für Sonnenuntergang + BrightnessMaxValBrightness Wert für Sonnenaufgang + AutoAstroModeEvening + AutoAstroModeEveningHorizon + AutoAstroModeMorning + AutoAstroModeMorningHorizon + AutoShuttersControlMorning + AutoShuttersControlEvening + AutoShuttersControlComfort + FreezeTemp + RainTriggerMax + RainTriggerMin + RainSensorShuttersClosedPos + RainWaitingTime + BlockAscDrivesAfterManual From b79ab5efaf5d9b1c024469e17716501f53df6ea5 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Thu, 4 Jun 2020 10:51:54 +0200 Subject: [PATCH 46/60] change control file --- controls_AutoShuttersControl.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/controls_AutoShuttersControl.txt b/controls_AutoShuttersControl.txt index 8e73944..8b7cadb 100644 --- a/controls_AutoShuttersControl.txt +++ b/controls_AutoShuttersControl.txt @@ -1,4 +1,4 @@ -UPD 2020-06-04_10:09:57 89295 FHEM/73_AutoShuttersControl.pm +UPD 2020-06-04_10:50:07 92095 FHEM/73_AutoShuttersControl.pm UPD 2020-06-04_08:15:31 186158 lib/FHEM/Automation/ShuttersControl.pm UPD 2020-06-04_08:15:31 2656 lib/FHEM/Automation/ShuttersControl/Dev.pm UPD 2020-06-04_08:15:31 2478 lib/FHEM/Automation/ShuttersControl/Roommate.pm From 9fafc505ae7304f309360b6c20c2ab4e6d4563b0 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Thu, 4 Jun 2020 17:56:27 +0200 Subject: [PATCH 47/60] fix Undefined subroutine &main::AutoShuttersControl_ascAPIget --- lib/FHEM/Automation/ShuttersControl.pm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/FHEM/Automation/ShuttersControl.pm b/lib/FHEM/Automation/ShuttersControl.pm index a4b7059..b933813 100644 --- a/lib/FHEM/Automation/ShuttersControl.pm +++ b/lib/FHEM/Automation/ShuttersControl.pm @@ -50,13 +50,13 @@ use utf8; sub ascAPIget { my ( $getCommand, $shutterDev, $value ) = @_; - return AutoShuttersControl_ascAPIget( $getCommand, $shutterDev, $value ); + return ShuttersControl_ascAPIget( $getCommand, $shutterDev, $value ); } sub ascAPIset { my ( $setCommand, $shutterDev, $value ) = @_; - return AutoShuttersControl_ascAPIset( $setCommand, $shutterDev, $value ); + return ShuttersControl_ascAPIset( $setCommand, $shutterDev, $value ); } ## unserer packagename From 2d2c10ed9ce6bb561934cfdc7efa687b8e988d76 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Thu, 4 Jun 2020 17:57:04 +0200 Subject: [PATCH 48/60] change control file --- controls_AutoShuttersControl.txt | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/controls_AutoShuttersControl.txt b/controls_AutoShuttersControl.txt index 8b7cadb..e532bdc 100644 --- a/controls_AutoShuttersControl.txt +++ b/controls_AutoShuttersControl.txt @@ -1,12 +1,12 @@ -UPD 2020-06-04_10:50:07 92095 FHEM/73_AutoShuttersControl.pm -UPD 2020-06-04_08:15:31 186158 lib/FHEM/Automation/ShuttersControl.pm -UPD 2020-06-04_08:15:31 2656 lib/FHEM/Automation/ShuttersControl/Dev.pm -UPD 2020-06-04_08:15:31 2478 lib/FHEM/Automation/ShuttersControl/Roommate.pm -UPD 2020-06-04_08:15:31 28839 lib/FHEM/Automation/ShuttersControl/Shutters.pm -UPD 2020-06-04_08:15:31 2174 lib/FHEM/Automation/ShuttersControl/Window.pm -UPD 2020-06-04_08:15:31 11437 lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm -UPD 2020-06-04_08:15:31 6868 lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm -UPD 2020-06-04_08:15:31 52473 lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm -UPD 2020-06-04_08:15:31 2873 lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm -UPD 2020-06-04_08:15:31 3973 lib/FHEM/Automation/ShuttersControl/Window/Attr.pm -UPD 2020-06-04_08:15:31 2273 lib/FHEM/Automation/ShuttersControl/Window/Readings.pm +UPD 2020-06-04_15:50:33 92095 FHEM/73_AutoShuttersControl.pm +UPD 2020-06-04_17:55:33 186150 lib/FHEM/Automation/ShuttersControl.pm +UPD 2020-06-04_15:50:33 2656 lib/FHEM/Automation/ShuttersControl/Dev.pm +UPD 2020-06-04_15:50:33 2478 lib/FHEM/Automation/ShuttersControl/Roommate.pm +UPD 2020-06-04_15:50:33 28839 lib/FHEM/Automation/ShuttersControl/Shutters.pm +UPD 2020-06-04_15:50:33 2174 lib/FHEM/Automation/ShuttersControl/Window.pm +UPD 2020-06-04_15:50:33 11437 lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm +UPD 2020-06-04_15:50:33 6868 lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm +UPD 2020-06-04_15:50:33 52473 lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm +UPD 2020-06-04_15:50:33 2873 lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm +UPD 2020-06-04_15:50:33 3973 lib/FHEM/Automation/ShuttersControl/Window/Attr.pm +UPD 2020-06-04_15:50:33 2273 lib/FHEM/Automation/ShuttersControl/Window/Readings.pm From d5d8d5a116cac02792888bd74bd00cfb575d9e12 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Fri, 5 Jun 2020 22:25:17 +0200 Subject: [PATCH 49/60] fix slat drive bug then set getSlatDriveCmdInverse --- FHEM/73_AutoShuttersControl.pm | 101 ++++++++++++++++++++++++- lib/FHEM/Automation/ShuttersControl.pm | 18 +++-- 2 files changed, 107 insertions(+), 12 deletions(-) diff --git a/FHEM/73_AutoShuttersControl.pm b/FHEM/73_AutoShuttersControl.pm index 0c97066..a49f5c9 100644 --- a/FHEM/73_AutoShuttersControl.pm +++ b/FHEM/73_AutoShuttersControl.pm @@ -985,7 +985,7 @@ sub Initialize { Beschreibung der AutoShuttersControl API
    Mit dem Aufruf der API Funktion und Übergabe der entsprechenden Parameter ist es möglich auf interne Daten zu zu greifen.

    - Übersicht für das Rollladen-Device + Übersicht für das Rollladen-Device Getter
      { ascAPIget('Getter','ROLLODEVICENAME') }
    @@ -1129,7 +1129,7 @@ sub Initialize { OutTempaktuelle Außentemperatur sofern ein Sensor definiert ist, wenn nicht kommt -100 als Wert zurück

    - Übersicht für das Rollladen-Device mit Parameterübergabe + Übersicht für das Rollladen-Device mit Parameterübergabe Getter
      { ascAPIget('Getter','ROLLODEVICENAME',VALUE) }
    @@ -1138,7 +1138,100 @@ sub Initialize { QueryShuttersPosRückgabewert 1 bedeutet das die aktuelle Position des Rollos unterhalb der Valueposition ist. 0 oder nichts bedeutet oberhalb der Valueposition.

    - Übersicht für das ASC Device + Übersicht für das Rollladen-Device Setter +
      + { ascAPIset('Setter','ROLLODEVICENAME') }
      +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    SetterErläuterung
    AntiFreezePossetzt die Position für Antifreeze
    AntiFreezesetzt den Wert für Antifreeze - off/soft/hard/am/pm
    ShuttersPlacesetzt den Standort des Rollos - window/terrace
    SlatPosCmdsetzt Command für das fahren der Lamellen
    PrivacyUpTimesetzt die Zeit für die morgendliche privacy Fahrt
    PrivacyDownTimeetzt die Zeit für die abendliche privacy Fahrt
    PrivacyDownPossetzt die Position für eine abendliche privacy Fahrt
    PrivacyUpPossetzt die Position für eine morgendliche privacy Fahrt
    SelfDefenseModesetzt den Modus für SelfDefense
    SelfDefenseAbsentDelaysetzt den Verzögerungswert für SelfDefense
    WiggleValuesetzen der Werte für Wiggle
    Advsetzt die Unterstützung für Weihnachten - on/off
    ShadingPossetzt den Wert der Beschattungsposition
    ShadingModesetzt den Modus der Beschattung - absent/always/off/home
    ShadingMinOutsideTemperaturesetzt den mininmal Temperaturwert zur Beschattung
    ShadingWaitingPeriodsetzt den Wert der Beschattungswartezeit
    Delaysetzt den Zufallswert zur verzögerten Fahrt
    DelayStartsetzen den festen Wert zur verzögerten Fahrt
    BlockingTimeAfterManualsetzt den Wert in Sekunden zur Blockade nach einer manuellen Fahrt
    BlockingTimeBeforNightClosesetzt den Wert in Sekunden zur Blockade vor der Nachtfahrt
    BlockingTimeBeforDayOpensetzt den Wert in Sekunden zur Blockade vor der Tagfahrt
    PosCmdsetzt den Readingnamen zur Positionserkennung des Rollos
    OpenPossetzt den Wert für die offen Position
    VentilatePos
    VentilatePosAfterDayClosed
    ClosedPos
    SleepPos
    VentilateOpen
    ComfortOpenPos
    PartyMode
    Roommates
    RoommatesReading
    +

    + Übersicht für das ASC Device Getter
      { ascAPIget('Getter') }
    @@ -1195,7 +1288,7 @@ sub Initialize { ], "release_status": "testing", "license": "GPL_2", - "version": "v0.9.21", + "version": "v0.9.22", "author": [ "Marko Oldenburg " ], diff --git a/lib/FHEM/Automation/ShuttersControl.pm b/lib/FHEM/Automation/ShuttersControl.pm index b933813..bb83664 100644 --- a/lib/FHEM/Automation/ShuttersControl.pm +++ b/lib/FHEM/Automation/ShuttersControl.pm @@ -4625,7 +4625,11 @@ sub _SetCmdFn { } } - if ( $ascDev->getSlatDriveCmdInverse ) { + if ( $ascDev->getSlatDriveCmdInverse + && $slatPos > -1 + && $shutters->getSlatPosCmd ne 'none' + ) + { CommandSet( undef, ( @@ -4636,9 +4640,7 @@ sub _SetCmdFn { . ' ' . $shutters->getSlatPosCmd . ' ' . $slatPos - ) - if ( $slatPos > -1 - && $shutters->getSlatPosCmd ne 'none' ); + ); InternalTimer( gettimeofday() + 3, @@ -4651,9 +4653,7 @@ sub _SetCmdFn { . $driveCommand ); }, $shuttersDev - ) - if ( $slatPos > -1 - && $shutters->getSlatPosCmd ne 'none' ); + ); } else { CommandSet( undef, @@ -4679,7 +4679,9 @@ sub _SetCmdFn { ); }, $shuttersDev - ); + ) + if ( $slatPos > -1 + && $shutters->getSlatPosCmd ne 'none' ); } $shutters->setSelfDefenseAbsent( 0, 0 ) From c356217eaf4f10bdf26522854d260753942120b6 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Fri, 5 Jun 2020 22:25:42 +0200 Subject: [PATCH 50/60] change controls --- controls_AutoShuttersControl.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/controls_AutoShuttersControl.txt b/controls_AutoShuttersControl.txt index e532bdc..b4f3993 100644 --- a/controls_AutoShuttersControl.txt +++ b/controls_AutoShuttersControl.txt @@ -1,5 +1,5 @@ -UPD 2020-06-04_15:50:33 92095 FHEM/73_AutoShuttersControl.pm -UPD 2020-06-04_17:55:33 186150 lib/FHEM/Automation/ShuttersControl.pm +UPD 2020-06-05_22:24:28 96920 FHEM/73_AutoShuttersControl.pm +UPD 2020-06-05_22:24:14 186156 lib/FHEM/Automation/ShuttersControl.pm UPD 2020-06-04_15:50:33 2656 lib/FHEM/Automation/ShuttersControl/Dev.pm UPD 2020-06-04_15:50:33 2478 lib/FHEM/Automation/ShuttersControl/Roommate.pm UPD 2020-06-04_15:50:33 28839 lib/FHEM/Automation/ShuttersControl/Shutters.pm From 8d748b65cece265944db2e50d7549e1eaab35733 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Fri, 5 Jun 2020 22:26:11 +0200 Subject: [PATCH 51/60] change controls --- controls_AutoShuttersControl.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/controls_AutoShuttersControl.txt b/controls_AutoShuttersControl.txt index b4f3993..73be85d 100644 --- a/controls_AutoShuttersControl.txt +++ b/controls_AutoShuttersControl.txt @@ -1,5 +1,5 @@ -UPD 2020-06-05_22:24:28 96920 FHEM/73_AutoShuttersControl.pm -UPD 2020-06-05_22:24:14 186156 lib/FHEM/Automation/ShuttersControl.pm +UPD 2020-06-05_22:25:26 96920 FHEM/73_AutoShuttersControl.pm +UPD 2020-06-05_22:25:24 186156 lib/FHEM/Automation/ShuttersControl.pm UPD 2020-06-04_15:50:33 2656 lib/FHEM/Automation/ShuttersControl/Dev.pm UPD 2020-06-04_15:50:33 2478 lib/FHEM/Automation/ShuttersControl/Roommate.pm UPD 2020-06-04_15:50:33 28839 lib/FHEM/Automation/ShuttersControl/Shutters.pm From 7a60b0477728a1862eb6d1b6575d8616bb238de7 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Tue, 9 Jun 2020 13:21:16 +0200 Subject: [PATCH 52/60] add setter for commandref, fix roomate fn if roommate come home and shading active --- FHEM/73_AutoShuttersControl.pm | 12 +- lib/FHEM/Automation/ShuttersControl.pm | 28 ++- lib/FHEM/Automation/ShuttersControl/Dev.pm | 4 +- .../Automation/ShuttersControl/Dev/Attr.pm | 9 +- .../ShuttersControl/Dev/Readings.pm | 95 ++++++--- .../Automation/ShuttersControl/Roommate.pm | 5 +- .../Automation/ShuttersControl/Shutters.pm | 200 +++++++++++++----- .../ShuttersControl/Shutters/Attr.pm | 106 ++++++---- .../ShuttersControl/Shutters/Readings.pm | 14 +- lib/FHEM/Automation/ShuttersControl/Window.pm | 4 +- .../Automation/ShuttersControl/Window/Attr.pm | 1 - .../ShuttersControl/Window/Readings.pm | 5 +- 12 files changed, 328 insertions(+), 155 deletions(-) diff --git a/FHEM/73_AutoShuttersControl.pm b/FHEM/73_AutoShuttersControl.pm index a49f5c9..08ed8fa 100644 --- a/FHEM/73_AutoShuttersControl.pm +++ b/FHEM/73_AutoShuttersControl.pm @@ -1166,11 +1166,11 @@ sub Initialize { BlockingTimeBeforNightClosesetzt den Wert in Sekunden zur Blockade vor der Nachtfahrt BlockingTimeBeforDayOpensetzt den Wert in Sekunden zur Blockade vor der Tagfahrt PosCmdsetzt den Readingnamen zur Positionserkennung des Rollos - OpenPossetzt den Wert für die offen Position - VentilatePos - VentilatePosAfterDayClosed - ClosedPos - SleepPos + OpenPossetzt den Wert für die offen Position + VentilatePossetzt den Wert für die ventilate Position + VentilatePosAfterDayClosedwas soll passieren wenn am Tag das Fenster geschlossen wird - open/lastManual + ClosedPossetzt den Wert für die geschlossen Position + SleepPossetzt den Wert für die schlafen Position VentilateOpen ComfortOpenPos PartyMode @@ -1288,7 +1288,7 @@ sub Initialize { ], "release_status": "testing", "license": "GPL_2", - "version": "v0.9.22", + "version": "v0.9.23", "author": [ "Marko Oldenburg " ], diff --git a/lib/FHEM/Automation/ShuttersControl.pm b/lib/FHEM/Automation/ShuttersControl.pm index bb83664..3d65056 100644 --- a/lib/FHEM/Automation/ShuttersControl.pm +++ b/lib/FHEM/Automation/ShuttersControl.pm @@ -1338,6 +1338,20 @@ sub EventProcessingRoommate { ) { if ( + $shutters->getIsDay + && $shutters->getIfInShading + && $shutters->getStatus != $shutters->getShadingPos + && !$shutters->getShadingManualDriveStatus + && !( + CheckIfShuttersWindowRecOpen($shuttersDev) == 2 + && $shutters->getShuttersPlace eq 'terrace' + ) + && !$shutters->getSelfDefenseState + ) + { + ShadingProcessingDriveCommand( $hash, $shuttersDev ); + } + elsif ( !$shutters->getIsDay && IsAfterShuttersTimeBlocking($shuttersDev) && ( $getModeDown eq 'home' @@ -1372,6 +1386,7 @@ sub EventProcessingRoommate { && IsAfterShuttersTimeBlocking($shuttersDev) && ( $getModeUp eq 'home' || $getModeUp eq 'always' ) + && !$shutters->getIfInShading ) { if ( $shutters->getIfInShading @@ -4625,10 +4640,9 @@ sub _SetCmdFn { } } - if ( $ascDev->getSlatDriveCmdInverse - && $slatPos > -1 - && $shutters->getSlatPosCmd ne 'none' - ) + if ( $ascDev->getSlatDriveCmdInverse + && $slatPos > -1 + && $shutters->getSlatPosCmd ne 'none' ) { CommandSet( undef, @@ -4640,7 +4654,7 @@ sub _SetCmdFn { . ' ' . $shutters->getSlatPosCmd . ' ' . $slatPos - ); + ); InternalTimer( gettimeofday() + 3, @@ -4653,7 +4667,7 @@ sub _SetCmdFn { . $driveCommand ); }, $shuttersDev - ); + ); } else { CommandSet( undef, @@ -4679,7 +4693,7 @@ sub _SetCmdFn { ); }, $shuttersDev - ) + ) if ( $slatPos > -1 && $shutters->getSlatPosCmd ne 'none' ); } diff --git a/lib/FHEM/Automation/ShuttersControl/Dev.pm b/lib/FHEM/Automation/ShuttersControl/Dev.pm index a426d96..6975a3f 100644 --- a/lib/FHEM/Automation/ShuttersControl/Dev.pm +++ b/lib/FHEM/Automation/ShuttersControl/Dev.pm @@ -43,7 +43,8 @@ package FHEM::Automation::ShuttersControl::Dev; use FHEM::Automation::ShuttersControl::Dev::Readings; use FHEM::Automation::ShuttersControl::Dev::Attr; -our @ISA = qw(FHEM::Automation::ShuttersControl::Dev::Readings FHEM::Automation::ShuttersControl::Dev::Attr); +our @ISA = + qw(FHEM::Automation::ShuttersControl::Dev::Readings FHEM::Automation::ShuttersControl::Dev::Attr); use strict; use warnings; @@ -79,5 +80,4 @@ sub getName { return $self->{name}; } - 1; diff --git a/lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm b/lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm index 3ae90b1..3fa278b 100644 --- a/lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm +++ b/lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm @@ -223,8 +223,8 @@ sub _getResidentsDev { && ( gettimeofday() - $self->{ASC_residentsDev}->{LASTGETTIME} ) < 2 ); $self->{ASC_residentsDev}->{LASTGETTIME} = int( gettimeofday() ); my ( $device, $reading ) = - FHEM::Automation::ShuttersControl::GetAttrValues( $name, 'ASC_residentsDev', - 'none' ); + FHEM::Automation::ShuttersControl::GetAttrValues( $name, + 'ASC_residentsDev', 'none' ); $self->{ASC_residentsDev}->{device} = $device; $self->{ASC_residentsDev}->{reading} = @@ -272,7 +272,9 @@ sub _getRainSensor { : ( $self->{ASC_rainSensor}->{triggermax} * 0 ) ); $self->{ASC_rainSensor}->{shuttersClosedPos} = - ( $pos ne 'none' ? $pos : $FHEM::Automation::ShuttersControl::shutters->getClosedPos ); + ( $pos ne 'none' + ? $pos + : $FHEM::Automation::ShuttersControl::shutters->getClosedPos ); $self->{ASC_rainSensor}->{waitingTime} = ( $pos ne 'none' ? $wait : 900 ); @@ -384,5 +386,4 @@ sub getBlockAscDrivesAfterManual { return AttrVal( $name, 'ASC_blockAscDrivesAfterManual', 0 ); } - 1; diff --git a/lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm b/lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm index ef3cddf..4ec4f1b 100644 --- a/lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm +++ b/lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm @@ -62,9 +62,13 @@ sub setDelayCmdReading { my $name = $self->{name}; my $hash = $defs{$name}; - readingsSingleUpdate( $hash, - $FHEM::Automation::ShuttersControl::shutters->getShuttersDev . '_lastDelayPosValue', - $FHEM::Automation::ShuttersControl::shutters->getDelayCmd, 1 ); + readingsSingleUpdate( + $hash, + $FHEM::Automation::ShuttersControl::shutters->getShuttersDev + . '_lastDelayPosValue', + $FHEM::Automation::ShuttersControl::shutters->getDelayCmd, + 1 + ); return; } @@ -75,8 +79,15 @@ sub setStateReading { my $name = $self->{name}; my $hash = $defs{$name}; - readingsSingleUpdate( $hash, 'state', - ( defined($value) ? $value : $FHEM::Automation::ShuttersControl::shutters->getLastDrive ), 1 ); + readingsSingleUpdate( + $hash, 'state', + ( + defined($value) + ? $value + : $FHEM::Automation::ShuttersControl::shutters->getLastDrive + ), + 1 + ); return; } @@ -86,8 +97,13 @@ sub setPosReading { my $name = $self->{name}; my $hash = $defs{$name}; - readingsSingleUpdate( $hash, $FHEM::Automation::ShuttersControl::shutters->getShuttersDev . '_PosValue', - $FHEM::Automation::ShuttersControl::shutters->getStatus, 1 ); + readingsSingleUpdate( + $hash, + $FHEM::Automation::ShuttersControl::shutters->getShuttersDev + . '_PosValue', + $FHEM::Automation::ShuttersControl::shutters->getStatus, + 1 + ); return; } @@ -97,8 +113,13 @@ sub setLastPosReading { my $name = $self->{name}; my $hash = $defs{$name}; - readingsSingleUpdate( $hash, $FHEM::Automation::ShuttersControl::shutters->getShuttersDev . '_lastPosValue', - $FHEM::Automation::ShuttersControl::shutters->getLastPos, 1 ); + readingsSingleUpdate( + $hash, + $FHEM::Automation::ShuttersControl::shutters->getShuttersDev + . '_lastPosValue', + $FHEM::Automation::ShuttersControl::shutters->getLastPos, + 1 + ); return; } @@ -138,7 +159,9 @@ sub getMonitoredDevs { sub getOutTemp { my $self = shift; - return ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getTempSensor, $FHEM::Automation::ShuttersControl::ascDev->getTempSensorReading, + return ReadingsVal( + $FHEM::Automation::ShuttersControl::ascDev->_getTempSensor, + $FHEM::Automation::ShuttersControl::ascDev->getTempSensorReading, -100 ); } @@ -146,7 +169,8 @@ sub getResidentsStatus { my $self = shift; my $val = - ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev, $FHEM::Automation::ShuttersControl::ascDev->getResidentsReading, + ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev, + $FHEM::Automation::ShuttersControl::ascDev->getResidentsReading, 'none' ); if ( $val =~ m{^(?:(.+)_)?(.+)$}xms ) { @@ -154,8 +178,10 @@ sub getResidentsStatus { return $1 && $1 eq 'pet' ? 'absent' : $2; } elsif ( - ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev, 'homealoneType', '-' ) eq - 'PET' ) + ReadingsVal( + $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev, + 'homealoneType', '-' ) eq 'PET' + ) { return ( 'pet', 'absent' ) if (wantarray); return 'absent'; @@ -169,15 +195,19 @@ sub getResidentsStatus { sub getResidentsLastStatus { my $self = shift; - my $val = ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev, 'lastState', 'none' ); + my $val = + ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev, + 'lastState', 'none' ); if ( $val =~ m{^(?:(.+)_)?(.+)$}xms ) { return ( $1, $2 ) if (wantarray); return $1 && $1 eq 'pet' ? 'absent' : $2; } elsif ( - ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev, 'lastHomealoneType', '-' ) eq - 'PET' ) + ReadingsVal( + $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev, + 'lastHomealoneType', '-' ) eq 'PET' + ) { return ( 'pet', 'absent' ) if (wantarray); return 'absent'; @@ -209,10 +239,18 @@ sub getAzimuth { my $azimuth; - $azimuth = ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice, 'azimuth', -1 ) - if ( $defs{ $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice }->{TYPE} eq 'Twilight' ); - $azimuth = ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice, 'SunAz', -1 ) - if ( $defs{ $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice }->{TYPE} eq 'Astro' ); + $azimuth = ReadingsVal( + $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice, + 'azimuth', -1 ) + if ( + $defs{ $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice } + ->{TYPE} eq 'Twilight' ); + $azimuth = ReadingsVal( + $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice, + 'SunAz', -1 ) + if ( + $defs{ $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice } + ->{TYPE} eq 'Astro' ); return $azimuth; } @@ -222,10 +260,18 @@ sub getElevation { my $elevation; - $elevation = ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice, 'elevation', -1 ) - if ( $defs{ $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice }->{TYPE} eq 'Twilight' ); - $elevation = ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice, 'SunAlt', -1 ) - if ( $defs{ $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice }->{TYPE} eq 'Astro' ); + $elevation = ReadingsVal( + $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice, + 'elevation', -1 ) + if ( + $defs{ $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice } + ->{TYPE} eq 'Twilight' ); + $elevation = ReadingsVal( + $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice, + 'SunAlt', -1 ) + if ( + $defs{ $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice } + ->{TYPE} eq 'Astro' ); return $elevation; } @@ -238,5 +284,4 @@ sub getASCenable { return ReadingsVal( $name, 'ascEnable', 'none' ); } - 1; diff --git a/lib/FHEM/Automation/ShuttersControl/Roommate.pm b/lib/FHEM/Automation/ShuttersControl/Roommate.pm index b01aaf0..a0da8c1 100644 --- a/lib/FHEM/Automation/ShuttersControl/Roommate.pm +++ b/lib/FHEM/Automation/ShuttersControl/Roommate.pm @@ -59,7 +59,9 @@ sub _getRoommateStatus { my $roommate = $self->{roommate}; - return ReadingsVal( $roommate, $FHEM::Automation::ShuttersControl::shutters->getRoommatesReading, 'none' ); + return ReadingsVal( $roommate, + $FHEM::Automation::ShuttersControl::shutters->getRoommatesReading, + 'none' ); } sub _getRoommateLastStatus { @@ -72,5 +74,4 @@ sub _getRoommateLastStatus { return ReadingsVal( $roommate, 'lastState', $default ); } - 1; diff --git a/lib/FHEM/Automation/ShuttersControl/Shutters.pm b/lib/FHEM/Automation/ShuttersControl/Shutters.pm index caa9c65..8a82c9f 100644 --- a/lib/FHEM/Automation/ShuttersControl/Shutters.pm +++ b/lib/FHEM/Automation/ShuttersControl/Shutters.pm @@ -111,18 +111,22 @@ sub setHardLockOut { my $cmd = shift; if ( $FHEM::Automation::ShuttersControl::shutters->getLockOut eq 'hard' - && $FHEM::Automation::ShuttersControl::shutters->getLockOutCmd ne 'none' ) + && $FHEM::Automation::ShuttersControl::shutters->getLockOutCmd ne + 'none' ) { CommandSet( undef, $self->{shuttersDev} . ' inhibit ' . $cmd ) - if ( $FHEM::Automation::ShuttersControl::shutters->getLockOutCmd eq 'inhibit' ); + if ( $FHEM::Automation::ShuttersControl::shutters->getLockOutCmd eq + 'inhibit' ); CommandSet( undef, $self->{shuttersDev} . ' ' . ( $cmd eq 'on' ? 'blocked' : 'unblocked' ) ) - if ( $FHEM::Automation::ShuttersControl::shutters->getLockOutCmd eq 'blocked' ); + if ( $FHEM::Automation::ShuttersControl::shutters->getLockOutCmd eq + 'blocked' ); CommandSet( undef, $self->{shuttersDev} . ' ' . ( $cmd eq 'on' ? 'protectionOn' : 'protectionOff' ) ) - if ( $FHEM::Automation::ShuttersControl::shutters->getLockOutCmd eq 'protected' ); + if ( $FHEM::Automation::ShuttersControl::shutters->getLockOutCmd eq + 'protected' ); } return; } @@ -153,19 +157,29 @@ sub setDriveCmd { my $offSetStart; if ( - ( $FHEM::Automation::ShuttersControl::shutters->getPartyMode eq 'on' && $FHEM::Automation::ShuttersControl::ascDev->getPartyMode eq 'on' ) - || ( $FHEM::Automation::ShuttersControl::shutters->getAdv - && !$FHEM::Automation::ShuttersControl::shutters->getQueryShuttersPos($posValue) + ( + $FHEM::Automation::ShuttersControl::shutters->getPartyMode eq 'on' + && $FHEM::Automation::ShuttersControl::ascDev->getPartyMode eq 'on' + ) + || ( + $FHEM::Automation::ShuttersControl::shutters->getAdv + && !$FHEM::Automation::ShuttersControl::shutters + ->getQueryShuttersPos( + $posValue) && !$FHEM::Automation::ShuttersControl::shutters->getAdvDelay - && !$FHEM::Automation::ShuttersControl::shutters->getExternalTriggerState - && !$FHEM::Automation::ShuttersControl::shutters->getSelfDefenseState ) + && !$FHEM::Automation::ShuttersControl::shutters + ->getExternalTriggerState + && !$FHEM::Automation::ShuttersControl::shutters + ->getSelfDefenseState + ) ) { $FHEM::Automation::ShuttersControl::shutters->setDelayCmd($posValue); $FHEM::Automation::ShuttersControl::ascDev->setDelayCmdReading; $FHEM::Automation::ShuttersControl::shutters->setNoDelay(0); $FHEM::Automation::ShuttersControl::shutters->setExternalTriggerState(0) - if ( $FHEM::Automation::ShuttersControl::shutters->getExternalTriggerState ); + if ( $FHEM::Automation::ShuttersControl::shutters + ->getExternalTriggerState ); FHEM::Automation::ShuttersControl::ASC_Debug( 'setDriveCmd: ' . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev @@ -176,24 +190,37 @@ sub setDriveCmd { $FHEM::Automation::ShuttersControl::shutters->setAdvDelay(0) if ( $FHEM::Automation::ShuttersControl::shutters->getAdvDelay ); $FHEM::Automation::ShuttersControl::shutters->setDelayCmd('none') - if ( $FHEM::Automation::ShuttersControl::shutters->getDelayCmd ne 'none' ) + if ( $FHEM::Automation::ShuttersControl::shutters->getDelayCmd ne + 'none' ) ; # setzt den Wert auf none da der Rolladen nun gesteuert werden kann. $FHEM::Automation::ShuttersControl::shutters->setExternalTriggerState(0) - if ( $FHEM::Automation::ShuttersControl::shutters->getExternalTriggerState ); + if ( $FHEM::Automation::ShuttersControl::shutters + ->getExternalTriggerState ); ### antifreeze Routine - if ( $FHEM::Automation::ShuttersControl::shutters->getAntiFreezeStatus > 0 ) { - if ( $FHEM::Automation::ShuttersControl::shutters->getAntiFreezeStatus != 1 ) { + if ( $FHEM::Automation::ShuttersControl::shutters->getAntiFreezeStatus > + 0 ) + { + if ( $FHEM::Automation::ShuttersControl::shutters + ->getAntiFreezeStatus != 1 ) + { - $posValue = $FHEM::Automation::ShuttersControl::shutters->getStatus; - $FHEM::Automation::ShuttersControl::shutters->setLastDrive('no drive - antifreeze defense'); - $FHEM::Automation::ShuttersControl::shutters->setLastDriveReading; + $posValue = + $FHEM::Automation::ShuttersControl::shutters->getStatus; + $FHEM::Automation::ShuttersControl::shutters->setLastDrive( + 'no drive - antifreeze defense'); + $FHEM::Automation::ShuttersControl::shutters + ->setLastDriveReading; $FHEM::Automation::ShuttersControl::ascDev->setStateReading; } - elsif ( $posValue == $FHEM::Automation::ShuttersControl::shutters->getClosedPos ) { - $posValue = $FHEM::Automation::ShuttersControl::shutters->getAntiFreezePos; + elsif ( $posValue == + $FHEM::Automation::ShuttersControl::shutters->getClosedPos ) + { + $posValue = $FHEM::Automation::ShuttersControl::shutters + ->getAntiFreezePos; $FHEM::Automation::ShuttersControl::shutters->setLastDrive( - $FHEM::Automation::ShuttersControl::shutters->getLastDrive . ' - antifreeze mode' ); + $FHEM::Automation::ShuttersControl::shutters->getLastDrive + . ' - antifreeze mode' ); } } @@ -202,43 +229,67 @@ sub setDriveCmd { posValue => $posValue, ); - $offSet = $FHEM::Automation::ShuttersControl::shutters->getDelay if ( $FHEM::Automation::ShuttersControl::shutters->getDelay > -1 ); - $offSet = $FHEM::Automation::ShuttersControl::ascDev->getShuttersOffset if ( $FHEM::Automation::ShuttersControl::shutters->getDelay < 0 ); - $offSetStart = $FHEM::Automation::ShuttersControl::shutters->getDelayStart; + $offSet = $FHEM::Automation::ShuttersControl::shutters->getDelay + if ( $FHEM::Automation::ShuttersControl::shutters->getDelay > -1 ); + $offSet = $FHEM::Automation::ShuttersControl::ascDev->getShuttersOffset + if ( $FHEM::Automation::ShuttersControl::shutters->getDelay < 0 ); + $offSetStart = + $FHEM::Automation::ShuttersControl::shutters->getDelayStart; - if ( $FHEM::Automation::ShuttersControl::shutters->getSelfDefenseAbsent - && !$FHEM::Automation::ShuttersControl::shutters->getSelfDefenseAbsentTimerrun - && $FHEM::Automation::ShuttersControl::shutters->getSelfDefenseMode ne 'off' + if ( $FHEM::Automation::ShuttersControl::shutters->getSelfDefenseAbsent + && !$FHEM::Automation::ShuttersControl::shutters + ->getSelfDefenseAbsentTimerrun + && $FHEM::Automation::ShuttersControl::shutters->getSelfDefenseMode + ne 'off' && $FHEM::Automation::ShuttersControl::shutters->getSelfDefenseState - && $FHEM::Automation::ShuttersControl::ascDev->getSelfDefense eq 'on' ) + && $FHEM::Automation::ShuttersControl::ascDev->getSelfDefense eq + 'on' ) { - InternalTimer( - gettimeofday() + $FHEM::Automation::ShuttersControl::shutters->getSelfDefenseAbsentDelay, - \&FHEM::Automation::ShuttersControl::_SetCmdFn, \%h ); - $FHEM::Automation::ShuttersControl::shutters->setSelfDefenseAbsent( 1, 0, \%h ); - } - elsif ( $offSetStart > 0 && !$FHEM::Automation::ShuttersControl::shutters->getNoDelay ) { InternalTimer( gettimeofday() + - int( rand($offSet) + $FHEM::Automation::ShuttersControl::shutters->getDelayStart ), + $FHEM::Automation::ShuttersControl::shutters + ->getSelfDefenseAbsentDelay, \&FHEM::Automation::ShuttersControl::_SetCmdFn, \%h ); + $FHEM::Automation::ShuttersControl::shutters->setSelfDefenseAbsent( + 1, 0, \%h ); + } + elsif ( $offSetStart > 0 + && !$FHEM::Automation::ShuttersControl::shutters->getNoDelay ) + { + InternalTimer( + gettimeofday() + int( + rand($offSet) + + $FHEM::Automation::ShuttersControl::shutters + ->getDelayStart + ), + \&FHEM::Automation::ShuttersControl::_SetCmdFn, + \%h + ); FHEM::Automation::ShuttersControl::ASC_Debug( 'FnSetDriveCmd: ' . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev . ' - versetztes fahren' ); } - elsif ( $offSetStart < 1 || $FHEM::Automation::ShuttersControl::shutters->getNoDelay ) { + elsif ($offSetStart < 1 + || $FHEM::Automation::ShuttersControl::shutters->getNoDelay ) + { FHEM::Automation::ShuttersControl::_SetCmdFn( \%h ); FHEM::Automation::ShuttersControl::ASC_Debug( 'FnSetDriveCmd: ' . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev . ' - NICHT versetztes fahren' ); } - FHEM::Automation::ShuttersControl::ASC_Debug( 'FnSetDriveCmd: ' + FHEM::Automation::ShuttersControl::ASC_Debug( + 'FnSetDriveCmd: ' . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev . ' - NoDelay: ' - . ( $FHEM::Automation::ShuttersControl::shutters->getNoDelay ? 'JA' : 'NEIN' ) ); + . ( + $FHEM::Automation::ShuttersControl::shutters->getNoDelay + ? 'JA' + : 'NEIN' + ) + ); $FHEM::Automation::ShuttersControl::shutters->setNoDelay(0); } @@ -311,7 +362,8 @@ sub setLastDriveReading { ); InternalTimer( gettimeofday() + 0.1, - \&FHEM::Automation::ShuttersControl::_setShuttersLastDriveDelayed, \%h ); + \&FHEM::Automation::ShuttersControl::_setShuttersLastDriveDelayed, + \%h ); return; } @@ -404,7 +456,8 @@ sub setAdvDelay { sub getHomemode { my $self = shift; - my $homemode = $FHEM::Automation::ShuttersControl::shutters->getRoommatesStatus; + my $homemode = + $FHEM::Automation::ShuttersControl::shutters->getRoommatesStatus; $homemode = $FHEM::Automation::ShuttersControl::ascDev->getResidentsStatus if ( $homemode eq 'none' ); return $homemode; @@ -473,16 +526,23 @@ sub getAntiFreezeStatus { # $outTemp = $FHEM::Automation::ShuttersControl::shutters->getOutTemp if ( $FHEM::Automation::ShuttersControl::shutters->getOutTemp != -100 ); sollte raus das der Sensor im Rollo auch ein Innentemperatursensor sein kann. if ( $FHEM::Automation::ShuttersControl::shutters->getAntiFreeze ne 'off' - && $outTemp <= $FHEM::Automation::ShuttersControl::ascDev->getFreezeTemp ) + && $outTemp <= + $FHEM::Automation::ShuttersControl::ascDev->getFreezeTemp ) { - if ( $FHEM::Automation::ShuttersControl::shutters->getAntiFreeze eq 'soft' ) { + if ( $FHEM::Automation::ShuttersControl::shutters->getAntiFreeze eq + 'soft' ) + { return 1; } - elsif ( $FHEM::Automation::ShuttersControl::shutters->getAntiFreeze eq $daytime ) { + elsif ( $FHEM::Automation::ShuttersControl::shutters->getAntiFreeze eq + $daytime ) + { return 2; } - elsif ( $FHEM::Automation::ShuttersControl::shutters->getAntiFreeze eq 'hard' ) { + elsif ( $FHEM::Automation::ShuttersControl::shutters->getAntiFreeze eq + 'hard' ) + { return 3; } } @@ -492,7 +552,8 @@ sub getAntiFreezeStatus { sub getShuttersPosCmdValueNegate { my $self = shift; - return ( $FHEM::Automation::ShuttersControl::shutters->getOpenPos < $FHEM::Automation::ShuttersControl::shutters->getClosedPos ? 1 : 0 ); + return ( $FHEM::Automation::ShuttersControl::shutters->getOpenPos < + $FHEM::Automation::ShuttersControl::shutters->getClosedPos ? 1 : 0 ); } sub getQueryShuttersPos @@ -501,7 +562,8 @@ sub getQueryShuttersPos my $posValue = shift; # wenn dem so ist wird 1 zurück gegeben ansonsten 0 return ( - $FHEM::Automation::ShuttersControl::shutters->getShuttersPosCmdValueNegate + $FHEM::Automation::ShuttersControl::shutters + ->getShuttersPosCmdValueNegate ? $FHEM::Automation::ShuttersControl::shutters->getStatus > $posValue : $FHEM::Automation::ShuttersControl::shutters->getStatus < $posValue ); @@ -669,9 +731,16 @@ sub getRoommatesStatus { ); my $minPrio = 10; - for my $ro ( split( ",", $FHEM::Automation::ShuttersControl::shutters->getRoommates ) ) { + for my $ro ( + split( + ",", $FHEM::Automation::ShuttersControl::shutters->getRoommates + ) + ) + { $FHEM::Automation::ShuttersControl::shutters->setRoommate($ro); - my $currentPrio = $statePrio{ $FHEM::Automation::ShuttersControl::shutters->_getRoommateStatus }; + my $currentPrio = + $statePrio{ $FHEM::Automation::ShuttersControl::shutters + ->_getRoommateStatus }; $minPrio = $currentPrio if ( $minPrio > $currentPrio ); } @@ -695,9 +764,16 @@ sub getRoommatesLastStatus { ); my $minPrio = 10; - for my $ro ( split( ",", $FHEM::Automation::ShuttersControl::shutters->getRoommates ) ) { + for my $ro ( + split( + ",", $FHEM::Automation::ShuttersControl::shutters->getRoommates + ) + ) + { $FHEM::Automation::ShuttersControl::shutters->setRoommate($ro); - my $currentPrio = $statePrio{ $FHEM::Automation::ShuttersControl::shutters->_getRoommateLastStatus }; + my $currentPrio = + $statePrio{ $FHEM::Automation::ShuttersControl::shutters + ->_getRoommateLastStatus }; $minPrio = $currentPrio if ( $minPrio > $currentPrio ); } @@ -708,15 +784,20 @@ sub getRoommatesLastStatus { sub getOutTemp { my $self = shift; - return ReadingsVal( $FHEM::Automation::ShuttersControl::shutters->_getTempSensor, - $FHEM::Automation::ShuttersControl::shutters->getTempSensorReading, -100 ); + return ReadingsVal( + $FHEM::Automation::ShuttersControl::shutters->_getTempSensor, + $FHEM::Automation::ShuttersControl::shutters->getTempSensorReading, + -100 ); } sub getIdleDetection { my $self = shift; - return ReadingsVal( $self->{shuttersDev}, - $FHEM::Automation::ShuttersControl::shutters->_getIdleDetectionReading, 'none' ); + return ReadingsVal( + $self->{shuttersDev}, + $FHEM::Automation::ShuttersControl::shutters->_getIdleDetectionReading, + 'none' + ); } ### Begin Beschattung Objekt mit Daten befüllen @@ -729,7 +810,8 @@ sub setShadingStatus { && exists( $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} ) && $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} eq $value ); - $FHEM::Automation::ShuttersControl::shutters->setShadingLastStatus( ( $value eq 'in' ? 'out' : 'in' ) ) + $FHEM::Automation::ShuttersControl::shutters->setShadingLastStatus( + ( $value eq 'in' ? 'out' : 'in' ) ) if ( $value eq 'in' || $value eq 'out' ); @@ -814,7 +896,8 @@ sub setPushBrightnessInArray { @{ $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL} } - ) > $FHEM::Automation::ShuttersControl::shutters->getMaxBrightnessAverageArrayObjects + ) > $FHEM::Automation::ShuttersControl::shutters + ->getMaxBrightnessAverageArrayObjects ); return; @@ -878,8 +961,10 @@ sub getIfInShading { return ( ( - $FHEM::Automation::ShuttersControl::shutters->getShadingMode ne 'off' - && $FHEM::Automation::ShuttersControl::shutters->getShadingLastStatus eq 'out' + $FHEM::Automation::ShuttersControl::shutters->getShadingMode ne + 'off' + && $FHEM::Automation::ShuttersControl::shutters + ->getShadingLastStatus eq 'out' ) ? 1 : 0 ); } @@ -939,5 +1024,4 @@ sub getShadingLastStatusTimestamp { } ### Ende Beschattung - 1; diff --git a/lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm b/lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm index a92c45f..6126ab8 100644 --- a/lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm +++ b/lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm @@ -67,10 +67,10 @@ sub _setAttributs { } sub _getPosition { - my $self = shift; + my $self = shift; - my $attr = shift; - my $userAttrList = shift; + my $attr = shift; + my $userAttrList = shift; return $self->{ $self->{shuttersDev} }->{$attr}->{position} if ( @@ -184,7 +184,8 @@ sub setAntiFreezePos { sub getAntiFreezePos { my $self = shift; - return $FHEM::Automation::ShuttersControl::shutters->_getPosition( 'ASC_Antifreeze_Pos', + return $FHEM::Automation::ShuttersControl::shutters->_getPosition( + 'ASC_Antifreeze_Pos', 'ASC_Antifreeze_Pos:5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100' ); } @@ -192,8 +193,9 @@ sub getAntiFreezePos { sub getAntiFreezePosAssignment { my $self = shift; - return $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( 'ASC_Antifreeze_Pos', - 'getAntiFreezePos' ); + return + $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( + 'ASC_Antifreeze_Pos', 'getAntiFreezePos' ); } sub setShuttersPlace { @@ -314,9 +316,13 @@ sub getPrivacyUpTime { ( $upBrightnessVal ne 'none' ? $upBrightnessVal : -1 ); $FHEM::Automation::ShuttersControl::shutters->setPrivacyUpStatus(0) - if ( defined( $FHEM::Automation::ShuttersControl::shutters->getPrivacyUpStatus ) + if ( + defined( + $FHEM::Automation::ShuttersControl::shutters->getPrivacyUpStatus + ) && $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} - ->{uptime} == -1 ); + ->{uptime} == -1 + ); return $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} ->{uptime}; @@ -389,9 +395,13 @@ sub getPrivacyDownTime { ( $downBrightnessVal ne 'none' ? $downBrightnessVal : -1 ); $FHEM::Automation::ShuttersControl::shutters->setPrivacyDownStatus(0) - if ( defined( $FHEM::Automation::ShuttersControl::shutters->getPrivacyDownStatus ) + if ( + defined( + $FHEM::Automation::ShuttersControl::shutters->getPrivacyDownStatus + ) && $self->{ $self->{shuttersDev} } - ->{ASC_PrivacyDownValue_beforeNightClose}->{downtime} == -1 ); + ->{ASC_PrivacyDownValue_beforeNightClose}->{downtime} == -1 + ); return $self->{ $self->{shuttersDev} } ->{ASC_PrivacyDownValue_beforeNightClose}->{downtime}; @@ -436,14 +446,16 @@ sub setPrivacyUpPos { sub getPrivacyUpPos { my $self = shift; - return $FHEM::Automation::ShuttersControl::shutters->_getPosition( 'ASC_PrivacyUp_Pos', 'ASC_PrivacyUp_Pos' ); + return $FHEM::Automation::ShuttersControl::shutters->_getPosition( + 'ASC_PrivacyUp_Pos', 'ASC_PrivacyUp_Pos' ); } sub getPrivacyUpPositionAssignment { my $self = shift; - return $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( 'ASC_PrivacyUp_Pos', - 'getPrivacyUpPos' ); + return + $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( + 'ASC_PrivacyUp_Pos', 'getPrivacyUpPos' ); } sub setPrivacyDownPos { @@ -458,15 +470,16 @@ sub setPrivacyDownPos { sub getPrivacyDownPos { my $self = shift; - return $FHEM::Automation::ShuttersControl::shutters->_getPosition( 'ASC_PrivacyDown_Pos', - 'ASC_PrivacyDown_Pos' ); + return $FHEM::Automation::ShuttersControl::shutters->_getPosition( + 'ASC_PrivacyDown_Pos', 'ASC_PrivacyDown_Pos' ); } sub getPrivacyDownPositionAssignment { my $self = shift; - return $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( 'ASC_PrivacyDown_Pos', - 'getPrivacyDownPos' ); + return + $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( + 'ASC_PrivacyDown_Pos', 'getPrivacyDownPos' ); } sub setSelfDefenseMode { @@ -547,15 +560,16 @@ sub setShadingPos { sub getShadingPos { my $self = shift; - return $FHEM::Automation::ShuttersControl::shutters->_getPosition( 'ASC_Shading_Pos', - 'ASC_Shading_Pos:10,20,30,40,50,60,70,80,90,100' ); + return $FHEM::Automation::ShuttersControl::shutters->_getPosition( + 'ASC_Shading_Pos', 'ASC_Shading_Pos:10,20,30,40,50,60,70,80,90,100' ); } sub getShadingPositionAssignment { my $self = shift; - return $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( 'ASC_Shading_Pos', - 'getShadingPos' ); + return + $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( + 'ASC_Shading_Pos', 'getShadingPos' ); } sub setShadingMode { @@ -1040,7 +1054,9 @@ sub getExternalTriggerDevice { $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive} = $posActive; $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posinactive} = - ( $posInactive ne 'none' ? $posInactive : $FHEM::Automation::ShuttersControl::shutters->getLastPos ); + ( $posInactive ne 'none' + ? $posInactive + : $FHEM::Automation::ShuttersControl::shutters->getLastPos ); $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{valueactive2} = $valueActive2; $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive2} = @@ -1308,14 +1324,16 @@ sub setOpenPos { sub getOpenPos { my $self = shift; - return $FHEM::Automation::ShuttersControl::shutters->_getPosition( 'ASC_Open_Pos', - 'ASC_Open_Pos:0,10,20,30,40,50,60,70,80,90,100' ); + return $FHEM::Automation::ShuttersControl::shutters->_getPosition( + 'ASC_Open_Pos', 'ASC_Open_Pos:0,10,20,30,40,50,60,70,80,90,100' ); } sub getOpenPositionAssignment { my $self = shift; - return $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( 'ASC_Open_Pos', 'getOpenPos' ); + return + $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( + 'ASC_Open_Pos', 'getOpenPos' ); } sub setVentilatePos { @@ -1330,15 +1348,17 @@ sub setVentilatePos { sub getVentilatePos { my $self = shift; - return $FHEM::Automation::ShuttersControl::shutters->_getPosition( 'ASC_Ventilate_Pos', + return $FHEM::Automation::ShuttersControl::shutters->_getPosition( + 'ASC_Ventilate_Pos', 'ASC_Ventilate_Pos:10,20,30,40,50,60,70,80,90,100' ); } sub getVentilatePositionAssignment { my $self = shift; - return $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( 'ASC_Ventilate_Pos', - 'getVentilatePos' ); + return + $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( + 'ASC_Ventilate_Pos', 'getVentilatePos' ); } sub setVentilatePosAfterDayClosed { @@ -1370,15 +1390,16 @@ sub setClosedPos { sub getClosedPos { my $self = shift; - return $FHEM::Automation::ShuttersControl::shutters->_getPosition( 'ASC_Closed_Pos', - 'ASC_Closed_Pos:0,10,20,30,40,50,60,70,80,90,100' ); + return $FHEM::Automation::ShuttersControl::shutters->_getPosition( + 'ASC_Closed_Pos', 'ASC_Closed_Pos:0,10,20,30,40,50,60,70,80,90,100' ); } sub getClosedPositionAssignment { my $self = shift; - return $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( 'ASC_Closed_Pos', - 'getClosedPos' ); + return + $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( + 'ASC_Closed_Pos', 'getClosedPos' ); } sub setSleepPos { @@ -1393,14 +1414,16 @@ sub setSleepPos { sub getSleepPos { my $self = shift; - return $FHEM::Automation::ShuttersControl::shutters->_getPosition( 'ASC_Sleep_Pos', - 'ASC_Sleep_Pos:0,10,20,30,40,50,60,70,80,90,100' ); + return $FHEM::Automation::ShuttersControl::shutters->_getPosition( + 'ASC_Sleep_Pos', 'ASC_Sleep_Pos:0,10,20,30,40,50,60,70,80,90,100' ); } sub getSleepPositionAssignment { my $self = shift; - return $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( 'ASC_Sleep_Pos', 'getSleepPos' ); + return + $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( + 'ASC_Sleep_Pos', 'getSleepPos' ); } sub setVentilateOpen { @@ -1431,15 +1454,17 @@ sub setComfortOpenPos { sub getComfortOpenPos { my $self = shift; - return $FHEM::Automation::ShuttersControl::shutters->_getPosition( 'ASC_ComfortOpen_Pos', + return $FHEM::Automation::ShuttersControl::shutters->_getPosition( + 'ASC_ComfortOpen_Pos', 'ASC_ComfortOpen_Pos:0,10,20,30,40,50,60,70,80,90,100' ); } sub getComfortOpenPositionAssignment { my $self = shift; - return $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( 'ASC_ComfortOpen_Pos', - 'getComfortOpenPos' ); + return + $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( + 'ASC_ComfortOpen_Pos', 'getComfortOpenPos' ); } sub setPartyMode { @@ -1533,7 +1558,9 @@ sub getWindMax { $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggerhyst} = ( $hyst ne 'none' ? $max - $hyst : $max - 20 ); $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{closedPos} = - ( $pos ne 'none' ? $pos : $FHEM::Automation::ShuttersControl::shutters->getOpenPos ); + ( $pos ne 'none' + ? $pos + : $FHEM::Automation::ShuttersControl::shutters->getOpenPos ); return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggermax}; } @@ -1944,5 +1971,4 @@ sub getDriveUpMaxDuration { return AttrVal( $self->{shuttersDev}, 'ASC_DriveUpMaxDuration', 60 ); } - 1; diff --git a/lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm b/lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm index 96b0390..03ca247 100644 --- a/lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm +++ b/lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm @@ -37,7 +37,6 @@ # ############################################################################### - ## Subklasse Readings von ASC_Shutters ## package FHEM::Automation::ShuttersControl::Shutters::Readings; @@ -59,21 +58,25 @@ BEGIN { sub getBrightness { my $self = shift; - return ReadingsNum( $FHEM::Automation::ShuttersControl::shutters->_getBrightnessSensor, - $FHEM::Automation::ShuttersControl::shutters->getBrightnessReading, -1 ); + return ReadingsNum( + $FHEM::Automation::ShuttersControl::shutters->_getBrightnessSensor, + $FHEM::Automation::ShuttersControl::shutters->getBrightnessReading, + -1 ); } sub getWindStatus { my $self = shift; - return ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getWindSensor, + return ReadingsVal( + $FHEM::Automation::ShuttersControl::ascDev->_getWindSensor, $FHEM::Automation::ShuttersControl::ascDev->getWindSensorReading, -1 ); } sub getStatus { my $self = shift; - return ReadingsNum( $self->{shuttersDev}, $FHEM::Automation::ShuttersControl::shutters->getPosCmd, 0 ); + return ReadingsNum( $self->{shuttersDev}, + $FHEM::Automation::ShuttersControl::shutters->getPosCmd, 0 ); } sub getDelayCmd { @@ -88,5 +91,4 @@ sub getASCenable { return ReadingsVal( $self->{shuttersDev}, 'ASC_Enable', 'on' ); } - 1; diff --git a/lib/FHEM/Automation/ShuttersControl/Window.pm b/lib/FHEM/Automation/ShuttersControl/Window.pm index a927849..de9d350 100644 --- a/lib/FHEM/Automation/ShuttersControl/Window.pm +++ b/lib/FHEM/Automation/ShuttersControl/Window.pm @@ -47,7 +47,7 @@ use utf8; use FHEM::Automation::ShuttersControl::Window::Attr; use FHEM::Automation::ShuttersControl::Window::Readings; -our @ISA = qw(FHEM::Automation::ShuttersControl::Window::Attr FHEM::Automation::ShuttersControl::Window::Readings); - +our @ISA = + qw(FHEM::Automation::ShuttersControl::Window::Attr FHEM::Automation::ShuttersControl::Window::Readings); 1; diff --git a/lib/FHEM/Automation/ShuttersControl/Window/Attr.pm b/lib/FHEM/Automation/ShuttersControl/Window/Attr.pm index dd8fbff..739a3c0 100644 --- a/lib/FHEM/Automation/ShuttersControl/Window/Attr.pm +++ b/lib/FHEM/Automation/ShuttersControl/Window/Attr.pm @@ -125,5 +125,4 @@ sub getWinDevReading { return $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{reading}; } - 1; diff --git a/lib/FHEM/Automation/ShuttersControl/Window/Readings.pm b/lib/FHEM/Automation/ShuttersControl/Window/Readings.pm index 8a9c1ff..e8a9025 100644 --- a/lib/FHEM/Automation/ShuttersControl/Window/Readings.pm +++ b/lib/FHEM/Automation/ShuttersControl/Window/Readings.pm @@ -57,9 +57,10 @@ BEGIN { sub getWinStatus { my $self = shift; - return ReadingsVal( $FHEM::Automation::ShuttersControl::shutters->_getWinDev, $FHEM::Automation::ShuttersControl::shutters->getWinDevReading, + return ReadingsVal( + $FHEM::Automation::ShuttersControl::shutters->_getWinDev, + $FHEM::Automation::ShuttersControl::shutters->getWinDevReading, 'closed' ); } - 1; From 245a9b7357232a13c4c2c2b1f36a8d525a4c8161 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Tue, 9 Jun 2020 13:22:17 +0200 Subject: [PATCH 53/60] create controls --- controls_AutoShuttersControl.txt | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/controls_AutoShuttersControl.txt b/controls_AutoShuttersControl.txt index 73be85d..686152c 100644 --- a/controls_AutoShuttersControl.txt +++ b/controls_AutoShuttersControl.txt @@ -1,12 +1,12 @@ -UPD 2020-06-05_22:25:26 96920 FHEM/73_AutoShuttersControl.pm -UPD 2020-06-05_22:25:24 186156 lib/FHEM/Automation/ShuttersControl.pm -UPD 2020-06-04_15:50:33 2656 lib/FHEM/Automation/ShuttersControl/Dev.pm -UPD 2020-06-04_15:50:33 2478 lib/FHEM/Automation/ShuttersControl/Roommate.pm -UPD 2020-06-04_15:50:33 28839 lib/FHEM/Automation/ShuttersControl/Shutters.pm -UPD 2020-06-04_15:50:33 2174 lib/FHEM/Automation/ShuttersControl/Window.pm -UPD 2020-06-04_15:50:33 11437 lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm -UPD 2020-06-04_15:50:33 6868 lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm -UPD 2020-06-04_15:50:33 52473 lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm -UPD 2020-06-04_15:50:33 2873 lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm -UPD 2020-06-04_15:50:33 3973 lib/FHEM/Automation/ShuttersControl/Window/Attr.pm -UPD 2020-06-04_15:50:33 2273 lib/FHEM/Automation/ShuttersControl/Window/Readings.pm +UPD 2020-06-09_13:14:08 97128 FHEM/73_AutoShuttersControl.pm +UPD 2020-06-09_13:15:51 186818 lib/FHEM/Automation/ShuttersControl.pm +UPD 2020-06-09_13:16:14 2657 lib/FHEM/Automation/ShuttersControl/Dev.pm +UPD 2020-06-09_13:16:35 2493 lib/FHEM/Automation/ShuttersControl/Roommate.pm +UPD 2020-06-09_13:17:00 29833 lib/FHEM/Automation/ShuttersControl/Shutters.pm +UPD 2020-06-09_13:17:30 2175 lib/FHEM/Automation/ShuttersControl/Window.pm +UPD 2020-06-09_13:17:58 11454 lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm +UPD 2020-06-09_13:18:16 7251 lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm +UPD 2020-06-09_13:18:35 52661 lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm +UPD 2020-06-09_13:18:46 2903 lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm +UPD 2020-06-09_13:19:01 3972 lib/FHEM/Automation/ShuttersControl/Window/Attr.pm +UPD 2020-06-09_13:19:09 2288 lib/FHEM/Automation/ShuttersControl/Window/Readings.pm From 20584f62940dff77e4e921ce06205fed72064c5e Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Tue, 9 Jun 2020 13:22:54 +0200 Subject: [PATCH 54/60] create controls --- controls_AutoShuttersControl.txt | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/controls_AutoShuttersControl.txt b/controls_AutoShuttersControl.txt index 686152c..f7dd8c6 100644 --- a/controls_AutoShuttersControl.txt +++ b/controls_AutoShuttersControl.txt @@ -1,12 +1,12 @@ -UPD 2020-06-09_13:14:08 97128 FHEM/73_AutoShuttersControl.pm -UPD 2020-06-09_13:15:51 186818 lib/FHEM/Automation/ShuttersControl.pm -UPD 2020-06-09_13:16:14 2657 lib/FHEM/Automation/ShuttersControl/Dev.pm -UPD 2020-06-09_13:16:35 2493 lib/FHEM/Automation/ShuttersControl/Roommate.pm -UPD 2020-06-09_13:17:00 29833 lib/FHEM/Automation/ShuttersControl/Shutters.pm -UPD 2020-06-09_13:17:30 2175 lib/FHEM/Automation/ShuttersControl/Window.pm -UPD 2020-06-09_13:17:58 11454 lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm -UPD 2020-06-09_13:18:16 7251 lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm -UPD 2020-06-09_13:18:35 52661 lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm -UPD 2020-06-09_13:18:46 2903 lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm -UPD 2020-06-09_13:19:01 3972 lib/FHEM/Automation/ShuttersControl/Window/Attr.pm -UPD 2020-06-09_13:19:09 2288 lib/FHEM/Automation/ShuttersControl/Window/Readings.pm +UPD 2020-06-09_13:21:45 97128 FHEM/73_AutoShuttersControl.pm +UPD 2020-06-09_13:21:45 186818 lib/FHEM/Automation/ShuttersControl.pm +UPD 2020-06-09_13:21:45 2657 lib/FHEM/Automation/ShuttersControl/Dev.pm +UPD 2020-06-09_13:21:45 2493 lib/FHEM/Automation/ShuttersControl/Roommate.pm +UPD 2020-06-09_13:21:45 29833 lib/FHEM/Automation/ShuttersControl/Shutters.pm +UPD 2020-06-09_13:21:45 2175 lib/FHEM/Automation/ShuttersControl/Window.pm +UPD 2020-06-09_13:21:45 11454 lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm +UPD 2020-06-09_13:21:45 7251 lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm +UPD 2020-06-09_13:21:45 52661 lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm +UPD 2020-06-09_13:21:45 2903 lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm +UPD 2020-06-09_13:21:45 3972 lib/FHEM/Automation/ShuttersControl/Window/Attr.pm +UPD 2020-06-09_13:21:45 2288 lib/FHEM/Automation/ShuttersControl/Window/Readings.pm From c607e9b81a5a49a1278c9303242b0992b71d1f2d Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Tue, 9 Jun 2020 13:57:17 +0200 Subject: [PATCH 55/60] my --- lib/FHEM/Automation/ShuttersControl.pm | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/FHEM/Automation/ShuttersControl.pm b/lib/FHEM/Automation/ShuttersControl.pm index 3d65056..6b3a031 100644 --- a/lib/FHEM/Automation/ShuttersControl.pm +++ b/lib/FHEM/Automation/ShuttersControl.pm @@ -1229,7 +1229,7 @@ sub EventProcessingWindowRec { elsif ($match =~ m{[Oo]pen|false}xms && $shutters->getSubTyp eq 'threestate' ) { - my $posValue; + my $posValue = $shutters->getStatus; my $setLastDrive; if ( $ascDev->getAutoShuttersControlComfort eq 'on' and @@ -1273,12 +1273,12 @@ sub EventProcessingRoommate { "AutoShuttersControl ($name) - EventProcessingRoommate: $shuttersDev und Events $events" ); - my $getModeUp = $shutters->getModeUp; - my $getModeDown = $shutters->getModeDown; - my $getRoommatesStatus = $shutters->getRoommatesStatus; - my $getRoommatesLastStatus = $shutters->getRoommatesLastStatus; - my $event = $1; - my $posValue; + my $getModeUp = $shutters->getModeUp; + my $getModeDown = $shutters->getModeDown; + my $getRoommatesStatus = $shutters->getRoommatesStatus; + my $getRoommatesLastStatus = $shutters->getRoommatesLastStatus; + my $event = $1; + my $posValue = $shutters->getStatus; if ( ( $event eq 'home' || $event eq 'awoken' ) @@ -2166,7 +2166,7 @@ sub EventProcessingBrightness { || $shutters->getModeDown eq 'always' ) { - my $posValue; + my $posValue = $shutters->getStatus; my $lastDrive; ## Setzt den PrivacyDown Modus für die Sichtschutzfahrt auf den Status 0 From 92a9175fe370b3f5287602f346059d4958c4538d Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Tue, 9 Jun 2020 14:02:30 +0200 Subject: [PATCH 56/60] change constrols --- controls_AutoShuttersControl.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/controls_AutoShuttersControl.txt b/controls_AutoShuttersControl.txt index f7dd8c6..b0478ba 100644 --- a/controls_AutoShuttersControl.txt +++ b/controls_AutoShuttersControl.txt @@ -1,5 +1,5 @@ UPD 2020-06-09_13:21:45 97128 FHEM/73_AutoShuttersControl.pm -UPD 2020-06-09_13:21:45 186818 lib/FHEM/Automation/ShuttersControl.pm +UPD 2020-06-09_13:56:24 186917 lib/FHEM/Automation/ShuttersControl.pm UPD 2020-06-09_13:21:45 2657 lib/FHEM/Automation/ShuttersControl/Dev.pm UPD 2020-06-09_13:21:45 2493 lib/FHEM/Automation/ShuttersControl/Roommate.pm UPD 2020-06-09_13:21:45 29833 lib/FHEM/Automation/ShuttersControl/Shutters.pm From d3e05719f072b0de072caaffba7ddcda1eaa34c8 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Thu, 18 Jun 2020 07:59:54 +0200 Subject: [PATCH 57/60] =?UTF-8?q?add=20new=20commandref=20=09ge=C3=A4ndert?= =?UTF-8?q?:=20=20=20=20=20=20=20FHEM/73=5FAutoShuttersControl.pm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FHEM/73_AutoShuttersControl.pm | 44 ++++++++++++++++---------------- controls_AutoShuttersControl.txt | 4 +-- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/FHEM/73_AutoShuttersControl.pm b/FHEM/73_AutoShuttersControl.pm index 08ed8fa..3faf93c 100644 --- a/FHEM/73_AutoShuttersControl.pm +++ b/FHEM/73_AutoShuttersControl.pm @@ -1171,28 +1171,28 @@ sub Initialize { VentilatePosAfterDayClosedwas soll passieren wenn am Tag das Fenster geschlossen wird - open/lastManual ClosedPossetzt den Wert für die geschlossen Position SleepPossetzt den Wert für die schlafen Position - VentilateOpen - ComfortOpenPos - PartyMode - Roommates - RoommatesReading - - - - - - - - - - - - - - - - - + VentilateOpensetzt den Wert für VentilateOpen Position + ComfortOpenPossetzt den Wert für ComfortOpen Position + PartyModeWert für den PartyMode - on/off + Roommatessetzt den Wert für Roommates als String, mehrere Roommates durch Komma getrennt + RoommatesReadingsetzt das Reading für die Roommates + WindProtectionsetzt/überschreibt die WindProtection - protected/unprotected + RainProtectionsetzt/überschreibt die RainProtection - protected/unprotected + ModeUpsetzt den Modus für die morgendliche Fahrt - absent/always/off/home + ModeDownsetzt den Modus für die abendliche Fahrt - absent/always/off/home + LockOutsetzt den zu berücksichtigen LockOut Modus - off/soft/hard + LockOutCmdsetzt das Kommando für den LockOut des Rollos + AutoAstroModeMorning + AutoAstroModeEvening + AutoAstroModeMorningHorizon + AutoAstroModeEveningHorizon + Up + Down + TimeUpEarly + TimeUpLate + TimeDownEarly + TimeDownLate + TimeUpWeHoliday diff --git a/controls_AutoShuttersControl.txt b/controls_AutoShuttersControl.txt index b0478ba..c7c2e75 100644 --- a/controls_AutoShuttersControl.txt +++ b/controls_AutoShuttersControl.txt @@ -1,5 +1,5 @@ -UPD 2020-06-09_13:21:45 97128 FHEM/73_AutoShuttersControl.pm -UPD 2020-06-09_13:56:24 186917 lib/FHEM/Automation/ShuttersControl.pm +UPD 2020-06-11_13:43:28 97934 FHEM/73_AutoShuttersControl.pm +UPD 2020-06-09_14:07:06 186917 lib/FHEM/Automation/ShuttersControl.pm UPD 2020-06-09_13:21:45 2657 lib/FHEM/Automation/ShuttersControl/Dev.pm UPD 2020-06-09_13:21:45 2493 lib/FHEM/Automation/ShuttersControl/Roommate.pm UPD 2020-06-09_13:21:45 29833 lib/FHEM/Automation/ShuttersControl/Shutters.pm From 63f86165ba7ef7deabb861c35fbd1ba78ea2f41e Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Thu, 18 Jun 2020 08:07:59 +0200 Subject: [PATCH 58/60] fix empty shuttername --- controls_AutoShuttersControl.txt | 2 +- lib/FHEM/Automation/ShuttersControl.pm | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/controls_AutoShuttersControl.txt b/controls_AutoShuttersControl.txt index c7c2e75..82c780c 100644 --- a/controls_AutoShuttersControl.txt +++ b/controls_AutoShuttersControl.txt @@ -1,5 +1,5 @@ UPD 2020-06-11_13:43:28 97934 FHEM/73_AutoShuttersControl.pm -UPD 2020-06-09_14:07:06 186917 lib/FHEM/Automation/ShuttersControl.pm +UPD 2020-06-18_08:06:28 187063 lib/FHEM/Automation/ShuttersControl.pm UPD 2020-06-09_13:21:45 2657 lib/FHEM/Automation/ShuttersControl/Dev.pm UPD 2020-06-09_13:21:45 2493 lib/FHEM/Automation/ShuttersControl/Roommate.pm UPD 2020-06-09_13:21:45 29833 lib/FHEM/Automation/ShuttersControl/Shutters.pm diff --git a/lib/FHEM/Automation/ShuttersControl.pm b/lib/FHEM/Automation/ShuttersControl.pm index 6b3a031..f3c99e3 100644 --- a/lib/FHEM/Automation/ShuttersControl.pm +++ b/lib/FHEM/Automation/ShuttersControl.pm @@ -3034,7 +3034,8 @@ sub ShuttersCommandSet { ## Sub welche die InternalTimer nach entsprechenden Sunset oder Sunrise zusammen stellt sub CreateSunRiseSetShuttersTimer { my $hash = shift; - my $shuttersDev = shift; + my $shuttersDev = shift // return Log3( $hash->{NAME}, 1, +"AutoShuttersControl ($hash->{NAME}) - Error in function CreateSunRiseSetShuttersTimer. No shuttersDev given"); my $name = $hash->{NAME}; my $shuttersDevHash = $defs{$shuttersDev}; From cb7c3f8667b7e48dfaccca28021c08fe556d79f8 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Thu, 18 Jun 2020 08:13:48 +0200 Subject: [PATCH 59/60] new mail --- controls_AutoShuttersControl.txt | 4 ++-- lib/FHEM/Automation/ShuttersControl.pm | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/controls_AutoShuttersControl.txt b/controls_AutoShuttersControl.txt index 82c780c..3a55359 100644 --- a/controls_AutoShuttersControl.txt +++ b/controls_AutoShuttersControl.txt @@ -1,5 +1,5 @@ -UPD 2020-06-11_13:43:28 97934 FHEM/73_AutoShuttersControl.pm -UPD 2020-06-18_08:06:28 187063 lib/FHEM/Automation/ShuttersControl.pm +UPD 2020-06-18_08:09:04 97934 FHEM/73_AutoShuttersControl.pm +UPD 2020-06-18_08:13:33 187057 lib/FHEM/Automation/ShuttersControl.pm UPD 2020-06-09_13:21:45 2657 lib/FHEM/Automation/ShuttersControl/Dev.pm UPD 2020-06-09_13:21:45 2493 lib/FHEM/Automation/ShuttersControl/Roommate.pm UPD 2020-06-09_13:21:45 29833 lib/FHEM/Automation/ShuttersControl/Shutters.pm diff --git a/lib/FHEM/Automation/ShuttersControl.pm b/lib/FHEM/Automation/ShuttersControl.pm index f3c99e3..87e7377 100644 --- a/lib/FHEM/Automation/ShuttersControl.pm +++ b/lib/FHEM/Automation/ShuttersControl.pm @@ -2,7 +2,7 @@ # # Developed with Kate # -# (c) 2018-2020 Copyright: Marko Oldenburg (leongaultier at gmail dot com) +# (c) 2018-2020 Copyright: Marko Oldenburg (fhemsupport@cooltux.net) # All rights reserved # # Special thanks goes to: From cd2adb49f3321dba51580f9d87f13c362745a7ee Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Fri, 19 Jun 2020 14:27:30 +0200 Subject: [PATCH 60/60] =?UTF-8?q?add=20more=20commandref=20text=20change?= =?UTF-8?q?=20version=20number,=20patch=20release=20change=20commandref=20?= =?UTF-8?q?for=20rain=20waiting=20time,=20feature=20not=20yet=20implemente?= =?UTF-8?q?d=20=09ge=C3=A4ndert:=20=20=20=20=20=20=20FHEM/73=5FAutoShutter?= =?UTF-8?q?sControl.pm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FHEM/73_AutoShuttersControl.pm | 90 +++++++++++++------------------- controls_AutoShuttersControl.txt | 4 +- 2 files changed, 39 insertions(+), 55 deletions(-) diff --git a/FHEM/73_AutoShuttersControl.pm b/FHEM/73_AutoShuttersControl.pm index 3faf93c..5b063dc 100644 --- a/FHEM/73_AutoShuttersControl.pm +++ b/FHEM/73_AutoShuttersControl.pm @@ -884,7 +884,7 @@ sub Initialize {
  • ASC_freezeTemp - Temperatur, ab welcher der Frostschutz greifen soll und der Rollladen nicht mehr fährt. Der letzte Fahrbefehl wird gespeichert.
  • -
  • ASC_rainSensor - DEVICENAME[:READINGNAME] MAXTRIGGER[:HYSTERESE] [CLOSEDPOS] - der Inhalt ist eine Kombination aus Devicename, Readingname, Wert ab dem getriggert werden soll, Hysterese Wert ab dem der Status Regenschutz aufgehoben werden soll und der "wegen Regen geschlossen Position".
  • +
  • ASC_rainSensor - DEVICENAME[:READINGNAME] MAXTRIGGER[:HYSTERESE] [CLOSEDPOS:[WAITINGTIME]] - der Inhalt ist eine Kombination aus Devicename, Readingname, Wert ab dem getriggert werden soll, Hysterese Wert ab dem der Status Regenschutz aufgehoben werden soll und der "wegen Regen geschlossen Position", sowie der Wartezeit bis dann tatsächlich die aktion ausgeführt wird.
  • ASC_residentsDev - DEVICENAME[:READINGNAME] - der Inhalt ist eine Kombination aus Devicenamen und Readingnamen des Residents-Device der obersten Ebene (z.B. rgr_Residents:state)
  • @@ -987,7 +987,7 @@ sub Initialize {

    Übersicht für das Rollladen-Device Getter
      - { ascAPIget('Getter','ROLLODEVICENAME') }
      + { ascAPIget('GETTER','ROLLODEVICENAME') }
    @@ -1131,7 +1131,7 @@ sub Initialize {

    Übersicht für das Rollladen-Device mit Parameterübergabe Getter
      - { ascAPIget('Getter','ROLLODEVICENAME',VALUE) }
      + { ascAPIget('GETTER','ROLLODEVICENAME',VALUE) }
    GetterErläuterung
    @@ -1140,7 +1140,7 @@ sub Initialize {

    Übersicht für das Rollladen-Device Setter
      - { ascAPIset('Setter','ROLLODEVICENAME') }
      + { ascAPIset('SETTER','ROLLODEVICENAME') }
    GetterErläuterung
    @@ -1182,58 +1182,25 @@ sub Initialize { - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + +
    SetterErläuterung
    ModeDownsetzt den Modus für die abendliche Fahrt - absent/always/off/home
    LockOutsetzt den zu berücksichtigen LockOut Modus - off/soft/hard
    LockOutCmdsetzt das Kommando für den LockOut des Rollos
    AutoAstroModeMorning
    AutoAstroModeEvening
    AutoAstroModeMorningHorizon
    AutoAstroModeEveningHorizon
    Up
    Down
    TimeUpEarly
    TimeUpLate
    TimeDownEarly
    TimeDownLate
    TimeUpWeHoliday
    AutoAstroModeMorning
    AutoAstroModeEvening
    AutoAstroModeMorningHorizon
    AutoAstroModeEveningHorizon
    Up
    Down
    TimeUpEarly
    TimeUpLate
    TimeDownEarly
    TimeDownLate
    TimeUpWeHoliday
    DriveUpMaxDuration
    SubTyp
    WinDev

    Übersicht für das ASC Device Getter
      - { ascAPIget('Getter') }
      + { ascAPIget('GETTER') }
    @@ -1265,6 +1232,23 @@ sub Initialize {
    GetterErläuterung
    RainWaitingTime
    BlockAscDrivesAfterManual
    +

    + Übersicht für das ASC Device Setter +
      + { ascAPIget('SETTER') }
      +
    + + + + + + + + + + + +
    SetterErläuterung
    AutoAstroModeEvening
    AutoAstroModeEveningHorizon
    AutoAstroModeMorning
    AutoAstroModeMorningHorizon
    AutoShuttersControlMorning
    AutoShuttersControlEvening
    AutoShuttersControlComfort
    FreezeTemp
    BlockAscDrivesAfterManual 0,1
    =end html_DE @@ -1288,7 +1272,7 @@ sub Initialize { ], "release_status": "testing", "license": "GPL_2", - "version": "v0.9.23", + "version": "v0.9.25", "author": [ "Marko Oldenburg " ], diff --git a/controls_AutoShuttersControl.txt b/controls_AutoShuttersControl.txt index 3a55359..79f1887 100644 --- a/controls_AutoShuttersControl.txt +++ b/controls_AutoShuttersControl.txt @@ -1,5 +1,5 @@ -UPD 2020-06-18_08:09:04 97934 FHEM/73_AutoShuttersControl.pm -UPD 2020-06-18_08:13:33 187057 lib/FHEM/Automation/ShuttersControl.pm +UPD 2020-06-19_14:27:25 97568 FHEM/73_AutoShuttersControl.pm +UPD 2020-06-18_08:16:04 187057 lib/FHEM/Automation/ShuttersControl.pm UPD 2020-06-09_13:21:45 2657 lib/FHEM/Automation/ShuttersControl/Dev.pm UPD 2020-06-09_13:21:45 2493 lib/FHEM/Automation/ShuttersControl/Roommate.pm UPD 2020-06-09_13:21:45 29833 lib/FHEM/Automation/ShuttersControl/Shutters.pm