From 4e0bad02a7c866dd619ccc7076d740fe7d1a7496 Mon Sep 17 00:00:00 2001
From: LeonGaultier
Date: Sun, 26 Jul 2020 15:56:11 +0000
Subject: [PATCH] 73_AutoShuttersControl: Fix Shading bug then shutters
ClosedPos, Split in to new modul files Shading.pm and Helper.pm
git-svn-id: https://svn.fhem.de/fhem/trunk@22473 2b470e98-0d58-463d-a4d8-8e2adae1ed80
---
fhem/CHANGED | 2 +
fhem/FHEM/73_AutoShuttersControl.pm | 21 +-
fhem/lib/FHEM/Automation/ShuttersControl.pm | 3123 +----------------
.../Automation/ShuttersControl/Dev/Attr.pm | 15 +-
.../EventProcessingFunctions.pm | 2453 +++++++++++++
.../FHEM/Automation/ShuttersControl/Helper.pm | 1180 +++++++
.../Automation/ShuttersControl/Roommate.pm | 3 +
.../Automation/ShuttersControl/Shading.pm | 628 ++++
.../Automation/ShuttersControl/Shutters.pm | 140 +-
.../ShuttersControl/Shutters/Attr.pm | 45 +-
10 files changed, 4477 insertions(+), 3133 deletions(-)
create mode 100644 fhem/lib/FHEM/Automation/ShuttersControl/EventProcessingFunctions.pm
create mode 100644 fhem/lib/FHEM/Automation/ShuttersControl/Helper.pm
create mode 100644 fhem/lib/FHEM/Automation/ShuttersControl/Shading.pm
diff --git a/fhem/CHANGED b/fhem/CHANGED
index 5d06eee79..9a881ca6b 100644
--- a/fhem/CHANGED
+++ b/fhem/CHANGED
@@ -1,5 +1,7 @@
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
# Do not insert empty lines here, update check depends on it.
+ - bugfix: 73_AutoShuttersControl: Fix Shading bug then shutters ClosedPos,
+ Split in to new modul files Shading.pm and Helper.pm
- change: 49_SSCam: set compatibility to 8.2.8, minor changes acc. PBP lvl 3
- feature: 93_DbRep: new aggregation value 'minute', some fixes
- feature: 14_SD_UT.pm
diff --git a/fhem/FHEM/73_AutoShuttersControl.pm b/fhem/FHEM/73_AutoShuttersControl.pm
index 58e3b1b8b..75e2ee371 100644
--- a/fhem/FHEM/73_AutoShuttersControl.pm
+++ b/fhem/FHEM/73_AutoShuttersControl.pm
@@ -73,12 +73,14 @@ 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} = \&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} =
+ $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->{DeleteFn} = \&FHEM::Automation::ShuttersControl::Delete;
+ $hash->{ShutdownFn} = \&FHEM::Automation::ShuttersControl::Shutdown;
+ $hash->{AttrList} =
'ASC_tempSensor '
. 'ASC_brightnessDriveUpDown '
. 'ASC_autoShuttersControlMorning:on,off '
@@ -962,8 +964,9 @@ sub Initialize {
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_Shading_BetweenTheTime - das fahren in die Beschattung erfolgt bei Angabe nur innerhalb des Zeitraumes, Bsp: 9:00-13:00 11:25-15:30
- 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_ShuttersPlace - window/terrace/awning - 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. awning steht für Markise und wirkt sich auf die Beschattungssteuerung aus. (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!!!
@@ -1125,6 +1128,7 @@ sub Initialize {
IsDay | Abfrage ob das Rollo im Tag oder Nachtmodus ist. Also nach Sunset oder nach Sunrise |
PrivacyDownStatus | Abfrage ob das Rollo aktuell im PrivacyDown Status steht |
OutTemp | aktuelle Außentemperatur sofern ein Sensor definiert ist, wenn nicht kommt -100 als Wert zurück |
+ ShadingBetweenTheTime | Konfiguration für die Zeit der Beschattung |
Übersicht für das Rollladen-Device mit Parameterübergabe Getter
@@ -1194,6 +1198,7 @@ sub Initialize {
DriveUpMaxDuration | |
SubTyp | |
WinDev | |
+ ShadingBetweenTheTime | Konfiguration für die Zeit der Beschattung, Beispiel: 09:00-13:00 WICHTIG!!!! Immer bei einstelligen Stunden die 0 davor setzen |
Übersicht für das ASC Device Getter
@@ -1253,7 +1258,7 @@ sub Initialize {
],
"release_status": "testing",
"license": "GPL_2",
- "version": "v0.10.3",
+ "version": "v0.10.5",
"author": [
"Marko Oldenburg "
],
diff --git a/fhem/lib/FHEM/Automation/ShuttersControl.pm b/fhem/lib/FHEM/Automation/ShuttersControl.pm
index aa8b65e3f..8ce5995e3 100644
--- a/fhem/lib/FHEM/Automation/ShuttersControl.pm
+++ b/fhem/lib/FHEM/Automation/ShuttersControl.pm
@@ -76,9 +76,9 @@ 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);
+use FHEM::Automation::ShuttersControl::Shading qw (CheckASC_ConditionsForShadingFn);
+use FHEM::Automation::ShuttersControl::EventProcessingFunctions qw (:ALL);
+use FHEM::Automation::ShuttersControl::Helper qw (:ALL);
# try to use JSON::MaybeXS wrapper
# for chance of better performance + open code
@@ -183,10 +183,6 @@ BEGIN {
delFromDevAttrList
delFromAttrList
gettimeofday
- sunset
- sunset_abs
- sunrise
- sunrise_abs
InternalTimer
RemoveInternalTimer
computeAlignTime
@@ -243,13 +239,14 @@ our %userAttrList = (
'ASC_Shading_MinMax_Elevation' => '-',
'ASC_Shading_Min_OutsideTemperature' => '-',
'ASC_Shading_WaitingPeriod' => '-',
+ 'ASC_Shading_BetweenTheTime' => '-',
'ASC_Drive_Delay' => '-',
'ASC_Drive_DelayStart' => '-',
'ASC_Shutter_IdleDetection' => '-',
'ASC_WindowRec' => '-',
'ASC_WindowRec_subType:twostate,threestate' => '-',
'ASC_WindowRec_PosAfterDayClosed:open,lastManual' => '-',
- 'ASC_ShuttersPlace:window,terrace' => '-',
+ 'ASC_ShuttersPlace:window,terrace,awning' => '-',
'ASC_Ventilate_Pos:10,20,30,40,50,60,70,80,90,100' => [ '', 70, 30 ],
'ASC_ComfortOpen_Pos:0,10,20,30,40,50,60,70,80,90,100' => [ '', 20, 80 ],
'ASC_GuestRoom:on,off' => '-',
@@ -291,7 +288,9 @@ our $shutters = FHEM::Automation::ShuttersControl::Shutters->new();
our $ascDev = FHEM::Automation::ShuttersControl::Dev->new();
sub ascAPIget {
- my ( $getCommand, $shutterDev, $value ) = @_;
+ my $getCommand = shift;
+ my $shutterDev = shift;
+ my $value = shift;
my $getter = 'get' . $getCommand;
@@ -311,7 +310,9 @@ sub ascAPIget {
}
sub ascAPIset {
- my ( $setCommand, $shutterDev, $value ) = @_;
+ my $setCommand = shift;
+ my $shutterDev = shift;
+ my $value = shift;
my $setter = 'set' . $setCommand;
@@ -387,6 +388,23 @@ sub Undef {
return;
}
+sub Delete {
+ my $hash = shift;
+ my $name = shift;
+
+ RemoveShuttersTimer($hash);
+
+ return;
+}
+
+sub Shutdown {
+ my $hash = shift;
+
+ RemoveShuttersTimer($hash);
+
+ return;
+}
+
sub Notify {
my $hash = shift // return;
my $dev = shift // return;
@@ -510,124 +528,6 @@ m{^(ATTR|DELETEATTR)\s(.*ASC_Time_Up_WE_Holiday|.*ASC_Up|.*ASC_Down|.*ASC_AutoAs
return;
}
-sub EventProcessingGeneral {
- my ( $hash, $devname, $events ) = @_;
- my $name = $hash->{NAME};
-
- if ( defined($devname) && ($devname) )
- { # es wird lediglich der Devicename der Funktion mitgegeben wenn es sich nicht um global handelt daher hier die Unterscheidung
- while ( my ( $device, $deviceAttr ) =
- each %{ $hash->{monitoredDevs}{$devname} } )
- {
- if ( $device eq $name ) {
- EventProcessingResidents( $hash, $device, $events )
- if ( $deviceAttr eq 'ASC_residentsDev' );
- EventProcessingRain( $hash, $device, $events )
- if ( $deviceAttr eq 'ASC_rainSensor' );
- EventProcessingWind( $hash, $device, $events )
- if ( $deviceAttr eq 'ASC_windSensor' );
- EventProcessingTwilightDevice( $hash, $device, $events )
- if ( $deviceAttr eq 'ASC_twilightDevice' );
- }
-
- EventProcessingWindowRec( $hash, $device, $events )
- if ( $deviceAttr eq 'ASC_WindowRec' )
- ; # ist es ein Fensterdevice wird die Funktion gestartet
- EventProcessingRoommate( $hash, $device, $events )
- if ( $deviceAttr eq 'ASC_Roommate_Device' )
- ; # ist es ein Bewohner Device wird diese Funktion gestartet
-
- EventProcessingExternalTriggerDevice( $hash, $device, $events )
- if ( $deviceAttr eq 'ASC_ExternalTrigger' );
-
- $shutters->setShuttersDev($device)
- if ( $deviceAttr eq 'ASC_BrightnessSensor' );
-
- if (
- $deviceAttr eq 'ASC_BrightnessSensor'
- && ( $shutters->getDown eq 'brightness'
- || $shutters->getUp eq 'brightness' )
- )
- {
- EventProcessingBrightness( $hash, $device, $events );
- }
- elsif ( $deviceAttr eq 'ASC_BrightnessSensor' ) {
- EventProcessingShadingBrightness( $hash, $device, $events );
- }
- }
- }
- else { # alles was kein Devicenamen mit übergeben hat landet hier
- if (
- $events =~ m{^ATTR\s(.*)
- \s(ASC_Roommate_Device|ASC_WindowRec|ASC_residentsDev|ASC_rainSensor
- |ASC_windSensor|ASC_BrightnessSensor|ASC_ExternalTrigger
- |ASC_twilightDevice)
- \s(.*)$}xms
- )
- { # wurde den Attributen unserer Rolläden ein Wert zugewiesen ?
- AddNotifyDev( $hash, $3, $1, $2 ) if ( $3 ne 'none' );
- Log3( $name, 4,
- "AutoShuttersControl ($name) - EventProcessing: ATTR" );
- }
- elsif (
- $events =~ m{^DELETEATTR
- \s(.*)\s(ASC_Roommate_Device
- |ASC_WindowRec|ASC_residentsDev|ASC_rainSensor
- |ASC_windSensor|ASC_BrightnessSensor|ASC_ExternalTrigger
- |ASC_twilightDevice)
- $}xms
- )
- { # wurde das Attribut unserer Rolläden gelöscht ?
- Log3( $name, 4,
- "AutoShuttersControl ($name) - EventProcessing: DELETEATTR" );
- DeleteNotifyDev( $hash, $1, $2 );
- }
- elsif (
- $events =~ m{^(DELETEATTR|ATTR)
- \s(.*)\s(ASC_Time_Up_WE_Holiday|ASC_Up|ASC_Down
- |ASC_AutoAstroModeMorning|ASC_AutoAstroModeMorningHorizon
- |ASC_PrivacyDownValue_beforeNightClose
- |ASC_PrivacyUpValue_beforeDayOpen|ASC_AutoAstroModeEvening
- |ASC_AutoAstroModeEveningHorizon|ASC_Time_Up_Early
- |ASC_Time_Up_Late|ASC_Time_Down_Early|ASC_Time_Down_Late)
- (.*)?}xms
- )
- {
- CreateSunRiseSetShuttersTimer( $hash, $2 )
- if (
- $3 ne 'ASC_Time_Up_WE_Holiday'
- || ( $3 eq 'ASC_Time_Up_WE_Holiday'
- && $ascDev->getSunriseTimeWeHoliday eq 'on' )
- );
- }
- elsif (
- $events =~ m{^(DELETEATTR|ATTR)
- \s(.*)\s(ASC_autoAstroModeMorning|ASC_autoAstroModeMorningHorizon
- |ASC_autoAstroModeEvening|ASC_autoAstroModeEveningHorizon)
- (.*)?}xms
- )
- {
- 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;
-}
-
sub Set {
my $hash = shift // return;
my $aArg = shift // return;
@@ -669,7 +569,7 @@ sub Set {
elsif ( lc $cmd eq 'controlshading' ) {
return "usage: $cmd" if ( scalar( @{$aArg} ) > 1 );
- my $response = _CheckASC_ConditionsForShadingFn($hash);
+ my $response = CheckASC_ConditionsForShadingFn($hash);
readingsSingleUpdate(
$hash, $cmd,
(
@@ -797,9 +697,9 @@ sub ShuttersDeviceScan {
) == 0
)
{
-# $shutters->setAttrUpdateChanges( 'ASC_Up',
-# AttrVal( $shuttersDev, 'ASC_Up', 'none' ) );
-# delFromDevAttrList( $shuttersDev, 'ASC_Up' );
+ $shutters->setAttrUpdateChanges( 'ASC_ShuttersPlace',
+ AttrVal( $shuttersDev, 'ASC_ShuttersPlace', 'none' ) );
+ delFromDevAttrList( $shuttersDev, 'ASC_ShuttersPlace' );
# $shutters->setAttrUpdateChanges( 'ASC_Down',
# AttrVal( $shuttersDev, 'ASC_Down', 'none' ) );
# delFromDevAttrList( $shuttersDev, 'ASC_Down' );
@@ -1037,7 +937,9 @@ sub AddNotifyDev {
## entfernt aus dem NOTIFYDEV Hash Devices welche als Wert in Attributen steckten
sub DeleteNotifyDev {
- my ( $hash, $shuttersDev, $shuttersAttr ) = @_;
+ my $hash = shift;
+ my $shuttersDev = shift;
+ my $shuttersAttr = shift;
my $name = $hash->{NAME};
@@ -1068,1959 +970,18 @@ sub DeleteNotifyDev {
return;
}
-## Sub zum steuern der Rolläden bei einem Fenster Event
-sub EventProcessingWindowRec {
- my ( $hash, $shuttersDev, $events ) = @_;
-
- my $name = $hash->{NAME};
-
- my $reading = $shutters->getWinDevReading;
-
- if ( $events =~
- m{.*$reading:.*?([Oo]pen(?>ed)?|[Cc]losed?|tilt(?>ed)?|true|false)}xms
- && IsAfterShuttersManualBlocking($shuttersDev) )
- {
- my $match = $1;
-
- ASC_Debug( 'EventProcessingWindowRec: '
- . $shutters->getShuttersDev
- . ' - RECEIVED EVENT: '
- . $events
- . ' - IDENTIFIED EVENT: '
- . $1
- . ' - STORED EVENT: '
- . $match );
-
- $shutters->setShuttersDev($shuttersDev);
- my $homemode = $shutters->getRoommatesStatus;
- $homemode = $ascDev->getResidentsStatus if ( $homemode eq 'none' );
-
- #### Hardware Lock der Rollläden
- $shutters->setHardLockOut('off')
- if ( $match =~ m{[Cc]lose|true}xms
- && $shutters->getShuttersPlace eq 'terrace' );
- $shutters->setHardLockOut('on')
- if ( $match =~ m{[Oo]pen|false}xms
- && $shutters->getShuttersPlace eq 'terrace' );
-
- ASC_Debug( 'EventProcessingWindowRec: '
- . $shutters->getShuttersDev
- . ' - HOMEMODE: '
- . $homemode
- . ' QueryShuttersPosWinRecTilted:'
- . $shutters->getQueryShuttersPos( $shutters->getVentilatePos )
- . ' QueryShuttersPosWinRecComfort: '
- . $shutters->getQueryShuttersPos( $shutters->getComfortOpenPos )
- );
-
- if (
- $match =~ m{[Cc]lose|true}xms
- && IsAfterShuttersTimeBlocking($shuttersDev)
- && (
- $shutters->getStatus == $shutters->getVentilatePos
- || $shutters->getStatus == $shutters->getComfortOpenPos
- || $shutters->getStatus == $shutters->getOpenPos
- || ( $shutters->getStatus == $shutters->getPrivacyDownPos
- && $shutters->getPrivacyDownStatus == 1
- && !$shutters->getIsDay )
- )
- && ( $shutters->getVentilateOpen eq 'on'
- || $ascDev->getAutoShuttersControlComfort eq 'on' )
- )
- {
- ASC_Debug( 'EventProcessingWindowRec: '
- . $shutters->getShuttersDev
- . ' Event Closed' );
-
- if (
- $shutters->getIsDay
- && ( ( $homemode ne 'asleep' && $homemode ne 'gotosleep' )
- || $homemode eq 'none' )
- && $shutters->getModeUp ne 'absent'
- && $shutters->getModeUp ne 'off'
- )
- {
- if ( $shutters->getIfInShading
- && $shutters->getShadingPos != $shutters->getStatus
- && $shutters->getShadingMode ne 'absent' )
- {
- $shutters->setLastDrive('shading in');
- $shutters->setNoDelay(1);
- $shutters->setDriveCmd( $shutters->getShadingPos );
- }
- elsif (
- !$shutters->getIfInShading
- && ( $shutters->getStatus != $shutters->getOpenPos
- || $shutters->getStatus != $shutters->getLastManPos )
- )
- {
- if ( $shutters->getPrivacyDownStatus == 2 ) {
- $shutters->setLastDrive(
- 'window closed at privacy night close');
- $shutters->setNoDelay(1);
- $shutters->setDriveCmd( $shutters->getPrivacyDownPos );
- }
- else {
- $shutters->setLastDrive('window closed at day');
- $shutters->setNoDelay(1);
- $shutters->setDriveCmd(
- (
- $shutters->getVentilatePosAfterDayClosed eq
- 'open'
- ? $shutters->getOpenPos
- : $shutters->getLastManPos
- )
- );
- }
- }
- }
- elsif (
- $shutters->getModeDown ne 'absent'
- && $shutters->getModeDown ne 'off'
- && (
- (
- !$shutters->getIsDay
- && $shutters->getModeDown ne 'roommate'
- )
- || $homemode eq 'asleep'
- || $homemode eq 'gotosleep'
- )
- && $ascDev->getAutoShuttersControlEvening eq 'on'
- )
- {
- if ( $shutters->getPrivacyUpStatus == 2 ) {
- $shutters->setLastDrive(
- 'window closed at privacy day open');
- $shutters->setNoDelay(1);
- $shutters->setDriveCmd( $shutters->getPrivacyDownPos );
- }
- else {
- $shutters->setLastDrive('window closed at night');
- $shutters->setNoDelay(1);
- $shutters->setDriveCmd(
- (
- $shutters->getSleepPos > 0
- ? $shutters->getSleepPos
- : $shutters->getClosedPos
- )
- );
- }
- }
- }
- elsif (
- (
- $match =~ m{tilt}xms || ( $match =~ m{[Oo]pen|false}xms
- && $shutters->getSubTyp eq 'twostate' )
- )
- && $shutters->getVentilateOpen eq 'on'
- && $shutters->getQueryShuttersPos( $shutters->getVentilatePos )
- )
- {
- $shutters->setLastDrive('ventilate - window open');
- $shutters->setNoDelay(1);
- $shutters->setDriveCmd(
- (
- (
- $shutters->getShuttersPlace eq 'terrace'
- && $shutters->getSubTyp eq 'twostate'
- ) ? $shutters->getOpenPos : $shutters->getVentilatePos
- )
- );
- }
- elsif ($match =~ m{[Oo]pen|false}xms
- && $shutters->getSubTyp eq 'threestate' )
- {
- my $posValue = $shutters->getStatus;
- my $setLastDrive;
- if ( $ascDev->getAutoShuttersControlComfort eq 'on'
- and
- $shutters->getQueryShuttersPos( $shutters->getComfortOpenPos ) )
- {
- $posValue = $shutters->getComfortOpenPos;
- $setLastDrive = 'comfort - window open';
- }
- elsif ($shutters->getQueryShuttersPos( $shutters->getVentilatePos )
- && $shutters->getVentilateOpen eq 'on' )
- {
- $posValue = $shutters->getVentilatePos;
- $setLastDrive = 'ventilate - window open';
- }
-
- if ( defined($posValue) && $posValue ) {
- $shutters->setLastDrive($setLastDrive);
- $shutters->setNoDelay(1);
- $shutters->setDriveCmd($posValue);
- }
- }
- }
-
- return;
-}
-
-## Sub zum steuern der Rolladen bei einem Bewohner/Roommate Event
-sub EventProcessingRoommate {
- my ( $hash, $shuttersDev, $events ) = @_;
-
- my $name = $hash->{NAME};
-
- $shutters->setShuttersDev($shuttersDev);
- my $reading = $shutters->getRoommatesReading;
-
- if ( $events =~ m{$reading:\s(absent|gotosleep|asleep|awoken|home)}xms ) {
- Log3( $name, 4,
- "AutoShuttersControl ($name) - EventProcessingRoommate: "
- . $shutters->getRoommatesReading );
- Log3( $name, 4,
-"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 = $shutters->getStatus;
-
- if (
- ( $event eq 'home' || $event eq 'awoken' )
- && ( $getRoommatesStatus eq 'home'
- || $getRoommatesStatus eq 'awoken' )
- && ( $ascDev->getAutoShuttersControlMorning eq 'on'
- || $shutters->getUp eq 'roommate' )
- && IsAfterShuttersManualBlocking($shuttersDev)
- )
- {
- Log3( $name, 4,
-"AutoShuttersControl ($name) - EventProcessingRoommate_1: $shuttersDev und Events $events"
- );
- if (
- (
- (
- $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' )
- && ( IsAfterShuttersTimeBlocking($shuttersDev)
- || $shutters->getUp eq 'roommate' )
- )
- {
- Log3( $name, 4,
-"AutoShuttersControl ($name) - EventProcessingRoommate_2: $shuttersDev und Events $events"
- );
-
- if ( $shutters->getIfInShading
- && !$shutters->getShadingManualDriveStatus
- && $shutters->getStatus != $shutters->getShadingPos )
- {
- $shutters->setLastDrive('shading in');
- $posValue = $shutters->getShadingPos;
- }
- elsif ( !$shutters->getIfInShading ) {
- $shutters->setLastDrive('roommate awoken');
- $posValue = $shutters->getOpenPos;
- }
-
- ShuttersCommandSet( $hash, $shuttersDev, $posValue );
- }
- elsif (
- (
- $getRoommatesLastStatus eq 'absent'
- || $getRoommatesLastStatus eq 'gone'
- )
- && $getRoommatesStatus eq 'home'
- )
- {
- 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'
- || $getModeDown eq 'always' )
- && $shutters->getDown ne 'roommate'
- )
- {
- $shutters->setLastDrive('roommate come home');
-
- if ( CheckIfShuttersWindowRecOpen($shuttersDev) == 0
- || $shutters->getVentilateOpen eq 'off' )
- {
- $posValue = (
- $shutters->getSleepPos > 0 ? $shutters->getSleepPos
- : (
- $shutters->getSleepPos > 0
- ? $shutters->getSleepPos
- : $shutters->getClosedPos
- )
- );
- }
- else {
- $posValue = $shutters->getVentilatePos;
- $shutters->setLastDrive(
- $shutters->getLastDrive . ' - ventilate mode' );
- }
-
- ShuttersCommandSet( $hash, $shuttersDev, $posValue );
- }
- elsif (
- ( $shutters->getIsDay || $shutters->getUp eq 'roommate' )
- && IsAfterShuttersTimeBlocking($shuttersDev)
- && ( $getModeUp eq 'home'
- || $getModeUp eq 'always' )
- && !$shutters->getIfInShading
- )
- {
- if ( $shutters->getIfInShading
- && !$shutters->getShadingManualDriveStatus
- && $shutters->getStatus == $shutters->getOpenPos
- && $shutters->getShadingMode eq 'home' )
- {
- $shutters->setLastDrive('shading in');
- ShuttersCommandSet( $hash, $shuttersDev,
- $shutters->getShadingPos );
- }
- elsif (
- (
- !$shutters->getIfInShading
- || $shutters->getShadingMode eq 'absent'
- )
- && ( $shutters->getStatus == $shutters->getClosedPos
- || $shutters->getStatus == $shutters->getSleepPos
- || $shutters->getStatus ==
- $shutters->getShadingPos )
- )
- {
- $shutters->setLastDrive(
- (
- (
- $shutters->getStatus ==
- $shutters->getClosedPos
- || $shutters->getStatus ==
- $shutters->getSleepPos
- )
- ? 'roommate come home'
- : 'shading out'
- )
- );
-
- ShuttersCommandSet( $hash, $shuttersDev,
- $shutters->getOpenPos );
- }
- }
- }
- }
- elsif (
- ( $event eq 'gotosleep' || $event eq 'asleep' )
- && ( $ascDev->getAutoShuttersControlEvening eq 'on'
- || $shutters->getDown eq 'roommate' )
- && ( IsAfterShuttersManualBlocking($shuttersDev)
- || $shutters->getDown eq 'roommate' )
- )
- {
- $shutters->setLastDrive('roommate asleep');
-
- if ( CheckIfShuttersWindowRecOpen($shuttersDev) == 0
- || $shutters->getVentilateOpen eq 'off' )
- {
- $posValue = (
- $shutters->getSleepPos > 0
- ? $shutters->getSleepPos
- : $shutters->getClosedPos
- );
- }
- else {
- $posValue = $shutters->getVentilatePos;
- $shutters->setLastDrive(
- $shutters->getLastDrive . ' - ventilate mode' );
- }
-
- ShuttersCommandSet( $hash, $shuttersDev, $posValue );
- }
- elsif (
- $event eq 'absent'
- && ( !$shutters->getIsDay
- || $shutters->getDown eq 'roommate'
- || $shutters->getShadingMode eq 'absent'
- || $shutters->getModeUp eq 'absent'
- || $shutters->getModeDown eq 'absent' )
- )
- {
- Log3( $name, 4,
-"AutoShuttersControl ($name) - EventProcessingRoommate absent: $shuttersDev"
- );
-
- if ( ( $shutters->getIsDay || $shutters->getUp eq 'roommate' )
- && $shutters->getIfInShading
- && !$shutters->getQueryShuttersPos( $shutters->getShadingPos )
- && $shutters->getShadingMode eq 'absent' )
- {
- Log3( $name, 4,
-"AutoShuttersControl ($name) - EventProcessingRoommate Shading: $shuttersDev"
- );
-
- $shutters->setLastDrive('shading in');
- ShuttersCommandSet( $hash, $shuttersDev,
- $shutters->getShadingPos );
- }
- elsif (( !$shutters->getIsDay || $shutters->getDown eq 'roommate' )
- && $getModeDown eq 'absent'
- && $getRoommatesStatus eq 'absent' )
- {
- Log3( $name, 4,
-"AutoShuttersControl ($name) - EventProcessingRoommate Down: $shuttersDev"
- );
-
- $shutters->setLastDrive('roommate absent');
- ShuttersCommandSet( $hash, $shuttersDev,
- $shutters->getClosedPos );
- }
- elsif ($shutters->getIsDay
- && $shutters->getModeUp eq 'absent'
- && $getRoommatesStatus eq 'absent' )
- {
- Log3( $name, 4,
-"AutoShuttersControl ($name) - EventProcessingRoommate Up: $shuttersDev"
- );
-
- $shutters->setLastDrive('roommate absent');
- ShuttersCommandSet( $hash, $shuttersDev,
- $shutters->getOpenPos );
- }
-
- Log3( $name, 4,
-"AutoShuttersControl ($name) - EventProcessingRoommate NICHTS: $shuttersDev"
- );
- }
- }
-
- return;
-}
-
-sub EventProcessingResidents {
- my ( $hash, $device, $events ) = @_;
-
- my $name = $device;
- my $reading = $ascDev->getResidentsReading;
- my $getResidentsLastStatus = $ascDev->getResidentsLastStatus;
-
- if ( $events =~ m{$reading:\s((?:pet_[a-z]+)|(?:absent))}xms ) {
- for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
- $shutters->setShuttersDev($shuttersDev);
- my $getModeUp = $shutters->getModeUp;
- my $getModeDown = $shutters->getModeDown;
- $shutters->setHardLockOut('off');
- if (
- $ascDev->getSelfDefense eq 'on'
- && $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 (
- $ascDev->getSelfDefense eq 'on'
- && (
- $shutters->getSelfDefenseMode eq 'absent'
- || ( CheckIfShuttersWindowRecOpen($shuttersDev) == 2
- && $shutters->getSelfDefenseMode eq 'gone'
- && $shutters->getShuttersPlace eq 'terrace'
- && $shutters->getSelfDefenseMode ne 'off' )
- )
- )
- {
- $shutters->setLastDrive('selfDefense absent active');
- $shutters->setSelfDefenseAbsent( 0, 1 )
- ; # der erste Wert ist ob der timer schon läuft, der zweite ist ob self defense aktiv ist durch die Bedingungen
- $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)
- && $shutters->getRoommatesStatus eq 'none' )
- {
- $shutters->setLastDrive('residents absent');
- $shutters->setDriveCmd( $shutters->getClosedPos );
- }
- }
- }
- }
- elsif ($events =~ m{$reading:\s(gone)}xms
- && $ascDev->getSelfDefense eq 'on' )
- {
- for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
- $shutters->setShuttersDev($shuttersDev);
- $shutters->setHardLockOut('off');
- if ( $shutters->getSelfDefenseMode ne 'off' ) {
-
- $shutters->setLastDrive('selfDefense gone active');
- $shutters->setSelfDefenseState(1);
- $shutters->setDriveCmd( $shutters->getClosedPos );
- }
- }
- }
- elsif (
- $events =~ m{$reading:\s((?:[a-z]+_)?home)}xms
- && ( $getResidentsLastStatus eq 'absent'
- || $getResidentsLastStatus eq 'gone'
- || $getResidentsLastStatus eq 'asleep'
- || $getResidentsLastStatus eq 'awoken' )
- )
- {
- for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
- $shutters->setShuttersDev($shuttersDev);
- my $getModeUp = $shutters->getModeUp;
- my $getModeDown = $shutters->getModeDown;
-
- if (
- (
- $shutters->getStatus != $shutters->getClosedPos
- || $shutters->getStatus != $shutters->getSleepPos
- )
- && !$shutters->getIsDay
- && $shutters->getRoommatesStatus eq 'none'
- && ( $getModeDown eq 'home'
- || $getModeDown eq 'always' )
- && $getResidentsLastStatus ne 'asleep'
- && $getResidentsLastStatus ne 'awoken'
- && IsAfterShuttersTimeBlocking($shuttersDev)
- && !$shutters->getSelfDefenseState
- )
- {
- $shutters->setLastDrive('residents come home');
- $shutters->setDriveCmd(
- (
- $shutters->getSleepPos > 0
- ? $shutters->getSleepPos
- : $shutters->getClosedPos
- )
- );
- }
- elsif (
- (
- $shutters->getShadingMode eq 'home'
- || $shutters->getShadingMode eq 'always'
- )
- && $shutters->getIsDay
- && $shutters->getIfInShading
- && $shutters->getRoommatesStatus eq 'none'
- && $shutters->getStatus != $shutters->getShadingPos
- && !$shutters->getShadingManualDriveStatus
- && !(
- CheckIfShuttersWindowRecOpen($shuttersDev) == 2
- && $shutters->getShuttersPlace eq 'terrace'
- )
- && !$shutters->getSelfDefenseState
- )
- {
- ShadingProcessingDriveCommand( $hash, $shuttersDev );
- }
- elsif (
- $shutters->getShadingMode eq 'absent'
- && $shutters->getIsDay
- && $shutters->getIfInShading
- && $shutters->getStatus == $shutters->getShadingPos
- && $shutters->getRoommatesStatus eq 'none'
- && !$shutters->getShadingManualDriveStatus
- && !(
- CheckIfShuttersWindowRecOpen($shuttersDev) == 2
- && $shutters->getShuttersPlace eq 'terrace'
- )
- && !$shutters->getSelfDefenseState
- )
- {
- $shutters->setLastDrive('shading out');
- $shutters->setDriveCmd( $shutters->getLastPos );
- }
- elsif (
- $ascDev->getSelfDefense eq 'on'
- && $shutters->getSelfDefenseMode ne 'off'
- && !$shutters->getIfInShading
- && ( $getResidentsLastStatus eq 'gone'
- || $getResidentsLastStatus eq 'absent' )
- && $shutters->getSelfDefenseState
- )
- {
- RemoveInternalTimer( $shutters->getSelfDefenseAbsentTimerhash )
- if ( $getResidentsLastStatus eq 'absent'
- && $ascDev->getSelfDefense eq 'on'
- && $shutters->getSelfDefenseMode ne 'off'
- && !$shutters->getSelfDefenseAbsent
- && $shutters->getSelfDefenseAbsentTimerrun );
-
- if (
- (
- $shutters->getStatus == $shutters->getClosedPos
- || $shutters->getStatus == $shutters->getSleepPos
- )
- && $shutters->getIsDay
- )
- {
- $shutters->setHardLockOut('on')
- if (
- CheckIfShuttersWindowRecOpen($shuttersDev) == 2
- && $shutters->getShuttersPlace eq 'terrace'
- && ( $getModeUp eq 'absent'
- || $getModeUp eq 'off' )
- );
-
- $shutters->setSelfDefenseState(0);
- $shutters->setLastDrive('selfDefense inactive');
- $shutters->setDriveCmd(
- (
- $shutters->getPrivacyDownStatus == 2
- ? $shutters->getPrivacyDownPos
- : $shutters->getOpenPos
- )
- );
- }
- }
- elsif (
- (
- $shutters->getStatus == $shutters->getClosedPos
- || $shutters->getStatus == $shutters->getSleepPos
- )
- && $shutters->getIsDay
- && $shutters->getRoommatesStatus eq 'none'
- && ( $getModeUp eq 'home'
- || $getModeUp eq 'always' )
- && IsAfterShuttersTimeBlocking($shuttersDev)
- && !$shutters->getIfInShading
- && !$shutters->getSelfDefenseState
- )
- {
- if ( $getResidentsLastStatus eq 'asleep'
- || $getResidentsLastStatus eq 'awoken' )
- {
- $shutters->setLastDrive('residents awoken');
- }
- else { $shutters->setLastDrive('residents home'); }
- $shutters->setDriveCmd( $shutters->getOpenPos );
- }
- }
- }
-
- return;
-}
-
-sub EventProcessingRain {
-
- #### Ist noch nicht fertig, es fehlt noch das verzögerte Prüfen auf erhalten bleiben des getriggerten Wertes.
-
- my ( $hash, $device, $events ) = @_;
-
- my $name = $device;
- my $reading = $ascDev->getRainSensorReading;
-
- if ( $events =~ m{$reading:\s(\d+(\.\d+)?|rain|dry)}xms ) {
- my $val;
- my $triggerMax = $ascDev->getRainTriggerMax;
- my $triggerMin = $ascDev->getRainTriggerMin;
- my $closedPos = $ascDev->getRainSensorShuttersClosedPos;
-
- if ( $1 eq 'rain' ) { $val = $triggerMax + 1 }
- elsif ( $1 eq 'dry' ) { $val = $triggerMin }
- else { $val = $1 }
-
- RainProtection( $hash, $val, $triggerMax, $closedPos );
- }
-
- return;
-}
-
-sub RainProtection {
- my ( $hash, $val, $triggerMax, $closedPos ) = @_;
-
- for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
- $shutters->setShuttersDev($shuttersDev);
-
- next
- if ( $shutters->getRainProtection eq 'off' );
-
- if ( $val > $triggerMax
- && $shutters->getStatus != $closedPos
- && IsAfterShuttersManualBlocking($shuttersDev)
- && $shutters->getRainProtectionStatus eq 'unprotected' )
- {
- $shutters->setLastDrive('rain protected');
- $shutters->setDriveCmd($closedPos);
- $shutters->setRainProtectionStatus('protected');
- }
- elsif (( $val == 0 || $val < $shutters->getWindMin )
- && $shutters->getStatus == $closedPos
- && IsAfterShuttersManualBlocking($shuttersDev)
- && $shutters->getRainProtectionStatus eq 'protected' )
- {
- $shutters->setLastDrive('rain un-protected');
- $shutters->setDriveCmd(
- (
- $shutters->getIsDay ? $shutters->getLastPos
- : (
- $shutters->getPrivacyDownStatus == 2
- ? $shutters->getPrivacyDownPos
- : $shutters->getClosedPos
- )
- )
- );
- $shutters->setRainProtectionStatus('unprotected');
- }
- }
-
- return;
-}
-
-sub EventProcessingWind {
- my ( $hash, $shuttersDev, $events ) = @_;
-
- my $name = $hash->{NAME};
- $shutters->setShuttersDev($shuttersDev);
-
- my $reading = $ascDev->getWindSensorReading;
- if ( $events =~ m{$reading:\s(\d+(\.\d+)?)}xms ) {
- for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
- $shutters->setShuttersDev($shuttersDev);
-
- ASC_Debug( 'EventProcessingWind: '
- . $shutters->getShuttersDev
- . ' - WindProtection1: '
- . $shutters->getWindProtectionStatus
- . ' WindMax1: '
- . $shutters->getWindMax
- . ' WindMin1: '
- . $shutters->getWindMin
- . ' Bekommender Wert1: '
- . $1 );
-
- next
- if (
- (
- CheckIfShuttersWindowRecOpen($shuttersDev) != 0
- && $shutters->getShuttersPlace eq 'terrace'
- )
- || $shutters->getWindProtection eq 'off'
- );
-
- if ( $1 > $shutters->getWindMax
- && $shutters->getWindProtectionStatus eq 'unprotected' )
- {
- $shutters->setLastDrive('wind protected');
- $shutters->setDriveCmd( $shutters->getWindPos );
- $shutters->setWindProtectionStatus('protected');
- }
- elsif ($1 < $shutters->getWindMin
- && $shutters->getWindProtectionStatus eq 'protected' )
- {
- $shutters->setLastDrive('wind un-protected');
- $shutters->setDriveCmd(
- (
- $shutters->getIsDay ? $shutters->getLastPos
- : (
- $shutters->getPrivacyDownStatus == 2
- ? $shutters->getPrivacyDownPos
- : (
- $shutters->getSleepPos > 0
- ? $shutters->getSleepPos
- : $shutters->getClosedPos
- )
- )
- )
- );
- $shutters->setWindProtectionStatus('unprotected');
- }
-
- ASC_Debug( 'EventProcessingWind: '
- . $shutters->getShuttersDev
- . ' - WindProtection2: '
- . $shutters->getWindProtectionStatus
- . ' WindMax2: '
- . $shutters->getWindMax
- . ' WindMin2: '
- . $shutters->getWindMin
- . ' Bekommender Wert2: '
- . $1 );
- }
- }
-
- return;
-}
-##########
-
-sub EventProcessingBrightness {
- my ( $hash, $shuttersDev, $events ) = @_;
-
- my $name = $hash->{NAME};
- $shutters->setShuttersDev($shuttersDev);
-
- ASC_Debug( 'EventProcessingBrightness: '
- . $shutters->getShuttersDev
- . ' - Event von einem Helligkeitssensor erkannt. Verarbeitung läuft. Sollten keine weitere Meldungen aus der Funktion kommen, so befindet sich die aktuelle Zeit nicht innerhalb der Verarbeitungszeit für Sunset oder Sunrise'
- );
-
- return EventProcessingShadingBrightness( $hash, $shuttersDev, $events )
- if (
- (
- $shutters->getDown ne 'brightness'
- && $shutters->getUp ne 'brightness'
- )
- || (
- (
- $shutters->getDown eq 'brightness'
- || $shutters->getUp eq 'brightness'
- )
- && (
- (
- (
- (
- int( gettimeofday() / 86400 ) == int(
- computeAlignTime( '24:00',
- $shutters->getTimeUpEarly ) / 86400
- )
- && (
- !IsWe()
- || (
- IsWe()
- && $ascDev->getSunriseTimeWeHoliday eq 'off'
- || (
- $ascDev->getSunriseTimeWeHoliday eq 'on'
- && $shutters->getTimeUpWeHoliday eq
- '01:25' )
- )
- )
- )
- || (
- 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->getTimeUpLate ) /
- 86400
- )
-
- || (
- (
- int( gettimeofday() / 86400 ) != int(
- computeAlignTime( '24:00',
- $shutters->getTimeUpEarly ) / 86400
- )
- && (
- !IsWe()
- || (
- IsWe()
- && $ascDev->getSunriseTimeWeHoliday eq 'off'
- || (
- $ascDev->getSunriseTimeWeHoliday eq 'on'
- && $shutters->getTimeUpWeHoliday eq
- '01:25' )
- )
- )
- )
- || (
- 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->getTimeUpLate ) /
- 86400
- )
- )
- && (
- (
- 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->getTimeDownEarly
- ) / 86400
- )
- && int( gettimeofday() / 86400 ) != int(
- computeAlignTime( '24:00', $shutters->getTimeDownLate
- ) / 86400
- )
- )
- )
- )
- )
- );
-
- ASC_Debug( 'EventProcessingBrightness: '
- . $shutters->getShuttersDev
- . ' - Die aktuelle Zeit befindet sich innerhalb der Sunset/Sunrise Brightness Verarbeitungszeit. Also zwischen Time Early und Time Late'
- );
-
- my $reading = $shutters->getBrightnessReading;
- if ( $events =~ m{$reading:\s(\d+(\.\d+)?)}xms ) {
- 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;
- }
-
- my $brightnessPrivacyUpVal = $shutters->getPrivacyUpBrightnessVal;
- my $brightnessPrivacyDownVal = $shutters->getPrivacyDownBrightnessVal;
-
- ASC_Debug( 'EventProcessingBrightness: '
- . $shutters->getShuttersDev
- . ' - Es wird geprüft ob Sunset oder Sunrise gefahren werden soll und der aktuelle übergebene Brightness-Wert: '
- . $1
- . ' Größer dem eingestellten Sunrise-Wert: '
- . $brightnessMaxVal
- . ' oder kleiner dem eingestellten Sunset-Wert: '
- . $brightnessMinVal
- . ' ist. Werte für weitere Parameter - getUp ist: '
- . $shutters->getUp
- . ' getDown ist: '
- . $shutters->getDown
- . ' getSunrise ist: '
- . $shutters->getSunrise
- . ' getSunset ist: '
- . $shutters->getSunset );
-
- if (
- (
- (
- (
- int( gettimeofday() / 86400 ) != int(
- computeAlignTime( '24:00',
- $shutters->getTimeUpEarly ) / 86400
- )
- && (
- !IsWe()
- || (
- IsWe()
- && $ascDev->getSunriseTimeWeHoliday eq 'off'
- || ( $ascDev->getSunriseTimeWeHoliday eq 'on'
- && $shutters->getTimeUpWeHoliday eq
- '01:25' )
- )
- )
- )
- || (
- 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->getTimeUpLate ) /
- 86400
- )
- )
- && (
- $1 > $brightnessMaxVal
- || ( $1 > $brightnessPrivacyUpVal
- && $shutters->getPrivacyUpStatus == 1 )
- )
- && $shutters->getUp eq 'brightness'
- && !$shutters->getSunrise
- && $ascDev->getAutoShuttersControlMorning eq 'on'
- && (
- $ascDev->getSelfDefense eq 'off'
- || $shutters->getSelfDefenseMode eq 'off'
- || ( $ascDev->getSelfDefense eq 'on'
- && $ascDev->getResidentsStatus ne 'gone' )
- )
- )
- {
- Log3( $name, 4,
-"AutoShuttersControl ($shuttersDev) - EventProcessingBrightness: Steuerung für Morgens"
- );
-
- ASC_Debug( 'EventProcessingBrightness: '
- . $shutters->getShuttersDev
- . ' - Verarbeitungszeit für Sunrise wurd erkannt. Prüfe Status der Roommates'
- );
-
- my $homemode = $shutters->getRoommatesStatus;
- $homemode = $ascDev->getResidentsStatus
- if ( $homemode eq 'none' );
-
- if (
- $shutters->getModeUp eq $homemode
- || ( $shutters->getModeUp eq 'absent'
- && $homemode eq 'gone' )
- || $shutters->getModeUp eq 'always'
- )
- {
- my $roommatestatus = $shutters->getRoommatesStatus;
-
- if (
- $roommatestatus eq 'home'
- || $roommatestatus eq 'awoken'
- || $roommatestatus eq 'absent'
- || $roommatestatus eq 'gone'
- || $roommatestatus eq 'none'
- && (
- $ascDev->getSelfDefense eq 'off'
- || ( $ascDev->getSelfDefense eq 'on'
- && CheckIfShuttersWindowRecOpen($shuttersDev) == 0 )
- || ( $ascDev->getSelfDefense eq 'on'
- && CheckIfShuttersWindowRecOpen($shuttersDev) != 0
- && $ascDev->getResidentsStatus eq 'home' )
- )
- )
- {
-
- if ( $brightnessPrivacyUpVal > 0
- && $1 < $brightnessMaxVal
- && $1 > $brightnessPrivacyUpVal )
- {
- $shutters->setPrivacyUpStatus(2);
- $shutters->setLastDrive('brightness privacy day open');
- ShuttersCommandSet( $hash, $shuttersDev,
- $shutters->getPrivacyUpPos )
- if (
- $shutters->getQueryShuttersPos(
- $shutters->getPrivacyUpPos
- )
- );
-
- ASC_Debug( 'EventProcessingBrightness: '
- . $shutters->getShuttersDev
- . ' - Verarbeitung für Sunrise Privacy Down. Roommatestatus korrekt zum fahren. Fahrbefehl wird an die Funktion FnShuttersCommandSet gesendet. Grund des fahrens: '
- . $shutters->getLastDrive );
-
- CreateSunRiseSetShuttersTimer( $hash, $shuttersDev );
- }
- else {
- $shutters->setLastDrive(
- 'maximum brightness threshold exceeded');
- $shutters->setSunrise(1);
- $shutters->setSunset(0);
- $shutters->setPrivacyUpStatus(0)
- if ( $shutters->getPrivacyUpStatus == 2 );
- ShuttersCommandSet( $hash, $shuttersDev,
- $shutters->getOpenPos );
-
- ASC_Debug( 'EventProcessingBrightness: '
- . $shutters->getShuttersDev
- . ' - Verarbeitung für Sunrise. Roommatestatus korrekt zum fahren. Fahrbefehl wird an die Funktion FnShuttersCommandSet gesendet. Grund des fahrens: '
- . $shutters->getLastDrive );
- }
- }
- else {
- EventProcessingShadingBrightness( $hash, $shuttersDev,
- $events );
- ASC_Debug( 'EventProcessingBrightness: '
- . $shutters->getShuttersDev
- . ' - Verarbeitung für Sunrise. Roommatestatus nicht zum hochfahren oder Fenster sind offen. Fahrbebehl bleibt aus!!! Es wird an die Event verarbeitende Beschattungsfunktion weiter gereicht'
- );
- }
- }
- }
- elsif (
- int( gettimeofday() / 86400 ) != int(
- computeAlignTime( '24:00', $shutters->getTimeDownEarly ) / 86400
- )
- && int( gettimeofday() / 86400 ) == int(
- computeAlignTime( '24:00', $shutters->getTimeDownLate ) / 86400
- )
- && (
- $1 < $brightnessMinVal
- || ( $1 < $brightnessPrivacyDownVal
- && $shutters->getPrivacyDownStatus == 1 )
- )
- && $shutters->getDown eq 'brightness'
- && !$shutters->getSunset
- && IsAfterShuttersManualBlocking($shuttersDev)
- && $ascDev->getAutoShuttersControlEvening eq 'on'
- )
- {
- Log3( $name, 4,
-"AutoShuttersControl ($shuttersDev) - EventProcessingBrightness: Steuerung für Abends"
- );
-
- ASC_Debug( 'EventProcessingBrightness: '
- . $shutters->getShuttersDev
- . ' - Verarbeitungszeit für Sunset wurd erkannt. Prüfe Status der Roommates'
- );
-
- my $homemode = $shutters->getRoommatesStatus;
- $homemode = $ascDev->getResidentsStatus
- if ( $homemode eq 'none' );
-
- if (
- $shutters->getModeDown eq $homemode
- || ( $shutters->getModeDown eq 'absent'
- && $homemode eq 'gone' )
- || $shutters->getModeDown eq 'always'
- )
- {
- my $posValue = $shutters->getStatus;
- my $lastDrive;
-
- ## Setzt den PrivacyDown Modus für die Sichtschutzfahrt auf den Status 0
- ## 1 bedeutet das PrivacyDown Timer aktiviert wurde, 2 beudet das er im privacyDown ist
- ## also das Rollo in privacyDown Position steht und VOR der endgültigen Nachfahrt
-
- if ( $brightnessPrivacyDownVal > 0
- && $1 > $brightnessMinVal
- && $1 < $brightnessPrivacyDownVal )
- {
- $lastDrive = 'brightness privacy night close';
- $posValue = (
- (
- !$shutters->getQueryShuttersPos(
- $shutters->getPrivacyDownPos
- )
- ) ? $shutters->getPrivacyDownPos : $shutters->getStatus
- );
- $shutters->setPrivacyDownStatus(2);
-
- ASC_Debug( 'EventProcessingBrightness: '
- . $shutters->getShuttersDev
- . ' - Verarbeitung für Sunset Privacy Down. Roommatestatus korrekt zum fahren. Fahrbefehl wird an die Funktion FnShuttersCommandSet gesendet. Grund des fahrens: '
- . $shutters->getLastDrive );
- }
- elsif (CheckIfShuttersWindowRecOpen($shuttersDev) == 2
- && $shutters->getSubTyp eq 'threestate'
- && $ascDev->getAutoShuttersControlComfort eq 'on' )
- {
- $posValue = $shutters->getComfortOpenPos;
- $lastDrive = 'minimum brightness threshold fell below';
- $shutters->setPrivacyDownStatus(0)
- if ( $shutters->getPrivacyDownStatus == 2 );
- }
- elsif ( CheckIfShuttersWindowRecOpen($shuttersDev) == 0
- || $shutters->getVentilateOpen eq 'off' )
- {
- $posValue = (
- $shutters->getSleepPos > 0
- ? $shutters->getSleepPos
- : $shutters->getClosedPos
- );
- $lastDrive = 'minimum brightness threshold fell below';
- $shutters->setPrivacyDownStatus(0)
- if ( $shutters->getPrivacyDownStatus == 2 );
- }
- else {
- $posValue = $shutters->getVentilatePos;
- $lastDrive = 'minimum brightness threshold fell below';
- $shutters->setPrivacyDownStatus(0)
- if ( $shutters->getPrivacyDownStatus == 2 );
- }
-
- $shutters->setLastDrive($lastDrive);
-
- if (
- $shutters->getPrivacyDownStatus != 2
-# && ( $posValue != $shutters->getStatus
-# || $shutters->getSelfDefenseState )
- )
- {
- $shutters->setSunrise(0);
- $shutters->setSunset(1);
- }
-
- ShuttersCommandSet( $hash, $shuttersDev, $posValue );
-
- ASC_Debug( 'EventProcessingBrightness: '
- . $shutters->getShuttersDev
- . ' - Verarbeitung für Sunset. Roommatestatus korrekt zum fahren. Fahrbefehl wird an die Funktion FnShuttersCommandSet gesendet. Zielposition: '
- . $posValue
- . ' Grund des fahrens: '
- . $shutters->getLastDrive );
- }
- else {
- EventProcessingShadingBrightness( $hash, $shuttersDev, $events )
- if ( $shutters->getPrivacyDownStatus != 2 );
-
- ASC_Debug( 'EventProcessingBrightness: '
- . $shutters->getShuttersDev
- . ' - Verarbeitung für Sunset. Roommatestatus nicht zum runter fahren. Fahrbebehl bleibt aus!!! Es wird an die Event verarbeitende Beschattungsfunktion weiter gereicht'
- );
- }
- }
- else {
- EventProcessingShadingBrightness( $hash, $shuttersDev, $events )
- if ( $shutters->getPrivacyDownStatus != 2 );
-
- ASC_Debug( 'EventProcessingBrightness: '
- . $shutters->getShuttersDev
- . ' - Brightness Event kam nicht innerhalb der Verarbeitungszeit für Sunset oder Sunris oder aber für beide wurden die entsprechendne Verarbeitungsschwellen nicht erreicht.'
- );
- }
- }
- else {
- ASC_Debug( 'EventProcessingBrightness: '
- . $shutters->getShuttersDev
- . ' - Leider konnte kein Korrekter Brightnesswert aus dem Event erkannt werden. Entweder passt das Reading oder der tatsächliche nummerishce Wert des Events nicht'
- );
- }
-
- return;
-}
-
-sub EventProcessingShadingBrightness {
- my ( $hash, $shuttersDev, $events ) = @_;
-
- my $name = $hash->{NAME};
- $shutters->setShuttersDev($shuttersDev);
- my $reading = $shutters->getBrightnessReading;
- my $outTemp = (
- $shutters->getOutTemp != -100
- ? $shutters->getOutTemp
- : $ascDev->getOutTemp
- );
-
- Log3( $name, 4,
- "AutoShuttersControl ($shuttersDev) - EventProcessingShadingBrightness"
- );
-
- ASC_Debug( 'EventProcessingShadingBrightness: '
- . $shutters->getShuttersDev
- . ' - Es wird nun geprüft ob der übergebene Event ein nummerischer Wert vom Brightnessreading ist.'
- );
-
- if ( $events =~ m{$reading:\s(\d+(\.\d+)?)}xms ) {
- Log3(
- $name, 4,
-"AutoShuttersControl ($shuttersDev) - EventProcessingShadingBrightness
- Brightness: " . $1
- );
-
- ## Brightness Wert in ein Array schieben zur Berechnung eines Average Wertes
- $shutters->setPushBrightnessInArray($1);
-
- ASC_Debug( 'EventProcessingShadingBrightness: '
- . $shutters->getShuttersDev
- . ' - Nummerischer Brightness-Wert wurde erkannt. Der Brightness Average Wert ist: '
- . $shutters->getBrightnessAverage
- . ' RainProtection: '
- . $shutters->getRainProtectionStatus
- . ' WindProtection: '
- . $shutters->getWindProtectionStatus );
-
- if ( $ascDev->getAutoShuttersControlShading eq 'on'
- && $shutters->getRainProtectionStatus eq 'unprotected'
- && $shutters->getWindProtectionStatus eq 'unprotected' )
- {
- ShadingProcessing(
- $hash,
- $shuttersDev,
- $ascDev->getAzimuth,
- $ascDev->getElevation,
- $outTemp,
- $shutters->getShadingAzimuthLeft,
- $shutters->getShadingAzimuthRight
- );
-
- ASC_Debug( 'EventProcessingShadingBrightness: '
- . $shutters->getShuttersDev
- . ' - Alle Bedingungen zur weiteren Beschattungsverarbeitung sind erfüllt. Es wird nun die eigentliche Beschattungsfunktion aufgerufen'
- );
- }
- }
-
- return;
-}
-
-sub EventProcessingTwilightDevice {
- my ( $hash, $device, $events ) = @_;
-
- # Twilight
- # azimuth = azimuth = Sonnenwinkel
- # elevation = elevation = Sonnenhöhe
- #
- # Astro
- # SunAz = azimuth = Sonnenwinkel
- # SunAlt = elevation = Sonnenhöhe
-
- ASC_Debug( 'EventProcessingTwilightDevice: '
- . $shutters->getShuttersDev
- . ' - Event vom Astro oder Twilight Device wurde erkannt. Event wird verarbeitet'
- );
-
- if ( $events =~ m{(azimuth|elevation|SunAz|SunAlt):\s(\d+.\d+)}xms ) {
- my $name = $device;
- 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 = $ascDev->getAzimuth
- if ( !defined($azimuth) && !$azimuth );
- $elevation = $ascDev->getElevation
- if ( !defined($elevation) && !$elevation );
-
- ASC_Debug( 'EventProcessingTwilightDevice: '
- . $name
- . ' - Passendes Event wurde erkannt. Verarbeitung über alle Rollos beginnt'
- );
-
- 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 );
-
- ASC_Debug( 'EventProcessingTwilightDevice: '
- . $shutters->getShuttersDev
- . ' RainProtection: '
- . $shutters->getRainProtectionStatus
- . ' WindProtection: '
- . $shutters->getWindProtectionStatus );
-
- if ( $ascDev->getAutoShuttersControlShading eq 'on'
- && $shutters->getRainProtectionStatus eq 'unprotected'
- && $shutters->getWindProtectionStatus eq 'unprotected' )
- {
- ShadingProcessing(
- $hash,
- $shuttersDev,
- $azimuth,
- $elevation,
- $outTemp,
- $shutters->getShadingAzimuthLeft,
- $shutters->getShadingAzimuthRight
- );
-
- ASC_Debug( 'EventProcessingTwilightDevice: '
- . $shutters->getShuttersDev
- . ' - Alle Bedingungen zur weiteren Beschattungsverarbeitung sind erfüllt. Es wird nun die Beschattungsfunktion ausgeführt'
- );
- }
- }
- }
-
- return;
-}
-
-sub ShadingProcessing {
-### angleMinus ist $shutters->getShadingAzimuthLeft
-### anglePlus ist $shutters->getShadingAzimuthRight
-### winPos ist die Fensterposition $shutters->getDirection
- my ( $hash, $shuttersDev, $azimuth, $elevation, $outTemp,
- $azimuthLeft, $azimuthRight )
- = @_;
-
- my $name = $hash->{NAME};
- $shutters->setShuttersDev($shuttersDev);
- my $brightness = $shutters->getBrightnessAverage;
-
- ASC_Debug(
- 'ShadingProcessing: '
- . $shutters->getShuttersDev
- . ' - Übergebende Werte - Azimuth:'
- . $azimuth
- . ', Elevation: '
- . $elevation
- . ', Brightness: '
- . $brightness
- . ', OutTemp: '
- . $outTemp
- . ', Azimut Beschattung: '
- . $azimuthLeft
- . ', Azimut Endschattung: '
- . $azimuthRight
- . ', Ist es nach der Zeitblockadezeit: '
- . ( IsAfterShuttersTimeBlocking($shuttersDev) ? 'JA' : 'NEIN' )
- . ', Das Rollo ist in der Beschattung und wurde manuell gefahren: '
- . ( $shutters->getShadingManualDriveStatus ? 'JA' : 'NEIN' )
- . ', Ist es nach der Hälfte der Beschattungswartezeit: '
- . (
- ( int( gettimeofday() ) - $shutters->getShadingStatusTimestamp ) <
- ( $shutters->getShadingWaitingPeriod / 2 ) ? 'NEIN' : 'JA'
- )
- );
-
- Log3( $name, 4,
- "AutoShuttersControl ($name) - Shading Processing, Rollladen: "
- . $shuttersDev
- . " Azimuth: "
- . $azimuth
- . " Elevation: "
- . $elevation
- . " Brightness: "
- . $brightness
- . " OutTemp: "
- . $outTemp );
-
- return
- if ( $azimuth == -1
- || $elevation == -1
- || $brightness == -1
- || $outTemp == -100
- || ( int( gettimeofday() ) - $shutters->getShadingStatusTimestamp ) <
- ( $shutters->getShadingWaitingPeriod / 2 )
- || $shutters->getShadingMode eq 'off' );
-
- Log3( $name, 4,
- "AutoShuttersControl ($name) - Shading Processing, Rollladen: "
- . $shuttersDev
- . " Nach dem return" );
-
- my $getShadingPos = $shutters->getShadingPos;
- my $getStatus = $shutters->getStatus;
- my $oldShadingStatus = $shutters->getShadingStatus;
- my $shuttersDevHash = $defs{$shuttersDev};
-
- my $getModeUp = $shutters->getModeUp;
- my $homemode = $shutters->getHomemode;
-
- ASC_Debug( 'ShadingProcessing: '
- . $shutters->getShuttersDev
- . ' - Alle Werte für die weitere Verarbeitung sind korrekt vorhanden und es wird nun mit der Beschattungsverarbeitung begonnen'
- );
-
- if (
- (
- $outTemp < $shutters->getShadingMinOutsideTemperature - 4
- || $azimuth < $azimuthLeft
- || $azimuth > $azimuthRight
- || !$shutters->getIsDay
- )
- && $shutters->getShadingStatus ne 'out'
- )
- {
- # $shutters->setShadingLastStatus('in');
- $shutters->setShadingStatus('out');
-
- ASC_Debug( 'ShadingProcessing: '
- . $shutters->getShuttersDev
- . ' - Es ist Nacht oder die Aussentemperatur unterhalb der Shading Temperatur. Die Beschattung wird Zwangsbeendet'
- );
-
- Log3( $name, 4,
-"AutoShuttersControl ($name) - Shading Processing - Der Sonnenstand ist ausserhalb der Winkelangaben oder die Aussentemperatur unterhalb der Shading Temperatur "
- );
- }
- elsif ($azimuth < $azimuthLeft
- || $azimuth > $azimuthRight
- || $elevation < $shutters->getShadingMinElevation
- || $elevation > $shutters->getShadingMaxElevation
- || $brightness < $shutters->getShadingStateChangeCloudy
- || $outTemp < $shutters->getShadingMinOutsideTemperature - 1 )
- {
- $shutters->setShadingStatus('out reserved')
- if ( $shutters->getShadingStatus eq 'in'
- || $shutters->getShadingStatus eq 'in reserved' );
-
- if (
- (
- $shutters->getShadingStatus eq 'out reserved'
- and
- ( int( gettimeofday() ) - $shutters->getShadingStatusTimestamp )
- ) > $shutters->getShadingWaitingPeriod
- )
- {
- $shutters->setShadingStatus('out');
-
- # $shutters->setShadingLastStatus('in')
- # if ( $shutters->getShadingLastStatus eq 'out' );
- }
-
- Log3( $name, 4,
- "AutoShuttersControl ($name) - Shading Processing, Rollladen: "
- . $shuttersDev
- . " In der Out Abfrage, Shadingwert: "
- . $shutters->getShadingStatus
- . ", Zeitstempel: "
- . $shutters->getShadingStatusTimestamp );
-
- ASC_Debug( 'ShadingProcessing: '
- . $shutters->getShuttersDev
- . ' - Einer der Beschattungsbedingungen wird nicht mehr erfüllt und somit wird der Beschattungsstatus um eine Stufe reduziert. Alter Status: '
- . $oldShadingStatus
- . ' Neuer Status: '
- . $shutters->getShadingStatus );
- }
- elsif ($azimuth > $azimuthLeft
- && $azimuth < $azimuthRight
- && $elevation > $shutters->getShadingMinElevation
- && $elevation < $shutters->getShadingMaxElevation
- && $brightness > $shutters->getShadingStateChangeSunny
- && $outTemp > $shutters->getShadingMinOutsideTemperature )
- {
- if ( $shutters->getShadingStatus eq 'out'
- || $shutters->getShadingStatus eq 'out reserved' )
- {
- $shutters->setShadingStatus('in reserved');
-
- }
-
- if ( $shutters->getShadingStatus eq 'in reserved'
- and
- ( int( gettimeofday() ) - $shutters->getShadingStatusTimestamp ) >
- ( $shutters->getShadingWaitingPeriod / 2 ) )
- {
- $shutters->setShadingStatus('in');
-
- # $shutters->setShadingLastStatus('out')
- # if ( $shutters->getShadingLastStatus eq 'in' );
- }
-
- Log3( $name, 4,
- "AutoShuttersControl ($name) - Shading Processing, Rollladen: "
- . $shuttersDev
- . " In der In Abfrage, Shadingwert: "
- . $shutters->getShadingStatus
- . ", Zeitstempel: "
- . $shutters->getShadingStatusTimestamp );
-
- ASC_Debug( 'ShadingProcessing: '
- . $shutters->getShuttersDev
- . ' - Alle Beschattungsbedingungen wurden erfüllt und somit wird der Beschattungsstatus um eine Stufe angehoben. Alter Status: '
- . $oldShadingStatus
- . ' Neuer Status: '
- . $shutters->getShadingStatus );
- }
-
- ShadingProcessingDriveCommand( $hash, $shuttersDev )
- if (
- IsAfterShuttersTimeBlocking($shuttersDev)
- && !$shutters->getShadingManualDriveStatus
- && $shutters->getRoommatesStatus ne 'gotosleep'
- && $shutters->getRoommatesStatus ne 'asleep'
- && (
- (
- $shutters->getShadingStatus eq 'out'
- && $shutters->getShadingLastStatus eq 'in'
- )
- || ( $shutters->getShadingStatus eq 'in'
- && $shutters->getShadingLastStatus eq 'out' )
- )
- && ( $shutters->getShadingMode eq 'always'
- || $shutters->getShadingMode eq $homemode )
- && (
- $shutters->getModeUp eq 'always'
- || $shutters->getModeUp eq $homemode
- || $shutters->getModeUp eq 'off'
- || $shutters->getModeUp eq 'absent'
- || ( $shutters->getModeUp eq 'home'
- && $homemode ne 'asleep' )
- )
- && (
- (
- (
- int( gettimeofday() ) -
- $shutters->getShadingStatusTimestamp
- ) < 2
- && $shutters->getStatus != $shutters->getClosedPos
- )
- || ( !$shutters->getQueryShuttersPos( $shutters->getShadingPos )
- && $shutters->getIfInShading )
- || ( !$shutters->getIfInShading
- && $shutters->getStatus == $shutters->getShadingPos )
- )
- );
-
- readingsBeginUpdate($shuttersDevHash);
- readingsBulkUpdate(
- $shuttersDevHash,
- 'ASC_ShadingMessage',
- 'INFO: current shading status is \''
- . $shutters->getShadingStatus . '\''
- . ' - next check in '
- . (
- (
- (
- $shutters->getShadingLastStatus eq 'out reserved'
- || $shutters->getShadingLastStatus eq 'out'
- )
- ? $shutters->getShadingWaitingPeriod
- : $shutters->getShadingWaitingPeriod / 2
- )
- ) / 60
- . 'm'
- );
- readingsEndUpdate( $shuttersDevHash, 1 );
-
- return;
-}
-
-sub ShadingProcessingDriveCommand {
- my $hash = shift;
- my $shuttersDev = shift;
-
- my $name = $hash->{NAME};
- $shutters->setShuttersDev($shuttersDev);
-
- my $getShadingPos = $shutters->getShadingPos;
- my $getStatus = $shutters->getStatus;
-
- $shutters->setShadingStatus( $shutters->getShadingStatus );
-
- if (
- $shutters->getShadingStatus eq 'in'
- && $getShadingPos != $getStatus
- && ( CheckIfShuttersWindowRecOpen($shuttersDev) != 2
- || $shutters->getShuttersPlace ne 'terrace' )
- )
- {
- $shutters->setLastDrive('shading in');
- ShuttersCommandSet( $hash, $shuttersDev, $getShadingPos );
-
- ASC_Debug( 'ShadingProcessingDriveCommand: '
- . $shutters->getShuttersDev
- . ' - Der aktuelle Beschattungsstatus ist: '
- . $shutters->getShadingStatus
- . ' und somit wird nun in die Position: '
- . $getShadingPos
- . ' zum Beschatten gefahren' );
- }
- elsif ($shutters->getShadingStatus eq 'out'
- && $getShadingPos == $getStatus )
- {
- $shutters->setLastDrive('shading out');
-
- ShuttersCommandSet(
- $hash,
- $shuttersDev,
- (
- $getShadingPos == $shutters->getLastPos
- ? $shutters->getOpenPos
- : (
- $shutters->getQueryShuttersPos( $shutters->getLastPos )
- ? (
- $shutters->getLastPos == $shutters->getSleepPos
- ? $shutters->getOpenPos
- : $shutters->getLastPos
- )
- : $shutters->getOpenPos
- )
- )
- );
-
- ASC_Debug( 'ShadingProcessingDriveCommand: '
- . $shutters->getShuttersDev
- . ' - Der aktuelle Beschattungsstatus ist: '
- . $shutters->getShadingStatus
- . ' und somit wird nun in die Position: '
- . $getShadingPos
- . ' zum beenden der Beschattung gefahren' );
- }
-
- Log3( $name, 4,
-"AutoShuttersControl ($name) - Shading Processing - In der Routine zum fahren der Rollläden, Shading Wert: "
- . $shutters->getShadingStatus );
-
- ASC_Debug(
- 'ShadingProcessingDriveCommand: '
- . $shutters->getShuttersDev
- . ' - Der aktuelle Beschattungsstatus ist: '
- . $shutters->getShadingStatus
- . ', Beschattungsstatus Zeitstempel: '
- . strftime(
- "%Y.%m.%e %T", localtime( $shutters->getShadingStatusTimestamp )
- )
- );
-
- return;
-}
-
-sub EventProcessingPartyMode {
- my $hash = shift;
-
- my $name = $hash->{NAME};
-
- for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
- $shutters->setShuttersDev($shuttersDev);
- next
- if ( $shutters->getPartyMode eq 'off' );
-
- if ( !$shutters->getIsDay
- && $shutters->getModeDown ne 'off'
- && IsAfterShuttersManualBlocking($shuttersDev) )
- {
- if ( CheckIfShuttersWindowRecOpen($shuttersDev) == 2
- && $shutters->getSubTyp eq 'threestate' )
- {
- Log3( $name, 4,
-"AutoShuttersControl ($name) - EventProcessingPartyMode Fenster offen"
- );
- $shutters->setDelayCmd( $shutters->getClosedPos );
- Log3( $name, 4,
-"AutoShuttersControl ($name) - EventProcessingPartyMode - Spring in ShuttersCommandDelaySet"
- );
- }
- else {
- Log3( $name, 4,
-"AutoShuttersControl ($name) - EventProcessingPartyMode Fenster nicht offen"
- );
- $shutters->setLastDrive('drive after party mode');
- ShuttersCommandSet(
- $hash,
- $shuttersDev,
- (
- CheckIfShuttersWindowRecOpen($shuttersDev) == 0
- ? $shutters->getClosedPos
- : $shutters->getVentilatePos
- )
- );
- }
- }
- elsif ($shutters->getDelayCmd ne 'none'
- && $shutters->getIsDay
- && IsAfterShuttersManualBlocking($shuttersDev) )
- {
- $shutters->setLastDrive('drive after party mode');
- ShuttersCommandSet( $hash, $shuttersDev, $shutters->getDelayCmd );
- }
- }
-
- return;
-}
-
-sub EventProcessingAdvShuttersClose {
- my $hash = shift;
-
- my $name = $hash->{NAME};
-
- for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
- $shutters->setShuttersDev($shuttersDev);
- next
- if ( !$shutters->getAdv
- && !$shutters->getAdvDelay );
-
- $shutters->setLastDrive('adv delay close');
- $shutters->setAdvDelay(1);
- ShuttersCommandSet(
- $hash,
- $shuttersDev,
- (
- $shutters->getDelayCmd ne 'none'
- ? $shutters->getDelayCmd
- : $shutters->getClosedPos
- )
- );
- }
-
- return;
-}
-
-sub EventProcessingShutters {
- my ( $hash, $shuttersDev, $events ) = @_;
-
- my $name = $hash->{NAME};
-
- ASC_Debug( 'EventProcessingShutters: '
- . ' Fn wurde durch Notify aufgerufen da ASC_Pos_Reading Event erkannt wurde '
- . ' - RECEIVED EVENT: '
- . Dumper $events);
-
- if ( $events =~ m{.*:\s(\d+)}xms ) {
- $shutters->setShuttersDev($shuttersDev);
- $ascDev->setPosReading;
-
- ASC_Debug( 'EventProcessingShutters: '
- . $shutters->getShuttersDev
- . ' - Event vom Rollo erkannt. Es wird nun eine etwaige manuelle Fahrt ausgewertet.'
- . ' Int von gettimeofday: '
- . int( gettimeofday() )
- . ' Last Position Timestamp: '
- . $shutters->getLastPosTimestamp
- . ' Drive Up Max Duration: '
- . $shutters->getDriveUpMaxDuration
- . ' Last Position: '
- . $shutters->getLastPos
- . ' aktuelle Position: '
- . $shutters->getStatus );
-
- if ( ( int( gettimeofday() ) - $shutters->getLastPosTimestamp ) >
- $shutters->getDriveUpMaxDuration
- && ( int( gettimeofday() ) - $shutters->getLastManPosTimestamp ) >
- $shutters->getDriveUpMaxDuration )
- {
- $shutters->setLastDrive('manual');
- $shutters->setLastDriveReading;
- $ascDev->setStateReading;
- $shutters->setLastManPos($1);
-
- $shutters->setShadingManualDriveStatus(1)
- if ( $shutters->getIsDay
- && $shutters->getIfInShading );
-
- ASC_Debug(
- 'EventProcessingShutters: eine manualle Fahrt wurde erkannt!');
- }
- else {
- $shutters->setLastDriveReading;
- $ascDev->setStateReading;
-
- ASC_Debug(
-'EventProcessingShutters: eine automatisierte Fahrt durch ASC wurde erkannt! Es werden nun die LastDriveReading und StateReading Werte gesetzt!'
- );
- }
- }
-
- ASC_Debug( 'EventProcessingShutters: '
- . ' Fn wurde durlaufen und es sollten Debugausgaben gekommen sein. '
- . ' !!!Wenn nicht!!! wurde der Event nicht korrekt als Nummerisch erkannt. '
- );
-
- return;
-}
-
-sub EventProcessingExternalTriggerDevice {
- my ( $hash, $shuttersDev, $events ) = @_;
-
- my $name = $hash->{NAME};
-
- $shutters->setShuttersDev($shuttersDev);
-
- ASC_Debug( 'EventProcessingExternalTriggerDevice: '
- . ' Fn wurde durch Notify '
- . ' - RECEIVED EVENT: '
- . Dumper $events);
-
- my $reading = $shutters->getExternalTriggerReading;
- my $triggerValActive = $shutters->getExternalTriggerValueActive;
- my $triggerValActive2 = $shutters->getExternalTriggerValueActive2;
- my $triggerValInactive = $shutters->getExternalTriggerValueInactive;
- my $triggerPosActive = $shutters->getExternalTriggerPosActive;
- my $triggerPosActive2 = $shutters->getExternalTriggerPosActive2;
- my $triggerPosInactive = $shutters->getExternalTriggerPosInactive;
-
- if ( $events =~ m{$reading:\s($triggerValActive|$triggerValActive2)}xms ) {
-
- # && !$shutters->getQueryShuttersPos($triggerPosActive)
-
- ASC_Debug( 'EventProcessingExternalTriggerDevice: '
- . ' In der RegEx Schleife Trigger Val Aktiv'
- . ' - TriggerVal: '
- . $triggerValActive
- . ' - TriggerVal2: '
- . $triggerValActive2 );
-
- if ( $1 eq $triggerValActive2 ) {
- $shutters->setLastDrive('external trigger2 device active');
- $shutters->setNoDelay(1);
- $shutters->setExternalTriggerStatus(1);
- ShuttersCommandSet( $hash, $shuttersDev, $triggerPosActive2 );
- }
- else {
- $shutters->setLastDrive('external trigger device active');
- $shutters->setNoDelay(1);
- $shutters->setExternalTriggerStatus(1);
- ShuttersCommandSet( $hash, $shuttersDev, $triggerPosActive );
- }
- }
- elsif (
- $events =~ m{$reading:\s($triggerValInactive)}xms
- && ( $shutters->getPrivacyDownStatus != 2
- || $shutters->getPrivacyUpStatus != 2 )
- && !$shutters->getIfInShading
- )
- {
- ASC_Debug( 'EventProcessingExternalTriggerDevice: '
- . ' In der RegEx Schleife Trigger Val Inaktiv'
- . ' - TriggerVal: '
- . $triggerValInactive );
-
- $shutters->setLastDrive('external trigger device inactive');
- $shutters->setNoDelay(1);
- $shutters->setExternalTriggerStatus(1);
- ShuttersCommandSet(
- $hash,
- $shuttersDev,
- (
- $shutters->getIsDay
- ? $triggerPosInactive
- : $shutters->getClosedPos
- )
- );
- }
-
- ASC_Debug(
- 'EventProcessingExternalTriggerDevice: ' . ' Funktion durchlaufen' );
-
- return;
-}
-
# Sub für das Zusammensetzen der Rolläden Steuerbefehle
sub ShuttersCommandSet {
- my ( $hash, $shuttersDev, $posValue ) = @_;
+ my $hash = shift;
+ my $shuttersDev = shift;
+ my $posValue = shift;
my $name = $hash->{NAME};
$shutters->setShuttersDev($shuttersDev);
if (
(
- CheckIfShuttersWindowRecOpen($shuttersDev) == 2
+ CheckIfShuttersWindowRecOpen($shuttersDev) == 2
&& $shutters->getShuttersPlace eq 'terrace'
&& ( $shutters->getLockOut eq 'soft'
|| $shutters->getLockOut eq 'hard' )
@@ -3234,8 +1195,8 @@ sub RenewSunRiseSetShuttersTimer {
) == 0
)
{
-# $attr{$shuttersDev}{'ASC_Up'} = $shutters->getAttrUpdateChanges('ASC_Up')
-# if ( $shutters->getAttrUpdateChanges('ASC_Up') ne 'none' );
+ $attr{$shuttersDev}{'ASC_ShuttersPlace'} = $shutters->getAttrUpdateChanges('ASC_ShuttersPlace')
+ if ( $shutters->getAttrUpdateChanges('ASC_ShuttersPlace') ne 'none' );
# $attr{$shuttersDev}{'ASC_Down'} =
# $shutters->getAttrUpdateChanges('ASC_Down')
# if ( $shutters->getAttrUpdateChanges('ASC_Down') ne 'none' );
@@ -3740,844 +1701,6 @@ sub GetMonitoredDevs {
return $ret;
}
-#################################
-## my little helper
-#################################
-
-sub PositionValueWindowRec {
- my $shuttersDev = shift;
- my $posValue = shift;
-
- if ( CheckIfShuttersWindowRecOpen($shuttersDev) == 1
- && $shutters->getVentilateOpen eq 'on' )
- {
- $posValue = $shutters->getVentilatePos;
- }
- elsif (CheckIfShuttersWindowRecOpen($shuttersDev) == 2
- && $shutters->getSubTyp eq 'threestate'
- && $ascDev->getAutoShuttersControlComfort eq 'on' )
- {
- $posValue = $shutters->getComfortOpenPos;
- }
- elsif (
- CheckIfShuttersWindowRecOpen($shuttersDev) == 2
- && ( $shutters->getSubTyp eq 'threestate'
- || $shutters->getSubTyp eq 'twostate' )
- && $shutters->getVentilateOpen eq 'on'
- )
- {
- $posValue = $shutters->getVentilatePos;
- }
-
- if ( $shutters->getQueryShuttersPos($posValue) ) {
- $posValue = $shutters->getStatus;
- }
-
- return $posValue;
-}
-
-sub AutoSearchTwilightDev {
- my $hash = shift;
-
- my $name = $hash->{NAME};
-
- if ( devspec2array('TYPE=(Astro|Twilight)') > 0 ) {
- CommandAttr( undef,
- $name
- . ' ASC_twilightDevice '
- . ( devspec2array('TYPE=(Astro|Twilight)') )[0] )
- if ( AttrVal( $name, 'ASC_twilightDevice', 'none' ) eq 'none' );
- }
-
- return;
-}
-
-sub GetAttrValues {
- my ( $dev, $attribut, $default ) = @_;
-
- my @values = split( ' ',
- AttrVal( $dev, $attribut, ( defined($default) ? $default : 'none' ) ) );
- my ( $value1, $value2 ) = split( ':', $values[0] );
-
- my ( $value3, $value4, $value5, $value6, $value7, $value8 );
- ( $value3, $value4 ) = split( ':', $values[1] )
- if ( defined( $values[1] ) );
- ( $value5, $value6 ) = split( ':', $values[2] )
- if ( defined( $values[2] ) );
- ( $value7, $value8 ) = split( ':', $values[3] )
- if ( defined( $values[3] ) );
-
- return (
- $value1,
- defined($value2) ? $value2 : 'none',
- defined($value3) ? $value3 : 'none',
- defined($value4) ? $value4 : 'none',
- defined($value5) ? $value5 : 'none',
- defined($value6) ? $value6 : 'none',
- defined($value7) ? $value7 : 'none',
- defined($value8) ? $value8 : 'none'
- );
-}
-
-# Hilfsfunktion welche meinen ReadingString zum finden der getriggerten Devices und der Zurdnung was das Device überhaupt ist und zu welchen Rolladen es gehört aus liest und das Device extraiert
-sub ExtractNotifyDevFromEvent {
- my ( $hash, $shuttersDev, $shuttersAttr ) = @_;
-
- my %notifyDevs;
- while ( my $notifyDev = each %{ $hash->{monitoredDevs} } ) {
- Log3( $hash->{NAME}, 4,
-"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - NotifyDev: "
- . $notifyDev );
- Log3( $hash->{NAME}, 5,
-"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - ShuttersDev: "
- . $shuttersDev );
-
- if ( defined( $hash->{monitoredDevs}{$notifyDev}{$shuttersDev} )
- && $hash->{monitoredDevs}{$notifyDev}{$shuttersDev} eq
- $shuttersAttr )
- {
- Log3( $hash->{NAME}, 4,
-"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - ShuttersDevHash: "
- . $hash->{monitoredDevs}{$notifyDev}{$shuttersDev} );
- Log3( $hash->{NAME}, 5,
-"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - return ShuttersDev: "
- . $notifyDev );
- $notifyDevs{$notifyDev} = $shuttersDev;
- }
- }
- return \%notifyDevs;
-}
-
-## Ist Tag oder Nacht für den entsprechende Rolladen
-sub _IsDay {
- my $shuttersDev = shift;
-
- $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;
-
- ASC_Debug( 'FnIsDay: ' . $shuttersDev . ' Allgemein: ' . $respIsDay );
-
- if (
- (
- (
- (
- 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->getTimeUpLate ) / 86400
- )
- )
- || (
- int( gettimeofday() / 86400 ) != int(
- computeAlignTime( '24:00', $shutters->getTimeDownEarly ) /
- 86400
- )
- && int( gettimeofday() / 86400 ) == int(
- computeAlignTime( '24:00', $shutters->getTimeDownLate ) / 86400
- )
- )
- )
- {
- ##### Nach Sonnenuntergang / Abends
- $respIsDay = (
- (
- (
- $shutters->getBrightness > $brightnessMinVal
- && $isday
- && !$shutters->getSunset
- )
- || !$shutters->getSunset
- ) ? 1 : 0
- ) if ( $shutters->getDown eq 'brightness' );
-
- ASC_Debug( 'FnIsDay: '
- . $shuttersDev
- . ' getDownBrightness: '
- . $respIsDay
- . ' Brightness: '
- . $shutters->getBrightness
- . ' BrightnessMin: '
- . $brightnessMinVal
- . ' Sunset: '
- . $shutters->getSunset );
-
- ##### Nach Sonnenauf / Morgens
- $respIsDay = (
- (
- (
- $shutters->getBrightness > $brightnessMaxVal
- && !$isday
- && $shutters->getSunrise
- )
- || $respIsDay
- || $shutters->getSunrise
- ) ? 1 : 0
- ) if ( $shutters->getUp eq 'brightness' );
-
- ASC_Debug( 'FnIsDay: '
- . $shuttersDev
- . ' getUpBrightness: '
- . $respIsDay
- . ' Brightness: '
- . $shutters->getBrightness
- . ' BrightnessMax: '
- . $brightnessMaxVal
- . ' Sunrise: '
- . $shutters->getSunrise );
- }
-
- return $respIsDay;
-}
-
-sub ShuttersSunrise {
- my $shuttersDev = shift;
- my $tm = shift; # Tm steht für Timemode und bedeutet Realzeit oder Unixzeit
-
- my $autoAstroMode;
- $shutters->setShuttersDev($shuttersDev);
-
- if ( $shutters->getAutoAstroModeMorning ne 'none' ) {
- $autoAstroMode = $shutters->getAutoAstroModeMorning;
- $autoAstroMode =
- $autoAstroMode . '=' . $shutters->getAutoAstroModeMorningHorizon
- if ( $autoAstroMode eq 'HORIZON' );
- }
- else {
- $autoAstroMode = $ascDev->getAutoAstroModeMorning;
- $autoAstroMode =
- $autoAstroMode . '=' . $ascDev->getAutoAstroModeMorningHorizon
- if ( $autoAstroMode eq 'HORIZON' );
- }
- my $oldFuncHash = $shutters->getInTimerFuncHash;
- my $shuttersSunriseUnixtime =
- computeAlignTime( '24:00', sunrise( 'REAL', 0, '4:30', '8:30' ) );
-
- if ( $tm eq 'unix' ) {
- if ( $shutters->getUp eq 'astro' ) {
- if ( ( IsWe() || IsWe('tomorrow') )
- && $ascDev->getSunriseTimeWeHoliday eq 'on'
- && $shutters->getTimeUpWeHoliday ne '01:25' )
- {
- if ( !IsWe('tomorrow') ) {
- if (
- IsWe()
- && int( gettimeofday() / 86400 ) == int(
- (
- computeAlignTime(
- '24:00',
- sunrise_abs(
- $autoAstroMode, 0,
- $shutters->getTimeUpWeHoliday
- )
- ) + 1
- ) / 86400
- )
- )
- {
- $shuttersSunriseUnixtime = (
- computeAlignTime(
- '24:00',
- sunrise_abs(
- $autoAstroMode, 0,
- $shutters->getTimeUpWeHoliday
- )
- ) + 1
- );
- }
- elsif (
- int( gettimeofday() / 86400 ) == int(
- (
- computeAlignTime(
- '24:00',
- sunrise_abs(
- $autoAstroMode,
- 0,
- $shutters->getTimeUpEarly,
- $shutters->getTimeUpLate
- )
- ) + 1
- ) / 86400
- )
- )
- {
- $shuttersSunriseUnixtime = (
- computeAlignTime(
- '24:00',
- sunrise_abs(
- $autoAstroMode, 0,
- $shutters->getTimeUpWeHoliday
- )
- ) + 1
- );
- }
- else {
- $shuttersSunriseUnixtime = (
- computeAlignTime(
- '24:00',
- sunrise_abs(
- $autoAstroMode,
- 0,
- $shutters->getTimeUpEarly,
- $shutters->getTimeUpLate
- )
- ) + 1
- );
- }
- }
- else {
- if (
- IsWe()
- && (
- int( gettimeofday() / 86400 ) == int(
- (
- computeAlignTime(
- '24:00',
- sunrise_abs(
- $autoAstroMode, 0,
- $shutters->getTimeUpWeHoliday
- )
- ) + 1
- ) / 86400
- )
- || int( gettimeofday() / 86400 ) != int(
- (
- computeAlignTime(
- '24:00',
- sunrise_abs(
- $autoAstroMode, 0,
- $shutters->getTimeUpWeHoliday
- )
- ) + 1
- ) / 86400
- )
- )
- )
- {
- $shuttersSunriseUnixtime = (
- computeAlignTime(
- '24:00',
- sunrise_abs(
- $autoAstroMode, 0,
- $shutters->getTimeUpWeHoliday
- )
- ) + 1
- );
- }
- elsif (
- int( gettimeofday() / 86400 ) == int(
- (
- computeAlignTime(
- '24:00',
- sunrise_abs(
- $autoAstroMode,
- 0,
- $shutters->getTimeUpEarly,
- $shutters->getTimeUpLate
- )
- ) + 1
- ) / 86400
- )
- )
- {
- $shuttersSunriseUnixtime = (
- computeAlignTime(
- '24:00',
- sunrise_abs(
- $autoAstroMode,
- 0,
- $shutters->getTimeUpEarly,
- $shutters->getTimeUpLate
- )
- ) + 1
- );
- }
- else {
- if (
- int( gettimeofday() / 86400 ) == int(
- (
- computeAlignTime(
- '24:00',
- sunrise_abs(
- $autoAstroMode, 0,
- $shutters->getTimeUpWeHoliday
- )
- ) + 1
- ) / 86400
- )
- )
- {
- $shuttersSunriseUnixtime = (
- computeAlignTime(
- '24:00',
- sunrise_abs(
- $autoAstroMode, 0,
- $shutters->getTimeUpWeHoliday
- )
- ) + 86401
- );
- }
- else {
- $shuttersSunriseUnixtime = (
- computeAlignTime(
- '24:00',
- sunrise_abs(
- $autoAstroMode, 0,
- $shutters->getTimeUpWeHoliday
- )
- ) + 1
- );
- }
- }
- }
- }
- else {
- $shuttersSunriseUnixtime = (
- computeAlignTime(
- '24:00',
- sunrise_abs(
- $autoAstroMode,
- 0,
- $shutters->getTimeUpEarly,
- $shutters->getTimeUpLate
- )
- ) + 1
- );
- }
- if ( defined($oldFuncHash)
- && ref($oldFuncHash) eq 'HASH'
- && ( IsWe() || IsWe('tomorrow') )
- && $ascDev->getSunriseTimeWeHoliday eq 'on'
- && $shutters->getTimeUpWeHoliday ne '01:25' )
- {
- if ( !IsWe('tomorrow') ) {
- if (
- int( gettimeofday() / 86400 ) == int(
- (
- computeAlignTime(
- '24:00',
- sunrise_abs(
- $autoAstroMode,
- 0,
- $shutters->getTimeUpEarly,
- $shutters->getTimeUpLate
- )
- ) + 1
- ) / 86400
- )
- )
- {
- $shuttersSunriseUnixtime =
- ( $shuttersSunriseUnixtime + 86400 )
- if ( $shuttersSunriseUnixtime <
- ( $oldFuncHash->{sunrisetime} + 180 )
- && $oldFuncHash->{sunrisetime} < gettimeofday() );
- }
- }
- }
- elsif ( defined($oldFuncHash) && ref($oldFuncHash) eq 'HASH' ) {
- $shuttersSunriseUnixtime = ( $shuttersSunriseUnixtime + 86400 )
- if ( $shuttersSunriseUnixtime <
- ( $oldFuncHash->{sunrisetime} + 180 )
- && $oldFuncHash->{sunrisetime} < gettimeofday() );
- }
- }
- elsif ( $shutters->getUp eq 'time' ) {
- if ( ( IsWe() || IsWe('tomorrow') )
- && $ascDev->getSunriseTimeWeHoliday eq 'on'
- && $shutters->getTimeUpWeHoliday ne '01:25' )
- {
- if ( !IsWe('tomorrow') ) {
- if (
- int( gettimeofday() / 86400 ) == int(
- computeAlignTime( '24:00',
- $shutters->getTimeUpWeHoliday ) / 86400
- )
- )
- {
- $shuttersSunriseUnixtime =
- computeAlignTime( '24:00',
- $shutters->getTimeUpWeHoliday );
- }
- elsif (
- int( gettimeofday() / 86400 ) == int(
- computeAlignTime( '24:00',
- $shutters->getTimeUpEarly ) / 86400
- )
- && $shutters->getSunrise
- )
- {
- $shuttersSunriseUnixtime =
- computeAlignTime( '24:00', $shutters->getTimeUpEarly )
- + 86400;
- }
- else {
- $shuttersSunriseUnixtime =
- computeAlignTime( '24:00',
- $shutters->getTimeUpEarly );
- }
- }
- else {
- if (
- IsWe()
- && int( gettimeofday() / 86400 ) == int(
- computeAlignTime( '24:00',
- $shutters->getTimeUpWeHoliday ) / 86400
- )
- )
- {
- $shuttersSunriseUnixtime =
- computeAlignTime( '24:00',
- $shutters->getTimeUpWeHoliday );
- }
- elsif (
- int( gettimeofday() / 86400 ) == int(
- computeAlignTime( '24:00',
- $shutters->getTimeUpEarly ) / 86400
- )
- )
- {
- $shuttersSunriseUnixtime =
- computeAlignTime( '24:00',
- $shutters->getTimeUpEarly );
- }
- elsif (
- int( gettimeofday() / 86400 ) != int(
- computeAlignTime( '24:00',
- $shutters->getTimeUpWeHoliday ) / 86400
- )
- )
- {
- $shuttersSunriseUnixtime =
- computeAlignTime( '24:00',
- $shutters->getTimeUpWeHoliday );
- }
- else {
- $shuttersSunriseUnixtime =
- computeAlignTime( '24:00',
- $shutters->getTimeUpWeHoliday ) + 86400;
- }
- }
- }
- else {
- $shuttersSunriseUnixtime =
- computeAlignTime( '24:00', $shutters->getTimeUpEarly );
- }
- }
- elsif ( $shutters->getUp eq 'brightness' ) {
- if ( ( IsWe() || IsWe('tomorrow') )
- && $ascDev->getSunriseTimeWeHoliday eq 'on'
- && $shutters->getTimeUpWeHoliday ne '01:25' )
- {
- if ( !IsWe('tomorrow') ) {
- if (
- IsWe()
- && int( gettimeofday() / 86400 ) == int(
- (
- computeAlignTime(
- '24:00', $shutters->getTimeUpWeHoliday
- )
- ) / 86400
- )
- )
- {
- $shuttersSunriseUnixtime =
- computeAlignTime( '24:00',
- $shutters->getTimeUpWeHoliday );
- }
- elsif (
- int( gettimeofday() / 86400 ) == int(
- (
- computeAlignTime(
- '24:00', $shutters->getTimeUpLate
- )
- ) / 86400
- )
- )
- {
- $shuttersSunriseUnixtime =
- computeAlignTime( '24:00',
- $shutters->getTimeUpWeHoliday );
- }
- else {
- $shuttersSunriseUnixtime =
- computeAlignTime( '24:00', $shutters->getTimeUpLate );
- }
- }
- else {
- if (
- IsWe()
- && (
- int( gettimeofday() / 86400 ) == int(
- (
- computeAlignTime(
- '24:00', $shutters->getTimeUpWeHoliday
- )
- ) / 86400
- )
- || int( gettimeofday() / 86400 ) != int(
- (
- computeAlignTime(
- '24:00', $shutters->getTimeUpWeHoliday
- )
- ) / 86400
- )
- )
- )
- {
- $shuttersSunriseUnixtime =
- computeAlignTime( '24:00',
- $shutters->getTimeUpWeHoliday );
- }
- elsif (
- int( gettimeofday() / 86400 ) == int(
- (
- computeAlignTime(
- '24:00', $shutters->getTimeUpLate
- )
- ) / 86400
- )
- )
- {
- $shuttersSunriseUnixtime =
- computeAlignTime( '24:00', $shutters->getTimeUpLate );
- }
- else {
- if (
- int( gettimeofday() / 86400 ) == int(
- (
- computeAlignTime(
- '24:00', $shutters->getTimeUpWeHoliday
- )
- ) / 86400
- )
- )
- {
- $shuttersSunriseUnixtime =
- computeAlignTime( '24:00',
- $shutters->getTimeUpWeHoliday );
- }
- else {
- $shuttersSunriseUnixtime =
- computeAlignTime( '24:00',
- $shutters->getTimeUpWeHoliday );
- }
- }
- }
- }
- else {
-
- $shuttersSunriseUnixtime =
- computeAlignTime( '24:00', $shutters->getTimeUpLate );
- }
- }
-
- return $shuttersSunriseUnixtime;
- }
- elsif ( $tm eq 'real' ) {
- return sunrise_abs( $autoAstroMode, 0, $shutters->getTimeUpEarly,
- $shutters->getTimeUpLate )
- if ( $shutters->getUp eq 'astro' );
- return $shutters->getTimeUpEarly if ( $shutters->getUp eq 'time' );
- }
-
- return;
-}
-
-sub IsAfterShuttersTimeBlocking {
- my $shuttersDev = shift;
-
- $shutters->setShuttersDev($shuttersDev);
-
- if (
- ( int( gettimeofday() ) - $shutters->getLastManPosTimestamp ) <
- $shutters->getBlockingTimeAfterManual
- || ( !$shutters->getIsDay
- && defined( $shutters->getSunriseUnixTime )
- && $shutters->getSunriseUnixTime - ( int( gettimeofday() ) ) <
- $shutters->getBlockingTimeBeforDayOpen )
- || ( $shutters->getIsDay
- && defined( $shutters->getSunriseUnixTime )
- && $shutters->getSunsetUnixTime - ( int( gettimeofday() ) ) <
- $shutters->getBlockingTimeBeforNightClose )
- )
- {
- return 0;
- }
-
- else { return 1 }
-}
-
-sub IsAfterShuttersManualBlocking {
- my $shuttersDev = shift;
- $shutters->setShuttersDev($shuttersDev);
-
- if ( $ascDev->getBlockAscDrivesAfterManual
- && $shutters->getStatus != $shutters->getOpenPos
- && $shutters->getStatus != $shutters->getClosedPos
- && $shutters->getStatus != $shutters->getWindPos
- && $shutters->getStatus != $shutters->getShadingPos
- && $shutters->getStatus != $shutters->getComfortOpenPos
- && $shutters->getStatus != $shutters->getVentilatePos
- && $shutters->getStatus != $shutters->getAntiFreezePos
- && $shutters->getLastDrive eq 'manual' )
- {
- return 0;
- }
- elsif ( ( int( gettimeofday() ) - $shutters->getLastManPosTimestamp ) <
- $shutters->getBlockingTimeAfterManual )
- {
- return 0;
- }
-
- else { return 1 }
-}
-
-sub ShuttersSunset {
- my $shuttersDev = shift;
- my $tm = shift; # Tm steht für Timemode und bedeutet Realzeit oder Unixzeit
-
- my $autoAstroMode;
- $shutters->setShuttersDev($shuttersDev);
-
- if ( $shutters->getAutoAstroModeEvening ne 'none' ) {
- $autoAstroMode = $shutters->getAutoAstroModeEvening;
- $autoAstroMode =
- $autoAstroMode . '=' . $shutters->getAutoAstroModeEveningHorizon
- if ( $autoAstroMode eq 'HORIZON' );
- }
- else {
- $autoAstroMode = $ascDev->getAutoAstroModeEvening;
- $autoAstroMode =
- $autoAstroMode . '=' . $ascDev->getAutoAstroModeEveningHorizon
- if ( $autoAstroMode eq 'HORIZON' );
- }
- my $oldFuncHash = $shutters->getInTimerFuncHash;
- my $shuttersSunsetUnixtime =
- computeAlignTime( '24:00', sunset( 'REAL', 0, '15:30', '21:30' ) );
-
- if ( $tm eq 'unix' ) {
- if ( $shutters->getDown eq 'astro' ) {
- $shuttersSunsetUnixtime = (
- computeAlignTime(
- '24:00',
- sunset_abs(
- $autoAstroMode,
- 0,
- $shutters->getTimeDownEarly,
- $shutters->getTimeDownLate
- )
- ) + 1
- );
- if ( defined($oldFuncHash) && ref($oldFuncHash) eq 'HASH' ) {
- $shuttersSunsetUnixtime += 86400
- if ( $shuttersSunsetUnixtime <
- ( $oldFuncHash->{sunsettime} + 180 )
- && $oldFuncHash->{sunsettime} < gettimeofday() );
- }
- }
- elsif ( $shutters->getDown eq 'time' ) {
- $shuttersSunsetUnixtime =
- computeAlignTime( '24:00', $shutters->getTimeDownEarly );
- }
- elsif ( $shutters->getDown eq 'brightness' ) {
- $shuttersSunsetUnixtime =
- computeAlignTime( '24:00', $shutters->getTimeDownLate );
- }
- return $shuttersSunsetUnixtime;
- }
- elsif ( $tm eq 'real' ) {
- return sunset_abs(
- $autoAstroMode, 0,
- $shutters->getTimeDownEarly,
- $shutters->getTimeDownLate
- ) if ( $shutters->getDown eq 'astro' );
- return $shutters->getTimeDownEarly
- if ( $shutters->getDown eq 'time' );
- }
-
- return;
-}
-
-## Kontrolliert ob das Fenster von einem bestimmten Rolladen offen ist
-sub CheckIfShuttersWindowRecOpen {
- my $shuttersDev = shift;
- $shutters->setShuttersDev($shuttersDev);
-
- if ( $shutters->getWinStatus =~
- m{[Oo]pen|false}xms ) # CK: covers: open|opened
- {
- return 2;
- }
- elsif ($shutters->getWinStatus =~ m{tilt}xms
- && $shutters->getSubTyp eq 'threestate' ) # CK: covers: tilt|tilted
- {
- return 1;
- }
- elsif ( $shutters->getWinStatus =~ m{[Cc]lose|true}xms ) {
- return 0;
- } # CK: covers: close|closed
-}
-
-sub makeReadingName {
- my ($rname) = shift;
- my %charHash = (
- chr(0xe4) => "ae", # ä
- chr(0xc4) => "Ae", # Ä
- chr(0xfc) => "ue", # ü
- chr(0xdc) => "Ue", # Ü
- chr(0xf6) => "oe", # ö
- chr(0xd6) => "Oe", # Ö
- chr(0xdf) => "ss" # ß
- );
- my $charHashkeys = join( "", keys(%charHash) );
-
- return $rname if ( $rname =~ m{^\./}xms );
- $rname =~ s/([$charHashkeys])/$charHash{$1}/xgi;
- $rname =~ s/[^a-z0-9._\-\/]/_/xgi;
- return $rname;
-}
-
-sub TimeMin2Sec {
- my $min = shift;
- my $sec;
-
- $sec = $min * 60;
- return $sec;
-}
-
-sub IsWe {
- return main::IsWe( shift, shift );
-}
-
sub _DetermineSlatCmd {
my $value = shift;
my $posValue = shift;
@@ -4615,11 +1738,9 @@ sub _SetCmdFn {
my $idleDetection = $shutters->getIdleDetection;
return
- if (
- $shutters->getASCenable eq 'off'
- || $ascDev->getASCenable eq 'off'
- || $idleDetection !~ m{^$idleDetectionValue$}xms
- );
+ if ( $shutters->getASCenable eq 'off'
+ || $ascDev->getASCenable eq 'off'
+ || $idleDetection !~ m{^$idleDetectionValue$}xms );
if ( $shutters->getStatus != $posValue ) {
$shutters->setLastPos( $shutters->getStatus );
@@ -4699,10 +1820,10 @@ sub _SetCmdFn {
CommandSet( undef,
$shuttersDev
- . ':FILTER='
- . $shutters->getPosCmd . '!='
- . $posValue . ' '
- . $driveCommand );
+ . ':FILTER='
+ . $shutters->getPosCmd . '!='
+ . $posValue . ' '
+ . $driveCommand );
InternalTimer(
gettimeofday() + 3,
@@ -4710,18 +1831,18 @@ sub _SetCmdFn {
CommandSet(
undef,
(
- $shutters->getSlatDevice ne 'none'
+ $shutters->getSlatDevice ne 'none'
? $shutters->getSlatDevice
: $shuttersDev
- )
- . ' '
- . $shutters->getSlatPosCmd . ' '
- . $slatPos
+ )
+ . ' '
+ . $shutters->getSlatPosCmd . ' '
+ . $slatPos
);
},
$shuttersDev
- )
- if ( $slatPos > -1
+ )
+ if ( $slatPos > -1
&& $shutters->getSlatPosCmd ne 'none' );
$shutters->setSelfDefenseAbsent( 0, 0 )
@@ -4759,24 +1880,6 @@ sub ASC_Debug {
return;
}
-sub _averageBrightness {
- my @input = @_;
- use List::Util qw(sum);
-
- return int( sum(@input) / @input );
-}
-
-sub _perlCodeCheck {
- my $exec = shift;
- my $val = undef;
-
- if ( $exec =~ m{\A\{(.+)\}\z}xms ) {
- $val = main::AnalyzePerlCommand( undef, $1 );
- }
-
- return $val;
-}
-
sub PrivacyUpTime {
my $shuttersDevHash = shift;
my $shuttersSunriseUnixtime = shift;
@@ -4864,28 +1967,6 @@ sub PrivacyDownTime {
return $shuttersSunsetUnixtime;
}
-sub _IsAdv {
- my ( undef, undef, undef, $monthday, $month, $year, undef, undef, undef ) =
- localtime( gettimeofday() );
- my $adv = 0;
- $year += 1900;
-
- if ( $month < 1 ) {
- if ( $monthday < 7 ) {
- $adv = 1;
- }
- }
- else {
- my $time = HTTP::Date::str2time( $year . '-12-25' );
- my $wday = ( localtime($time) )[6];
- $wday = $wday ? $wday : 7;
- $time -= ( $wday + 21 ) * 86400;
- $adv = 1 if ( $time < time );
- }
-
- return $adv;
-}
-
sub DevStateIcon {
my $hash = shift;
@@ -4949,101 +2030,17 @@ sub DevStateIcon {
return;
}
-sub _CheckASC_ConditionsForShadingFn {
+sub RemoveShuttersTimer {
my $hash = shift;
- my $error;
-
- $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' );
-
- my $count = 1;
for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
- InternalTimer(
- gettimeofday() + $count,
-'FHEM::Automation::ShuttersControl::_CheckShuttersConditionsForShadingFn',
- $shuttersDev
- );
+ $shutters->setShuttersDev($shuttersDev);
- $count++;
+ RemoveInternalTimer( $shutters->getInTimerFuncHash );
+ $shutters->setInTimerFuncHash(undef);
}
- return (
- defined($error)
- ? $error
- : 'none'
- );
+ return;
}
-sub _CheckShuttersConditionsForShadingFn {
- my $shuttersDev = shift;
-
- $shutters->setShuttersDev($shuttersDev);
- my $shuttersDevHash = $defs{$shuttersDev};
- my $message = '';
- my $errorMessage;
- my $warnMessage;
- my $infoMessage;
-
- $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 eq 'off'
- && $ascDev->getAutoShuttersControlShading eq 'on'
- ? ' global shading active but ASC_Shading_Mode attribut is not set or off'
- : ''
- );
-
- $errorMessage .= (
- $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 '
- . ''
- . ReadingsVal( $shuttersDev, 'associatedWith', 'ASC device' )
- . ''
- : ''
- );
-
- $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 ''
- && $errorMessage eq '' );
-
- $message .= ' INFO: ' . $infoMessage
- if ( defined($infoMessage)
- && $infoMessage ne ''
- && $errorMessage eq '' );
-
- readingsBeginUpdate($shuttersDevHash);
- readingsBulkUpdateIfChanged( $shuttersDevHash, 'ASC_ShadingMessage',
- '' . $message . ' ' );
- readingsEndUpdate( $shuttersDevHash, 1 );
-}
-
-
-
-
1;
diff --git a/fhem/lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm b/fhem/lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm
index 3fa278bb5..21e350b24 100644
--- a/fhem/lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm
+++ b/fhem/lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm
@@ -264,13 +264,19 @@ sub _getRainSensor {
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 );
+ ( $reading ne 'none' ? $reading : 'rain' );
+ $self->{ASC_rainSensor}->{triggermax} = (
+ ( $max ne 'none'
+ && $max =~ m{\A(-?\d+(\.\d+)?)\z}xms )
+ ? $max
+ : 1000 );
+
$self->{ASC_rainSensor}->{triggerhyst} = (
$hyst ne 'none'
- ? $max - $hyst
+ ? $self->{ASC_rainSensor}->{triggermax} - $hyst
: ( $self->{ASC_rainSensor}->{triggermax} * 0 )
);
+
$self->{ASC_rainSensor}->{shuttersClosedPos} =
( $pos ne 'none'
? $pos
@@ -386,4 +392,7 @@ sub getBlockAscDrivesAfterManual {
return AttrVal( $name, 'ASC_blockAscDrivesAfterManual', 0 );
}
+
+
+
1;
diff --git a/fhem/lib/FHEM/Automation/ShuttersControl/EventProcessingFunctions.pm b/fhem/lib/FHEM/Automation/ShuttersControl/EventProcessingFunctions.pm
new file mode 100644
index 000000000..a6d2afe2a
--- /dev/null
+++ b/fhem/lib/FHEM/Automation/ShuttersControl/EventProcessingFunctions.pm
@@ -0,0 +1,2453 @@
+###############################################################################
+#
+# Developed with Kate
+#
+# (c) 2018-2020 Copyright: Marko Oldenburg (fhemsupport@cooltux.net)
+# 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$
+#
+###############################################################################
+
+## unserer packagename
+package FHEM::Automation::ShuttersControl::EventProcessingFunctions;
+
+use strict;
+use warnings;
+use POSIX qw(strftime);
+use utf8;
+
+use Data::Dumper; #only for Debugging
+
+use FHEM::Automation::ShuttersControl::Helper qw (:ALL);
+use FHEM::Automation::ShuttersControl::Shading qw (:ALL);
+
+require Exporter;
+our @ISA = qw(Exporter);
+our @EXPORT_OK = qw(
+ EventProcessingPartyMode
+ EventProcessingGeneral
+ EventProcessingShutters
+ EventProcessingAdvShuttersClose
+);
+our %EXPORT_TAGS = (
+ ALL => [
+ qw(
+ EventProcessingPartyMode
+ EventProcessingGeneral
+ EventProcessingShutters
+ EventProcessingAdvShuttersClose
+ )
+ ],
+);
+
+use GPUtils qw(GP_Import);
+## Import der FHEM Funktionen
+BEGIN {
+ GP_Import(
+ qw(
+ Log3
+ gettimeofday
+ computeAlignTime
+ CommandSet
+ ReadingsVal
+ RemoveInternalTimer
+ )
+ );
+}
+
+sub EventProcessingGeneral {
+ my $hash = shift;
+ my $devname = shift;
+ my $events = shift;
+
+ my $name = $hash->{NAME};
+
+ if ( defined($devname) && ($devname) )
+ { # es wird lediglich der Devicename der Funktion mitgegeben wenn es sich nicht um global handelt daher hier die Unterscheidung
+ my $windReading = $FHEM::Automation::ShuttersControl::ascDev->getWindSensorReading // 'none';
+ my $rainReading = $FHEM::Automation::ShuttersControl::ascDev->getRainSensorReading // 'none';
+
+ while ( my ( $device, $deviceAttr ) =
+ each %{ $hash->{monitoredDevs}{$devname} } )
+ {
+ if ( $device eq $name ) {
+ EventProcessingResidents( $hash, $device, $events )
+ if ( $deviceAttr eq 'ASC_residentsDev' );
+ EventProcessingRain( $hash, $device, $events )
+ if ( $events =~ m{$rainReading}xms );
+ EventProcessingWind( $hash, $device, $events )
+ if ( $events =~ m{$windReading}xms );
+
+ EventProcessingTwilightDevice( $hash, $device, $events )
+ if ( $deviceAttr eq 'ASC_twilightDevice' );
+ }
+
+ EventProcessingWindowRec( $hash, $device, $events )
+ if ( $deviceAttr eq 'ASC_WindowRec' )
+ ; # ist es ein Fensterdevice wird die Funktion gestartet
+ EventProcessingRoommate( $hash, $device, $events )
+ if ( $deviceAttr eq 'ASC_Roommate_Device' )
+ ; # ist es ein Bewohner Device wird diese Funktion gestartet
+
+ EventProcessingExternalTriggerDevice( $hash, $device, $events )
+ if ( $deviceAttr eq 'ASC_ExternalTrigger' );
+
+ $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($device)
+ if ( $deviceAttr eq 'ASC_BrightnessSensor' );
+
+ if (
+ $deviceAttr eq 'ASC_BrightnessSensor'
+ && ( $FHEM::Automation::ShuttersControl::shutters->getDown eq 'brightness'
+ || $FHEM::Automation::ShuttersControl::shutters->getUp eq 'brightness' )
+ )
+ {
+ EventProcessingBrightness( $hash, $device, $events );
+ }
+ elsif ( $deviceAttr eq 'ASC_BrightnessSensor' ) {
+ EventProcessingShadingBrightness( $hash, $device, $events );
+ }
+ }
+ }
+ else { # alles was kein Devicenamen mit übergeben hat landet hier
+ if (
+ $events =~ m{^ATTR\s(.*)
+ \s(ASC_Roommate_Device|ASC_WindowRec|ASC_residentsDev|ASC_rainSensor
+ |ASC_windSensor|ASC_BrightnessSensor|ASC_ExternalTrigger
+ |ASC_twilightDevice)
+ \s(.*)$}xms
+ )
+ { # wurde den Attributen unserer Rolläden ein Wert zugewiesen ?
+ FHEM::Automation::ShuttersControl::AddNotifyDev( $hash, $3, $1, $2 ) if ( $3 ne 'none' );
+ Log3( $name, 4,
+ "AutoShuttersControl ($name) - EventProcessing: ATTR" );
+ }
+ elsif (
+ $events =~ m{^DELETEATTR
+ \s(.*)\s(ASC_Roommate_Device
+ |ASC_WindowRec|ASC_residentsDev|ASC_rainSensor
+ |ASC_windSensor|ASC_BrightnessSensor|ASC_ExternalTrigger
+ |ASC_twilightDevice)
+ $}xms
+ )
+ { # wurde das Attribut unserer Rolläden gelöscht ?
+ Log3( $name, 4,
+ "AutoShuttersControl ($name) - EventProcessing: DELETEATTR" );
+ FHEM::Automation::ShuttersControl::DeleteNotifyDev( $hash, $1, $2 );
+ }
+ elsif (
+ $events =~ m{^(DELETEATTR|ATTR)
+ \s(.*)\s(ASC_Time_Up_WE_Holiday|ASC_Up|ASC_Down
+ |ASC_AutoAstroModeMorning|ASC_AutoAstroModeMorningHorizon
+ |ASC_PrivacyDownValue_beforeNightClose
+ |ASC_PrivacyUpValue_beforeDayOpen|ASC_AutoAstroModeEvening
+ |ASC_AutoAstroModeEveningHorizon|ASC_Time_Up_Early
+ |ASC_Time_Up_Late|ASC_Time_Down_Early|ASC_Time_Down_Late)
+ (.*)?}xms
+ )
+ {
+ FHEM::Automation::ShuttersControl::CreateSunRiseSetShuttersTimer( $hash, $2 )
+ if (
+ $3 ne 'ASC_Time_Up_WE_Holiday'
+ || ( $3 eq 'ASC_Time_Up_WE_Holiday'
+ && $FHEM::Automation::ShuttersControl::ascDev->getSunriseTimeWeHoliday eq 'on' )
+ );
+ }
+ elsif (
+ $events =~ m{^(DELETEATTR|ATTR)
+ \s(.*)\s(ASC_autoAstroModeMorning|ASC_autoAstroModeMorningHorizon
+ |ASC_autoAstroModeEvening|ASC_autoAstroModeEveningHorizon)
+ (.*)?}xms
+ )
+ {
+ FHEM::Automation::ShuttersControl::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;
+}
+
+## Sub zum steuern der Rolläden bei einem Fenster Event
+sub EventProcessingWindowRec {
+ my $hash = shift;
+ my $shuttersDev = shift;
+ my $events = shift;
+
+ my $name = $hash->{NAME};
+
+ my $reading =
+ $FHEM::Automation::ShuttersControl::shutters->getWinDevReading;
+
+ if ( $events =~
+ m{.*$reading:.*?([Oo]pen(?>ed)?|[Cc]losed?|tilt(?>ed)?|true|false)}xms
+ && IsAfterShuttersManualBlocking($shuttersDev) )
+ {
+ my $match = $1;
+
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'EventProcessingWindowRec: '
+ . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
+ . ' - RECEIVED EVENT: '
+ . $events
+ . ' - IDENTIFIED EVENT: '
+ . $1
+ . ' - STORED EVENT: '
+ . $match );
+
+ $FHEM::Automation::ShuttersControl::shutters->setShuttersDev(
+ $shuttersDev);
+ my $homemode =
+ $FHEM::Automation::ShuttersControl::shutters->getRoommatesStatus;
+ $homemode =
+ $FHEM::Automation::ShuttersControl::ascDev->getResidentsStatus
+ if ( $homemode eq 'none' );
+
+ #### Hardware Lock der Rollläden
+ $FHEM::Automation::ShuttersControl::shutters->setHardLockOut('off')
+ if ( $match =~ m{[Cc]lose|true}xms
+ && $FHEM::Automation::ShuttersControl::shutters->getShuttersPlace
+ eq 'terrace' );
+ $FHEM::Automation::ShuttersControl::shutters->setHardLockOut('on')
+ if ( $match =~ m{[Oo]pen|false}xms
+ && $FHEM::Automation::ShuttersControl::shutters->getShuttersPlace
+ eq 'terrace' );
+
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'EventProcessingWindowRec: '
+ . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
+ . ' - HOMEMODE: '
+ . $homemode
+ . ' QueryShuttersPosWinRecTilted:'
+ . $FHEM::Automation::ShuttersControl::shutters
+ ->getQueryShuttersPos(
+ $FHEM::Automation::ShuttersControl::shutters->getVentilatePos
+ )
+ . ' QueryShuttersPosWinRecComfort: '
+ . $FHEM::Automation::ShuttersControl::shutters
+ ->getQueryShuttersPos(
+ $FHEM::Automation::ShuttersControl::shutters->getComfortOpenPos
+ )
+ );
+
+ if (
+ $match =~ m{[Cc]lose|true}xms
+ && IsAfterShuttersTimeBlocking($shuttersDev)
+ && (
+ $FHEM::Automation::ShuttersControl::shutters->getStatus ==
+ $FHEM::Automation::ShuttersControl::shutters->getVentilatePos
+ || $FHEM::Automation::ShuttersControl::shutters->getStatus ==
+ $FHEM::Automation::ShuttersControl::shutters->getComfortOpenPos
+ || $FHEM::Automation::ShuttersControl::shutters->getStatus ==
+ $FHEM::Automation::ShuttersControl::shutters->getOpenPos
+ || ( $FHEM::Automation::ShuttersControl::shutters->getStatus ==
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getPrivacyDownPos
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getPrivacyDownStatus == 1
+ && !$FHEM::Automation::ShuttersControl::shutters->getIsDay )
+ )
+ && ( $FHEM::Automation::ShuttersControl::shutters->getVentilateOpen
+ eq 'on'
+ || $FHEM::Automation::ShuttersControl::ascDev
+ ->getAutoShuttersControlComfort eq 'on' )
+ )
+ {
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'EventProcessingWindowRec: '
+ . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
+ . ' Event Closed' );
+
+ if (
+ $FHEM::Automation::ShuttersControl::shutters->getIsDay
+ && ( ( $homemode ne 'asleep' && $homemode ne 'gotosleep' )
+ || $homemode eq 'none' )
+ && $FHEM::Automation::ShuttersControl::shutters->getModeUp ne
+ 'absent'
+ && $FHEM::Automation::ShuttersControl::shutters->getModeUp ne
+ 'off'
+ )
+ {
+ if (
+ $FHEM::Automation::ShuttersControl::shutters->getIfInShading
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingPos !=
+ $FHEM::Automation::ShuttersControl::shutters->getStatus
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingMode ne 'absent' )
+ {
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ 'shading in');
+ $FHEM::Automation::ShuttersControl::shutters->setNoDelay(1);
+ $FHEM::Automation::ShuttersControl::shutters->setDriveCmd(
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingPos );
+ }
+ elsif (
+ !$FHEM::Automation::ShuttersControl::shutters
+ ->getIfInShading
+ && ( $FHEM::Automation::ShuttersControl::shutters->getStatus
+ != $FHEM::Automation::ShuttersControl::shutters
+ ->getOpenPos
+ || $FHEM::Automation::ShuttersControl::shutters
+ ->getStatus !=
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getLastManPos )
+ )
+ {
+ if ( $FHEM::Automation::ShuttersControl::shutters
+ ->getPrivacyDownStatus == 2 )
+ {
+ $FHEM::Automation::ShuttersControl::shutters
+ ->setLastDrive(
+ 'window closed at privacy night close');
+ $FHEM::Automation::ShuttersControl::shutters
+ ->setNoDelay(1);
+ $FHEM::Automation::ShuttersControl::shutters
+ ->setDriveCmd(
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getPrivacyDownPos );
+ }
+ else {
+ $FHEM::Automation::ShuttersControl::shutters
+ ->setLastDrive('window closed at day');
+ $FHEM::Automation::ShuttersControl::shutters
+ ->setNoDelay(1);
+ $FHEM::Automation::ShuttersControl::shutters
+ ->setDriveCmd(
+ (
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getVentilatePosAfterDayClosed eq 'open'
+ ? $FHEM::Automation::ShuttersControl::shutters
+ ->getOpenPos
+ : $FHEM::Automation::ShuttersControl::shutters
+ ->getLastManPos
+ )
+ );
+ }
+ }
+ }
+ elsif (
+ $FHEM::Automation::ShuttersControl::shutters->getModeDown ne
+ 'absent'
+ && $FHEM::Automation::ShuttersControl::shutters->getModeDown ne
+ 'off'
+ && (
+ (
+ !$FHEM::Automation::ShuttersControl::shutters->getIsDay
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getModeDown ne 'roommate'
+ )
+ || $homemode eq 'asleep'
+ || $homemode eq 'gotosleep'
+ )
+ && $FHEM::Automation::ShuttersControl::ascDev
+ ->getAutoShuttersControlEvening eq 'on'
+ )
+ {
+ if ( $FHEM::Automation::ShuttersControl::shutters
+ ->getPrivacyUpStatus == 2 )
+ {
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ 'window closed at privacy day open');
+ $FHEM::Automation::ShuttersControl::shutters->setNoDelay(1);
+ $FHEM::Automation::ShuttersControl::shutters->setDriveCmd(
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getPrivacyDownPos );
+ }
+ else {
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ 'window closed at night');
+ $FHEM::Automation::ShuttersControl::shutters->setNoDelay(1);
+ $FHEM::Automation::ShuttersControl::shutters->setDriveCmd(
+ (
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getSleepPos > 0
+ ? $FHEM::Automation::ShuttersControl::shutters
+ ->getSleepPos
+ : $FHEM::Automation::ShuttersControl::shutters
+ ->getClosedPos
+ )
+ );
+ }
+ }
+ }
+ elsif (
+ (
+ $match =~ m{tilt}xms || ( $match =~ m{[Oo]pen|false}xms
+ && $FHEM::Automation::ShuttersControl::shutters->getSubTyp
+ eq 'twostate' )
+ )
+ && $FHEM::Automation::ShuttersControl::shutters->getVentilateOpen
+ eq 'on'
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getQueryShuttersPos(
+ $FHEM::Automation::ShuttersControl::shutters->getVentilatePos
+ )
+ )
+ {
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ 'ventilate - window open');
+ $FHEM::Automation::ShuttersControl::shutters->setNoDelay(1);
+ $FHEM::Automation::ShuttersControl::shutters->setDriveCmd(
+ (
+ (
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getShuttersPlace eq 'terrace'
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getSubTyp eq 'twostate'
+ )
+ ? $FHEM::Automation::ShuttersControl::shutters->getOpenPos
+ : $FHEM::Automation::ShuttersControl::shutters
+ ->getVentilatePos
+ )
+ );
+ }
+ elsif ($match =~ m{[Oo]pen|false}xms
+ && $FHEM::Automation::ShuttersControl::shutters->getSubTyp eq
+ 'threestate' )
+ {
+ my $posValue =
+ $FHEM::Automation::ShuttersControl::shutters->getStatus;
+ my $setLastDrive;
+ if (
+ $FHEM::Automation::ShuttersControl::ascDev
+ ->getAutoShuttersControlComfort eq 'on'
+ and $FHEM::Automation::ShuttersControl::shutters
+ ->getQueryShuttersPos(
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getComfortOpenPos
+ )
+ )
+ {
+ $posValue = $FHEM::Automation::ShuttersControl::shutters
+ ->getComfortOpenPos;
+ $setLastDrive = 'comfort - window open';
+ }
+ elsif (
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getQueryShuttersPos(
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getVentilatePos
+ )
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getVentilateOpen eq 'on'
+ )
+ {
+ $posValue =
+ $FHEM::Automation::ShuttersControl::shutters->getVentilatePos;
+ $setLastDrive = 'ventilate - window open';
+ }
+
+ if ( defined($posValue) && $posValue ) {
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ $setLastDrive);
+ $FHEM::Automation::ShuttersControl::shutters->setNoDelay(1);
+ $FHEM::Automation::ShuttersControl::shutters->setDriveCmd(
+ $posValue);
+ }
+ }
+ }
+
+ return;
+}
+
+## Sub zum steuern der Rolladen bei einem Bewohner/Roommate Event
+sub EventProcessingRoommate {
+ my $hash = shift;
+ my $shuttersDev = shift;
+ my $events = shift;
+
+ my $name = $hash->{NAME};
+
+ $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
+ my $reading =
+ $FHEM::Automation::ShuttersControl::shutters->getRoommatesReading;
+
+ if ( $events =~ m{$reading:\s(absent|gotosleep|asleep|awoken|home)}xms ) {
+ Log3( $name, 4,
+ "AutoShuttersControl ($name) - EventProcessingRoommate: "
+ . $FHEM::Automation::ShuttersControl::shutters
+ ->getRoommatesReading );
+ Log3( $name, 4,
+"AutoShuttersControl ($name) - EventProcessingRoommate: $shuttersDev und Events $events"
+ );
+
+ my $getModeUp = $FHEM::Automation::ShuttersControl::shutters->getModeUp;
+ my $getModeDown =
+ $FHEM::Automation::ShuttersControl::shutters->getModeDown;
+ my $getRoommatesStatus =
+ $FHEM::Automation::ShuttersControl::shutters->getRoommatesStatus;
+ my $getRoommatesLastStatus =
+ $FHEM::Automation::ShuttersControl::shutters->getRoommatesLastStatus;
+ my $event = $1;
+ my $posValue = $FHEM::Automation::ShuttersControl::shutters->getStatus;
+
+ if (
+ ( $event eq 'home' || $event eq 'awoken' )
+ && ( $getRoommatesStatus eq 'home'
+ || $getRoommatesStatus eq 'awoken' )
+ && ( $FHEM::Automation::ShuttersControl::ascDev
+ ->getAutoShuttersControlMorning eq 'on'
+ || $FHEM::Automation::ShuttersControl::shutters->getUp eq
+ 'roommate' )
+ && IsAfterShuttersManualBlocking($shuttersDev)
+ )
+ {
+ Log3( $name, 4,
+"AutoShuttersControl ($name) - EventProcessingRoommate_1: $shuttersDev und Events $events"
+ );
+ if (
+ (
+ (
+ $getRoommatesLastStatus eq 'asleep'
+ && ( $FHEM::Automation::ShuttersControl::shutters
+ ->getModeUp eq 'always'
+ or $FHEM::Automation::ShuttersControl::shutters
+ ->getModeUp eq $event )
+ )
+ || (
+ $getRoommatesLastStatus eq 'awoken'
+ && ( $FHEM::Automation::ShuttersControl::shutters
+ ->getModeUp eq 'always'
+ or $FHEM::Automation::ShuttersControl::shutters
+ ->getModeUp eq $event )
+ )
+ )
+ && ( $FHEM::Automation::ShuttersControl::shutters->getIsDay
+ || $FHEM::Automation::ShuttersControl::shutters->getUp eq
+ 'roommate' )
+ && ( IsAfterShuttersTimeBlocking($shuttersDev)
+ || $FHEM::Automation::ShuttersControl::shutters->getUp eq
+ 'roommate' )
+ )
+ {
+ Log3( $name, 4,
+"AutoShuttersControl ($name) - EventProcessingRoommate_2: $shuttersDev und Events $events"
+ );
+
+ if (
+ $FHEM::Automation::ShuttersControl::shutters->getIfInShading
+ && !$FHEM::Automation::ShuttersControl::shutters
+ ->getShadingManualDriveStatus
+ && $FHEM::Automation::ShuttersControl::shutters->getStatus
+ != $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingPos )
+ {
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ 'shading in');
+ $posValue = $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingPos;
+ }
+ elsif ( !$FHEM::Automation::ShuttersControl::shutters
+ ->getIfInShading )
+ {
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ 'roommate awoken');
+ $posValue =
+ $FHEM::Automation::ShuttersControl::shutters->getOpenPos;
+ }
+
+ FHEM::Automation::ShuttersControl::ShuttersCommandSet( $hash,
+ $shuttersDev, $posValue );
+ }
+ elsif (
+ (
+ $getRoommatesLastStatus eq 'absent'
+ || $getRoommatesLastStatus eq 'gone'
+ )
+ && $getRoommatesStatus eq 'home'
+ )
+ {
+ if (
+ $FHEM::Automation::ShuttersControl::shutters->getIsDay
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getIfInShading
+ && $FHEM::Automation::ShuttersControl::shutters->getStatus
+ != $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingPos
+ && !$FHEM::Automation::ShuttersControl::shutters
+ ->getShadingManualDriveStatus
+ && !(
+ CheckIfShuttersWindowRecOpen($shuttersDev) == 2
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getShuttersPlace eq 'terrace'
+ )
+ && !$FHEM::Automation::ShuttersControl::shutters
+ ->getSelfDefenseState
+ )
+ {
+ ShadingProcessingDriveCommand( $hash, $shuttersDev );
+ }
+ elsif (
+ !$FHEM::Automation::ShuttersControl::shutters->getIsDay
+ && IsAfterShuttersTimeBlocking($shuttersDev)
+ && ( $getModeDown eq 'home'
+ || $getModeDown eq 'always' )
+ && $FHEM::Automation::ShuttersControl::shutters->getDown ne
+ 'roommate'
+ )
+ {
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ 'roommate come home');
+
+ if ( CheckIfShuttersWindowRecOpen($shuttersDev) == 0
+ || $FHEM::Automation::ShuttersControl::shutters
+ ->getVentilateOpen eq 'off' )
+ {
+ $posValue = (
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getSleepPos > 0
+ ? $FHEM::Automation::ShuttersControl::shutters
+ ->getSleepPos
+ : (
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getSleepPos > 0
+ ? $FHEM::Automation::ShuttersControl::shutters
+ ->getSleepPos
+ : $FHEM::Automation::ShuttersControl::shutters
+ ->getClosedPos
+ )
+ );
+ }
+ else {
+ $posValue = $FHEM::Automation::ShuttersControl::shutters
+ ->getVentilatePos;
+ $FHEM::Automation::ShuttersControl::shutters
+ ->setLastDrive(
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getLastDrive . ' - ventilate mode' );
+ }
+
+ FHEM::Automation::ShuttersControl::ShuttersCommandSet(
+ $hash, $shuttersDev, $posValue );
+ }
+ elsif (
+ (
+ $FHEM::Automation::ShuttersControl::shutters->getIsDay
+ || $FHEM::Automation::ShuttersControl::shutters->getUp
+ eq 'roommate'
+ )
+ && IsAfterShuttersTimeBlocking($shuttersDev)
+ && ( $getModeUp eq 'home'
+ || $getModeUp eq 'always' )
+ && !$FHEM::Automation::ShuttersControl::shutters
+ ->getIfInShading
+ )
+ {
+ if ( $FHEM::Automation::ShuttersControl::shutters
+ ->getIfInShading
+ && !$FHEM::Automation::ShuttersControl::shutters
+ ->getShadingManualDriveStatus
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getStatus ==
+ $FHEM::Automation::ShuttersControl::shutters->getOpenPos
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingMode eq 'home' )
+ {
+ $FHEM::Automation::ShuttersControl::shutters
+ ->setLastDrive('shading in');
+ FHEM::Automation::ShuttersControl::ShuttersCommandSet(
+ $hash,
+ $shuttersDev,
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingPos
+ );
+ }
+ elsif (
+ (
+ !$FHEM::Automation::ShuttersControl::shutters
+ ->getIfInShading
+ || $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingMode eq 'absent'
+ )
+ && ( $FHEM::Automation::ShuttersControl::shutters
+ ->getStatus ==
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getClosedPos
+ || $FHEM::Automation::ShuttersControl::shutters
+ ->getStatus ==
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getSleepPos
+ || $FHEM::Automation::ShuttersControl::shutters
+ ->getStatus ==
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingPos )
+ )
+ {
+ $FHEM::Automation::ShuttersControl::shutters
+ ->setLastDrive(
+ (
+ (
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getStatus ==
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getClosedPos
+ || $FHEM::Automation::ShuttersControl::shutters
+ ->getStatus ==
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getSleepPos
+ )
+ ? 'roommate come home'
+ : 'shading out'
+ )
+ );
+
+ FHEM::Automation::ShuttersControl::ShuttersCommandSet(
+ $hash,
+ $shuttersDev,
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getOpenPos
+ );
+ }
+ }
+ }
+ }
+ elsif (
+ ( $event eq 'gotosleep' || $event eq 'asleep' )
+ && ( $FHEM::Automation::ShuttersControl::ascDev
+ ->getAutoShuttersControlEvening eq 'on'
+ || $FHEM::Automation::ShuttersControl::shutters->getDown eq
+ 'roommate' )
+ && ( IsAfterShuttersManualBlocking($shuttersDev)
+ || $FHEM::Automation::ShuttersControl::shutters->getDown eq
+ 'roommate' )
+ )
+ {
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ 'roommate asleep');
+
+ if ( CheckIfShuttersWindowRecOpen($shuttersDev) == 0
+ || $FHEM::Automation::ShuttersControl::shutters
+ ->getVentilateOpen eq 'off' )
+ {
+ $posValue = (
+ $FHEM::Automation::ShuttersControl::shutters->getSleepPos >
+ 0
+ ? $FHEM::Automation::ShuttersControl::shutters->getSleepPos
+ : $FHEM::Automation::ShuttersControl::shutters->getClosedPos
+ );
+ }
+ else {
+ $posValue =
+ $FHEM::Automation::ShuttersControl::shutters->getVentilatePos;
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ $FHEM::Automation::ShuttersControl::shutters->getLastDrive
+ . ' - ventilate mode' );
+ }
+
+ FHEM::Automation::ShuttersControl::ShuttersCommandSet( $hash,
+ $shuttersDev, $posValue );
+ }
+ elsif (
+ $event eq 'absent'
+ && ( !$FHEM::Automation::ShuttersControl::shutters->getIsDay
+ || $FHEM::Automation::ShuttersControl::shutters->getDown eq
+ 'roommate'
+ || $FHEM::Automation::ShuttersControl::shutters->getShadingMode
+ eq 'absent'
+ || $FHEM::Automation::ShuttersControl::shutters->getModeUp eq
+ 'absent'
+ || $FHEM::Automation::ShuttersControl::shutters->getModeDown eq
+ 'absent' )
+ )
+ {
+ Log3( $name, 4,
+"AutoShuttersControl ($name) - EventProcessingRoommate absent: $shuttersDev"
+ );
+
+ if (
+ (
+ $FHEM::Automation::ShuttersControl::shutters->getIsDay
+ || $FHEM::Automation::ShuttersControl::shutters->getUp eq
+ 'roommate'
+ )
+ && $FHEM::Automation::ShuttersControl::shutters->getIfInShading
+ && !$FHEM::Automation::ShuttersControl::shutters
+ ->getQueryShuttersPos(
+ $FHEM::Automation::ShuttersControl::shutters->getShadingPos
+ )
+ && $FHEM::Automation::ShuttersControl::shutters->getShadingMode
+ eq 'absent'
+ )
+ {
+ Log3( $name, 4,
+"AutoShuttersControl ($name) - EventProcessingRoommate Shading: $shuttersDev"
+ );
+
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ 'shading in');
+ FHEM::Automation::ShuttersControl::ShuttersCommandSet(
+ $hash,
+ $shuttersDev,
+ $FHEM::Automation::ShuttersControl::shutters->getShadingPos
+ );
+ }
+ elsif (
+ (
+ !$FHEM::Automation::ShuttersControl::shutters->getIsDay
+ || $FHEM::Automation::ShuttersControl::shutters->getDown eq
+ 'roommate'
+ )
+ && $getModeDown eq 'absent'
+ && $getRoommatesStatus eq 'absent'
+ )
+ {
+ Log3( $name, 4,
+"AutoShuttersControl ($name) - EventProcessingRoommate Down: $shuttersDev"
+ );
+
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ 'roommate absent');
+ FHEM::Automation::ShuttersControl::ShuttersCommandSet(
+ $hash,
+ $shuttersDev,
+ $FHEM::Automation::ShuttersControl::shutters->getClosedPos
+ );
+ }
+ elsif ($FHEM::Automation::ShuttersControl::shutters->getIsDay
+ && $FHEM::Automation::ShuttersControl::shutters->getModeUp eq
+ 'absent'
+ && $getRoommatesStatus eq 'absent' )
+ {
+ Log3( $name, 4,
+"AutoShuttersControl ($name) - EventProcessingRoommate Up: $shuttersDev"
+ );
+
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ 'roommate absent');
+ FHEM::Automation::ShuttersControl::ShuttersCommandSet( $hash,
+ $shuttersDev,
+ $FHEM::Automation::ShuttersControl::shutters->getOpenPos );
+ }
+
+ Log3( $name, 4,
+"AutoShuttersControl ($name) - EventProcessingRoommate NICHTS: $shuttersDev"
+ );
+ }
+ }
+
+ return;
+}
+
+sub EventProcessingResidents {
+ my $hash = shift;
+ my $device = shift;
+ my $events = shift;
+
+ my $name = $device;
+ my $reading =
+ $FHEM::Automation::ShuttersControl::ascDev->getResidentsReading;
+ my $getResidentsLastStatus =
+ $FHEM::Automation::ShuttersControl::ascDev->getResidentsLastStatus;
+
+ if ( $events =~ m{$reading:\s((?:pet_[a-z]+)|(?:absent))}xms ) {
+ for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
+ $FHEM::Automation::ShuttersControl::shutters->setShuttersDev(
+ $shuttersDev);
+ my $getModeUp =
+ $FHEM::Automation::ShuttersControl::shutters->getModeUp;
+ my $getModeDown =
+ $FHEM::Automation::ShuttersControl::shutters->getModeDown;
+ $FHEM::Automation::ShuttersControl::shutters->setHardLockOut('off');
+ if (
+ $FHEM::Automation::ShuttersControl::ascDev->getSelfDefense eq
+ 'on'
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getSelfDefenseMode ne 'off'
+ || ( $getModeDown eq 'absent'
+ || $getModeDown eq 'always' )
+ || ( $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingMode eq 'absent'
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getRoommatesStatus eq 'none' )
+ || ( $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingMode eq 'home'
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getRoommatesStatus eq 'none' )
+ )
+ {
+ if (
+ $FHEM::Automation::ShuttersControl::ascDev->getSelfDefense
+ eq 'on'
+ && (
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getSelfDefenseMode eq 'absent'
+ || ( CheckIfShuttersWindowRecOpen($shuttersDev) == 2
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getSelfDefenseMode eq 'gone'
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getShuttersPlace eq 'terrace'
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getSelfDefenseMode ne 'off' )
+ )
+ )
+ {
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ 'selfDefense absent active');
+ $FHEM::Automation::ShuttersControl::shutters
+ ->setSelfDefenseAbsent( 0, 1 )
+ ; # der erste Wert ist ob der timer schon läuft, der zweite ist ob self defense aktiv ist durch die Bedingungen
+ $FHEM::Automation::ShuttersControl::shutters
+ ->setSelfDefenseState(1);
+ $FHEM::Automation::ShuttersControl::shutters->setDriveCmd(
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getClosedPos );
+ }
+ elsif ($FHEM::Automation::ShuttersControl::shutters->getIsDay
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getIfInShading
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingMode eq 'absent'
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getRoommatesStatus eq 'none' )
+ {
+ ShadingProcessingDriveCommand( $hash, $shuttersDev );
+ }
+ elsif (
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingMode eq 'home'
+ && $FHEM::Automation::ShuttersControl::shutters->getIsDay
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getIfInShading
+ && $FHEM::Automation::ShuttersControl::shutters->getStatus
+ == $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingPos
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getRoommatesStatus eq 'none'
+ && !(
+ CheckIfShuttersWindowRecOpen($shuttersDev) == 2
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getShuttersPlace eq 'terrace'
+ )
+ && !$FHEM::Automation::ShuttersControl::shutters
+ ->getSelfDefenseState
+ )
+ {
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ 'shading out');
+ $FHEM::Automation::ShuttersControl::shutters->setDriveCmd(
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getLastPos );
+ }
+ elsif (( $getModeDown eq 'absent' || $getModeDown eq 'always' )
+ && !$FHEM::Automation::ShuttersControl::shutters->getIsDay
+ && IsAfterShuttersTimeBlocking($shuttersDev)
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getRoommatesStatus eq 'none' )
+ {
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ 'residents absent');
+ $FHEM::Automation::ShuttersControl::shutters->setDriveCmd(
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getClosedPos );
+ }
+ }
+ }
+ }
+ elsif ($events =~ m{$reading:\s(gone)}xms
+ && $FHEM::Automation::ShuttersControl::ascDev->getSelfDefense eq 'on' )
+ {
+ for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
+ $FHEM::Automation::ShuttersControl::shutters->setShuttersDev(
+ $shuttersDev);
+ $FHEM::Automation::ShuttersControl::shutters->setHardLockOut('off');
+ if ( $FHEM::Automation::ShuttersControl::shutters
+ ->getSelfDefenseMode ne 'off' )
+ {
+
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ 'selfDefense gone active');
+ $FHEM::Automation::ShuttersControl::shutters
+ ->setSelfDefenseState(1);
+ $FHEM::Automation::ShuttersControl::shutters->setDriveCmd(
+ $FHEM::Automation::ShuttersControl::shutters->getClosedPos
+ );
+ }
+ }
+ }
+ elsif (
+ $events =~ m{$reading:\s((?:[a-z]+_)?home)}xms
+ && ( $getResidentsLastStatus eq 'absent'
+ || $getResidentsLastStatus eq 'gone'
+ || $getResidentsLastStatus eq 'asleep'
+ || $getResidentsLastStatus eq 'awoken' )
+ )
+ {
+ for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
+ $FHEM::Automation::ShuttersControl::shutters->setShuttersDev(
+ $shuttersDev);
+ my $getModeUp =
+ $FHEM::Automation::ShuttersControl::shutters->getModeUp;
+ my $getModeDown =
+ $FHEM::Automation::ShuttersControl::shutters->getModeDown;
+
+ if (
+ (
+ $FHEM::Automation::ShuttersControl::shutters->getStatus !=
+ $FHEM::Automation::ShuttersControl::shutters->getClosedPos
+ || $FHEM::Automation::ShuttersControl::shutters->getStatus
+ != $FHEM::Automation::ShuttersControl::shutters->getSleepPos
+ )
+ && !$FHEM::Automation::ShuttersControl::shutters->getIsDay
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getRoommatesStatus eq 'none'
+ && ( $getModeDown eq 'home'
+ || $getModeDown eq 'always' )
+ && $getResidentsLastStatus ne 'asleep'
+ && $getResidentsLastStatus ne 'awoken'
+ && IsAfterShuttersTimeBlocking($shuttersDev)
+ && !$FHEM::Automation::ShuttersControl::shutters
+ ->getSelfDefenseState
+ )
+ {
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ 'residents come home');
+ $FHEM::Automation::ShuttersControl::shutters->setDriveCmd(
+ (
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getSleepPos > 0
+ ? $FHEM::Automation::ShuttersControl::shutters
+ ->getSleepPos
+ : $FHEM::Automation::ShuttersControl::shutters
+ ->getClosedPos
+ )
+ );
+ }
+ elsif (
+ (
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingMode eq 'home'
+ || $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingMode eq 'always'
+ )
+ && $FHEM::Automation::ShuttersControl::shutters->getIsDay
+ && $FHEM::Automation::ShuttersControl::shutters->getIfInShading
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getRoommatesStatus eq 'none'
+ && $FHEM::Automation::ShuttersControl::shutters->getStatus !=
+ $FHEM::Automation::ShuttersControl::shutters->getShadingPos
+ && !$FHEM::Automation::ShuttersControl::shutters
+ ->getShadingManualDriveStatus
+ && !(
+ CheckIfShuttersWindowRecOpen($shuttersDev) == 2
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getShuttersPlace eq 'terrace'
+ )
+ && !$FHEM::Automation::ShuttersControl::shutters
+ ->getSelfDefenseState
+ )
+ {
+ ShadingProcessingDriveCommand( $hash, $shuttersDev );
+ }
+ elsif (
+ $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq
+ 'absent'
+ && $FHEM::Automation::ShuttersControl::shutters->getIsDay
+ && $FHEM::Automation::ShuttersControl::shutters->getIfInShading
+ && $FHEM::Automation::ShuttersControl::shutters->getStatus ==
+ $FHEM::Automation::ShuttersControl::shutters->getShadingPos
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getRoommatesStatus eq 'none'
+ && !$FHEM::Automation::ShuttersControl::shutters
+ ->getShadingManualDriveStatus
+ && !(
+ CheckIfShuttersWindowRecOpen($shuttersDev) == 2
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getShuttersPlace eq 'terrace'
+ )
+ && !$FHEM::Automation::ShuttersControl::shutters
+ ->getSelfDefenseState
+ )
+ {
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ 'shading out');
+ $FHEM::Automation::ShuttersControl::shutters->setDriveCmd(
+ $FHEM::Automation::ShuttersControl::shutters->getLastPos );
+ }
+ elsif (
+ $FHEM::Automation::ShuttersControl::ascDev->getSelfDefense eq
+ 'on'
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getSelfDefenseMode ne 'off'
+ && !$FHEM::Automation::ShuttersControl::shutters->getIfInShading
+ && ( $getResidentsLastStatus eq 'gone'
+ || $getResidentsLastStatus eq 'absent' )
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getSelfDefenseState
+ )
+ {
+ RemoveInternalTimer(
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getSelfDefenseAbsentTimerhash )
+ if ( $getResidentsLastStatus eq 'absent'
+ && $FHEM::Automation::ShuttersControl::ascDev
+ ->getSelfDefense eq 'on'
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getSelfDefenseMode ne 'off'
+ && !$FHEM::Automation::ShuttersControl::shutters
+ ->getSelfDefenseAbsent
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getSelfDefenseAbsentTimerrun );
+
+ if (
+ (
+ $FHEM::Automation::ShuttersControl::shutters->getStatus
+ == $FHEM::Automation::ShuttersControl::shutters
+ ->getClosedPos
+ || $FHEM::Automation::ShuttersControl::shutters
+ ->getStatus ==
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getSleepPos
+ )
+ && $FHEM::Automation::ShuttersControl::shutters->getIsDay
+ )
+ {
+ $FHEM::Automation::ShuttersControl::shutters
+ ->setHardLockOut('on')
+ if (
+ CheckIfShuttersWindowRecOpen($shuttersDev) == 2
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getShuttersPlace eq 'terrace'
+ && ( $getModeUp eq 'absent'
+ || $getModeUp eq 'off' )
+ );
+
+ $FHEM::Automation::ShuttersControl::shutters
+ ->setSelfDefenseState(0);
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ 'selfDefense inactive');
+ $FHEM::Automation::ShuttersControl::shutters->setDriveCmd(
+ (
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getPrivacyDownStatus == 2
+ ? $FHEM::Automation::ShuttersControl::shutters
+ ->getPrivacyDownPos
+ : $FHEM::Automation::ShuttersControl::shutters
+ ->getOpenPos
+ )
+ );
+ }
+ }
+ elsif (
+ (
+ $FHEM::Automation::ShuttersControl::shutters->getStatus ==
+ $FHEM::Automation::ShuttersControl::shutters->getClosedPos
+ || $FHEM::Automation::ShuttersControl::shutters->getStatus
+ == $FHEM::Automation::ShuttersControl::shutters->getSleepPos
+ )
+ && $FHEM::Automation::ShuttersControl::shutters->getIsDay
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getRoommatesStatus eq 'none'
+ && ( $getModeUp eq 'home'
+ || $getModeUp eq 'always' )
+ && IsAfterShuttersTimeBlocking($shuttersDev)
+ && !$FHEM::Automation::ShuttersControl::shutters->getIfInShading
+ && !$FHEM::Automation::ShuttersControl::shutters
+ ->getSelfDefenseState
+ )
+ {
+ if ( $getResidentsLastStatus eq 'asleep'
+ || $getResidentsLastStatus eq 'awoken' )
+ {
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ 'residents awoken');
+ }
+ else {
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ 'residents home');
+ }
+ $FHEM::Automation::ShuttersControl::shutters->setDriveCmd(
+ $FHEM::Automation::ShuttersControl::shutters->getOpenPos );
+ }
+ }
+ }
+
+ return;
+}
+
+sub EventProcessingRain {
+
+ #### Ist noch nicht fertig, es fehlt noch das verzögerte Prüfen auf erhalten bleiben des getriggerten Wertes.
+
+ my $hash = shift;
+ my $device = shift;
+ my $events = shift;
+
+ my $name = $device;
+ my $reading =
+ $FHEM::Automation::ShuttersControl::ascDev->getRainSensorReading
+ // 'none';
+
+ if ( $events =~ m{$reading:\s(\d+(\.\d+)?|rain|dry)}xms ) {
+ my $val;
+ my $triggerMax =
+ $FHEM::Automation::ShuttersControl::ascDev->getRainTriggerMax;
+ my $triggerMin =
+ $FHEM::Automation::ShuttersControl::ascDev->getRainTriggerMin;
+ my $closedPos = $FHEM::Automation::ShuttersControl::ascDev
+ ->getRainSensorShuttersClosedPos;
+
+ if ( $1 eq 'rain' ) { $val = $triggerMax + 1 }
+ elsif ( $1 eq 'dry' ) { $val = $triggerMin }
+ else { $val = $1 }
+
+ RainProtection( $hash, $val, $triggerMax, $triggerMin, $closedPos );
+ }
+
+ return;
+}
+
+sub RainProtection {
+ my ( $hash, $val, $triggerMax, $triggerMin, $closedPos ) = @_;
+
+ for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
+ $FHEM::Automation::ShuttersControl::shutters->setShuttersDev(
+ $shuttersDev);
+
+ next
+ if (
+ $FHEM::Automation::ShuttersControl::shutters->getRainProtection eq
+ 'off' );
+
+ if ( $val > $triggerMax
+ && $FHEM::Automation::ShuttersControl::shutters->getStatus !=
+ $closedPos
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getRainProtectionStatus eq 'unprotected' )
+ {
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ 'rain protected');
+ $FHEM::Automation::ShuttersControl::shutters->setDriveCmd(
+ $closedPos);
+ $FHEM::Automation::ShuttersControl::shutters
+ ->setRainProtectionStatus('protected');
+ }
+ elsif ( ( $val == 0 || $val < $triggerMin )
+ && $FHEM::Automation::ShuttersControl::shutters->getStatus ==
+ $closedPos
+ && IsAfterShuttersManualBlocking($shuttersDev)
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getRainProtectionStatus eq 'protected' )
+ {
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ 'rain un-protected');
+ $FHEM::Automation::ShuttersControl::shutters->setDriveCmd(
+ (
+ $FHEM::Automation::ShuttersControl::shutters->getIsDay
+ ? $FHEM::Automation::ShuttersControl::shutters->getLastPos
+ : (
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getPrivacyDownStatus == 2
+ ? $FHEM::Automation::ShuttersControl::shutters
+ ->getPrivacyDownPos
+ : $FHEM::Automation::ShuttersControl::shutters
+ ->getClosedPos
+ )
+ )
+ );
+ $FHEM::Automation::ShuttersControl::shutters
+ ->setRainProtectionStatus('unprotected');
+ }
+ }
+
+ return;
+}
+
+sub EventProcessingWind {
+ my $hash = shift;
+ my $shuttersDev = shift;
+ my $events = shift;
+
+ my $name = $hash->{NAME};
+ $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
+
+ my $reading =
+ $FHEM::Automation::ShuttersControl::ascDev->getWindSensorReading
+ // 'none';
+ if ( $events =~ m{$reading:\s(\d+(\.\d+)?)}xms ) {
+ for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
+ $FHEM::Automation::ShuttersControl::shutters->setShuttersDev(
+ $shuttersDev);
+
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'EventProcessingWind: '
+ . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
+ . ' - WindProtection1: '
+ . $FHEM::Automation::ShuttersControl::shutters
+ ->getWindProtectionStatus
+ . ' WindMax1: '
+ . $FHEM::Automation::ShuttersControl::shutters->getWindMax
+ . ' WindMin1: '
+ . $FHEM::Automation::ShuttersControl::shutters->getWindMin
+ . ' Bekommender Wert1: '
+ . $1 );
+
+ next
+ if (
+ (
+ CheckIfShuttersWindowRecOpen($shuttersDev) != 0
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getShuttersPlace eq 'terrace'
+ )
+ || $FHEM::Automation::ShuttersControl::shutters
+ ->getWindProtection eq 'off'
+ );
+
+ if ( $1 > $FHEM::Automation::ShuttersControl::shutters->getWindMax
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getWindProtectionStatus eq 'unprotected' )
+ {
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ 'wind protected');
+ $FHEM::Automation::ShuttersControl::shutters->setDriveCmd(
+ $FHEM::Automation::ShuttersControl::shutters->getWindPos );
+ $FHEM::Automation::ShuttersControl::shutters
+ ->setWindProtectionStatus('protected');
+ }
+ elsif (
+ $1 < $FHEM::Automation::ShuttersControl::shutters->getWindMin
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getWindProtectionStatus eq 'protected' )
+ {
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ 'wind un-protected');
+ $FHEM::Automation::ShuttersControl::shutters->setDriveCmd(
+ (
+ $FHEM::Automation::ShuttersControl::shutters->getIsDay
+ ? $FHEM::Automation::ShuttersControl::shutters
+ ->getLastPos
+ : (
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getPrivacyDownStatus == 2
+ ? $FHEM::Automation::ShuttersControl::shutters
+ ->getPrivacyDownPos
+ : (
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getSleepPos > 0
+ ? $FHEM::Automation::ShuttersControl::shutters
+ ->getSleepPos
+ : $FHEM::Automation::ShuttersControl::shutters
+ ->getClosedPos
+ )
+ )
+ )
+ );
+ $FHEM::Automation::ShuttersControl::shutters
+ ->setWindProtectionStatus('unprotected');
+ }
+
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'EventProcessingWind: '
+ . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
+ . ' - WindProtection2: '
+ . $FHEM::Automation::ShuttersControl::shutters
+ ->getWindProtectionStatus
+ . ' WindMax2: '
+ . $FHEM::Automation::ShuttersControl::shutters->getWindMax
+ . ' WindMin2: '
+ . $FHEM::Automation::ShuttersControl::shutters->getWindMin
+ . ' Bekommender Wert2: '
+ . $1 );
+ }
+ }
+
+ return;
+}
+##########
+
+sub EventProcessingBrightness {
+ my $hash = shift;
+ my $shuttersDev = shift;
+ my $events = shift;
+
+ my $name = $hash->{NAME};
+ $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
+
+ FHEM::Automation::ShuttersControl::ASC_Debug( 'EventProcessingBrightness: '
+ . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
+ . ' - Event von einem Helligkeitssensor erkannt. Verarbeitung läuft. Sollten keine weitere Meldungen aus der Funktion kommen, so befindet sich die aktuelle Zeit nicht innerhalb der Verarbeitungszeit für Sunset oder Sunrise'
+ );
+
+ return EventProcessingShadingBrightness( $hash, $shuttersDev, $events )
+ if (
+ (
+ $FHEM::Automation::ShuttersControl::shutters->getDown ne
+ 'brightness'
+ && $FHEM::Automation::ShuttersControl::shutters->getUp ne
+ 'brightness'
+ )
+ || (
+ (
+ $FHEM::Automation::ShuttersControl::shutters->getDown eq
+ 'brightness'
+ || $FHEM::Automation::ShuttersControl::shutters->getUp eq
+ 'brightness'
+ )
+ && (
+ (
+ (
+ (
+ int( gettimeofday() / 86400 ) == int(
+ computeAlignTime(
+ '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpEarly
+ ) / 86400
+ )
+ && (
+ !IsWe()
+ || (
+ IsWe()
+ && $FHEM::Automation::ShuttersControl::ascDev
+ ->getSunriseTimeWeHoliday eq 'off'
+ || (
+ $FHEM::Automation::ShuttersControl::ascDev
+ ->getSunriseTimeWeHoliday eq 'on'
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday eq '01:25' )
+ )
+ )
+ )
+ || (
+ int( gettimeofday() / 86400 ) == int(
+ computeAlignTime(
+ '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday
+ ) / 86400
+ )
+ && IsWe()
+ && $FHEM::Automation::ShuttersControl::ascDev
+ ->getSunriseTimeWeHoliday eq 'on'
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday ne '01:25'
+ )
+ )
+ && int( gettimeofday() / 86400 ) == int(
+ computeAlignTime(
+ '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpLate
+ ) / 86400
+ )
+
+ || (
+ (
+ int( gettimeofday() / 86400 ) != int(
+ computeAlignTime(
+ '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpEarly
+ ) / 86400
+ )
+ && (
+ !IsWe()
+ || (
+ IsWe()
+ && $FHEM::Automation::ShuttersControl::ascDev
+ ->getSunriseTimeWeHoliday eq 'off'
+ || (
+ $FHEM::Automation::ShuttersControl::ascDev
+ ->getSunriseTimeWeHoliday eq 'on'
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday eq '01:25' )
+ )
+ )
+ )
+ || (
+ int( gettimeofday() / 86400 ) != int(
+ computeAlignTime(
+ '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday
+ ) / 86400
+ )
+ && IsWe()
+ && $FHEM::Automation::ShuttersControl::ascDev
+ ->getSunriseTimeWeHoliday eq 'on'
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday ne '01:25'
+ )
+ )
+ && int( gettimeofday() / 86400 ) != int(
+ computeAlignTime(
+ '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpLate
+ ) / 86400
+ )
+ )
+ && (
+ (
+ int( gettimeofday() / 86400 ) == int(
+ computeAlignTime(
+ '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeDownEarly
+ ) / 86400
+ )
+ && int( gettimeofday() / 86400 ) == int(
+ computeAlignTime(
+ '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeDownLate
+ ) / 86400
+ )
+ )
+ || (
+ int( gettimeofday() / 86400 ) != int(
+ computeAlignTime(
+ '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeDownEarly
+ ) / 86400
+ )
+ && int( gettimeofday() / 86400 ) != int(
+ computeAlignTime(
+ '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeDownLate
+ ) / 86400
+ )
+ )
+ )
+ )
+ )
+ );
+
+ FHEM::Automation::ShuttersControl::ASC_Debug( 'EventProcessingBrightness: '
+ . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
+ . ' - Die aktuelle Zeit befindet sich innerhalb der Sunset/Sunrise Brightness Verarbeitungszeit. Also zwischen Time Early und Time Late'
+ );
+
+ my $reading =
+ $FHEM::Automation::ShuttersControl::shutters->getBrightnessReading;
+ if ( $events =~ m{$reading:\s(\d+(\.\d+)?)}xms ) {
+ my $brightnessMinVal;
+ if ( $FHEM::Automation::ShuttersControl::shutters->getBrightnessMinVal >
+ -1 )
+ {
+ $brightnessMinVal =
+ $FHEM::Automation::ShuttersControl::shutters->getBrightnessMinVal;
+ }
+ else {
+ $brightnessMinVal =
+ $FHEM::Automation::ShuttersControl::ascDev->getBrightnessMinVal;
+ }
+
+ my $brightnessMaxVal;
+ if ( $FHEM::Automation::ShuttersControl::shutters->getBrightnessMaxVal >
+ -1 )
+ {
+ $brightnessMaxVal =
+ $FHEM::Automation::ShuttersControl::shutters->getBrightnessMaxVal;
+ }
+ else {
+ $brightnessMaxVal =
+ $FHEM::Automation::ShuttersControl::ascDev->getBrightnessMaxVal;
+ }
+
+ my $brightnessPrivacyUpVal =
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getPrivacyUpBrightnessVal;
+ my $brightnessPrivacyDownVal =
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getPrivacyDownBrightnessVal;
+
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'EventProcessingBrightness: '
+ . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
+ . ' - Es wird geprüft ob Sunset oder Sunrise gefahren werden soll und der aktuelle übergebene Brightness-Wert: '
+ . $1
+ . ' Größer dem eingestellten Sunrise-Wert: '
+ . $brightnessMaxVal
+ . ' oder kleiner dem eingestellten Sunset-Wert: '
+ . $brightnessMinVal
+ . ' ist. Werte für weitere Parameter - getUp ist: '
+ . $FHEM::Automation::ShuttersControl::shutters->getUp
+ . ' getDown ist: '
+ . $FHEM::Automation::ShuttersControl::shutters->getDown
+ . ' getSunrise ist: '
+ . $FHEM::Automation::ShuttersControl::shutters->getSunrise
+ . ' getSunset ist: '
+ . $FHEM::Automation::ShuttersControl::shutters->getSunset );
+
+ if (
+ (
+ (
+ (
+ int( gettimeofday() / 86400 ) != int(
+ computeAlignTime(
+ '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpEarly
+ ) / 86400
+ )
+ && (
+ !IsWe()
+ || (
+ IsWe()
+ && $FHEM::Automation::ShuttersControl::ascDev
+ ->getSunriseTimeWeHoliday eq 'off'
+ || ( $FHEM::Automation::ShuttersControl::ascDev
+ ->getSunriseTimeWeHoliday eq 'on'
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday eq '01:25' )
+ )
+ )
+ )
+ || (
+ int( gettimeofday() / 86400 ) != int(
+ computeAlignTime(
+ '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday
+ ) / 86400
+ )
+ && IsWe()
+ && $FHEM::Automation::ShuttersControl::ascDev
+ ->getSunriseTimeWeHoliday eq 'on'
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday ne '01:25'
+ )
+ )
+ && int( gettimeofday() / 86400 ) == int(
+ computeAlignTime(
+ '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpLate
+ ) / 86400
+ )
+ )
+ && (
+ $1 > $brightnessMaxVal
+ || ( $1 > $brightnessPrivacyUpVal
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getPrivacyUpStatus == 1 )
+ )
+ && $FHEM::Automation::ShuttersControl::shutters->getUp eq
+ 'brightness'
+ && !$FHEM::Automation::ShuttersControl::shutters->getSunrise
+ && $FHEM::Automation::ShuttersControl::ascDev
+ ->getAutoShuttersControlMorning eq 'on'
+ && (
+ $FHEM::Automation::ShuttersControl::ascDev->getSelfDefense eq
+ 'off'
+ || $FHEM::Automation::ShuttersControl::shutters
+ ->getSelfDefenseMode eq 'off'
+ || ( $FHEM::Automation::ShuttersControl::ascDev->getSelfDefense
+ eq 'on'
+ && $FHEM::Automation::ShuttersControl::ascDev
+ ->getResidentsStatus ne 'gone' )
+ )
+ )
+ {
+ Log3( $name, 4,
+"AutoShuttersControl ($shuttersDev) - EventProcessingBrightness: Steuerung für Morgens"
+ );
+
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'EventProcessingBrightness: '
+ . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
+ . ' - Verarbeitungszeit für Sunrise wurd erkannt. Prüfe Status der Roommates'
+ );
+
+ my $homemode =
+ $FHEM::Automation::ShuttersControl::shutters->getRoommatesStatus;
+ $homemode =
+ $FHEM::Automation::ShuttersControl::ascDev->getResidentsStatus
+ if ( $homemode eq 'none' );
+
+ if (
+ $FHEM::Automation::ShuttersControl::shutters->getModeUp eq
+ $homemode
+ || ( $FHEM::Automation::ShuttersControl::shutters->getModeUp eq
+ 'absent'
+ && $homemode eq 'gone' )
+ || $FHEM::Automation::ShuttersControl::shutters->getModeUp eq
+ 'always'
+ )
+ {
+ my $roommatestatus =
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getRoommatesStatus;
+
+ if (
+ $roommatestatus eq 'home'
+ || $roommatestatus eq 'awoken'
+ || $roommatestatus eq 'absent'
+ || $roommatestatus eq 'gone'
+ || $roommatestatus eq 'none'
+ && (
+ $FHEM::Automation::ShuttersControl::ascDev
+ ->getSelfDefense eq 'off'
+ || ( $FHEM::Automation::ShuttersControl::ascDev
+ ->getSelfDefense eq 'on'
+ && CheckIfShuttersWindowRecOpen($shuttersDev) == 0 )
+ || ( $FHEM::Automation::ShuttersControl::ascDev
+ ->getSelfDefense eq 'on'
+ && CheckIfShuttersWindowRecOpen($shuttersDev) != 0
+ && $FHEM::Automation::ShuttersControl::ascDev
+ ->getResidentsStatus eq 'home' )
+ )
+ )
+ {
+
+ if ( $brightnessPrivacyUpVal > 0
+ && $1 < $brightnessMaxVal
+ && $1 > $brightnessPrivacyUpVal )
+ {
+ $FHEM::Automation::ShuttersControl::shutters
+ ->setPrivacyUpStatus(2);
+ $FHEM::Automation::ShuttersControl::shutters
+ ->setLastDrive('brightness privacy day open');
+ FHEM::Automation::ShuttersControl::ShuttersCommandSet(
+ $hash,
+ $shuttersDev,
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getPrivacyUpPos
+ )
+ if (
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getQueryShuttersPos(
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getPrivacyUpPos
+ )
+ );
+
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'EventProcessingBrightness: '
+ . $FHEM::Automation::ShuttersControl::shutters
+ ->getShuttersDev
+ . ' - Verarbeitung für Sunrise Privacy Down. Roommatestatus korrekt zum fahren. Fahrbefehl wird an die Funktion FnFHEM::Automation::ShuttersControl::ShuttersCommandSet gesendet. Grund des fahrens: '
+ . $FHEM::Automation::ShuttersControl::shutters
+ ->getLastDrive );
+
+ FHEM::Automation::ShuttersControl::CreateSunRiseSetShuttersTimer( $hash, $shuttersDev );
+ }
+ else {
+ $FHEM::Automation::ShuttersControl::shutters
+ ->setLastDrive(
+ 'maximum brightness threshold exceeded');
+ $FHEM::Automation::ShuttersControl::shutters
+ ->setSunrise(1);
+ $FHEM::Automation::ShuttersControl::shutters
+ ->setSunset(0);
+ $FHEM::Automation::ShuttersControl::shutters
+ ->setPrivacyUpStatus(0)
+ if ( $FHEM::Automation::ShuttersControl::shutters
+ ->getPrivacyUpStatus == 2 );
+ FHEM::Automation::ShuttersControl::ShuttersCommandSet(
+ $hash,
+ $shuttersDev,
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getOpenPos
+ );
+
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'EventProcessingBrightness: '
+ . $FHEM::Automation::ShuttersControl::shutters
+ ->getShuttersDev
+ . ' - Verarbeitung für Sunrise. Roommatestatus korrekt zum fahren. Fahrbefehl wird an die Funktion FnFHEM::Automation::ShuttersControl::ShuttersCommandSet gesendet. Grund des fahrens: '
+ . $FHEM::Automation::ShuttersControl::shutters
+ ->getLastDrive );
+ }
+ }
+ else {
+ EventProcessingShadingBrightness( $hash, $shuttersDev,
+ $events );
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'EventProcessingBrightness: '
+ . $FHEM::Automation::ShuttersControl::shutters
+ ->getShuttersDev
+ . ' - Verarbeitung für Sunrise. Roommatestatus nicht zum hochfahren oder Fenster sind offen. Fahrbebehl bleibt aus!!! Es wird an die Event verarbeitende Beschattungsfunktion weiter gereicht'
+ );
+ }
+ }
+ }
+ elsif (
+ int( gettimeofday() / 86400 ) != int(
+ computeAlignTime( '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeDownEarly ) / 86400
+ )
+ && int( gettimeofday() / 86400 ) == int(
+ computeAlignTime(
+ '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeDownLate
+ ) / 86400
+ )
+ && (
+ $1 < $brightnessMinVal
+ || ( $1 < $brightnessPrivacyDownVal
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getPrivacyDownStatus == 1 )
+ )
+ && $FHEM::Automation::ShuttersControl::shutters->getDown eq
+ 'brightness'
+ && !$FHEM::Automation::ShuttersControl::shutters->getSunset
+ && IsAfterShuttersManualBlocking($shuttersDev)
+ && $FHEM::Automation::ShuttersControl::ascDev
+ ->getAutoShuttersControlEvening eq 'on'
+ )
+ {
+ Log3( $name, 4,
+"AutoShuttersControl ($shuttersDev) - EventProcessingBrightness: Steuerung für Abends"
+ );
+
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'EventProcessingBrightness: '
+ . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
+ . ' - Verarbeitungszeit für Sunset wurd erkannt. Prüfe Status der Roommates'
+ );
+
+ my $homemode =
+ $FHEM::Automation::ShuttersControl::shutters->getRoommatesStatus;
+ $homemode =
+ $FHEM::Automation::ShuttersControl::ascDev->getResidentsStatus
+ if ( $homemode eq 'none' );
+
+ if (
+ $FHEM::Automation::ShuttersControl::shutters->getModeDown eq
+ $homemode
+ || ( $FHEM::Automation::ShuttersControl::shutters->getModeDown
+ eq 'absent'
+ && $homemode eq 'gone' )
+ || $FHEM::Automation::ShuttersControl::shutters->getModeDown eq
+ 'always'
+ )
+ {
+ my $posValue =
+ $FHEM::Automation::ShuttersControl::shutters->getStatus;
+ my $lastDrive;
+
+ ## Setzt den PrivacyDown Modus für die Sichtschutzfahrt auf den Status 0
+ ## 1 bedeutet das PrivacyDown Timer aktiviert wurde, 2 beudet das er im privacyDown ist
+ ## also das Rollo in privacyDown Position steht und VOR der endgültigen Nachfahrt
+
+ if ( $brightnessPrivacyDownVal > 0
+ && $1 > $brightnessMinVal
+ && $1 < $brightnessPrivacyDownVal )
+ {
+ $lastDrive = 'brightness privacy night close';
+ $posValue = (
+ (
+ !$FHEM::Automation::ShuttersControl::shutters
+ ->getQueryShuttersPos(
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getPrivacyDownPos
+ )
+ )
+ ? $FHEM::Automation::ShuttersControl::shutters
+ ->getPrivacyDownPos
+ : $FHEM::Automation::ShuttersControl::shutters
+ ->getStatus
+ );
+ $FHEM::Automation::ShuttersControl::shutters
+ ->setPrivacyDownStatus(2);
+
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'EventProcessingBrightness: '
+ . $FHEM::Automation::ShuttersControl::shutters
+ ->getShuttersDev
+ . ' - Verarbeitung für Sunset Privacy Down. Roommatestatus korrekt zum fahren. Fahrbefehl wird an die Funktion FnFHEM::Automation::ShuttersControl::ShuttersCommandSet gesendet. Grund des fahrens: '
+ . $FHEM::Automation::ShuttersControl::shutters
+ ->getLastDrive );
+ }
+ elsif ( CheckIfShuttersWindowRecOpen($shuttersDev) == 2
+ && $FHEM::Automation::ShuttersControl::shutters->getSubTyp
+ eq 'threestate'
+ && $FHEM::Automation::ShuttersControl::ascDev
+ ->getAutoShuttersControlComfort eq 'on' )
+ {
+ $posValue = $FHEM::Automation::ShuttersControl::shutters
+ ->getComfortOpenPos;
+ $lastDrive = 'minimum brightness threshold fell below';
+ $FHEM::Automation::ShuttersControl::shutters
+ ->setPrivacyDownStatus(0)
+ if ( $FHEM::Automation::ShuttersControl::shutters
+ ->getPrivacyDownStatus == 2 );
+ }
+ elsif ( CheckIfShuttersWindowRecOpen($shuttersDev) == 0
+ || $FHEM::Automation::ShuttersControl::shutters
+ ->getVentilateOpen eq 'off' )
+ {
+ $posValue = (
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getSleepPos > 0
+ ? $FHEM::Automation::ShuttersControl::shutters
+ ->getSleepPos
+ : $FHEM::Automation::ShuttersControl::shutters
+ ->getClosedPos
+ );
+ $lastDrive = 'minimum brightness threshold fell below';
+ $FHEM::Automation::ShuttersControl::shutters
+ ->setPrivacyDownStatus(0)
+ if ( $FHEM::Automation::ShuttersControl::shutters
+ ->getPrivacyDownStatus == 2 );
+ }
+ else {
+ $posValue = $FHEM::Automation::ShuttersControl::shutters
+ ->getVentilatePos;
+ $lastDrive = 'minimum brightness threshold fell below';
+ $FHEM::Automation::ShuttersControl::shutters
+ ->setPrivacyDownStatus(0)
+ if ( $FHEM::Automation::ShuttersControl::shutters
+ ->getPrivacyDownStatus == 2 );
+ }
+
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ $lastDrive);
+
+ if (
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getPrivacyDownStatus != 2
+ )
+ {
+ $FHEM::Automation::ShuttersControl::shutters->setSunrise(0);
+ $FHEM::Automation::ShuttersControl::shutters->setSunset(1);
+ }
+
+ FHEM::Automation::ShuttersControl::ShuttersCommandSet( $hash,
+ $shuttersDev, $posValue );
+
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'EventProcessingBrightness: '
+ . $FHEM::Automation::ShuttersControl::shutters
+ ->getShuttersDev
+ . ' - Verarbeitung für Sunset. Roommatestatus korrekt zum fahren. Fahrbefehl wird an die Funktion FnFHEM::Automation::ShuttersControl::ShuttersCommandSet gesendet. Zielposition: '
+ . $posValue
+ . ' Grund des fahrens: '
+ . $FHEM::Automation::ShuttersControl::shutters
+ ->getLastDrive );
+ }
+ else {
+ EventProcessingShadingBrightness( $hash, $shuttersDev, $events )
+ if ( $FHEM::Automation::ShuttersControl::shutters
+ ->getPrivacyDownStatus != 2 );
+
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'EventProcessingBrightness: '
+ . $FHEM::Automation::ShuttersControl::shutters
+ ->getShuttersDev
+ . ' - Verarbeitung für Sunset. Roommatestatus nicht zum runter fahren. Fahrbebehl bleibt aus!!! Es wird an die Event verarbeitende Beschattungsfunktion weiter gereicht'
+ );
+ }
+ }
+ else {
+ EventProcessingShadingBrightness( $hash, $shuttersDev, $events )
+ if ( $FHEM::Automation::ShuttersControl::shutters
+ ->getPrivacyDownStatus != 2 );
+
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'EventProcessingBrightness: '
+ . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
+ . ' - Brightness Event kam nicht innerhalb der Verarbeitungszeit für Sunset oder Sunris oder aber für beide wurden die entsprechendne Verarbeitungsschwellen nicht erreicht.'
+ );
+ }
+ }
+ else {
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'EventProcessingBrightness: '
+ . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
+ . ' - Leider konnte kein Korrekter Brightnesswert aus dem Event erkannt werden. Entweder passt das Reading oder der tatsächliche nummerishce Wert des Events nicht'
+ );
+ }
+
+ return;
+}
+
+sub EventProcessingShadingBrightness {
+ my $hash = shift;
+ my $shuttersDev = shift;
+ my $events = shift;
+
+ my $name = $hash->{NAME};
+ $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
+ my $reading =
+ $FHEM::Automation::ShuttersControl::shutters->getBrightnessReading;
+ my $outTemp = (
+ $FHEM::Automation::ShuttersControl::shutters->getOutTemp != -100
+ ? $FHEM::Automation::ShuttersControl::shutters->getOutTemp
+ : $FHEM::Automation::ShuttersControl::ascDev->getOutTemp
+ );
+
+ Log3( $name, 4,
+ "AutoShuttersControl ($shuttersDev) - EventProcessingShadingBrightness"
+ );
+
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'EventProcessingShadingBrightness: '
+ . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
+ . ' - Es wird nun geprüft ob der übergebene Event ein nummerischer Wert vom Brightnessreading ist.'
+ );
+
+ if ( $events =~ m{$reading:\s(\d+(\.\d+)?)}xms ) {
+ Log3(
+ $name, 4,
+"AutoShuttersControl ($shuttersDev) - EventProcessingShadingBrightness
+ Brightness: " . $1
+ );
+
+ ## Brightness Wert in ein Array schieben zur Berechnung eines Average Wertes
+ $FHEM::Automation::ShuttersControl::shutters->setPushBrightnessInArray(
+ $1);
+
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'EventProcessingShadingBrightness: '
+ . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
+ . ' - Nummerischer Brightness-Wert wurde erkannt. Der Brightness Average Wert ist: '
+ . $FHEM::Automation::ShuttersControl::shutters
+ ->getBrightnessAverage
+ . ' RainProtection: '
+ . $FHEM::Automation::ShuttersControl::shutters
+ ->getRainProtectionStatus
+ . ' WindProtection: '
+ . $FHEM::Automation::ShuttersControl::shutters
+ ->getWindProtectionStatus );
+
+ if ( $FHEM::Automation::ShuttersControl::ascDev
+ ->getAutoShuttersControlShading eq 'on'
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getRainProtectionStatus eq 'unprotected'
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getWindProtectionStatus eq 'unprotected' )
+ {
+ ShadingProcessing(
+ $hash,
+ $shuttersDev,
+ $FHEM::Automation::ShuttersControl::ascDev->getAzimuth,
+ $FHEM::Automation::ShuttersControl::ascDev->getElevation,
+ $outTemp,
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingAzimuthLeft,
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingAzimuthRight
+ );
+
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'EventProcessingShadingBrightness: '
+ . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
+ . ' - Alle Bedingungen zur weiteren Beschattungsverarbeitung sind erfüllt. Es wird nun die eigentliche Beschattungsfunktion aufgerufen'
+ );
+ }
+ }
+
+ return;
+}
+
+sub EventProcessingTwilightDevice {
+ my $hash = shift;
+ my $device = shift;
+ my $events = shift;
+
+ # Twilight
+ # azimuth = azimuth = Sonnenwinkel
+ # elevation = elevation = Sonnenhöhe
+ #
+ # Astro
+ # SunAz = azimuth = Sonnenwinkel
+ # SunAlt = elevation = Sonnenhöhe
+
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'EventProcessingTwilightDevice: '
+ . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
+ . ' - Event vom Astro oder Twilight Device wurde erkannt. Event wird verarbeitet'
+ );
+
+ if ( $events =~ m{(azimuth|elevation|SunAz|SunAlt):\s(\d+.\d+)}xms ) {
+ my $name = $device;
+ my $outTemp = $FHEM::Automation::ShuttersControl::ascDev->getOutTemp;
+ my ( $azimuth, $elevation );
+
+ $azimuth = $2 if ( $1 eq 'azimuth' || $1 eq 'SunAz' );
+ $elevation = $2 if ( $1 eq 'elevation' || $1 eq 'SunAlt' );
+
+ $azimuth = $FHEM::Automation::ShuttersControl::ascDev->getAzimuth
+ if ( !defined($azimuth) && !$azimuth );
+ $elevation = $FHEM::Automation::ShuttersControl::ascDev->getElevation
+ if ( !defined($elevation) && !$elevation );
+
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'EventProcessingTwilightDevice: '
+ . $name
+ . ' - Passendes Event wurde erkannt. Verarbeitung über alle Rollos beginnt'
+ );
+
+ for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
+ $FHEM::Automation::ShuttersControl::shutters->setShuttersDev(
+ $shuttersDev);
+
+ my $homemode =
+ $FHEM::Automation::ShuttersControl::shutters->getRoommatesStatus;
+ $homemode =
+ $FHEM::Automation::ShuttersControl::ascDev->getResidentsStatus
+ if ( $homemode eq 'none' );
+ $outTemp = $FHEM::Automation::ShuttersControl::shutters->getOutTemp
+ if ( $FHEM::Automation::ShuttersControl::shutters->getOutTemp !=
+ -100 );
+
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'EventProcessingTwilightDevice: '
+ . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
+ . ' RainProtection: '
+ . $FHEM::Automation::ShuttersControl::shutters
+ ->getRainProtectionStatus
+ . ' WindProtection: '
+ . $FHEM::Automation::ShuttersControl::shutters
+ ->getWindProtectionStatus );
+
+ if ( $FHEM::Automation::ShuttersControl::ascDev
+ ->getAutoShuttersControlShading eq 'on'
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getRainProtectionStatus eq 'unprotected'
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getWindProtectionStatus eq 'unprotected' )
+ {
+ ShadingProcessing(
+ $hash,
+ $shuttersDev,
+ $azimuth,
+ $elevation,
+ $outTemp,
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingAzimuthLeft,
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingAzimuthRight
+ );
+
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'EventProcessingTwilightDevice: '
+ . $FHEM::Automation::ShuttersControl::shutters
+ ->getShuttersDev
+ . ' - Alle Bedingungen zur weiteren Beschattungsverarbeitung sind erfüllt. Es wird nun die Beschattungsfunktion ausgeführt'
+ );
+ }
+ }
+ }
+
+ return;
+}
+
+sub EventProcessingPartyMode {
+ my $hash = shift;
+
+ my $name = $hash->{NAME};
+
+ for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
+ $FHEM::Automation::ShuttersControl::shutters->setShuttersDev(
+ $shuttersDev);
+ next
+ if ( $FHEM::Automation::ShuttersControl::shutters->getPartyMode eq
+ 'off' );
+
+ if ( !$FHEM::Automation::ShuttersControl::shutters->getIsDay
+ && $FHEM::Automation::ShuttersControl::shutters->getModeDown ne
+ 'off'
+ && IsAfterShuttersManualBlocking($shuttersDev) )
+ {
+ if ( CheckIfShuttersWindowRecOpen($shuttersDev) == 2
+ && $FHEM::Automation::ShuttersControl::shutters->getSubTyp eq
+ 'threestate' )
+ {
+ Log3( $name, 4,
+"AutoShuttersControl ($name) - EventProcessingPartyMode Fenster offen"
+ );
+ $FHEM::Automation::ShuttersControl::shutters->setDelayCmd(
+ $FHEM::Automation::ShuttersControl::shutters->getClosedPos
+ );
+ Log3( $name, 4,
+"AutoShuttersControl ($name) - EventProcessingPartyMode - Spring in ShuttersCommandDelaySet"
+ );
+ }
+ else {
+ Log3( $name, 4,
+"AutoShuttersControl ($name) - EventProcessingPartyMode Fenster nicht offen"
+ );
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ 'drive after party mode');
+ FHEM::Automation::ShuttersControl::ShuttersCommandSet(
+ $hash,
+ $shuttersDev,
+ (
+ CheckIfShuttersWindowRecOpen($shuttersDev) == 0
+ ? $FHEM::Automation::ShuttersControl::shutters
+ ->getClosedPos
+ : $FHEM::Automation::ShuttersControl::shutters
+ ->getVentilatePos
+ )
+ );
+ }
+ }
+ elsif (
+ $FHEM::Automation::ShuttersControl::shutters->getDelayCmd ne 'none'
+ && $FHEM::Automation::ShuttersControl::shutters->getIsDay
+ && IsAfterShuttersManualBlocking($shuttersDev) )
+ {
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ 'drive after party mode');
+ FHEM::Automation::ShuttersControl::ShuttersCommandSet( $hash,
+ $shuttersDev,
+ $FHEM::Automation::ShuttersControl::shutters->getDelayCmd );
+ }
+ }
+
+ return;
+}
+
+sub EventProcessingAdvShuttersClose {
+ my $hash = shift;
+
+ my $name = $hash->{NAME};
+
+ for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
+ $FHEM::Automation::ShuttersControl::shutters->setShuttersDev(
+ $shuttersDev);
+ next
+ if ( !$FHEM::Automation::ShuttersControl::shutters->getAdv
+ && !$FHEM::Automation::ShuttersControl::shutters->getAdvDelay );
+
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ 'adv delay close');
+ $FHEM::Automation::ShuttersControl::shutters->setAdvDelay(1);
+ FHEM::Automation::ShuttersControl::ShuttersCommandSet(
+ $hash,
+ $shuttersDev,
+ (
+ $FHEM::Automation::ShuttersControl::shutters->getDelayCmd ne
+ 'none'
+ ? $FHEM::Automation::ShuttersControl::shutters->getDelayCmd
+ : $FHEM::Automation::ShuttersControl::shutters->getClosedPos
+ )
+ );
+ }
+
+ return;
+}
+
+sub EventProcessingShutters {
+ my $hash = shift;
+ my $shuttersDev = shift;
+ my $events = shift;
+
+ my $name = $hash->{NAME};
+
+ FHEM::Automation::ShuttersControl::ASC_Debug( 'EventProcessingShutters: '
+ . ' Fn wurde durch Notify aufgerufen da ASC_Pos_Reading Event erkannt wurde '
+ . ' - RECEIVED EVENT: '
+ . Dumper $events);
+
+ if ( $events =~ m{.*:\s(\d+)}xms ) {
+ $FHEM::Automation::ShuttersControl::shutters->setShuttersDev(
+ $shuttersDev);
+ $FHEM::Automation::ShuttersControl::ascDev->setPosReading;
+
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'EventProcessingShutters: '
+ . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
+ . ' - Event vom Rollo erkannt. Es wird nun eine etwaige manuelle Fahrt ausgewertet.'
+ . ' Int von gettimeofday: '
+ . int( gettimeofday() )
+ . ' Last Position Timestamp: '
+ . $FHEM::Automation::ShuttersControl::shutters
+ ->getLastPosTimestamp
+ . ' Drive Up Max Duration: '
+ . $FHEM::Automation::ShuttersControl::shutters
+ ->getDriveUpMaxDuration
+ . ' Last Position: '
+ . $FHEM::Automation::ShuttersControl::shutters->getLastPos
+ . ' aktuelle Position: '
+ . $FHEM::Automation::ShuttersControl::shutters->getStatus );
+
+ if (
+ (
+ int( gettimeofday() ) -
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getLastPosTimestamp
+ ) >
+ $FHEM::Automation::ShuttersControl::shutters->getDriveUpMaxDuration
+ && (
+ int( gettimeofday() ) -
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getLastManPosTimestamp ) >
+ $FHEM::Automation::ShuttersControl::shutters->getDriveUpMaxDuration
+ )
+ {
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ 'manual');
+ $FHEM::Automation::ShuttersControl::shutters->setLastDriveReading;
+ $FHEM::Automation::ShuttersControl::ascDev->setStateReading;
+ $FHEM::Automation::ShuttersControl::shutters->setLastManPos($1);
+
+ $FHEM::Automation::ShuttersControl::shutters
+ ->setShadingManualDriveStatus(1)
+ if ( $FHEM::Automation::ShuttersControl::shutters->getIsDay
+ && $FHEM::Automation::ShuttersControl::shutters->getIfInShading
+ );
+
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'EventProcessingShutters: eine manualle Fahrt wurde erkannt!');
+ }
+ else {
+ $FHEM::Automation::ShuttersControl::shutters->setLastDriveReading;
+ $FHEM::Automation::ShuttersControl::ascDev->setStateReading;
+
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+'EventProcessingShutters: eine automatisierte Fahrt durch ASC wurde erkannt! Es werden nun die LastDriveReading und StateReading Werte gesetzt!'
+ );
+ }
+ }
+
+ FHEM::Automation::ShuttersControl::ASC_Debug( 'EventProcessingShutters: '
+ . ' Fn wurde durlaufen und es sollten Debugausgaben gekommen sein. '
+ . ' !!!Wenn nicht!!! wurde der Event nicht korrekt als Nummerisch erkannt. '
+ );
+
+ return;
+}
+
+sub EventProcessingExternalTriggerDevice {
+ my $hash = shift;
+ my $shuttersDev = shift;
+ my $events = shift;
+
+ my $name = $hash->{NAME};
+
+ $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
+
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'EventProcessingExternalTriggerDevice: '
+ . ' Fn wurde durch Notify '
+ . ' - RECEIVED EVENT: '
+ . Dumper $events);
+
+ my $reading =
+ $FHEM::Automation::ShuttersControl::shutters->getExternalTriggerReading;
+ my $triggerValActive = $FHEM::Automation::ShuttersControl::shutters
+ ->getExternalTriggerValueActive;
+ my $triggerValActive2 = $FHEM::Automation::ShuttersControl::shutters
+ ->getExternalTriggerValueActive2;
+ my $triggerValInactive = $FHEM::Automation::ShuttersControl::shutters
+ ->getExternalTriggerValueInactive;
+ my $triggerPosActive =
+ $FHEM::Automation::ShuttersControl::shutters->getExternalTriggerPosActive;
+ my $triggerPosActive2 = $FHEM::Automation::ShuttersControl::shutters
+ ->getExternalTriggerPosActive2;
+ my $triggerPosInactive = $FHEM::Automation::ShuttersControl::shutters
+ ->getExternalTriggerPosInactive;
+
+ if ( $events =~ m{$reading:\s($triggerValActive|$triggerValActive2)}xms ) {
+
+# && !$FHEM::Automation::ShuttersControl::shutters->getQueryShuttersPos($triggerPosActive)
+
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'EventProcessingExternalTriggerDevice: '
+ . ' In der RegEx Schleife Trigger Val Aktiv'
+ . ' - TriggerVal: '
+ . $triggerValActive
+ . ' - TriggerVal2: '
+ . $triggerValActive2 );
+
+ if ( $1 eq $triggerValActive2 ) {
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ 'external trigger2 device active');
+ $FHEM::Automation::ShuttersControl::shutters->setNoDelay(1);
+ $FHEM::Automation::ShuttersControl::shutters
+ ->setExternalTriggerStatus(1);
+ FHEM::Automation::ShuttersControl::ShuttersCommandSet( $hash,
+ $shuttersDev, $triggerPosActive2 );
+ }
+ else {
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ 'external trigger device active');
+ $FHEM::Automation::ShuttersControl::shutters->setNoDelay(1);
+ $FHEM::Automation::ShuttersControl::shutters
+ ->setExternalTriggerStatus(1);
+ FHEM::Automation::ShuttersControl::ShuttersCommandSet( $hash,
+ $shuttersDev, $triggerPosActive );
+ }
+ }
+ elsif (
+ $events =~ m{$reading:\s($triggerValInactive)}xms
+ && ( $FHEM::Automation::ShuttersControl::shutters->getPrivacyDownStatus
+ != 2
+ || $FHEM::Automation::ShuttersControl::shutters->getPrivacyUpStatus
+ != 2 )
+ && !$FHEM::Automation::ShuttersControl::shutters->getIfInShading
+ )
+ {
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'EventProcessingExternalTriggerDevice: '
+ . ' In der RegEx Schleife Trigger Val Inaktiv'
+ . ' - TriggerVal: '
+ . $triggerValInactive );
+
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ 'external trigger device inactive');
+ $FHEM::Automation::ShuttersControl::shutters->setNoDelay(1);
+ $FHEM::Automation::ShuttersControl::shutters->setExternalTriggerStatus(
+ 1);
+ FHEM::Automation::ShuttersControl::ShuttersCommandSet(
+ $hash,
+ $shuttersDev,
+ (
+ $FHEM::Automation::ShuttersControl::shutters->getIsDay
+ ? $triggerPosInactive
+ : $FHEM::Automation::ShuttersControl::shutters->getClosedPos
+ )
+ );
+ }
+
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'EventProcessingExternalTriggerDevice: ' . ' Funktion durchlaufen' );
+
+ return;
+}
+
+
+
+
+1;
diff --git a/fhem/lib/FHEM/Automation/ShuttersControl/Helper.pm b/fhem/lib/FHEM/Automation/ShuttersControl/Helper.pm
new file mode 100644
index 000000000..c212c18a5
--- /dev/null
+++ b/fhem/lib/FHEM/Automation/ShuttersControl/Helper.pm
@@ -0,0 +1,1180 @@
+###############################################################################
+#
+# Developed with Kate
+#
+# (c) 2018-2020 Copyright: Marko Oldenburg (fhemsupport@cooltux.net)
+# 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$
+#
+###############################################################################
+
+## unserer packagename
+package FHEM::Automation::ShuttersControl::Helper;
+
+use strict;
+use warnings;
+use POSIX qw(strftime);
+use utf8;
+
+require Exporter;
+our @ISA = qw(Exporter);
+our @EXPORT_OK = qw(
+ PositionValueWindowRec
+ AutoSearchTwilightDev
+ GetAttrValues
+ CheckIfShuttersWindowRecOpen
+ ExtractNotifyDevFromEvent
+ ShuttersSunrise
+ ShuttersSunset
+ makeReadingName
+ IsWe
+ IsAfterShuttersTimeBlocking
+ IsAfterShuttersManualBlocking
+ AverageBrightness
+ PerlCodeCheck
+ IsAdv
+ IsInTime
+);
+our %EXPORT_TAGS = (
+ ALL => [
+ qw(
+ PositionValueWindowRec
+ AutoSearchTwilightDev
+ GetAttrValues
+ CheckIfShuttersWindowRecOpen
+ ExtractNotifyDevFromEvent
+ ShuttersSunrise
+ ShuttersSunset
+ makeReadingName
+ IsWe
+ IsAfterShuttersTimeBlocking
+ IsAfterShuttersManualBlocking
+ AverageBrightness
+ PerlCodeCheck
+ IsAdv
+ IsInTime
+ )
+ ],
+);
+
+use GPUtils qw(GP_Import);
+## Import der FHEM Funktionen
+BEGIN {
+ GP_Import(
+ qw(
+ devspec2array
+ CommandAttr
+ AttrVal
+ Log3
+ computeAlignTime
+ gettimeofday
+ sunset
+ sunset_abs
+ sunrise
+ sunrise_abs
+ cmdFromAnalyze
+ )
+ );
+}
+
+sub PositionValueWindowRec {
+ my $shuttersDev = shift;
+ my $posValue = shift;
+
+ if ( CheckIfShuttersWindowRecOpen($shuttersDev) == 1
+ && $FHEM::Automation::ShuttersControl::shutters->getVentilateOpen eq
+ 'on' )
+ {
+ $posValue =
+ $FHEM::Automation::ShuttersControl::shutters->getVentilatePos;
+ }
+ elsif ( CheckIfShuttersWindowRecOpen($shuttersDev) == 2
+ && $FHEM::Automation::ShuttersControl::shutters->getSubTyp eq
+ 'threestate'
+ && $FHEM::Automation::ShuttersControl::ascDev
+ ->getAutoShuttersControlComfort eq 'on' )
+ {
+ $posValue =
+ $FHEM::Automation::ShuttersControl::shutters->getComfortOpenPos;
+ }
+ elsif (
+ CheckIfShuttersWindowRecOpen($shuttersDev) == 2
+ && ( $FHEM::Automation::ShuttersControl::shutters->getSubTyp eq
+ 'threestate'
+ || $FHEM::Automation::ShuttersControl::shutters->getSubTyp eq
+ 'twostate' )
+ && $FHEM::Automation::ShuttersControl::shutters->getVentilateOpen eq
+ 'on'
+ )
+ {
+ $posValue =
+ $FHEM::Automation::ShuttersControl::shutters->getVentilatePos;
+ }
+
+ if (
+ $FHEM::Automation::ShuttersControl::shutters->getQueryShuttersPos(
+ $posValue)
+ )
+ {
+ $posValue = $FHEM::Automation::ShuttersControl::shutters->getStatus;
+ }
+
+ return $posValue;
+}
+
+sub AutoSearchTwilightDev {
+ my $hash = shift;
+
+ my $name = $hash->{NAME};
+
+ if ( devspec2array('TYPE=(Astro|Twilight)') > 0 ) {
+ CommandAttr( undef,
+ $name
+ . ' ASC_twilightDevice '
+ . ( devspec2array('TYPE=(Astro|Twilight)') )[0] )
+ if ( AttrVal( $name, 'ASC_twilightDevice', 'none' ) eq 'none' );
+ }
+
+ return;
+}
+
+sub GetAttrValues {
+ my $dev = shift;
+ my $attribut = shift;
+ my $default = shift;
+
+ my @values = split( ' ',
+ AttrVal( $dev, $attribut, ( defined($default) ? $default : 'none' ) ) );
+ my ( $value1, $value2 ) = split( ':', $values[0] );
+
+ my ( $value3, $value4, $value5, $value6, $value7, $value8 );
+ ( $value3, $value4 ) = split( ':', $values[1] )
+ if ( defined( $values[1] ) );
+ ( $value5, $value6 ) = split( ':', $values[2] )
+ if ( defined( $values[2] ) );
+ ( $value7, $value8 ) = split( ':', $values[3] )
+ if ( defined( $values[3] ) );
+
+ return (
+ $value1,
+ defined($value2) ? $value2 : 'none',
+ defined($value3) ? $value3 : 'none',
+ defined($value4) ? $value4 : 'none',
+ defined($value5) ? $value5 : 'none',
+ defined($value6) ? $value6 : 'none',
+ defined($value7) ? $value7 : 'none',
+ defined($value8) ? $value8 : 'none'
+ );
+}
+
+## Kontrolliert ob das Fenster von einem bestimmten Rolladen offen ist
+sub CheckIfShuttersWindowRecOpen {
+ my $shuttersDev = shift;
+ $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
+
+ if ( $FHEM::Automation::ShuttersControl::shutters->getWinStatus =~
+ m{[Oo]pen|false}xms ) # CK: covers: open|opened
+ {
+ return 2;
+ }
+ elsif (
+ $FHEM::Automation::ShuttersControl::shutters->getWinStatus =~ m{tilt}xms
+ && $FHEM::Automation::ShuttersControl::shutters->getSubTyp eq
+ 'threestate' ) # CK: covers: tilt|tilted
+ {
+ return 1;
+ }
+ elsif ( $FHEM::Automation::ShuttersControl::shutters->getWinStatus =~
+ m{[Cc]lose|true}xms )
+ {
+ return 0;
+ } # CK: covers: close|closed
+}
+
+sub ExtractNotifyDevFromEvent {
+ my $hash = shift;
+ my $shuttersDev = shift;
+ my $shuttersAttr = shift;
+
+ my %notifyDevs;
+ while ( my $notifyDev = each %{ $hash->{monitoredDevs} } ) {
+ Log3( $hash->{NAME}, 4,
+"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - NotifyDev: "
+ . $notifyDev );
+ Log3( $hash->{NAME}, 5,
+"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - ShuttersDev: "
+ . $shuttersDev );
+
+ if ( defined( $hash->{monitoredDevs}{$notifyDev}{$shuttersDev} )
+ && $hash->{monitoredDevs}{$notifyDev}{$shuttersDev} eq
+ $shuttersAttr )
+ {
+ Log3( $hash->{NAME}, 4,
+"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - ShuttersDevHash: "
+ . $hash->{monitoredDevs}{$notifyDev}{$shuttersDev} );
+ Log3( $hash->{NAME}, 5,
+"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - return ShuttersDev: "
+ . $notifyDev );
+ $notifyDevs{$notifyDev} = $shuttersDev;
+ }
+ }
+ return \%notifyDevs;
+}
+
+## Ist Tag oder Nacht für den entsprechende Rolladen
+sub _IsDay {
+ my $shuttersDev = shift;
+
+ $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
+
+ my $brightnessMinVal = (
+ $FHEM::Automation::ShuttersControl::shutters->getBrightnessMinVal > -1
+ ? $FHEM::Automation::ShuttersControl::shutters->getBrightnessMinVal
+ : $FHEM::Automation::ShuttersControl::ascDev->getBrightnessMinVal
+ );
+
+ my $brightnessMaxVal = (
+ $FHEM::Automation::ShuttersControl::shutters->getBrightnessMaxVal > -1
+ ? $FHEM::Automation::ShuttersControl::shutters->getBrightnessMaxVal
+ : $FHEM::Automation::ShuttersControl::ascDev->getBrightnessMaxVal
+ );
+
+ my $isday = ( ShuttersSunrise( $shuttersDev, 'unix' ) >
+ ShuttersSunset( $shuttersDev, 'unix' ) ? 1 : 0 );
+ my $respIsDay = $isday;
+
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'FnIsDay: ' . $shuttersDev . ' Allgemein: ' . $respIsDay );
+
+ if (
+ (
+ (
+ (
+ int( gettimeofday() / 86400 ) != int(
+ computeAlignTime( '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpEarly ) / 86400
+ )
+ && !IsWe()
+ )
+ || (
+ int( gettimeofday() / 86400 ) != int(
+ computeAlignTime(
+ '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday
+ ) / 86400
+ )
+ && IsWe()
+ && $FHEM::Automation::ShuttersControl::ascDev
+ ->getSunriseTimeWeHoliday eq 'on'
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday ne '01:25'
+ )
+ )
+ && int( gettimeofday() / 86400 ) == int(
+ computeAlignTime(
+ '24:00',
+ $FHEM::Automation::ShuttersControl::shutters->getTimeUpLate
+ ) / 86400
+ )
+ )
+ || (
+ int( gettimeofday() / 86400 ) != int(
+ computeAlignTime(
+ '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeDownEarly
+ ) / 86400
+ )
+ && int( gettimeofday() / 86400 ) == int(
+ computeAlignTime(
+ '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeDownLate
+ ) / 86400
+ )
+ )
+ )
+ {
+ ##### Nach Sonnenuntergang / Abends
+ $respIsDay = (
+ (
+ (
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getBrightness > $brightnessMinVal
+ && $isday
+ && !$FHEM::Automation::ShuttersControl::shutters
+ ->getSunset
+ )
+ || !$FHEM::Automation::ShuttersControl::shutters->getSunset
+ ) ? 1 : 0
+ )
+ if ( $FHEM::Automation::ShuttersControl::shutters->getDown eq
+ 'brightness' );
+
+ FHEM::Automation::ShuttersControl::ASC_Debug( 'FnIsDay: '
+ . $shuttersDev
+ . ' getDownBrightness: '
+ . $respIsDay
+ . ' Brightness: '
+ . $FHEM::Automation::ShuttersControl::shutters->getBrightness
+ . ' BrightnessMin: '
+ . $brightnessMinVal
+ . ' Sunset: '
+ . $FHEM::Automation::ShuttersControl::shutters->getSunset );
+
+ ##### Nach Sonnenauf / Morgens
+ $respIsDay = (
+ (
+ (
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getBrightness > $brightnessMaxVal
+ && !$isday
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getSunrise
+ )
+ || $respIsDay
+ || $FHEM::Automation::ShuttersControl::shutters->getSunrise
+ ) ? 1 : 0
+ )
+ if ( $FHEM::Automation::ShuttersControl::shutters->getUp eq
+ 'brightness' );
+
+ FHEM::Automation::ShuttersControl::ASC_Debug( 'FnIsDay: '
+ . $shuttersDev
+ . ' getUpBrightness: '
+ . $respIsDay
+ . ' Brightness: '
+ . $FHEM::Automation::ShuttersControl::shutters->getBrightness
+ . ' BrightnessMax: '
+ . $brightnessMaxVal
+ . ' Sunrise: '
+ . $FHEM::Automation::ShuttersControl::shutters->getSunrise );
+ }
+
+ return $respIsDay;
+}
+
+sub ShuttersSunrise {
+ my $shuttersDev = shift;
+ my $tm = shift; # Tm steht für Timemode und bedeutet Realzeit oder Unixzeit
+
+ my $autoAstroMode;
+ $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
+
+ if ( $FHEM::Automation::ShuttersControl::shutters->getAutoAstroModeMorning
+ ne 'none' )
+ {
+ $autoAstroMode =
+ $FHEM::Automation::ShuttersControl::shutters->getAutoAstroModeMorning;
+ $autoAstroMode =
+ $autoAstroMode . '='
+ . $FHEM::Automation::ShuttersControl::shutters
+ ->getAutoAstroModeMorningHorizon
+ if ( $autoAstroMode eq 'HORIZON' );
+ }
+ else {
+ $autoAstroMode =
+ $FHEM::Automation::ShuttersControl::ascDev->getAutoAstroModeMorning;
+ $autoAstroMode =
+ $autoAstroMode . '='
+ . $FHEM::Automation::ShuttersControl::ascDev
+ ->getAutoAstroModeMorningHorizon
+ if ( $autoAstroMode eq 'HORIZON' );
+ }
+ my $oldFuncHash =
+ $FHEM::Automation::ShuttersControl::shutters->getInTimerFuncHash;
+ my $shuttersSunriseUnixtime =
+ computeAlignTime( '24:00', sunrise( 'REAL', 0, '4:30', '8:30' ) );
+
+ if ( $tm eq 'unix' ) {
+ if ( $FHEM::Automation::ShuttersControl::shutters->getUp eq 'astro' ) {
+ if ( ( IsWe() || IsWe('tomorrow') )
+ && $FHEM::Automation::ShuttersControl::ascDev
+ ->getSunriseTimeWeHoliday eq 'on'
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday ne '01:25' )
+ {
+ if ( !IsWe('tomorrow') ) {
+ if (
+ IsWe()
+ && int( gettimeofday() / 86400 ) == int(
+ (
+ computeAlignTime(
+ '24:00',
+ sunrise_abs(
+ $autoAstroMode,
+ 0,
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday
+ )
+ ) + 1
+ ) / 86400
+ )
+ )
+ {
+ $shuttersSunriseUnixtime = (
+ computeAlignTime(
+ '24:00',
+ sunrise_abs(
+ $autoAstroMode,
+ 0,
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday
+ )
+ ) + 1
+ );
+ }
+ elsif (
+ int( gettimeofday() / 86400 ) == int(
+ (
+ computeAlignTime(
+ '24:00',
+ sunrise_abs(
+ $autoAstroMode,
+ 0,
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpEarly,
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpLate
+ )
+ ) + 1
+ ) / 86400
+ )
+ )
+ {
+ $shuttersSunriseUnixtime = (
+ computeAlignTime(
+ '24:00',
+ sunrise_abs(
+ $autoAstroMode,
+ 0,
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday
+ )
+ ) + 1
+ );
+ }
+ else {
+ $shuttersSunriseUnixtime = (
+ computeAlignTime(
+ '24:00',
+ sunrise_abs(
+ $autoAstroMode,
+ 0,
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpEarly,
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpLate
+ )
+ ) + 1
+ );
+ }
+ }
+ else {
+ if (
+ IsWe()
+ && (
+ int( gettimeofday() / 86400 ) == int(
+ (
+ computeAlignTime(
+ '24:00',
+ sunrise_abs(
+ $autoAstroMode,
+ 0,
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday
+ )
+ ) + 1
+ ) / 86400
+ )
+ || int( gettimeofday() / 86400 ) != int(
+ (
+ computeAlignTime(
+ '24:00',
+ sunrise_abs(
+ $autoAstroMode,
+ 0,
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday
+ )
+ ) + 1
+ ) / 86400
+ )
+ )
+ )
+ {
+ $shuttersSunriseUnixtime = (
+ computeAlignTime(
+ '24:00',
+ sunrise_abs(
+ $autoAstroMode,
+ 0,
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday
+ )
+ ) + 1
+ );
+ }
+ elsif (
+ int( gettimeofday() / 86400 ) == int(
+ (
+ computeAlignTime(
+ '24:00',
+ sunrise_abs(
+ $autoAstroMode,
+ 0,
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpEarly,
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpLate
+ )
+ ) + 1
+ ) / 86400
+ )
+ )
+ {
+ $shuttersSunriseUnixtime = (
+ computeAlignTime(
+ '24:00',
+ sunrise_abs(
+ $autoAstroMode,
+ 0,
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpEarly,
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpLate
+ )
+ ) + 1
+ );
+ }
+ else {
+ if (
+ int( gettimeofday() / 86400 ) == int(
+ (
+ computeAlignTime(
+ '24:00',
+ sunrise_abs(
+ $autoAstroMode,
+ 0,
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday
+ )
+ ) + 1
+ ) / 86400
+ )
+ )
+ {
+ $shuttersSunriseUnixtime = (
+ computeAlignTime(
+ '24:00',
+ sunrise_abs(
+ $autoAstroMode,
+ 0,
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday
+ )
+ ) + 86401
+ );
+ }
+ else {
+ $shuttersSunriseUnixtime = (
+ computeAlignTime(
+ '24:00',
+ sunrise_abs(
+ $autoAstroMode,
+ 0,
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday
+ )
+ ) + 1
+ );
+ }
+ }
+ }
+ }
+ else {
+ $shuttersSunriseUnixtime = (
+ computeAlignTime(
+ '24:00',
+ sunrise_abs(
+ $autoAstroMode,
+ 0,
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpEarly,
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpLate
+ )
+ ) + 1
+ );
+ }
+ if ( defined($oldFuncHash)
+ && ref($oldFuncHash) eq 'HASH'
+ && ( IsWe() || IsWe('tomorrow') )
+ && $FHEM::Automation::ShuttersControl::ascDev
+ ->getSunriseTimeWeHoliday eq 'on'
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday ne '01:25' )
+ {
+ if ( !IsWe('tomorrow') ) {
+ if (
+ int( gettimeofday() / 86400 ) == int(
+ (
+ computeAlignTime(
+ '24:00',
+ sunrise_abs(
+ $autoAstroMode,
+ 0,
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpEarly,
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpLate
+ )
+ ) + 1
+ ) / 86400
+ )
+ )
+ {
+ $shuttersSunriseUnixtime =
+ ( $shuttersSunriseUnixtime + 86400 )
+ if ( $shuttersSunriseUnixtime <
+ ( $oldFuncHash->{sunrisetime} + 180 )
+ && $oldFuncHash->{sunrisetime} < gettimeofday() );
+ }
+ }
+ }
+ elsif ( defined($oldFuncHash) && ref($oldFuncHash) eq 'HASH' ) {
+ $shuttersSunriseUnixtime = ( $shuttersSunriseUnixtime + 86400 )
+ if ( $shuttersSunriseUnixtime <
+ ( $oldFuncHash->{sunrisetime} + 180 )
+ && $oldFuncHash->{sunrisetime} < gettimeofday() );
+ }
+ }
+ elsif ( $FHEM::Automation::ShuttersControl::shutters->getUp eq 'time' )
+ {
+ if ( ( IsWe() || IsWe('tomorrow') )
+ && $FHEM::Automation::ShuttersControl::ascDev
+ ->getSunriseTimeWeHoliday eq 'on'
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday ne '01:25' )
+ {
+ if ( !IsWe('tomorrow') ) {
+ if (
+ int( gettimeofday() / 86400 ) == int(
+ computeAlignTime(
+ '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday
+ ) / 86400
+ )
+ )
+ {
+ $shuttersSunriseUnixtime = computeAlignTime( '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday );
+ }
+ elsif (
+ int( gettimeofday() / 86400 ) == int(
+ computeAlignTime(
+ '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpEarly
+ ) / 86400
+ )
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getSunrise
+ )
+ {
+ $shuttersSunriseUnixtime = computeAlignTime( '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpEarly ) + 86400;
+ }
+ else {
+ $shuttersSunriseUnixtime = computeAlignTime( '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpEarly );
+ }
+ }
+ else {
+ if (
+ IsWe()
+ && int( gettimeofday() / 86400 ) == int(
+ computeAlignTime(
+ '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday
+ ) / 86400
+ )
+ )
+ {
+ $shuttersSunriseUnixtime = computeAlignTime( '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday );
+ }
+ elsif (
+ int( gettimeofday() / 86400 ) == int(
+ computeAlignTime(
+ '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpEarly
+ ) / 86400
+ )
+ )
+ {
+ $shuttersSunriseUnixtime = computeAlignTime( '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpEarly );
+ }
+ elsif (
+ int( gettimeofday() / 86400 ) != int(
+ computeAlignTime(
+ '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday
+ ) / 86400
+ )
+ )
+ {
+ $shuttersSunriseUnixtime = computeAlignTime( '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday );
+ }
+ else {
+ $shuttersSunriseUnixtime = computeAlignTime( '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday ) + 86400;
+ }
+ }
+ }
+ else {
+ $shuttersSunriseUnixtime = computeAlignTime( '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpEarly );
+ }
+ }
+ elsif ( $FHEM::Automation::ShuttersControl::shutters->getUp eq
+ 'brightness' )
+ {
+ if ( ( IsWe() || IsWe('tomorrow') )
+ && $FHEM::Automation::ShuttersControl::ascDev
+ ->getSunriseTimeWeHoliday eq 'on'
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday ne '01:25' )
+ {
+ if ( !IsWe('tomorrow') ) {
+ if (
+ IsWe()
+ && int( gettimeofday() / 86400 ) == int(
+ (
+ computeAlignTime(
+ '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday
+ )
+ ) / 86400
+ )
+ )
+ {
+ $shuttersSunriseUnixtime = computeAlignTime( '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday );
+ }
+ elsif (
+ int( gettimeofday() / 86400 ) == int(
+ (
+ computeAlignTime(
+ '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpLate
+ )
+ ) / 86400
+ )
+ )
+ {
+ $shuttersSunriseUnixtime = computeAlignTime( '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday );
+ }
+ else {
+ $shuttersSunriseUnixtime = computeAlignTime( '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpLate );
+ }
+ }
+ else {
+ if (
+ IsWe()
+ && (
+ int( gettimeofday() / 86400 ) == int(
+ (
+ computeAlignTime(
+ '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday
+ )
+ ) / 86400
+ )
+ || int( gettimeofday() / 86400 ) != int(
+ (
+ computeAlignTime(
+ '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday
+ )
+ ) / 86400
+ )
+ )
+ )
+ {
+ $shuttersSunriseUnixtime = computeAlignTime( '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday );
+ }
+ elsif (
+ int( gettimeofday() / 86400 ) == int(
+ (
+ computeAlignTime(
+ '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpLate
+ )
+ ) / 86400
+ )
+ )
+ {
+ $shuttersSunriseUnixtime = computeAlignTime( '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpLate );
+ }
+ else {
+ if (
+ int( gettimeofday() / 86400 ) == int(
+ (
+ computeAlignTime(
+ '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday
+ )
+ ) / 86400
+ )
+ )
+ {
+ $shuttersSunriseUnixtime = computeAlignTime(
+ '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday
+ );
+ }
+ else {
+ $shuttersSunriseUnixtime = computeAlignTime(
+ '24:00',
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeUpWeHoliday
+ );
+ }
+ }
+ }
+ }
+ else {
+
+ $shuttersSunriseUnixtime = computeAlignTime( '24:00',
+ $FHEM::Automation::ShuttersControl::shutters->getTimeUpLate
+ );
+ }
+ }
+
+ return $shuttersSunriseUnixtime;
+ }
+ elsif ( $tm eq 'real' ) {
+ return sunrise_abs(
+ $autoAstroMode,
+ 0,
+ $FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly,
+ $FHEM::Automation::ShuttersControl::shutters->getTimeUpLate
+ )
+ if ( $FHEM::Automation::ShuttersControl::shutters->getUp eq 'astro' );
+ return $FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly
+ if ( $FHEM::Automation::ShuttersControl::shutters->getUp eq 'time' );
+ }
+
+ return;
+}
+
+sub ShuttersSunset {
+ my $shuttersDev = shift;
+ my $tm = shift; # Tm steht für Timemode und bedeutet Realzeit oder Unixzeit
+
+ my $autoAstroMode;
+ $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
+
+ if ( $FHEM::Automation::ShuttersControl::shutters->getAutoAstroModeEvening
+ ne 'none' )
+ {
+ $autoAstroMode =
+ $FHEM::Automation::ShuttersControl::shutters->getAutoAstroModeEvening;
+ $autoAstroMode =
+ $autoAstroMode . '='
+ . $FHEM::Automation::ShuttersControl::shutters
+ ->getAutoAstroModeEveningHorizon
+ if ( $autoAstroMode eq 'HORIZON' );
+ }
+ else {
+ $autoAstroMode =
+ $FHEM::Automation::ShuttersControl::ascDev->getAutoAstroModeEvening;
+ $autoAstroMode =
+ $autoAstroMode . '='
+ . $FHEM::Automation::ShuttersControl::ascDev
+ ->getAutoAstroModeEveningHorizon
+ if ( $autoAstroMode eq 'HORIZON' );
+ }
+ my $oldFuncHash =
+ $FHEM::Automation::ShuttersControl::shutters->getInTimerFuncHash;
+ my $shuttersSunsetUnixtime =
+ computeAlignTime( '24:00', sunset( 'REAL', 0, '15:30', '21:30' ) );
+
+ if ( $tm eq 'unix' ) {
+ if ( $FHEM::Automation::ShuttersControl::shutters->getDown eq 'astro' )
+ {
+ $shuttersSunsetUnixtime = (
+ computeAlignTime(
+ '24:00',
+ sunset_abs(
+ $autoAstroMode,
+ 0,
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeDownEarly,
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getTimeDownLate
+ )
+ ) + 1
+ );
+ if ( defined($oldFuncHash) && ref($oldFuncHash) eq 'HASH' ) {
+ $shuttersSunsetUnixtime += 86400
+ if ( $shuttersSunsetUnixtime <
+ ( $oldFuncHash->{sunsettime} + 180 )
+ && $oldFuncHash->{sunsettime} < gettimeofday() );
+ }
+ }
+ elsif (
+ $FHEM::Automation::ShuttersControl::shutters->getDown eq 'time' )
+ {
+ $shuttersSunsetUnixtime = computeAlignTime( '24:00',
+ $FHEM::Automation::ShuttersControl::shutters->getTimeDownEarly
+ );
+ }
+ elsif ( $FHEM::Automation::ShuttersControl::shutters->getDown eq
+ 'brightness' )
+ {
+ $shuttersSunsetUnixtime =
+ computeAlignTime( '24:00',
+ $FHEM::Automation::ShuttersControl::shutters->getTimeDownLate );
+ }
+ return $shuttersSunsetUnixtime;
+ }
+ elsif ( $tm eq 'real' ) {
+ return sunset_abs(
+ $autoAstroMode,
+ 0,
+ $FHEM::Automation::ShuttersControl::shutters->getTimeDownEarly,
+ $FHEM::Automation::ShuttersControl::shutters->getTimeDownLate
+ )
+ if (
+ $FHEM::Automation::ShuttersControl::shutters->getDown eq 'astro' );
+ return $FHEM::Automation::ShuttersControl::shutters->getTimeDownEarly
+ if (
+ $FHEM::Automation::ShuttersControl::shutters->getDown eq 'time' );
+ }
+
+ return;
+}
+
+sub IsAfterShuttersTimeBlocking {
+ my $shuttersDev = shift;
+
+ $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
+
+ if (
+ (
+ int( gettimeofday() ) -
+ $FHEM::Automation::ShuttersControl::shutters->getLastManPosTimestamp
+ ) <
+ $FHEM::Automation::ShuttersControl::shutters->getBlockingTimeAfterManual
+ || (
+ !$FHEM::Automation::ShuttersControl::shutters->getIsDay
+ && defined(
+ $FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime
+ )
+ && $FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime
+ - ( int( gettimeofday() ) ) <
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getBlockingTimeBeforDayOpen
+ )
+ || (
+ $FHEM::Automation::ShuttersControl::shutters->getIsDay
+ && defined(
+ $FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime
+ )
+ && $FHEM::Automation::ShuttersControl::shutters->getSunsetUnixTime
+ - ( int( gettimeofday() ) ) <
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getBlockingTimeBeforNightClose
+ )
+ )
+ {
+ return 0;
+ }
+
+ else { return 1 }
+}
+
+sub IsAfterShuttersManualBlocking {
+ my $shuttersDev = shift;
+ $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
+
+ if (
+ $FHEM::Automation::ShuttersControl::ascDev->getBlockAscDrivesAfterManual
+ && $FHEM::Automation::ShuttersControl::shutters->getStatus !=
+ $FHEM::Automation::ShuttersControl::shutters->getOpenPos
+ && $FHEM::Automation::ShuttersControl::shutters->getStatus !=
+ $FHEM::Automation::ShuttersControl::shutters->getClosedPos
+ && $FHEM::Automation::ShuttersControl::shutters->getStatus !=
+ $FHEM::Automation::ShuttersControl::shutters->getWindPos
+ && $FHEM::Automation::ShuttersControl::shutters->getStatus !=
+ $FHEM::Automation::ShuttersControl::shutters->getShadingPos
+ && $FHEM::Automation::ShuttersControl::shutters->getStatus !=
+ $FHEM::Automation::ShuttersControl::shutters->getComfortOpenPos
+ && $FHEM::Automation::ShuttersControl::shutters->getStatus !=
+ $FHEM::Automation::ShuttersControl::shutters->getVentilatePos
+ && $FHEM::Automation::ShuttersControl::shutters->getStatus !=
+ $FHEM::Automation::ShuttersControl::shutters->getAntiFreezePos
+ && $FHEM::Automation::ShuttersControl::shutters->getLastDrive eq
+ 'manual' )
+ {
+ return 0;
+ }
+ elsif (
+ (
+ int( gettimeofday() ) -
+ $FHEM::Automation::ShuttersControl::shutters->getLastManPosTimestamp
+ ) <
+ $FHEM::Automation::ShuttersControl::shutters->getBlockingTimeAfterManual
+ )
+ {
+ return 0;
+ }
+
+ else { return 1 }
+}
+
+sub makeReadingName {
+ my ($rname) = shift;
+ my %charHash = (
+ chr(0xe4) => "ae", # ä
+ chr(0xc4) => "Ae", # Ä
+ chr(0xfc) => "ue", # ü
+ chr(0xdc) => "Ue", # Ü
+ chr(0xf6) => "oe", # ö
+ chr(0xd6) => "Oe", # Ö
+ chr(0xdf) => "ss" # ß
+ );
+ my $charHashkeys = join( "", keys(%charHash) );
+
+ return $rname if ( $rname =~ m{^\./}xms );
+ $rname =~ s/([$charHashkeys])/$charHash{$1}/xgi;
+ $rname =~ s/[^a-z0-9._\-\/]/_/xgi;
+ return $rname;
+}
+
+sub IsWe {
+ return main::IsWe( shift, shift );
+}
+
+sub AverageBrightness {
+ my @input = @_;
+ use List::Util qw(sum);
+
+ return int( sum(@input) / @input );
+}
+
+sub PerlCodeCheck {
+ my $exec = shift;
+ my $val = undef;
+
+ if ( $exec =~ m{\A\{(.+)\}\z}xms ) {
+ $val = main::AnalyzePerlCommand( undef, $1 );
+ }
+
+ return $val;
+}
+
+sub IsAdv {
+ my ( undef, undef, undef, $monthday, $month, $year, undef, undef, undef ) =
+ localtime( gettimeofday() );
+ my $adv = 0;
+ $year += 1900;
+
+ if ( $month < 1 ) {
+ if ( $monthday < 7 ) {
+ $adv = 1;
+ }
+ }
+ else {
+ my $time = HTTP::Date::str2time( $year . '-12-25' );
+ my $wday = ( localtime($time) )[6];
+ $wday = $wday ? $wday : 7;
+ $time -= ( $wday + 21 ) * 86400;
+ $adv = 1 if ( $time < time );
+ }
+
+ return $adv;
+}
+
+sub IsInTime {
+ my $dfi = shift;
+
+ $dfi =~ s/{([^\x7d]*)}/$cmdFromAnalyze=$1; eval $1/ge; # Forum #69787
+ my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime(gettimeofday());
+ my $dhms = sprintf("%s\@%02d:%02d:%02d", $wday, $hour, $min, $sec);
+ foreach my $ft (split(" ", $dfi)) {
+ my ($from, $to) = split("-", $ft);
+ if(defined($from) && defined($to)) {
+ $from = "$wday\@$from" if(index($from,"@") < 0);
+ $to = "$wday\@$to" if(index($to, "@") < 0);
+ return 1 if($from le $dhms && $dhms le $to);
+ }
+ }
+
+ return 0;
+}
+
+1;
diff --git a/fhem/lib/FHEM/Automation/ShuttersControl/Roommate.pm b/fhem/lib/FHEM/Automation/ShuttersControl/Roommate.pm
index a0da8c192..30a17b7f6 100644
--- a/fhem/lib/FHEM/Automation/ShuttersControl/Roommate.pm
+++ b/fhem/lib/FHEM/Automation/ShuttersControl/Roommate.pm
@@ -74,4 +74,7 @@ sub _getRoommateLastStatus {
return ReadingsVal( $roommate, 'lastState', $default );
}
+
+
+
1;
diff --git a/fhem/lib/FHEM/Automation/ShuttersControl/Shading.pm b/fhem/lib/FHEM/Automation/ShuttersControl/Shading.pm
new file mode 100644
index 000000000..ae48219ca
--- /dev/null
+++ b/fhem/lib/FHEM/Automation/ShuttersControl/Shading.pm
@@ -0,0 +1,628 @@
+###############################################################################
+#
+# Developed with Kate
+#
+# (c) 2018-2020 Copyright: Marko Oldenburg (fhemsupport@cooltux.net)
+# 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$
+#
+###############################################################################
+
+## unserer packagename
+package FHEM::Automation::ShuttersControl::Shading;
+
+use strict;
+use warnings;
+use POSIX qw(strftime);
+use utf8;
+
+use FHEM::Automation::ShuttersControl::Helper qw (IsInTime);
+
+require Exporter;
+our @ISA = qw(Exporter);
+our @EXPORT_OK = qw(
+ CheckASC_ConditionsForShadingFn
+ ShadingProcessing
+ ShadingProcessingDriveCommand
+);
+our %EXPORT_TAGS = (
+ ALL => [
+ qw(
+ CheckASC_ConditionsForShadingFn
+ ShadingProcessing
+ ShadingProcessingDriveCommand
+ )
+ ],
+);
+
+use GPUtils qw(GP_Import);
+## Import der FHEM Funktionen
+BEGIN {
+ GP_Import(
+ qw(
+ Log3
+ gettimeofday
+ InternalTimer
+ ReadingsVal
+ readingsBeginUpdate
+ readingsBulkUpdate
+ readingsBulkUpdateIfChanged
+ readingsEndUpdate
+ defs
+ )
+ );
+}
+
+sub CheckASC_ConditionsForShadingFn {
+ my $hash = shift;
+
+ my $error;
+
+ $error .=
+' no valid data from the ASC temperature sensor, is ASC_tempSensor attribut set?'
+ if ( $FHEM::Automation::ShuttersControl::ascDev->getOutTemp == -100 );
+ $error .= ' no twilight device found'
+ if ( $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice eq
+ 'none' );
+
+ my $count = 1;
+ for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
+ InternalTimer(
+ gettimeofday() + $count,
+'FHEM::Automation::ShuttersControl::Shading::_CheckShuttersConditionsForShadingFn',
+ $shuttersDev
+ );
+
+ $count++;
+ }
+
+ return (
+ defined($error)
+ ? $error
+ : 'none'
+ );
+}
+
+sub _CheckShuttersConditionsForShadingFn {
+ my $shuttersDev = shift;
+
+ $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
+ my $shuttersDevHash = $defs{$shuttersDev};
+ my $message = '';
+ my $errorMessage;
+ my $warnMessage;
+ my $infoMessage;
+
+ $infoMessage .= (
+ $FHEM::Automation::ShuttersControl::shutters->getShadingMode ne 'off'
+ && $FHEM::Automation::ShuttersControl::ascDev
+ ->getAutoShuttersControlShading eq 'on'
+ && $FHEM::Automation::ShuttersControl::shutters->getOutTemp == -100
+ ? ' shading active, global temp sensor is set, but shutters temperature sensor is not set'
+ : ''
+ );
+
+ $warnMessage .= (
+ $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq 'off'
+ && $FHEM::Automation::ShuttersControl::ascDev
+ ->getAutoShuttersControlShading eq 'on'
+ ? ' global shading active but ASC_Shading_Mode attribut is not set or off'
+ : ''
+ );
+
+ $errorMessage .= (
+ $FHEM::Automation::ShuttersControl::shutters->getShadingMode ne 'off'
+ && $FHEM::Automation::ShuttersControl::ascDev
+ ->getAutoShuttersControlShading ne 'on'
+ && $FHEM::Automation::ShuttersControl::ascDev
+ ->getAutoShuttersControlShading ne 'off'
+ ? ' ASC_Shading_Mode attribut is set but global shading has errors, look at ASC device '
+ . ''
+ . ReadingsVal( $shuttersDev, 'associatedWith', 'ASC device' )
+ . ''
+ : ''
+ );
+
+ $errorMessage .= (
+ $FHEM::Automation::ShuttersControl::shutters->getBrightness == -1
+ && $FHEM::Automation::ShuttersControl::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 ''
+ && $errorMessage eq '' );
+
+ $message .= ' INFO: ' . $infoMessage
+ if ( defined($infoMessage)
+ && $infoMessage ne ''
+ && $errorMessage eq '' );
+
+ readingsBeginUpdate($shuttersDevHash);
+ readingsBulkUpdateIfChanged( $shuttersDevHash, 'ASC_ShadingMessage',
+ '' . $message . ' ' );
+ readingsEndUpdate( $shuttersDevHash, 1 );
+}
+
+sub ShadingProcessing {
+### angleMinus ist $FHEM::Automation::ShuttersControl::shutters->getShadingAzimuthLeft
+### anglePlus ist $FHEM::Automation::ShuttersControl::shutters->getShadingAzimuthRight
+### winPos ist die Fensterposition $FHEM::Automation::ShuttersControl::shutters->getDirection
+ my ( $hash, $shuttersDev, $azimuth, $elevation, $outTemp,
+ $azimuthLeft, $azimuthRight )
+ = @_;
+
+ my $name = $hash->{NAME};
+ $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
+ my $brightness =
+ $FHEM::Automation::ShuttersControl::shutters->getBrightnessAverage;
+
+ $FHEM::Automation::ShuttersControl::shutters->setShadingBetweenTheTimeSuspend(
+ ( IsInTime($FHEM::Automation::ShuttersControl::shutters->getShadingBetweenTheTime)
+ ? 0
+ : 1 )
+ );
+
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'ShadingProcessing: '
+ . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
+ . ' - Übergebende Werte - Azimuth:'
+ . $azimuth
+ . ', Elevation: '
+ . $elevation
+ . ', Brightness: '
+ . $brightness
+ . ', OutTemp: '
+ . $outTemp
+ . ', Azimut Beschattung: '
+ . $azimuthLeft
+ . ', Azimut Endschattung: '
+ . $azimuthRight
+ . ', Ist es nach der Zeitblockadezeit: '
+ . (
+ FHEM::Automation::ShuttersControl::IsAfterShuttersTimeBlocking(
+ $shuttersDev) ? 'JA' : 'NEIN'
+ )
+ . ', Das Rollo ist in der Beschattung und wurde manuell gefahren: '
+ . (
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingManualDriveStatus ? 'JA' : 'NEIN'
+ )
+ . ', Ist es nach der Hälfte der Beschattungswartezeit: '
+ . (
+ (
+ int( gettimeofday() ) -
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingStatusTimestamp
+ ) < (
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingWaitingPeriod / 2
+ ) ? 'NEIN' : 'JA'
+ )
+ );
+
+ Log3( $name, 4,
+ "AutoShuttersControl ($name) - Shading Processing, Rollladen: "
+ . $shuttersDev
+ . " Azimuth: "
+ . $azimuth
+ . " Elevation: "
+ . $elevation
+ . " Brightness: "
+ . $brightness
+ . " OutTemp: "
+ . $outTemp );
+
+ return
+ if (
+ $azimuth == -1
+ || $elevation == -1
+ || $brightness == -1
+ || $outTemp == -100
+ || (
+ int( gettimeofday() ) -
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingStatusTimestamp ) < (
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingWaitingPeriod / 2
+ )
+ || $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq 'off'
+ );
+
+ Log3( $name, 4,
+ "AutoShuttersControl ($name) - Shading Processing, Rollladen: "
+ . $shuttersDev
+ . " Nach dem return" );
+
+ my $getShadingPos =
+ $FHEM::Automation::ShuttersControl::shutters->getShadingPos;
+ my $getStatus = $FHEM::Automation::ShuttersControl::shutters->getStatus;
+ my $oldShadingStatus =
+ $FHEM::Automation::ShuttersControl::shutters->getShadingStatus;
+ my $shuttersDevHash = $defs{$shuttersDev};
+
+ my $getModeUp = $FHEM::Automation::ShuttersControl::shutters->getModeUp;
+ my $homemode = $FHEM::Automation::ShuttersControl::shutters->getHomemode;
+
+ FHEM::Automation::ShuttersControl::ASC_Debug( 'ShadingProcessing: '
+ . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
+ . ' - Alle Werte für die weitere Verarbeitung sind korrekt vorhanden und es wird nun mit der Beschattungsverarbeitung begonnen'
+ );
+
+ if (
+ (
+ $outTemp < $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingMinOutsideTemperature - 4
+ || $azimuth < $azimuthLeft
+ || $azimuth > $azimuthRight
+ || !$FHEM::Automation::ShuttersControl::shutters->getIsDay
+ )
+ && $FHEM::Automation::ShuttersControl::shutters->getShadingStatus ne
+ 'out'
+ )
+ {
+ $FHEM::Automation::ShuttersControl::shutters->setShadingStatus('out');
+
+ FHEM::Automation::ShuttersControl::ASC_Debug( 'ShadingProcessing: '
+ . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
+ . ' - Es ist Nacht oder die Aussentemperatur unterhalb der Shading Temperatur. Die Beschattung wird Zwangsbeendet'
+ );
+
+ Log3( $name, 4,
+"AutoShuttersControl ($name) - Shading Processing - Der Sonnenstand ist ausserhalb der Winkelangaben oder die Aussentemperatur unterhalb der Shading Temperatur "
+ );
+ }
+ elsif ($azimuth < $azimuthLeft
+ || $azimuth > $azimuthRight
+ || $elevation <
+ $FHEM::Automation::ShuttersControl::shutters->getShadingMinElevation
+ || $elevation >
+ $FHEM::Automation::ShuttersControl::shutters->getShadingMaxElevation
+ || $brightness < $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingStateChangeCloudy
+ || $outTemp < $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingMinOutsideTemperature - 1 )
+ {
+ $FHEM::Automation::ShuttersControl::shutters->setShadingStatus(
+ 'out reserved')
+ if ( $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq
+ 'in'
+ || $FHEM::Automation::ShuttersControl::shutters->getShadingStatus
+ eq 'in reserved' );
+
+ if (
+ (
+ $FHEM::Automation::ShuttersControl::shutters->getShadingStatus
+ eq 'out reserved'
+ and (
+ int( gettimeofday() ) -
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingStatusTimestamp )
+ ) > $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingWaitingPeriod
+ )
+ {
+ $FHEM::Automation::ShuttersControl::shutters->setShadingStatus(
+ 'out');
+ }
+
+ Log3( $name, 4,
+ "AutoShuttersControl ($name) - Shading Processing, Rollladen: "
+ . $shuttersDev
+ . " In der Out Abfrage, Shadingwert: "
+ . $FHEM::Automation::ShuttersControl::shutters->getShadingStatus
+ . ", Zeitstempel: "
+ . $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingStatusTimestamp );
+
+ FHEM::Automation::ShuttersControl::ASC_Debug( 'ShadingProcessing: '
+ . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
+ . ' - Einer der Beschattungsbedingungen wird nicht mehr erfüllt und somit wird der Beschattungsstatus um eine Stufe reduziert. Alter Status: '
+ . $oldShadingStatus
+ . ' Neuer Status: '
+ . $FHEM::Automation::ShuttersControl::shutters->getShadingStatus
+ );
+ }
+ elsif ($azimuth > $azimuthLeft
+ && $azimuth < $azimuthRight
+ && $elevation >
+ $FHEM::Automation::ShuttersControl::shutters->getShadingMinElevation
+ && $elevation <
+ $FHEM::Automation::ShuttersControl::shutters->getShadingMaxElevation
+ && $brightness >
+ $FHEM::Automation::ShuttersControl::shutters->getShadingStateChangeSunny
+ && $outTemp > $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingMinOutsideTemperature )
+ {
+ if ( $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq
+ 'out'
+ || $FHEM::Automation::ShuttersControl::shutters->getShadingStatus
+ eq 'out reserved' )
+ {
+ $FHEM::Automation::ShuttersControl::shutters->setShadingStatus(
+ 'in reserved');
+
+ }
+
+ if (
+ $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq
+ 'in reserved'
+ and (
+ int( gettimeofday() ) -
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingStatusTimestamp ) > (
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingWaitingPeriod / 2
+ )
+ )
+ {
+ $FHEM::Automation::ShuttersControl::shutters->setShadingStatus(
+ 'in');
+ }
+
+ Log3( $name, 4,
+ "AutoShuttersControl ($name) - Shading Processing, Rollladen: "
+ . $shuttersDev
+ . " In der In Abfrage, Shadingwert: "
+ . $FHEM::Automation::ShuttersControl::shutters->getShadingStatus
+ . ", Zeitstempel: "
+ . $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingStatusTimestamp );
+
+ FHEM::Automation::ShuttersControl::ASC_Debug( 'ShadingProcessing: '
+ . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
+ . ' - Alle Beschattungsbedingungen wurden erfüllt und somit wird der Beschattungsstatus um eine Stufe angehoben. Alter Status: '
+ . $oldShadingStatus
+ . ' Neuer Status: '
+ . $FHEM::Automation::ShuttersControl::shutters->getShadingStatus
+ );
+ }
+
+ ShadingProcessingDriveCommand( $hash, $shuttersDev )
+ if (
+ FHEM::Automation::ShuttersControl::IsAfterShuttersTimeBlocking(
+ $shuttersDev)
+ && !$FHEM::Automation::ShuttersControl::shutters
+ ->getShadingManualDriveStatus
+ && $FHEM::Automation::ShuttersControl::shutters->getRoommatesStatus ne
+ 'gotosleep'
+ && $FHEM::Automation::ShuttersControl::shutters->getRoommatesStatus ne
+ 'asleep'
+ && (
+ (
+ $FHEM::Automation::ShuttersControl::shutters->getShadingStatus
+ eq 'out'
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingLastStatus eq 'in'
+ )
+ || ( $FHEM::Automation::ShuttersControl::shutters->getShadingStatus
+ eq 'in'
+ && $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingLastStatus eq 'out' )
+ )
+ && ( $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq
+ 'always'
+ || $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq
+ $homemode )
+ && (
+ $FHEM::Automation::ShuttersControl::shutters->getModeUp eq 'always'
+ || $FHEM::Automation::ShuttersControl::shutters->getModeUp eq
+ $homemode
+ || $FHEM::Automation::ShuttersControl::shutters->getModeUp eq 'off'
+ || $FHEM::Automation::ShuttersControl::shutters->getModeUp eq
+ 'absent'
+ || ( $FHEM::Automation::ShuttersControl::shutters->getModeUp eq
+ 'home'
+ && $homemode ne 'asleep' )
+ )
+ && (
+ (
+ (
+ int( gettimeofday() ) -
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingStatusTimestamp
+ ) < 2
+ && $FHEM::Automation::ShuttersControl::shutters->getStatus !=
+ $FHEM::Automation::ShuttersControl::shutters->getClosedPos
+ )
+ || (
+ !$FHEM::Automation::ShuttersControl::shutters
+ ->getQueryShuttersPos(
+ $FHEM::Automation::ShuttersControl::shutters->getShadingPos
+ )
+ && $FHEM::Automation::ShuttersControl::shutters->getIfInShading
+ )
+ || ( !$FHEM::Automation::ShuttersControl::shutters->getIfInShading
+ && $FHEM::Automation::ShuttersControl::shutters->getStatus ==
+ $FHEM::Automation::ShuttersControl::shutters->getShadingPos
+ )
+ || ( !$FHEM::Automation::ShuttersControl::shutters->getShadingBetweenTheTimeSuspend
+ && $FHEM::Automation::ShuttersControl::shutters->getStatus !=
+ $FHEM::Automation::ShuttersControl::shutters->getShadingPos )
+ )
+ );
+
+ readingsBeginUpdate($shuttersDevHash);
+ readingsBulkUpdate(
+ $shuttersDevHash,
+ 'ASC_ShadingMessage',
+ 'INFO: current shading status is \''
+ . $FHEM::Automation::ShuttersControl::shutters->getShadingStatus
+ . '\''
+ . ' - next check in '
+ . (
+ (
+ (
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingLastStatus eq 'out reserved'
+ || $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingLastStatus eq 'out'
+ )
+ ? $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingWaitingPeriod
+ : $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingWaitingPeriod / 2
+ )
+ ) / 60
+ . 'm'
+ );
+ readingsEndUpdate( $shuttersDevHash, 1 );
+
+ return;
+}
+
+sub ShadingProcessingDriveCommand {
+ my $hash = shift;
+ my $shuttersDev = shift;
+
+ my $name = $hash->{NAME};
+ $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
+
+ my $getShadingPos =
+ $FHEM::Automation::ShuttersControl::shutters->getShadingPos;
+ my $getStatus = $FHEM::Automation::ShuttersControl::shutters->getStatus;
+
+ $FHEM::Automation::ShuttersControl::shutters->setShadingStatus(
+ $FHEM::Automation::ShuttersControl::shutters->getShadingStatus );
+
+ if ( IsInTime($FHEM::Automation::ShuttersControl::shutters->getShadingBetweenTheTime)
+ && $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq 'in'
+ && $getShadingPos != $getStatus
+ && $getStatus != $FHEM::Automation::ShuttersControl::shutters->getClosedPos
+ && (
+ FHEM::Automation::ShuttersControl::CheckIfShuttersWindowRecOpen(
+ $shuttersDev) != 2
+ || $FHEM::Automation::ShuttersControl::shutters->getShuttersPlace
+ ne 'terrace'
+ )
+ )
+ {
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ 'shading in');
+ FHEM::Automation::ShuttersControl::ShuttersCommandSet( $hash,
+ $shuttersDev, $getShadingPos );
+
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'ShadingProcessingDriveCommand: '
+ . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
+ . ' - Der aktuelle Beschattungsstatus ist: '
+ . $FHEM::Automation::ShuttersControl::shutters->getShadingStatus
+ . ' und somit wird nun in die Position: '
+ . $getShadingPos
+ . ' zum Beschatten gefahren' );
+
+ $FHEM::Automation::ShuttersControl::shutters->setShadingLastPos(
+ $getShadingPos);
+ }
+ elsif (
+ $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq 'out'
+ && $getShadingPos == $getStatus )
+ {
+ $FHEM::Automation::ShuttersControl::shutters->setLastDrive(
+ 'shading out');
+
+ FHEM::Automation::ShuttersControl::ShuttersCommandSet(
+ $hash,
+ $shuttersDev,
+ (
+ (
+ $getShadingPos ==
+ $FHEM::Automation::ShuttersControl::shutters->getLastPos
+ || $getShadingPos ==
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingLastPos
+ )
+ ? $FHEM::Automation::ShuttersControl::shutters->getOpenPos
+ : (
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getQueryShuttersPos(
+ $FHEM::Automation::ShuttersControl::shutters->getLastPos
+ )
+ ? (
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getLastPos ==
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getSleepPos
+ ? $FHEM::Automation::ShuttersControl::shutters
+ ->getOpenPos
+ : $FHEM::Automation::ShuttersControl::shutters
+ ->getLastPos
+ )
+ : $FHEM::Automation::ShuttersControl::shutters->getOpenPos
+ )
+ )
+ ) if ( $FHEM::Automation::ShuttersControl::shutters->getIsDay
+ || $FHEM::Automation::ShuttersControl::shutters->getShuttersPlace eq 'awning' );
+
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'ShadingProcessingDriveCommand: '
+ . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
+ . ' - Der aktuelle Beschattungsstatus ist: '
+ . $FHEM::Automation::ShuttersControl::shutters->getShadingStatus
+ . ' und somit wird nun in die Position: '
+ . $getShadingPos
+ . ' zum beenden der Beschattung gefahren' );
+ }
+
+ Log3( $name, 4,
+"AutoShuttersControl ($name) - Shading Processing - In der Routine zum fahren der Rollläden, Shading Wert: "
+ . $FHEM::Automation::ShuttersControl::shutters->getShadingStatus );
+
+ FHEM::Automation::ShuttersControl::ASC_Debug(
+ 'ShadingProcessingDriveCommand: '
+ . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
+ . ' - Der aktuelle Beschattungsstatus ist: '
+ . $FHEM::Automation::ShuttersControl::shutters->getShadingStatus
+ . ', Beschattungsstatus Zeitstempel: '
+ . strftime(
+ "%Y.%m.%e %T",
+ localtime(
+ $FHEM::Automation::ShuttersControl::shutters
+ ->getShadingStatusTimestamp
+ )
+ )
+ );
+
+ return;
+}
+
+1;
diff --git a/fhem/lib/FHEM/Automation/ShuttersControl/Shutters.pm b/fhem/lib/FHEM/Automation/ShuttersControl/Shutters.pm
index 3721b5bed..a270b95a5 100644
--- a/fhem/lib/FHEM/Automation/ShuttersControl/Shutters.pm
+++ b/fhem/lib/FHEM/Automation/ShuttersControl/Shutters.pm
@@ -453,6 +453,35 @@ sub setAdvDelay {
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 setExternalTriggerStatus {
+ my $self = shift;
+ my $value = shift;
+
+ $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{event} = $value
+ if ( defined($value) );
+
+ return;
+}
+
sub getExternalTriggerStatus {
my $self = shift;
@@ -523,7 +552,7 @@ sub getAttrUpdateChanges {
sub getIsDay {
my $self = shift;
- return FHEM::Automation::ShuttersControl::_IsDay( $self->{shuttersDev} );
+ return FHEM::Automation::ShuttersControl::Helper::_IsDay( $self->{shuttersDev} );
}
sub getAntiFreezeStatus {
@@ -697,6 +726,36 @@ sub getInTimerFuncHash {
return $self->{ $self->{shuttersDev} }{inTimerFuncHash};
}
+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 getSunsetUnixTime {
my $self = shift;
@@ -867,30 +926,21 @@ sub setShadingManualDriveStatus {
return;
}
-sub setWindProtectionStatus { # Werte protected, unprotected
+sub setShadingLastPos {
my $self = shift;
my $value = shift;
- $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{VAL} = $value
+ $self->{ $self->{shuttersDev} }{ShadingLastPos}{VAL} = $value
if ( defined($value) );
return;
}
-sub setRainProtectionStatus { # Werte protected, unprotected
+sub setShadingBetweenTheTimeSuspend { # Werte für value = 0, 1
my $self = shift;
my $value = shift;
- $self->{ $self->{shuttersDev} }->{RainProtection}->{VAL} = $value
- if ( defined($value) );
- return;
-}
-
-sub setExternalTriggerStatus {
- my $self = shift;
- my $value = shift;
-
- $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{event} = $value
+ $self->{ $self->{shuttersDev} }{ShadingBetweenTheTimeSuspend}{VAL} = $value
if ( defined($value) );
return;
@@ -918,9 +968,11 @@ sub setPushBrightnessInArray {
}
sub getBrightnessAverage {
+ use FHEM::Automation::ShuttersControl::Helper qw (AverageBrightness);
+
my $self = shift;
- return FHEM::Automation::ShuttersControl::_averageBrightness(
+ return AverageBrightness(
@{ $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL} } )
if (
ref( $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL} )
@@ -946,6 +998,17 @@ sub getShadingStatus { # Werte für value = in, out, in reserved, out reserved
);
}
+sub getShadingBetweenTheTimeSuspend { # Werte für value = 0, 1
+ my $self = shift;
+
+ return (
+ defined( $self->{ $self->{shuttersDev} }{ShadingBetweenTheTimeSuspend} )
+ && defined( $self->{ $self->{shuttersDev} }{ShadingBetweenTheTimeSuspend}{VAL} )
+ ? $self->{ $self->{shuttersDev} }{ShadingBetweenTheTimeSuspend}{VAL}
+ : 0
+ );
+}
+
sub getShadingLastStatus { # Werte für value = in, out
my $self = shift;
@@ -983,36 +1046,6 @@ sub getIfInShading {
);
}
-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;
@@ -1036,6 +1069,23 @@ sub getShadingLastStatusTimestamp {
: 0
);
}
+
+sub getShadingLastPos {
+ my $self = shift;
+
+ return (
+ defined( $self->{ $self->{shuttersDev} }{ShadingLastPos} )
+ && defined(
+ $self->{ $self->{shuttersDev} }{ShadingLastPos}{VAL}
+ )
+ ? $self->{ $self->{shuttersDev} }{ShadingLastPos}{VAL}
+ : $FHEM::Automation::ShuttersControl::shutters->getShadingPos
+ );
+}
+
### Ende Beschattung
+
+
+
1;
diff --git a/fhem/lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm b/fhem/lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm
index cbd95de6f..d6eea51a5 100644
--- a/fhem/lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm
+++ b/fhem/lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm
@@ -44,6 +44,8 @@ use strict;
use warnings;
use utf8;
+use FHEM::Automation::ShuttersControl::Helper qw (IsAdv PerlCodeCheck);
+
use GPUtils qw(GP_Import);
## Import der FHEM Funktionen
@@ -91,7 +93,7 @@ sub _getPosition {
m{\A\{.+\}\z}xms
)
{
- my $response = FHEM::Automation::ShuttersControl::_perlCodeCheck(
+ my $response = PerlCodeCheck(
AttrVal(
$self->{shuttersDev},
$attr,
@@ -136,14 +138,14 @@ sub _getPosition {
if (
defined(
- FHEM::Automation::ShuttersControl::_perlCodeCheck(
+ PerlCodeCheck(
$self->{ $self->{shuttersDev} }->{$attr}->{position}
)
)
)
{
$self->{ $self->{shuttersDev} }->{$attr}->{position} =
- FHEM::Automation::ShuttersControl::_perlCodeCheck(
+ PerlCodeCheck(
$self->{ $self->{shuttersDev} }->{$attr}->{position} );
}
@@ -543,7 +545,7 @@ sub getAdv {
return (
AttrVal( $self->{shuttersDev}, 'ASC_Adv', 'off' ) eq 'on'
- ? ( \&FHEM::Automation::ShuttersControl::_IsAdv == 1 ? 1 : 0 )
+ ? ( IsAdv == 1 ? 1 : 0 )
: 0
);
}
@@ -1779,6 +1781,21 @@ sub getDown {
return AttrVal( $self->{shuttersDev}, 'ASC_Down', 'astro' );
}
+sub setShadingBetweenTheTime {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Shading_BetweenTheTime', $attrVal );
+
+ return;
+}
+
+sub getShadingBetweenTheTime {
+ my $self = shift;
+
+ return AttrVal( $self->{shuttersDev}, 'ASC_Shading_BetweenTheTime', '00:00-24:00' );
+}
+
sub setTimeUpEarly {
my $self = shift;
my $attrVal = shift;
@@ -1793,8 +1810,8 @@ sub getTimeUpEarly {
my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_Early', '05:00' );
- if ( defined( FHEM::Automation::ShuttersControl::_perlCodeCheck($val) ) ) {
- $val = FHEM::Automation::ShuttersControl::_perlCodeCheck($val);
+ if ( defined( PerlCodeCheck($val) ) ) {
+ $val = PerlCodeCheck($val);
}
return (
@@ -1818,8 +1835,8 @@ sub getTimeUpLate {
my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_Late', '08:30' );
- if ( defined( FHEM::Automation::ShuttersControl::_perlCodeCheck($val) ) ) {
- $val = FHEM::Automation::ShuttersControl::_perlCodeCheck($val);
+ if ( defined( PerlCodeCheck($val) ) ) {
+ $val = PerlCodeCheck($val);
}
return (
@@ -1843,8 +1860,8 @@ sub getTimeDownEarly {
my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Down_Early', '16:00' );
- if ( defined( FHEM::Automation::ShuttersControl::_perlCodeCheck($val) ) ) {
- $val = FHEM::Automation::ShuttersControl::_perlCodeCheck($val);
+ if ( defined( PerlCodeCheck($val) ) ) {
+ $val = PerlCodeCheck($val);
}
return (
@@ -1868,8 +1885,8 @@ sub getTimeDownLate {
my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Down_Late', '22:00' );
- if ( defined( FHEM::Automation::ShuttersControl::_perlCodeCheck($val) ) ) {
- $val = FHEM::Automation::ShuttersControl::_perlCodeCheck($val);
+ if ( defined( PerlCodeCheck($val) ) ) {
+ $val = PerlCodeCheck($val);
}
return (
@@ -1894,8 +1911,8 @@ sub getTimeUpWeHoliday {
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);
+ if ( defined( PerlCodeCheck($val) ) ) {
+ $val = PerlCodeCheck($val);
}
return (