2548 lines
110 KiB
Perl

###############################################################################
#
# Developed with VSCodium and richterger perl plugin
#
# (c) 2018-2022 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot 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);
use FHEM::Automation::ShuttersControl::Rainprotection qw (:ALL);
require Exporter;
use base qw(Exporter);
# our @ISA = qw(Exporter);
our @EXPORT_OK = qw(
EventProcessingPartyMode
EventProcessingGeneral
EventProcessingShutters
EventProcessingAdvShuttersClose
);
our %EXPORT_TAGS = (
ALL => [
qw(
EventProcessingPartyMode
EventProcessingGeneral
EventProcessingShutters
EventProcessingAdvShuttersClose
)
],
);
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
::Log3( $name, 4,
"AutoShuttersControl ($name) - EventProcessing: All without device name in the Event"
);
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
)
{
::Log3( $name, 4,
"AutoShuttersControl ($name) - EventProcessing: Morning and Evening Time Shedules"
);
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);
}
elsif (
$events =~ m{^(DELETEATTR|ATTR)
\s(.*)\s(ASC_Shading_StateChange_SunnyCloudy)
(.*)?}xms
)
{
$FHEM::Automation::ShuttersControl::shutters
->deleteShadingStateChangeSunny;
}
if (
$events =~
m{^(DELETEATTR|ATTR) #global ATTR myASC ASC_tempSensor Cellar
\s(.*)\s(ASC_tempSensor
|ASC_Shading_Mode
|ASC_BrightnessSensor
|ASC_TempSensor)
(.*)?}xms
)
{
# ATTR RolloKinZimSteven_F1 ASC_Shading_Mode off
if ( $events =~ m{^ATTR\s(.*)\sASC_Shading_Mode\s(off)}xms ) {
my %funcHash = (
hash => $hash,
shuttersdevice => $1,
value => $2,
attrEvent => 1,
);
FHEM::Automation::ShuttersControl::Shading::_CheckShuttersConditionsForShadingFn(
\%funcHash );
}
else {
::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 )
{
return
if (
!IsAfterShuttersManualBlocking($shuttersDev)
&& ( $FHEM::Automation::ShuttersControl::shutters->getLockOut eq
'off'
|| $FHEM::Automation::ShuttersControl::shutters
->getShuttersPlace ne 'terrace' )
);
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);
#### 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::shutters->getStatus ==
$FHEM::Automation::ShuttersControl::shutters->getOpenPos
|| $FHEM::Automation::ShuttersControl::shutters->getStatus ==
$FHEM::Automation::ShuttersControl::shutters->getComfortOpenPos
)
);
return
if ( !IsAfterShuttersManualBlocking($shuttersDev) );
my $homemode =
$FHEM::Automation::ShuttersControl::shutters->getRoommatesStatus;
$homemode =
$FHEM::Automation::ShuttersControl::ascDev->getResidentsStatus
if ( $homemode eq 'none' );
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
->getLastDrive eq 'ventilate - window open'
&& $FHEM::Automation::ShuttersControl::shutters->getSubTyp
eq 'twostate'
&& $FHEM::Automation::ShuttersControl::shutters
->getVentilateOpen eq 'on' )
|| ( $FHEM::Automation::ShuttersControl::shutters->getStatus ==
$FHEM::Automation::ShuttersControl::shutters
->getPrivacyDownPos
&& $FHEM::Automation::ShuttersControl::shutters
->getPrivacyDownStatus != 2
&& !$FHEM::Automation::ShuttersControl::shutters->getIsDay )
|| (
$FHEM::Automation::ShuttersControl::shutters->getStatus ==
$FHEM::Automation::ShuttersControl::shutters->getOpenPos
&& ( $FHEM::Automation::ShuttersControl::shutters
->getLockOut ne 'off'
|| $FHEM::Automation::ShuttersControl::shutters
->getShuttersPlace eq 'terrace' )
&& !$FHEM::Automation::ShuttersControl::shutters->getIsDay
)
|| ( $FHEM::Automation::ShuttersControl::shutters->getStatus ==
$FHEM::Automation::ShuttersControl::shutters->getOpenPos
&& $FHEM::Automation::ShuttersControl::shutters
->getDelayCmd ne 'none'
&& $FHEM::Automation::ShuttersControl::shutters
->getShuttersPlace eq 'terrace' )
)
&& ( $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
|| ( $FHEM::Automation::ShuttersControl::shutters
->getDelayCmd ne 'none'
&& $FHEM::Automation::ShuttersControl::shutters
->getShuttersPlace eq 'terrace' )
)
)
{
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
->getDelayCmd ne 'none'
&& $FHEM::Automation::ShuttersControl::shutters
->getShuttersPlace eq 'terrace'
? $FHEM::Automation::ShuttersControl::shutters
->getDelayCmd
: (
$FHEM::Automation::ShuttersControl::shutters
->getVentilatePosAfterDayClosed eq 'open'
? $FHEM::Automation::ShuttersControl::shutters
->getOpenPos
: $FHEM::Automation::ShuttersControl::shutters
->getLastManPos
)
)
);
}
}
}
elsif (
!$FHEM::Automation::ShuttersControl::shutters->getIsDay
&& $FHEM::Automation::ShuttersControl::shutters->getModeDown eq
'roommate'
&& ( $FHEM::Automation::ShuttersControl::shutters
->getRoommatesStatus eq 'home'
|| $FHEM::Automation::ShuttersControl::shutters
->getRoommatesStatus eq 'awoken' )
)
{
$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
->getShuttersPlace eq 'terrace'
&& $FHEM::Automation::ShuttersControl::shutters->getSubTyp
eq 'twostate' )
)
)
{
$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'
&& $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) ) {
$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 $event = $1;
my $getModeUp = $FHEM::Automation::ShuttersControl::shutters->getModeUp;
my $getModeDown =
$FHEM::Automation::ShuttersControl::shutters->getModeDown;
my $getRoommatesStatus =
$FHEM::Automation::ShuttersControl::shutters->getRoommatesStatus;
my $getRoommatesLastStatus =
$FHEM::Automation::ShuttersControl::shutters->getRoommatesLastStatus;
my $getUp = $FHEM::Automation::ShuttersControl::shutters->getUp;
my $getDown = $FHEM::Automation::ShuttersControl::shutters->getDown;
my $getIsDay = $FHEM::Automation::ShuttersControl::shutters->getIsDay;
my $posValue = $FHEM::Automation::ShuttersControl::shutters
->getStatus; # !!! ACHTUNG!!!
if (
( $event eq 'home' || $event eq 'awoken' )
&& ( $getRoommatesStatus eq 'home'
|| $getRoommatesStatus eq 'awoken' )
&& (
$FHEM::Automation::ShuttersControl::ascDev
->getAutoShuttersControlMorning eq 'on'
|| (
$getUp eq 'roommate'
&& ( $getRoommatesLastStatus eq 'asleep'
|| $getRoommatesLastStatus ne 'awoken' )
)
)
&& IsAfterShuttersManualBlocking($shuttersDev)
)
{
::Log3( $name, 4,
"AutoShuttersControl ($name) - EventProcessingRoommate_1: $shuttersDev und Events $events"
);
if (
(
(
$getRoommatesLastStatus eq 'asleep'
&& ( $FHEM::Automation::ShuttersControl::shutters
->getModeUp eq 'always'
|| $FHEM::Automation::ShuttersControl::shutters
->getModeUp eq $event )
)
|| (
$getRoommatesLastStatus eq 'awoken'
&& ( $FHEM::Automation::ShuttersControl::shutters
->getModeUp eq 'always'
|| $FHEM::Automation::ShuttersControl::shutters
->getModeUp eq $event )
)
)
&& ( $getIsDay
|| $getUp eq 'roommate' )
&& ( IsAfterShuttersTimeBlocking($shuttersDev)
|| $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 (
$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, 1 );
}
elsif (
!$getIsDay
&& IsAfterShuttersTimeBlocking($shuttersDev)
&& ( $getModeDown eq 'home'
|| $getModeDown eq 'always' )
&& $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 (
( $getIsDay || $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::shutters->getModeDown ne
'absent'
&& ( $FHEM::Automation::ShuttersControl::ascDev
->getAutoShuttersControlEvening eq 'on'
|| $getDown eq 'roommate' )
&& ( IsAfterShuttersManualBlocking($shuttersDev)
|| $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'
&& ( !$getIsDay
|| $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 (
$getIsDay
&& $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 (( !$getIsDay || $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 ($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' ) Wird zu Testzwecken auskommentiert, siehe #90 Github
|| ( $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
->getShuttersPlace eq 'EG_window' )
&& $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, 1 );
}
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' ) Wird zu Testzwecken auskommentiert, siehe #90 Github
&& !$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' )
&& $FHEM::Automation::ShuttersControl::ascDev
->getAutoShuttersControlEvening eq 'on'
&& $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, 1 );
}
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' )
&& $FHEM::Automation::ShuttersControl::ascDev
->getAutoShuttersControlMorning eq 'on'
&& 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;
if ( $1 eq 'rain' ) { $val = $triggerMax + 1 }
elsif ( $1 eq 'dry' ) { $val = $triggerMin }
else { $val = $1 }
RainProcessing( $hash, $val, $triggerMax, $triggerMin );
}
return;
}
sub EventProcessingWind {
my $hash = shift;
my $shuttersDev = shift;
my $events = shift;
my $name = $hash->{NAME};
$FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
my $targetPos = $FHEM::Automation::ShuttersControl::shutters->getLastPos;
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');
if ( $FHEM::Automation::ShuttersControl::shutters->getIsDay
&& !$FHEM::Automation::ShuttersControl::shutters
->getIfInShading
&& $FHEM::Automation::ShuttersControl::shutters->getLastPos
== $FHEM::Automation::ShuttersControl::shutters
->getShadingPos )
{
$targetPos =
$FHEM::Automation::ShuttersControl::shutters->getOpenPos;
}
else {
$targetPos =
$FHEM::Automation::ShuttersControl::shutters->getLastPos;
}
if ( !$FHEM::Automation::ShuttersControl::shutters->getIsDay
&& $FHEM::Automation::ShuttersControl::shutters
->getShuttersPlace ne 'awning' )
{
$targetPos = (
$FHEM::Automation::ShuttersControl::shutters
->getPrivacyDownStatus == 2
? $FHEM::Automation::ShuttersControl::shutters
->getPrivacyDownPos
: $FHEM::Automation::ShuttersControl::shutters
->getClosedPos
);
}
$FHEM::Automation::ShuttersControl::shutters->setDriveCmd(
$targetPos);
$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 >
-2 )
{
$brightnessMinVal =
$FHEM::Automation::ShuttersControl::shutters->getBrightnessMinVal;
}
else {
$brightnessMinVal =
$FHEM::Automation::ShuttersControl::ascDev->getBrightnessMinVal;
}
my $brightnessMaxVal;
if ( $FHEM::Automation::ShuttersControl::shutters->getBrightnessMaxVal >
-2 )
{
$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
->getSleepPos > 0
? $FHEM::Automation::ShuttersControl::shutters
->getSleepPos
: $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::shutters->setHardLockOut('on')
if (
(
$FHEM::Automation::ShuttersControl::shutters->getStatus ==
$FHEM::Automation::ShuttersControl::shutters
->getComfortOpenPos
|| ( $FHEM::Automation::ShuttersControl::shutters->getStatus
== $FHEM::Automation::ShuttersControl::shutters
->getOpenPos
&& $FHEM::Automation::ShuttersControl::shutters
->getLastDrive eq 'ventilate - window open' )
)
&& $FHEM::Automation::ShuttersControl::shutters
->getShuttersPlace eq 'terrace'
);
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(
0);
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;