add first function's for shading

This commit is contained in:
Marko Oldenburg 2018-11-14 03:41:38 +01:00
parent e24142ac78
commit 0f936d88e9

View File

@ -41,7 +41,7 @@ package main;
use strict; use strict;
use warnings; use warnings;
my $version = "0.2.1dev11"; my $version = "0.2.1dev22";
sub AutoShuttersControl_Initialize($) { sub AutoShuttersControl_Initialize($) {
my ($hash) = @_; my ($hash) = @_;
@ -168,14 +168,13 @@ my %userAttrList = (
'ASC_lock-out:soft,hard' => 'soft', 'ASC_lock-out:soft,hard' => 'soft',
'ASC_lock-outCmd:inhibit,blocked' => 'none', 'ASC_lock-outCmd:inhibit,blocked' => 'none',
# 'ASC_Shading_Direction' => 178, 'ASC_Shading_Direction' => 178,
# 'ASC_Shading_Pos:10,20,30,40,50,60,70,80,90,100' => 30, 'ASC_Shading_Pos:10,20,30,40,50,60,70,80,90,100' => [ '', 70, 30 ],
# 'ASC_Shading:on,off,delayed,present,absent' => 'off', 'ASC_Shading_Mode:on,off,home,absent' => 'off',
# 'ASC_Shading_Pos_after_Shading:-1,0,10,20,30,40,50,60,70,80,90,100' => -1, 'ASC_Shading_Angle_Left:0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90'
# 'ASC_Shading_Angle_Left:0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90' => 85,
# => 85, 'ASC_Shading_Angle_Right:0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90'
# 'ASC_Shading_Angle_Right:0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90' => 85,
# => 85,
'ASC_Shading_Brightness_Sensor' => 'none', 'ASC_Shading_Brightness_Sensor' => 'none',
'ASC_Shading_Brightness_Reading' => 'brightness', 'ASC_Shading_Brightness_Reading' => 'brightness',
@ -214,6 +213,7 @@ my %posSetCmds = (
tahoma => 'dim', tahoma => 'dim',
KLF200Node => 'pct', KLF200Node => 'pct',
DUOFERN => 'position', DUOFERN => 'position',
UNIRoll => 'pos',
); );
my $shutters = new ASC_Shutters(); my $shutters = new ASC_Shutters();
@ -449,15 +449,22 @@ sub EventProcessingGeneral($$$) {
if ( $deviceAttr eq 'ASC_residentsDevice' ); if ( $deviceAttr eq 'ASC_residentsDevice' );
EventProcessingRain( $hash, $device, $events ) EventProcessingRain( $hash, $device, $events )
if ( $deviceAttr eq 'ASC_rainSensorDevice' ); if ( $deviceAttr eq 'ASC_rainSensorDevice' );
EventProcessingTwilightDevice( $hash, $device, $events )
if ( $deviceAttr eq 'ASC_twilightDevice' );
$shutters->setShuttersDev($device) $shutters->setShuttersDev($device)
if ( $deviceAttr eq 'ASC_Shading_Brightness_Sensor' ); if ( $deviceAttr eq 'ASC_Shading_Brightness_Sensor' );
EventProcessingBrightness( $hash, $device, $events )
if ( if (
$deviceAttr eq 'ASC_Shading_Brightness_Sensor' $deviceAttr eq 'ASC_Shading_Brightness_Sensor'
and ( $shutters->getDown eq 'brightness' and ( $shutters->getDown eq 'brightness'
or $shutters->getUp eq 'brightness' ) or $shutters->getUp eq 'brightness' )
); ) {
EventProcessingBrightness( $hash, $device, $events );
}
elsif ( $deviceAttr eq 'ASC_Shading_Brightness_Sensor' ) {
EventProcessingShadingBrightness( $hash, $device, $events );
}
} }
} }
else { # alles was kein Devicenamen mit übergeben hat landet hier else { # alles was kein Devicenamen mit übergeben hat landet hier
@ -679,7 +686,9 @@ sub ShuttersDeviceScan($) {
$shutters->setNoOffset(0); $shutters->setNoOffset(0);
$shutters->setPosSetCmd( $posSetCmds{ $defs{$_}->{TYPE} } ); $shutters->setPosSetCmd( $posSetCmds{ $defs{$_}->{TYPE} } );
} }
$hash->{NOTIFYDEV} = $hash->{NOTIFYDEV} . $shuttersList; # $hash->{NOTIFYDEV} = $hash->{NOTIFYDEV} . $shuttersList;
$hash->{NOTIFYDEV} = "global," . $name . $shuttersList;
if ( $ascDev->getMonitoredDevs ne 'none' ) { if ( $ascDev->getMonitoredDevs ne 'none' ) {
$hash->{monitoredDevs} = $hash->{monitoredDevs} =
@ -1132,7 +1141,7 @@ sub EventProcessingBrightness($@) {
my $name = $hash->{NAME}; my $name = $hash->{NAME};
$shutters->setShuttersDev($shuttersDev); $shutters->setShuttersDev($shuttersDev);
return return EventProcessingShadingBrightness($hash, $shuttersDev, $events)
unless ( unless (
int( gettimeofday() / 86400 ) != int( gettimeofday() / 86400 ) !=
int( computeAlignTime( '24:00', $shutters->getTimeUpEarly ) / 86400 ) int( computeAlignTime( '24:00', $shutters->getTimeUpEarly ) / 86400 )
@ -1177,7 +1186,6 @@ sub EventProcessingBrightness($@) {
or $homemode eq 'none' or $homemode eq 'none'
or $shutters->getModeUp eq 'always' ) or $shutters->getModeUp eq 'always' )
{ {
ShuttersCommandSet( $hash, $shuttersDev, $shutters->getOpenPos )
if ( if (
( (
$shutters->getRoommatesStatus eq 'home' $shutters->getRoommatesStatus eq 'home'
@ -1189,7 +1197,9 @@ sub EventProcessingBrightness($@) {
and $ascDev->getSelfDefense eq 'off' and $ascDev->getSelfDefense eq 'off'
or ( $ascDev->getSelfDefense eq 'on' or ( $ascDev->getSelfDefense eq 'on'
and CheckIfShuttersWindowRecOpen($shuttersDev) == 0 ) and CheckIfShuttersWindowRecOpen($shuttersDev) == 0 )
); ) {
ShuttersCommandSet( $hash, $shuttersDev, $shutters->getOpenPos );
} else { EventProcessingShadingBrightness($hash, $shuttersDev, $events); }
} }
} }
elsif ( elsif (
@ -1220,14 +1230,75 @@ sub EventProcessingBrightness($@) {
if ( $homemode eq 'none' ); if ( $homemode eq 'none' );
$shutters->setLastDrive('minimum brightness threshold fell below'); $shutters->setLastDrive('minimum brightness threshold fell below');
ShuttersCommandSet( $hash, $shuttersDev, $shutters->getClosedPos )
if ( $shutters->getModeDown eq $homemode if ( $shutters->getModeDown eq $homemode
or $homemode eq 'none' or $homemode eq 'none'
or $shutters->getModeDown eq 'always' ); or $shutters->getModeDown eq 'always'
) {
ShuttersCommandSet( $hash, $shuttersDev, $shutters->getClosedPos );
} else { EventProcessingShadingBrightness($hash, $shuttersDev, $events); }
} }
} else { EventProcessingShadingBrightness($hash, $shuttersDev, $events); }
}
sub EventProcessingShadingBrightness($@) {
my ( $hash, $shuttersDev, $events ) = @_;
my $name = $hash->{NAME};
$shutters->setShuttersDev($shuttersDev);
my $reading = $shutters->getShadingBrightnessReading;
if ( $events =~ m#$reading:\s(\d+)# ) {
ShadingProcessing($hash,$shuttersDev,$ascDev->getAzimuth,$ascDev->getElevation,$1,$ascDev->getOutTemp,$shutters->getDirection,$shutters->getShadingAngleLeft,$shutters->getShadingAngleRight)
if ( $shutters->getShadingMode eq 'on' or $shutters->getShadingMode eq $ascDev->getResidentsStatus );
} }
} }
sub EventProcessingTwilightDevice($@) {
my ( $hash, $device, $events ) = @_;
my $name = $device;
my ($azimuth,$elevation, $outTemp, $brightness);
# Twilight
# azimuth = azimuth = Sonnenwinkel
# elevation = elevation = Sonnenhöhe
#
# Astro
# SunAz = azimuth = Sonnenwinkel
# SunAlt = evaluation = Sonnenhöhe
if ( $events =~ m#([a-zA-Z]+):\s(\d+.\d+)# ) {
$azimuth = $2 if ( $1 eq 'azimuth' );
$azimuth = $2 if ( $1 eq 'SunAz' );
$elevation = $2 if ( $1 eq 'evaluation' );
$elevation = $2 if ( $1 eq 'SunAlt' );
}
$azimuth = $ascDev->getAzimuth if (not defined($azimuth) and not $azimuth );
$elevation = $ascDev->getElevation if (not defined($elevation) and not $elevation );
foreach my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
$shutters->setShuttersDev($shuttersDev);
ShadingProcessing($hash,$shuttersDev,$azimuth,$elevation,$shutters->getBrightness,$ascDev->getOutTemp,$shutters->getDirection,$shutters->getShadingAngleLeft,$shutters->getShadingAngleRight)
if ( $shutters->getShadingMode eq 'on' or $shutters->getShadingMode eq $ascDev->getResidentsStatus );
}
}
sub ShadingProcessing($@) {
my ($hash,$shuttersDev,$azimuth,$elevation,$brightness,$outTemp,$shuttersDirection,$shuttersShadingAngleLeft,$shuttersShadingAngleRight) = @_;
my $name = $hash->{NAME};
Log3( $name, 3,
"AutoShuttersControl ($name) - Shading Processing, Rollladen: " . $shuttersDev
);
# ShuttersDev
# Aussentemperatur
# azimuth
# elevation
# Himmelsrichtung des Fensters
# Eintrittswinkel
# Ausstrittswinkel
# Brightness
}
sub EventProcessingPartyMode($) { sub EventProcessingPartyMode($) {
my ($hash) = @_; my ($hash) = @_;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
@ -1583,6 +1654,9 @@ sub CreateNewNotifyDev($) {
AddNotifyDev( $hash, AttrVal( $name, 'ASC_rainSensorDevice', 'none' ), AddNotifyDev( $hash, AttrVal( $name, 'ASC_rainSensorDevice', 'none' ),
$name, 'ASC_rainSensorDevice' ) $name, 'ASC_rainSensorDevice' )
if ( AttrVal( $name, 'ASC_rainSensorDevice', 'none' ) ne 'none' ); if ( AttrVal( $name, 'ASC_rainSensorDevice', 'none' ) ne 'none' );
AddNotifyDev( $hash, AttrVal( $name, 'ASC_twilightDevice', 'none' ),
$name, 'ASC_rainSensorDevice' )
if ( AttrVal( $name, 'ASC_rainSensorDevice', 'none' ) ne 'none' );
$hash->{NOTIFYDEV} = $hash->{NOTIFYDEV} . $shuttersList; $hash->{NOTIFYDEV} = $hash->{NOTIFYDEV} . $shuttersList;
} }
@ -2110,10 +2184,6 @@ sub SetCmdFn($) {
. $posValue ); . $posValue );
} }
sub EventProcessingTwilightDevice() {
}
########## Begin der Klassendeklarierungen für OOP (Objektorientierte Programmierung) ######################### ########## Begin der Klassendeklarierungen für OOP (Objektorientierte Programmierung) #########################
## Klasse Rolläden (Shutters) und die Subklassen Attr und Readings ## ## Klasse Rolläden (Shutters) und die Subklassen Attr und Readings ##
## desweiteren wird noch die Klasse ASC_Roommate mit eingebunden ## desweiteren wird noch die Klasse ASC_Roommate mit eingebunden
@ -2449,7 +2519,23 @@ sub getWiggleValue {
return AttrVal( $self->{shuttersDev}, 'ASC_WiggleValue', 5 ); return AttrVal( $self->{shuttersDev}, 'ASC_WiggleValue', 5 );
} }
sub getShadingBrightnessSensor { sub getShadingPos {
my $self = shift;
my $default = $self->{defaultarg};
$default = 10 if ( not defined($default) );
return AttrVal( $self->{shuttersDev}, 'ASC_Shading_Pos', $default );
}
sub getShadingMode {
my $self = shift;
my $default = $self->{defaultarg};
$default = 'off' if ( not defined($default) );
return AttrVal( $self->{shuttersDev}, 'ASC_Shading_Mode', $default );
}
sub _getShadingBrightnessSensor {
my $self = shift; my $self = shift;
my $default = $self->{defaultarg}; my $default = $self->{defaultarg};
@ -2679,7 +2765,7 @@ BEGIN {
sub getBrightness { sub getBrightness {
my $self = shift; my $self = shift;
return ReadingsVal( $shutters->getShadingBrightnessSensor, return ReadingsVal( $shutters->_getShadingBrightnessSensor,
$shutters->getShadingBrightnessReading, 0 ); $shutters->getShadingBrightnessReading, 0 );
} }
@ -2916,14 +3002,12 @@ sub getMonitoredDevs {
sub getOutTemp { sub getOutTemp {
my $self = shift; my $self = shift;
my $name = $self->{name};
return ReadingsVal( $ascDev->_getTempSensor, $ascDev->getTempReading, 100 ); return ReadingsVal( $ascDev->_getTempSensor, $ascDev->getTempReading, 100 );
} }
sub getResidentsStatus { sub getResidentsStatus {
my $self = shift; my $self = shift;
my $name = $self->{name};
return ReadingsVal( $ascDev->_getResidentsDev, $ascDev->getResidentsReading, return ReadingsVal( $ascDev->_getResidentsDev, $ascDev->getResidentsReading,
'none' ); 'none' );
@ -2931,7 +3015,6 @@ sub getResidentsStatus {
sub getResidentsLastStatus { sub getResidentsLastStatus {
my $self = shift; my $self = shift;
my $name = $self->{name};
return ReadingsVal( $ascDev->_getResidentsDev, 'lastState', 'none' ); return ReadingsVal( $ascDev->_getResidentsDev, 'lastState', 'none' );
} }
@ -2943,6 +3026,34 @@ sub getSelfDefense {
return ReadingsVal( $name, 'selfDefense', 'none' ); return ReadingsVal( $name, 'selfDefense', 'none' );
} }
sub getAzimuth {
my $self = shift;
my $name = $self->{name};
my $hash = $defs{$name};
ReadingsVal( $ascDev->_getTwilightDevice, , -1 );
return
}
sub getElevation {
my $self = shift;
my $name = $self->{name};
my $hash = $defs{$name};
ReadingsVal( $ascDev->_getTwilightDevice, , -1 );
return
}
## Subklasse Attr ## ## Subklasse Attr ##
package ASC_Dev::Attr; package ASC_Dev::Attr;
@ -2984,6 +3095,13 @@ sub getBrightnessMaxVal {
return AttrVal( $name, 'ASC_brightnessMaxVal', $default ); return AttrVal( $name, 'ASC_brightnessMaxVal', $default );
} }
sub _getTwilightDevice {
my $self = shift;
my $name = $self->{name};
return AttrVal( $name, 'ASC_twilightDevice', 'none' );
}
sub getAutoAstroModeEvening { sub getAutoAstroModeEvening {
my $self = shift; my $self = shift;
my $name = $self->{name}; my $name = $self->{name};