main #113

Merged
marko merged 25 commits from main into testing 2022-08-29 10:17:58 +02:00
7 changed files with 115 additions and 80 deletions

View File

@ -707,7 +707,7 @@ __END__
are used for shading. Defaults to 120.
</li>
<a id="AutoShuttersControl-attr-ASC_Shading_BetweenTheTime"></a>
<li><strong>ASC_Shading_BetweenTheTime</strong> - Limit the time slots for shading functionality. Example: 9:00-13:00 11:25-15:30</li>
<li><strong>ASC_Shading_BetweenTheTime</strong> - Limit the time slots for shading functionality. Example: 09:00-13:00 11:25-15:30</li>
</ul>
</blockquote>
</ul>
@ -1137,7 +1137,7 @@ __END__
<a id="AutoShuttersControl-attr-ASC_Shading_WaitingPeriod"></a>
<li><strong>ASC_Shading_WaitingPeriod</strong> - wie viele Sekunden soll gewartet werden bevor eine weitere Auswertung der Sensordaten f&uuml;r die Beschattung stattfinden soll (default: 1200)</li>
<a id="AutoShuttersControl-attr-ASC_Shading_BetweenTheTime"></a>
<li><strong>ASC_Shading_BetweenTheTime</strong> - das Fahren in die Beschattung erfolgt bei Angabe nur innerhalb des Zeitraumes, Bsp: 9:00-13:00 11:25-15:30</li>
<li><strong>ASC_Shading_BetweenTheTime</strong> - das Fahren in die Beschattung erfolgt bei Angabe nur innerhalb des Zeitraumes, Bsp: 09:00-13:00 11:25-15:30</li>
</ul></p>
<a id="AutoShuttersControl-attr-ASC_ShuttersPlace"></a>
<li><strong>ASC_ShuttersPlace - window/terrace/awning</strong> - Wenn dieses Attribut auf terrace gesetzt ist, das Residence Device in den Status "gone" geht und SelfDefense aktiv ist (ohne das das Reading selfDefense gesetzt sein muss), wird das Rollo geschlossen. awning steht für Markise und wirkt sich auf die Beschattungssteuerung aus. (default: window)</li>
@ -1158,7 +1158,7 @@ __END__
<a id="AutoShuttersControl-attr-ASC_WiggleValue"></a>
<li><strong>ASC_WiggleValue</strong> - Wert um welchen sich die Position des Rollladens &auml;ndern soll (default: 5)</li>
<a id="AutoShuttersControl-attr-ASC_WindParameters"></a>
<li><strong>ASC_WindParameters - TRIGGERMAX[:HYSTERESE] [DRIVEPOSITION]</strong> / Angabe von Max Wert ab dem f&uuml;r Wind getriggert werden soll, Hytsrese Wert ab dem der Windschutz aufgehoben werden soll TRIGGERMAX - HYSTERESE / Ist es bei einigen Rolll&auml;den nicht gew&uuml;nscht das gefahren werden soll, so ist der TRIGGERMAX Wert mit -1 an zu geben. (default: '50:20 ClosedPosition')</li>
<li><strong>ASC_WindParameters - TRIGGERMAX[:HYSTERESE] [DRIVEPOSITION]</strong> / ACHTUNG! Wird nur beachtet wenn ASC_WindProtection auf on gesetzt ist. - Angabe von Max Wert ab dem f&uuml;r Wind getriggert werden soll, Hytsrese Wert ab dem der Windschutz aufgehoben werden soll TRIGGERMAX - HYSTERESE / Ist es bei einigen Rolll&auml;den nicht gew&uuml;nscht das gefahren werden soll, so ist der TRIGGERMAX Wert mit -1 an zu geben. (default: '50:20 ASC_Closed_Pos')</li>
<a id="AutoShuttersControl-attr-ASC_WindowRec_PosAfterDayClosed"></a>
<li><strong>ASC_WindowRec_PosAfterDayClosed</strong> - open,lastManual / auf welche Position soll das Rollo nach dem schlie&szlig;en am Tag fahren. Open Position oder letzte gespeicherte manuelle Position (default: open)</li>
<a id="AutoShuttersControl-attr-ASC_WindowRec"></a>
@ -1323,7 +1323,7 @@ __END__
<tr><td>Sunrise</td><td>1=Morgenfahrt wurde durchgef&uuml;hrt, 0=noch keine Morgenfahrt durchgef&uuml;hrt</td></tr>
<tr><td>RoommatesStatus</td><td>aktueller Status der/des Roommate/s f&uuml;r den Rollladen</td></tr>
<tr><td>RoommatesLastStatus</td><td>letzter Status der/des Roommate/s f&uuml;r den Rollladen</td></tr>
<tr><td>ShadingStatus</td><td>Ausgabe des aktuellen Shading Status, in, out, in reserved, out reserved</td></tr>
<tr><td>ShadingStatus</td><td>Ausgabe des aktuellen Shading Status, in, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>out, in reserved, out reserved</td></tr>
<tr><td>ShadingStatusTimestamp</td><td>Timestamp des letzten Beschattungsstatus</td></tr>
<tr><td>IfInShading</td><td>Befindet sich der Rollladen, in Abh&auml;ngigkeit des Shading Mode, in der Beschattung</td></tr>
<tr><td>DelayCmd</td><td>letzter Fahrbefehl welcher in die Warteschlange kam. Grund z.B. Partymodus.</td></tr>
@ -1462,7 +1462,7 @@ __END__
],
"release_status": "stable",
"license": "GPL_2",
"version": "v0.10.21",
"version": "v0.10.24",
"author": [
"Marko Oldenburg <fhemdevelopment@cooltux.net>"
],

