2548 lines
110 KiB
Perl
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;
|