diff --git a/fhem/CHANGED b/fhem/CHANGED index 65313b6c3..6e8c9bede 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,7 @@ # 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. + - feature: 73_AutoShuttersControl: add user control commands, expan + SelfDefense for EG windows, Bugfixes and change commandref - added: maintainer added for 97_PiXtendV2.pm (=>PiXtend) - feature: 73_GardenaSmartBridge.pm 74_GardenaSmartDevice.pm: add stop/resume schedule, add wintermode, fix notifys, diff --git a/fhem/FHEM/73_AutoShuttersControl.pm b/fhem/FHEM/73_AutoShuttersControl.pm index 8c513d08f..8943b9cd9 100644 --- a/fhem/FHEM/73_AutoShuttersControl.pm +++ b/fhem/FHEM/73_AutoShuttersControl.pm @@ -416,11 +416,11 @@ __END__ after the last manual operation in seconds. Defaults to 1200 (20 minutes). -
@@ -1028,10 +1040,10 @@ __END__ASC_AutoAstroModeMorningHorizon - Höhe über Horizont,a wenn beim Attribut ASC_autoAstroModeMorning HORIZON ausgewählt (default: none) ASC_BlockingTime_afterManual - wie viel Sekunden soll die Automatik nach einer manuellen Fahrt aussetzen. (default: 1200) - -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_BlockingTime_beforeDayOpen - wie viel Sekunden vor dem morgendlichen öffnen soll keine schließen Fahrt mehr stattfinden. (default: 3600) + +ASC_BlockingTime_beforeNightClose - 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) @@ -1157,6 +1169,20 @@ __END__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. Beispiele: attr ROLLO ASC_SlatPosCmd_SlatDevice slatPct oder attr ROLLO ASC_SlatPosCmd_SlatDevice dim:ROLLOSLATDEVICE. Die Angabe des Devices ist nur erforderlich, wenn zur Steuerung der Lamellen ein anderes Device verwendet wird. 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. + +ASC_CommandTemplate - FHEM-Kommando(s) oder Perl-Anweisung (in geschweiften Klammern unter Beachtung der üblichen Regeln für das escapen von Semicolons etc.). Die Variablen $name (der Name des Rollladen-Devices), $level (die Zielposition des Fahrbefehls) und $slatLevel (die Zielposition des Fahrbefehls für eventuelle Lamellen) werden durch die ermittelten Werte ersetzt, es muss selbst dafür gesorgt werden, dass eventuell unnötige Fahrbefehle aussortiert werden. + Beispiele: + @@ -1436,7 +1462,7 @@ __END__ ], "release_status": "stable", "license": "GPL_2", - "version": "v0.10.17", + "version": "v0.10.18", "author": [ "Marko Oldenburg+
+ Hinweis: ASC_CommandTemplate ist für seltene und spezielle Fälle gedacht. In der Regel ist es nicht erforderlich, dieses Attribut zu setzen! +- attr ROLLO ASC_CommandTemplate set $name $level - Positionsbefehl direkt an Gerät + setzen
+- attr ROLLO ASC_CommandTemplate set $name pct $level - Positionsbefehl direkt an Gerät + setzen
+- attr ROLLO ASC_CommandTemplate set $name datapoint 4.LEVEL_2 $slatLevel 4.LEVEL $level - Positionsbefehl und Lamellen-Ansteuerung für HM-IP-Jalousieaktoren
+- attr ROLLO ASC_CommandTemplate { fhem("set $name ".($level+1024)).";set $name 0")} - Positionsbefehl für eine SPS in Perl umrechnen
+- attr ROLLO ASC_CommandTemplate myPerlCode("$name", $level, $slatLevel) - Positionsbefehl aus eigener Perlfunktion
+" ], diff --git a/fhem/lib/FHEM/Automation/ShuttersControl.pm b/fhem/lib/FHEM/Automation/ShuttersControl.pm index 630683370..a0f1f1a0e 100644 --- a/fhem/lib/FHEM/Automation/ShuttersControl.pm +++ b/fhem/lib/FHEM/Automation/ShuttersControl.pm @@ -184,9 +184,7 @@ BEGIN { delFromAttrList gettimeofday InternalTimer - RemoveInternalTimer - computeAlignTime - ReplaceEventMap) + RemoveInternalTimer) ); #-- Export to main context with different name @@ -229,8 +227,8 @@ our %userAttrList = ( 'ASC_LockOut:soft,hard,off' => '-', 'ASC_LockOut_Cmd:inhibit,blocked,protection' => '-', 'ASC_BlockingTime_afterManual' => '-', - 'ASC_BlockingTime_beforNightClose' => '-', - 'ASC_BlockingTime_beforDayOpen' => '-', + 'ASC_BlockingTime_beforeNightClose' => '-', + 'ASC_BlockingTime_beforeDayOpen' => '-', 'ASC_BrightnessSensor' => '-', 'ASC_Shading_Pos:10,20,30,40,50,60,70,80,90,100' => [ '', 80, 20 ], 'ASC_Shading_Mode:absent,always,off,home' => '-', @@ -265,6 +263,7 @@ our %userAttrList = ( 'ASC_RainProtection:on,off' => '-', 'ASC_ExternalTrigger' => '-', 'ASC_Adv:on,off' => '-', + 'ASC_CommandTemplate' => '-', 'ASC_SlatPosCmd_SlatDevice' => '-', ); @@ -1227,15 +1226,15 @@ sub RenewSunRiseSetShuttersTimer { 1, 0 ); } -# $attr{$shuttersDev}{ASC_Drive_Delay} = -# AttrVal( $shuttersDev, 'ASC_Drive_Offset', 'none' ) -# if ( AttrVal( $shuttersDev, 'ASC_Drive_Offset', 'none' ) ne 'none' ); -# delFromDevAttrList( $shuttersDev, 'ASC_Drive_Offset' ); -# -# $attr{$shuttersDev}{ASC_Drive_DelayStart} = -# AttrVal( $shuttersDev, 'ASC_Drive_OffsetStart', 'none' ) -# if ( AttrVal( $shuttersDev, 'ASC_Drive_OffsetStart', 'none' ) ne 'none' ); -# delFromDevAttrList( $shuttersDev, 'ASC_Drive_OffsetStart' ); + $attr{$shuttersDev}{ASC_BlockingTime_beforeNightClose} = + AttrVal( $shuttersDev, 'ASC_BlockingTime_beforNightClose', 'none' ) + if ( AttrVal( $shuttersDev, 'ASC_BlockingTime_beforNightClose', 'none' ) ne 'none' ); + delFromDevAttrList( $shuttersDev, 'ASC_BlockingTime_beforNightClose' ); + + $attr{$shuttersDev}{ASC_BlockingTime_beforeDayOpen} = + AttrVal( $shuttersDev, 'ASC_BlockingTime_beforDayOpen', 'none' ) + if ( AttrVal( $shuttersDev, 'ASC_BlockingTime_beforDayOpen', 'none' ) ne 'none' ); + delFromDevAttrList( $shuttersDev, 'ASC_BlockingTime_beforDayOpen' ); # # $attr{$shuttersDev}{ASC_Shading_StateChange_SunnyCloudy} = # AttrVal( $shuttersDev, 'ASC_Shading_StateChange_Sunny', 'none' ) . ':' @@ -1769,8 +1768,9 @@ sub _SetCmdFn { . '. Grund der Fahrt: ' . $shutters->getLastDrive ); - my $driveCommand = $shutters->getPosSetCmd . ' ' . $posValue; - my $slatPos = -1; + my $driveCommand = $shutters->getPosSetCmd . ' ' . $posValue; + my $commandTemplate = $shutters->getCommandTemplate; + my $slatPos = -1; if ( $shutters->getShadingPositionAssignment ne 'none' || $shutters->getOpenPositionAssignment ne 'none' @@ -1822,32 +1822,48 @@ sub _SetCmdFn { } } - CommandSet( undef, - $shuttersDev - . ':FILTER=' - . $shutters->getPosCmd . '!=' - . $posValue . ' ' - . $driveCommand ); + if ( $commandTemplate ne 'none' ) { # Patch von Beta-User Forum https://forum.fhem.de/index.php/topic,123659.0.html + # Nutzervariablen setzen + my %specials = ( + '$name' => $shuttersDev, + '$level' => $posValue, + '$slatLevel' => $slatPos, + '$reason' => $shutters->getLastDrive + ); + + $commandTemplate = ::EvalSpecials($commandTemplate, %specials); + # CMD ausführen + ::AnalyzeCommandChain( $h, $commandTemplate ); + } + else { + CommandSet( undef, + $shuttersDev + . ':FILTER=' + . $shutters->getPosCmd . '!=' + . $posValue . ' ' + . $driveCommand ); - InternalTimer( - gettimeofday() + 3, - sub() { - CommandSet( - undef, - ( - $shutters->getSlatDevice ne 'none' - ? $shutters->getSlatDevice - : $shuttersDev - ) - . ' ' - . $shutters->getSlatPosCmd . ' ' - . $slatPos - ); - }, - $shuttersDev - ) - if ( $slatPos > -1 - && $shutters->getSlatPosCmd ne 'none' ); + InternalTimer( + gettimeofday() + 3, + sub() { + CommandSet( + undef, + ( + $shutters->getSlatDevice ne 'none' + ? $shutters->getSlatDevice + : $shuttersDev + ) + . ' ' + . $shutters->getSlatPosCmd . ' ' + . $slatPos + ); + }, + $shuttersDev + ) + if ( $slatPos > -1 + && $shutters->getSlatPosCmd ne 'none' ); + + } $shutters->setSelfDefenseAbsent( 0, 0 ) if (!$shutters->getSelfDefenseAbsent diff --git a/fhem/lib/FHEM/Automation/ShuttersControl/EventProcessingFunctions.pm b/fhem/lib/FHEM/Automation/ShuttersControl/EventProcessingFunctions.pm index 3bce6024c..10509275e 100644 --- a/fhem/lib/FHEM/Automation/ShuttersControl/EventProcessingFunctions.pm +++ b/fhem/lib/FHEM/Automation/ShuttersControl/EventProcessingFunctions.pm @@ -324,6 +324,13 @@ sub EventProcessingWindowRec { ->getShuttersPlace eq 'terrace' ) && !$FHEM::Automation::ShuttersControl::shutters->getIsDay ) + || ( $FHEM::Automation::ShuttersControl::shutters->getStatus == + $FHEM::Automation::ShuttersControl::shutters + ->getOpenPos + && $FHEM::Automation::ShuttersControl::shutters + ->getDelayCmd ne 'none' + && $FHEM::Automation::ShuttersControl::shutters + ->getShuttersPlace eq 'terrace' ) ) && ( $FHEM::Automation::ShuttersControl::shutters->getVentilateOpen eq 'on' @@ -370,7 +377,12 @@ sub EventProcessingWindowRec { || $FHEM::Automation::ShuttersControl::shutters ->getStatus != $FHEM::Automation::ShuttersControl::shutters - ->getLastManPos ) + ->getLastManPos + || ( $FHEM::Automation::ShuttersControl::shutters + ->getDelayCmd ne 'none' + && $FHEM::Automation::ShuttersControl::shutters + ->getShuttersPlace eq 'terrace' ) + ) ) { if ( $FHEM::Automation::ShuttersControl::shutters @@ -395,11 +407,17 @@ sub EventProcessingWindowRec { ->setDriveCmd( ( $FHEM::Automation::ShuttersControl::shutters - ->getVentilatePosAfterDayClosed eq 'open' + ->getDelayCmd ne 'none' + && $FHEM::Automation::ShuttersControl::shutters + ->getShuttersPlace eq 'terrace' ? $FHEM::Automation::ShuttersControl::shutters - ->getOpenPos + ->getDelayCmd + : ( $FHEM::Automation::ShuttersControl::shutters + ->getVentilatePosAfterDayClosed eq 'open' + ? $FHEM::Automation::ShuttersControl::shutters + ->getOpenPos : $FHEM::Automation::ShuttersControl::shutters - ->getLastManPos + ->getLastManPos ) ) ); } diff --git a/fhem/lib/FHEM/Automation/ShuttersControl/Rainprotection.pm b/fhem/lib/FHEM/Automation/ShuttersControl/Rainprotection.pm index 542901deb..d6dab570a 100644 --- a/fhem/lib/FHEM/Automation/ShuttersControl/Rainprotection.pm +++ b/fhem/lib/FHEM/Automation/ShuttersControl/Rainprotection.pm @@ -133,11 +133,13 @@ sub _RainProtected { $FHEM::Automation::ShuttersControl::shutters->setLastDrive( 'rain protected'); - $FHEM::Automation::ShuttersControl::shutters->setDriveCmd( - $FHEM::Automation::ShuttersControl::ascDev - ->getRainSensorShuttersClosedPos); - $FHEM::Automation::ShuttersControl::shutters - ->setRainProtectionStatus('protected'); + + $FHEM::Automation::ShuttersControl::shutters->setDriveCmd( + $FHEM::Automation::ShuttersControl::ascDev + ->getRainSensorShuttersClosedPos); + + $FHEM::Automation::ShuttersControl::shutters + ->setRainProtectionStatus('protected'); } sub _RainUnprotected { @@ -168,10 +170,11 @@ sub _RainUnprotected { ->getClosedPos ) ) - ); + ) + if (IsAfterShuttersTimeBlocking($shuttersDev)); - $FHEM::Automation::ShuttersControl::shutters - ->setRainProtectionStatus('unprotected'); + $FHEM::Automation::ShuttersControl::shutters + ->setRainProtectionStatus('unprotected'); } diff --git a/fhem/lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm b/fhem/lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm index 00aba3abc..46c4b12b6 100644 --- a/fhem/lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm +++ b/fhem/lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm @@ -516,6 +516,12 @@ sub getSelfDefenseAbsentDelay { return AttrVal( $self->{shuttersDev}, 'ASC_Self_Defense_AbsentDelay', 300 ); } +sub getCommandTemplate { + my $self = shift; + + return AttrVal( $self->{shuttersDev}, 'ASC_CommandTemplate', 'none' ); +} + sub setWiggleValue { my $self = shift; my $attrVal = shift;