View File

@ -1,16 +1,16 @@
UPD 2022-01-15_15:38:33 116177 FHEM/73_AutoShuttersControl.pm
UPD 2022-01-15_15:38:39 75817 lib/FHEM/Automation/ShuttersControl.pm
UPD 2022-08-29_10:05:19 116264 FHEM/73_AutoShuttersControl.pm
UPD 2022-08-29_07:40:46 76466 lib/FHEM/Automation/ShuttersControl.pm
UPD 2022-01-14_08:49:13 2691 lib/FHEM/Automation/ShuttersControl/Dev.pm
UPD 2022-01-14_08:49:13 2677 lib/FHEM/Automation/ShuttersControl/Roommate.pm
UPD 2022-01-14_08:49:13 32016 lib/FHEM/Automation/ShuttersControl/Shutters.pm
UPD 2022-01-14_08:49:13 25452 lib/FHEM/Automation/ShuttersControl/Shading.pm
UPD 2022-01-14_08:49:13 112122 lib/FHEM/Automation/ShuttersControl/EventProcessingFunctions.pm
UPD 2022-01-14_08:49:13 40603 lib/FHEM/Automation/ShuttersControl/Helper.pm
UPD 2022-03-05_09:12:41 32016 lib/FHEM/Automation/ShuttersControl/Shutters.pm
UPD 2022-08-29_10:04:56 25543 lib/FHEM/Automation/ShuttersControl/Shading.pm
UPD 2022-08-29_09:27:49 112285 lib/FHEM/Automation/ShuttersControl/EventProcessingFunctions.pm
UPD 2022-08-29_08:42:40 40705 lib/FHEM/Automation/ShuttersControl/Helper.pm
UPD 2022-01-14_08:49:13 2209 lib/FHEM/Automation/ShuttersControl/Window.pm
UPD 2022-01-14_08:49:13 11857 lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm
UPD 2022-01-14_08:49:13 7265 lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm
UPD 2022-01-14_08:49:13 52751 lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm
UPD 2022-03-05_09:12:39 52751 lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm
UPD 2022-01-14_08:49:13 2799 lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm
UPD 2022-01-14_08:49:13 3887 lib/FHEM/Automation/ShuttersControl/Window/Attr.pm
UPD 2022-01-14_08:49:13 2200 lib/FHEM/Automation/ShuttersControl/Window/Readings.pm
UPD 2022-01-14_08:49:13 7113 lib/FHEM/Automation/ShuttersControl/Rainprotection.pm
UPD 2022-08-29_07:40:46 7396 lib/FHEM/Automation/ShuttersControl/Rainprotection.pm

View File

