new module files, change rain and wind code
for multisensor geändert: ShuttersControl.pm geändert: ShuttersControl/Dev/Attr.pm neue Datei: ShuttersControl/Helper.pm geändert: ShuttersControl/Shading.pm geändert: ShuttersControl/Shutters.pm
This commit is contained in:
parent
269288c24a
commit
f8800e910b
controls_AutoShuttersControl.txt
lib/FHEM/Automation
@ -1,11 +1,11 @@
|
||||
UPD 2020-07-07_14:49:19 97041 FHEM/73_AutoShuttersControl.pm
|
||||
UPD 2020-07-08_11:34:15 177894 lib/FHEM/Automation/ShuttersControl.pm
|
||||
UPD 2020-07-08_20:43:22 144312 lib/FHEM/Automation/ShuttersControl.pm
|
||||
UPD 2020-06-22_09:41:40 2657 lib/FHEM/Automation/ShuttersControl/Dev.pm
|
||||
UPD 2020-07-07_14:49:19 2496 lib/FHEM/Automation/ShuttersControl/Roommate.pm
|
||||
UPD 2020-07-07_14:49:19 30710 lib/FHEM/Automation/ShuttersControl/Shutters.pm
|
||||
UPD 2020-07-07_14:49:19 17908 lib/FHEM/Automation/ShuttersControl/Shading.pm
|
||||
UPD 2020-07-08_14:55:44 30718 lib/FHEM/Automation/ShuttersControl/Shutters.pm
|
||||
UPD 2020-07-08_19:33:26 21666 lib/FHEM/Automation/ShuttersControl/Shading.pm
|
||||
UPD 2020-06-22_09:41:40 2175 lib/FHEM/Automation/ShuttersControl/Window.pm
|
||||
UPD 2020-07-08_10:45:35 11567 lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm
|
||||
UPD 2020-07-08_20:16:15 11566 lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm
|
||||
UPD 2020-07-03_11:29:10 7251 lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm
|
||||
UPD 2020-07-03_11:29:10 52390 lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm
|
||||
UPD 2020-06-22_09:41:40 2903 lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm
|
||||
|
@ -75,11 +75,9 @@ use Date::Parse;
|
||||
|
||||
use FHEM::Automation::ShuttersControl::Shutters;
|
||||
use FHEM::Automation::ShuttersControl::Dev;
|
||||
use FHEM::Automation::ShuttersControl::Shading;
|
||||
|
||||
require Exporter;
|
||||
our @ISA = qw(Exporter);
|
||||
our @Export = qw($shutters $ascDev %userAttrList);
|
||||
use FHEM::Automation::ShuttersControl::Shading qw (:ALL);
|
||||
use FHEM::Automation::ShuttersControl::Helper qw (:ALL);
|
||||
|
||||
# try to use JSON::MaybeXS wrapper
|
||||
# for chance of better performance + open code
|
||||
@ -184,10 +182,6 @@ BEGIN {
|
||||
delFromDevAttrList
|
||||
delFromAttrList
|
||||
gettimeofday
|
||||
sunset
|
||||
sunset_abs
|
||||
sunrise
|
||||
sunrise_abs
|
||||
InternalTimer
|
||||
RemoveInternalTimer
|
||||
computeAlignTime
|
||||
@ -534,8 +528,8 @@ sub EventProcessingGeneral {
|
||||
|
||||
if ( defined($devname) && ($devname) )
|
||||
{ # es wird lediglich der Devicename der Funktion mitgegeben wenn es sich nicht um global handelt daher hier die Unterscheidung
|
||||
my $windReading = $ascDev->getWindSensorReading;
|
||||
my $rainReading = $ascDev->getRainSensorReading;
|
||||
my $windReading = $ascDev->getWindSensorReading // 'none';
|
||||
my $rainReading = $ascDev->getRainSensorReading // 'none';
|
||||
|
||||
while ( my ( $device, $deviceAttr ) =
|
||||
each %{ $hash->{monitoredDevs}{$devname} } )
|
||||
@ -691,7 +685,7 @@ sub Set {
|
||||
elsif ( lc $cmd eq 'controlshading' ) {
|
||||
return "usage: $cmd" if ( scalar( @{$aArg} ) > 1 );
|
||||
|
||||
my $response = _CheckASC_ConditionsForShadingFn($hash);
|
||||
my $response = CheckASC_ConditionsForShadingFn($hash);
|
||||
readingsSingleUpdate(
|
||||
$hash, $cmd,
|
||||
(
|
||||
@ -1778,7 +1772,7 @@ sub EventProcessingRain {
|
||||
my ( $hash, $device, $events ) = @_;
|
||||
|
||||
my $name = $device;
|
||||
my $reading = $ascDev->getRainSensorReading;
|
||||
my $reading = $ascDev->getRainSensorReading // 'none';
|
||||
|
||||
if ( $events =~ m{$reading:\s(\d+(\.\d+)?|rain|dry)}xms ) {
|
||||
my $val;
|
||||
@ -1842,7 +1836,7 @@ sub EventProcessingWind {
|
||||
my $name = $hash->{NAME};
|
||||
$shutters->setShuttersDev($shuttersDev);
|
||||
|
||||
my $reading = $ascDev->getWindSensorReading;
|
||||
my $reading = $ascDev->getWindSensorReading // 'none';
|
||||
if ( $events =~ m{$reading:\s(\d+(\.\d+)?)}xms ) {
|
||||
for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
|
||||
$shutters->setShuttersDev($shuttersDev);
|
||||
@ -3442,839 +3436,10 @@ sub GetMonitoredDevs {
|
||||
## my little helper
|
||||
#################################
|
||||
|
||||
sub PositionValueWindowRec {
|
||||
my $shuttersDev = shift;
|
||||
my $posValue = shift;
|
||||
|
||||
if ( CheckIfShuttersWindowRecOpen($shuttersDev) == 1
|
||||
&& $shutters->getVentilateOpen eq 'on' )
|
||||
{
|
||||
$posValue = $shutters->getVentilatePos;
|
||||
}
|
||||
elsif (CheckIfShuttersWindowRecOpen($shuttersDev) == 2
|
||||
&& $shutters->getSubTyp eq 'threestate'
|
||||
&& $ascDev->getAutoShuttersControlComfort eq 'on' )
|
||||
{
|
||||
$posValue = $shutters->getComfortOpenPos;
|
||||
}
|
||||
elsif (
|
||||
CheckIfShuttersWindowRecOpen($shuttersDev) == 2
|
||||
&& ( $shutters->getSubTyp eq 'threestate'
|
||||
|| $shutters->getSubTyp eq 'twostate' )
|
||||
&& $shutters->getVentilateOpen eq 'on'
|
||||
)
|
||||
{
|
||||
$posValue = $shutters->getVentilatePos;
|
||||
}
|
||||
|
||||
if ( $shutters->getQueryShuttersPos($posValue) ) {
|
||||
$posValue = $shutters->getStatus;
|
||||
}
|
||||
|
||||
return $posValue;
|
||||
}
|
||||
|
||||
sub AutoSearchTwilightDev {
|
||||
my $hash = shift;
|
||||
|
||||
my $name = $hash->{NAME};
|
||||
|
||||
if ( devspec2array('TYPE=(Astro|Twilight)') > 0 ) {
|
||||
CommandAttr( undef,
|
||||
$name
|
||||
. ' ASC_twilightDevice '
|
||||
. ( devspec2array('TYPE=(Astro|Twilight)') )[0] )
|
||||
if ( AttrVal( $name, 'ASC_twilightDevice', 'none' ) eq 'none' );
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub GetAttrValues {
|
||||
my ( $dev, $attribut, $default ) = @_;
|
||||
|
||||
my @values = split( ' ',
|
||||
AttrVal( $dev, $attribut, ( defined($default) ? $default : 'none' ) ) );
|
||||
my ( $value1, $value2 ) = split( ':', $values[0] );
|
||||
|
||||
my ( $value3, $value4, $value5, $value6, $value7, $value8 );
|
||||
( $value3, $value4 ) = split( ':', $values[1] )
|
||||
if ( defined( $values[1] ) );
|
||||
( $value5, $value6 ) = split( ':', $values[2] )
|
||||
if ( defined( $values[2] ) );
|
||||
( $value7, $value8 ) = split( ':', $values[3] )
|
||||
if ( defined( $values[3] ) );
|
||||
|
||||
return (
|
||||
$value1,
|
||||
defined($value2) ? $value2 : 'none',
|
||||
defined($value3) ? $value3 : 'none',
|
||||
defined($value4) ? $value4 : 'none',
|
||||
defined($value5) ? $value5 : 'none',
|
||||
defined($value6) ? $value6 : 'none',
|
||||
defined($value7) ? $value7 : 'none',
|
||||
defined($value8) ? $value8 : 'none'
|
||||
);
|
||||
}
|
||||
|
||||
# Hilfsfunktion welche meinen ReadingString zum finden der getriggerten Devices und der Zurdnung was das Device überhaupt ist und zu welchen Rolladen es gehört aus liest und das Device extraiert
|
||||
sub ExtractNotifyDevFromEvent {
|
||||
my ( $hash, $shuttersDev, $shuttersAttr ) = @_;
|
||||
|
||||
my %notifyDevs;
|
||||
while ( my $notifyDev = each %{ $hash->{monitoredDevs} } ) {
|
||||
Log3( $hash->{NAME}, 4,
|
||||
"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - NotifyDev: "
|
||||
. $notifyDev );
|
||||
Log3( $hash->{NAME}, 5,
|
||||
"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - ShuttersDev: "
|
||||
. $shuttersDev );
|
||||
|
||||
if ( defined( $hash->{monitoredDevs}{$notifyDev}{$shuttersDev} )
|
||||
&& $hash->{monitoredDevs}{$notifyDev}{$shuttersDev} eq
|
||||
$shuttersAttr )
|
||||
{
|
||||
Log3( $hash->{NAME}, 4,
|
||||
"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - ShuttersDevHash: "
|
||||
. $hash->{monitoredDevs}{$notifyDev}{$shuttersDev} );
|
||||
Log3( $hash->{NAME}, 5,
|
||||
"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - return ShuttersDev: "
|
||||
. $notifyDev );
|
||||
$notifyDevs{$notifyDev} = $shuttersDev;
|
||||
}
|
||||
}
|
||||
return \%notifyDevs;
|
||||
}
|
||||
|
||||
## Ist Tag oder Nacht für den entsprechende Rolladen
|
||||
sub _IsDay {
|
||||
my $shuttersDev = shift;
|
||||
|
||||
$shutters->setShuttersDev($shuttersDev);
|
||||
|
||||
my $brightnessMinVal = (
|
||||
$shutters->getBrightnessMinVal > -1
|
||||
? $shutters->getBrightnessMinVal
|
||||
: $ascDev->getBrightnessMinVal
|
||||
);
|
||||
|
||||
my $brightnessMaxVal = (
|
||||
$shutters->getBrightnessMaxVal > -1
|
||||
? $shutters->getBrightnessMaxVal
|
||||
: $ascDev->getBrightnessMaxVal
|
||||
);
|
||||
|
||||
my $isday = ( ShuttersSunrise( $shuttersDev, 'unix' ) >
|
||||
ShuttersSunset( $shuttersDev, 'unix' ) ? 1 : 0 );
|
||||
my $respIsDay = $isday;
|
||||
|
||||
ASC_Debug( 'FnIsDay: ' . $shuttersDev . ' Allgemein: ' . $respIsDay );
|
||||
|
||||
if (
|
||||
(
|
||||
(
|
||||
(
|
||||
int( gettimeofday() / 86400 ) != int(
|
||||
computeAlignTime( '24:00', $shutters->getTimeUpEarly )
|
||||
/ 86400
|
||||
)
|
||||
&& !IsWe()
|
||||
)
|
||||
|| (
|
||||
int( gettimeofday() / 86400 ) != int(
|
||||
computeAlignTime( '24:00',
|
||||
$shutters->getTimeUpWeHoliday ) / 86400
|
||||
)
|
||||
&& IsWe()
|
||||
&& $ascDev->getSunriseTimeWeHoliday eq 'on'
|
||||
&& $shutters->getTimeUpWeHoliday ne '01:25'
|
||||
)
|
||||
)
|
||||
&& int( gettimeofday() / 86400 ) == int(
|
||||
computeAlignTime( '24:00', $shutters->getTimeUpLate ) / 86400
|
||||
)
|
||||
)
|
||||
|| (
|
||||
int( gettimeofday() / 86400 ) != int(
|
||||
computeAlignTime( '24:00', $shutters->getTimeDownEarly ) /
|
||||
86400
|
||||
)
|
||||
&& int( gettimeofday() / 86400 ) == int(
|
||||
computeAlignTime( '24:00', $shutters->getTimeDownLate ) / 86400
|
||||
)
|
||||
)
|
||||
)
|
||||
{
|
||||
##### Nach Sonnenuntergang / Abends
|
||||
$respIsDay = (
|
||||
(
|
||||
(
|
||||
$shutters->getBrightness > $brightnessMinVal
|
||||
&& $isday
|
||||
&& !$shutters->getSunset
|
||||
)
|
||||
|| !$shutters->getSunset
|
||||
) ? 1 : 0
|
||||
) if ( $shutters->getDown eq 'brightness' );
|
||||
|
||||
ASC_Debug( 'FnIsDay: '
|
||||
. $shuttersDev
|
||||
. ' getDownBrightness: '
|
||||
. $respIsDay
|
||||
. ' Brightness: '
|
||||
. $shutters->getBrightness
|
||||
. ' BrightnessMin: '
|
||||
. $brightnessMinVal
|
||||
. ' Sunset: '
|
||||
. $shutters->getSunset );
|
||||
|
||||
##### Nach Sonnenauf / Morgens
|
||||
$respIsDay = (
|
||||
(
|
||||
(
|
||||
$shutters->getBrightness > $brightnessMaxVal
|
||||
&& !$isday
|
||||
&& $shutters->getSunrise
|
||||
)
|
||||
|| $respIsDay
|
||||
|| $shutters->getSunrise
|
||||
) ? 1 : 0
|
||||
) if ( $shutters->getUp eq 'brightness' );
|
||||
|
||||
ASC_Debug( 'FnIsDay: '
|
||||
. $shuttersDev
|
||||
. ' getUpBrightness: '
|
||||
. $respIsDay
|
||||
. ' Brightness: '
|
||||
. $shutters->getBrightness
|
||||
. ' BrightnessMax: '
|
||||
. $brightnessMaxVal
|
||||
. ' Sunrise: '
|
||||
. $shutters->getSunrise );
|
||||
}
|
||||
|
||||
return $respIsDay;
|
||||
}
|
||||
|
||||
sub ShuttersSunrise {
|
||||
my $shuttersDev = shift;
|
||||
my $tm = shift; # Tm steht für Timemode und bedeutet Realzeit oder Unixzeit
|
||||
|
||||
my $autoAstroMode;
|
||||
$shutters->setShuttersDev($shuttersDev);
|
||||
|
||||
if ( $shutters->getAutoAstroModeMorning ne 'none' ) {
|
||||
$autoAstroMode = $shutters->getAutoAstroModeMorning;
|
||||
$autoAstroMode =
|
||||
$autoAstroMode . '=' . $shutters->getAutoAstroModeMorningHorizon
|
||||
if ( $autoAstroMode eq 'HORIZON' );
|
||||
}
|
||||
else {
|
||||
$autoAstroMode = $ascDev->getAutoAstroModeMorning;
|
||||
$autoAstroMode =
|
||||
$autoAstroMode . '=' . $ascDev->getAutoAstroModeMorningHorizon
|
||||
if ( $autoAstroMode eq 'HORIZON' );
|
||||
}
|
||||
my $oldFuncHash = $shutters->getInTimerFuncHash;
|
||||
my $shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00', sunrise( 'REAL', 0, '4:30', '8:30' ) );
|
||||
|
||||
if ( $tm eq 'unix' ) {
|
||||
if ( $shutters->getUp eq 'astro' ) {
|
||||
if ( ( IsWe() || IsWe('tomorrow') )
|
||||
&& $ascDev->getSunriseTimeWeHoliday eq 'on'
|
||||
&& $shutters->getTimeUpWeHoliday ne '01:25' )
|
||||
{
|
||||
if ( !IsWe('tomorrow') ) {
|
||||
if (
|
||||
IsWe()
|
||||
&& int( gettimeofday() / 86400 ) == int(
|
||||
(
|
||||
computeAlignTime(
|
||||
'24:00',
|
||||
sunrise_abs(
|
||||
$autoAstroMode, 0,
|
||||
$shutters->getTimeUpWeHoliday
|
||||
)
|
||||
) + 1
|
||||
) / 86400
|
||||
)
|
||||
)
|
||||
{
|
||||
$shuttersSunriseUnixtime = (
|
||||
computeAlignTime(
|
||||
'24:00',
|
||||
sunrise_abs(
|
||||
$autoAstroMode, 0,
|
||||
$shutters->getTimeUpWeHoliday
|
||||
)
|
||||
) + 1
|
||||
);
|
||||
}
|
||||
elsif (
|
||||
int( gettimeofday() / 86400 ) == int(
|
||||
(
|
||||
computeAlignTime(
|
||||
'24:00',
|
||||
sunrise_abs(
|
||||
$autoAstroMode,
|
||||
0,
|
||||
$shutters->getTimeUpEarly,
|
||||
$shutters->getTimeUpLate
|
||||
)
|
||||
) + 1
|
||||
) / 86400
|
||||
)
|
||||
)
|
||||
{
|
||||
$shuttersSunriseUnixtime = (
|
||||
computeAlignTime(
|
||||
'24:00',
|
||||
sunrise_abs(
|
||||
$autoAstroMode, 0,
|
||||
$shutters->getTimeUpWeHoliday
|
||||
)
|
||||
) + 1
|
||||
);
|
||||
}
|
||||
else {
|
||||
$shuttersSunriseUnixtime = (
|
||||
computeAlignTime(
|
||||
'24:00',
|
||||
sunrise_abs(
|
||||
$autoAstroMode,
|
||||
0,
|
||||
$shutters->getTimeUpEarly,
|
||||
$shutters->getTimeUpLate
|
||||
)
|
||||
) + 1
|
||||
);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (
|
||||
IsWe()
|
||||
&& (
|
||||
int( gettimeofday() / 86400 ) == int(
|
||||
(
|
||||
computeAlignTime(
|
||||
'24:00',
|
||||
sunrise_abs(
|
||||
$autoAstroMode, 0,
|
||||
$shutters->getTimeUpWeHoliday
|
||||
)
|
||||
) + 1
|
||||
) / 86400
|
||||
)
|
||||
|| int( gettimeofday() / 86400 ) != int(
|
||||
(
|
||||
computeAlignTime(
|
||||
'24:00',
|
||||
sunrise_abs(
|
||||
$autoAstroMode, 0,
|
||||
$shutters->getTimeUpWeHoliday
|
||||
)
|
||||
) + 1
|
||||
) / 86400
|
||||
)
|
||||
)
|
||||
)
|
||||
{
|
||||
$shuttersSunriseUnixtime = (
|
||||
computeAlignTime(
|
||||
'24:00',
|
||||
sunrise_abs(
|
||||
$autoAstroMode, 0,
|
||||
$shutters->getTimeUpWeHoliday
|
||||
)
|
||||
) + 1
|
||||
);
|
||||
}
|
||||
elsif (
|
||||
int( gettimeofday() / 86400 ) == int(
|
||||
(
|
||||
computeAlignTime(
|
||||
'24:00',
|
||||
sunrise_abs(
|
||||
$autoAstroMode,
|
||||
0,
|
||||
$shutters->getTimeUpEarly,
|
||||
$shutters->getTimeUpLate
|
||||
)
|
||||
) + 1
|
||||
) / 86400
|
||||
)
|
||||
)
|
||||
{
|
||||
$shuttersSunriseUnixtime = (
|
||||
computeAlignTime(
|
||||
'24:00',
|
||||
sunrise_abs(
|
||||
$autoAstroMode,
|
||||
0,
|
||||
$shutters->getTimeUpEarly,
|
||||
$shutters->getTimeUpLate
|
||||
)
|
||||
) + 1
|
||||
);
|
||||
}
|
||||
else {
|
||||
if (
|
||||
int( gettimeofday() / 86400 ) == int(
|
||||
(
|
||||
computeAlignTime(
|
||||
'24:00',
|
||||
sunrise_abs(
|
||||
$autoAstroMode, 0,
|
||||
$shutters->getTimeUpWeHoliday
|
||||
)
|
||||
) + 1
|
||||
) / 86400
|
||||
)
|
||||
)
|
||||
{
|
||||
$shuttersSunriseUnixtime = (
|
||||
computeAlignTime(
|
||||
'24:00',
|
||||
sunrise_abs(
|
||||
$autoAstroMode, 0,
|
||||
$shutters->getTimeUpWeHoliday
|
||||
)
|
||||
) + 86401
|
||||
);
|
||||
}
|
||||
else {
|
||||
$shuttersSunriseUnixtime = (
|
||||
computeAlignTime(
|
||||
'24:00',
|
||||
sunrise_abs(
|
||||
$autoAstroMode, 0,
|
||||
$shutters->getTimeUpWeHoliday
|
||||
)
|
||||
) + 1
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
$shuttersSunriseUnixtime = (
|
||||
computeAlignTime(
|
||||
'24:00',
|
||||
sunrise_abs(
|
||||
$autoAstroMode,
|
||||
0,
|
||||
$shutters->getTimeUpEarly,
|
||||
$shutters->getTimeUpLate
|
||||
)
|
||||
) + 1
|
||||
);
|
||||
}
|
||||
if ( defined($oldFuncHash)
|
||||
&& ref($oldFuncHash) eq 'HASH'
|
||||
&& ( IsWe() || IsWe('tomorrow') )
|
||||
&& $ascDev->getSunriseTimeWeHoliday eq 'on'
|
||||
&& $shutters->getTimeUpWeHoliday ne '01:25' )
|
||||
{
|
||||
if ( !IsWe('tomorrow') ) {
|
||||
if (
|
||||
int( gettimeofday() / 86400 ) == int(
|
||||
(
|
||||
computeAlignTime(
|
||||
'24:00',
|
||||
sunrise_abs(
|
||||
$autoAstroMode,
|
||||
0,
|
||||
$shutters->getTimeUpEarly,
|
||||
$shutters->getTimeUpLate
|
||||
)
|
||||
) + 1
|
||||
) / 86400
|
||||
)
|
||||
)
|
||||
{
|
||||
$shuttersSunriseUnixtime =
|
||||
( $shuttersSunriseUnixtime + 86400 )
|
||||
if ( $shuttersSunriseUnixtime <
|
||||
( $oldFuncHash->{sunrisetime} + 180 )
|
||||
&& $oldFuncHash->{sunrisetime} < gettimeofday() );
|
||||
}
|
||||
}
|
||||
}
|
||||
elsif ( defined($oldFuncHash) && ref($oldFuncHash) eq 'HASH' ) {
|
||||
$shuttersSunriseUnixtime = ( $shuttersSunriseUnixtime + 86400 )
|
||||
if ( $shuttersSunriseUnixtime <
|
||||
( $oldFuncHash->{sunrisetime} + 180 )
|
||||
&& $oldFuncHash->{sunrisetime} < gettimeofday() );
|
||||
}
|
||||
}
|
||||
elsif ( $shutters->getUp eq 'time' ) {
|
||||
if ( ( IsWe() || IsWe('tomorrow') )
|
||||
&& $ascDev->getSunriseTimeWeHoliday eq 'on'
|
||||
&& $shutters->getTimeUpWeHoliday ne '01:25' )
|
||||
{
|
||||
if ( !IsWe('tomorrow') ) {
|
||||
if (
|
||||
int( gettimeofday() / 86400 ) == int(
|
||||
computeAlignTime( '24:00',
|
||||
$shutters->getTimeUpWeHoliday ) / 86400
|
||||
)
|
||||
)
|
||||
{
|
||||
$shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00',
|
||||
$shutters->getTimeUpWeHoliday );
|
||||
}
|
||||
elsif (
|
||||
int( gettimeofday() / 86400 ) == int(
|
||||
computeAlignTime( '24:00',
|
||||
$shutters->getTimeUpEarly ) / 86400
|
||||
)
|
||||
&& $shutters->getSunrise
|
||||
)
|
||||
{
|
||||
$shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00', $shutters->getTimeUpEarly )
|
||||
+ 86400;
|
||||
}
|
||||
else {
|
||||
$shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00',
|
||||
$shutters->getTimeUpEarly );
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (
|
||||
IsWe()
|
||||
&& int( gettimeofday() / 86400 ) == int(
|
||||
computeAlignTime( '24:00',
|
||||
$shutters->getTimeUpWeHoliday ) / 86400
|
||||
)
|
||||
)
|
||||
{
|
||||
$shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00',
|
||||
$shutters->getTimeUpWeHoliday );
|
||||
}
|
||||
elsif (
|
||||
int( gettimeofday() / 86400 ) == int(
|
||||
computeAlignTime( '24:00',
|
||||
$shutters->getTimeUpEarly ) / 86400
|
||||
)
|
||||
)
|
||||
{
|
||||
$shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00',
|
||||
$shutters->getTimeUpEarly );
|
||||
}
|
||||
elsif (
|
||||
int( gettimeofday() / 86400 ) != int(
|
||||
computeAlignTime( '24:00',
|
||||
$shutters->getTimeUpWeHoliday ) / 86400
|
||||
)
|
||||
)
|
||||
{
|
||||
$shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00',
|
||||
$shutters->getTimeUpWeHoliday );
|
||||
}
|
||||
else {
|
||||
$shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00',
|
||||
$shutters->getTimeUpWeHoliday ) + 86400;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
$shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00', $shutters->getTimeUpEarly );
|
||||
}
|
||||
}
|
||||
elsif ( $shutters->getUp eq 'brightness' ) {
|
||||
if ( ( IsWe() || IsWe('tomorrow') )
|
||||
&& $ascDev->getSunriseTimeWeHoliday eq 'on'
|
||||
&& $shutters->getTimeUpWeHoliday ne '01:25' )
|
||||
{
|
||||
if ( !IsWe('tomorrow') ) {
|
||||
if (
|
||||
IsWe()
|
||||
&& int( gettimeofday() / 86400 ) == int(
|
||||
(
|
||||
computeAlignTime(
|
||||
'24:00', $shutters->getTimeUpWeHoliday
|
||||
)
|
||||
) / 86400
|
||||
)
|
||||
)
|
||||
{
|
||||
$shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00',
|
||||
$shutters->getTimeUpWeHoliday );
|
||||
}
|
||||
elsif (
|
||||
int( gettimeofday() / 86400 ) == int(
|
||||
(
|
||||
computeAlignTime(
|
||||
'24:00', $shutters->getTimeUpLate
|
||||
)
|
||||
) / 86400
|
||||
)
|
||||
)
|
||||
{
|
||||
$shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00',
|
||||
$shutters->getTimeUpWeHoliday );
|
||||
}
|
||||
else {
|
||||
$shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00', $shutters->getTimeUpLate );
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (
|
||||
IsWe()
|
||||
&& (
|
||||
int( gettimeofday() / 86400 ) == int(
|
||||
(
|
||||
computeAlignTime(
|
||||
'24:00', $shutters->getTimeUpWeHoliday
|
||||
)
|
||||
) / 86400
|
||||
)
|
||||
|| int( gettimeofday() / 86400 ) != int(
|
||||
(
|
||||
computeAlignTime(
|
||||
'24:00', $shutters->getTimeUpWeHoliday
|
||||
)
|
||||
) / 86400
|
||||
)
|
||||
)
|
||||
)
|
||||
{
|
||||
$shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00',
|
||||
$shutters->getTimeUpWeHoliday );
|
||||
}
|
||||
elsif (
|
||||
int( gettimeofday() / 86400 ) == int(
|
||||
(
|
||||
computeAlignTime(
|
||||
'24:00', $shutters->getTimeUpLate
|
||||
)
|
||||
) / 86400
|
||||
)
|
||||
)
|
||||
{
|
||||
$shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00', $shutters->getTimeUpLate );
|
||||
}
|
||||
else {
|
||||
if (
|
||||
int( gettimeofday() / 86400 ) == int(
|
||||
(
|
||||
computeAlignTime(
|
||||
'24:00', $shutters->getTimeUpWeHoliday
|
||||
)
|
||||
) / 86400
|
||||
)
|
||||
)
|
||||
{
|
||||
$shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00',
|
||||
$shutters->getTimeUpWeHoliday );
|
||||
}
|
||||
else {
|
||||
$shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00',
|
||||
$shutters->getTimeUpWeHoliday );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
$shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00', $shutters->getTimeUpLate );
|
||||
}
|
||||
}
|
||||
|
||||
return $shuttersSunriseUnixtime;
|
||||
}
|
||||
elsif ( $tm eq 'real' ) {
|
||||
return sunrise_abs( $autoAstroMode, 0, $shutters->getTimeUpEarly,
|
||||
$shutters->getTimeUpLate )
|
||||
if ( $shutters->getUp eq 'astro' );
|
||||
return $shutters->getTimeUpEarly if ( $shutters->getUp eq 'time' );
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub IsAfterShuttersTimeBlocking {
|
||||
my $shuttersDev = shift;
|
||||
|
||||
$shutters->setShuttersDev($shuttersDev);
|
||||
|
||||
if (
|
||||
( int( gettimeofday() ) - $shutters->getLastManPosTimestamp ) <
|
||||
$shutters->getBlockingTimeAfterManual
|
||||
|| ( !$shutters->getIsDay
|
||||
&& defined( $shutters->getSunriseUnixTime )
|
||||
&& $shutters->getSunriseUnixTime - ( int( gettimeofday() ) ) <
|
||||
$shutters->getBlockingTimeBeforDayOpen )
|
||||
|| ( $shutters->getIsDay
|
||||
&& defined( $shutters->getSunriseUnixTime )
|
||||
&& $shutters->getSunsetUnixTime - ( int( gettimeofday() ) ) <
|
||||
$shutters->getBlockingTimeBeforNightClose )
|
||||
)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
else { return 1 }
|
||||
}
|
||||
|
||||
sub IsAfterShuttersManualBlocking {
|
||||
my $shuttersDev = shift;
|
||||
$shutters->setShuttersDev($shuttersDev);
|
||||
|
||||
if ( $ascDev->getBlockAscDrivesAfterManual
|
||||
&& $shutters->getStatus != $shutters->getOpenPos
|
||||
&& $shutters->getStatus != $shutters->getClosedPos
|
||||
&& $shutters->getStatus != $shutters->getWindPos
|
||||
&& $shutters->getStatus != $shutters->getShadingPos
|
||||
&& $shutters->getStatus != $shutters->getComfortOpenPos
|
||||
&& $shutters->getStatus != $shutters->getVentilatePos
|
||||
&& $shutters->getStatus != $shutters->getAntiFreezePos
|
||||
&& $shutters->getLastDrive eq 'manual' )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
elsif ( ( int( gettimeofday() ) - $shutters->getLastManPosTimestamp ) <
|
||||
$shutters->getBlockingTimeAfterManual )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
else { return 1 }
|
||||
}
|
||||
|
||||
sub ShuttersSunset {
|
||||
my $shuttersDev = shift;
|
||||
my $tm = shift; # Tm steht für Timemode und bedeutet Realzeit oder Unixzeit
|
||||
|
||||
my $autoAstroMode;
|
||||
$shutters->setShuttersDev($shuttersDev);
|
||||
|
||||
if ( $shutters->getAutoAstroModeEvening ne 'none' ) {
|
||||
$autoAstroMode = $shutters->getAutoAstroModeEvening;
|
||||
$autoAstroMode =
|
||||
$autoAstroMode . '=' . $shutters->getAutoAstroModeEveningHorizon
|
||||
if ( $autoAstroMode eq 'HORIZON' );
|
||||
}
|
||||
else {
|
||||
$autoAstroMode = $ascDev->getAutoAstroModeEvening;
|
||||
$autoAstroMode =
|
||||
$autoAstroMode . '=' . $ascDev->getAutoAstroModeEveningHorizon
|
||||
if ( $autoAstroMode eq 'HORIZON' );
|
||||
}
|
||||
my $oldFuncHash = $shutters->getInTimerFuncHash;
|
||||
my $shuttersSunsetUnixtime =
|
||||
computeAlignTime( '24:00', sunset( 'REAL', 0, '15:30', '21:30' ) );
|
||||
|
||||
if ( $tm eq 'unix' ) {
|
||||
if ( $shutters->getDown eq 'astro' ) {
|
||||
$shuttersSunsetUnixtime = (
|
||||
computeAlignTime(
|
||||
'24:00',
|
||||
sunset_abs(
|
||||
$autoAstroMode,
|
||||
0,
|
||||
$shutters->getTimeDownEarly,
|
||||
$shutters->getTimeDownLate
|
||||
)
|
||||
) + 1
|
||||
);
|
||||
if ( defined($oldFuncHash) && ref($oldFuncHash) eq 'HASH' ) {
|
||||
$shuttersSunsetUnixtime += 86400
|
||||
if ( $shuttersSunsetUnixtime <
|
||||
( $oldFuncHash->{sunsettime} + 180 )
|
||||
&& $oldFuncHash->{sunsettime} < gettimeofday() );
|
||||
}
|
||||
}
|
||||
elsif ( $shutters->getDown eq 'time' ) {
|
||||
$shuttersSunsetUnixtime =
|
||||
computeAlignTime( '24:00', $shutters->getTimeDownEarly );
|
||||
}
|
||||
elsif ( $shutters->getDown eq 'brightness' ) {
|
||||
$shuttersSunsetUnixtime =
|
||||
computeAlignTime( '24:00', $shutters->getTimeDownLate );
|
||||
}
|
||||
return $shuttersSunsetUnixtime;
|
||||
}
|
||||
elsif ( $tm eq 'real' ) {
|
||||
return sunset_abs(
|
||||
$autoAstroMode, 0,
|
||||
$shutters->getTimeDownEarly,
|
||||
$shutters->getTimeDownLate
|
||||
) if ( $shutters->getDown eq 'astro' );
|
||||
return $shutters->getTimeDownEarly
|
||||
if ( $shutters->getDown eq 'time' );
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
## Kontrolliert ob das Fenster von einem bestimmten Rolladen offen ist
|
||||
sub CheckIfShuttersWindowRecOpen {
|
||||
my $shuttersDev = shift;
|
||||
$shutters->setShuttersDev($shuttersDev);
|
||||
|
||||
if ( $shutters->getWinStatus =~
|
||||
m{[Oo]pen|false}xms ) # CK: covers: open|opened
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
elsif ($shutters->getWinStatus =~ m{tilt}xms
|
||||
&& $shutters->getSubTyp eq 'threestate' ) # CK: covers: tilt|tilted
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
elsif ( $shutters->getWinStatus =~ m{[Cc]lose|true}xms ) {
|
||||
return 0;
|
||||
} # CK: covers: close|closed
|
||||
}
|
||||
|
||||
sub makeReadingName {
|
||||
my ($rname) = shift;
|
||||
my %charHash = (
|
||||
chr(0xe4) => "ae", # ä
|
||||
chr(0xc4) => "Ae", # Ä
|
||||
chr(0xfc) => "ue", # ü
|
||||
chr(0xdc) => "Ue", # Ü
|
||||
chr(0xf6) => "oe", # ö
|
||||
chr(0xd6) => "Oe", # Ö
|
||||
chr(0xdf) => "ss" # ß
|
||||
);
|
||||
my $charHashkeys = join( "", keys(%charHash) );
|
||||
|
||||
return $rname if ( $rname =~ m{^\./}xms );
|
||||
$rname =~ s/([$charHashkeys])/$charHash{$1}/xgi;
|
||||
$rname =~ s/[^a-z0-9._\-\/]/_/xgi;
|
||||
return $rname;
|
||||
}
|
||||
|
||||
sub TimeMin2Sec {
|
||||
my $min = shift;
|
||||
my $sec;
|
||||
|
||||
$sec = $min * 60;
|
||||
return $sec;
|
||||
}
|
||||
|
||||
sub IsWe {
|
||||
return main::IsWe( shift, shift );
|
||||
}
|
||||
|
||||
sub _DetermineSlatCmd {
|
||||
my $value = shift;
|
||||
@ -4647,100 +3812,6 @@ sub DevStateIcon {
|
||||
return;
|
||||
}
|
||||
|
||||
sub _CheckASC_ConditionsForShadingFn {
|
||||
my $hash = shift;
|
||||
|
||||
my $error;
|
||||
|
||||
$error .=
|
||||
' no valid data from the ASC temperature sensor, is ASC_tempSensor attribut set?'
|
||||
if ( $ascDev->getOutTemp == -100 );
|
||||
$error .= ' no twilight device found'
|
||||
if ( $ascDev->_getTwilightDevice eq 'none' );
|
||||
|
||||
my $count = 1;
|
||||
for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
|
||||
InternalTimer(
|
||||
gettimeofday() + $count,
|
||||
'FHEM::Automation::ShuttersControl::_CheckShuttersConditionsForShadingFn',
|
||||
$shuttersDev
|
||||
);
|
||||
|
||||
$count++;
|
||||
}
|
||||
|
||||
return (
|
||||
defined($error)
|
||||
? $error
|
||||
: 'none'
|
||||
);
|
||||
}
|
||||
|
||||
sub _CheckShuttersConditionsForShadingFn {
|
||||
my $shuttersDev = shift;
|
||||
|
||||
$shutters->setShuttersDev($shuttersDev);
|
||||
my $shuttersDevHash = $defs{$shuttersDev};
|
||||
my $message = '';
|
||||
my $errorMessage;
|
||||
my $warnMessage;
|
||||
my $infoMessage;
|
||||
|
||||
$infoMessage .= (
|
||||
$shutters->getShadingMode ne 'off'
|
||||
&& $ascDev->getAutoShuttersControlShading eq 'on'
|
||||
&& $shutters->getOutTemp == -100
|
||||
? ' shading active, global temp sensor is set, but shutters temperature sensor is not set'
|
||||
: ''
|
||||
);
|
||||
|
||||
$warnMessage .= (
|
||||
$shutters->getShadingMode eq 'off'
|
||||
&& $ascDev->getAutoShuttersControlShading eq 'on'
|
||||
? ' global shading active but ASC_Shading_Mode attribut is not set or off'
|
||||
: ''
|
||||
);
|
||||
|
||||
$errorMessage .= (
|
||||
$shutters->getShadingMode ne 'off'
|
||||
&& $ascDev->getAutoShuttersControlShading ne 'on'
|
||||
&& $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 .= (
|
||||
$shutters->getBrightness == -1 && $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 RemoveShuttersTimer {
|
||||
my $hash = shift;
|
||||
|
||||
|
@ -264,7 +264,7 @@ sub _getRainSensor {
|
||||
return $device if ( $device eq 'none' );
|
||||
$self->{ASC_rainSensor}->{device} = $device;
|
||||
$self->{ASC_rainSensor}->{reading} =
|
||||
( $reading ne 'none' ? $reading : 'state' );
|
||||
( $reading ne 'none' ? $reading : 'rain' );
|
||||
$self->{ASC_rainSensor}->{triggermax} = (
|
||||
( $max ne 'none'
|
||||
&& $max =~ m{\A(-?\d+(\.\d+)?)\z}xms )
|
||||
|
935
lib/FHEM/Automation/ShuttersControl/Helper.pm
Normal file
935
lib/FHEM/Automation/ShuttersControl/Helper.pm
Normal file
@ -0,0 +1,935 @@
|
||||
###############################################################################
|
||||
#
|
||||
# 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::Helper;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use POSIX qw(strftime);
|
||||
use utf8;
|
||||
|
||||
require Exporter;
|
||||
our @ISA = qw(Exporter);
|
||||
our @EXPORT_OK = qw(
|
||||
PositionValueWindowRec
|
||||
AutoSearchTwilightDev
|
||||
GetAttrValues
|
||||
CheckIfShuttersWindowRecOpen
|
||||
ExtractNotifyDevFromEvent
|
||||
ShuttersSunrise
|
||||
ShuttersSunset
|
||||
makeReadingName
|
||||
IsWe
|
||||
IsAfterShuttersTimeBlocking
|
||||
IsAfterShuttersManualBlocking
|
||||
);
|
||||
our %EXPORT_TAGS = (
|
||||
ALL => [
|
||||
qw(
|
||||
PositionValueWindowRec
|
||||
AutoSearchTwilightDev
|
||||
GetAttrValues
|
||||
CheckIfShuttersWindowRecOpen
|
||||
ExtractNotifyDevFromEvent
|
||||
ShuttersSunrise
|
||||
ShuttersSunset
|
||||
makeReadingName
|
||||
IsWe
|
||||
IsAfterShuttersTimeBlocking
|
||||
IsAfterShuttersManualBlocking
|
||||
)
|
||||
],
|
||||
);
|
||||
|
||||
use GPUtils qw(GP_Import);
|
||||
## Import der FHEM Funktionen
|
||||
BEGIN {
|
||||
GP_Import(
|
||||
qw(
|
||||
devspec2array
|
||||
CommandAttr
|
||||
AttrVal
|
||||
Log3
|
||||
computeAlignTime
|
||||
gettimeofday
|
||||
sunset
|
||||
sunset_abs
|
||||
sunrise
|
||||
sunrise_abs
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
sub PositionValueWindowRec {
|
||||
my $shuttersDev = shift;
|
||||
my $posValue = shift;
|
||||
|
||||
if ( CheckIfShuttersWindowRecOpen($shuttersDev) == 1
|
||||
&& $FHEM::Automation::ShuttersControl::shutters->getVentilateOpen eq 'on' )
|
||||
{
|
||||
$posValue = $FHEM::Automation::ShuttersControl::shutters->getVentilatePos;
|
||||
}
|
||||
elsif (CheckIfShuttersWindowRecOpen($shuttersDev) == 2
|
||||
&& $FHEM::Automation::ShuttersControl::shutters->getSubTyp eq 'threestate'
|
||||
&& $FHEM::Automation::ShuttersControl::ascDev->getAutoShuttersControlComfort eq 'on' )
|
||||
{
|
||||
$posValue = $FHEM::Automation::ShuttersControl::shutters->getComfortOpenPos;
|
||||
}
|
||||
elsif (
|
||||
CheckIfShuttersWindowRecOpen($shuttersDev) == 2
|
||||
&& ( $FHEM::Automation::ShuttersControl::shutters->getSubTyp eq 'threestate'
|
||||
|| $FHEM::Automation::ShuttersControl::shutters->getSubTyp eq 'twostate' )
|
||||
&& $FHEM::Automation::ShuttersControl::shutters->getVentilateOpen eq 'on'
|
||||
)
|
||||
{
|
||||
$posValue = $FHEM::Automation::ShuttersControl::shutters->getVentilatePos;
|
||||
}
|
||||
|
||||
if ( $FHEM::Automation::ShuttersControl::shutters->getQueryShuttersPos($posValue) ) {
|
||||
$posValue = $FHEM::Automation::ShuttersControl::shutters->getStatus;
|
||||
}
|
||||
|
||||
return $posValue;
|
||||
}
|
||||
|
||||
sub AutoSearchTwilightDev {
|
||||
my $hash = shift;
|
||||
|
||||
my $name = $hash->{NAME};
|
||||
|
||||
if ( devspec2array('TYPE=(Astro|Twilight)') > 0 ) {
|
||||
CommandAttr( undef,
|
||||
$name
|
||||
. ' ASC_twilightDevice '
|
||||
. ( devspec2array('TYPE=(Astro|Twilight)') )[0] )
|
||||
if ( AttrVal( $name, 'ASC_twilightDevice', 'none' ) eq 'none' );
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub GetAttrValues {
|
||||
my $dev = shift;
|
||||
my $attribut = shift;
|
||||
my $default = shift;
|
||||
|
||||
my @values = split( ' ',
|
||||
AttrVal( $dev, $attribut, ( defined($default) ? $default : 'none' ) ) );
|
||||
my ( $value1, $value2 ) = split( ':', $values[0] );
|
||||
|
||||
my ( $value3, $value4, $value5, $value6, $value7, $value8 );
|
||||
( $value3, $value4 ) = split( ':', $values[1] )
|
||||
if ( defined( $values[1] ) );
|
||||
( $value5, $value6 ) = split( ':', $values[2] )
|
||||
if ( defined( $values[2] ) );
|
||||
( $value7, $value8 ) = split( ':', $values[3] )
|
||||
if ( defined( $values[3] ) );
|
||||
|
||||
return (
|
||||
$value1,
|
||||
defined($value2) ? $value2 : 'none',
|
||||
defined($value3) ? $value3 : 'none',
|
||||
defined($value4) ? $value4 : 'none',
|
||||
defined($value5) ? $value5 : 'none',
|
||||
defined($value6) ? $value6 : 'none',
|
||||
defined($value7) ? $value7 : 'none',
|
||||
defined($value8) ? $value8 : 'none'
|
||||
);
|
||||
}
|
||||
|
||||
## Kontrolliert ob das Fenster von einem bestimmten Rolladen offen ist
|
||||
sub CheckIfShuttersWindowRecOpen {
|
||||
my $shuttersDev = shift;
|
||||
$FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
|
||||
|
||||
if ( $FHEM::Automation::ShuttersControl::shutters->getWinStatus =~
|
||||
m{[Oo]pen|false}xms ) # CK: covers: open|opened
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
elsif ($FHEM::Automation::ShuttersControl::shutters->getWinStatus =~ m{tilt}xms
|
||||
&& $FHEM::Automation::ShuttersControl::shutters->getSubTyp eq 'threestate' ) # CK: covers: tilt|tilted
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
elsif ( $FHEM::Automation::ShuttersControl::shutters->getWinStatus =~ m{[Cc]lose|true}xms ) {
|
||||
return 0;
|
||||
} # CK: covers: close|closed
|
||||
}
|
||||
|
||||
sub ExtractNotifyDevFromEvent {
|
||||
my $hash = shift;
|
||||
my $shuttersDev = shift;
|
||||
my $shuttersAttr = shift;
|
||||
|
||||
my %notifyDevs;
|
||||
while ( my $notifyDev = each %{ $hash->{monitoredDevs} } ) {
|
||||
Log3( $hash->{NAME}, 4,
|
||||
"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - NotifyDev: "
|
||||
. $notifyDev );
|
||||
Log3( $hash->{NAME}, 5,
|
||||
"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - ShuttersDev: "
|
||||
. $shuttersDev );
|
||||
|
||||
if ( defined( $hash->{monitoredDevs}{$notifyDev}{$shuttersDev} )
|
||||
&& $hash->{monitoredDevs}{$notifyDev}{$shuttersDev} eq
|
||||
$shuttersAttr )
|
||||
{
|
||||
Log3( $hash->{NAME}, 4,
|
||||
"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - ShuttersDevHash: "
|
||||
. $hash->{monitoredDevs}{$notifyDev}{$shuttersDev} );
|
||||
Log3( $hash->{NAME}, 5,
|
||||
"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - return ShuttersDev: "
|
||||
. $notifyDev );
|
||||
$notifyDevs{$notifyDev} = $shuttersDev;
|
||||
}
|
||||
}
|
||||
return \%notifyDevs;
|
||||
}
|
||||
|
||||
## Ist Tag oder Nacht für den entsprechende Rolladen
|
||||
sub _IsDay {
|
||||
my $shuttersDev = shift;
|
||||
|
||||
$FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
|
||||
|
||||
my $brightnessMinVal = (
|
||||
$FHEM::Automation::ShuttersControl::shutters->getBrightnessMinVal > -1
|
||||
? $FHEM::Automation::ShuttersControl::shutters->getBrightnessMinVal
|
||||
: $FHEM::Automation::ShuttersControl::ascDev->getBrightnessMinVal
|
||||
);
|
||||
|
||||
my $brightnessMaxVal = (
|
||||
$FHEM::Automation::ShuttersControl::shutters->getBrightnessMaxVal > -1
|
||||
? $FHEM::Automation::ShuttersControl::shutters->getBrightnessMaxVal
|
||||
: $FHEM::Automation::ShuttersControl::ascDev->getBrightnessMaxVal
|
||||
);
|
||||
|
||||
my $isday = ( ShuttersSunrise( $shuttersDev, 'unix' ) >
|
||||
ShuttersSunset( $shuttersDev, 'unix' ) ? 1 : 0 );
|
||||
my $respIsDay = $isday;
|
||||
|
||||
FHEM::Automation::ShuttersControl::ASC_Debug( 'FnIsDay: ' . $shuttersDev . ' Allgemein: ' . $respIsDay );
|
||||
|
||||
if (
|
||||
(
|
||||
(
|
||||
(
|
||||
int( gettimeofday() / 86400 ) != int(
|
||||
computeAlignTime( '24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly ) /
|
||||
86400
|
||||
)
|
||||
&& !IsWe()
|
||||
)
|
||||
|| (
|
||||
int( gettimeofday() / 86400 ) != int(
|
||||
computeAlignTime( '24:00',
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday ) /
|
||||
86400
|
||||
)
|
||||
&& IsWe()
|
||||
&& $FHEM::Automation::ShuttersControl::ascDev->getSunriseTimeWeHoliday eq 'on'
|
||||
&& $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday ne '01:25'
|
||||
)
|
||||
)
|
||||
&& int( gettimeofday() / 86400 ) == int(
|
||||
computeAlignTime( '24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeUpLate ) /
|
||||
86400
|
||||
)
|
||||
)
|
||||
|| (
|
||||
int( gettimeofday() / 86400 ) != int(
|
||||
computeAlignTime( '24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeDownEarly ) /
|
||||
86400
|
||||
)
|
||||
&& int( gettimeofday() / 86400 ) == int(
|
||||
computeAlignTime( '24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeDownLate ) /
|
||||
86400
|
||||
)
|
||||
)
|
||||
)
|
||||
{
|
||||
##### Nach Sonnenuntergang / Abends
|
||||
$respIsDay = (
|
||||
(
|
||||
(
|
||||
$FHEM::Automation::ShuttersControl::shutters->getBrightness > $brightnessMinVal
|
||||
&& $isday
|
||||
&& !$FHEM::Automation::ShuttersControl::shutters->getSunset
|
||||
)
|
||||
|| !$FHEM::Automation::ShuttersControl::shutters->getSunset
|
||||
) ? 1 : 0
|
||||
) if ( $FHEM::Automation::ShuttersControl::shutters->getDown eq 'brightness' );
|
||||
|
||||
FHEM::Automation::ShuttersControl::ASC_Debug( 'FnIsDay: '
|
||||
. $shuttersDev
|
||||
. ' getDownBrightness: '
|
||||
. $respIsDay
|
||||
. ' Brightness: '
|
||||
. $FHEM::Automation::ShuttersControl::shutters->getBrightness
|
||||
. ' BrightnessMin: '
|
||||
. $brightnessMinVal
|
||||
. ' Sunset: '
|
||||
. $FHEM::Automation::ShuttersControl::shutters->getSunset );
|
||||
|
||||
##### Nach Sonnenauf / Morgens
|
||||
$respIsDay = (
|
||||
(
|
||||
(
|
||||
$FHEM::Automation::ShuttersControl::shutters->getBrightness > $brightnessMaxVal
|
||||
&& !$isday
|
||||
&& $FHEM::Automation::ShuttersControl::shutters->getSunrise
|
||||
)
|
||||
|| $respIsDay
|
||||
|| $FHEM::Automation::ShuttersControl::shutters->getSunrise
|
||||
) ? 1 : 0
|
||||
) if ( $FHEM::Automation::ShuttersControl::shutters->getUp eq 'brightness' );
|
||||
|
||||
FHEM::Automation::ShuttersControl::ASC_Debug( 'FnIsDay: '
|
||||
. $shuttersDev
|
||||
. ' getUpBrightness: '
|
||||
. $respIsDay
|
||||
. ' Brightness: '
|
||||
. $FHEM::Automation::ShuttersControl::shutters->getBrightness
|
||||
. ' BrightnessMax: '
|
||||
. $brightnessMaxVal
|
||||
. ' Sunrise: '
|
||||
. $FHEM::Automation::ShuttersControl::shutters->getSunrise );
|
||||
}
|
||||
|
||||
return $respIsDay;
|
||||
}
|
||||
|
||||
sub ShuttersSunrise {
|
||||
my $shuttersDev = shift;
|
||||
my $tm = shift; # Tm steht für Timemode und bedeutet Realzeit oder Unixzeit
|
||||
|
||||
my $autoAstroMode;
|
||||
$FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
|
||||
|
||||
if ( $FHEM::Automation::ShuttersControl::shutters->getAutoAstroModeMorning ne 'none' ) {
|
||||
$autoAstroMode = $FHEM::Automation::ShuttersControl::shutters->getAutoAstroModeMorning;
|
||||
$autoAstroMode =
|
||||
$autoAstroMode . '=' . $FHEM::Automation::ShuttersControl::shutters->getAutoAstroModeMorningHorizon
|
||||
if ( $autoAstroMode eq 'HORIZON' );
|
||||
}
|
||||
else {
|
||||
$autoAstroMode = $FHEM::Automation::ShuttersControl::ascDev->getAutoAstroModeMorning;
|
||||
$autoAstroMode =
|
||||
$autoAstroMode . '=' . $FHEM::Automation::ShuttersControl::ascDev->getAutoAstroModeMorningHorizon
|
||||
if ( $autoAstroMode eq 'HORIZON' );
|
||||
}
|
||||
my $oldFuncHash = $FHEM::Automation::ShuttersControl::shutters->getInTimerFuncHash;
|
||||
my $shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00', sunrise( 'REAL', 0, '4:30', '8:30' ) );
|
||||
|
||||
if ( $tm eq 'unix' ) {
|
||||
if ( $FHEM::Automation::ShuttersControl::shutters->getUp eq 'astro' ) {
|
||||
if ( ( IsWe() || IsWe('tomorrow') )
|
||||
&& $FHEM::Automation::ShuttersControl::ascDev->getSunriseTimeWeHoliday eq 'on'
|
||||
&& $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday ne '01:25' )
|
||||
{
|
||||
if ( !IsWe('tomorrow') ) {
|
||||
if (
|
||||
IsWe()
|
||||
&& int( gettimeofday() / 86400 ) == int(
|
||||
(
|
||||
computeAlignTime(
|
||||
'24:00',
|
||||
sunrise_abs(
|
||||
$autoAstroMode, 0,
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday
|
||||
)
|
||||
) + 1
|
||||
) / 86400
|
||||
)
|
||||
)
|
||||
{
|
||||
$shuttersSunriseUnixtime = (
|
||||
computeAlignTime(
|
||||
'24:00',
|
||||
sunrise_abs(
|
||||
$autoAstroMode, 0,
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday
|
||||
)
|
||||
) + 1
|
||||
);
|
||||
}
|
||||
elsif (
|
||||
int( gettimeofday() / 86400 ) == int(
|
||||
(
|
||||
computeAlignTime(
|
||||
'24:00',
|
||||
sunrise_abs(
|
||||
$autoAstroMode,
|
||||
0,
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly,
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpLate
|
||||
)
|
||||
) + 1
|
||||
) / 86400
|
||||
)
|
||||
)
|
||||
{
|
||||
$shuttersSunriseUnixtime = (
|
||||
computeAlignTime(
|
||||
'24:00',
|
||||
sunrise_abs(
|
||||
$autoAstroMode, 0,
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday
|
||||
)
|
||||
) + 1
|
||||
);
|
||||
}
|
||||
else {
|
||||
$shuttersSunriseUnixtime = (
|
||||
computeAlignTime(
|
||||
'24:00',
|
||||
sunrise_abs(
|
||||
$autoAstroMode,
|
||||
0,
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly,
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpLate
|
||||
)
|
||||
) + 1
|
||||
);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (
|
||||
IsWe()
|
||||
&& (
|
||||
int( gettimeofday() / 86400 ) == int(
|
||||
(
|
||||
computeAlignTime(
|
||||
'24:00',
|
||||
sunrise_abs(
|
||||
$autoAstroMode, 0,
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday
|
||||
)
|
||||
) + 1
|
||||
) / 86400
|
||||
)
|
||||
|| int( gettimeofday() / 86400 ) != int(
|
||||
(
|
||||
computeAlignTime(
|
||||
'24:00',
|
||||
sunrise_abs(
|
||||
$autoAstroMode, 0,
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday
|
||||
)
|
||||
) + 1
|
||||
) / 86400
|
||||
)
|
||||
)
|
||||
)
|
||||
{
|
||||
$shuttersSunriseUnixtime = (
|
||||
computeAlignTime(
|
||||
'24:00',
|
||||
sunrise_abs(
|
||||
$autoAstroMode, 0,
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday
|
||||
)
|
||||
) + 1
|
||||
);
|
||||
}
|
||||
elsif (
|
||||
int( gettimeofday() / 86400 ) == int(
|
||||
(
|
||||
computeAlignTime(
|
||||
'24:00',
|
||||
sunrise_abs(
|
||||
$autoAstroMode,
|
||||
0,
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly,
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpLate
|
||||
)
|
||||
) + 1
|
||||
) / 86400
|
||||
)
|
||||
)
|
||||
{
|
||||
$shuttersSunriseUnixtime = (
|
||||
computeAlignTime(
|
||||
'24:00',
|
||||
sunrise_abs(
|
||||
$autoAstroMode,
|
||||
0,
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly,
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpLate
|
||||
)
|
||||
) + 1
|
||||
);
|
||||
}
|
||||
else {
|
||||
if (
|
||||
int( gettimeofday() / 86400 ) == int(
|
||||
(
|
||||
computeAlignTime(
|
||||
'24:00',
|
||||
sunrise_abs(
|
||||
$autoAstroMode, 0,
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday
|
||||
)
|
||||
) + 1
|
||||
) / 86400
|
||||
)
|
||||
)
|
||||
{
|
||||
$shuttersSunriseUnixtime = (
|
||||
computeAlignTime(
|
||||
'24:00',
|
||||
sunrise_abs(
|
||||
$autoAstroMode, 0,
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday
|
||||
)
|
||||
) + 86401
|
||||
);
|
||||
}
|
||||
else {
|
||||
$shuttersSunriseUnixtime = (
|
||||
computeAlignTime(
|
||||
'24:00',
|
||||
sunrise_abs(
|
||||
$autoAstroMode, 0,
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday
|
||||
)
|
||||
) + 1
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
$shuttersSunriseUnixtime = (
|
||||
computeAlignTime(
|
||||
'24:00',
|
||||
sunrise_abs(
|
||||
$autoAstroMode,
|
||||
0,
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly,
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpLate
|
||||
)
|
||||
) + 1
|
||||
);
|
||||
}
|
||||
if ( defined($oldFuncHash)
|
||||
&& ref($oldFuncHash) eq 'HASH'
|
||||
&& ( IsWe() || IsWe('tomorrow') )
|
||||
&& $FHEM::Automation::ShuttersControl::ascDev->getSunriseTimeWeHoliday eq 'on'
|
||||
&& $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday ne '01:25' )
|
||||
{
|
||||
if ( !IsWe('tomorrow') ) {
|
||||
if (
|
||||
int( gettimeofday() / 86400 ) == int(
|
||||
(
|
||||
computeAlignTime(
|
||||
'24:00',
|
||||
sunrise_abs(
|
||||
$autoAstroMode,
|
||||
0,
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly,
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpLate
|
||||
)
|
||||
) + 1
|
||||
) / 86400
|
||||
)
|
||||
)
|
||||
{
|
||||
$shuttersSunriseUnixtime =
|
||||
( $shuttersSunriseUnixtime + 86400 )
|
||||
if ( $shuttersSunriseUnixtime <
|
||||
( $oldFuncHash->{sunrisetime} + 180 )
|
||||
&& $oldFuncHash->{sunrisetime} < gettimeofday() );
|
||||
}
|
||||
}
|
||||
}
|
||||
elsif ( defined($oldFuncHash) && ref($oldFuncHash) eq 'HASH' ) {
|
||||
$shuttersSunriseUnixtime = ( $shuttersSunriseUnixtime + 86400 )
|
||||
if ( $shuttersSunriseUnixtime <
|
||||
( $oldFuncHash->{sunrisetime} + 180 )
|
||||
&& $oldFuncHash->{sunrisetime} < gettimeofday() );
|
||||
}
|
||||
}
|
||||
elsif ( $FHEM::Automation::ShuttersControl::shutters->getUp eq 'time' ) {
|
||||
if ( ( IsWe() || IsWe('tomorrow') )
|
||||
&& $FHEM::Automation::ShuttersControl::ascDev->getSunriseTimeWeHoliday eq 'on'
|
||||
&& $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday ne '01:25' )
|
||||
{
|
||||
if ( !IsWe('tomorrow') ) {
|
||||
if (
|
||||
int( gettimeofday() / 86400 ) == int(
|
||||
computeAlignTime( '24:00',
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday ) / 86400
|
||||
)
|
||||
)
|
||||
{
|
||||
$shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00',
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday );
|
||||
}
|
||||
elsif (
|
||||
int( gettimeofday() / 86400 ) == int(
|
||||
computeAlignTime( '24:00',
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly ) / 86400
|
||||
)
|
||||
&& $FHEM::Automation::ShuttersControl::shutters->getSunrise
|
||||
)
|
||||
{
|
||||
$shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly )
|
||||
+ 86400;
|
||||
}
|
||||
else {
|
||||
$shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00',
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly );
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (
|
||||
IsWe()
|
||||
&& int( gettimeofday() / 86400 ) == int(
|
||||
computeAlignTime( '24:00',
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday ) / 86400
|
||||
)
|
||||
)
|
||||
{
|
||||
$shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00',
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday );
|
||||
}
|
||||
elsif (
|
||||
int( gettimeofday() / 86400 ) == int(
|
||||
computeAlignTime( '24:00',
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly ) / 86400
|
||||
)
|
||||
)
|
||||
{
|
||||
$shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00',
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly );
|
||||
}
|
||||
elsif (
|
||||
int( gettimeofday() / 86400 ) != int(
|
||||
computeAlignTime( '24:00',
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday ) / 86400
|
||||
)
|
||||
)
|
||||
{
|
||||
$shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00',
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday );
|
||||
}
|
||||
else {
|
||||
$shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00',
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday ) + 86400;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
$shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly );
|
||||
}
|
||||
}
|
||||
elsif ( $FHEM::Automation::ShuttersControl::shutters->getUp eq 'brightness' ) {
|
||||
if ( ( IsWe() || IsWe('tomorrow') )
|
||||
&& $FHEM::Automation::ShuttersControl::ascDev->getSunriseTimeWeHoliday eq 'on'
|
||||
&& $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday ne '01:25' )
|
||||
{
|
||||
if ( !IsWe('tomorrow') ) {
|
||||
if (
|
||||
IsWe()
|
||||
&& int( gettimeofday() / 86400 ) == int(
|
||||
(
|
||||
computeAlignTime(
|
||||
'24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday
|
||||
)
|
||||
) / 86400
|
||||
)
|
||||
)
|
||||
{
|
||||
$shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00',
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday );
|
||||
}
|
||||
elsif (
|
||||
int( gettimeofday() / 86400 ) == int(
|
||||
(
|
||||
computeAlignTime(
|
||||
'24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeUpLate
|
||||
)
|
||||
) / 86400
|
||||
)
|
||||
)
|
||||
{
|
||||
$shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00',
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday );
|
||||
}
|
||||
else {
|
||||
$shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeUpLate );
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (
|
||||
IsWe()
|
||||
&& (
|
||||
int( gettimeofday() / 86400 ) == int(
|
||||
(
|
||||
computeAlignTime(
|
||||
'24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday
|
||||
)
|
||||
) / 86400
|
||||
)
|
||||
|| int( gettimeofday() / 86400 ) != int(
|
||||
(
|
||||
computeAlignTime(
|
||||
'24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday
|
||||
)
|
||||
) / 86400
|
||||
)
|
||||
)
|
||||
)
|
||||
{
|
||||
$shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00',
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday );
|
||||
}
|
||||
elsif (
|
||||
int( gettimeofday() / 86400 ) == int(
|
||||
(
|
||||
computeAlignTime(
|
||||
'24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeUpLate
|
||||
)
|
||||
) / 86400
|
||||
)
|
||||
)
|
||||
{
|
||||
$shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeUpLate );
|
||||
}
|
||||
else {
|
||||
if (
|
||||
int( gettimeofday() / 86400 ) == int(
|
||||
(
|
||||
computeAlignTime(
|
||||
'24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday
|
||||
)
|
||||
) / 86400
|
||||
)
|
||||
)
|
||||
{
|
||||
$shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00',
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday );
|
||||
}
|
||||
else {
|
||||
$shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00',
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpWeHoliday );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
$shuttersSunriseUnixtime =
|
||||
computeAlignTime( '24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeUpLate );
|
||||
}
|
||||
}
|
||||
|
||||
return $shuttersSunriseUnixtime;
|
||||
}
|
||||
elsif ( $tm eq 'real' ) {
|
||||
return sunrise_abs( $autoAstroMode, 0, $FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly,
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpLate )
|
||||
if ( $FHEM::Automation::ShuttersControl::shutters->getUp eq 'astro' );
|
||||
return $FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly if ( $FHEM::Automation::ShuttersControl::shutters->getUp eq 'time' );
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub ShuttersSunset {
|
||||
my $shuttersDev = shift;
|
||||
my $tm = shift; # Tm steht für Timemode und bedeutet Realzeit oder Unixzeit
|
||||
|
||||
my $autoAstroMode;
|
||||
$FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
|
||||
|
||||
if ( $FHEM::Automation::ShuttersControl::shutters->getAutoAstroModeEvening ne 'none' ) {
|
||||
$autoAstroMode = $FHEM::Automation::ShuttersControl::shutters->getAutoAstroModeEvening;
|
||||
$autoAstroMode =
|
||||
$autoAstroMode . '=' . $FHEM::Automation::ShuttersControl::shutters->getAutoAstroModeEveningHorizon
|
||||
if ( $autoAstroMode eq 'HORIZON' );
|
||||
}
|
||||
else {
|
||||
$autoAstroMode = $FHEM::Automation::ShuttersControl::ascDev->getAutoAstroModeEvening;
|
||||
$autoAstroMode =
|
||||
$autoAstroMode . '=' . $FHEM::Automation::ShuttersControl::ascDev->getAutoAstroModeEveningHorizon
|
||||
if ( $autoAstroMode eq 'HORIZON' );
|
||||
}
|
||||
my $oldFuncHash = $FHEM::Automation::ShuttersControl::shutters->getInTimerFuncHash;
|
||||
my $shuttersSunsetUnixtime =
|
||||
computeAlignTime( '24:00', sunset( 'REAL', 0, '15:30', '21:30' ) );
|
||||
|
||||
if ( $tm eq 'unix' ) {
|
||||
if ( $FHEM::Automation::ShuttersControl::shutters->getDown eq 'astro' ) {
|
||||
$shuttersSunsetUnixtime = (
|
||||
computeAlignTime(
|
||||
'24:00',
|
||||
sunset_abs(
|
||||
$autoAstroMode,
|
||||
0,
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeDownEarly,
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeDownLate
|
||||
)
|
||||
) + 1
|
||||
);
|
||||
if ( defined($oldFuncHash) && ref($oldFuncHash) eq 'HASH' ) {
|
||||
$shuttersSunsetUnixtime += 86400
|
||||
if ( $shuttersSunsetUnixtime <
|
||||
( $oldFuncHash->{sunsettime} + 180 )
|
||||
&& $oldFuncHash->{sunsettime} < gettimeofday() );
|
||||
}
|
||||
}
|
||||
elsif ( $FHEM::Automation::ShuttersControl::shutters->getDown eq 'time' ) {
|
||||
$shuttersSunsetUnixtime =
|
||||
computeAlignTime( '24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeDownEarly );
|
||||
}
|
||||
elsif ( $FHEM::Automation::ShuttersControl::shutters->getDown eq 'brightness' ) {
|
||||
$shuttersSunsetUnixtime =
|
||||
computeAlignTime( '24:00', $FHEM::Automation::ShuttersControl::shutters->getTimeDownLate );
|
||||
}
|
||||
return $shuttersSunsetUnixtime;
|
||||
}
|
||||
elsif ( $tm eq 'real' ) {
|
||||
return sunset_abs(
|
||||
$autoAstroMode, 0,
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeDownEarly,
|
||||
$FHEM::Automation::ShuttersControl::shutters->getTimeDownLate
|
||||
) if ( $FHEM::Automation::ShuttersControl::shutters->getDown eq 'astro' );
|
||||
return $FHEM::Automation::ShuttersControl::shutters->getTimeDownEarly
|
||||
if ( $FHEM::Automation::ShuttersControl::shutters->getDown eq 'time' );
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub IsAfterShuttersTimeBlocking {
|
||||
my $shuttersDev = shift;
|
||||
|
||||
$FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
|
||||
|
||||
if (
|
||||
( int( gettimeofday() ) - $FHEM::Automation::ShuttersControl::shutters->getLastManPosTimestamp ) <
|
||||
$FHEM::Automation::ShuttersControl::shutters->getBlockingTimeAfterManual
|
||||
|| ( !$FHEM::Automation::ShuttersControl::shutters->getIsDay
|
||||
&& defined( $FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime )
|
||||
&& $FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime - ( int( gettimeofday() ) ) <
|
||||
$FHEM::Automation::ShuttersControl::shutters->getBlockingTimeBeforDayOpen )
|
||||
|| ( $FHEM::Automation::ShuttersControl::shutters->getIsDay
|
||||
&& defined( $FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime )
|
||||
&& $FHEM::Automation::ShuttersControl::shutters->getSunsetUnixTime - ( int( gettimeofday() ) ) <
|
||||
$FHEM::Automation::ShuttersControl::shutters->getBlockingTimeBeforNightClose )
|
||||
)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
else { return 1 }
|
||||
}
|
||||
|
||||
sub IsAfterShuttersManualBlocking {
|
||||
my $shuttersDev = shift;
|
||||
$FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
|
||||
|
||||
if ( $FHEM::Automation::ShuttersControl::ascDev->getBlockAscDrivesAfterManual
|
||||
&& $FHEM::Automation::ShuttersControl::shutters->getStatus != $FHEM::Automation::ShuttersControl::shutters->getOpenPos
|
||||
&& $FHEM::Automation::ShuttersControl::shutters->getStatus != $FHEM::Automation::ShuttersControl::shutters->getClosedPos
|
||||
&& $FHEM::Automation::ShuttersControl::shutters->getStatus != $FHEM::Automation::ShuttersControl::shutters->getWindPos
|
||||
&& $FHEM::Automation::ShuttersControl::shutters->getStatus != $FHEM::Automation::ShuttersControl::shutters->getShadingPos
|
||||
&& $FHEM::Automation::ShuttersControl::shutters->getStatus != $FHEM::Automation::ShuttersControl::shutters->getComfortOpenPos
|
||||
&& $FHEM::Automation::ShuttersControl::shutters->getStatus != $FHEM::Automation::ShuttersControl::shutters->getVentilatePos
|
||||
&& $FHEM::Automation::ShuttersControl::shutters->getStatus != $FHEM::Automation::ShuttersControl::shutters->getAntiFreezePos
|
||||
&& $FHEM::Automation::ShuttersControl::shutters->getLastDrive eq 'manual' )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
elsif ( ( int( gettimeofday() ) - $FHEM::Automation::ShuttersControl::shutters->getLastManPosTimestamp ) <
|
||||
$FHEM::Automation::ShuttersControl::shutters->getBlockingTimeAfterManual )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
else { return 1 }
|
||||
}
|
||||
|
||||
sub makeReadingName {
|
||||
my ($rname) = shift;
|
||||
my %charHash = (
|
||||
chr(0xe4) => "ae", # ä
|
||||
chr(0xc4) => "Ae", # Ä
|
||||
chr(0xfc) => "ue", # ü
|
||||
chr(0xdc) => "Ue", # Ü
|
||||
chr(0xf6) => "oe", # ö
|
||||
chr(0xd6) => "Oe", # Ö
|
||||
chr(0xdf) => "ss" # ß
|
||||
);
|
||||
my $charHashkeys = join( "", keys(%charHash) );
|
||||
|
||||
return $rname if ( $rname =~ m{^\./}xms );
|
||||
$rname =~ s/([$charHashkeys])/$charHash{$1}/xgi;
|
||||
$rname =~ s/[^a-z0-9._\-\/]/_/xgi;
|
||||
return $rname;
|
||||
}
|
||||
|
||||
sub IsWe {
|
||||
return main::IsWe( shift, shift );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
1;
|
@ -45,22 +45,133 @@ use warnings;
|
||||
use POSIX qw(strftime);
|
||||
use utf8;
|
||||
|
||||
use GPUtils qw(GP_Import);
|
||||
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
|
||||
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
|
||||
|
@ -552,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 {
|
||||
|
Loading…
x
Reference in New Issue
Block a user