2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-09 20:57:11 +00:00

73_AutoShuttersControl: add roommate value for ASC_Up/Down for only Roommate shutters drive

git-svn-id: https://svn.fhem.de/fhem/trunk@20147 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
LeonGaultier 2019-09-11 07:04:55 +00:00
parent 8889804b9a
commit c2c44718d6
2 changed files with 155 additions and 45 deletions

View File

@ -1,5 +1,7 @@
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
# Do not insert empty lines here, update check depends on it.
- feature 73_AutoShuttersControl: add roommate value for ASC_Up/Down for
Roommate only shutter drive
- feature: 70_KODI: Added fetching of channel names and command openchannel to
open channel by names. Channel IDs will be converted
automatically.

View File

@ -169,7 +169,9 @@ BEGIN {
delFromDevAttrList
delFromAttrList
gettimeofday
sunset
sunset_abs
sunrise
sunrise_abs
InternalTimer
RemoveInternalTimer
@ -190,8 +192,8 @@ GP_Export(
my %userAttrList = (
'ASC_Mode_Up:absent,always,off,home' => '-',
'ASC_Mode_Down:absent,always,off,home' => '-',
'ASC_Up:time,astro,brightness' => '-',
'ASC_Down:time,astro,brightness' => '-',
'ASC_Up:time,astro,brightness,roommate' => '-',
'ASC_Down:time,astro,brightness,roommate' => '-',
'ASC_AutoAstroModeMorning:REAL,CIVIL,NAUTIC,ASTRONOMIC,HORIZON' => '-',
'ASC_AutoAstroModeMorningHorizon:-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9'
=> '-',
@ -706,8 +708,26 @@ sub ShuttersDeviceScan($) {
push( @{ $hash->{helper}{shuttersList} }, $_ )
; ## einem Hash wird ein Array zugewiesen welches die Liste der erkannten Rollos beinhaltet
$shuttersList = $shuttersList . ',' . $_;
$shutters->setShuttersDev($_);
#### Ab hier können temporäre Änderungen der Attribute gesetzt werden
#### Gleichlautende Attribute wo lediglich die Parameter geändert werden sollen müssen hier gelöscht und die Parameter in der Funktion renewSetSunriseSunsetTimer gesetzt werden,
#### vorher empfiehlt es sich die dort vergebenen Parameter aus zu lesen um sie dann hier wieder neu zu setzen. Dazu wird das shutters Objekt um einen Eintrag
#### 'AttrUpdateChanges' erweitert
if ( ReadingsVal( $_, '.ASC_AttrUpdateChanges_' . $hash->{VERSION}, 0 )
== 0 )
{
$shutters->setAttrUpdateChanges( 'ASC_Up',
AttrVal( $_, 'ASC_Up', 'none' ) );
delFromDevAttrList( $_, 'ASC_Up' );
$shutters->setAttrUpdateChanges( 'ASC_Down',
AttrVal( $_, 'ASC_Down', 'none' ) );
delFromDevAttrList( $_, 'ASC_Down' );
}
####
$shuttersList = $shuttersList . ',' . $_;
$shutters->setLastManPos( $shutters->getStatus );
$shutters->setLastPos( $shutters->getStatus );
$shutters->setDelayCmd('none');
@ -720,6 +740,7 @@ sub ShuttersDeviceScan($) {
$shutters->setShadingLastStatus(
( $shutters->getStatus != $shutters->getShadingPos ? 'in' : 'out' )
);
$shutters->setPushBrightnessInArray( $shutters->getBrightness );
readingsSingleUpdate( $defs{$_}, 'ASC_Enable', 'on', 0 )
if ( ReadingsVal( $_, 'ASC_Enable', 'none' ) eq 'none' );
}
@ -828,8 +849,7 @@ sub UserAttributs_Readings_ForShutters($$) {
$shutters->setShuttersDev($_);
RemoveInternalTimer( $shutters->getInTimerFuncHash );
CommandDeleteReading( undef,
$_ . ' .?(AutoShuttersControl|ASC)_.*' );
CommandDeleteReading( undef, $_ . ' .?(ASC)_.*' );
CommandDeleteAttr( undef, $_ . ' ASC' );
delFromDevAttrList( $_, $attrib );
@ -1091,10 +1111,6 @@ sub EventProcessingRoommate($@) {
and ( $getRoommatesStatus eq 'home'
or $getRoommatesStatus eq 'awoken' )
and $ascDev->getAutoShuttersControlMorning eq 'on'
and ( $getModeUp eq 'home'
or $getModeUp eq 'always'
or $getModeDown eq 'home'
or $getModeDown eq 'always' )
and IsAfterShuttersManualBlocking($shuttersDev)
)
{
@ -1108,8 +1124,6 @@ sub EventProcessingRoommate($@) {
)
and $shutters->getIsDay
and IsAfterShuttersTimeBlocking($shuttersDev)
and ( $getModeUp eq 'home'
or $getModeUp eq 'always' )
)
{
Log3( $name, 4,
@ -1201,15 +1215,9 @@ sub EventProcessingRoommate($@) {
}
}
}
elsif (
(
$getModeDown eq 'always'
or $getModeDown eq 'home'
)
and ( $1 eq 'gotosleep' or $1 eq 'asleep' )
elsif ( ( $1 eq 'gotosleep' or $1 eq 'asleep' )
and $ascDev->getAutoShuttersControlEvening eq 'on'
and IsAfterShuttersManualBlocking($shuttersDev)
)
and IsAfterShuttersManualBlocking($shuttersDev) )
{
$shutters->setLastDrive('roommate asleep');
@ -1863,10 +1871,13 @@ sub EventProcessingShadingBrightness($@) {
Brightness: " . $1
);
## Brightness Wert in ein Array schieben zur Berechnung eines Average Wertes
$shutters->setPushBrightnessInArray($1);
ASC_Debug( 'EventProcessingShadingBrightness: '
. $shutters->getShuttersDev
. ' - Nummerischer Brightness-Wert wurde erkannt. Der Wert ist: '
. $1
. ' - Nummerischer Brightness-Wert wurde erkannt. Der Brightness Average Wert ist: '
. $shutters->getBrightnessAverage
. ' RainProtection: '
. $shutters->getRainProtectionStatus
. ' WindProtection: '
@ -1883,7 +1894,6 @@ sub EventProcessingShadingBrightness($@) {
$shuttersDev,
$ascDev->getAzimuth,
$ascDev->getElevation,
$1,
$outTemp,
$shutters->getDirection,
$shutters->getShadingAngleLeft,
@ -1956,7 +1966,6 @@ sub EventProcessingTwilightDevice($@) {
$shuttersDev,
$azimuth,
$elevation,
$shutters->getBrightness,
$outTemp,
$shutters->getDirection,
$shutters->getShadingAngleLeft,
@ -1976,12 +1985,12 @@ sub ShadingProcessing($@) {
### angleMinus ist $shutters->getShadingAngleLeft
### anglePlus ist $shutters->getShadingAngleRight
### winPos ist die Fensterposition $shutters->getDirection
my (
$hash, $shuttersDev, $azimuth, $elevation, $brightness,
$outTemp, $winPos, $angleMinus, $anglePlus
) = @_;
my ( $hash, $shuttersDev, $azimuth, $elevation, $outTemp,
$winPos, $angleMinus, $anglePlus )
= @_;
my $name = $hash->{NAME};
$shutters->setShuttersDev($shuttersDev);
my $brightness = $shutters->getBrightnessAverage;
ASC_Debug(
'ShadingProcessing: '
@ -2450,8 +2459,11 @@ sub CreateSunRiseSetShuttersTimer($$) {
'ASC_Time_DriveDown',
(
$ascDev->getAutoShuttersControlEvening eq 'on'
? strftime(
"%e.%m.%Y - %H:%M", localtime($shuttersSunsetUnixtime)
? (
$shutters->getDown eq 'roommate' ? 'roommate only' : strftime(
"%e.%m.%Y - %H:%M",
localtime($shuttersSunsetUnixtime)
)
)
: 'AutoShuttersControl off'
)
@ -2461,8 +2473,12 @@ sub CreateSunRiseSetShuttersTimer($$) {
'ASC_Time_DriveUp',
(
$ascDev->getAutoShuttersControlMorning eq 'on'
? strftime( "%e.%m.%Y - %H:%M",
localtime($shuttersSunriseUnixtime) )
? (
$shutters->getUp eq 'roommate' ? 'roommate only' : strftime(
"%e.%m.%Y - %H:%M",
localtime($shuttersSunriseUnixtime)
)
)
: 'AutoShuttersControl off'
)
);
@ -2523,6 +2539,12 @@ sub CreateSunRiseSetShuttersTimer($$) {
$shutters->setPrivacyDownStatus(1);
}
}
else {
CommandDeleteReading( undef,
$shuttersDev . ' ASC_Time_PrivacyDriveDown' )
if (
ReadingsVal( $shuttersDev, 'ASC_Time_PrivacyDriveDown', 'none' ) );
}
InternalTimer( $shuttersSunsetUnixtime,
'FHEM::AutoShuttersControl::SunSetShuttersAfterTimerFn', \%funcHash );
@ -2543,13 +2565,36 @@ sub RenewSunRiseSetShuttersTimer($) {
$shutters->setInTimerFuncHash(undef);
CreateSunRiseSetShuttersTimer( $hash, $_ );
# ### Temporär angelegt damit die neue Attributs Parameter Syntax verteilt werden kann
$attr{$_}{'ASC_Shading_MinMax_Elevation'} =
AttrVal( $_, 'ASC_Shading_Min_Elevation', 'none' )
if ( AttrVal( $_, 'ASC_Shading_Min_Elevation', 'none' ) ne 'none' );
#### Temporär angelegt damit die neue Attributs Parameter Syntax verteilt werden kann
#### Gleichlautende Attribute wo lediglich die Parameter geändert werden sollen müssen bereits in der Funktion ShuttersDeviceScan gelöscht werden
#### vorher empfiehlt es sich die dort vergebenen Parameter aus zu lesen um sie dann hier wieder neu zu setzen. Dazu wird das shutters Objekt um einen Eintrag
#### 'AttrUpdateChanges' erweitert
if ( ( int( gettimeofday() ) - $::fhem_started ) < 20
and
ReadingsVal( $_, '.ASC_AttrUpdateChanges_' . $hash->{VERSION}, 0 )
== 0 )
{
$attr{$_}{'ASC_Up'} = $shutters->getAttrUpdateChanges('ASC_Up')
if ( $shutters->getAttrUpdateChanges('ASC_Up') ne 'none' );
$attr{$_}{'ASC_Down'} = $shutters->getAttrUpdateChanges('ASC_Down')
if ( $shutters->getAttrUpdateChanges('ASC_Down') ne 'none' );
delFromDevAttrList( $_, 'ASC_Shading_Min_Elevation' )
; # temporär muss später gelöscht werden ab Version 0.6.17
CommandDeleteReading( undef, $_ . ' .ASC_AttrUpdateChanges_.*' )
if (
ReadingsVal( $_, '.ASC_AttrUpdateChanges_' . $hash->{VERSION},
'none' ) eq 'none'
);
readingsSingleUpdate( $defs{$_},
'.ASC_AttrUpdateChanges_' . $hash->{VERSION},
1, 0 );
# $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
}
}
}
@ -2623,7 +2668,8 @@ sub SunSetShuttersAfterTimerFn($) {
$homemode = $ascDev->getResidentsStatus if ( $homemode eq 'none' );
if (
$ascDev->getAutoShuttersControlEvening eq 'on'
$shutters->getDown ne 'roommate'
and $ascDev->getAutoShuttersControlEvening eq 'on'
and IsAfterShuttersManualBlocking($shuttersDev)
and (
$shutters->getModeDown eq $homemode
@ -2647,7 +2693,10 @@ sub SunSetShuttersAfterTimerFn($) {
$shutters->setPrivacyDownStatus(2);
$shutters->setLastDrive('privacy position');
ShuttersCommandSet( $hash, $shuttersDev,
$shutters->getPrivacyDownPos );
$shutters->getPrivacyDownPos )
unless (
$shutters->getQueryShuttersPos( $shutters->getPrivacyDownPos )
);
}
else {
$shutters->setPrivacyDownStatus(0);
@ -2675,7 +2724,8 @@ sub SunRiseShuttersAfterTimerFn($) {
$homemode = $ascDev->getResidentsStatus if ( $homemode eq 'none' );
if (
$ascDev->getAutoShuttersControlMorning eq 'on'
$shutters->getUp ne 'roommate'
and $ascDev->getAutoShuttersControlMorning eq 'on'
and (
$shutters->getModeUp eq $homemode
or ( $shutters->getModeUp eq 'absent'
@ -3134,7 +3184,8 @@ sub ShuttersSunrise($$) {
if ( $autoAstroMode eq 'HORIZON' );
}
my $oldFuncHash = $shutters->getInTimerFuncHash;
my $shuttersSunriseUnixtime;
my $shuttersSunriseUnixtime =
computeAlignTime( '24:00', sunrise( 'REAL', 0, '4:30', '8:30' ) );
if ( $tm eq 'unix' ) {
if ( $shutters->getUp eq 'astro' ) {
@ -3525,7 +3576,8 @@ sub ShuttersSunset($$) {
if ( $autoAstroMode eq 'HORIZON' );
}
my $oldFuncHash = $shutters->getInTimerFuncHash;
my $shuttersSunsetUnixtime;
my $shuttersSunsetUnixtime =
computeAlignTime( '24:00', sunset( 'REAL', 0, '15:30', '21:30' ) );
if ( $tm eq 'unix' ) {
if ( $shutters->getDown eq 'astro' ) {
@ -3697,6 +3749,13 @@ sub ASC_Debug($) {
);
}
sub _averageBrightness(@) {
my @input = @_;
use List::Util qw(sum);
return int( sum(@input) / @input );
}
######################################
######################################
########## Begin der Klassendeklarierungen für OOP (Objektorientierte Programmierung) #########################
@ -3751,6 +3810,13 @@ sub getShuttersDev {
return $self->{shuttersDev};
}
sub setAttrUpdateChanges {
my ( $self, $attr, $value ) = @_;
$self->{ $self->{shuttersDev} }{AttrUpdateChanges}{$attr} = $value;
return 0;
}
sub setHardLockOut {
my ( $self, $cmd ) = @_;
@ -3980,6 +4046,15 @@ sub getPrivacyDownStatus {
);
}
sub getAttrUpdateChanges {
my ( $self, $attr ) = @_;
return $self->{ $self->{shuttersDev} }{AttrUpdateChanges}{$attr}
if ( defined( $self->{ $self->{shuttersDev} }{AttrUpdateChanges} )
and
defined( $self->{ $self->{shuttersDev} }{AttrUpdateChanges}{$attr} ) );
}
sub getIsDay {
my $self = shift;
@ -4259,6 +4334,37 @@ sub setRainProtectionStatus { # Werte protected, unprotected
return 0;
}
sub setPushBrightnessInArray {
my ( $self, $value ) = @_;
unshift(
@{ $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL} },
$value
);
pop( @{ $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL} } )
if (
scalar(
@{
$self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL}
}
) > 3
);
}
sub getBrightnessAverage {
my $self = shift;
return &FHEM::AutoShuttersControl::_averageBrightness(
@{ $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL} } )
if (
scalar(
@{
$self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL}
}
) > 0
);
}
sub getShadingStatus { # Werte für value = in, out, in reserved, out reserved
my $self = shift;
@ -5903,12 +6009,13 @@ sub getblockAscDrivesAfterManual {
<li><strong>ASC_ComfortOpen_Pos</strong> - The comfort opening position, ranging
from 0 to 100 percent in increments of 10. Default: depends on the <em>ASC</em> attribute.
</li>
<li><strong>ASC_Down - astro|time|brightness</strong> - Drive the shutter depending on this setting:
<li><strong>ASC_Down - astro|time|brightness|roommate</strong> - Drive the shutter depending on this setting:
<ul>
<li>astro - drive down at sunset</li>
<li>time - drive at <em>ASC_Time_Down_Early</em></li>
<li>brightness - drive between <em>ASC_Time_Down_Early</em> and <em>ASC_Time_Down_Late</em>,
depending on the settings of <em>ASC_BrightnessSensor</em> (see above).</li>
<li>roommate - no drive by time or brightness, roommate trigger only</li>
</ul>
Defaults to <em>astro</em>.
</li>
@ -6015,12 +6122,13 @@ sub getblockAscDrivesAfterManual {
If <em>ASC_Up</em> set to <em>brightness</em>, the time for <em>ASC_Time_Up_WE_Holiday</em>
must be earlier then <em>ASC_Time_Up_Late</em>.
</li>
<li><strong>ASC_Up astro|time|brightness</strong> - Drive the shutter depending on this setting:
<li><strong>ASC_Up astro|time|brightness|roommate</strong> - Drive the shutter depending on this setting:
<ul>
<li>astro - drive up at sunrise</li>
<li>time - drive at <em>ASC_Time_Up_Early</em></li>
<li>brightness - drive between <em>ASC_Time_Up_Early</em> and <em>ASC_Time_Up_Late</em>,
depending on the settings of <em>ASC_BrightnessSensor</em> (see above).</li>
<li>roommate - no drive by time or brightness, roommate trigger only</li>
</ul>
Defaults to <em>astro</em>.
</li>
@ -6545,7 +6653,7 @@ sub getblockAscDrivesAfterManual {
],
"release_status": "under develop",
"license": "GPL_2",
"version": "v0.6.30",
"version": "v0.6.31",
"x_developmentversion": "v0.6.19.34",
"author": [
"Marko Oldenburg <leongaultier@gmail.com>"