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

git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@20147 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
LeonGaultier 2019-09-11 07:04:55 +00:00
parent b56db54c2c
commit c1239ffb83
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. # 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 roommate value for ASC_Up/Down for
Roommate only shutter drive
- feature: 70_KODI: Added fetching of channel names and command openchannel to - feature: 70_KODI: Added fetching of channel names and command openchannel to
open channel by names. Channel IDs will be converted open channel by names. Channel IDs will be converted
automatically. automatically.

View File

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