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)
+
+ Beschreibung der besonderen Positionsattribute
+ 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_Shading_Pos - Position des Rollladens für die Beschattung (Default: ist abhängig vom AttributASC 80/20) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
+ 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!!!
+
+ In Bezug auf die Verwendung mit Lamellen gibt es folgende ergänzende Parameter.
+
+ - Wird die gesamte Position inklusive der Lamellen mit Hilfe einer "festen Zurdnung" angefahren, so z.B. set ROLLONAME Beschattung dann wird hinter dem Positionswert mittels : getrennt die "feste Zuordnung" geschrieben. Beispiel: attr ROLLONAME ASC_Shading_Pos 30:Beschattung
+ - Wird hingegen ein ander Command verwendet z.B. slatPct oder ähnliches dann muss hinter der normalen Positionsangebe noch die Position für die Lamellen mit angegeb werden. Beispiel: attr ROLLONAME ASC_Shading_Pos 30:75. Bitte beachtet in diesem Zusammenhang auch das Attribut ASC_SlatPosCmd_SlatDevice wo mindesten die Angabe des SlatPosCMD Voraussetzung ist.
+
+
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 "
],