export shading function in seperated file
This commit is contained in:
parent
0d168b488a
commit
554195f476
@ -1,5 +1,5 @@
|
|||||||
UPD 2020-07-02_12:28:09 96885 FHEM/73_AutoShuttersControl.pm
|
UPD 2020-07-02_14:06:51 96885 FHEM/73_AutoShuttersControl.pm
|
||||||
UPD 2020-06-30_12:47:15 188585 lib/FHEM/Automation/ShuttersControl.pm
|
UPD 2020-07-02_14:06:22 177312 lib/FHEM/Automation/ShuttersControl.pm
|
||||||
UPD 2020-06-22_09:41:40 2657 lib/FHEM/Automation/ShuttersControl/Dev.pm
|
UPD 2020-06-22_09:41:40 2657 lib/FHEM/Automation/ShuttersControl/Dev.pm
|
||||||
UPD 2020-06-22_09:41:40 2493 lib/FHEM/Automation/ShuttersControl/Roommate.pm
|
UPD 2020-06-22_09:41:40 2493 lib/FHEM/Automation/ShuttersControl/Roommate.pm
|
||||||
UPD 2020-06-30_12:47:15 30157 lib/FHEM/Automation/ShuttersControl/Shutters.pm
|
UPD 2020-06-30_12:47:15 30157 lib/FHEM/Automation/ShuttersControl/Shutters.pm
|
||||||
|
@ -75,6 +75,7 @@ use Date::Parse;
|
|||||||
|
|
||||||
use FHEM::Automation::ShuttersControl::Shutters;
|
use FHEM::Automation::ShuttersControl::Shutters;
|
||||||
use FHEM::Automation::ShuttersControl::Dev;
|
use FHEM::Automation::ShuttersControl::Dev;
|
||||||
|
use FHEM::Automation::ShuttersControl::Shading;
|
||||||
|
|
||||||
require Exporter;
|
require Exporter;
|
||||||
our @ISA = qw(Exporter);
|
our @ISA = qw(Exporter);
|
||||||
@ -1347,7 +1348,7 @@ sub EventProcessingRoommate {
|
|||||||
&& !$shutters->getSelfDefenseState
|
&& !$shutters->getSelfDefenseState
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ShadingProcessingDriveCommand( $hash, $shuttersDev );
|
\&FHEM::Automation::ShuttersControl::Shading::ShadingProcessingDriveCommand( $hash, $shuttersDev );
|
||||||
}
|
}
|
||||||
elsif (
|
elsif (
|
||||||
!$shutters->getIsDay
|
!$shutters->getIsDay
|
||||||
@ -1559,7 +1560,7 @@ sub EventProcessingResidents {
|
|||||||
&& $shutters->getShadingMode eq 'absent'
|
&& $shutters->getShadingMode eq 'absent'
|
||||||
&& $shutters->getRoommatesStatus eq 'none' )
|
&& $shutters->getRoommatesStatus eq 'none' )
|
||||||
{
|
{
|
||||||
ShadingProcessingDriveCommand( $hash, $shuttersDev );
|
\&FHEM::Automation::ShuttersControl::Shading::ShadingProcessingDriveCommand( $hash, $shuttersDev );
|
||||||
}
|
}
|
||||||
elsif (
|
elsif (
|
||||||
$shutters->getShadingMode eq 'home'
|
$shutters->getShadingMode eq 'home'
|
||||||
@ -1656,7 +1657,7 @@ sub EventProcessingResidents {
|
|||||||
&& !$shutters->getSelfDefenseState
|
&& !$shutters->getSelfDefenseState
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ShadingProcessingDriveCommand( $hash, $shuttersDev );
|
\&FHEM::Automation::ShuttersControl::Shading::ShadingProcessingDriveCommand( $hash, $shuttersDev );
|
||||||
}
|
}
|
||||||
elsif (
|
elsif (
|
||||||
$shutters->getShadingMode eq 'absent'
|
$shutters->getShadingMode eq 'absent'
|
||||||
@ -2372,7 +2373,7 @@ sub EventProcessingShadingBrightness {
|
|||||||
&& $shutters->getRainProtectionStatus eq 'unprotected'
|
&& $shutters->getRainProtectionStatus eq 'unprotected'
|
||||||
&& $shutters->getWindProtectionStatus eq 'unprotected' )
|
&& $shutters->getWindProtectionStatus eq 'unprotected' )
|
||||||
{
|
{
|
||||||
ShadingProcessing(
|
\&FHEM::Automation::ShuttersControl::Shading::ShadingProcessing(
|
||||||
$hash,
|
$hash,
|
||||||
$shuttersDev,
|
$shuttersDev,
|
||||||
$ascDev->getAzimuth,
|
$ascDev->getAzimuth,
|
||||||
@ -2445,7 +2446,7 @@ sub EventProcessingTwilightDevice {
|
|||||||
&& $shutters->getRainProtectionStatus eq 'unprotected'
|
&& $shutters->getRainProtectionStatus eq 'unprotected'
|
||||||
&& $shutters->getWindProtectionStatus eq 'unprotected' )
|
&& $shutters->getWindProtectionStatus eq 'unprotected' )
|
||||||
{
|
{
|
||||||
ShadingProcessing(
|
\&FHEM::Automation::ShuttersControl::Shading::ShadingProcessing(
|
||||||
$hash,
|
$hash,
|
||||||
$shuttersDev,
|
$shuttersDev,
|
||||||
$azimuth,
|
$azimuth,
|
||||||
@ -2466,329 +2467,6 @@ sub EventProcessingTwilightDevice {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub ShadingProcessing {
|
|
||||||
### angleMinus ist $shutters->getShadingAzimuthLeft
|
|
||||||
### anglePlus ist $shutters->getShadingAzimuthRight
|
|
||||||
### winPos ist die Fensterposition $shutters->getDirection
|
|
||||||
my ( $hash, $shuttersDev, $azimuth, $elevation, $outTemp,
|
|
||||||
$azimuthLeft, $azimuthRight )
|
|
||||||
= @_;
|
|
||||||
|
|
||||||
my $name = $hash->{NAME};
|
|
||||||
$shutters->setShuttersDev($shuttersDev);
|
|
||||||
my $brightness = $shutters->getBrightnessAverage;
|
|
||||||
|
|
||||||
ASC_Debug(
|
|
||||||
'ShadingProcessing: '
|
|
||||||
. $shutters->getShuttersDev
|
|
||||||
. ' - Übergebende Werte - Azimuth:'
|
|
||||||
. $azimuth
|
|
||||||
. ', Elevation: '
|
|
||||||
. $elevation
|
|
||||||
. ', Brightness: '
|
|
||||||
. $brightness
|
|
||||||
. ', OutTemp: '
|
|
||||||
. $outTemp
|
|
||||||
. ', Azimut Beschattung: '
|
|
||||||
. $azimuthLeft
|
|
||||||
. ', Azimut Endschattung: '
|
|
||||||
. $azimuthRight
|
|
||||||
. ', Ist es nach der Zeitblockadezeit: '
|
|
||||||
. ( IsAfterShuttersTimeBlocking($shuttersDev) ? 'JA' : 'NEIN' )
|
|
||||||
. ', Das Rollo ist in der Beschattung und wurde manuell gefahren: '
|
|
||||||
. ( $shutters->getShadingManualDriveStatus ? 'JA' : 'NEIN' )
|
|
||||||
. ', Ist es nach der Hälfte der Beschattungswartezeit: '
|
|
||||||
. (
|
|
||||||
( int( gettimeofday() ) - $shutters->getShadingStatusTimestamp ) <
|
|
||||||
( $shutters->getShadingWaitingPeriod / 2 ) ? 'NEIN' : 'JA'
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
Log3( $name, 4,
|
|
||||||
"AutoShuttersControl ($name) - Shading Processing, Rollladen: "
|
|
||||||
. $shuttersDev
|
|
||||||
. " Azimuth: "
|
|
||||||
. $azimuth
|
|
||||||
. " Elevation: "
|
|
||||||
. $elevation
|
|
||||||
. " Brightness: "
|
|
||||||
. $brightness
|
|
||||||
. " OutTemp: "
|
|
||||||
. $outTemp );
|
|
||||||
|
|
||||||
return
|
|
||||||
if ( $azimuth == -1
|
|
||||||
|| $elevation == -1
|
|
||||||
|| $brightness == -1
|
|
||||||
|| $outTemp == -100
|
|
||||||
|| ( int( gettimeofday() ) - $shutters->getShadingStatusTimestamp ) <
|
|
||||||
( $shutters->getShadingWaitingPeriod / 2 )
|
|
||||||
|| $shutters->getShadingMode eq 'off' );
|
|
||||||
|
|
||||||
Log3( $name, 4,
|
|
||||||
"AutoShuttersControl ($name) - Shading Processing, Rollladen: "
|
|
||||||
. $shuttersDev
|
|
||||||
. " Nach dem return" );
|
|
||||||
|
|
||||||
my $getShadingPos = $shutters->getShadingPos;
|
|
||||||
my $getStatus = $shutters->getStatus;
|
|
||||||
my $oldShadingStatus = $shutters->getShadingStatus;
|
|
||||||
my $shuttersDevHash = $defs{$shuttersDev};
|
|
||||||
|
|
||||||
my $getModeUp = $shutters->getModeUp;
|
|
||||||
my $homemode = $shutters->getHomemode;
|
|
||||||
|
|
||||||
ASC_Debug( 'ShadingProcessing: '
|
|
||||||
. $shutters->getShuttersDev
|
|
||||||
. ' - Alle Werte für die weitere Verarbeitung sind korrekt vorhanden und es wird nun mit der Beschattungsverarbeitung begonnen'
|
|
||||||
);
|
|
||||||
|
|
||||||
if (
|
|
||||||
(
|
|
||||||
$outTemp < $shutters->getShadingMinOutsideTemperature - 4
|
|
||||||
|| $azimuth < $azimuthLeft
|
|
||||||
|| $azimuth > $azimuthRight
|
|
||||||
|| !$shutters->getIsDay
|
|
||||||
)
|
|
||||||
&& $shutters->getShadingStatus ne 'out'
|
|
||||||
)
|
|
||||||
{
|
|
||||||
# $shutters->setShadingLastStatus('in');
|
|
||||||
$shutters->setShadingStatus('out');
|
|
||||||
|
|
||||||
ASC_Debug( 'ShadingProcessing: '
|
|
||||||
. $shutters->getShuttersDev
|
|
||||||
. ' - Es ist Nacht oder die Aussentemperatur unterhalb der Shading Temperatur. Die Beschattung wird Zwangsbeendet'
|
|
||||||
);
|
|
||||||
|
|
||||||
Log3( $name, 4,
|
|
||||||
"AutoShuttersControl ($name) - Shading Processing - Der Sonnenstand ist ausserhalb der Winkelangaben oder die Aussentemperatur unterhalb der Shading Temperatur "
|
|
||||||
);
|
|
||||||
}
|
|
||||||
elsif ($azimuth < $azimuthLeft
|
|
||||||
|| $azimuth > $azimuthRight
|
|
||||||
|| $elevation < $shutters->getShadingMinElevation
|
|
||||||
|| $elevation > $shutters->getShadingMaxElevation
|
|
||||||
|| $brightness < $shutters->getShadingStateChangeCloudy
|
|
||||||
|| $outTemp < $shutters->getShadingMinOutsideTemperature - 1 )
|
|
||||||
{
|
|
||||||
$shutters->setShadingStatus('out reserved')
|
|
||||||
if ( $shutters->getShadingStatus eq 'in'
|
|
||||||
|| $shutters->getShadingStatus eq 'in reserved' );
|
|
||||||
|
|
||||||
if (
|
|
||||||
(
|
|
||||||
$shutters->getShadingStatus eq 'out reserved'
|
|
||||||
and
|
|
||||||
( int( gettimeofday() ) - $shutters->getShadingStatusTimestamp )
|
|
||||||
) > $shutters->getShadingWaitingPeriod
|
|
||||||
)
|
|
||||||
{
|
|
||||||
$shutters->setShadingStatus('out');
|
|
||||||
|
|
||||||
# $shutters->setShadingLastStatus('in')
|
|
||||||
# if ( $shutters->getShadingLastStatus eq 'out' );
|
|
||||||
}
|
|
||||||
|
|
||||||
Log3( $name, 4,
|
|
||||||
"AutoShuttersControl ($name) - Shading Processing, Rollladen: "
|
|
||||||
. $shuttersDev
|
|
||||||
. " In der Out Abfrage, Shadingwert: "
|
|
||||||
. $shutters->getShadingStatus
|
|
||||||
. ", Zeitstempel: "
|
|
||||||
. $shutters->getShadingStatusTimestamp );
|
|
||||||
|
|
||||||
ASC_Debug( 'ShadingProcessing: '
|
|
||||||
. $shutters->getShuttersDev
|
|
||||||
. ' - Einer der Beschattungsbedingungen wird nicht mehr erfüllt und somit wird der Beschattungsstatus um eine Stufe reduziert. Alter Status: '
|
|
||||||
. $oldShadingStatus
|
|
||||||
. ' Neuer Status: '
|
|
||||||
. $shutters->getShadingStatus );
|
|
||||||
}
|
|
||||||
elsif ($azimuth > $azimuthLeft
|
|
||||||
&& $azimuth < $azimuthRight
|
|
||||||
&& $elevation > $shutters->getShadingMinElevation
|
|
||||||
&& $elevation < $shutters->getShadingMaxElevation
|
|
||||||
&& $brightness > $shutters->getShadingStateChangeSunny
|
|
||||||
&& $outTemp > $shutters->getShadingMinOutsideTemperature )
|
|
||||||
{
|
|
||||||
if ( $shutters->getShadingStatus eq 'out'
|
|
||||||
|| $shutters->getShadingStatus eq 'out reserved' )
|
|
||||||
{
|
|
||||||
$shutters->setShadingStatus('in reserved');
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( $shutters->getShadingStatus eq 'in reserved'
|
|
||||||
and
|
|
||||||
( int( gettimeofday() ) - $shutters->getShadingStatusTimestamp ) >
|
|
||||||
( $shutters->getShadingWaitingPeriod / 2 ) )
|
|
||||||
{
|
|
||||||
$shutters->setShadingStatus('in');
|
|
||||||
|
|
||||||
# $shutters->setShadingLastStatus('out')
|
|
||||||
# if ( $shutters->getShadingLastStatus eq 'in' );
|
|
||||||
}
|
|
||||||
|
|
||||||
Log3( $name, 4,
|
|
||||||
"AutoShuttersControl ($name) - Shading Processing, Rollladen: "
|
|
||||||
. $shuttersDev
|
|
||||||
. " In der In Abfrage, Shadingwert: "
|
|
||||||
. $shutters->getShadingStatus
|
|
||||||
. ", Zeitstempel: "
|
|
||||||
. $shutters->getShadingStatusTimestamp );
|
|
||||||
|
|
||||||
ASC_Debug( 'ShadingProcessing: '
|
|
||||||
. $shutters->getShuttersDev
|
|
||||||
. ' - Alle Beschattungsbedingungen wurden erfüllt und somit wird der Beschattungsstatus um eine Stufe angehoben. Alter Status: '
|
|
||||||
. $oldShadingStatus
|
|
||||||
. ' Neuer Status: '
|
|
||||||
. $shutters->getShadingStatus );
|
|
||||||
}
|
|
||||||
|
|
||||||
ShadingProcessingDriveCommand( $hash, $shuttersDev )
|
|
||||||
if (
|
|
||||||
IsAfterShuttersTimeBlocking($shuttersDev)
|
|
||||||
&& !$shutters->getShadingManualDriveStatus
|
|
||||||
&& $shutters->getRoommatesStatus ne 'gotosleep'
|
|
||||||
&& $shutters->getRoommatesStatus ne 'asleep'
|
|
||||||
&& (
|
|
||||||
(
|
|
||||||
$shutters->getShadingStatus eq 'out'
|
|
||||||
&& $shutters->getShadingLastStatus eq 'in'
|
|
||||||
)
|
|
||||||
|| ( $shutters->getShadingStatus eq 'in'
|
|
||||||
&& $shutters->getShadingLastStatus eq 'out' )
|
|
||||||
)
|
|
||||||
&& ( $shutters->getShadingMode eq 'always'
|
|
||||||
|| $shutters->getShadingMode eq $homemode )
|
|
||||||
&& (
|
|
||||||
$shutters->getModeUp eq 'always'
|
|
||||||
|| $shutters->getModeUp eq $homemode
|
|
||||||
|| $shutters->getModeUp eq 'off'
|
|
||||||
|| $shutters->getModeUp eq 'absent'
|
|
||||||
|| ( $shutters->getModeUp eq 'home'
|
|
||||||
&& $homemode ne 'asleep' )
|
|
||||||
)
|
|
||||||
&& (
|
|
||||||
(
|
|
||||||
(
|
|
||||||
int( gettimeofday() ) -
|
|
||||||
$shutters->getShadingStatusTimestamp
|
|
||||||
) < 2
|
|
||||||
&& $shutters->getStatus != $shutters->getClosedPos
|
|
||||||
)
|
|
||||||
|| ( !$shutters->getQueryShuttersPos( $shutters->getShadingPos )
|
|
||||||
&& $shutters->getIfInShading )
|
|
||||||
|| ( !$shutters->getIfInShading
|
|
||||||
&& $shutters->getStatus == $shutters->getShadingPos )
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
readingsBeginUpdate($shuttersDevHash);
|
|
||||||
readingsBulkUpdate(
|
|
||||||
$shuttersDevHash,
|
|
||||||
'ASC_ShadingMessage',
|
|
||||||
'INFO: current shading status is \''
|
|
||||||
. $shutters->getShadingStatus . '\''
|
|
||||||
. ' - next check in '
|
|
||||||
. (
|
|
||||||
(
|
|
||||||
(
|
|
||||||
$shutters->getShadingLastStatus eq 'out reserved'
|
|
||||||
|| $shutters->getShadingLastStatus eq 'out'
|
|
||||||
)
|
|
||||||
? $shutters->getShadingWaitingPeriod
|
|
||||||
: $shutters->getShadingWaitingPeriod / 2
|
|
||||||
)
|
|
||||||
) / 60
|
|
||||||
. 'm'
|
|
||||||
);
|
|
||||||
readingsEndUpdate( $shuttersDevHash, 1 );
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub ShadingProcessingDriveCommand {
|
|
||||||
my $hash = shift;
|
|
||||||
my $shuttersDev = shift;
|
|
||||||
|
|
||||||
my $name = $hash->{NAME};
|
|
||||||
$shutters->setShuttersDev($shuttersDev);
|
|
||||||
|
|
||||||
my $getShadingPos = $shutters->getShadingPos;
|
|
||||||
my $getStatus = $shutters->getStatus;
|
|
||||||
|
|
||||||
$shutters->setShadingStatus( $shutters->getShadingStatus );
|
|
||||||
|
|
||||||
if (
|
|
||||||
$shutters->getShadingStatus eq 'in'
|
|
||||||
&& $getShadingPos != $getStatus
|
|
||||||
&& ( CheckIfShuttersWindowRecOpen($shuttersDev) != 2
|
|
||||||
|| $shutters->getShuttersPlace ne 'terrace' )
|
|
||||||
)
|
|
||||||
{
|
|
||||||
$shutters->setLastDrive('shading in');
|
|
||||||
ShuttersCommandSet( $hash, $shuttersDev, $getShadingPos );
|
|
||||||
|
|
||||||
ASC_Debug( 'ShadingProcessingDriveCommand: '
|
|
||||||
. $shutters->getShuttersDev
|
|
||||||
. ' - Der aktuelle Beschattungsstatus ist: '
|
|
||||||
. $shutters->getShadingStatus
|
|
||||||
. ' und somit wird nun in die Position: '
|
|
||||||
. $getShadingPos
|
|
||||||
. ' zum Beschatten gefahren' );
|
|
||||||
}
|
|
||||||
elsif ($shutters->getShadingStatus eq 'out'
|
|
||||||
&& $getShadingPos == $getStatus )
|
|
||||||
{
|
|
||||||
$shutters->setLastDrive('shading out');
|
|
||||||
|
|
||||||
ShuttersCommandSet(
|
|
||||||
$hash,
|
|
||||||
$shuttersDev,
|
|
||||||
(
|
|
||||||
$getShadingPos == $shutters->getLastPos
|
|
||||||
? $shutters->getOpenPos
|
|
||||||
: (
|
|
||||||
$shutters->getQueryShuttersPos( $shutters->getLastPos )
|
|
||||||
? (
|
|
||||||
$shutters->getLastPos == $shutters->getSleepPos
|
|
||||||
? $shutters->getOpenPos
|
|
||||||
: $shutters->getLastPos
|
|
||||||
)
|
|
||||||
: $shutters->getOpenPos
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
ASC_Debug( 'ShadingProcessingDriveCommand: '
|
|
||||||
. $shutters->getShuttersDev
|
|
||||||
. ' - Der aktuelle Beschattungsstatus ist: '
|
|
||||||
. $shutters->getShadingStatus
|
|
||||||
. ' und somit wird nun in die Position: '
|
|
||||||
. $getShadingPos
|
|
||||||
. ' zum beenden der Beschattung gefahren' );
|
|
||||||
}
|
|
||||||
|
|
||||||
Log3( $name, 4,
|
|
||||||
"AutoShuttersControl ($name) - Shading Processing - In der Routine zum fahren der Rollläden, Shading Wert: "
|
|
||||||
. $shutters->getShadingStatus );
|
|
||||||
|
|
||||||
ASC_Debug(
|
|
||||||
'ShadingProcessingDriveCommand: '
|
|
||||||
. $shutters->getShuttersDev
|
|
||||||
. ' - Der aktuelle Beschattungsstatus ist: '
|
|
||||||
. $shutters->getShadingStatus
|
|
||||||
. ', Beschattungsstatus Zeitstempel: '
|
|
||||||
. strftime(
|
|
||||||
"%Y.%m.%e %T", localtime( $shutters->getShadingStatusTimestamp )
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub EventProcessingPartyMode {
|
sub EventProcessingPartyMode {
|
||||||
my $hash = shift;
|
my $hash = shift;
|
||||||
|
|
||||||
|
385
lib/FHEM/Automation/ShuttersControl/Shading.pm
Normal file
385
lib/FHEM/Automation/ShuttersControl/Shading.pm
Normal file
@ -0,0 +1,385 @@
|
|||||||
|
###############################################################################
|
||||||
|
#
|
||||||
|
# Developed with Kate
|
||||||
|
#
|
||||||
|
# (c) 2018-2020 Copyright: Marko Oldenburg (fhemsupport@cooltux.net)
|
||||||
|
# All rights reserved
|
||||||
|
#
|
||||||
|
# Special thanks goes to:
|
||||||
|
# - Bernd (Cluni) this module is based on the logic of his script "Rollladensteuerung für HM/ROLLO inkl. Abschattung und Komfortfunktionen in Perl" (https://forum.fhem.de/index.php/topic,73964.0.html)
|
||||||
|
# - Beta-User for many tests, many suggestions and good discussions
|
||||||
|
# - pc1246 write english commandref
|
||||||
|
# - FunkOdyssey commandref style
|
||||||
|
# - sledge fix many typo in commandref
|
||||||
|
# - many User that use with modul and report bugs
|
||||||
|
# - Christoph (christoph.kaiser.in) Patch that expand RegEx for Window Events
|
||||||
|
# - Julian (Loredo) expand Residents Events for new Residents functions
|
||||||
|
# - Christoph (Christoph Morrison) for fix Commandref, many suggestions and good discussions
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# This script is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License,or
|
||||||
|
# any later version.
|
||||||
|
#
|
||||||
|
# The GNU General Public License can be found at
|
||||||
|
# http://www.gnu.org/copyleft/gpl.html.
|
||||||
|
# A copy is found in the textfile GPL.txt and important notices to the license
|
||||||
|
# from the author is found in LICENSE.txt distributed with these scripts.
|
||||||
|
#
|
||||||
|
# This script is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# $Id$
|
||||||
|
#
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
## unserer packagename
|
||||||
|
package FHEM::Automation::ShuttersControl::Shading;
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use POSIX qw(strftime);
|
||||||
|
use utf8;
|
||||||
|
|
||||||
|
use GPUtils qw(GP_Import);
|
||||||
|
|
||||||
|
## Import der FHEM Funktionen
|
||||||
|
BEGIN {
|
||||||
|
GP_Import(
|
||||||
|
qw(
|
||||||
|
Log3
|
||||||
|
gettimeofday
|
||||||
|
readingsBeginUpdate
|
||||||
|
readingsBulkUpdate
|
||||||
|
readingsEndUpdate
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sub ShadingProcessing {
|
||||||
|
### angleMinus ist $FHEM::Automation::ShuttersControl::shutters->getShadingAzimuthLeft
|
||||||
|
### anglePlus ist $FHEM::Automation::ShuttersControl::shutters->getShadingAzimuthRight
|
||||||
|
### winPos ist die Fensterposition $FHEM::Automation::ShuttersControl::shutters->getDirection
|
||||||
|
my ( $hash, $shuttersDev, $azimuth, $elevation, $outTemp,
|
||||||
|
$azimuthLeft, $azimuthRight )
|
||||||
|
= @_;
|
||||||
|
|
||||||
|
my $name = $hash->{NAME};
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
|
||||||
|
my $brightness = $FHEM::Automation::ShuttersControl::shutters->getBrightnessAverage;
|
||||||
|
|
||||||
|
\&FHEM::Automation::ShuttersControl::ASC_Debug(
|
||||||
|
'ShadingProcessing: '
|
||||||
|
. $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
|
||||||
|
. ' - Übergebende Werte - Azimuth:'
|
||||||
|
. $azimuth
|
||||||
|
. ', Elevation: '
|
||||||
|
. $elevation
|
||||||
|
. ', Brightness: '
|
||||||
|
. $brightness
|
||||||
|
. ', OutTemp: '
|
||||||
|
. $outTemp
|
||||||
|
. ', Azimut Beschattung: '
|
||||||
|
. $azimuthLeft
|
||||||
|
. ', Azimut Endschattung: '
|
||||||
|
. $azimuthRight
|
||||||
|
. ', Ist es nach der Zeitblockadezeit: '
|
||||||
|
. ( IsAfterShuttersTimeBlocking($shuttersDev) ? 'JA' : 'NEIN' )
|
||||||
|
. ', Das Rollo ist in der Beschattung und wurde manuell gefahren: '
|
||||||
|
. ( $FHEM::Automation::ShuttersControl::shutters->getShadingManualDriveStatus ? 'JA' : 'NEIN' )
|
||||||
|
. ', Ist es nach der Hälfte der Beschattungswartezeit: '
|
||||||
|
. (
|
||||||
|
( int( gettimeofday() ) - $FHEM::Automation::ShuttersControl::shutters->getShadingStatusTimestamp ) <
|
||||||
|
( $FHEM::Automation::ShuttersControl::shutters->getShadingWaitingPeriod / 2 ) ? 'NEIN' : 'JA'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
Log3( $name, 4,
|
||||||
|
"AutoShuttersControl ($name) - Shading Processing, Rollladen: "
|
||||||
|
. $shuttersDev
|
||||||
|
. " Azimuth: "
|
||||||
|
. $azimuth
|
||||||
|
. " Elevation: "
|
||||||
|
. $elevation
|
||||||
|
. " Brightness: "
|
||||||
|
. $brightness
|
||||||
|
. " OutTemp: "
|
||||||
|
. $outTemp );
|
||||||
|
|
||||||
|
return
|
||||||
|
if ( $azimuth == -1
|
||||||
|
|| $elevation == -1
|
||||||
|
|| $brightness == -1
|
||||||
|
|| $outTemp == -100
|
||||||
|
|| ( int( gettimeofday() ) - $FHEM::Automation::ShuttersControl::shutters->getShadingStatusTimestamp ) <
|
||||||
|
( $FHEM::Automation::ShuttersControl::shutters->getShadingWaitingPeriod / 2 )
|
||||||
|
|| $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq 'off' );
|
||||||
|
|
||||||
|
Log3( $name, 4,
|
||||||
|
"AutoShuttersControl ($name) - Shading Processing, Rollladen: "
|
||||||
|
. $shuttersDev
|
||||||
|
. " Nach dem return" );
|
||||||
|
|
||||||
|
my $getShadingPos = $FHEM::Automation::ShuttersControl::shutters->getShadingPos;
|
||||||
|
my $getStatus = $FHEM::Automation::ShuttersControl::shutters->getStatus;
|
||||||
|
my $oldShadingStatus = $FHEM::Automation::ShuttersControl::shutters->getShadingStatus;
|
||||||
|
my $shuttersDevHash = $defs{$shuttersDev};
|
||||||
|
|
||||||
|
my $getModeUp = $FHEM::Automation::ShuttersControl::shutters->getModeUp;
|
||||||
|
my $homemode = $FHEM::Automation::ShuttersControl::shutters->getHomemode;
|
||||||
|
|
||||||
|
\&FHEM::Automation::ShuttersControl::ASC_Debug( 'ShadingProcessing: '
|
||||||
|
. $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
|
||||||
|
. ' - Alle Werte für die weitere Verarbeitung sind korrekt vorhanden und es wird nun mit der Beschattungsverarbeitung begonnen'
|
||||||
|
);
|
||||||
|
|
||||||
|
if (
|
||||||
|
(
|
||||||
|
$outTemp < $FHEM::Automation::ShuttersControl::shutters->getShadingMinOutsideTemperature - 4
|
||||||
|
|| $azimuth < $azimuthLeft
|
||||||
|
|| $azimuth > $azimuthRight
|
||||||
|
|| !$FHEM::Automation::ShuttersControl::shutters->getIsDay
|
||||||
|
)
|
||||||
|
&& $FHEM::Automation::ShuttersControl::shutters->getShadingStatus ne 'out'
|
||||||
|
)
|
||||||
|
{
|
||||||
|
# $FHEM::Automation::ShuttersControl::shutters->setShadingLastStatus('in');
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->setShadingStatus('out');
|
||||||
|
|
||||||
|
\&FHEM::Automation::ShuttersControl::ASC_Debug( 'ShadingProcessing: '
|
||||||
|
. $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
|
||||||
|
. ' - Es ist Nacht oder die Aussentemperatur unterhalb der Shading Temperatur. Die Beschattung wird Zwangsbeendet'
|
||||||
|
);
|
||||||
|
|
||||||
|
Log3( $name, 4,
|
||||||
|
"AutoShuttersControl ($name) - Shading Processing - Der Sonnenstand ist ausserhalb der Winkelangaben oder die Aussentemperatur unterhalb der Shading Temperatur "
|
||||||
|
);
|
||||||
|
}
|
||||||
|
elsif ($azimuth < $azimuthLeft
|
||||||
|
|| $azimuth > $azimuthRight
|
||||||
|
|| $elevation < $FHEM::Automation::ShuttersControl::shutters->getShadingMinElevation
|
||||||
|
|| $elevation > $FHEM::Automation::ShuttersControl::shutters->getShadingMaxElevation
|
||||||
|
|| $brightness < $FHEM::Automation::ShuttersControl::shutters->getShadingStateChangeCloudy
|
||||||
|
|| $outTemp < $FHEM::Automation::ShuttersControl::shutters->getShadingMinOutsideTemperature - 1 )
|
||||||
|
{
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->setShadingStatus('out reserved')
|
||||||
|
if ( $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq 'in'
|
||||||
|
|| $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq 'in reserved' );
|
||||||
|
|
||||||
|
if (
|
||||||
|
(
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq 'out reserved'
|
||||||
|
and
|
||||||
|
( int( gettimeofday() ) - $FHEM::Automation::ShuttersControl::shutters->getShadingStatusTimestamp )
|
||||||
|
) > $FHEM::Automation::ShuttersControl::shutters->getShadingWaitingPeriod
|
||||||
|
)
|
||||||
|
{
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->setShadingStatus('out');
|
||||||
|
|
||||||
|
# $FHEM::Automation::ShuttersControl::shutters->setShadingLastStatus('in')
|
||||||
|
# if ( $FHEM::Automation::ShuttersControl::shutters->getShadingLastStatus eq 'out' );
|
||||||
|
}
|
||||||
|
|
||||||
|
Log3( $name, 4,
|
||||||
|
"AutoShuttersControl ($name) - Shading Processing, Rollladen: "
|
||||||
|
. $shuttersDev
|
||||||
|
. " In der Out Abfrage, Shadingwert: "
|
||||||
|
. $FHEM::Automation::ShuttersControl::shutters->getShadingStatus
|
||||||
|
. ", Zeitstempel: "
|
||||||
|
. $FHEM::Automation::ShuttersControl::shutters->getShadingStatusTimestamp );
|
||||||
|
|
||||||
|
\&FHEM::Automation::ShuttersControl::ASC_Debug( 'ShadingProcessing: '
|
||||||
|
. $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
|
||||||
|
. ' - Einer der Beschattungsbedingungen wird nicht mehr erfüllt und somit wird der Beschattungsstatus um eine Stufe reduziert. Alter Status: '
|
||||||
|
. $oldShadingStatus
|
||||||
|
. ' Neuer Status: '
|
||||||
|
. $FHEM::Automation::ShuttersControl::shutters->getShadingStatus );
|
||||||
|
}
|
||||||
|
elsif ($azimuth > $azimuthLeft
|
||||||
|
&& $azimuth < $azimuthRight
|
||||||
|
&& $elevation > $FHEM::Automation::ShuttersControl::shutters->getShadingMinElevation
|
||||||
|
&& $elevation < $FHEM::Automation::ShuttersControl::shutters->getShadingMaxElevation
|
||||||
|
&& $brightness > $FHEM::Automation::ShuttersControl::shutters->getShadingStateChangeSunny
|
||||||
|
&& $outTemp > $FHEM::Automation::ShuttersControl::shutters->getShadingMinOutsideTemperature )
|
||||||
|
{
|
||||||
|
if ( $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq 'out'
|
||||||
|
|| $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq 'out reserved' )
|
||||||
|
{
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->setShadingStatus('in reserved');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq 'in reserved'
|
||||||
|
and
|
||||||
|
( int( gettimeofday() ) - $FHEM::Automation::ShuttersControl::shutters->getShadingStatusTimestamp ) >
|
||||||
|
( $FHEM::Automation::ShuttersControl::shutters->getShadingWaitingPeriod / 2 ) )
|
||||||
|
{
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->setShadingStatus('in');
|
||||||
|
|
||||||
|
# $FHEM::Automation::ShuttersControl::shutters->setShadingLastStatus('out')
|
||||||
|
# if ( $FHEM::Automation::ShuttersControl::shutters->getShadingLastStatus eq 'in' );
|
||||||
|
}
|
||||||
|
|
||||||
|
Log3( $name, 4,
|
||||||
|
"AutoShuttersControl ($name) - Shading Processing, Rollladen: "
|
||||||
|
. $shuttersDev
|
||||||
|
. " In der In Abfrage, Shadingwert: "
|
||||||
|
. $FHEM::Automation::ShuttersControl::shutters->getShadingStatus
|
||||||
|
. ", Zeitstempel: "
|
||||||
|
. $FHEM::Automation::ShuttersControl::shutters->getShadingStatusTimestamp );
|
||||||
|
|
||||||
|
\&FHEM::Automation::ShuttersControl::ASC_Debug( 'ShadingProcessing: '
|
||||||
|
. $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
|
||||||
|
. ' - Alle Beschattungsbedingungen wurden erfüllt und somit wird der Beschattungsstatus um eine Stufe angehoben. Alter Status: '
|
||||||
|
. $oldShadingStatus
|
||||||
|
. ' Neuer Status: '
|
||||||
|
. $FHEM::Automation::ShuttersControl::shutters->getShadingStatus );
|
||||||
|
}
|
||||||
|
|
||||||
|
ShadingProcessingDriveCommand( $hash, $shuttersDev )
|
||||||
|
if (
|
||||||
|
\&FHEM::Automation::ShuttersControl::IsAfterShuttersTimeBlocking($shuttersDev)
|
||||||
|
&& !$FHEM::Automation::ShuttersControl::shutters->getShadingManualDriveStatus
|
||||||
|
&& $FHEM::Automation::ShuttersControl::shutters->getRoommatesStatus ne 'gotosleep'
|
||||||
|
&& $FHEM::Automation::ShuttersControl::shutters->getRoommatesStatus ne 'asleep'
|
||||||
|
&& (
|
||||||
|
(
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq 'out'
|
||||||
|
&& $FHEM::Automation::ShuttersControl::shutters->getShadingLastStatus eq 'in'
|
||||||
|
)
|
||||||
|
|| ( $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq 'in'
|
||||||
|
&& $FHEM::Automation::ShuttersControl::shutters->getShadingLastStatus eq 'out' )
|
||||||
|
)
|
||||||
|
&& ( $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq 'always'
|
||||||
|
|| $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq $homemode )
|
||||||
|
&& (
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->getModeUp eq 'always'
|
||||||
|
|| $FHEM::Automation::ShuttersControl::shutters->getModeUp eq $homemode
|
||||||
|
|| $FHEM::Automation::ShuttersControl::shutters->getModeUp eq 'off'
|
||||||
|
|| $FHEM::Automation::ShuttersControl::shutters->getModeUp eq 'absent'
|
||||||
|
|| ( $FHEM::Automation::ShuttersControl::shutters->getModeUp eq 'home'
|
||||||
|
&& $homemode ne 'asleep' )
|
||||||
|
)
|
||||||
|
&& (
|
||||||
|
(
|
||||||
|
(
|
||||||
|
int( gettimeofday() ) -
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->getShadingStatusTimestamp
|
||||||
|
) < 2
|
||||||
|
&& $FHEM::Automation::ShuttersControl::shutters->getStatus != $FHEM::Automation::ShuttersControl::shutters->getClosedPos
|
||||||
|
)
|
||||||
|
|| ( !$FHEM::Automation::ShuttersControl::shutters->getQueryShuttersPos( $FHEM::Automation::ShuttersControl::shutters->getShadingPos )
|
||||||
|
&& $FHEM::Automation::ShuttersControl::shutters->getIfInShading )
|
||||||
|
|| ( !$FHEM::Automation::ShuttersControl::shutters->getIfInShading
|
||||||
|
&& $FHEM::Automation::ShuttersControl::shutters->getStatus == $FHEM::Automation::ShuttersControl::shutters->getShadingPos )
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
readingsBeginUpdate($shuttersDevHash);
|
||||||
|
readingsBulkUpdate(
|
||||||
|
$shuttersDevHash,
|
||||||
|
'ASC_ShadingMessage',
|
||||||
|
'INFO: current shading status is \''
|
||||||
|
. $FHEM::Automation::ShuttersControl::shutters->getShadingStatus . '\''
|
||||||
|
. ' - next check in '
|
||||||
|
. (
|
||||||
|
(
|
||||||
|
(
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->getShadingLastStatus eq 'out reserved'
|
||||||
|
|| $FHEM::Automation::ShuttersControl::shutters->getShadingLastStatus eq 'out'
|
||||||
|
)
|
||||||
|
? $FHEM::Automation::ShuttersControl::shutters->getShadingWaitingPeriod
|
||||||
|
: $FHEM::Automation::ShuttersControl::shutters->getShadingWaitingPeriod / 2
|
||||||
|
)
|
||||||
|
) / 60
|
||||||
|
. 'm'
|
||||||
|
);
|
||||||
|
readingsEndUpdate( $shuttersDevHash, 1 );
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub ShadingProcessingDriveCommand {
|
||||||
|
my $hash = shift;
|
||||||
|
my $shuttersDev = shift;
|
||||||
|
|
||||||
|
my $name = $hash->{NAME};
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
|
||||||
|
|
||||||
|
my $getShadingPos = $FHEM::Automation::ShuttersControl::shutters->getShadingPos;
|
||||||
|
my $getStatus = $FHEM::Automation::ShuttersControl::shutters->getStatus;
|
||||||
|
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->setShadingStatus( $FHEM::Automation::ShuttersControl::shutters->getShadingStatus );
|
||||||
|
|
||||||
|
if (
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq 'in'
|
||||||
|
&& $getShadingPos != $getStatus
|
||||||
|
&& ( \&FHEM::Automation::ShuttersControl::CheckIfShuttersWindowRecOpen($shuttersDev) != 2
|
||||||
|
|| $FHEM::Automation::ShuttersControl::shutters->getShuttersPlace ne 'terrace' )
|
||||||
|
)
|
||||||
|
{
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->setLastDrive('shading in');
|
||||||
|
ShuttersCommandSet( $hash, $shuttersDev, $getShadingPos );
|
||||||
|
|
||||||
|
\&FHEM::Automation::ShuttersControl::ASC_Debug( 'ShadingProcessingDriveCommand: '
|
||||||
|
. $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
|
||||||
|
. ' - Der aktuelle Beschattungsstatus ist: '
|
||||||
|
. $FHEM::Automation::ShuttersControl::shutters->getShadingStatus
|
||||||
|
. ' und somit wird nun in die Position: '
|
||||||
|
. $getShadingPos
|
||||||
|
. ' zum Beschatten gefahren' );
|
||||||
|
}
|
||||||
|
elsif ($FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq 'out'
|
||||||
|
&& $getShadingPos == $getStatus )
|
||||||
|
{
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->setLastDrive('shading out');
|
||||||
|
|
||||||
|
\&FHEM::Automation::ShuttersControl::ShuttersCommandSet(
|
||||||
|
$hash,
|
||||||
|
$shuttersDev,
|
||||||
|
(
|
||||||
|
$getShadingPos == $FHEM::Automation::ShuttersControl::shutters->getLastPos
|
||||||
|
? $FHEM::Automation::ShuttersControl::shutters->getOpenPos
|
||||||
|
: (
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->getQueryShuttersPos( $FHEM::Automation::ShuttersControl::shutters->getLastPos )
|
||||||
|
? (
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->getLastPos == $FHEM::Automation::ShuttersControl::shutters->getSleepPos
|
||||||
|
? $FHEM::Automation::ShuttersControl::shutters->getOpenPos
|
||||||
|
: $FHEM::Automation::ShuttersControl::shutters->getLastPos
|
||||||
|
)
|
||||||
|
: $FHEM::Automation::ShuttersControl::shutters->getOpenPos
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
\&FHEM::Automation::ShuttersControl::ASC_Debug( 'ShadingProcessingDriveCommand: '
|
||||||
|
. $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
|
||||||
|
. ' - Der aktuelle Beschattungsstatus ist: '
|
||||||
|
. $FHEM::Automation::ShuttersControl::shutters->getShadingStatus
|
||||||
|
. ' und somit wird nun in die Position: '
|
||||||
|
. $getShadingPos
|
||||||
|
. ' zum beenden der Beschattung gefahren' );
|
||||||
|
}
|
||||||
|
|
||||||
|
Log3( $name, 4,
|
||||||
|
"AutoShuttersControl ($name) - Shading Processing - In der Routine zum fahren der Rollläden, Shading Wert: "
|
||||||
|
. $FHEM::Automation::ShuttersControl::shutters->getShadingStatus );
|
||||||
|
|
||||||
|
\&FHEM::Automation::ShuttersControl::ASC_Debug(
|
||||||
|
'ShadingProcessingDriveCommand: '
|
||||||
|
. $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
|
||||||
|
. ' - Der aktuelle Beschattungsstatus ist: '
|
||||||
|
. $FHEM::Automation::ShuttersControl::shutters->getShadingStatus
|
||||||
|
. ', Beschattungsstatus Zeitstempel: '
|
||||||
|
. strftime(
|
||||||
|
"%Y.%m.%e %T", localtime( $FHEM::Automation::ShuttersControl::shutters->getShadingStatusTimestamp )
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user