From 3023b3fedf71b5cb7923e5a33e7512206b6c87e5 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Mon, 19 Aug 2019 10:50:34 +0200 Subject: [PATCH 1/8] fix #50, fix Roommate absent bug --- 73_AutoShuttersControl.pm | 42 ++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index 3783d2d..1acccfb 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -1061,15 +1061,16 @@ sub EventProcessingRoommate($@) { "AutoShuttersControl ($name) - EventProcessingRoommate: $shuttersDev und Events $events" ); - my $getModeUp = $shutters->getModeUp; - my $getModeDown = $shutters->getModeDown; - my $getRoommatesLastStatus = $shutters->getRoommatesLastStatus; + my $getModeUp = $shutters->getModeUp; + my $getModeDown = $shutters->getModeDown; + my $getRoommatesStatus = $shutters->getRoommatesStatus; + my $getRoommatesLastStatus = $shutters->getRoommatesLastStatus; my $posValue; if ( ( $1 eq 'home' or $1 eq 'awoken' ) - and ( $shutters->getRoommatesStatus eq 'home' - or $shutters->getRoommatesStatus eq 'awoken' ) + and ( $getRoommatesStatus eq 'home' + or $getRoommatesStatus eq 'awoken' ) and $ascDev->getAutoShuttersControlMorning eq 'on' and ( $getModeUp eq 'home' or $getModeUp eq 'always' @@ -1115,7 +1116,7 @@ sub EventProcessingRoommate($@) { $getRoommatesLastStatus eq 'absent' or $getRoommatesLastStatus eq 'gone' ) - and $shutters->getRoommatesStatus eq 'home' + and $getRoommatesStatus eq 'home' ) { if ( @@ -1206,9 +1207,7 @@ sub EventProcessingRoommate($@) { ShuttersCommandSet( $hash, $shuttersDev, $posValue ); } - elsif ( - $getModeDown eq 'absent' - and $1 eq 'absent' + elsif ( $1 eq 'absent' and ( not $shutters->getIsDay or $shutters->getShadingMode eq 'absent' ) ) @@ -1223,7 +1222,10 @@ sub EventProcessingRoommate($@) { $shutters->setLastDrive('shading in'); ShuttersCommandSet( $hash, $shuttersDev, $posValue ); } - elsif ( not $shutters->getIsDay ) { + elsif ( not $shutters->getIsDay + and $getModeDown eq 'absent' + and $getRoommatesStatus eq 'absent' ) + { $posValue = $shutters->getClosedPos; $shutters->setLastDrive('roommate absent'); ShuttersCommandSet( $hash, $shuttersDev, $posValue ); @@ -2598,6 +2600,13 @@ sub SunSetShuttersAfterTimerFn($) { and $homemode eq 'gone' ) or $shutters->getModeDown eq 'always' ) + and ( $ascDev->getSelfDefense eq 'off' + or $shutters->getSelfDefenseExclude eq 'on' + or ($ascDev->getSelfDefense eq 'on' + and ($ascDev->getResidentsStatus ne 'absent' + or $ascDev->getResidentsStatus ne 'gone') + ) + ) ) { @@ -2645,6 +2654,13 @@ sub SunRiseShuttersAfterTimerFn($) { and $homemode eq 'gone' ) or $shutters->getModeUp eq 'always' ) + and ( $ascDev->getSelfDefense eq 'off' + or $shutters->getSelfDefenseExclude eq 'on' + or ($ascDev->getSelfDefense eq 'on' + and $ascDev->getResidentsStatus ne 'absent' + and $ascDev->getResidentsStatus ne 'gone' + ) + ) ) { @@ -2662,7 +2678,9 @@ sub SunRiseShuttersAfterTimerFn($) { and CheckIfShuttersWindowRecOpen($shuttersDev) == 0 ) or ( $ascDev->getSelfDefense eq 'on' and CheckIfShuttersWindowRecOpen($shuttersDev) != 0 - and $ascDev->getResidentsStatus eq 'home' ) + and ( $ascDev->getResidentsStatus ne 'absent' + or $ascDev->getResidentsStatus ne 'gone' ) + ) ) ) { @@ -6495,7 +6513,7 @@ sub getblockAscDrivesAfterManual { ], "release_status": "under develop", "license": "GPL_2", - "version": "v0.6.27", + "version": "v0.6.28", "x_developmentversion": "v0.6.19.34", "author": [ "Marko Oldenburg " From 75437ab2028331d0f2b401cf038a9a9a3abfed6c Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Tue, 20 Aug 2019 08:52:46 +0200 Subject: [PATCH 2/8] fix selfDefense and Residents home coming then is night --- 73_AutoShuttersControl.pm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index 1acccfb..b24cebf 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -1382,14 +1382,15 @@ sub EventProcessingResidents($@) { and not $shutters->getSelfDefenseAbsent and $shutters->getSelfDefenseAbsentTimerrun ); - if ( $shutters->getStatus == $shutters->getClosedPos ) { + if ( $shutters->getStatus == $shutters->getClosedPos + and $shutters->getIsDay ) + { $shutters->setHardLockOut('on') if ( CheckIfShuttersWindowRecOpen($shuttersDev) == 2 and $shutters->getShuttersPlace eq 'terrace' and ( $getModeUp eq 'absent' or $getModeUp eq 'off' ) - and CheckIfShuttersWindowRecOpen($shuttersDev) != 0 ); $shutters->setLastDrive('selfDefense inactive'); From a158862210bab586121b706ee84cd982a0c84eef Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Thu, 22 Aug 2019 06:19:31 +0200 Subject: [PATCH 3/8] remove winrec check then privacy drive down --- 73_AutoShuttersControl.pm | 61 +++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 31 deletions(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index b24cebf..4771e2c 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -1061,10 +1061,10 @@ sub EventProcessingRoommate($@) { "AutoShuttersControl ($name) - EventProcessingRoommate: $shuttersDev und Events $events" ); - my $getModeUp = $shutters->getModeUp; - my $getModeDown = $shutters->getModeDown; - my $getRoommatesStatus = $shutters->getRoommatesStatus; - my $getRoommatesLastStatus = $shutters->getRoommatesLastStatus; + my $getModeUp = $shutters->getModeUp; + my $getModeDown = $shutters->getModeDown; + my $getRoommatesStatus = $shutters->getRoommatesStatus; + my $getRoommatesLastStatus = $shutters->getRoommatesLastStatus; my $posValue; if ( @@ -1207,7 +1207,8 @@ sub EventProcessingRoommate($@) { ShuttersCommandSet( $hash, $shuttersDev, $posValue ); } - elsif ( $1 eq 'absent' + elsif ( + $1 eq 'absent' and ( not $shutters->getIsDay or $shutters->getShadingMode eq 'absent' ) ) @@ -1382,8 +1383,8 @@ sub EventProcessingResidents($@) { and not $shutters->getSelfDefenseAbsent and $shutters->getSelfDefenseAbsentTimerrun ); - if ( $shutters->getStatus == $shutters->getClosedPos - and $shutters->getIsDay ) + if ( $shutters->getStatus == $shutters->getClosedPos + and $shutters->getIsDay ) { $shutters->setHardLockOut('on') if ( @@ -2601,12 +2602,14 @@ sub SunSetShuttersAfterTimerFn($) { and $homemode eq 'gone' ) or $shutters->getModeDown eq 'always' ) - and ( $ascDev->getSelfDefense eq 'off' - or $shutters->getSelfDefenseExclude eq 'on' - or ($ascDev->getSelfDefense eq 'on' - and ($ascDev->getResidentsStatus ne 'absent' - or $ascDev->getResidentsStatus ne 'gone') - ) + and ( + $ascDev->getSelfDefense eq 'off' + or $shutters->getSelfDefenseExclude eq 'on' + or ( + $ascDev->getSelfDefense eq 'on' + and ( $ascDev->getResidentsStatus ne 'absent' + or $ascDev->getResidentsStatus ne 'gone' ) + ) ) ) { @@ -2614,13 +2617,8 @@ sub SunSetShuttersAfterTimerFn($) { if ( $shutters->getPrivacyDownStatus == 1 ) { $shutters->setPrivacyDownStatus(2); $shutters->setLastDrive('privacy position'); - ShuttersCommandSet( - $hash, - $shuttersDev, - PositionValueWindowRec( - $shuttersDev, $shutters->getPrivacyDownPos - ) - ); + ShuttersCommandSet( $hash, $shuttersDev, + $shutters->getPrivacyDownPos ); } else { $shutters->setPrivacyDownStatus(0); @@ -2655,12 +2653,12 @@ sub SunRiseShuttersAfterTimerFn($) { and $homemode eq 'gone' ) or $shutters->getModeUp eq 'always' ) - and ( $ascDev->getSelfDefense eq 'off' - or $shutters->getSelfDefenseExclude eq 'on' - or ($ascDev->getSelfDefense eq 'on' - and $ascDev->getResidentsStatus ne 'absent' - and $ascDev->getResidentsStatus ne 'gone' - ) + and ( + $ascDev->getSelfDefense eq 'off' + or $shutters->getSelfDefenseExclude eq 'on' + or ( $ascDev->getSelfDefense eq 'on' + and $ascDev->getResidentsStatus ne 'absent' + and $ascDev->getResidentsStatus ne 'gone' ) ) ) { @@ -2677,11 +2675,12 @@ sub SunRiseShuttersAfterTimerFn($) { $ascDev->getSelfDefense eq 'off' or ( $ascDev->getSelfDefense eq 'on' and CheckIfShuttersWindowRecOpen($shuttersDev) == 0 ) - or ( $ascDev->getSelfDefense eq 'on' + or ( + $ascDev->getSelfDefense eq 'on' and CheckIfShuttersWindowRecOpen($shuttersDev) != 0 - and ( $ascDev->getResidentsStatus ne 'absent' - or $ascDev->getResidentsStatus ne 'gone' ) - ) + and ( $ascDev->getResidentsStatus ne 'absent' + or $ascDev->getResidentsStatus ne 'gone' ) + ) ) ) { @@ -6514,7 +6513,7 @@ sub getblockAscDrivesAfterManual { ], "release_status": "under develop", "license": "GPL_2", - "version": "v0.6.28", + "version": "v0.6.29", "x_developmentversion": "v0.6.19.34", "author": [ "Marko Oldenburg " From 1729e8eba1721546f7d0133093568814efa90947 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Thu, 22 Aug 2019 17:09:50 +0200 Subject: [PATCH 4/8] add EnOcean TYP support --- 73_AutoShuttersControl.pm | 1 + 1 file changed, 1 insertion(+) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index 4771e2c..4566c5e 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -262,6 +262,7 @@ my %posSetCmds = ( HM485 => 'level', SELVECommeo => 'position', SELVE => 'position', + EnOcean => 'position', ); my $shutters = new ASC_Shutters(); From 697ca9919254994fc1456a8a82191a6fde04e9a5 Mon Sep 17 00:00:00 2001 From: vuffiraa72 Date: Thu, 22 Aug 2019 19:42:46 +0200 Subject: [PATCH 5/8] Encode utf8 before writing debug info; fixed typo Rolllo --- 73_AutoShuttersControl.pm | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index 183242a..b577cc5 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -60,6 +60,7 @@ use strict; use warnings; use POSIX; use utf8; +use Encode; use FHEM::Meta; use GPUtils qw(GP_Import GP_Export); use Data::Dumper; #only for Debugging @@ -1900,7 +1901,7 @@ sub EventProcessingTwilightDevice($@) { ASC_Debug( 'EventProcessingTwilightDevice: ' . $name - . ' - Passendes Event wurde erkannt. Verarbeitung über alle Rolllos beginnt' + . ' - Passendes Event wurde erkannt. Verarbeitung über alle Rollos beginnt' ); foreach my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { @@ -2279,7 +2280,7 @@ sub EventProcessingShutters($@) { ASC_Debug( 'EventProcessingShutters: ' . $shutters->getShuttersDev - . ' - Event vom Rolllo erkannt. Es wird nun eine etwaige manuelle Fahrt ausgewertet.' + . ' - Event vom Rollo erkannt. Es wird nun eine etwaige manuelle Fahrt ausgewertet.' . ' Int von gettimeofday: ' . int( gettimeofday() ) . ' Last Position Timestamp: ' @@ -3600,7 +3601,7 @@ sub _SetCmdFn($) { ASC_Debug( 'FnSetCmdFn: ' . $shuttersDev - . ' - Rolllo wird gefahren, aktuelle Position: ' + . ' - Rollo wird gefahren, aktuelle Position: ' . $shutters->getStatus . ', Zielposition: ' . $posValue @@ -3638,7 +3639,7 @@ sub ASC_Debug($) { my $debugTimestamp = strftime( "%Y.%m.%e %T", localtime(time) ); print( - "\n" . 'ASC_DEBUG!!! ' . $debugTimestamp . ' - ' . $debugMsg . "\n" ); + encode_utf8("\n" . 'ASC_DEBUG!!! ' . $debugTimestamp . ' - ' . $debugMsg . "\n")); } ###################################### From a85b7fcb332df34266853f13d210a88f7b200862 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Mon, 26 Aug 2019 10:34:11 +0200 Subject: [PATCH 6/8] add mor debug output --- 73_AutoShuttersControl.pm | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index 786368f..422115b 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -487,6 +487,10 @@ sub Notify($$) { } } elsif ( grep /^($posReading):\s\d+$/, @{$events} ) { + ASC_Debug( 'Notify: ' + . ' ASC_Pos_Reading Event vom Rollo wurde erkannt ' + . ' - RECEIVED EVENT: ' + . Dumper $events); EventProcessingShutters( $hash, $devname, join( ' ', @{$events} ) ); } else { @@ -2285,6 +2289,11 @@ sub EventProcessingShutters($@) { my ( $hash, $shuttersDev, $events ) = @_; my $name = $hash->{NAME}; + ASC_Debug( 'EventProcessingShutters: ' + . ' Fn wurde durch Notify aufgerufen da ASC_Pos_Reading Event erkannt wurde ' + . ' - RECEIVED EVENT: ' + . Dumper $events); + if ( $events =~ m#.*:\s(\d+)# ) { $shutters->setShuttersDev($shuttersDev); $ascDev->setPosReading; @@ -2329,6 +2338,11 @@ sub EventProcessingShutters($@) { ); } } + + ASC_Debug( 'EventProcessingShutters: ' + . ' Fn wurde durlaufen und es sollten Debugausgaben gekommen sein. ' + . ' !!!Wenn nicht!!! wurde der Event nicht korrekt als Nummerisch erkannt. ' + ); } # Sub für das Zusammensetzen der Rolläden Steuerbefehle @@ -3664,7 +3678,10 @@ sub ASC_Debug($) { my $debugTimestamp = strftime( "%Y.%m.%e %T", localtime(time) ); print( - encode_utf8("\n" . 'ASC_DEBUG!!! ' . $debugTimestamp . ' - ' . $debugMsg . "\n")); + encode_utf8( + "\n" . 'ASC_DEBUG!!! ' . $debugTimestamp . ' - ' . $debugMsg . "\n" + ) + ); } ###################################### From 0128f07505ef9c76c32e9ff4f062d2642f3137f9 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Mon, 26 Aug 2019 13:11:35 +0200 Subject: [PATCH 7/8] add terrace condition in EventWindow Fn --- 73_AutoShuttersControl.pm | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index 422115b..f2a2208 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -1021,7 +1021,14 @@ sub EventProcessingWindowRec($@) { { $shutters->setLastDrive('ventilate - window open'); $shutters->setNoOffset(1); - $shutters->setDriveCmd( $shutters->getVentilatePos ); + $shutters->setDriveCmd( + ( + ( + $shutters->getShuttersPlace eq 'terrace' + and $shutters->getSubTyp eq 'twostate' + ) ? $shutters->getOpenPos : $shutters->getVentilatePos + ) + ); } elsif ( $match =~ /[Oo]pen/ and $shutters->getSubTyp eq 'threestate' ) @@ -1045,7 +1052,13 @@ sub EventProcessingWindowRec($@) { if ( defined($posValue) and $posValue ) { $shutters->setLastDrive($setLastDrive); $shutters->setNoOffset(1); - $shutters->setDriveCmd($posValue); + $shutters->setDriveCmd( + ( + $shutters->getShuttersPlace eq 'terrace' + ? $shutters->getOpenPos + : $posValue + ) + ); } } } @@ -6532,7 +6545,7 @@ sub getblockAscDrivesAfterManual { ], "release_status": "under develop", "license": "GPL_2", - "version": "v0.6.29", + "version": "v0.6.30", "x_developmentversion": "v0.6.19.34", "author": [ "Marko Oldenburg " From e3c63a0a93b6714d0b0b3f723cc9b5f5af27f13b Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Mon, 2 Sep 2019 14:34:42 +0200 Subject: [PATCH 8/8] add Average with three Datasets --- 73_AutoShuttersControl.pm | 58 +++++++++++++++++++++++++++++++++------ 1 file changed, 49 insertions(+), 9 deletions(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index f2a2208..ec779d2 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -720,6 +720,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' ); } @@ -1863,10 +1864,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 +1887,6 @@ sub EventProcessingShadingBrightness($@) { $shuttersDev, $ascDev->getAzimuth, $ascDev->getElevation, - $1, $outTemp, $shutters->getDirection, $shutters->getShadingAngleLeft, @@ -1956,7 +1959,6 @@ sub EventProcessingTwilightDevice($@) { $shuttersDev, $azimuth, $elevation, - $shutters->getBrightness, $outTemp, $shutters->getDirection, $shutters->getShadingAngleLeft, @@ -1976,12 +1978,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: ' @@ -3697,6 +3699,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) ######################### @@ -4259,6 +4268,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; @@ -6545,7 +6585,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 "