@ -485,16 +485,23 @@ sub Notify {
}
elsif ( $devname eq "global" )
{ # Kommt ein globales Event und beinhaltet folgende Syntax wird die Funktion zur Verarbeitung aufgerufen
::Log3( $name, 4,
"AutoShuttersControl ($name) - ShuttersControl: Devicename eq global"
);
if (
grep {
/^(ATTR|DELETEATTR)\s(.*ASC_Time_Up_WE_Holiday|.*ASC_Up|.*ASC_Down|.*ASC_AutoAstroModeMorning|.*ASC_AutoAstroModeMorningHorizon|.*ASC_AutoAstroModeEvening|.*ASC_AutoAstroModeEveningHorizon|.*ASC_Time_Up_Early|.*ASC_Time_Up_Late|.*ASC_Time_Down_Early|.*ASC_Time_Down_Late|.*ASC_autoAstroModeMorning|.*ASC_autoAstroModeMorningHorizon|.*ASC_PrivacyDownValue_beforeNightClose|.*ASC_PrivacyUpValue_beforeDayOpen|.*ASC_autoAstroModeEvening|.*ASC_autoAstroModeEveningHorizon|.*ASC_Roommate_Device|.*ASC_WindowRec|.*ASC_residentsDev|.*ASC_rainSensor|.*ASC_windSensor|.*ASC_tempSensor|.*ASC_BrightnessSensor|.*ASC_twilightDevice|.*ASC_ExternalTrigger|.*ASC_Shading_StateChange_SunnyCloudy|.*ASC_TempSensor|.*ASC_Shading_Mode)(\s.*|$) /
/^(ATTR|DELETEATTR)\s(.*ASC_Time_Up_WE_Holiday|.*ASC_Up|.*ASC_Down|.*ASC_AutoAstroModeMorning|.*ASC_AutoAstroModeMorningHorizon|.*ASC_AutoAstroModeEvening|.*ASC_AutoAstroModeEveningHorizon|.*ASC_Time_Up_Early|.*ASC_Time_Up_Late|.*ASC_Time_Down_Early|.*ASC_Time_Down_Late|.*ASC_autoAstroModeMorning|.*ASC_autoAstroModeMorningHorizon|.*ASC_PrivacyDownValue_beforeNightClose|.*ASC_PrivacyUpValue_beforeDayOpen|.*ASC_autoAstroModeEvening|.*ASC_autoAstroModeEveningHorizon|.*ASC_Roommate_Device|.*ASC_WindowRec|.*ASC_residentsDev|.*ASC_rainSensor|.*ASC_windSensor|.*ASC_tempSensor|.*ASC_BrightnessSensor|.*ASC_twilightDevice|.*ASC_ExternalTrigger|.*ASC_Shading_StateChange_SunnyCloudy|.*ASC_TempSensor|.*ASC_Shading_Mode)(\s.*|$) /x
} @{$events}
)
{
::Log3( $name, 4,
"AutoShuttersControl ($name) - ShuttersControl: Event Attr or Deleteattr Time and Astro"
);
EventProcessingGeneral( $hash, undef, join( ' ', @{$events} ) );
}
}
elsif ( grep { /^($posReading):\s\d{1,3}(\.\d{1,3})?$/ } @{$events} ) {
elsif ( grep { /^($posReading):\s\d{1,3}(\.\d{1,3})?$/x } @{$events} ) {
ASC_Debug( 'Notify: '
. ' ASC_Pos_Reading Event vom Rollo '
. $devname
@ -1582,8 +1589,8 @@ sub ShuttersInformation {
|| !defined( $shutters->getSunsetUnixTime ) );
my $ret =
'<html><table><tr><h3>ASC Configuration and Information Summary</h3><td>';
$ret .= '<table class="block wide">';
'<html><table border rules=all border frame=box><tr><h3>ASC Configuration and Information Summary</h3><td>';
$ret .= '<table class="block wide" rules=all>';
$ret .= '<tr class="even">';
$ret .= "<td><b>Shutters</b></td>";
$ret .= "<td> </td>";
@ -1618,43 +1625,44 @@ sub ShuttersInformation {
if ( $linecount % 2 == 0 ) { $ret .= '<tr class="even">'; }
else { $ret .= '<tr class="odd">'; }
$ret .= "<td>$shuttersDev</td>";
$ret .= "<td>&nbsp;$shuttersDev&nbsp;</td>";
$ret .= "<td> </td>";
$ret .= "<td>"
$ret .= "<td>&nbsp;"
. strftime( "%d.%m.%Y - %H:%M:%S",
localtime( $shutters->getSunriseUnixTime ) )
. "</td>";
. "&nbsp;</td>";
$ret .= "<td> </td>";
$ret .= "<td>"
$ret .= "<td>&nbsp;"
. strftime( "%d.%m.%Y - %H:%M:%S",
localtime( $shutters->getSunsetUnixTime ) )
. "</td>";
. "&nbsp;</td>";
$ret .= "<td> </td>";
$ret .= "<td>" . $shutters->getUp . "</td>";
$ret .= "<td>&nbsp;" . $shutters->getUp . "&nbsp;</td>";
$ret .= "<td> </td>";
$ret .= "<td>" . $shutters->getDown . "</td>";
$ret .= "<td>&nbsp;" . $shutters->getDown . "&nbsp;</td>";
$ret .= "<td> </td>";
$ret .= "<td>" . $shutters->getModeUp . "</td>";
$ret .= "<td>&nbsp;" . $shutters->getModeUp . "&nbsp;</td>";
$ret .= "<td> </td>";
$ret .= "<td>" . $shutters->getModeDown . "</td>";
$ret .= "<td>&nbsp;" . $shutters->getModeDown . "&nbsp;</td>";
$ret .= "<td> </td>";
$ret .= "<td>" . $shutters->getPartyMode . "</td>";
$ret .= "<td>&nbsp;" . $shutters->getPartyMode . "&nbsp;</td>";
$ret .= "<td> </td>";
$ret .= "<td>" . $shutters->getLockOut . "</td>";
$ret .= "<td>&nbsp;" . $shutters->getLockOut . "&nbsp;</td>";
$ret .= "<td> </td>";
$ret .= "<td>"
. ::ReadingsVal( $shuttersDev, 'ASC_ShuttersLastDrive', 'none' )
. "</td>";
$ret .= "<td> </td>";
$ret .= "<td>" . $shutters->getStatus . "</td>";
$ret .= "<td>&nbsp;" . $shutters->getStatus . "&nbsp;</td>";
$ret .= "<td> </td>";
$ret .= "<td>" . $shutters->getLastPos . "</td>";
$ret .= "<td>&nbsp;" . $shutters->getLastPos . "&nbsp;</td>";
$ret .= "<td> </td>";
$ret .= "<td>"
$ret .=
"<td>&nbsp;"
. $shutters->getShadingStatus . ' - '
. strftime( "%H:%M:%S",
localtime( $shutters->getShadingStatusTimestamp ) )
. "</td>";
. "&nbsp;</td>";
$ret .= '</tr>';
$linecount++;
}
@ -1756,7 +1764,11 @@ sub SetCmdFn {
return
if ( $shutters->getASCenable eq 'off'
|| $ascDev->getASCenable eq 'off'
|| $idleDetection !~ m{^$idleDetectionValue$}xms );
|| $idleDetection !~ m{^$idleDetectionValue$}xms
|| $FHEM::Automation::ShuttersControl::shutters
->getWindProtectionStatus eq 'protected'
|| $FHEM::Automation::ShuttersControl::shutters
->getRaindProtectionStatus eq 'protected' );
if ( $shutters->getStatus != $posValue ) {
$shutters->setLastPos( $shutters->getStatus );

View File

@ -133,6 +133,10 @@ sub EventProcessingGeneral {
}
}
else { # alles was kein Devicenamen mit übergeben hat landet hier
::Log3( $name, 4,
"AutoShuttersControl ($name) - EventProcessing: All without device name in the Event"
);
if (
$events =~ m{^ATTR\s(.*)
\s(ASC_Roommate_Device|ASC_WindowRec|ASC_residentsDev|ASC_rainSensor
@ -170,6 +174,10 @@ sub EventProcessingGeneral {
(.*)?}xms
)
{
::Log3( $name, 4,
"AutoShuttersControl ($name) - EventProcessing: Morning and Evening Time Shedules"
);
FHEM::Automation::ShuttersControl::CreateSunRiseSetShuttersTimer(
$hash, $2 )
if (
@ -585,7 +593,7 @@ sub EventProcessingWindowRec {
$setLastDrive = 'ventilate - window open';
}
if ( defined($posValue) && $posValue ) {
if ( defined($posValue) ) {
$FHEM::Automation::ShuttersControl::shutters->setLastDrive(
$setLastDrive);
$FHEM::Automation::ShuttersControl::shutters->setNoDelay(1);
@ -1355,6 +1363,7 @@ sub EventProcessingWind {
my $name = $hash->{NAME};
$FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
my $targetPos = $FHEM::Automation::ShuttersControl::shutters->getLastPos;
my $reading =
$FHEM::Automation::ShuttersControl::ascDev->getWindSensorReading
@ -1406,35 +1415,38 @@ sub EventProcessingWind {
{
$FHEM::Automation::ShuttersControl::shutters->setLastDrive(
'wind un-protected');
$FHEM::Automation::ShuttersControl::shutters->setDriveCmd(
(
$FHEM::Automation::ShuttersControl::shutters->getIsDay
if ( $FHEM::Automation::ShuttersControl::shutters->getIsDay
&& !$FHEM::Automation::ShuttersControl::shutters
->getIfInShading
&& $FHEM::Automation::ShuttersControl::shutters->getLastPos
== $FHEM::Automation::ShuttersControl::shutters
->getShadingPos )
{
$targetPos =
$FHEM::Automation::ShuttersControl::shutters->getOpenPos;
}
else {
$targetPos =
$FHEM::Automation::ShuttersControl::shutters->getLastPos;
}
if ( !$FHEM::Automation::ShuttersControl::shutters->getIsDay ) {
$targetPos = (
$FHEM::Automation::ShuttersControl::shutters
->getPrivacyDownStatus == 2
? $FHEM::Automation::ShuttersControl::shutters
->getLastPos
: (
$FHEM::Automation::ShuttersControl::shutters
->getShuttersPlace eq 'awning'
? $FHEM::Automation::ShuttersControl::shutters
->getOpenPos
: (
$FHEM::Automation::ShuttersControl::shutters
->getPrivacyDownStatus == 2
? $FHEM::Automation::ShuttersControl::shutters
->getPrivacyDownPos
: (
$FHEM::Automation::ShuttersControl::shutters
->getSleepPos > 0
? $FHEM::Automation::ShuttersControl::shutters
->getSleepPos
: $FHEM::Automation::ShuttersControl::shutters
->getClosedPos
)
)
)
)
);
->getPrivacyDownPos
: $FHEM::Automation::ShuttersControl::shutters
->getClosedPos
);
}
$FHEM::Automation::ShuttersControl::shutters
->setWindProtectionStatus('unprotected');
$FHEM::Automation::ShuttersControl::shutters->setDriveCmd(
$targetPos);
}
FHEM::Automation::ShuttersControl::ASC_Debug(

View File

@ -399,6 +399,8 @@ sub _IsDay {
or $FHEM::Automation::ShuttersControl::shutters->getRoommates
ne 'gotosleep' )
)
or ( $FHEM::Automation::ShuttersControl::shutters->getShuttersPlace eq
'awning' )
);
return $respIsDay;

View File

@ -153,7 +153,8 @@ sub _RainProtected {
}
sub _RainUnprotected {
my $h = shift;
my $h = shift;
my $targetPos = $FHEM::Automation::ShuttersControl::shutters->getLastPos;
my $shuttersDev = $h->{shuttersdevice};
$FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
@ -170,29 +171,35 @@ sub _RainUnprotected {
->setRainUnprotectionDelayObj('none');
}
$FHEM::Automation::ShuttersControl::shutters->setDriveCmd(
(
$FHEM::Automation::ShuttersControl::shutters->getIsDay
? $FHEM::Automation::ShuttersControl::shutters->getLastPos
: (
$FHEM::Automation::ShuttersControl::shutters->getShuttersPlace
eq 'awning'
? $FHEM::Automation::ShuttersControl::shutters->getOpenPos
: (
$FHEM::Automation::ShuttersControl::shutters
->getPrivacyDownStatus == 2
? $FHEM::Automation::ShuttersControl::shutters
->getPrivacyDownPos
: $FHEM::Automation::ShuttersControl::shutters
->getClosedPos
)
)
)
) if ( IsAfterShuttersTimeBlocking($shuttersDev) );
if ( $FHEM::Automation::ShuttersControl::shutters->getIsDay
&& !$FHEM::Automation::ShuttersControl::shutters->getIfInShading
&& $FHEM::Automation::ShuttersControl::shutters->getLastPos ==
$FHEM::Automation::ShuttersControl::shutters->getShadingPos )
{
$targetPos = $FHEM::Automation::ShuttersControl::shutters->getOpenPos;
}
else {
$targetPos = $FHEM::Automation::ShuttersControl::shutters->getLastPos;
}
if ( !$FHEM::Automation::ShuttersControl::shutters->getIsDay
&& $FHEM::Automation::ShuttersControl::shutters->getShuttersPlace ne
'awning' )
{
$targetPos = (
$FHEM::Automation::ShuttersControl::shutters->getPrivacyDownStatus
== 2
? $FHEM::Automation::ShuttersControl::shutters->getPrivacyDownPos
: $FHEM::Automation::ShuttersControl::shutters->getClosedPos
);
}
$FHEM::Automation::ShuttersControl::shutters->setRainProtectionStatus(
'unprotected');
$FHEM::Automation::ShuttersControl::shutters->setDriveCmd($targetPos)
if ( IsAfterShuttersTimeBlocking($shuttersDev) );
return;
}

View File

@ -287,6 +287,8 @@ sub ShadingProcessing {
|| $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq 'off'
|| $FHEM::Automation::ShuttersControl::ascDev
->getAutoShuttersControlShading eq 'off'
|| $FHEM::Automation::ShuttersControl::shutters
->getExternalTriggerStatus
);
::Log3( $name, 4,