2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-27 10:37:13 +00:00

73_AutoShuttersControl: Fix Shading bug then shutters ClosedPos, Split in to new modul files Shading.pm and Helper.pm

git-svn-id: https://svn.fhem.de/fhem/trunk@22473 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
LeonGaultier 2020-07-26 15:56:11 +00:00
parent 03f7081305
commit 4e0bad02a7
10 changed files with 4477 additions and 3133 deletions

View File

@ -1,5 +1,7 @@
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
# Do not insert empty lines here, update check depends on it.
- bugfix: 73_AutoShuttersControl: Fix Shading bug then shutters ClosedPos,
Split in to new modul files Shading.pm and Helper.pm
- change: 49_SSCam: set compatibility to 8.2.8, minor changes acc. PBP lvl 3
- feature: 93_DbRep: new aggregation value 'minute', some fixes
- feature: 14_SD_UT.pm

View File

@ -73,12 +73,14 @@ sub Initialize {
## Da ich mit package arbeite müssen in die Initialize für die jeweiligen hash Fn Funktionen der Funktionsname
# und davor mit :: getrennt der eigentliche package Name des Modules
$hash->{SetFn} = \&FHEM::Automation::ShuttersControl::Set;
$hash->{GetFn} = \&FHEM::Automation::ShuttersControl::Get;
$hash->{DefFn} = \&FHEM::Automation::ShuttersControl::Define;
$hash->{NotifyFn} = \&FHEM::Automation::ShuttersControl::Notify;
$hash->{UndefFn} = \&FHEM::Automation::ShuttersControl::Undef;
$hash->{AttrList} =
$hash->{SetFn} = \&FHEM::Automation::ShuttersControl::Set;
$hash->{GetFn} = \&FHEM::Automation::ShuttersControl::Get;
$hash->{DefFn} = \&FHEM::Automation::ShuttersControl::Define;
$hash->{NotifyFn} = \&FHEM::Automation::ShuttersControl::Notify;
$hash->{UndefFn} = \&FHEM::Automation::ShuttersControl::Undef;
$hash->{DeleteFn} = \&FHEM::Automation::ShuttersControl::Delete;
$hash->{ShutdownFn} = \&FHEM::Automation::ShuttersControl::Shutdown;
$hash->{AttrList} =
'ASC_tempSensor '
. 'ASC_brightnessDriveUpDown '
. 'ASC_autoShuttersControlMorning:on,off '
@ -962,8 +964,9 @@ sub Initialize {
<li><strong>ASC_Shading_Pos</strong> - Position des Rollladens f&uuml;r die Beschattung (Default: ist abh&auml;ngig vom Attribut<em>ASC</em> 80/20) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!</li>
<li><strong>ASC_Shading_StateChange_SunnyCloudy</strong> - Brightness Wert ab welchen die Beschattung stattfinden und aufgehoben werden soll, immer in Abh&auml;ngigkeit der anderen einbezogenen Sensorwerte. Ein optionaler dritter Wert gibt an wie, viele Brightnesswerte für den aktuellen Brightness-Durchschnitt berücksichtigt werden. Standard ist 3, es sollten nicht mehr als 5 ber&uuml;cksichtigt werden. (default: 35000:20000 [3])</li>
<li><strong>ASC_Shading_WaitingPeriod</strong> - wie viele Sekunden soll gewartet werden bevor eine weitere Auswertung der Sensordaten f&uuml;r die Beschattung stattfinden soll (default: 1200)</li>
<li><strong>ASC_Shading_BetweenTheTime</strong> - das fahren in die Beschattung erfolgt bei Angabe nur innerhalb des Zeitraumes, Bsp: 9:00-13:00 11:25-15:30</li>
</ul></p>
<li><strong>ASC_ShuttersPlace - window/terrace</strong> - Wenn dieses Attribut auf terrace gesetzt ist, das Residence Device in den Status "gone" geht und SelfDefense aktiv ist (ohne das das Reading selfDefense gesetzt sein muss), wird das Rollo geschlossen (default: window)</li>
<li><strong>ASC_ShuttersPlace - window/terrace/awning</strong> - Wenn dieses Attribut auf terrace gesetzt ist, das Residence Device in den Status "gone" geht und SelfDefense aktiv ist (ohne das das Reading selfDefense gesetzt sein muss), wird das Rollo geschlossen. awning steht für Markise und wirkt sich auf die Beschattungssteuerung aus. (default: window)</li>
<li><strong>ASC_Time_Down_Early</strong> - Sonnenuntergang fr&uuml;hste Zeit zum Runterfahren (default: 16:00) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!</li>
<li><strong>ASC_Time_Down_Late</strong> - Sonnenuntergang sp&auml;teste Zeit zum Runterfahren (default: 22:00) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!</li>
<li><strong>ASC_Time_Up_Early</strong> - Sonnenaufgang fr&uuml;hste Zeit zum Hochfahren (default: 05:00) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!</li>
@ -1125,6 +1128,7 @@ sub Initialize {
<tr><td>IsDay</td><td>Abfrage ob das Rollo im Tag oder Nachtmodus ist. Also nach Sunset oder nach Sunrise</td></tr>
<tr><td>PrivacyDownStatus</td><td>Abfrage ob das Rollo aktuell im PrivacyDown Status steht</td></tr>
<tr><td>OutTemp</td><td>aktuelle Au&szlig;entemperatur sofern ein Sensor definiert ist, wenn nicht kommt -100 als Wert zur&uuml;ck</td></tr>
<tr><td>ShadingBetweenTheTime</td><td>Konfiguration f&uuml;r die Zeit der Beschattung</td></tr>
</table>
</p>
<u>&Uuml;bersicht f&uuml;r das Rollladen-Device mit Parameter&uuml;bergabe Getter</u>
@ -1194,6 +1198,7 @@ sub Initialize {
<tr><td>DriveUpMaxDuration</td><td> </td></tr>
<tr><td>SubTyp</td><td> </td></tr>
<tr><td>WinDev</td><td> </td></tr>
<tr><td>ShadingBetweenTheTime</td><td>Konfiguration f&uuml;r die Zeit der Beschattung, Beispiel: 09:00-13:00 WICHTIG!!!! Immer bei einstelligen Stunden die 0 davor setzen</td></tr>
</table>
</p>
<u>&Uuml;bersicht f&uuml;r das ASC Device Getter</u>
@ -1253,7 +1258,7 @@ sub Initialize {
],
"release_status": "testing",
"license": "GPL_2",
"version": "v0.10.3",
"version": "v0.10.5",
"author": [
"Marko Oldenburg <leongaultier@gmail.com>"
],

File diff suppressed because it is too large Load Diff

View File

@ -264,13 +264,19 @@ sub _getRainSensor {
return $device if ( $device eq 'none' );
$self->{ASC_rainSensor}->{device} = $device;
$self->{ASC_rainSensor}->{reading} =
( $reading ne 'none' ? $reading : 'state' );
$self->{ASC_rainSensor}->{triggermax} = ( $max ne 'none' ? $max : 1000 );
( $reading ne 'none' ? $reading : 'rain' );
$self->{ASC_rainSensor}->{triggermax} = (
( $max ne 'none'
&& $max =~ m{\A(-?\d+(\.\d+)?)\z}xms )
? $max
: 1000 );
$self->{ASC_rainSensor}->{triggerhyst} = (
$hyst ne 'none'
? $max - $hyst
? $self->{ASC_rainSensor}->{triggermax} - $hyst
: ( $self->{ASC_rainSensor}->{triggermax} * 0 )
);
$self->{ASC_rainSensor}->{shuttersClosedPos} =
( $pos ne 'none'
? $pos
@ -386,4 +392,7 @@ sub getBlockAscDrivesAfterManual {
return AttrVal( $name, 'ASC_blockAscDrivesAfterManual', 0 );
}
1;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -74,4 +74,7 @@ sub _getRoommateLastStatus {
return ReadingsVal( $roommate, 'lastState', $default );
}
1;

View File

@ -0,0 +1,628 @@
###############################################################################
#
# Developed with Kate
#
# (c) 2018-2020 Copyright: Marko Oldenburg (fhemsupport@cooltux.net)
# All rights reserved
#
# Special thanks goes to:
# - Bernd (Cluni) this module is based on the logic of his script "Rollladensteuerung für HM/ROLLO inkl. Abschattung und Komfortfunktionen in Perl" (https://forum.fhem.de/index.php/topic,73964.0.html)
# - Beta-User for many tests, many suggestions and good discussions
# - pc1246 write english commandref
# - FunkOdyssey commandref style
# - sledge fix many typo in commandref
# - many User that use with modul and report bugs
# - Christoph (christoph.kaiser.in) Patch that expand RegEx for Window Events
# - Julian (Loredo) expand Residents Events for new Residents functions
# - Christoph (Christoph Morrison) for fix Commandref, many suggestions and good discussions
#
#
# This script is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License,or
# any later version.
#
# The GNU General Public License can be found at
# http://www.gnu.org/copyleft/gpl.html.
# A copy is found in the textfile GPL.txt and important notices to the license
# from the author is found in LICENSE.txt distributed with these scripts.
#
# This script is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
#
# $Id$
#
###############################################################################
## unserer packagename
package FHEM::Automation::ShuttersControl::Shading;
use strict;
use warnings;
use POSIX qw(strftime);
use utf8;
use FHEM::Automation::ShuttersControl::Helper qw (IsInTime);
require Exporter;
our @ISA = qw(Exporter);
our @EXPORT_OK = qw(
CheckASC_ConditionsForShadingFn
ShadingProcessing
ShadingProcessingDriveCommand
);
our %EXPORT_TAGS = (
ALL => [
qw(
CheckASC_ConditionsForShadingFn
ShadingProcessing
ShadingProcessingDriveCommand
)
],
);
use GPUtils qw(GP_Import);
## Import der FHEM Funktionen
BEGIN {
GP_Import(
qw(
Log3
gettimeofday
InternalTimer
ReadingsVal
readingsBeginUpdate
readingsBulkUpdate
readingsBulkUpdateIfChanged
readingsEndUpdate
defs
)
);
}
sub CheckASC_ConditionsForShadingFn {
my $hash = shift;
my $error;
$error .=
' no valid data from the ASC temperature sensor, is ASC_tempSensor attribut set?'
if ( $FHEM::Automation::ShuttersControl::ascDev->getOutTemp == -100 );
$error .= ' no twilight device found'
if ( $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice eq
'none' );
my $count = 1;
for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
InternalTimer(
gettimeofday() + $count,
'FHEM::Automation::ShuttersControl::Shading::_CheckShuttersConditionsForShadingFn',
$shuttersDev
);
$count++;
}
return (
defined($error)
? $error
: 'none'
);
}
sub _CheckShuttersConditionsForShadingFn {
my $shuttersDev = shift;
$FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
my $shuttersDevHash = $defs{$shuttersDev};
my $message = '';
my $errorMessage;
my $warnMessage;
my $infoMessage;
$infoMessage .= (
$FHEM::Automation::ShuttersControl::shutters->getShadingMode ne 'off'
&& $FHEM::Automation::ShuttersControl::ascDev
->getAutoShuttersControlShading eq 'on'
&& $FHEM::Automation::ShuttersControl::shutters->getOutTemp == -100
? ' shading active, global temp sensor is set, but shutters temperature sensor is not set'
: ''
);
$warnMessage .= (
$FHEM::Automation::ShuttersControl::shutters->getShadingMode eq 'off'
&& $FHEM::Automation::ShuttersControl::ascDev
->getAutoShuttersControlShading eq 'on'
? ' global shading active but ASC_Shading_Mode attribut is not set or off'
: ''
);
$errorMessage .= (
$FHEM::Automation::ShuttersControl::shutters->getShadingMode ne 'off'
&& $FHEM::Automation::ShuttersControl::ascDev
->getAutoShuttersControlShading ne 'on'
&& $FHEM::Automation::ShuttersControl::ascDev
->getAutoShuttersControlShading ne 'off'
? ' ASC_Shading_Mode attribut is set but global shading has errors, look at ASC device '
. '<a href="'
. '/fhem?detail='
. ReadingsVal( $shuttersDev, 'associatedWith', 'ASC device' )
. $::FW_CSRF . '">'
. ReadingsVal( $shuttersDev, 'associatedWith', 'ASC device' )
. '</a>'
: ''
);
$errorMessage .= (
$FHEM::Automation::ShuttersControl::shutters->getBrightness == -1
&& $FHEM::Automation::ShuttersControl::shutters->getShadingMode ne
'off'
? ' no brightness sensor found, please set ASC_BrightnessSensor attribut'
: ''
);
$message .= ' ERROR: ' . $errorMessage
if ( defined($errorMessage)
&& $errorMessage ne '' );
$message .= ' WARN: ' . $warnMessage
if ( defined($warnMessage)
&& $warnMessage ne ''
&& $errorMessage eq '' );
$message .= ' INFO: ' . $infoMessage
if ( defined($infoMessage)
&& $infoMessage ne ''
&& $errorMessage eq '' );
readingsBeginUpdate($shuttersDevHash);
readingsBulkUpdateIfChanged( $shuttersDevHash, 'ASC_ShadingMessage',
'<html>' . $message . ' </html>' );
readingsEndUpdate( $shuttersDevHash, 1 );
}
sub ShadingProcessing {
### angleMinus ist $FHEM::Automation::ShuttersControl::shutters->getShadingAzimuthLeft
### anglePlus ist $FHEM::Automation::ShuttersControl::shutters->getShadingAzimuthRight
### winPos ist die Fensterposition $FHEM::Automation::ShuttersControl::shutters->getDirection
my ( $hash, $shuttersDev, $azimuth, $elevation, $outTemp,
$azimuthLeft, $azimuthRight )
= @_;
my $name = $hash->{NAME};
$FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
my $brightness =
$FHEM::Automation::ShuttersControl::shutters->getBrightnessAverage;
$FHEM::Automation::ShuttersControl::shutters->setShadingBetweenTheTimeSuspend(
( IsInTime($FHEM::Automation::ShuttersControl::shutters->getShadingBetweenTheTime)
? 0
: 1 )
);
FHEM::Automation::ShuttersControl::ASC_Debug(
'ShadingProcessing: '
. $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
. ' - Übergebende Werte - Azimuth:'
. $azimuth
. ', Elevation: '
. $elevation
. ', Brightness: '
. $brightness
. ', OutTemp: '
. $outTemp
. ', Azimut Beschattung: '
. $azimuthLeft
. ', Azimut Endschattung: '
. $azimuthRight
. ', Ist es nach der Zeitblockadezeit: '
. (
FHEM::Automation::ShuttersControl::IsAfterShuttersTimeBlocking(
$shuttersDev) ? 'JA' : 'NEIN'
)
. ', Das Rollo ist in der Beschattung und wurde manuell gefahren: '
. (
$FHEM::Automation::ShuttersControl::shutters
->getShadingManualDriveStatus ? 'JA' : 'NEIN'
)
. ', Ist es nach der Hälfte der Beschattungswartezeit: '
. (
(
int( gettimeofday() ) -
$FHEM::Automation::ShuttersControl::shutters
->getShadingStatusTimestamp
) < (
$FHEM::Automation::ShuttersControl::shutters
->getShadingWaitingPeriod / 2
) ? 'NEIN' : 'JA'
)
);
Log3( $name, 4,
"AutoShuttersControl ($name) - Shading Processing, Rollladen: "
. $shuttersDev
. " Azimuth: "
. $azimuth
. " Elevation: "
. $elevation
. " Brightness: "
. $brightness
. " OutTemp: "
. $outTemp );
return
if (
$azimuth == -1
|| $elevation == -1
|| $brightness == -1
|| $outTemp == -100
|| (
int( gettimeofday() ) -
$FHEM::Automation::ShuttersControl::shutters
->getShadingStatusTimestamp ) < (
$FHEM::Automation::ShuttersControl::shutters
->getShadingWaitingPeriod / 2
)
|| $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq 'off'
);
Log3( $name, 4,
"AutoShuttersControl ($name) - Shading Processing, Rollladen: "
. $shuttersDev
. " Nach dem return" );
my $getShadingPos =
$FHEM::Automation::ShuttersControl::shutters->getShadingPos;
my $getStatus = $FHEM::Automation::ShuttersControl::shutters->getStatus;
my $oldShadingStatus =
$FHEM::Automation::ShuttersControl::shutters->getShadingStatus;
my $shuttersDevHash = $defs{$shuttersDev};
my $getModeUp = $FHEM::Automation::ShuttersControl::shutters->getModeUp;
my $homemode = $FHEM::Automation::ShuttersControl::shutters->getHomemode;
FHEM::Automation::ShuttersControl::ASC_Debug( 'ShadingProcessing: '
. $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
. ' - Alle Werte für die weitere Verarbeitung sind korrekt vorhanden und es wird nun mit der Beschattungsverarbeitung begonnen'
);
if (
(
$outTemp < $FHEM::Automation::ShuttersControl::shutters
->getShadingMinOutsideTemperature - 4
|| $azimuth < $azimuthLeft
|| $azimuth > $azimuthRight
|| !$FHEM::Automation::ShuttersControl::shutters->getIsDay
)
&& $FHEM::Automation::ShuttersControl::shutters->getShadingStatus ne
'out'
)
{
$FHEM::Automation::ShuttersControl::shutters->setShadingStatus('out');
FHEM::Automation::ShuttersControl::ASC_Debug( 'ShadingProcessing: '
. $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
. ' - Es ist Nacht oder die Aussentemperatur unterhalb der Shading Temperatur. Die Beschattung wird Zwangsbeendet'
);
Log3( $name, 4,
"AutoShuttersControl ($name) - Shading Processing - Der Sonnenstand ist ausserhalb der Winkelangaben oder die Aussentemperatur unterhalb der Shading Temperatur "
);
}
elsif ($azimuth < $azimuthLeft
|| $azimuth > $azimuthRight
|| $elevation <
$FHEM::Automation::ShuttersControl::shutters->getShadingMinElevation
|| $elevation >
$FHEM::Automation::ShuttersControl::shutters->getShadingMaxElevation
|| $brightness < $FHEM::Automation::ShuttersControl::shutters
->getShadingStateChangeCloudy
|| $outTemp < $FHEM::Automation::ShuttersControl::shutters
->getShadingMinOutsideTemperature - 1 )
{
$FHEM::Automation::ShuttersControl::shutters->setShadingStatus(
'out reserved')
if ( $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq
'in'
|| $FHEM::Automation::ShuttersControl::shutters->getShadingStatus
eq 'in reserved' );
if (
(
$FHEM::Automation::ShuttersControl::shutters->getShadingStatus
eq 'out reserved'
and (
int( gettimeofday() ) -
$FHEM::Automation::ShuttersControl::shutters
->getShadingStatusTimestamp )
) > $FHEM::Automation::ShuttersControl::shutters
->getShadingWaitingPeriod
)
{
$FHEM::Automation::ShuttersControl::shutters->setShadingStatus(
'out');
}
Log3( $name, 4,
"AutoShuttersControl ($name) - Shading Processing, Rollladen: "
. $shuttersDev
. " In der Out Abfrage, Shadingwert: "
. $FHEM::Automation::ShuttersControl::shutters->getShadingStatus
. ", Zeitstempel: "
. $FHEM::Automation::ShuttersControl::shutters
->getShadingStatusTimestamp );
FHEM::Automation::ShuttersControl::ASC_Debug( 'ShadingProcessing: '
. $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
. ' - Einer der Beschattungsbedingungen wird nicht mehr erfüllt und somit wird der Beschattungsstatus um eine Stufe reduziert. Alter Status: '
. $oldShadingStatus
. ' Neuer Status: '
. $FHEM::Automation::ShuttersControl::shutters->getShadingStatus
);
}
elsif ($azimuth > $azimuthLeft
&& $azimuth < $azimuthRight
&& $elevation >
$FHEM::Automation::ShuttersControl::shutters->getShadingMinElevation
&& $elevation <
$FHEM::Automation::ShuttersControl::shutters->getShadingMaxElevation
&& $brightness >
$FHEM::Automation::ShuttersControl::shutters->getShadingStateChangeSunny
&& $outTemp > $FHEM::Automation::ShuttersControl::shutters
->getShadingMinOutsideTemperature )
{
if ( $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq
'out'
|| $FHEM::Automation::ShuttersControl::shutters->getShadingStatus
eq 'out reserved' )
{
$FHEM::Automation::ShuttersControl::shutters->setShadingStatus(
'in reserved');
}
if (
$FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq
'in reserved'
and (
int( gettimeofday() ) -
$FHEM::Automation::ShuttersControl::shutters
->getShadingStatusTimestamp ) > (
$FHEM::Automation::ShuttersControl::shutters
->getShadingWaitingPeriod / 2
)
)
{
$FHEM::Automation::ShuttersControl::shutters->setShadingStatus(
'in');
}
Log3( $name, 4,
"AutoShuttersControl ($name) - Shading Processing, Rollladen: "
. $shuttersDev
. " In der In Abfrage, Shadingwert: "
. $FHEM::Automation::ShuttersControl::shutters->getShadingStatus
. ", Zeitstempel: "
. $FHEM::Automation::ShuttersControl::shutters
->getShadingStatusTimestamp );
FHEM::Automation::ShuttersControl::ASC_Debug( 'ShadingProcessing: '
. $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
. ' - Alle Beschattungsbedingungen wurden erfüllt und somit wird der Beschattungsstatus um eine Stufe angehoben. Alter Status: '
. $oldShadingStatus
. ' Neuer Status: '
. $FHEM::Automation::ShuttersControl::shutters->getShadingStatus
);
}
ShadingProcessingDriveCommand( $hash, $shuttersDev )
if (
FHEM::Automation::ShuttersControl::IsAfterShuttersTimeBlocking(
$shuttersDev)
&& !$FHEM::Automation::ShuttersControl::shutters
->getShadingManualDriveStatus
&& $FHEM::Automation::ShuttersControl::shutters->getRoommatesStatus ne
'gotosleep'
&& $FHEM::Automation::ShuttersControl::shutters->getRoommatesStatus ne
'asleep'
&& (
(
$FHEM::Automation::ShuttersControl::shutters->getShadingStatus
eq 'out'
&& $FHEM::Automation::ShuttersControl::shutters
->getShadingLastStatus eq 'in'
)
|| ( $FHEM::Automation::ShuttersControl::shutters->getShadingStatus
eq 'in'
&& $FHEM::Automation::ShuttersControl::shutters
->getShadingLastStatus eq 'out' )
)
&& ( $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq
'always'
|| $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq
$homemode )
&& (
$FHEM::Automation::ShuttersControl::shutters->getModeUp eq 'always'
|| $FHEM::Automation::ShuttersControl::shutters->getModeUp eq
$homemode
|| $FHEM::Automation::ShuttersControl::shutters->getModeUp eq 'off'
|| $FHEM::Automation::ShuttersControl::shutters->getModeUp eq
'absent'
|| ( $FHEM::Automation::ShuttersControl::shutters->getModeUp eq
'home'
&& $homemode ne 'asleep' )
)
&& (
(
(
int( gettimeofday() ) -
$FHEM::Automation::ShuttersControl::shutters
->getShadingStatusTimestamp
) < 2
&& $FHEM::Automation::ShuttersControl::shutters->getStatus !=
$FHEM::Automation::ShuttersControl::shutters->getClosedPos
)
|| (
!$FHEM::Automation::ShuttersControl::shutters
->getQueryShuttersPos(
$FHEM::Automation::ShuttersControl::shutters->getShadingPos
)
&& $FHEM::Automation::ShuttersControl::shutters->getIfInShading
)
|| ( !$FHEM::Automation::ShuttersControl::shutters->getIfInShading
&& $FHEM::Automation::ShuttersControl::shutters->getStatus ==
$FHEM::Automation::ShuttersControl::shutters->getShadingPos
)
|| ( !$FHEM::Automation::ShuttersControl::shutters->getShadingBetweenTheTimeSuspend
&& $FHEM::Automation::ShuttersControl::shutters->getStatus !=
$FHEM::Automation::ShuttersControl::shutters->getShadingPos )
)
);
readingsBeginUpdate($shuttersDevHash);
readingsBulkUpdate(
$shuttersDevHash,
'ASC_ShadingMessage',
'INFO: current shading status is \''
. $FHEM::Automation::ShuttersControl::shutters->getShadingStatus
. '\''
. ' - next check in '
. (
(
(
$FHEM::Automation::ShuttersControl::shutters
->getShadingLastStatus eq 'out reserved'
|| $FHEM::Automation::ShuttersControl::shutters
->getShadingLastStatus eq 'out'
)
? $FHEM::Automation::ShuttersControl::shutters
->getShadingWaitingPeriod
: $FHEM::Automation::ShuttersControl::shutters
->getShadingWaitingPeriod / 2
)
) / 60
. 'm'
);
readingsEndUpdate( $shuttersDevHash, 1 );
return;
}
sub ShadingProcessingDriveCommand {
my $hash = shift;
my $shuttersDev = shift;
my $name = $hash->{NAME};
$FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
my $getShadingPos =
$FHEM::Automation::ShuttersControl::shutters->getShadingPos;
my $getStatus = $FHEM::Automation::ShuttersControl::shutters->getStatus;
$FHEM::Automation::ShuttersControl::shutters->setShadingStatus(
$FHEM::Automation::ShuttersControl::shutters->getShadingStatus );
if ( IsInTime($FHEM::Automation::ShuttersControl::shutters->getShadingBetweenTheTime)
&& $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq 'in'
&& $getShadingPos != $getStatus
&& $getStatus != $FHEM::Automation::ShuttersControl::shutters->getClosedPos
&& (
FHEM::Automation::ShuttersControl::CheckIfShuttersWindowRecOpen(
$shuttersDev) != 2
|| $FHEM::Automation::ShuttersControl::shutters->getShuttersPlace
ne 'terrace'
)
)
{
$FHEM::Automation::ShuttersControl::shutters->setLastDrive(
'shading in');
FHEM::Automation::ShuttersControl::ShuttersCommandSet( $hash,
$shuttersDev, $getShadingPos );
FHEM::Automation::ShuttersControl::ASC_Debug(
'ShadingProcessingDriveCommand: '
. $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
. ' - Der aktuelle Beschattungsstatus ist: '
. $FHEM::Automation::ShuttersControl::shutters->getShadingStatus
. ' und somit wird nun in die Position: '
. $getShadingPos
. ' zum Beschatten gefahren' );
$FHEM::Automation::ShuttersControl::shutters->setShadingLastPos(
$getShadingPos);
}
elsif (
$FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq 'out'
&& $getShadingPos == $getStatus )
{
$FHEM::Automation::ShuttersControl::shutters->setLastDrive(
'shading out');
FHEM::Automation::ShuttersControl::ShuttersCommandSet(
$hash,
$shuttersDev,
(
(
$getShadingPos ==
$FHEM::Automation::ShuttersControl::shutters->getLastPos
|| $getShadingPos ==
$FHEM::Automation::ShuttersControl::shutters
->getShadingLastPos
)
? $FHEM::Automation::ShuttersControl::shutters->getOpenPos
: (
$FHEM::Automation::ShuttersControl::shutters
->getQueryShuttersPos(
$FHEM::Automation::ShuttersControl::shutters->getLastPos
)
? (
$FHEM::Automation::ShuttersControl::shutters
->getLastPos ==
$FHEM::Automation::ShuttersControl::shutters
->getSleepPos
? $FHEM::Automation::ShuttersControl::shutters
->getOpenPos
: $FHEM::Automation::ShuttersControl::shutters
->getLastPos
)
: $FHEM::Automation::ShuttersControl::shutters->getOpenPos
)
)
) if ( $FHEM::Automation::ShuttersControl::shutters->getIsDay
|| $FHEM::Automation::ShuttersControl::shutters->getShuttersPlace eq 'awning' );
FHEM::Automation::ShuttersControl::ASC_Debug(
'ShadingProcessingDriveCommand: '
. $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
. ' - Der aktuelle Beschattungsstatus ist: '
. $FHEM::Automation::ShuttersControl::shutters->getShadingStatus
. ' und somit wird nun in die Position: '
. $getShadingPos
. ' zum beenden der Beschattung gefahren' );
}
Log3( $name, 4,
"AutoShuttersControl ($name) - Shading Processing - In der Routine zum fahren der Rollläden, Shading Wert: "
. $FHEM::Automation::ShuttersControl::shutters->getShadingStatus );
FHEM::Automation::ShuttersControl::ASC_Debug(
'ShadingProcessingDriveCommand: '
. $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
. ' - Der aktuelle Beschattungsstatus ist: '
. $FHEM::Automation::ShuttersControl::shutters->getShadingStatus
. ', Beschattungsstatus Zeitstempel: '
. strftime(
"%Y.%m.%e %T",
localtime(
$FHEM::Automation::ShuttersControl::shutters
->getShadingStatusTimestamp
)
)
);
return;
}
1;

View File

@ -453,6 +453,35 @@ sub setAdvDelay {
return;
}
sub setWindProtectionStatus { # Werte protected, unprotected
my $self = shift;
my $value = shift;
$self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{VAL} = $value
if ( defined($value) );
return;
}
sub setRainProtectionStatus { # Werte protected, unprotected
my $self = shift;
my $value = shift;
$self->{ $self->{shuttersDev} }->{RainProtection}->{VAL} = $value
if ( defined($value) );
return;
}
sub setExternalTriggerStatus {
my $self = shift;
my $value = shift;
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{event} = $value
if ( defined($value) );
return;
}
sub getExternalTriggerStatus {
my $self = shift;
@ -523,7 +552,7 @@ sub getAttrUpdateChanges {
sub getIsDay {
my $self = shift;
return FHEM::Automation::ShuttersControl::_IsDay( $self->{shuttersDev} );
return FHEM::Automation::ShuttersControl::Helper::_IsDay( $self->{shuttersDev} );
}
sub getAntiFreezeStatus {
@ -697,6 +726,36 @@ sub getInTimerFuncHash {
return $self->{ $self->{shuttersDev} }{inTimerFuncHash};
}
sub getWindProtectionStatus { # Werte protected, unprotected
my $self = shift;
return (
(
defined( $self->{ $self->{shuttersDev} }->{ASC_WindParameters} )
&& defined(
$self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{VAL}
)
)
? $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{VAL}
: 'unprotected'
);
}
sub getRainProtectionStatus { # Werte protected, unprotected
my $self = shift;
return (
(
defined( $self->{ $self->{shuttersDev} }->{RainProtection} )
&& defined(
$self->{ $self->{shuttersDev} }->{RainProtection}->{VAL}
)
)
? $self->{ $self->{shuttersDev} }->{RainProtection}->{VAL}
: 'unprotected'
);
}
sub getSunsetUnixTime {
my $self = shift;
@ -867,30 +926,21 @@ sub setShadingManualDriveStatus {
return;
}
sub setWindProtectionStatus { # Werte protected, unprotected
sub setShadingLastPos {
my $self = shift;
my $value = shift;
$self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{VAL} = $value
$self->{ $self->{shuttersDev} }{ShadingLastPos}{VAL} = $value
if ( defined($value) );
return;
}
sub setRainProtectionStatus { # Werte protected, unprotected
sub setShadingBetweenTheTimeSuspend { # Werte für value = 0, 1
my $self = shift;
my $value = shift;
$self->{ $self->{shuttersDev} }->{RainProtection}->{VAL} = $value
if ( defined($value) );
return;
}
sub setExternalTriggerStatus {
my $self = shift;
my $value = shift;
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{event} = $value
$self->{ $self->{shuttersDev} }{ShadingBetweenTheTimeSuspend}{VAL} = $value
if ( defined($value) );
return;
@ -918,9 +968,11 @@ sub setPushBrightnessInArray {
}
sub getBrightnessAverage {
use FHEM::Automation::ShuttersControl::Helper qw (AverageBrightness);
my $self = shift;
return FHEM::Automation::ShuttersControl::_averageBrightness(
return AverageBrightness(
@{ $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL} } )
if (
ref( $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL} )
@ -946,6 +998,17 @@ sub getShadingStatus { # Werte für value = in, out, in reserved, out reserved
);
}
sub getShadingBetweenTheTimeSuspend { # Werte für value = 0, 1
my $self = shift;
return (
defined( $self->{ $self->{shuttersDev} }{ShadingBetweenTheTimeSuspend} )
&& defined( $self->{ $self->{shuttersDev} }{ShadingBetweenTheTimeSuspend}{VAL} )
? $self->{ $self->{shuttersDev} }{ShadingBetweenTheTimeSuspend}{VAL}
: 0
);
}
sub getShadingLastStatus { # Werte für value = in, out
my $self = shift;
@ -983,36 +1046,6 @@ sub getIfInShading {
);
}
sub getWindProtectionStatus { # Werte protected, unprotected
my $self = shift;
return (
(
defined( $self->{ $self->{shuttersDev} }->{ASC_WindParameters} )
&& defined(
$self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{VAL}
)
)
? $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{VAL}
: 'unprotected'
);
}
sub getRainProtectionStatus { # Werte protected, unprotected
my $self = shift;
return (
(
defined( $self->{ $self->{shuttersDev} }->{RainProtection} )
&& defined(
$self->{ $self->{shuttersDev} }->{RainProtection}->{VAL}
)
)
? $self->{ $self->{shuttersDev} }->{RainProtection}->{VAL}
: 'unprotected'
);
}
sub getShadingStatusTimestamp {
my $self = shift;
@ -1036,6 +1069,23 @@ sub getShadingLastStatusTimestamp {
: 0
);
}
sub getShadingLastPos {
my $self = shift;
return (
defined( $self->{ $self->{shuttersDev} }{ShadingLastPos} )
&& defined(
$self->{ $self->{shuttersDev} }{ShadingLastPos}{VAL}
)
? $self->{ $self->{shuttersDev} }{ShadingLastPos}{VAL}
: $FHEM::Automation::ShuttersControl::shutters->getShadingPos
);
}
### Ende Beschattung
1;

View File

@ -44,6 +44,8 @@ use strict;
use warnings;
use utf8;
use FHEM::Automation::ShuttersControl::Helper qw (IsAdv PerlCodeCheck);
use GPUtils qw(GP_Import);
## Import der FHEM Funktionen
@ -91,7 +93,7 @@ sub _getPosition {
m{\A\{.+\}\z}xms
)
{
my $response = FHEM::Automation::ShuttersControl::_perlCodeCheck(
my $response = PerlCodeCheck(
AttrVal(
$self->{shuttersDev},
$attr,
@ -136,14 +138,14 @@ sub _getPosition {
if (
defined(
FHEM::Automation::ShuttersControl::_perlCodeCheck(
PerlCodeCheck(
$self->{ $self->{shuttersDev} }->{$attr}->{position}
)
)
)
{
$self->{ $self->{shuttersDev} }->{$attr}->{position} =
FHEM::Automation::ShuttersControl::_perlCodeCheck(
PerlCodeCheck(
$self->{ $self->{shuttersDev} }->{$attr}->{position} );
}
@ -543,7 +545,7 @@ sub getAdv {
return (
AttrVal( $self->{shuttersDev}, 'ASC_Adv', 'off' ) eq 'on'
? ( \&FHEM::Automation::ShuttersControl::_IsAdv == 1 ? 1 : 0 )
? ( IsAdv == 1 ? 1 : 0 )
: 0
);
}
@ -1779,6 +1781,21 @@ sub getDown {
return AttrVal( $self->{shuttersDev}, 'ASC_Down', 'astro' );
}
sub setShadingBetweenTheTime {
my $self = shift;
my $attrVal = shift;
_setAttributs( $self->{shuttersDev}, 'ASC_Shading_BetweenTheTime', $attrVal );
return;
}
sub getShadingBetweenTheTime {
my $self = shift;
return AttrVal( $self->{shuttersDev}, 'ASC_Shading_BetweenTheTime', '00:00-24:00' );
}
sub setTimeUpEarly {
my $self = shift;
my $attrVal = shift;
@ -1793,8 +1810,8 @@ sub getTimeUpEarly {
my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_Early', '05:00' );
if ( defined( FHEM::Automation::ShuttersControl::_perlCodeCheck($val) ) ) {
$val = FHEM::Automation::ShuttersControl::_perlCodeCheck($val);
if ( defined( PerlCodeCheck($val) ) ) {
$val = PerlCodeCheck($val);
}
return (
@ -1818,8 +1835,8 @@ sub getTimeUpLate {
my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_Late', '08:30' );
if ( defined( FHEM::Automation::ShuttersControl::_perlCodeCheck($val) ) ) {
$val = FHEM::Automation::ShuttersControl::_perlCodeCheck($val);
if ( defined( PerlCodeCheck($val) ) ) {
$val = PerlCodeCheck($val);
}
return (
@ -1843,8 +1860,8 @@ sub getTimeDownEarly {
my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Down_Early', '16:00' );
if ( defined( FHEM::Automation::ShuttersControl::_perlCodeCheck($val) ) ) {
$val = FHEM::Automation::ShuttersControl::_perlCodeCheck($val);
if ( defined( PerlCodeCheck($val) ) ) {
$val = PerlCodeCheck($val);
}
return (
@ -1868,8 +1885,8 @@ sub getTimeDownLate {
my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Down_Late', '22:00' );
if ( defined( FHEM::Automation::ShuttersControl::_perlCodeCheck($val) ) ) {
$val = FHEM::Automation::ShuttersControl::_perlCodeCheck($val);
if ( defined( PerlCodeCheck($val) ) ) {
$val = PerlCodeCheck($val);
}
return (
@ -1894,8 +1911,8 @@ sub getTimeUpWeHoliday {
my $val =
AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_WE_Holiday', '01:25' );
if ( defined( FHEM::Automation::ShuttersControl::_perlCodeCheck($val) ) ) {
$val = FHEM::Automation::ShuttersControl::_perlCodeCheck($val);
if ( defined( PerlCodeCheck($val) ) ) {
$val = PerlCodeCheck($val);
}
return (