mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-01-31 12:49:34 +00:00
73_AutoShuttersControl: add new attribut ASC_Shading_MinMax_Elevation, many bugfixes
git-svn-id: https://svn.fhem.de/fhem/trunk@19594 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
e94bdcb70e
commit
1a8cbfc1b8
@ -1,5 +1,7 @@
|
|||||||
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
|
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
|
||||||
# Do not insert empty lines here, update check depends on it.
|
# Do not insert empty lines here, update check depends on it.
|
||||||
|
- feature: 73_AutoShuttersControl: add new attribut
|
||||||
|
ASC_Sgading_MinMax_Elevation, many bug fixes
|
||||||
- bugfix: 88_HMCCU: Fixed noInitialUpdate bug
|
- bugfix: 88_HMCCU: Fixed noInitialUpdate bug
|
||||||
- bugfix: 70_BOTVAC: set robotSounds filter
|
- bugfix: 70_BOTVAC: set robotSounds filter
|
||||||
- feature: 70_BOTVAC: add pollingMode
|
- feature: 70_BOTVAC: add pollingMode
|
||||||
|
@ -48,7 +48,7 @@ use strict;
|
|||||||
use warnings;
|
use warnings;
|
||||||
use FHEM::Meta;
|
use FHEM::Meta;
|
||||||
|
|
||||||
my $version = '0.6.16';
|
my $version = '0.6.17';
|
||||||
|
|
||||||
sub AutoShuttersControl_Initialize($) {
|
sub AutoShuttersControl_Initialize($) {
|
||||||
my ($hash) = @_;
|
my ($hash) = @_;
|
||||||
@ -119,8 +119,79 @@ use GPUtils qw(:all)
|
|||||||
use Data::Dumper; #only for Debugging
|
use Data::Dumper; #only for Debugging
|
||||||
use Date::Parse;
|
use Date::Parse;
|
||||||
|
|
||||||
my $missingModul = '';
|
# my $missingModul = '';
|
||||||
eval "use JSON qw(decode_json encode_json);1" or $missingModul .= 'JSON ';
|
# eval "use JSON qw(decode_json encode_json);1" or $missingModul .= 'JSON ';
|
||||||
|
|
||||||
|
# try to use JSON::MaybeXS wrapper
|
||||||
|
# for chance of better performance + open code
|
||||||
|
eval {
|
||||||
|
require JSON::MaybeXS;
|
||||||
|
import JSON::MaybeXS qw( decode_json encode_json );
|
||||||
|
1;
|
||||||
|
};
|
||||||
|
|
||||||
|
if ($@) {
|
||||||
|
$@ = undef;
|
||||||
|
|
||||||
|
# try to use JSON wrapper
|
||||||
|
# for chance of better performance
|
||||||
|
eval {
|
||||||
|
|
||||||
|
# JSON preference order
|
||||||
|
local $ENV{PERL_JSON_BACKEND} =
|
||||||
|
'Cpanel::JSON::XS,JSON::XS,JSON::PP,JSON::backportPP'
|
||||||
|
unless ( defined( $ENV{PERL_JSON_BACKEND} ) );
|
||||||
|
|
||||||
|
require JSON;
|
||||||
|
import JSON qw( decode_json encode_json );
|
||||||
|
1;
|
||||||
|
};
|
||||||
|
|
||||||
|
if ($@) {
|
||||||
|
$@ = undef;
|
||||||
|
|
||||||
|
# In rare cases, Cpanel::JSON::XS may
|
||||||
|
# be installed but JSON|JSON::MaybeXS not ...
|
||||||
|
eval {
|
||||||
|
require Cpanel::JSON::XS;
|
||||||
|
import Cpanel::JSON::XS qw(decode_json encode_json);
|
||||||
|
1;
|
||||||
|
};
|
||||||
|
|
||||||
|
if ($@) {
|
||||||
|
$@ = undef;
|
||||||
|
|
||||||
|
# In rare cases, JSON::XS may
|
||||||
|
# be installed but JSON not ...
|
||||||
|
eval {
|
||||||
|
require JSON::XS;
|
||||||
|
import JSON::XS qw(decode_json encode_json);
|
||||||
|
1;
|
||||||
|
};
|
||||||
|
|
||||||
|
if ($@) {
|
||||||
|
$@ = undef;
|
||||||
|
|
||||||
|
# Fallback to built-in JSON which SHOULD
|
||||||
|
# be available since 5.014 ...
|
||||||
|
eval {
|
||||||
|
require JSON::PP;
|
||||||
|
import JSON::PP qw(decode_json encode_json);
|
||||||
|
1;
|
||||||
|
};
|
||||||
|
|
||||||
|
if ($@) {
|
||||||
|
$@ = undef;
|
||||||
|
|
||||||
|
# Fallback to JSON::backportPP in really rare cases
|
||||||
|
require JSON::backportPP;
|
||||||
|
import JSON::backportPP qw(decode_json encode_json);
|
||||||
|
1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
## Import der FHEM Funktionen
|
## Import der FHEM Funktionen
|
||||||
BEGIN {
|
BEGIN {
|
||||||
@ -196,7 +267,7 @@ my %userAttrList = (
|
|||||||
'ASC_Shading_Angle_Right' => '-',
|
'ASC_Shading_Angle_Right' => '-',
|
||||||
'ASC_Shading_StateChange_Sunny' => '-',
|
'ASC_Shading_StateChange_Sunny' => '-',
|
||||||
'ASC_Shading_StateChange_Cloudy' => '-',
|
'ASC_Shading_StateChange_Cloudy' => '-',
|
||||||
'ASC_Shading_Min_Elevation' => '-',
|
'ASC_Shading_MinMax_Elevation' => '-',
|
||||||
'ASC_Shading_Min_OutsideTemperature' => '-',
|
'ASC_Shading_Min_OutsideTemperature' => '-',
|
||||||
'ASC_Shading_WaitingPeriod' => '-',
|
'ASC_Shading_WaitingPeriod' => '-',
|
||||||
'ASC_Drive_Offset' => '-',
|
'ASC_Drive_Offset' => '-',
|
||||||
@ -257,12 +328,13 @@ sub Define($$) {
|
|||||||
if ( devspec2array('TYPE=AutoShuttersControl') > 1 )
|
if ( devspec2array('TYPE=AutoShuttersControl') > 1 )
|
||||||
; # es wird geprüft ob bereits eine Instanz unseres Modules existiert,wenn ja wird abgebrochen
|
; # es wird geprüft ob bereits eine Instanz unseres Modules existiert,wenn ja wird abgebrochen
|
||||||
return 'too few parameters: define <name> ShuttersControl' if ( @a != 2 );
|
return 'too few parameters: define <name> ShuttersControl' if ( @a != 2 );
|
||||||
return
|
|
||||||
'Cannot define ShuttersControl device. Perl modul '
|
# return
|
||||||
. ${missingModul}
|
# 'Cannot define ShuttersControl device. Perl modul '
|
||||||
. 'is missing.'
|
# . ${missingModul}
|
||||||
if ($missingModul)
|
# . 'is missing.'
|
||||||
; # Abbruch wenn benötigte Hilfsmodule nicht vorhanden sind / vorerst unwichtig
|
# if ($missingModul)
|
||||||
|
# ; # Abbruch wenn benötigte Hilfsmodule nicht vorhanden sind / vorerst unwichtig
|
||||||
|
|
||||||
my $name = $a[0];
|
my $name = $a[0];
|
||||||
|
|
||||||
@ -844,8 +916,6 @@ sub AddNotifyDev($@) {
|
|||||||
%hash = map { ( $_ => 1 ) }
|
%hash = map { ( $_ => 1 ) }
|
||||||
split( ',', "$notifyDev,$dev" );
|
split( ',', "$notifyDev,$dev" );
|
||||||
|
|
||||||
my $match
|
|
||||||
; # CK: added local variable to save matched event type (open|opened|close|closed|tilt|tilted)
|
|
||||||
$hash->{NOTIFYDEV} = join( ',', sort keys %hash );
|
$hash->{NOTIFYDEV} = join( ',', sort keys %hash );
|
||||||
|
|
||||||
my @devs = split( ',', $dev );
|
my @devs = split( ',', $dev );
|
||||||
@ -892,7 +962,7 @@ sub EventProcessingWindowRec($@) {
|
|||||||
my ( $hash, $shuttersDev, $events ) = @_;
|
my ( $hash, $shuttersDev, $events ) = @_;
|
||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
|
|
||||||
if ( $events =~ m#.*state:.*(open(?>ed)?|closed?|tilt(?>ed)?)#
|
if ( $events =~ m#.*state:.*?([Oo]pen(?>ed)?|[Cc]losed?|tilt(?>ed)?)#
|
||||||
and IsAfterShuttersManualBlocking($shuttersDev) )
|
and IsAfterShuttersManualBlocking($shuttersDev) )
|
||||||
{
|
{
|
||||||
my $match = $1;
|
my $match = $1;
|
||||||
@ -912,9 +982,10 @@ sub EventProcessingWindowRec($@) {
|
|||||||
|
|
||||||
#### Hardware Lock der Rollläden
|
#### Hardware Lock der Rollläden
|
||||||
$shutters->setHardLockOut('off')
|
$shutters->setHardLockOut('off')
|
||||||
if ( $match =~ /close/ and $shutters->getShuttersPlace eq 'terrace' );
|
if ( $match =~ /[Cc]lose/
|
||||||
|
and $shutters->getShuttersPlace eq 'terrace' );
|
||||||
$shutters->setHardLockOut('on')
|
$shutters->setHardLockOut('on')
|
||||||
if ( $match =~ /open/
|
if ( $match =~ /[Oo]pen/
|
||||||
and $shutters->getShuttersPlace eq 'terrace' );
|
and $shutters->getShuttersPlace eq 'terrace' );
|
||||||
|
|
||||||
# my $queryShuttersPosWinRecTilted = (
|
# my $queryShuttersPosWinRecTilted = (
|
||||||
@ -939,7 +1010,7 @@ sub EventProcessingWindowRec($@) {
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (
|
if (
|
||||||
$match =~ /close/
|
$match =~ /[Cc]lose/
|
||||||
and IsAfterShuttersTimeBlocking($shuttersDev)
|
and IsAfterShuttersTimeBlocking($shuttersDev)
|
||||||
and ( $shutters->getStatus == $shutters->getVentilatePos
|
and ( $shutters->getStatus == $shutters->getVentilatePos
|
||||||
or $shutters->getStatus == $shutters->getComfortOpenPos
|
or $shutters->getStatus == $shutters->getComfortOpenPos
|
||||||
@ -991,7 +1062,7 @@ sub EventProcessingWindowRec($@) {
|
|||||||
elsif (
|
elsif (
|
||||||
(
|
(
|
||||||
$match =~ /tilt/
|
$match =~ /tilt/
|
||||||
or ( $match =~ /open/
|
or ( $match =~ /[Oo]pen/
|
||||||
and $shutters->getSubTyp eq 'twostate' )
|
and $shutters->getSubTyp eq 'twostate' )
|
||||||
)
|
)
|
||||||
and $shutters->getVentilateOpen eq 'on'
|
and $shutters->getVentilateOpen eq 'on'
|
||||||
@ -1002,7 +1073,7 @@ sub EventProcessingWindowRec($@) {
|
|||||||
$shutters->setNoOffset(1);
|
$shutters->setNoOffset(1);
|
||||||
$shutters->setDriveCmd( $shutters->getVentilatePos );
|
$shutters->setDriveCmd( $shutters->getVentilatePos );
|
||||||
}
|
}
|
||||||
elsif ( $match =~ /open/
|
elsif ( $match =~ /[Oo]pen/
|
||||||
and $shutters->getSubTyp eq 'threestate' )
|
and $shutters->getSubTyp eq 'threestate' )
|
||||||
{
|
{
|
||||||
my $posValue;
|
my $posValue;
|
||||||
@ -1951,6 +2022,7 @@ sub ShadingProcessing($@) {
|
|||||||
if ( $azimuth < $winPosMin
|
if ( $azimuth < $winPosMin
|
||||||
or $azimuth > $winPosMax
|
or $azimuth > $winPosMax
|
||||||
or $elevation < $shutters->getShadingMinElevation
|
or $elevation < $shutters->getShadingMinElevation
|
||||||
|
or $elevation > $shutters->getShadingMaxElevation
|
||||||
or $brightness < $shutters->getShadingStateChangeCloudy
|
or $brightness < $shutters->getShadingStateChangeCloudy
|
||||||
or $outTemp < $shutters->getShadingMinOutsideTemperature )
|
or $outTemp < $shutters->getShadingMinOutsideTemperature )
|
||||||
{
|
{
|
||||||
@ -1986,6 +2058,7 @@ sub ShadingProcessing($@) {
|
|||||||
elsif ( $azimuth > $winPosMin
|
elsif ( $azimuth > $winPosMin
|
||||||
and $azimuth < $winPosMax
|
and $azimuth < $winPosMax
|
||||||
and $elevation > $shutters->getShadingMinElevation
|
and $elevation > $shutters->getShadingMinElevation
|
||||||
|
and $elevation < $shutters->getShadingMaxElevation
|
||||||
and $brightness > $shutters->getShadingStateChangeSunny
|
and $brightness > $shutters->getShadingStateChangeSunny
|
||||||
and $outTemp > $shutters->getShadingMinOutsideTemperature )
|
and $outTemp > $shutters->getShadingMinOutsideTemperature )
|
||||||
{
|
{
|
||||||
@ -2036,14 +2109,14 @@ sub ShadingProcessingDriveCommand($$) {
|
|||||||
if ( $shutters->getShadingStatus eq 'in'
|
if ( $shutters->getShadingStatus eq 'in'
|
||||||
and $getShadingPos != $getStatus )
|
and $getShadingPos != $getStatus )
|
||||||
{
|
{
|
||||||
my $queryShuttersShadingPos = (
|
# my $queryShuttersShadingPos = (
|
||||||
$shutters->getShuttersPosCmdValueNegate
|
# $shutters->getShuttersPosCmdValueNegate
|
||||||
? $getStatus > $getShadingPos
|
# ? $getStatus > $getShadingPos
|
||||||
: $getStatus < $getShadingPos
|
# : $getStatus < $getShadingPos
|
||||||
);
|
# );
|
||||||
|
|
||||||
if (
|
if (
|
||||||
not $queryShuttersShadingPos
|
not $shutters->getQueryShuttersPos( $shutters->getShadingPos )
|
||||||
and not( CheckIfShuttersWindowRecOpen($shuttersDev) == 2
|
and not( CheckIfShuttersWindowRecOpen($shuttersDev) == 2
|
||||||
and $shutters->getShuttersPlace eq 'terrace' )
|
and $shutters->getShuttersPlace eq 'terrace' )
|
||||||
)
|
)
|
||||||
@ -2233,7 +2306,7 @@ sub ShuttersCommandSet($$$) {
|
|||||||
)
|
)
|
||||||
or ( CheckIfShuttersWindowRecOpen($shuttersDev) == 2
|
or ( CheckIfShuttersWindowRecOpen($shuttersDev) == 2
|
||||||
and $shutters->getShuttersPlace eq 'terrace'
|
and $shutters->getShuttersPlace eq 'terrace'
|
||||||
and not $shutters->getQueryShuttersPos($posValue) )
|
and $shutters->getQueryShuttersPos($posValue) )
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
@ -2356,11 +2429,9 @@ sub CreateSunRiseSetShuttersTimer($$) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
InternalTimer( $shuttersSunsetUnixtime,
|
InternalTimer( $shuttersSunsetUnixtime,
|
||||||
'FHEM::AutoShuttersControl::SunSetShuttersAfterTimerFn', \%funcHash )
|
'FHEM::AutoShuttersControl::SunSetShuttersAfterTimerFn', \%funcHash );
|
||||||
if ( $ascDev->getAutoShuttersControlEvening eq 'on' );
|
|
||||||
InternalTimer( $shuttersSunriseUnixtime,
|
InternalTimer( $shuttersSunriseUnixtime,
|
||||||
'FHEM::AutoShuttersControl::SunRiseShuttersAfterTimerFn', \%funcHash )
|
'FHEM::AutoShuttersControl::SunRiseShuttersAfterTimerFn', \%funcHash );
|
||||||
if ( $ascDev->getAutoShuttersControlMorning eq 'on' );
|
|
||||||
|
|
||||||
$ascDev->setStateReading('created new drive timer');
|
$ascDev->setStateReading('created new drive timer');
|
||||||
}
|
}
|
||||||
@ -2394,7 +2465,12 @@ sub RenewSunRiseSetShuttersTimer($) {
|
|||||||
# ; # temporär muss später gelöscht werden ab Version 0.4.11beta9
|
# ; # temporär muss später gelöscht werden ab Version 0.4.11beta9
|
||||||
# delFromDevAttrList( $_, 'ASC_BrightnessMaxVal' )
|
# delFromDevAttrList( $_, 'ASC_BrightnessMaxVal' )
|
||||||
# ; # temporär muss später gelöscht werden ab Version 0.4.11beta9
|
# ; # temporär muss später gelöscht werden ab Version 0.4.11beta9
|
||||||
|
$attr{$_}{'ASC_Shading_MinMax_Elevation'} =
|
||||||
|
AttrVal( $_, 'ASC_Shading_Min_Elevation', 'none' )
|
||||||
|
if ( AttrVal( $_, 'ASC_Shading_Min_Elevation', 'none' ) ne 'none' );
|
||||||
|
|
||||||
|
delFromDevAttrList( $_, 'ASC_Shading_Min_Elevation' )
|
||||||
|
; # temporär muss später gelöscht werden ab Version 0.6.17
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2480,13 +2556,14 @@ sub SunSetShuttersAfterTimerFn($) {
|
|||||||
$homemode = $ascDev->getResidentsStatus if ( $homemode eq 'none' );
|
$homemode = $ascDev->getResidentsStatus if ( $homemode eq 'none' );
|
||||||
|
|
||||||
if (
|
if (
|
||||||
(
|
$ascDev->getAutoShuttersControlEvening eq 'on'
|
||||||
|
and IsAfterShuttersManualBlocking($shuttersDev)
|
||||||
|
and (
|
||||||
$shutters->getModeDown eq $homemode
|
$shutters->getModeDown eq $homemode
|
||||||
or ( $shutters->getModeDown eq 'absent'
|
or ( $shutters->getModeDown eq 'absent'
|
||||||
and $homemode eq 'gone' )
|
and $homemode eq 'gone' )
|
||||||
or $shutters->getModeDown eq 'always'
|
or $shutters->getModeDown eq 'always'
|
||||||
)
|
)
|
||||||
and IsAfterShuttersManualBlocking($shuttersDev)
|
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
# my $queryShuttersPosPrivacyDown = (
|
# my $queryShuttersPosPrivacyDown = (
|
||||||
@ -2526,12 +2603,16 @@ sub SunRiseShuttersAfterTimerFn($) {
|
|||||||
$homemode = $ascDev->getResidentsStatus if ( $homemode eq 'none' );
|
$homemode = $ascDev->getResidentsStatus if ( $homemode eq 'none' );
|
||||||
|
|
||||||
if (
|
if (
|
||||||
|
$ascDev->getAutoShuttersControlMorning eq 'on'
|
||||||
|
and (
|
||||||
$shutters->getModeUp eq $homemode
|
$shutters->getModeUp eq $homemode
|
||||||
or ( $shutters->getModeUp eq 'absent'
|
or ( $shutters->getModeUp eq 'absent'
|
||||||
and $homemode eq 'gone' )
|
and $homemode eq 'gone' )
|
||||||
or $shutters->getModeUp eq 'always'
|
or $shutters->getModeUp eq 'always'
|
||||||
)
|
)
|
||||||
|
)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (
|
if (
|
||||||
(
|
(
|
||||||
$shutters->getRoommatesStatus eq 'home'
|
$shutters->getRoommatesStatus eq 'home'
|
||||||
@ -2552,6 +2633,7 @@ sub SunRiseShuttersAfterTimerFn($) {
|
|||||||
ShuttersCommandSet( $hash, $shuttersDev, $shutters->getOpenPos );
|
ShuttersCommandSet( $hash, $shuttersDev, $shutters->getOpenPos );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CreateSunRiseSetShuttersTimer( $hash, $shuttersDev );
|
CreateSunRiseSetShuttersTimer( $hash, $shuttersDev );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3365,7 +3447,7 @@ sub CheckIfShuttersWindowRecOpen($) {
|
|||||||
my $shuttersDev = shift;
|
my $shuttersDev = shift;
|
||||||
$shutters->setShuttersDev($shuttersDev);
|
$shutters->setShuttersDev($shuttersDev);
|
||||||
|
|
||||||
if ( $shutters->getWinStatus =~ /open/ ) # CK: covers: open|opened
|
if ( $shutters->getWinStatus =~ /[Oo]pen/ ) # CK: covers: open|opened
|
||||||
{
|
{
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
@ -3374,7 +3456,7 @@ sub CheckIfShuttersWindowRecOpen($) {
|
|||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
elsif ( $shutters->getWinStatus =~ /close/ ) {
|
elsif ( $shutters->getWinStatus =~ /[Cc]lose/ ) {
|
||||||
return 0;
|
return 0;
|
||||||
} # CK: covers: close|closed
|
} # CK: covers: close|closed
|
||||||
}
|
}
|
||||||
@ -4089,15 +4171,13 @@ sub _getBrightnessSensor {
|
|||||||
|
|
||||||
### erwartetes Ergebnis
|
### erwartetes Ergebnis
|
||||||
# DEVICE:READING MAX:MIN
|
# DEVICE:READING MAX:MIN
|
||||||
|
|
||||||
return $device if ( $device eq 'none' );
|
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{device} = $device;
|
$self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{device} = $device;
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{reading} =
|
$self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{reading} =
|
||||||
( $reading ne 'none' ? $reading : 'brightness' );
|
( $reading ne 'none' ? $reading : 'brightness' );
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{triggermin} =
|
$self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{triggermin} =
|
||||||
( $min ne 'none' ? $min : '-1' );
|
( $min ne 'none' ? $min : -1 );
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{triggermax} =
|
$self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{triggermax} =
|
||||||
( $max ne 'none' ? $max : '-1' );
|
( $max ne 'none' ? $max : -1 );
|
||||||
|
|
||||||
return $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{device};
|
return $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{device};
|
||||||
}
|
}
|
||||||
@ -4154,7 +4234,53 @@ sub getShadingMinOutsideTemperature {
|
|||||||
sub getShadingMinElevation {
|
sub getShadingMinElevation {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_Shading_Min_Elevation', 25.0 );
|
return $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
|
||||||
|
->{minVal}
|
||||||
|
if (
|
||||||
|
exists(
|
||||||
|
$self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
|
||||||
|
->{LASTGETTIME}
|
||||||
|
)
|
||||||
|
and ( gettimeofday() -
|
||||||
|
$self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
|
||||||
|
->{LASTGETTIME} ) < 2
|
||||||
|
);
|
||||||
|
$self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
|
||||||
|
->{LASTGETTIME} = int( gettimeofday() );
|
||||||
|
my ( $min, $max ) =
|
||||||
|
FHEM::AutoShuttersControl::GetAttrValues( $self->{shuttersDev},
|
||||||
|
'ASC_Shading_MinMax_Elevation', '25.0:100.0' );
|
||||||
|
|
||||||
|
### erwartetes Ergebnis
|
||||||
|
# MIN:MAX
|
||||||
|
|
||||||
|
$self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}->{minVal} =
|
||||||
|
$min;
|
||||||
|
$self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}->{maxVal} =
|
||||||
|
( $max ne 'none' ? $max : 100 );
|
||||||
|
|
||||||
|
return $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
|
||||||
|
->{minVal};
|
||||||
|
}
|
||||||
|
|
||||||
|
sub getShadingMaxElevation {
|
||||||
|
my $self = shift;
|
||||||
|
|
||||||
|
return $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
|
||||||
|
->{maxVal}
|
||||||
|
if (
|
||||||
|
exists(
|
||||||
|
$self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
|
||||||
|
->{LASTGETTIME}
|
||||||
|
)
|
||||||
|
and ( gettimeofday() -
|
||||||
|
$self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
|
||||||
|
->{LASTGETTIME} ) < 2
|
||||||
|
);
|
||||||
|
$shutters->getShadingMinElevation;
|
||||||
|
|
||||||
|
return $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
|
||||||
|
->{maxVal};
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getShadingStateChangeSunny {
|
sub getShadingStateChangeSunny {
|
||||||
@ -5157,7 +5283,8 @@ sub getblockAscDrivesAfterManual {
|
|||||||
=pod
|
=pod
|
||||||
=item device
|
=item device
|
||||||
=item summary Module for controlling shutters depending on various conditions
|
=item summary Module for controlling shutters depending on various conditions
|
||||||
=item summary_DE Modul zur Automatischen Rolladensteuerung auf Basis bestimmter Ereignisse
|
=item summary_DE Modul zur automatischen Rolladensteuerung auf Basis bestimmter Ereignisse
|
||||||
|
|
||||||
|
|
||||||
=begin html
|
=begin html
|
||||||
|
|
||||||
@ -5315,21 +5442,21 @@ sub getblockAscDrivesAfterManual {
|
|||||||
if the <em>ASC_autoAstroModeMorning</em> attribute is set to <em>HORIZON</em>. Defaults to <em>0</em>.
|
if the <em>ASC_autoAstroModeMorning</em> attribute is set to <em>HORIZON</em>. Defaults to <em>0</em>.
|
||||||
</li>
|
</li>
|
||||||
<a name="ASC_autoShuttersControlComfort"></a>
|
<a name="ASC_autoShuttersControlComfort"></a>
|
||||||
<li><strong>ASC_autoShuttersControlComfort - on/off</strong> -
|
<li><strong>ASC_autoShuttersControlComfort - on|off</strong> -
|
||||||
Controls the comfort functions: If a three state sensor, like the <abbr>HmIP-SRH</abbr> window handle
|
Controls the comfort functions: If a three state sensor, like the <abbr>HmIP-SRH</abbr> window handle
|
||||||
sensor, is installed, <abbr>ASC</abbr> will open the window if the sensor signals open position. The
|
sensor, is installed, <abbr>ASC</abbr> will open the window if the sensor signals open position. The
|
||||||
<em>ASC_ComfortOpen_Pos</em> attribute has to be set for the shutter to <em>on</em>, defaults to <em>off</em>.
|
<em>ASC_ComfortOpen_Pos</em> attribute has to be set for the shutter to <em>on</em>, defaults to <em>off</em>.
|
||||||
</li>
|
</li>
|
||||||
<a name="ASC_autoShuttersControlEvening"></a>
|
<a name="ASC_autoShuttersControlEvening"></a>
|
||||||
<li><strong>ASC_autoShuttersControlEvening - on/off</strong> - Enables the automatic control by <abbr>ASC</abbr>
|
<li><strong>ASC_autoShuttersControlEvening - on|off</strong> - Enables the automatic control by <abbr>ASC</abbr>
|
||||||
at the evenings.
|
at the evenings.
|
||||||
</li>
|
</li>
|
||||||
<a name="ASC_autoShuttersControlMorning"></a>
|
<a name="ASC_autoShuttersControlMorning"></a>
|
||||||
<li><strong>ASC_autoShuttersControlMorning - on/off</strong> - Enables the automatic control by <abbr>ASC</abbr>
|
<li><strong>ASC_autoShuttersControlMorning - on|off</strong> - Enables the automatic control by <abbr>ASC</abbr>
|
||||||
at the mornings.
|
at the mornings.
|
||||||
</li>
|
</li>
|
||||||
<a name="ASC_blockAscDrivesAfterManual"></a>
|
<a name="ASC_blockAscDrivesAfterManual"></a>
|
||||||
<li><strong>ASC_blockAscDrivesAfterManual - 0,1</strong> - If set to <em>1</em>, <abbr>ASC</abbr> will not
|
<li><strong>ASC_blockAscDrivesAfterManual 0|1</strong> - If set to <em>1</em>, <abbr>ASC</abbr> will not
|
||||||
automatically control a shutter if there was an manual control to the shutter. To be considered, the
|
automatically control a shutter if there was an manual control to the shutter. To be considered, the
|
||||||
<em>ASC_ShuttersLastDrive</em> reading has to contain the value <em>manual</em> and the shutter is in
|
<em>ASC_ShuttersLastDrive</em> reading has to contain the value <em>manual</em> and the shutter is in
|
||||||
an unknown (i.e. not otherwise configured in <abbr>ASC</abbr>) position.
|
an unknown (i.e. not otherwise configured in <abbr>ASC</abbr>) position.
|
||||||
@ -5411,7 +5538,7 @@ sub getblockAscDrivesAfterManual {
|
|||||||
|
|
||||||
<p>At shutter devices, controlled by <abbr>ASC</abbr>:</p>
|
<p>At shutter devices, controlled by <abbr>ASC</abbr>:</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li><strong>ASC - 0/1/2</strong>
|
<li><strong>ASC - 0|1|2</strong>
|
||||||
<ul>
|
<ul>
|
||||||
<li>0 - don't create attributes for <abbr>ASC</abbr> at the first scan and don't be controlled
|
<li>0 - don't create attributes for <abbr>ASC</abbr> at the first scan and don't be controlled
|
||||||
by <abbr>ASC</abbr></li>
|
by <abbr>ASC</abbr></li>
|
||||||
@ -5421,7 +5548,7 @@ sub getblockAscDrivesAfterManual {
|
|||||||
controlled by <em><abbr>pct</abbr></em> values.</li>
|
controlled by <em><abbr>pct</abbr></em> values.</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><strong>ASC_Antifreeze - soft/am/pm/hard/off</strong> - Freeze protection.
|
<li><strong>ASC_Antifreeze - soft|am|pm|hard|off</strong> - Freeze protection.
|
||||||
<ul>
|
<ul>
|
||||||
<li>soft - see <em>ASC_Antifreeze_Pos</em>.</li>
|
<li>soft - see <em>ASC_Antifreeze_Pos</em>.</li>
|
||||||
<li>hard / <abbr>am</abbr> / <abbr>pm</abbr> - freeze protection will be active (everytime,
|
<li>hard / <abbr>am</abbr> / <abbr>pm</abbr> - freeze protection will be active (everytime,
|
||||||
@ -5643,8 +5770,8 @@ sub getblockAscDrivesAfterManual {
|
|||||||
points. East is 90 °, South 180 °, West is 270 ° and North is 0 °.
|
points. East is 90 °, South 180 °, West is 270 ° and North is 0 °.
|
||||||
Defaults to South (180).
|
Defaults to South (180).
|
||||||
</li>
|
</li>
|
||||||
<li><strong>ASC_Shading_Min_Elevation</strong> - Shading starts as this point of sun elevation is
|
<li><strong>ASC_Shading_MinMax_Elevation</strong> - Shading starts as min point of sun elevation is
|
||||||
reached, depending also on other sensor values. Defaults to 25.0.
|
reached and end as max point of sun elevation is reached, depending also on other sensor values. Defaults to 25.0:100.0.
|
||||||
</li>
|
</li>
|
||||||
<li><strong>ASC_Shading_Min_OutsideTemperature</strong> - Shading starts at this outdoor temperature,
|
<li><strong>ASC_Shading_Min_OutsideTemperature</strong> - Shading starts at this outdoor temperature,
|
||||||
depending also on other sensor values. Defaults to 18.0.
|
depending also on other sensor values. Defaults to 18.0.
|
||||||
@ -5978,10 +6105,10 @@ sub getblockAscDrivesAfterManual {
|
|||||||
<li><strong>ASC_Pos_Reading</strong> - Name des Readings, welches die Position des Rollladen in Prozent an gibt; wird bei unbekannten Device Typen auch als set Befehl zum fahren verwendet</li>
|
<li><strong>ASC_Pos_Reading</strong> - Name des Readings, welches die Position des Rollladen in Prozent an gibt; wird bei unbekannten Device Typen auch als set Befehl zum fahren verwendet</li>
|
||||||
<li><strong>ASC_PrivacyDownTime_beforNightClose</strong> - wie viele Sekunden vor dem abendlichen schließen soll der Rollladen in die Sichtschutzposition fahren, -1 bedeutet das diese Funktion unbeachtet bleiben soll (default: -1)</li>
|
<li><strong>ASC_PrivacyDownTime_beforNightClose</strong> - wie viele Sekunden vor dem abendlichen schließen soll der Rollladen in die Sichtschutzposition fahren, -1 bedeutet das diese Funktion unbeachtet bleiben soll (default: -1)</li>
|
||||||
<li><strong>ASC_PrivacyDown_Pos</strong> - Position den Rollladens für den Sichtschutz (default: 50)</li>
|
<li><strong>ASC_PrivacyDown_Pos</strong> - Position den Rollladens für den Sichtschutz (default: 50)</li>
|
||||||
<li><strong>ASC_WindProtection - on/off</strong> - soll der Rollladen beim Regenschutz beachtet werden. On=JA, off=NEIN.</li>
|
<li><strong>ASC_WindProtection - on/off</strong> - soll der Rollladen beim Regenschutz beachtet werden. on=JA, off=NEIN.</li>
|
||||||
<li><strong>ASC_Roommate_Device</strong> - mit Komma getrennte Namen des/der Roommate Device/s, welche den/die Bewohner des Raumes vom Rollladen wiedergibt. Es macht nur Sinn in Schlaf- oder Kinderzimmern (default: none)</li>
|
<li><strong>ASC_Roommate_Device</strong> - mit Komma getrennte Namen des/der Roommate Device/s, welche den/die Bewohner des Raumes vom Rollladen wiedergibt. Es macht nur Sinn in Schlaf- oder Kinderzimmern (default: none)</li>
|
||||||
<li><strong>ASC_Roommate_Reading</strong> - das Reading zum Roommate Device, welches den Status wieder gibt (default: state)</li>
|
<li><strong>ASC_Roommate_Reading</strong> - das Reading zum Roommate Device, welches den Status wieder gibt (default: state)</li>
|
||||||
<li><strong>SC_Self_Defense_Exclude - on/off</strong> - bei on Wert wird dieser Rollladen bei aktiven Self Defense und offenen Fenster nicht runter gefahren, wenn Residents absent ist. (default: off)</li></p>
|
<li><strong>ASC_Self_Defense_Exclude - on/off</strong> - bei on Wert wird dieser Rollladen bei aktiven Self Defense und offenen Fenster nicht runter gefahren, wenn Residents absent ist. (default: off)</li></p>
|
||||||
<ul>
|
<ul>
|
||||||
<strong><u>Beschreibung der Beschattungsfunktion</u></strong>
|
<strong><u>Beschreibung der Beschattungsfunktion</u></strong>
|
||||||
</br>Damit die Beschattung Funktion hat, müssen folgende Anforderungen erfüllt sein.
|
</br>Damit die Beschattung Funktion hat, müssen folgende Anforderungen erfüllt sein.
|
||||||
@ -5991,7 +6118,7 @@ sub getblockAscDrivesAfterManual {
|
|||||||
<li><strong>ASC_Shading_Angle_Left</strong> - Vorlaufwinkel im Bezug zum Fenster, ab wann abgeschattet wird. Beispiel: Fenster 180° - 85° ==> ab Sonnenpos. 95° wird abgeschattet (default: 75)</li>
|
<li><strong>ASC_Shading_Angle_Left</strong> - Vorlaufwinkel im Bezug zum Fenster, ab wann abgeschattet wird. Beispiel: Fenster 180° - 85° ==> ab Sonnenpos. 95° wird abgeschattet (default: 75)</li>
|
||||||
<li><strong>ASC_Shading_Angle_Right</strong> - Nachlaufwinkel im Bezug zum Fenster, bis wann abgeschattet wird. Beispiel: Fenster 180° + 85° ==> bis Sonnenpos. 265° wird abgeschattet (default: 75)</li>
|
<li><strong>ASC_Shading_Angle_Right</strong> - Nachlaufwinkel im Bezug zum Fenster, bis wann abgeschattet wird. Beispiel: Fenster 180° + 85° ==> bis Sonnenpos. 265° wird abgeschattet (default: 75)</li>
|
||||||
<li><strong>ASC_Shading_Direction</strong> - Position in Grad, auf der das Fenster liegt - genau Osten wäre 90, Süden 180 und Westen 270 (default: 180)</li>
|
<li><strong>ASC_Shading_Direction</strong> - Position in Grad, auf der das Fenster liegt - genau Osten wäre 90, Süden 180 und Westen 270 (default: 180)</li>
|
||||||
<li><strong>ASC_Shading_Min_Elevation</strong> - ab welcher Höhe des Sonnenstandes soll beschattet werden, immer in Abhängigkeit der anderen einbezogenen Sensorwerte (default: 25.0)</li>
|
<li><strong>ASC_Shading_MinMax_Elevation</strong> - ab welcher min Höhe des Sonnenstandes soll beschattet und ab welcher max Höhe wieder beendet werden, immer in Abhängigkeit der anderen einbezogenen Sensorwerte (default: 25.0:100.0)</li>
|
||||||
<li><strong>ASC_Shading_Min_OutsideTemperature</strong> - ab welcher Temperatur soll Beschattet werden, immer in Abhängigkeit der anderen einbezogenen Sensorwerte (default: 18)</li>
|
<li><strong>ASC_Shading_Min_OutsideTemperature</strong> - ab welcher Temperatur soll Beschattet werden, immer in Abhängigkeit der anderen einbezogenen Sensorwerte (default: 18)</li>
|
||||||
<li><strong>ASC_Shading_Mode - absent,always,off,home</strong> / wann soll die Beschattung nur stattfinden. (default: off)</li>
|
<li><strong>ASC_Shading_Mode - absent,always,off,home</strong> / wann soll die Beschattung nur stattfinden. (default: off)</li>
|
||||||
<li><strong>ASC_Shading_Pos</strong> - Position des Rollladens für die Beschattung</li>
|
<li><strong>ASC_Shading_Pos</strong> - Position des Rollladens für die Beschattung</li>
|
||||||
@ -6099,7 +6226,8 @@ sub getblockAscDrivesAfterManual {
|
|||||||
"FHEM": 5.00918799,
|
"FHEM": 5.00918799,
|
||||||
"perl": 5.016,
|
"perl": 5.016,
|
||||||
"Meta": 0,
|
"Meta": 0,
|
||||||
"JSON": 0
|
"JSON": 0,
|
||||||
|
"Date::Parse": 0
|
||||||
},
|
},
|
||||||
"recommends": {
|
"recommends": {
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user