From 9ed15f90feba203340aa23089d5ceca3071e2de9 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Sat, 18 Apr 2020 18:16:06 +0200 Subject: [PATCH] add Privacy Positions for Slat Support --- 73_AutoShuttersControl.pm | 214 ++++++++++++++++++++++++-------------- 1 file changed, 136 insertions(+), 78 deletions(-) diff --git a/73_AutoShuttersControl.pm b/73_AutoShuttersControl.pm index 5cf0ce7..807bf65 100644 --- a/73_AutoShuttersControl.pm +++ b/73_AutoShuttersControl.pm @@ -211,8 +211,8 @@ my %userAttrList = ( 'ASC_Time_Down_Late' => '-', 'ASC_PrivacyUpValue_beforeDayOpen' => '-', 'ASC_PrivacyDownValue_beforeNightClose' => '-', - 'ASC_PrivacyUp_Pos' => '-', - 'ASC_PrivacyDown_Pos' => '-', + 'ASC_PrivacyUp_Pos' => [ '', 50, 50 ], + 'ASC_PrivacyDown_Pos' => [ '', 50, 50 ], 'ASC_TempSensor' => '-', 'ASC_Ventilate_Window_Open:on,off' => '-', 'ASC_LockOut:soft,hard,off' => '-', @@ -2471,11 +2471,12 @@ sub ShadingProcessing { && ( $shutters->getModeUp eq 'always' || $shutters->getModeUp eq $homemode || $shutters->getModeUp eq 'off' ) - && ( ( int( gettimeofday() ) - $shutters->getShadingStatusTimestamp ) < 2 - || ( !$shutters->getQueryShuttersPos( $shutters->getShadingPos ) - && $shutters->getIfInShading - && $shutters->getStatus != $shutters->getShadingPos ) - ) + && ( + ( int( gettimeofday() ) - $shutters->getShadingStatusTimestamp ) < 2 + || ( !$shutters->getQueryShuttersPos( $shutters->getShadingPos ) + && $shutters->getIfInShading + && $shutters->getStatus != $shutters->getShadingPos ) + ) ); return; @@ -2781,47 +2782,48 @@ sub ShuttersCommandSet { if ( ( -# $posValue == $shutters->getShadingPos && - CheckIfShuttersWindowRecOpen($shuttersDev) == 2 + # $posValue == $shutters->getShadingPos && + CheckIfShuttersWindowRecOpen($shuttersDev) == 2 && $shutters->getShuttersPlace eq 'terrace' && ( $shutters->getLockOut eq 'soft' || $shutters->getLockOut eq 'hard' ) && !$shutters->getQueryShuttersPos($posValue) ) || ( -# $posValue != $shutters->getShadingPos -# && ( - ( - $shutters->getPartyMode eq 'on' - && $ascDev->getPartyMode eq 'on' - ) - || ( - CheckIfShuttersWindowRecOpen($shuttersDev) == 2 - && $shutters->getSubTyp eq 'threestate' - && ( $ascDev->getAutoShuttersControlComfort eq 'off' - || $shutters->getComfortOpenPos != $posValue ) - && $shutters->getVentilateOpen eq 'on' - && $shutters->getShuttersPlace eq 'window' - && $shutters->getLockOut ne 'off' - ) - || ( CheckIfShuttersWindowRecOpen($shuttersDev) == 2 - && $shutters->getSubTyp eq 'threestate' - && $ascDev->getAutoShuttersControlComfort eq 'on' - && $shutters->getVentilateOpen eq 'off' - && $shutters->getShuttersPlace eq 'window' - && $shutters->getLockOut ne 'off' ) - || ( - CheckIfShuttersWindowRecOpen($shuttersDev) == 2 - && ( $shutters->getLockOut eq 'soft' - || $shutters->getLockOut eq 'hard' ) - && !$shutters->getQueryShuttersPos($posValue) - ) - || ( CheckIfShuttersWindowRecOpen($shuttersDev) == 2 - && $shutters->getShuttersPlace eq 'terrace' - && !$shutters->getQueryShuttersPos($posValue) ) - || ( $shutters->getRainProtectionStatus eq 'protected' - && $shutters->getWindProtectionStatus eq 'protected' ) -# ) + # $posValue != $shutters->getShadingPos + # && ( + ( + $shutters->getPartyMode eq 'on' + && $ascDev->getPartyMode eq 'on' + ) + || ( + CheckIfShuttersWindowRecOpen($shuttersDev) == 2 + && $shutters->getSubTyp eq 'threestate' + && ( $ascDev->getAutoShuttersControlComfort eq 'off' + || $shutters->getComfortOpenPos != $posValue ) + && $shutters->getVentilateOpen eq 'on' + && $shutters->getShuttersPlace eq 'window' + && $shutters->getLockOut ne 'off' + ) + || ( CheckIfShuttersWindowRecOpen($shuttersDev) == 2 + && $shutters->getSubTyp eq 'threestate' + && $ascDev->getAutoShuttersControlComfort eq 'on' + && $shutters->getVentilateOpen eq 'off' + && $shutters->getShuttersPlace eq 'window' + && $shutters->getLockOut ne 'off' ) + || ( + CheckIfShuttersWindowRecOpen($shuttersDev) == 2 + && ( $shutters->getLockOut eq 'soft' + || $shutters->getLockOut eq 'hard' ) + && !$shutters->getQueryShuttersPos($posValue) + ) + || ( CheckIfShuttersWindowRecOpen($shuttersDev) == 2 + && $shutters->getShuttersPlace eq 'terrace' + && !$shutters->getQueryShuttersPos($posValue) ) + || ( $shutters->getRainProtectionStatus eq 'protected' + && $shutters->getWindProtectionStatus eq 'protected' ) + + # ) ) ) { @@ -4349,18 +4351,22 @@ sub _DetermineSlatCmd { my $value = shift; my $posValue = shift; - return $posValue == $shutters->getShadingPos - && $shutters->getShadingPositionAssignment ne 'none' ? $shutters->getShadingPositionAssignment - : $posValue == $shutters->getVentilatePos - && $shutters->getVentilatePositionAssignment ne 'none' ? $shutters->getVentilatePositionAssignment - : $posValue == $shutters->getOpenPos - && $shutters->getOpenPositionAssignment ne 'none' ? $shutters->getOpenPositionAssignment - : $posValue == $shutters->getClosedPos - && $shutters->getClosedPositionAssignment ne 'none' ? $shutters->getClosedPositionAssignment - : $posValue == $shutters->getSleepPos - && $shutters->getSleepPositionAssignment ne 'none' ? $shutters->getSleepPositionAssignment - : $posValue == $shutters->getComfortOpenPos - && $shutters->getComfortOpenPositionAssignment ne 'none' ? $shutters->getComfortOpenPositionAssignment + return $posValue == $shutters->getShadingPos + && $shutters->getShadingPositionAssignment ne 'none' ? $shutters->getShadingPositionAssignment + : $posValue == $shutters->getVentilatePos + && $shutters->getVentilatePositionAssignment ne 'none' ? $shutters->getVentilatePositionAssignment + : $posValue == $shutters->getOpenPos + && $shutters->getOpenPositionAssignment ne 'none' ? $shutters->getOpenPositionAssignment + : $posValue == $shutters->getClosedPos + && $shutters->getClosedPositionAssignment ne 'none' ? $shutters->getClosedPositionAssignment + : $posValue == $shutters->getSleepPos + && $shutters->getSleepPositionAssignment ne 'none' ? $shutters->getSleepPositionAssignment + : $posValue == $shutters->getComfortOpenPos + && $shutters->getComfortOpenPositionAssignment ne 'none' ? $shutters->getComfortOpenPositionAssignment + : $posValue == $shutters->getPrivacyUpPos + && $shutters->getPrivacyUpPositionAssignment ne 'none' ? $shutters->getPrivacyUpPositionAssignment + : $posValue == $shutters->getPrivacyDownPos + && $shutters->getPrivacyDownPositionAssignment ne 'none' ? $shutters->getPrivacyDownPositionAssignment : $value; } @@ -4412,15 +4418,53 @@ sub _SetCmdFn { my $slatPos = -1; if ( $shutters->getShadingPositionAssignment ne 'none' - && $shutters->getShadingPositionAssignment =~ m{\A[a-zA-Z]+\z}xms ) + || $shutters->getOpenPositionAssignment ne 'none' + || $shutters->getClosedPositionAssignment ne 'none' + || $shutters->getPrivacyUpPositionAssignment ne 'none' + || $shutters->getPrivacyDownPositionAssignment ne 'none' + || $shutters->getSleepPositionAssignment ne 'none' + || $shutters->getVentilatePositionAssignment ne 'none' + || $shutters->getComfortOpenPositionAssignment ne 'none' ) { - $driveCommand = _DetermineSlatCmd( $driveCommand, $posValue ); - } - elsif ($shutters->getShadingPositionAssignment ne 'none' - && $shutters->getShadingPositionAssignment =~ m{\A\d{1,3}\z}xms ) - { - - $slatPos = _DetermineSlatCmd( $slatPos, $posValue ); + if ( + ( + $shutters->getShadingPositionAssignment =~ m{\A[a-zA-Z]+\z}xms + && $shutters->getShadingPositionAssignment ne 'none' + ) + || ( $shutters->getOpenPositionAssignment =~ m{\A[a-zA-Z]+\z}xms + && $shutters->getOpenPositionAssignment ne 'none' ) + || ( $shutters->getClosedPositionAssignment =~ m{\A[a-zA-Z]+\z}xms + && $shutters->getClosedPositionAssignment ne 'none' ) + || ( + $shutters->getPrivacyUpPositionAssignment =~ m{\A[a-zA-Z]+\z}xms + && $shutters->getPrivacyUpPositionAssignment ne 'none' ) + || ( $shutters->getPrivacyDownPositionAssignment =~ + m{\A[a-zA-Z]+\z}xms + && $shutters->getPrivacyDownPositionAssignment ne 'none' ) + || ( $shutters->getSleepPositionAssignment =~ m{\A[a-zA-Z]+\z}xms + && $shutters->getSleepPositionAssignment ne 'none' ) + || ( + $shutters->getVentilatePositionAssignment =~ m{\A[a-zA-Z]+\z}xms + && $shutters->getVentilatePositionAssignment ne 'none' ) + || ( $shutters->getComfortOpenPositionAssignment =~ + m{\A[a-zA-Z]+\z}xms + && $shutters->getComfortOpenPositionAssignment ne 'none' ) + ) + { + $driveCommand = _DetermineSlatCmd( $driveCommand, $posValue ); + } + elsif ($shutters->getShadingPositionAssignment =~ m{\A\d{1,3}\z}xms + || $shutters->getOpenPositionAssignment =~ m{\A\d{1,3}\z}xms + || $shutters->getClosedPositionAssignment =~ m{\A\d{1,3}\z}xms + || $shutters->getPrivacyUpPositionAssignment =~ m{\A\d{1,3}\z}xms + || $shutters->getPrivacyDownPositionAssignment =~ m{\A\d{1,3}\z}xms + || $shutters->getSleepPositionAssignment =~ m{\A\d{1,3}\z}xms + || $shutters->getVentilatePositionAssignment =~ m{\A\d{1,3}\z}xms + || $shutters->getComfortOpenPositionAssignment =~ + m{\A\d{1,3}\z}xms ) + { + $slatPos = _DetermineSlatCmd( $slatPos, $posValue ); + } } CommandSet( undef, @@ -5895,25 +5939,28 @@ sub getPrivacyDownBrightnessVal { sub getPrivacyUpPos { my $self = shift; - my $val = AttrVal( $self->{shuttersDev}, 'ASC_PrivacyUp_Pos', 50 ); + return $shutters->_getPosition( 'ASC_PrivacyUp_Pos', 'ASC_PrivacyUp_Pos' ); +} - if ( defined( FHEM::AutoShuttersControl::_perlCodeCheck($val) ) ) { - $val = FHEM::AutoShuttersControl::_perlCodeCheck($val); - } +sub getPrivacyUpPositionAssignment { + my $self = shift; - return ( $val =~ m{^\d+(\.\d+)?$}xms ? $val : 50 ); + return $shutters->_getPositionAssignment( 'ASC_PrivacyUp_Pos', + 'getPrivacyUpPos' ); } sub getPrivacyDownPos { my $self = shift; - my $val = AttrVal( $self->{shuttersDev}, 'ASC_PrivacyDown_Pos', 50 ); + return $shutters->_getPosition( 'ASC_PrivacyDown_Pos', + 'ASC_PrivacyDown_Pos' ); +} - if ( defined( FHEM::AutoShuttersControl::_perlCodeCheck($val) ) ) { - $val = FHEM::AutoShuttersControl::_perlCodeCheck($val); - } +sub getPrivacyDownPositionAssignment { + my $self = shift; - return ( $val =~ m{^\d+(\.\d+)?$}xms ? $val : 50 ); + return $shutters->_getPositionAssignment( 'ASC_PrivacyDown_Pos', + 'getPrivacyDownPos' ); } sub getSelfDefenseMode { @@ -8491,11 +8538,22 @@ sub getBlockAscDrivesAfterManual {
  • ASC_BlockingTime_beforDayOpen - wie viel Sekunden vor dem morgendlichen öffnen soll keine schließen Fahrt mehr stattfinden. (default: 3600)
  • ASC_BlockingTime_beforNightClose - wie viel Sekunden vor dem nächtlichen schließen soll keine öffnen Fahrt mehr stattfinden. (default: 3600)
  • ASC_BrightnessSensor - DEVICE[:READING] WERT-MORGENS:WERT-ABENDS / 'Sensorname[:brightness [400:800]]' Angaben zum Helligkeitssensor mit (Readingname, optional) für die Beschattung und dem Fahren der Rollladen nach brightness und den optionalen Brightnesswerten für Sonnenauf- und Sonnenuntergang. (default: none)
  • -
  • ASC_Closed_Pos - in 10 Schritten von 0 bis 100 (Default: ist abhängig vom AttributASC 0/100)
  • -
  • ASC_Open_Pos - in 10 Schritten von 0 bis 100 (default: ist abhängig vom AttributASC 100/0)
  • -
  • ASC_Sleep_Pos - in 10 Schritten von 0 bis 100 (default: ist abhängig vom AttributASC 75/25) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
  • -
  • ASC_ComfortOpen_Pos - in 10 Schritten von 0 bis 100 (Default: ist abhängig vom AttributASC 20/80) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
  • ASC_Down - astro/time/brightness - bei astro wird Sonnenuntergang berechnet, bei time wird der Wert aus ASC_Time_Down_Early als Fahrzeit verwendet und bei brightness muss ASC_Time_Down_Early und ASC_Time_Down_Late korrekt gesetzt werden. Der Timer läuft dann nach ASC_Time_Down_Late Zeit, es wird aber in der Zeit zwischen ASC_Time_Down_Early und ASC_Time_Down_Late geschaut, ob die als Attribut im Moduldevice hinterlegte ASC_brightnessDriveUpDown der Down Wert erreicht wurde. Wenn ja, wird der Rollladen runter gefahren (default: astro)
  • +
  • ASC_Shutter_IdleDetection - READING:VALUE gibt das Reading an welches Auskunft über den Fahrstatus des Rollos gibt, sowie als zweites den Wert im Reading welcher aus sagt das das Rollo nicht fährt
  • ASC_DriveUpMaxDuration - die Dauer des Hochfahrens des Rollladens plus 5 Sekunden (default: 60)
  • ASC_Drive_Delay - maximaler Wert für einen zufällig ermittelte Verzögerungswert in Sekunden bei der Berechnung der Fahrzeiten.
  • @@ -8540,13 +8598,13 @@ sub getBlockAscDrivesAfterManual {
  • ASC_Time_Up_Late - Sonnenaufgang späteste Zeit zum Hochfahren (default: 08:30) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!
  • ASC_Time_Up_WE_Holiday - Sonnenaufgang frühste Zeit zum Hochfahren am Wochenende und/oder Urlaub (holiday2we wird beachtet). (default: 08:00) ACHTUNG!!! in Verbindung mit Brightness für ASC_Up muss die Uhrzeit kleiner sein wie die Uhrzeit aus ASC_Time_Up_Late !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!
  • ASC_Up - astro/time/brightness - bei astro wird Sonnenaufgang berechnet, bei time wird der Wert aus ASC_Time_Up_Early als Fahrzeit verwendet und bei brightness muss ASC_Time_Up_Early und ASC_Time_Up_Late korrekt gesetzt werden. Der Timer läuft dann nach ASC_Time_Up_Late Zeit, es wird aber in der Zeit zwischen ASC_Time_Up_Early und ASC_Time_Up_Late geschaut, ob die als Attribut im Moduldevice hinterlegte Down Wert von ASC_brightnessDriveUpDown erreicht wurde. Wenn ja, wird der Rollladen hoch gefahren (default: astro)
  • -
  • ASC_Ventilate_Pos - in 10 Schritten von 0 bis 100 (default: ist abhängig vom Attribut ASC 70/30) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
  • ASC_Ventilate_Window_Open - auf lüften, wenn das Fenster gekippt/geöffnet wird und aktuelle Position unterhalb der Lüften-Position ist (default: on)
  • ASC_WiggleValue - Wert um welchen sich die Position des Rollladens ändern soll (default: 5)
  • ASC_WindParameters - TRIGGERMAX[:HYSTERESE] [DRIVEPOSITION] / Angabe von Max Wert ab dem für Wind getriggert werden soll, Hytsrese Wert ab dem der Windschutz aufgehoben werden soll TRIGGERMAX - HYSTERESE / Ist es bei einigen Rollläden nicht gewünscht das gefahren werden soll, so ist der TRIGGERMAX Wert mit -1 an zu geben. (default: '50:20 ClosedPosition')
  • ASC_WindowRec_PosAfterDayClosed - open,lastManual / auf welche Position soll das Rollo nach dem schließen am Tag fahren. Open Position oder letzte gespeicherte manuelle Position (default: open)
  • ASC_WindowRec - WINDOWREC:[READING], Name des Fensterkontaktes, an dessen Fenster der Rollladen angebracht ist (default: none). Reading ist optional
  • ASC_WindowRec_subType - Typ des verwendeten Fensterkontaktes: twostate (optisch oder magnetisch) oder threestate (Drehgriffkontakt) (default: twostate)
  • +
  • ASC_SlatPosCmd_SlatDevice - Angaben zu einem Slat (Lamellen) CMD und sofern diese Lamellen über ein anderes Device gesteuert werden zum Slat Device. Beispiel: attr ROLLO ASC_SlatPosCmd_SlatDevice slatPct[:ROLLOSLATDEVICE] [ ] bedeutet optinal. Kann also auch weg gelassen werden. Wenn Ihr das SLAT Device mit angibt dann bitte ohne []. Beispiel: attr ROLLO ASC_SlatPosCmd_SlatDevice slatPct:ROLLOSLATDEVICE. Damit das ganze dann auch greift muss in den 6 Positionsangaben ASC_Open_Pos, ASC_Closed_Pos, ASC_Ventilate_Pos, ASC_ComfortOpen_Pos, ASC_Shading_Pos und ASC_Sleep_Pos ein weiterer Parameter für die Lamellenstellung mit angegeben werden.
  • @@ -8630,7 +8688,7 @@ sub getBlockAscDrivesAfterManual { ], "release_status": "testing", "license": "GPL_2", - "version": "v0.9.8", + "version": "v0.9.9", "author": [ "Marko Oldenburg " ],