change Offset Logic, fix NoOffset Value, change blocking drive then window open and shutter place terrace
This commit is contained in:
parent
f328da9e9a
commit
195d557142
@ -42,7 +42,7 @@ use strict;
|
|||||||
use warnings;
|
use warnings;
|
||||||
use FHEM::Meta;
|
use FHEM::Meta;
|
||||||
|
|
||||||
my $version = '0.4.0.11beta50';
|
my $version = '0.4.0.11beta53';
|
||||||
|
|
||||||
sub AutoShuttersControl_Initialize($) {
|
sub AutoShuttersControl_Initialize($) {
|
||||||
my ($hash) = @_;
|
my ($hash) = @_;
|
||||||
@ -86,6 +86,7 @@ sub AutoShuttersControl_Initialize($) {
|
|||||||
. 'ASC_windSensor '
|
. 'ASC_windSensor '
|
||||||
. 'ASC_expert:1 '
|
. 'ASC_expert:1 '
|
||||||
. 'ASC_blockAscDrivesAfterManual:0,1 '
|
. 'ASC_blockAscDrivesAfterManual:0,1 '
|
||||||
|
. 'ASC_debug:1 '
|
||||||
. $oldAttr
|
. $oldAttr
|
||||||
. $readingFnAttributes;
|
. $readingFnAttributes;
|
||||||
$hash->{NotifyOrderPrefix} = '51-'; # Order Nummer für NotifyFn
|
$hash->{NotifyOrderPrefix} = '51-'; # Order Nummer für NotifyFn
|
||||||
@ -784,8 +785,6 @@ sub EventProcessingWindowRec($@) {
|
|||||||
$shutters->setHardLockOut('on')
|
$shutters->setHardLockOut('on')
|
||||||
if ( ($1 eq 'open' or $1 eq 'opened') and $shutters->getShuttersPlace eq 'terrace' );
|
if ( ($1 eq 'open' or $1 eq 'opened') and $shutters->getShuttersPlace eq 'terrace' );
|
||||||
|
|
||||||
$shutters->setNoOffset(1);
|
|
||||||
|
|
||||||
my $queryShuttersPosWinRecTilted = (
|
my $queryShuttersPosWinRecTilted = (
|
||||||
$shutters->getShuttersPosCmdValueNegate
|
$shutters->getShuttersPosCmdValueNegate
|
||||||
? $shutters->getStatus > $shutters->getVentilatePos
|
? $shutters->getStatus > $shutters->getVentilatePos
|
||||||
@ -797,18 +796,8 @@ sub EventProcessingWindowRec($@) {
|
|||||||
: $shutters->getStatus < $shutters->getComfortOpenPos
|
: $shutters->getStatus < $shutters->getComfortOpenPos
|
||||||
);
|
);
|
||||||
|
|
||||||
# ## Wird erstmal deaktiviert da es Sinnlos ist in meinen Augen
|
|
||||||
# if ( $shutters->getDelayCmd ne 'none' and $1 eq 'closed' )
|
|
||||||
# { # Es wird geschaut ob wärend der Fenster offen Phase ein Fahrbefehl über das Modul kam,wenn ja wird dieser aus geführt
|
|
||||||
# $shutters->setLastDrive('delayed drive - window closed');
|
|
||||||
# ShuttersCommandSet( $hash, $shuttersDev, $shutters->getDelayCmd );
|
|
||||||
# }
|
|
||||||
if ( $1 eq 'closed'
|
if ( $1 eq 'closed'
|
||||||
and IsAfterShuttersTimeBlocking( $hash, $shuttersDev )
|
and IsAfterShuttersTimeBlocking( $hash, $shuttersDev )
|
||||||
# and ($shutters->getModeDown eq $homemode
|
|
||||||
# or ( $shutters->getModeDown eq 'absent'
|
|
||||||
# and $homemode eq 'gone' )
|
|
||||||
# or $shutters->getModeDown eq 'always') Die Abfrage ist Unsinn. Entweder ich bin zu Hause und bewege die Fenster oder eben nicht
|
|
||||||
and ( $shutters->getStatus == $shutters->getVentilatePos
|
and ( $shutters->getStatus == $shutters->getVentilatePos
|
||||||
or $shutters->getStatus == $shutters->getComfortOpenPos
|
or $shutters->getStatus == $shutters->getComfortOpenPos
|
||||||
or $shutters->getStatus == $shutters->getOpenPos )
|
or $shutters->getStatus == $shutters->getOpenPos )
|
||||||
@ -824,21 +813,24 @@ sub EventProcessingWindowRec($@) {
|
|||||||
and ( $homemode ne 'asleep'
|
and ( $homemode ne 'asleep'
|
||||||
or $homemode ne 'gotosleep'
|
or $homemode ne 'gotosleep'
|
||||||
or $homemode eq 'none' )
|
or $homemode eq 'none' )
|
||||||
|
# and ( CheckIfShuttersWindowRecOpen($shuttersDev) == 2
|
||||||
|
# and $shutters->getShuttersPlace eq 'terrace')
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
$shutters->setLastDrive('window day closed');
|
$shutters->setLastDrive('window day closed');
|
||||||
# ShuttersCommandSet( $hash, $shuttersDev,
|
$shutters->setNoOffset(1);
|
||||||
# $shutters->getLastPos );
|
|
||||||
$shutters->setDriveCmd($shutters->getLastPos);
|
$shutters->setDriveCmd($shutters->getLastPos);
|
||||||
}
|
}
|
||||||
|
|
||||||
elsif (not IsDay( $hash, $shuttersDev )
|
elsif ( not IsDay( $hash, $shuttersDev )
|
||||||
or $homemode eq 'asleep'
|
or $homemode eq 'asleep'
|
||||||
or $homemode eq 'gotosleep' )
|
or $homemode eq 'gotosleep'
|
||||||
|
# and ( not CheckIfShuttersWindowRecOpen($shuttersDev) == 2
|
||||||
|
# and not $shutters->getShuttersPlace eq 'terrace')
|
||||||
|
)
|
||||||
{
|
{
|
||||||
$shutters->setLastDrive('window night closed');
|
$shutters->setLastDrive('window night closed');
|
||||||
# ShuttersCommandSet( $hash, $shuttersDev,
|
$shutters->setNoOffset(1);
|
||||||
# $shutters->getClosedPos );
|
|
||||||
$shutters->setDriveCmd($shutters->getClosedPos);
|
$shutters->setDriveCmd($shutters->getClosedPos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -852,8 +844,7 @@ sub EventProcessingWindowRec($@) {
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
$shutters->setLastDrive('ventilate - window open');
|
$shutters->setLastDrive('ventilate - window open');
|
||||||
# ShuttersCommandSet( $hash, $shuttersDev,
|
$shutters->setNoOffset(1);
|
||||||
# $shutters->getVentilatePos );
|
|
||||||
$shutters->setDriveCmd($shutters->getVentilatePos);
|
$shutters->setDriveCmd($shutters->getVentilatePos);
|
||||||
}
|
}
|
||||||
elsif ( ($1 eq 'open' or $1 eq 'opened')
|
elsif ( ($1 eq 'open' or $1 eq 'opened')
|
||||||
@ -874,9 +865,11 @@ sub EventProcessingWindowRec($@) {
|
|||||||
$setLastDrive = 'ventilate - window open';
|
$setLastDrive = 'ventilate - window open';
|
||||||
}
|
}
|
||||||
|
|
||||||
$shutters->setLastDrive($setLastDrive);
|
if ( defined($posValue) and $posValue ) {
|
||||||
$shutters->setDriveCmd($posValue);
|
$shutters->setLastDrive($setLastDrive);
|
||||||
# ShuttersCommandSet( $hash, $shuttersDev, $posValue );
|
$shutters->setNoOffset(1);
|
||||||
|
$shutters->setDriveCmd($posValue);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1211,18 +1204,29 @@ sub EventProcessingBrightness($@) {
|
|||||||
my ( $hash, $shuttersDev, $events ) = @_;
|
my ( $hash, $shuttersDev, $events ) = @_;
|
||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
$shutters->setShuttersDev($shuttersDev);
|
$shutters->setShuttersDev($shuttersDev);
|
||||||
|
|
||||||
|
ASC_Debug('EventProcessingBrightness: '
|
||||||
|
. $shutters->getShuttersDev
|
||||||
|
. ' - Event von einem Helligkeitssensor erkannt. Verarbeitung läuft. Sollten keine weitere Meldungen aus der Funktion kommen, so befindet sich die aktuelle Zeit nicht innerhalb der Verarbeitungszeit für Sunset oder Sunrise');
|
||||||
|
|
||||||
return EventProcessingShadingBrightness( $hash, $shuttersDev, $events )
|
return EventProcessingShadingBrightness( $hash, $shuttersDev, $events )
|
||||||
unless (
|
unless (
|
||||||
int( gettimeofday() / 86400 ) !=
|
( $shutters->getModeDown eq 'brightness'
|
||||||
int( computeAlignTime( '24:00', $shutters->getTimeUpEarly ) / 86400 )
|
or $shutters->getModeUp eq 'brightness' )
|
||||||
and int( gettimeofday() / 86400 ) ==
|
or ( (int( gettimeofday() / 86400 ) !=
|
||||||
int( computeAlignTime( '24:00', $shutters->getTimeUpLate ) / 86400 )
|
int( computeAlignTime( '24:00', $shutters->getTimeUpEarly ) / 86400 )
|
||||||
or int( gettimeofday() / 86400 ) !=
|
and int( gettimeofday() / 86400 ) ==
|
||||||
int( computeAlignTime( '24:00', $shutters->getTimeDownEarly ) / 86400 )
|
int( computeAlignTime( '24:00', $shutters->getTimeUpLate ) / 86400 ) )
|
||||||
and int( gettimeofday() / 86400 ) ==
|
or (int( gettimeofday() / 86400 ) !=
|
||||||
int( computeAlignTime( '24:00', $shutters->getTimeDownLate ) / 86400 )
|
int( computeAlignTime( '24:00', $shutters->getTimeDownEarly ) / 86400 )
|
||||||
|
and int( gettimeofday() / 86400 ) ==
|
||||||
|
int( computeAlignTime( '24:00', $shutters->getTimeDownLate ) / 86400 ) )
|
||||||
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
ASC_Debug('EventProcessingBrightness: '
|
||||||
|
. $shutters->getShuttersDev
|
||||||
|
. ' - Die aktuelle Zeit befindet sich innerhalb der Sunset/Sunrise Brightness Verarbeitungszeit. Also zwischen Time Early und Time Late');
|
||||||
|
|
||||||
my $reading = $shutters->getBrightnessReading;
|
my $reading = $shutters->getBrightnessReading;
|
||||||
if ( $events =~ m#$reading:\s(\d+)# ) {
|
if ( $events =~ m#$reading:\s(\d+)# ) {
|
||||||
@ -1241,6 +1245,16 @@ sub EventProcessingBrightness($@) {
|
|||||||
else {
|
else {
|
||||||
$brightnessMaxVal = $ascDev->getBrightnessMaxVal;
|
$brightnessMaxVal = $ascDev->getBrightnessMaxVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ASC_Debug('EventProcessingBrightness: '
|
||||||
|
. $shutters->getShuttersDev
|
||||||
|
. ' - Es wird geprüft ob Sunset oder Sunrise gefahren werden soll und der aktuelle übergebene Brightness-Wert: '
|
||||||
|
. $1
|
||||||
|
. ' Größer dem eingestellten Sunrise-Wert: '
|
||||||
|
. $brightnessMaxVal
|
||||||
|
. ' oder kleiner dem eingestellten Sunset-Wert: '
|
||||||
|
. $brightnessMinVal
|
||||||
|
. ' ist');
|
||||||
|
|
||||||
if (
|
if (
|
||||||
int( gettimeofday() / 86400 ) != int(
|
int( gettimeofday() / 86400 ) != int(
|
||||||
@ -1257,6 +1271,11 @@ sub EventProcessingBrightness($@) {
|
|||||||
Log3( $name, 4,
|
Log3( $name, 4,
|
||||||
"AutoShuttersControl ($shuttersDev) - EventProcessingBrightness: Steuerung für Morgens"
|
"AutoShuttersControl ($shuttersDev) - EventProcessingBrightness: Steuerung für Morgens"
|
||||||
);
|
);
|
||||||
|
|
||||||
|
ASC_Debug('EventProcessingBrightness: '
|
||||||
|
. $shutters->getShuttersDev
|
||||||
|
. ' - Verarbeitungszeit für Sunrise wurd erkannt. Prüfe Status der Roommates');
|
||||||
|
|
||||||
my $homemode = $shutters->getRoommatesStatus;
|
my $homemode = $shutters->getRoommatesStatus;
|
||||||
$homemode = $ascDev->getResidentsStatus
|
$homemode = $ascDev->getResidentsStatus
|
||||||
if ( $homemode eq 'none' );
|
if ( $homemode eq 'none' );
|
||||||
@ -1286,10 +1305,18 @@ sub EventProcessingBrightness($@) {
|
|||||||
$shutters->setSunset(0);
|
$shutters->setSunset(0);
|
||||||
ShuttersCommandSet( $hash, $shuttersDev,
|
ShuttersCommandSet( $hash, $shuttersDev,
|
||||||
$shutters->getOpenPos );
|
$shutters->getOpenPos );
|
||||||
|
|
||||||
|
ASC_Debug('EventProcessingBrightness: '
|
||||||
|
. $shutters->getShuttersDev
|
||||||
|
. ' - Verarbeitung für Sunrise. Roommatestatus korrekt zum fahren. Fahrbefehl wird an die Funktion FnShuttersCommandSet gesendet. Grund des fahrens: '
|
||||||
|
. $shutters->getLastDrive);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
EventProcessingShadingBrightness( $hash, $shuttersDev,
|
EventProcessingShadingBrightness( $hash, $shuttersDev,
|
||||||
$events );
|
$events );
|
||||||
|
ASC_Debug('EventProcessingBrightness: '
|
||||||
|
. $shutters->getShuttersDev
|
||||||
|
. ' - Verarbeitung für Sunrise. Roommatestatus nicht zum hochfahren oder Fenster sind offen. Fahrbebehl bleibt aus!!! Es wird an die Event verarbeitende Beschattungsfunktion weiter gereicht');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1309,6 +1336,10 @@ sub EventProcessingBrightness($@) {
|
|||||||
Log3( $name, 4,
|
Log3( $name, 4,
|
||||||
"AutoShuttersControl ($shuttersDev) - EventProcessingBrightness: Steuerung für Abends"
|
"AutoShuttersControl ($shuttersDev) - EventProcessingBrightness: Steuerung für Abends"
|
||||||
);
|
);
|
||||||
|
|
||||||
|
ASC_Debug('EventProcessingBrightness: '
|
||||||
|
. $shutters->getShuttersDev
|
||||||
|
. ' - Verarbeitungszeit für Sunset wurd erkannt. Prüfe Status der Roommates');
|
||||||
|
|
||||||
my $posValue;
|
my $posValue;
|
||||||
if ( CheckIfShuttersWindowRecOpen($shuttersDev) == 2
|
if ( CheckIfShuttersWindowRecOpen($shuttersDev) == 2
|
||||||
@ -1339,14 +1370,32 @@ sub EventProcessingBrightness($@) {
|
|||||||
$shutters->setSunrise(0);
|
$shutters->setSunrise(0);
|
||||||
$shutters->setSunset(1);
|
$shutters->setSunset(1);
|
||||||
ShuttersCommandSet( $hash, $shuttersDev, $posValue );
|
ShuttersCommandSet( $hash, $shuttersDev, $posValue );
|
||||||
|
|
||||||
|
ASC_Debug('EventProcessingBrightness: '
|
||||||
|
. $shutters->getShuttersDev
|
||||||
|
. ' - Verarbeitung für Sunset. Roommatestatus korrekt zum fahren. Fahrbefehl wird an die Funktion FnShuttersCommandSet gesendet. Zielposition: '
|
||||||
|
. $posValue
|
||||||
|
. ' Grund des fahrens: '
|
||||||
|
. $shutters->getLastDrive);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
EventProcessingShadingBrightness( $hash, $shuttersDev,
|
EventProcessingShadingBrightness( $hash, $shuttersDev,
|
||||||
$events );
|
$events );
|
||||||
|
ASC_Debug('EventProcessingBrightness: '
|
||||||
|
. $shutters->getShuttersDev
|
||||||
|
. ' - Verarbeitung für Sunset. Roommatestatus nicht zum runter fahren. Fahrbebehl bleibt aus!!! Es wird an die Event verarbeitende Beschattungsfunktion weiter gereicht');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else { ASC_Debug('EventProcessingBrightness: '
|
||||||
|
. $shutters->getShuttersDev
|
||||||
|
. ' - Brightness Event kam nicht innerhalb der Verarbeitungszeit für Sunset oder Sunris oder aber für beide wurden die entsprechendne Verarbeitungsschwellen nicht erreicht.');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else { EventProcessingShadingBrightness( $hash, $shuttersDev, $events ); }
|
### Wenn es kein Brightness Reading ist muss auch die Shading Funktion nicht aufgerufen werden.
|
||||||
|
# else { EventProcessingShadingBrightness( $hash, $shuttersDev, $events ); }
|
||||||
|
else { ASC_Debug('EventProcessingBrightness: '
|
||||||
|
. $shutters->getShuttersDev
|
||||||
|
. ' - Leider konnte kein Korrekter Brightnesswert aus dem Event erkannt werden. Entweder passt das Reading oder der tatsächliche nummerishce Wert des Events nicht'); }
|
||||||
}
|
}
|
||||||
|
|
||||||
sub EventProcessingShadingBrightness($@) {
|
sub EventProcessingShadingBrightness($@) {
|
||||||
@ -1357,30 +1406,44 @@ sub EventProcessingShadingBrightness($@) {
|
|||||||
|
|
||||||
Log3( $name, 4,
|
Log3( $name, 4,
|
||||||
"AutoShuttersControl ($shuttersDev) - EventProcessingShadingBrightness");
|
"AutoShuttersControl ($shuttersDev) - EventProcessingShadingBrightness");
|
||||||
|
|
||||||
|
ASC_Debug('EventProcessingShadingBrightness: '
|
||||||
|
. $shutters->getShuttersDev
|
||||||
|
. ' - Es wird nun geprüft ob der übergebene Event ein nummerischer Wert vom Brightnessreading ist.');
|
||||||
|
|
||||||
if ( $events =~ m#$reading:\s(\d+)# ) {
|
if ( $events =~ m#$reading:\s(\d+)# ) {
|
||||||
Log3( $name, 4,
|
Log3( $name, 4,
|
||||||
"AutoShuttersControl ($shuttersDev) - EventProcessingShadingBrightness
|
"AutoShuttersControl ($shuttersDev) - EventProcessingShadingBrightness
|
||||||
Brightness: " . $1);
|
Brightness: " . $1);
|
||||||
|
|
||||||
|
ASC_Debug('EventProcessingShadingBrightness: '
|
||||||
|
. $shutters->getShuttersDev
|
||||||
|
. ' - Nummerischer Brightness-Wert wurde erkannt. Der Wert ist: '
|
||||||
|
. $1);
|
||||||
|
|
||||||
my $homemode = $shutters->getRoommatesStatus;
|
my $homemode = $shutters->getRoommatesStatus;
|
||||||
$homemode = $ascDev->getResidentsStatus if ( $homemode eq 'none' );
|
$homemode = $ascDev->getResidentsStatus if ( $homemode eq 'none' );
|
||||||
|
|
||||||
ShadingProcessing(
|
if (
|
||||||
$hash, $shuttersDev,
|
|
||||||
$ascDev->getAzimuth, $ascDev->getElevation,
|
|
||||||
$1, $ascDev->getOutTemp,
|
|
||||||
$shutters->getDirection, $shutters->getShadingAngleLeft,
|
|
||||||
$shutters->getShadingAngleRight
|
|
||||||
)
|
|
||||||
|
|
||||||
if (
|
|
||||||
(
|
(
|
||||||
$shutters->getShadingMode eq 'always'
|
$shutters->getShadingMode eq 'always'
|
||||||
or $shutters->getShadingMode eq $homemode
|
or $shutters->getShadingMode eq $homemode
|
||||||
)
|
)
|
||||||
and IsDay( $hash, $shuttersDev )
|
and IsDay( $hash, $shuttersDev )
|
||||||
);
|
)
|
||||||
|
{
|
||||||
|
ShadingProcessing(
|
||||||
|
$hash, $shuttersDev,
|
||||||
|
$ascDev->getAzimuth, $ascDev->getElevation,
|
||||||
|
$1, $ascDev->getOutTemp,
|
||||||
|
$shutters->getDirection, $shutters->getShadingAngleLeft,
|
||||||
|
$shutters->getShadingAngleRight
|
||||||
|
);
|
||||||
|
|
||||||
|
ASC_Debug('EventProcessingShadingBrightness: '
|
||||||
|
. $shutters->getShuttersDev
|
||||||
|
. ' - Alle Bedingungen zur weiteren Beschattungsverarbeitung sind erfüllt. Es wird nun die eigentliche Beschattungsfunktion aufgerufen');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1394,6 +1457,10 @@ sub EventProcessingTwilightDevice($@) {
|
|||||||
# Astro
|
# Astro
|
||||||
# SunAz = azimuth = Sonnenwinkel
|
# SunAz = azimuth = Sonnenwinkel
|
||||||
# SunAlt = elevation = Sonnenhöhe
|
# SunAlt = elevation = Sonnenhöhe
|
||||||
|
|
||||||
|
ASC_Debug('EventProcessingTwilightDevice: '
|
||||||
|
. $shutters->getShuttersDev
|
||||||
|
. ' - Event vom Astro oder Twilight Device wurde erkannt. Event wird verarbeitet');
|
||||||
|
|
||||||
if ( $events =~ m#(azimuth|elevation|SunAz|SunAlt):\s(\d+.\d+)# ) {
|
if ( $events =~ m#(azimuth|elevation|SunAz|SunAlt):\s(\d+.\d+)# ) {
|
||||||
my $name = $device;
|
my $name = $device;
|
||||||
@ -1406,34 +1473,45 @@ sub EventProcessingTwilightDevice($@) {
|
|||||||
if ( not defined($azimuth) and not $azimuth );
|
if ( not defined($azimuth) and not $azimuth );
|
||||||
$elevation = $ascDev->getElevation
|
$elevation = $ascDev->getElevation
|
||||||
if ( not defined($elevation) and not $elevation );
|
if ( not defined($elevation) and not $elevation );
|
||||||
|
|
||||||
|
ASC_Debug('EventProcessingTwilightDevice: '
|
||||||
|
. $name
|
||||||
|
. ' - Passendes Event wurde erkannt. Verarbeitung über alle Rolllos beginnt');
|
||||||
|
|
||||||
foreach my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
|
foreach my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
|
||||||
$shutters->setShuttersDev($shuttersDev);
|
$shutters->setShuttersDev($shuttersDev);
|
||||||
|
|
||||||
my $homemode = $shutters->getRoommatesStatus;
|
my $homemode = $shutters->getRoommatesStatus;
|
||||||
$homemode = $ascDev->getResidentsStatus if ( $homemode eq 'none' );
|
$homemode = $ascDev->getResidentsStatus if ( $homemode eq 'none' );
|
||||||
|
|
||||||
ShadingProcessing(
|
if (
|
||||||
$hash,
|
|
||||||
$shuttersDev,
|
|
||||||
$azimuth,
|
|
||||||
$elevation,
|
|
||||||
$shutters->getBrightness,
|
|
||||||
$ascDev->getOutTemp,
|
|
||||||
$shutters->getDirection,
|
|
||||||
$shutters->getShadingAngleLeft,
|
|
||||||
$shutters->getShadingAngleRight
|
|
||||||
)
|
|
||||||
if (
|
|
||||||
(
|
(
|
||||||
$shutters->getShadingMode eq 'always'
|
$shutters->getShadingMode eq 'always'
|
||||||
or $shutters->getShadingMode eq $homemode
|
or $shutters->getShadingMode eq $homemode
|
||||||
)
|
)
|
||||||
and IsDay( $hash, $shuttersDev )
|
and IsDay( $hash, $shuttersDev )
|
||||||
);
|
)
|
||||||
$shutters->setShadingStatus('out')
|
{
|
||||||
if ( not IsDay( $hash, $shuttersDev )
|
ShadingProcessing(
|
||||||
and $shutters->getShadingStatus ne 'out' );
|
$hash,
|
||||||
|
$shuttersDev,
|
||||||
|
$azimuth,
|
||||||
|
$elevation,
|
||||||
|
$shutters->getBrightness,
|
||||||
|
$ascDev->getOutTemp,
|
||||||
|
$shutters->getDirection,
|
||||||
|
$shutters->getShadingAngleLeft,
|
||||||
|
$shutters->getShadingAngleRight
|
||||||
|
);
|
||||||
|
|
||||||
|
ASC_Debug('EventProcessingTwilightDevice: '
|
||||||
|
. $shutters->getShuttersDev
|
||||||
|
. ' - Alle Bedingungen zur weiteren Beschattungsverarbeitung sind erfüllt. Es wird nun die Beschattungsfunktion ausgeführt');
|
||||||
|
}
|
||||||
|
|
||||||
|
$shutters->setShadingStatus('out')
|
||||||
|
if ( not IsDay( $hash, $shuttersDev )
|
||||||
|
and $shutters->getShadingStatus ne 'out' );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1448,6 +1526,30 @@ sub ShadingProcessing($@) {
|
|||||||
) = @_;
|
) = @_;
|
||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
$shutters->setShuttersDev($shuttersDev);
|
$shutters->setShuttersDev($shuttersDev);
|
||||||
|
|
||||||
|
ASC_Debug('ShadingProcessing: '
|
||||||
|
. $shutters->getShuttersDev
|
||||||
|
. ' - Übergebende Werte - Azimuth:'
|
||||||
|
. $azimuth
|
||||||
|
. ', Elevation: '
|
||||||
|
. $elevation
|
||||||
|
. ', Brightness: '
|
||||||
|
. $brightness
|
||||||
|
. ', OutTemp: '
|
||||||
|
. $outTemp
|
||||||
|
. ', Fenster Position: '
|
||||||
|
. $winPos
|
||||||
|
. ', Winkel Links: '
|
||||||
|
. $angleMinus
|
||||||
|
. ', Winkel Rechts: '
|
||||||
|
. $anglePlus
|
||||||
|
. ', Ist es nach der Zeitblockadezeit: '
|
||||||
|
. (IsAfterShuttersTimeBlocking( $hash, $shuttersDev ) ? 'JA' : 'NEIN')
|
||||||
|
. ', Ist es nach der manuellen Blockadezeit: '
|
||||||
|
. (IsAfterShuttersManualBlocking($shuttersDev) ? 'JA' : 'NEIN')
|
||||||
|
. ', Ist es nach der Hälfte der Beschattungswartezeit: '
|
||||||
|
. ( (int( gettimeofday() ) - $shutters->getShadingStatusTimestamp) < ($shutters->getShadingWaitingPeriod / 2) ? 'NEIN' : 'JA') );
|
||||||
|
|
||||||
$shutters->setShadingStatus('out')
|
$shutters->setShadingStatus('out')
|
||||||
if ( not IsDay( $hash, $shuttersDev )
|
if ( not IsDay( $hash, $shuttersDev )
|
||||||
and $shutters->getShadingStatus ne 'out' );
|
and $shutters->getShadingStatus ne 'out' );
|
||||||
@ -1481,7 +1583,12 @@ sub ShadingProcessing($@) {
|
|||||||
|
|
||||||
my $getShadingPos = $shutters->getShadingPos;
|
my $getShadingPos = $shutters->getShadingPos;
|
||||||
my $getStatus = $shutters->getStatus;
|
my $getStatus = $shutters->getStatus;
|
||||||
|
my $oldShadingStatus = $shutters->getShadingStatus;
|
||||||
|
|
||||||
|
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 - 3
|
if ( ($outTemp < $shutters->getShadingMinOutsideTemperature - 3
|
||||||
or not IsDay( $hash, $shuttersDev ))
|
or not IsDay( $hash, $shuttersDev ))
|
||||||
and $shutters->getShadingStatus ne 'out'
|
and $shutters->getShadingStatus ne 'out'
|
||||||
@ -1491,7 +1598,12 @@ sub ShadingProcessing($@) {
|
|||||||
$shutters->setLastDrive('shading out');
|
$shutters->setLastDrive('shading out');
|
||||||
|
|
||||||
ShuttersCommandSet( $hash, $shuttersDev, $shutters->getLastPos );
|
ShuttersCommandSet( $hash, $shuttersDev, $shutters->getLastPos );
|
||||||
Log3( $name, 4,
|
|
||||||
|
ASC_Debug('ShadingProcessing: '
|
||||||
|
. $shutters->getShuttersDev
|
||||||
|
. ' - Es ist Nacht oder die Aussentemperatur unterhalb der Shading Temperatur. Die Beschattung wird Zwangsbeendet');
|
||||||
|
|
||||||
|
return Log3( $name, 4,
|
||||||
"AutoShuttersControl ($name) - Shading Processing - Es ist Sonnenuntergang vorbei oder die Aussentemperatur unterhalb der Shading Temperatur " );
|
"AutoShuttersControl ($name) - Shading Processing - Es ist Sonnenuntergang vorbei oder die Aussentemperatur unterhalb der Shading Temperatur " );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1509,9 +1621,10 @@ sub ShadingProcessing($@) {
|
|||||||
or $shutters->getShadingStatus eq 'in reserved' );
|
or $shutters->getShadingStatus eq 'in reserved' );
|
||||||
|
|
||||||
$shutters->setShadingStatus('out')
|
$shutters->setShadingStatus('out')
|
||||||
if ( $shutters->getShadingStatus eq 'out reserved'
|
if ( ($shutters->getShadingStatus eq 'out reserved'
|
||||||
and ( int( gettimeofday() ) - $shutters->getShadingStatusTimestamp ) >
|
and ( int( gettimeofday() ) - $shutters->getShadingStatusTimestamp ) >
|
||||||
$shutters->getShadingWaitingPeriod );
|
$shutters->getShadingWaitingPeriod)
|
||||||
|
or $azimuth > $winPosMax );
|
||||||
Log3( $name, 4,
|
Log3( $name, 4,
|
||||||
"AutoShuttersControl ($name) - Shading Processing, Rollladen: "
|
"AutoShuttersControl ($name) - Shading Processing, Rollladen: "
|
||||||
. $shuttersDev
|
. $shuttersDev
|
||||||
@ -1519,6 +1632,13 @@ sub ShadingProcessing($@) {
|
|||||||
. $shutters->getShadingStatus
|
. $shutters->getShadingStatus
|
||||||
. ", Zeitstempel: "
|
. ", Zeitstempel: "
|
||||||
. $shutters->getShadingStatusTimestamp );
|
. $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 > $winPosMin
|
elsif ( $azimuth > $winPosMin
|
||||||
and $azimuth < $winPosMax
|
and $azimuth < $winPosMax
|
||||||
@ -1540,13 +1660,20 @@ sub ShadingProcessing($@) {
|
|||||||
. $shutters->getShadingStatus
|
. $shutters->getShadingStatus
|
||||||
. ", Zeitstempel: "
|
. ", Zeitstempel: "
|
||||||
. $shutters->getShadingStatusTimestamp );
|
. $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);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( $shutters->getShadingStatus eq 'out' or $shutters->getShadingStatus eq 'in' ) {
|
if ( $shutters->getShadingStatus eq 'out' or $shutters->getShadingStatus eq 'in' ) {
|
||||||
### Erstmal rausgenommen könnte Grund für nicht mehr reinfahren in die Beschattung sein
|
### Erstmal rausgenommen könnte Grund für nicht mehr reinfahren in die Beschattung sein
|
||||||
# $shutters->setShadingStatus( $shutters->getShadingStatus )
|
$shutters->setShadingStatus( $shutters->getShadingStatus )
|
||||||
# if ( ( int( gettimeofday() ) - $shutters->getShadingStatusTimestamp ) >
|
if ( ( int( gettimeofday() ) - $shutters->getShadingStatusTimestamp ) >
|
||||||
# ( $shutters->getShadingWaitingPeriod / 2 ) );
|
( $shutters->getShadingWaitingPeriod / 2 ) );
|
||||||
|
|
||||||
if ( $shutters->getShadingStatus eq 'in'
|
if ( $shutters->getShadingStatus eq 'in'
|
||||||
and $getShadingPos != $getStatus )
|
and $getShadingPos != $getStatus )
|
||||||
@ -1559,7 +1686,15 @@ sub ShadingProcessing($@) {
|
|||||||
|
|
||||||
if ( not $queryShuttersShadingPos ) {
|
if ( not $queryShuttersShadingPos ) {
|
||||||
$shutters->setLastDrive('shading in');
|
$shutters->setLastDrive('shading in');
|
||||||
ShuttersCommandSet( $hash, $shuttersDev, $getShadingPos )
|
ShuttersCommandSet( $hash, $shuttersDev, $getShadingPos );
|
||||||
|
|
||||||
|
ASC_Debug('ShadingProcessing: '
|
||||||
|
. $shutters->getShuttersDev
|
||||||
|
. ' - Der aktuelle Beschattungsstatus ist: '
|
||||||
|
. $shutters->getShadingStatus
|
||||||
|
. ' und somit wird nun in die Position: '
|
||||||
|
. $getShadingPos
|
||||||
|
. ' zum Beschatten gefahren');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
elsif ( $shutters->getShadingStatus eq 'out'
|
elsif ( $shutters->getShadingStatus eq 'out'
|
||||||
@ -1567,11 +1702,26 @@ sub ShadingProcessing($@) {
|
|||||||
{
|
{
|
||||||
$shutters->setLastDrive('shading out');
|
$shutters->setLastDrive('shading out');
|
||||||
ShuttersCommandSet( $hash, $shuttersDev, $shutters->getLastPos );
|
ShuttersCommandSet( $hash, $shuttersDev, $shutters->getLastPos );
|
||||||
|
|
||||||
|
ASC_Debug('ShadingProcessing: '
|
||||||
|
. $shutters->getShuttersDev
|
||||||
|
. ' - Der aktuelle Beschattungsstatus ist: '
|
||||||
|
. $shutters->getShadingStatus
|
||||||
|
. ' und somit wird nun in die Position: '
|
||||||
|
. $getShadingPos
|
||||||
|
. ' zum beenden der Beschattung gefahren');
|
||||||
}
|
}
|
||||||
|
|
||||||
Log3( $name, 4,
|
Log3( $name, 4,
|
||||||
"AutoShuttersControl ($name) - Shading Processing - In der Routine zum fahren der Rollläden, Shading Wert: "
|
"AutoShuttersControl ($name) - Shading Processing - In der Routine zum fahren der Rollläden, Shading Wert: "
|
||||||
. $shutters->getShadingStatus );
|
. $shutters->getShadingStatus );
|
||||||
|
|
||||||
|
ASC_Debug('ShadingProcessing: '
|
||||||
|
. $shutters->getShuttersDev
|
||||||
|
. ' - Der aktuelle Beschattungsstatus ist: '
|
||||||
|
. $shutters->getShadingStatus
|
||||||
|
. ', Beschattungsstatus Zeitstempel: '
|
||||||
|
. strftime( "%Y.%m.%e %T",localtime($shutters->getShadingStatusTimestamp)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1651,14 +1801,11 @@ sub ShuttersCommandSet($$$) {
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (
|
if (
|
||||||
(
|
$posValue != $shutters->getShadingPos
|
||||||
$posValue != $shutters->getShadingPos
|
|
||||||
or $shutters->getShuttersPlace eq 'terrace'
|
|
||||||
)
|
|
||||||
and (
|
and (
|
||||||
(
|
(
|
||||||
$shutters->getPartyMode eq 'on'
|
$shutters->getPartyMode eq 'on'
|
||||||
and $ascDev->getPartyMode eq 'on'
|
and $ascDev->getPartyMode eq 'on'
|
||||||
)
|
)
|
||||||
or (
|
or (
|
||||||
CheckIfShuttersWindowRecOpen($shuttersDev) == 2
|
CheckIfShuttersWindowRecOpen($shuttersDev) == 2
|
||||||
@ -1668,19 +1815,29 @@ sub ShuttersCommandSet($$$) {
|
|||||||
and $shutters->getVentilateOpen eq 'on'
|
and $shutters->getVentilateOpen eq 'on'
|
||||||
)
|
)
|
||||||
or (
|
or (
|
||||||
CheckIfShuttersWindowRecOpen($shuttersDev) == 2
|
CheckIfShuttersWindowRecOpen($shuttersDev) == 2
|
||||||
and ( $shutters->getLockOut eq 'soft'
|
and ( $shutters->getLockOut eq 'soft'
|
||||||
or $shutters->getLockOut eq 'hard' )
|
or $shutters->getLockOut eq 'hard' )
|
||||||
and $ascDev->getHardLockOut eq 'on'
|
and $ascDev->getHardLockOut eq 'on'
|
||||||
and not $queryShuttersPosValue
|
and not $queryShuttersPosValue
|
||||||
)
|
)
|
||||||
|
or (
|
||||||
|
CheckIfShuttersWindowRecOpen($shuttersDev) == 2
|
||||||
|
and $shutters->getShuttersPlace eq 'terrace'
|
||||||
|
and not $queryShuttersPosValue
|
||||||
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
$shutters->setDelayCmd($posValue);
|
$shutters->setDelayCmd($posValue);
|
||||||
$ascDev->setDelayCmdReading;
|
$ascDev->setDelayCmdReading;
|
||||||
|
$shutters->setNoOffset(0);
|
||||||
Log3( $name, 4,
|
Log3( $name, 4,
|
||||||
"AutoShuttersControl ($name) - ShuttersCommandSet in Delay" );
|
"AutoShuttersControl ($name) - ShuttersCommandSet in Delay" );
|
||||||
|
|
||||||
|
ASC_Debug('FnShuttersCommandSet: '
|
||||||
|
. $shutters->getShuttersDev
|
||||||
|
. ' - Die Fahrt wird zurückgestellt. Grund kann ein geöffnetes Fenster sein oder ein aktivierter Party Modus');
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$shutters->setDriveCmd($posValue);
|
$shutters->setDriveCmd($posValue);
|
||||||
@ -1691,6 +1848,10 @@ sub ShuttersCommandSet($$$) {
|
|||||||
Log3( $name, 4,
|
Log3( $name, 4,
|
||||||
"AutoShuttersControl ($name) - ShuttersCommandSet setDriveCmd wird aufgerufen"
|
"AutoShuttersControl ($name) - ShuttersCommandSet setDriveCmd wird aufgerufen"
|
||||||
);
|
);
|
||||||
|
|
||||||
|
ASC_Debug('FnShuttersCommandSet: '
|
||||||
|
. $shutters->getShuttersDev
|
||||||
|
. ' - Das Rollo wird gefahren. Kein Partymodus aktiv und das zugordnete Fenster ist entweder nicht offen oder keine Terassentür');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2658,8 +2819,16 @@ sub SetCmdFn($) {
|
|||||||
else {
|
else {
|
||||||
$shutters->setLastDrive(
|
$shutters->setLastDrive(
|
||||||
ReadingsVal( $shuttersDev, 'ASC_ShuttersLastDrive', 'none' ) );
|
ReadingsVal( $shuttersDev, 'ASC_ShuttersLastDrive', 'none' ) );
|
||||||
|
ASC_Debug('FnSetCmdFn: ' . $shuttersDev . ' - Abbruch aktuelle Position ist gleich der Zielposition ' . $shutters->getStatus . '=' . $posValue);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ASC_Debug('FnSetCmdFn: ' . $shuttersDev . ' - Rolllo wird gefahren, aktuelle Position: ' . $shutters->getStatus
|
||||||
|
. ', Zielposition: '
|
||||||
|
. $posValue
|
||||||
|
. '. Grund der Fahrt: '
|
||||||
|
. $shutters->getLastDrive);
|
||||||
|
|
||||||
CommandSet( undef,
|
CommandSet( undef,
|
||||||
$shuttersDev
|
$shuttersDev
|
||||||
. ':FILTER='
|
. ':FILTER='
|
||||||
@ -2669,9 +2838,22 @@ sub SetCmdFn($) {
|
|||||||
. $posValue );
|
. $posValue );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub ASC_Debug($) {
|
||||||
|
return
|
||||||
|
unless ( AttrVal($ascDev->getName, 'ASC_debug', 0) );
|
||||||
|
|
||||||
|
my $debugMsg = shift;
|
||||||
|
my $debugTimestamp = strftime( "%Y.%m.%e %T",localtime(time));
|
||||||
|
|
||||||
|
print("\n" . 'ASC_DEBUG!!! ' . $debugTimestamp . ' - ' . $debugMsg . "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
######################################
|
||||||
|
######################################
|
||||||
########## Begin der Klassendeklarierungen für OOP (Objektorientierte Programmierung) #########################
|
########## Begin der Klassendeklarierungen für OOP (Objektorientierte Programmierung) #########################
|
||||||
## Klasse Rolläden (Shutters) und die Subklassen Attr und Readings ##
|
## Klasse Rolläden (Shutters) und die Subklassen Attr und Readings ##
|
||||||
## desweiteren wird noch die Klasse ASC_Roommate mit eingebunden
|
## desweiteren wird noch die Klasse ASC_Roommate mit eingebunden
|
||||||
|
|
||||||
package ASC_Shutters;
|
package ASC_Shutters;
|
||||||
our @ISA =
|
our @ISA =
|
||||||
qw(ASC_Shutters::Readings ASC_Shutters::Attr ASC_Roommate ASC_Window);
|
qw(ASC_Shutters::Readings ASC_Shutters::Attr ASC_Roommate ASC_Window);
|
||||||
@ -2778,21 +2960,18 @@ sub setDriveCmd {
|
|||||||
$offSetStart = $shutters->getOffsetStart if ( $shutters->getOffsetStart > -1 );
|
$offSetStart = $shutters->getOffsetStart if ( $shutters->getOffsetStart > -1 );
|
||||||
|
|
||||||
if ( $offSetStart > 0 and not $shutters->getNoOffset ) {
|
if ( $offSetStart > 0 and not $shutters->getNoOffset ) {
|
||||||
|
|
||||||
InternalTimer(
|
InternalTimer(
|
||||||
gettimeofday() + int( rand($offSet) + $shutters->getOffsetStart ),
|
gettimeofday() + int( rand($offSet) + $shutters->getOffsetStart ),
|
||||||
'FHEM::AutoShuttersControl::SetCmdFn', \%h );
|
'FHEM::AutoShuttersControl::SetCmdFn', \%h );
|
||||||
|
|
||||||
print $shutters->getShuttersDev . ' - versetztes fahren' . "\n";
|
FHEM::AutoShuttersControl::ASC_Debug('FnSetDriveCmd: ' . $shutters->getShuttersDev . ' - versetztes fahren');
|
||||||
}
|
}
|
||||||
elsif ( $offSetStart < 1 or $shutters->getNoOffset ) {
|
elsif ( $offSetStart < 1 or $shutters->getNoOffset ) {
|
||||||
FHEM::AutoShuttersControl::SetCmdFn( \%h );
|
FHEM::AutoShuttersControl::SetCmdFn( \%h );
|
||||||
$shutters->setNoOffset(0);
|
FHEM::AutoShuttersControl::ASC_Debug('FnSetDriveCmd: ' . $shutters->getShuttersDev . ' - NICHT versetztes fahren');
|
||||||
|
|
||||||
print $shutters->getShuttersDev . ' - NICHT versetztes fahren' . "\n";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
print $shutters->getShuttersDev . "\n";
|
FHEM::AutoShuttersControl::ASC_Debug('FnSetDriveCmd: ' . $shutters->getShuttersDev . ' - NoOffset: ' . ($shutters->getNoOffset ? 'JA' : 'NEIN'));
|
||||||
$shutters->setNoOffset(0);
|
$shutters->setNoOffset(0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -3708,6 +3887,11 @@ sub setDefault {
|
|||||||
return $self->{defaultarg};
|
return $self->{defaultarg};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub getName {
|
||||||
|
my $self = shift;
|
||||||
|
return $self->{name};
|
||||||
|
}
|
||||||
|
|
||||||
## Subklasse Readings ##
|
## Subklasse Readings ##
|
||||||
package ASC_Dev::Readings;
|
package ASC_Dev::Readings;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user