Compare commits
146 Commits
Author | SHA1 | Date | |
---|---|---|---|
52930d9a07 | |||
e1592b8b7d | |||
7eb1079458 | |||
ceecbb063a | |||
49b0ff17fa | |||
ae5057fbc5 | |||
9cd0d364b4 | |||
f216e1b308 | |||
6f137256e0 | |||
cc5ef41e21 | |||
587d4e4316 | |||
|
f517b72f23 | ||
|
ad5cbaac12 | ||
8da3b13bcc | |||
c09edf5496 | |||
cd1c2c104a | |||
51256c1ed9 | |||
c0a7bfa6df | |||
403936fe73 | |||
5095c65d80 | |||
0bd8d6273f | |||
c3b61def25 | |||
9c096902e8 | |||
6dfc92c35e | |||
9994af6ca2 | |||
eb85a74a07 | |||
358c760b45 | |||
34a6a88401 | |||
bb80fb5d3a | |||
2907e19d3b | |||
ae86468077 | |||
7cba141447 | |||
f67d56e1cc | |||
527d72dd57 | |||
459b8508ec | |||
ac87015478 | |||
26105fa434 | |||
15be0a6885 | |||
cca6e90303 | |||
de5d6cbc6a | |||
|
4925e654ec | ||
97caf64308 | |||
6bf2b17d6f | |||
|
fb27bedf48 | ||
f52187ad35 | |||
103697184e | |||
c9894453bb | |||
14eee0e6dd | |||
9545dda125 | |||
3135a27c63 | |||
13689963f1 | |||
d8881ff6d1 | |||
12f48e98b5 | |||
a1d19a797d | |||
f1f265b89a | |||
ca99e2bd0c | |||
29e3a1a8d7 | |||
e02395a82f | |||
663ce748e2 | |||
d35dda835a | |||
47be49617d | |||
0dc0a9c6e4 | |||
79d369b9f5 | |||
8109cd7ebe | |||
842e41e3dc | |||
35a4f60a53 | |||
ef650b2d4b | |||
bf773ca2d7 | |||
ae88630277 | |||
f811cfd87f | |||
1a71c63652 | |||
7d3d11d1e2 | |||
1eeeb85eaf | |||
|
397f949a21 | ||
|
4ea1db3aa0 | ||
|
004a15ea42 | ||
|
9a1b6acad3 | ||
4aa24587a5 | |||
c76280639f | |||
a3c023711c | |||
c6e88f2d45 | |||
f0f5cbde4b | |||
5928276b74 | |||
32a3ac9d13 | |||
ef590e002e | |||
427018ab46 | |||
89431a2af3 | |||
39c7ec3dc5 | |||
37044b2316 | |||
a44fffe94e | |||
870f2be5d8 | |||
36669f1405 | |||
a61458cfc2 | |||
8c17eb5f6a | |||
d87ddb146c | |||
58b2f20f19 | |||
301fd32048 | |||
0255be94b5 | |||
4773fd0ea0 | |||
1ce3805427 | |||
5f00d33fa9 | |||
|
da79e25929 | ||
|
0b22ac9e12 | ||
e6a01cdb18 | |||
fb44ff9f1a | |||
9663b2dd43 | |||
d6cb059eaf | |||
6774e3a918 | |||
e28fad13d7 | |||
1c1ac77851 | |||
1ac38a7216 | |||
8d6044c404 | |||
fcce22b102 | |||
4b5b03a8fc | |||
f412e88325 | |||
0dca852ad0 | |||
8ea4101747 | |||
b9a7328661 | |||
f03a7d690f | |||
5ccceaba16 | |||
54450962ac | |||
9409c60400 | |||
75f5b6bf01 | |||
98edf0c5f6 | |||
a9a47f9e70 | |||
f2b7e8490f | |||
3d7f9fcf92 | |||
e037a12879 | |||
096e4ab815 | |||
feba24bf99 | |||
e5a6bbdbe5 | |||
a66daa7d5a | |||
617b7a7531 | |||
f498829347 | |||
4cc3ecc40a | |||
95446cc91e | |||
63393b4cd4 | |||
6a62226a39 | |||
cbd058773d | |||
649d21f19b | |||
62a4a249b4 | |||
a2c878e333 | |||
4c1d6c7885 | |||
6babb451c9 | |||
bd6e901ca1 | |||
f36101f48a |
8426
CHANGELOG.md
Normal file
8426
CHANGELOG.md
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,8 +1,8 @@
|
|||||||
###############################################################################
|
###############################################################################
|
||||||
#
|
#
|
||||||
# Developed with Kate
|
# Developed with VSCodium and richterger perl plugin
|
||||||
#
|
#
|
||||||
# (c) 2018-2021 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net)
|
# (c) 2018-2025 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net)
|
||||||
# All rights reserved
|
# All rights reserved
|
||||||
#
|
#
|
||||||
# Special thanks goes to:
|
# Special thanks goes to:
|
||||||
@ -49,26 +49,17 @@ use utf8;
|
|||||||
use FHEM::Meta;
|
use FHEM::Meta;
|
||||||
|
|
||||||
use FHEM::Automation::ShuttersControl;
|
use FHEM::Automation::ShuttersControl;
|
||||||
use GPUtils qw(GP_Import GP_Export);
|
use GPUtils qw(GP_Import);
|
||||||
|
|
||||||
## Import der FHEM Funktionen
|
## Import der FHEM Funktionen
|
||||||
#-- Run before package compilation
|
#-- Run before package compilation
|
||||||
BEGIN {
|
BEGIN {
|
||||||
# Import from main context
|
# Import from main context
|
||||||
GP_Import(
|
GP_Import(qw(readingFnAttributes));
|
||||||
qw(
|
|
||||||
readingFnAttributes
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
#-- Export to main context with different name
|
|
||||||
GP_Export(
|
|
||||||
qw(
|
|
||||||
Initialize
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub ::AutoShuttersControl_Initialize { goto &Initialize }
|
||||||
|
|
||||||
sub Initialize {
|
sub Initialize {
|
||||||
my $hash = shift;
|
my $hash = shift;
|
||||||
|
|
||||||
@ -81,7 +72,7 @@ sub Initialize {
|
|||||||
$hash->{UndefFn} = \&FHEM::Automation::ShuttersControl::Undef;
|
$hash->{UndefFn} = \&FHEM::Automation::ShuttersControl::Undef;
|
||||||
$hash->{DeleteFn} = \&FHEM::Automation::ShuttersControl::Delete;
|
$hash->{DeleteFn} = \&FHEM::Automation::ShuttersControl::Delete;
|
||||||
$hash->{ShutdownFn} = \&FHEM::Automation::ShuttersControl::Shutdown;
|
$hash->{ShutdownFn} = \&FHEM::Automation::ShuttersControl::Shutdown;
|
||||||
$hash->{AttrList} =
|
$hash->{AttrList} =
|
||||||
'ASC_tempSensor '
|
'ASC_tempSensor '
|
||||||
. 'ASC_brightnessDriveUpDown '
|
. 'ASC_brightnessDriveUpDown '
|
||||||
. 'ASC_autoShuttersControlMorning:on,off '
|
. 'ASC_autoShuttersControlMorning:on,off '
|
||||||
@ -100,7 +91,8 @@ sub Initialize {
|
|||||||
. 'ASC_expert:1 '
|
. 'ASC_expert:1 '
|
||||||
. 'ASC_blockAscDrivesAfterManual:0,1 '
|
. 'ASC_blockAscDrivesAfterManual:0,1 '
|
||||||
. 'ASC_debug:1 '
|
. 'ASC_debug:1 '
|
||||||
. 'ASC_advDate:DeadSunday,FirstAdvent '
|
. 'ASC_advStartDate:DeadSunday,FirstAdvent '
|
||||||
|
. 'ASC_advEndDate:CandlemasDay,EpiphanyDay '
|
||||||
. $readingFnAttributes;
|
. $readingFnAttributes;
|
||||||
$hash->{NotifyOrderPrefix} = '51-'; # Order Nummer für NotifyFn
|
$hash->{NotifyOrderPrefix} = '51-'; # Order Nummer für NotifyFn
|
||||||
$hash->{FW_detailFn} =
|
$hash->{FW_detailFn} =
|
||||||
@ -328,8 +320,11 @@ __END__
|
|||||||
<li><strong>ASC_freezeTemp</strong> - Temperature threshold for the freeze protection. The freeze protection
|
<li><strong>ASC_freezeTemp</strong> - Temperature threshold for the freeze protection. The freeze protection
|
||||||
prevents the shutter to be operated by <abbr>ASC</abbr>. Last operating order will be kept.
|
prevents the shutter to be operated by <abbr>ASC</abbr>. Last operating order will be kept.
|
||||||
</li>
|
</li>
|
||||||
<a id="AutoShuttersControl-attr-ASC_advDate"></a>
|
<a id="AutoShuttersControl-attr-ASC_advStartDate"></a>
|
||||||
<li><strong>ASC_advDate</strong> - Advent Season, selected FirstAdvent or DeadSunday.
|
<li><strong>ASC_advStartDate</strong> - Begin of Advent Season, selected FirstAdvent or DeadSunday.
|
||||||
|
</li>
|
||||||
|
<a id="AutoShuttersControl-attr-ASC_advEndDate"></a>
|
||||||
|
<li><strong>ASC_advEndDate</strong> - End of Advent Season, selected CandlemasDay 6. January or EpiphanyDay 2. February.
|
||||||
</li>
|
</li>
|
||||||
<a id="AutoShuttersControl-attr-ASC_rainSensor"></a>
|
<a id="AutoShuttersControl-attr-ASC_rainSensor"></a>
|
||||||
<li><strong>ASC_rainSensor DEVICENAME[:READINGNAME] MAXTRIGGER[:HYSTERESE] [CLOSEDPOS]</strong> - Contains
|
<li><strong>ASC_rainSensor DEVICENAME[:READINGNAME] MAXTRIGGER[:HYSTERESE] [CLOSEDPOS]</strong> - Contains
|
||||||
@ -639,6 +634,19 @@ __END__
|
|||||||
</li>
|
</li>
|
||||||
<a id="AutoShuttersControl-attr-ASC_SlatPosCmd_SlatDevice"></a>
|
<a id="AutoShuttersControl-attr-ASC_SlatPosCmd_SlatDevice"></a>
|
||||||
<li><strong>ASC_SlatPosCmd_SlatDevice</strong> - If your shutter is "venetian blind" type (with turnable slats, lamellas or similar), this is the place to set additional command and/or device info to control the slat level. Examples: <i>attr ROLLO ASC_SlatPosCmd_SlatDevice slatPct</i> or <i>attr ROLLO ASC_SlatPosCmd_SlatDevice dim:ROLLOSLATDEVICE</i>. Providing a device name for the slat device is only needed in case it's different to the shutter itself. If attribute is set, additional positioning values for the respective slat levels can be set in attributes <i>ASC_Open_Pos</i>, <i>ASC_Closed_Pos</i>, <i>ASC_Ventilate_Pos</i>, <i>ASC_ComfortOpen_Pos</i>, <i>ASC_Shading_Pos</i> and <i>ASC_Sleep_Pos</i>.</li>
|
<li><strong>ASC_SlatPosCmd_SlatDevice</strong> - If your shutter is "venetian blind" type (with turnable slats, lamellas or similar), this is the place to set additional command and/or device info to control the slat level. Examples: <i>attr ROLLO ASC_SlatPosCmd_SlatDevice slatPct</i> or <i>attr ROLLO ASC_SlatPosCmd_SlatDevice dim:ROLLOSLATDEVICE</i>. Providing a device name for the slat device is only needed in case it's different to the shutter itself. If attribute is set, additional positioning values for the respective slat levels can be set in attributes <i>ASC_Open_Pos</i>, <i>ASC_Closed_Pos</i>, <i>ASC_Ventilate_Pos</i>, <i>ASC_ComfortOpen_Pos</i>, <i>ASC_Shading_Pos</i> and <i>ASC_Sleep_Pos</i>.</li>
|
||||||
|
<a id="AutoShuttersControl-attr-ASC_CommandTemplate"></a>
|
||||||
|
<li><strong>ASC_CommandTemplate</strong> - <strong>FHEM or Perl command</strong> (Perl in braces as usual needs escaping semicolons etc.).<br>
|
||||||
|
This optional attribute will override the internally determined command to drive this shutter. Setting it, is only recommended in <strong>some rare and special cases,</strong>, in most cases there's <strong>no need</strong> to set this attribute!
|
||||||
|
The parameters <i>$name</i> (name of the shutter device), <i>$pos</i> (target position for the respective drive command), <i>$slatPos</i> (target position for the (turnable) lammellas in venetion blinds) and <i>$cause</i> (internal label for the cause of the driving command) will be replaced by the appropirate values. You may have to take care to avoid unneeded driving commands.
|
||||||
|
Examples:
|
||||||
|
<ul>
|
||||||
|
<li><i>attr ROLLO ASC_CommandTemplate set $name $pos</i> - Address the position command directly to the main switch of the device</li>
|
||||||
|
<li><i>attr ROLLO ASC_CommandTemplate set $name pct $pos</i> - Address the setter <i>pct</i> for positioning commands</li>
|
||||||
|
<li><i>attr ROLLO ASC_CommandTemplate set $name datapoint 4.LEVEL_2 $slatPos 4.LEVEL $pos</i> - combined positioning command, e.g. appropriate for HM-IP-venetian blind type actors</li>
|
||||||
|
<li><i>attr ROLLO ASC_CommandTemplate { fhem("set $name ".($pos+1024)).";set $name 0")}</i> - positioning command with Perl calculation and additional "execute" command, e.g. for an SPS type blind</li>
|
||||||
|
<li><i>attr ROLLO ASC_CommandTemplate { myPerlFn("$name",$pos,$slatPos,"$cause")}</i> - call own Perl function (e.g. from 99_myUtils.pm)</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
<a id="AutoShuttersControl-attr-ASC_WindowRec_PosAfterDayClosed"></a>
|
<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ßen am Tag fahren. Open Position oder letzte gespeicherte manuelle Position (default: open)</li>
|
<li><strong>ASC_WindowRec_PosAfterDayClosed</strong> - open,lastManual / auf welche Position soll das Rollo nach dem schließen am Tag fahren. Open Position oder letzte gespeicherte manuelle Position (default: open)</li>
|
||||||
<blockquote>
|
<blockquote>
|
||||||
@ -699,7 +707,7 @@ __END__
|
|||||||
are used for shading. Defaults to 120.
|
are used for shading. Defaults to 120.
|
||||||
</li>
|
</li>
|
||||||
<a id="AutoShuttersControl-attr-ASC_Shading_BetweenTheTime"></a>
|
<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>
|
</ul>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
</ul>
|
</ul>
|
||||||
@ -993,8 +1001,10 @@ __END__
|
|||||||
<li><strong>ASC_expert</strong> - ist der Wert 1, so werden erweiterte Informationen bezüglich des NotifyDevs unter set und get angezeigt</li>
|
<li><strong>ASC_expert</strong> - ist der Wert 1, so werden erweiterte Informationen bezüglich des NotifyDevs unter set und get angezeigt</li>
|
||||||
<a id="AutoShuttersControl-attr-ASC_freezeTemp"></a>
|
<a id="AutoShuttersControl-attr-ASC_freezeTemp"></a>
|
||||||
<li><strong>ASC_freezeTemp</strong> - Temperatur, ab welcher der Frostschutz greifen soll und der Rollladen nicht mehr fährt. Der letzte Fahrbefehl wird gespeichert.</li>
|
<li><strong>ASC_freezeTemp</strong> - Temperatur, ab welcher der Frostschutz greifen soll und der Rollladen nicht mehr fährt. Der letzte Fahrbefehl wird gespeichert.</li>
|
||||||
<a id="AutoShuttersControl-attr-ASC_advDate"></a>
|
<a id="AutoShuttersControl-attr-ASC_advStartDate"></a>
|
||||||
<li><strong>ASC_advDate</strong> - Adventszeit, Auswahl ab wann die Adventszeit beginnen soll.</li>
|
<li><strong>ASC_advStartDate</strong> - Start der Adventszeit, Auswahl ab wann die Adventszeit beginnen soll. 1. Advent oder Totensonntag</li>
|
||||||
|
<a id="AutoShuttersControl-attr-ASC_advEndDate"></a>
|
||||||
|
<li><strong>ASC_advEndDate</strong> - Ende der Adventszeit, Auswahl ab wann die Adventszeit Enden soll. EpiphanyDay 6. Januar oder CandlemasDay 2. Februar</li>
|
||||||
<a id="AutoShuttersControl-attr-ASC_rainSensor"></a>
|
<a id="AutoShuttersControl-attr-ASC_rainSensor"></a>
|
||||||
<li><strong>ASC_rainSensor - DEVICENAME[:READINGNAME] MAXTRIGGER[:HYSTERESE] [CLOSEDPOS:[WAITINGTIME]]</strong> - der Inhalt ist eine Kombination aus Devicename, Readingname, Wert ab dem getriggert werden soll, Hysterese Wert ab dem der Status Regenschutz aufgehoben werden soll und der "wegen Regen geschlossen Position", sowie der Wartezeit bis dann tatsächlich die aktion ausgeführt wird.</li>
|
<li><strong>ASC_rainSensor - DEVICENAME[:READINGNAME] MAXTRIGGER[:HYSTERESE] [CLOSEDPOS:[WAITINGTIME]]</strong> - der Inhalt ist eine Kombination aus Devicename, Readingname, Wert ab dem getriggert werden soll, Hysterese Wert ab dem der Status Regenschutz aufgehoben werden soll und der "wegen Regen geschlossen Position", sowie der Wartezeit bis dann tatsächlich die aktion ausgeführt wird.</li>
|
||||||
<a id="AutoShuttersControl-attr-ASC_residentsDev"></a>
|
<a id="AutoShuttersControl-attr-ASC_residentsDev"></a>
|
||||||
@ -1019,11 +1029,11 @@ __END__
|
|||||||
<a id="AutoShuttersControl-attr-ASC_Antifreeze_Pos"></a>
|
<a id="AutoShuttersControl-attr-ASC_Antifreeze_Pos"></a>
|
||||||
<li><strong>ASC_Antifreeze_Pos</strong> - Position die angefahren werden soll, wenn der Fahrbefehl komplett schließen lautet, aber der Frostschutz aktiv ist (Default: ist abhängig vom Attribut<em>ASC</em> 85/15) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!</li>
|
<li><strong>ASC_Antifreeze_Pos</strong> - Position die angefahren werden soll, wenn der Fahrbefehl komplett schließen lautet, aber der Frostschutz aktiv ist (Default: ist abhängig vom Attribut<em>ASC</em> 85/15) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!</li>
|
||||||
<a id="AutoShuttersControl-attr-ASC_AutoAstroModeEvening"></a>
|
<a id="AutoShuttersControl-attr-ASC_AutoAstroModeEvening"></a>
|
||||||
<li><strong>ASC_AutoAstroModeEvening</strong> - aktuell REAL,CIVIL,NAUTIC,ASTRONOMIC (default: none)</li>
|
<li><strong>ASC_AutoAstroModeEvening</strong> - aktuell REAL,CIVIL,NAUTIC,ASTRONOMIC oder HORIZON (default: none)</li>
|
||||||
<a id="AutoShuttersControl-attr-ASC_AutoAstroModeEveningHorizon"></a>
|
<a id="AutoShuttersControl-attr-ASC_AutoAstroModeEveningHorizon"></a>
|
||||||
<li><strong>ASC_AutoAstroModeEveningHorizon</strong> - Höhe über Horizont, wenn beim Attribut ASC_autoAstroModeEvening HORIZON ausgewählt (default: none)</li>
|
<li><strong>ASC_AutoAstroModeEveningHorizon</strong> - Höhe über Horizont, wenn beim Attribut ASC_autoAstroModeEvening HORIZON ausgewählt (default: none)</li>
|
||||||
<a id="AutoShuttersControl-attr-ASC_AutoAstroModeMorning"></a>
|
<a id="AutoShuttersControl-attr-ASC_AutoAstroModeMorning"></a>
|
||||||
<li><strong>ASC_AutoAstroModeMorning</strong> - aktuell REAL,CIVIL,NAUTIC,ASTRONOMIC (default: none)</li>
|
<li><strong>ASC_AutoAstroModeMorning</strong> - aktuell REAL,CIVIL,NAUTIC,ASTRONOMIC oder HORIZON (default: none)</li>
|
||||||
<a id="AutoShuttersControl-attr-ASC_AutoAstroModeMorningHorizon"></a>
|
<a id="AutoShuttersControl-attr-ASC_AutoAstroModeMorningHorizon"></a>
|
||||||
<li><strong>ASC_AutoAstroModeMorningHorizon</strong> - Höhe über Horizont,a wenn beim Attribut ASC_autoAstroModeMorning HORIZON ausgewählt (default: none)</li>
|
<li><strong>ASC_AutoAstroModeMorningHorizon</strong> - Höhe über Horizont,a wenn beim Attribut ASC_autoAstroModeMorning HORIZON ausgewählt (default: none)</li>
|
||||||
<a id="AutoShuttersControl-attr-ASC_BlockingTime_afterManual"></a>
|
<a id="AutoShuttersControl-attr-ASC_BlockingTime_afterManual"></a>
|
||||||
@ -1035,7 +1045,7 @@ __END__
|
|||||||
<a id="AutoShuttersControl-attr-ASC_BrightnessSensor"></a>
|
<a id="AutoShuttersControl-attr-ASC_BrightnessSensor"></a>
|
||||||
<li><strong>ASC_BrightnessSensor - DEVICE[:READING] WERT-MORGENS:WERT-ABENDS</strong> / '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)</li>
|
<li><strong>ASC_BrightnessSensor - DEVICE[:READING] WERT-MORGENS:WERT-ABENDS</strong> / '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)</li>
|
||||||
<a id="AutoShuttersControl-attr-ASC_Down"></a>
|
<a id="AutoShuttersControl-attr-ASC_Down"></a>
|
||||||
<li><strong>ASC_Down - astro/time/brightness</strong> - 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)</li>
|
<li><strong>ASC_Down - astro/time/brightness/roommate</strong> - 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)</li>
|
||||||
<ul></p>
|
<ul></p>
|
||||||
<strong><u>Beschreibung der besonderen Positionsattribute</u></strong>
|
<strong><u>Beschreibung der besonderen Positionsattribute</u></strong>
|
||||||
<a id="AutoShuttersControl-attr-ASC_Closed_Pos"></a>
|
<a id="AutoShuttersControl-attr-ASC_Closed_Pos"></a>
|
||||||
@ -1127,7 +1137,7 @@ __END__
|
|||||||
<a id="AutoShuttersControl-attr-ASC_Shading_WaitingPeriod"></a>
|
<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ür die Beschattung stattfinden soll (default: 1200)</li>
|
<li><strong>ASC_Shading_WaitingPeriod</strong> - wie viele Sekunden soll gewartet werden bevor eine weitere Auswertung der Sensordaten für die Beschattung stattfinden soll (default: 1200)</li>
|
||||||
<a id="AutoShuttersControl-attr-ASC_Shading_BetweenTheTime"></a>
|
<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>
|
</ul></p>
|
||||||
<a id="AutoShuttersControl-attr-ASC_ShuttersPlace"></a>
|
<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>
|
<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>
|
||||||
@ -1142,13 +1152,13 @@ __END__
|
|||||||
<a id="AutoShuttersControl-attr-ASC_Time_Up_WE_Holiday"></a>
|
<a id="AutoShuttersControl-attr-ASC_Time_Up_WE_Holiday"></a>
|
||||||
<li><strong>ASC_Time_Up_WE_Holiday</strong> - Sonnenaufgang frühste Zeit zum Hochfahren am Wochenende und/oder Urlaub (holiday2we wird beachtet). (default: 08:00) ACHTUNG!!! in Verbindung mit Brightness für <em>ASC_Up</em> muss die Uhrzeit kleiner sein wie die Uhrzeit aus <em>ASC_Time_Up_Late</em> !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!</li>
|
<li><strong>ASC_Time_Up_WE_Holiday</strong> - Sonnenaufgang frühste Zeit zum Hochfahren am Wochenende und/oder Urlaub (holiday2we wird beachtet). (default: 08:00) ACHTUNG!!! in Verbindung mit Brightness für <em>ASC_Up</em> muss die Uhrzeit kleiner sein wie die Uhrzeit aus <em>ASC_Time_Up_Late</em> !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!</li>
|
||||||
<a id="AutoShuttersControl-attr-ASC_Up"></a>
|
<a id="AutoShuttersControl-attr-ASC_Up"></a>
|
||||||
<li><strong>ASC_Up - astro/time/brightness</strong> - 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)</li>
|
<li><strong>ASC_Up - astro/time/brightness/roommate</strong> - 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)</li>
|
||||||
<a id="AutoShuttersControl-attr-ASC_Ventilate_Window_Open"></a>
|
<a id="AutoShuttersControl-attr-ASC_Ventilate_Window_Open"></a>
|
||||||
<li><strong>ASC_Ventilate_Window_Open</strong> - auf lüften, wenn das Fenster gekippt/geöffnet wird und aktuelle Position unterhalb der Lüften-Position ist (default: on)</li>
|
<li><strong>ASC_Ventilate_Window_Open</strong> - auf lüften, wenn das Fenster gekippt/geöffnet wird und aktuelle Position unterhalb der Lüften-Position ist (default: on)</li>
|
||||||
<a id="AutoShuttersControl-attr-ASC_WiggleValue"></a>
|
<a id="AutoShuttersControl-attr-ASC_WiggleValue"></a>
|
||||||
<li><strong>ASC_WiggleValue</strong> - Wert um welchen sich die Position des Rollladens ändern soll (default: 5)</li>
|
<li><strong>ASC_WiggleValue</strong> - Wert um welchen sich die Position des Rollladens ändern soll (default: 5)</li>
|
||||||
<a id="AutoShuttersControl-attr-ASC_WindParameters"></a>
|
<a id="AutoShuttersControl-attr-ASC_WindParameters"></a>
|
||||||
<li><strong>ASC_WindParameters - TRIGGERMAX[:HYSTERESE] [DRIVEPOSITION]</strong> / 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')</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ü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 ASC_Closed_Pos')</li>
|
||||||
<a id="AutoShuttersControl-attr-ASC_WindowRec_PosAfterDayClosed"></a>
|
<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ßen am Tag fahren. Open Position oder letzte gespeicherte manuelle Position (default: open)</li>
|
<li><strong>ASC_WindowRec_PosAfterDayClosed</strong> - open,lastManual / auf welche Position soll das Rollo nach dem schließen am Tag fahren. Open Position oder letzte gespeicherte manuelle Position (default: open)</li>
|
||||||
<a id="AutoShuttersControl-attr-ASC_WindowRec"></a>
|
<a id="AutoShuttersControl-attr-ASC_WindowRec"></a>
|
||||||
@ -1157,6 +1167,22 @@ __END__
|
|||||||
<li><strong>ASC_WindowRec_subType</strong> - Typ des verwendeten Fensterkontaktes: twostate (optisch oder magnetisch) oder threestate (Drehgriffkontakt) (default: twostate)</li>
|
<li><strong>ASC_WindowRec_subType</strong> - Typ des verwendeten Fensterkontaktes: twostate (optisch oder magnetisch) oder threestate (Drehgriffkontakt) (default: twostate)</li>
|
||||||
<a id="AutoShuttersControl-attr-ASC_SlatPosCmd_SlatDevice"></a>
|
<a id="AutoShuttersControl-attr-ASC_SlatPosCmd_SlatDevice"></a>
|
||||||
<li><strong>ASC_SlatPosCmd_SlatDevice</strong> - Angaben zu einem Slat (Lamellen) CMD und - sofern diese Lamellen über ein anderes Device gesteuert werden - zum Slat Device. Beispiele: <i>attr ROLLO ASC_SlatPosCmd_SlatDevice slatPct</i> oder <i>attr ROLLO ASC_SlatPosCmd_SlatDevice dim:ROLLOSLATDEVICE</i>. 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.</li>
|
<li><strong>ASC_SlatPosCmd_SlatDevice</strong> - Angaben zu einem Slat (Lamellen) CMD und - sofern diese Lamellen über ein anderes Device gesteuert werden - zum Slat Device. Beispiele: <i>attr ROLLO ASC_SlatPosCmd_SlatDevice slatPct</i> oder <i>attr ROLLO ASC_SlatPosCmd_SlatDevice dim:ROLLOSLATDEVICE</i>. 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.</li>
|
||||||
|
<a id="AutoShuttersControl-attr-ASC_CommandTemplate"></a>
|
||||||
|
<a id="AutoShuttersControl-attr-ASC_CommandTemplate"></a>
|
||||||
|
<li><strong>ASC_CommandTemplate</strong> - <strong>FHEM-Kommando(s) oder Perl-Anweisung</strong> (in geschweiften Klammern unter Beachtung der üblichen Regeln für das escapen von Semicolons etc.).<br>
|
||||||
|
Dieses Attribut übersteuert das sonst intern ermittelte Fahrkommando und ist <strong>für seltene und spezielle Fälle</strong> gedacht. In der Regel ist es nicht erforderlich, dieses Attribut zu setzen!<br>
|
||||||
|
Die Variablen <i>$name</i> (der Name des Rollladen-Devices), <i>$pos</i> (die Zielposition des Fahrbefehls), <i>$slatPos</i> (die Zielposition des Fahrbefehls für eventuelle Lamellen) und <i>$cause</i> (die interne Benennung des Fahranlasses) werden durch die ermittelten Werte ersetzt, es muss selbst dafür gesorgt werden, dass eventuell unnötige Fahrbefehle aussortiert werden.
|
||||||
|
Beispiele:
|
||||||
|
<ul>
|
||||||
|
<li><i>attr ROLLO ASC_CommandTemplate set $name $pos</i> - Positionsbefehl direkt an Gerät
|
||||||
|
setzen</li>
|
||||||
|
<li><i>attr ROLLO ASC_CommandTemplate set $name pct $pos</i> - Positionsbefehl auf den setter <i>pct</i> absetzen</li>
|
||||||
|
<li><i>attr ROLLO ASC_CommandTemplate set $name datapoint 4.LEVEL_2 $slatPos 4.LEVEL $pos</i> - Positionsbefehl und Lamellen-Ansteuerung für HM-IP-Jalousieaktoren</li>
|
||||||
|
<li><i>attr ROLLO ASC_CommandTemplate { fhem("set $name ".($pos+1024)).";set $name 0")}</i> - Positionsbefehl für eine SPS in Perl umrechnen</li>
|
||||||
|
<li><i>attr ROLLO ASC_CommandTemplate { myPerlFn("$name",$pos,$slatPos,"$cause")}</i> - eigene Perl-Funktion (z.B. in 99_myUtils.pm) aufrufen</li>
|
||||||
|
</ul>
|
||||||
|
<strong>Hinweis: ASC_CommandTemplate</strong> ist für seltene und spezielle Fälle gedacht. In der Regel ist es nicht erforderlich, dieses Attribut zu setzen!
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</ul>
|
</ul>
|
||||||
</p>
|
</p>
|
||||||
@ -1297,7 +1323,7 @@ __END__
|
|||||||
<tr><td>Sunrise</td><td>1=Morgenfahrt wurde durchgeführt, 0=noch keine Morgenfahrt durchgeführt</td></tr>
|
<tr><td>Sunrise</td><td>1=Morgenfahrt wurde durchgeführt, 0=noch keine Morgenfahrt durchgeführt</td></tr>
|
||||||
<tr><td>RoommatesStatus</td><td>aktueller Status der/des Roommate/s für den Rollladen</td></tr>
|
<tr><td>RoommatesStatus</td><td>aktueller Status der/des Roommate/s für den Rollladen</td></tr>
|
||||||
<tr><td>RoommatesLastStatus</td><td>letzter Status der/des Roommate/s für den Rollladen</td></tr>
|
<tr><td>RoommatesLastStatus</td><td>letzter Status der/des Roommate/s fü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, <EFBFBD><EFBFBD><EFBFBD>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>ShadingStatusTimestamp</td><td>Timestamp des letzten Beschattungsstatus</td></tr>
|
||||||
<tr><td>IfInShading</td><td>Befindet sich der Rollladen, in Abhängigkeit des Shading Mode, in der Beschattung</td></tr>
|
<tr><td>IfInShading</td><td>Befindet sich der Rollladen, in Abhä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>
|
<tr><td>DelayCmd</td><td>letzter Fahrbefehl welcher in die Warteschlange kam. Grund z.B. Partymodus.</td></tr>
|
||||||
@ -1436,7 +1462,7 @@ __END__
|
|||||||
],
|
],
|
||||||
"release_status": "stable",
|
"release_status": "stable",
|
||||||
"license": "GPL_2",
|
"license": "GPL_2",
|
||||||
"version": "v0.10.16",
|
"version": "v0.99.10",
|
||||||
"author": [
|
"author": [
|
||||||
"Marko Oldenburg <fhemdevelopment@cooltux.net>"
|
"Marko Oldenburg <fhemdevelopment@cooltux.net>"
|
||||||
],
|
],
|
||||||
@ -1450,7 +1476,7 @@ __END__
|
|||||||
"runtime": {
|
"runtime": {
|
||||||
"requires": {
|
"requires": {
|
||||||
"FHEM": 5.00918799,
|
"FHEM": 5.00918799,
|
||||||
"perl": 5.016,
|
"perl": 5.023,
|
||||||
"Meta": 0,
|
"Meta": 0,
|
||||||
"JSON": 0,
|
"JSON": 0,
|
||||||
"Date::Parse": 0
|
"Date::Parse": 0
|
||||||
|
@ -1,16 +1,16 @@
|
|||||||
UPD 2021-10-09_07:07:29 111901 FHEM/73_AutoShuttersControl.pm
|
UPD 2024-10-12_07:38:48 116314 FHEM/73_AutoShuttersControl.pm
|
||||||
UPD 2021-09-14_09:51:23 74456 lib/FHEM/Automation/ShuttersControl.pm
|
UPD 2024-10-12_07:35:03 76335 lib/FHEM/Automation/ShuttersControl.pm
|
||||||
UPD 2021-09-14_09:51:23 2657 lib/FHEM/Automation/ShuttersControl/Dev.pm
|
UPD 2024-10-12_07:33:39 2691 lib/FHEM/Automation/ShuttersControl/Dev.pm
|
||||||
UPD 2021-10-09_07:08:59 2494 lib/FHEM/Automation/ShuttersControl/Roommate.pm
|
UPD 2024-10-12_07:34:12 2675 lib/FHEM/Automation/ShuttersControl/Roommate.pm
|
||||||
UPD 2021-10-09_07:09:33 31894 lib/FHEM/Automation/ShuttersControl/Shutters.pm
|
UPD 2024-10-12_07:34:38 31828 lib/FHEM/Automation/ShuttersControl/Shutters.pm
|
||||||
UPD 2021-10-09_07:09:29 25333 lib/FHEM/Automation/ShuttersControl/Shading.pm
|
UPD 2024-10-12_07:34:24 25541 lib/FHEM/Automation/ShuttersControl/Shading.pm
|
||||||
UPD 2021-10-01_08:09:29 109370 lib/FHEM/Automation/ShuttersControl/EventProcessingFunctions.pm
|
UPD 2024-10-12_07:33:49 112297 lib/FHEM/Automation/ShuttersControl/EventProcessingFunctions.pm
|
||||||
UPD 2021-09-14_09:51:23 40628 lib/FHEM/Automation/ShuttersControl/Helper.pm
|
UPD 2024-10-12_07:34:00 40681 lib/FHEM/Automation/ShuttersControl/Helper.pm
|
||||||
UPD 2021-10-09_07:09:47 2173 lib/FHEM/Automation/ShuttersControl/Window.pm
|
UPD 2024-10-12_07:34:46 2209 lib/FHEM/Automation/ShuttersControl/Window.pm
|
||||||
UPD 2021-10-09_07:10:04 11739 lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm
|
UPD 2024-10-12_07:38:13 11857 lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm
|
||||||
UPD 2021-10-09_07:10:16 7249 lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm
|
UPD 2024-10-12_07:38:06 7265 lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm
|
||||||
UPD 2021-10-09_07:10:38 52523 lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm
|
UPD 2024-10-12_07:37:57 52751 lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm
|
||||||
UPD 2021-10-09_07:10:47 2901 lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm
|
UPD 2024-10-12_07:37:49 2799 lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm
|
||||||
UPD 2021-10-09_07:11:04 3978 lib/FHEM/Automation/ShuttersControl/Window/Attr.pm
|
UPD 2024-10-12_07:37:43 3887 lib/FHEM/Automation/ShuttersControl/Window/Attr.pm
|
||||||
UPD 2021-10-09_07:11:27 2286 lib/FHEM/Automation/ShuttersControl/Window/Readings.pm
|
UPD 2024-10-12_07:33:29 2200 lib/FHEM/Automation/ShuttersControl/Window/Readings.pm
|
||||||
UPD 2021-10-08_11:44:44 6506 lib/FHEM/Automation/ShuttersControl/Rainprotection.pm
|
UPD 2024-10-12_07:34:06 7394 lib/FHEM/Automation/ShuttersControl/Rainprotection.pm
|
||||||
|
36
hooks/commit-msg
Executable file
36
hooks/commit-msg
Executable file
@ -0,0 +1,36 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# An example hook script to check the commit log message.
|
||||||
|
# Called by "git commit" with one argument, the name of the file
|
||||||
|
# that has the commit message. The hook should exit with non-zero
|
||||||
|
# status after issuing an appropriate message if it wants to stop the
|
||||||
|
# commit. The hook is allowed to edit the commit message file.
|
||||||
|
#
|
||||||
|
# To enable this hook, rename this file to "commit-msg".
|
||||||
|
|
||||||
|
# Uncomment the below to add a Signed-off-by line to the message.
|
||||||
|
# Doing this in a hook is a bad idea in general, but the prepare-commit-msg
|
||||||
|
# hook is more suited to it.
|
||||||
|
#
|
||||||
|
# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
|
||||||
|
# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
|
||||||
|
|
||||||
|
# This example catches duplicate Signed-off-by lines.
|
||||||
|
|
||||||
|
commit_msg=$(cat "${1:?Missing commit message file}")
|
||||||
|
|
||||||
|
test "" = "$(grep '^Signed-off-by: ' "$1" |
|
||||||
|
sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || {
|
||||||
|
echo >&2 Duplicate Signed-off-by lines.
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if ! echo "$commit_msg" | grep -Eq "^(build|chore|ci|docs|feat|feat!|fix|perf|refactor|revert|style|test)(\(.+\))?: .*$" ; then
|
||||||
|
|
||||||
|
echo "Invalid commit message"
|
||||||
|
|
||||||
|
exit 1
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Commit message is valid!"
|
18
hooks/post-commit
Executable file
18
hooks/post-commit
Executable file
@ -0,0 +1,18 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
# destination of the final changelog file
|
||||||
|
OUTPUT_FILE=CHANGELOG.md
|
||||||
|
|
||||||
|
# generate the changelog
|
||||||
|
git --no-pager log --no-merges --format="### %s%d%n>%aD%n%n>Author: %aN (%aE)%n%n>Commiter: %cN (%cE)%n%n%b%n%N%n" > $OUTPUT_FILE
|
||||||
|
|
||||||
|
# prevent recursion!
|
||||||
|
# since a 'commit --amend' will trigger the post-commit script again
|
||||||
|
# we have to check if the changelog file has changed or not
|
||||||
|
res=$(git status --porcelain | grep -c ".\$OUTPUT_FILE$")
|
||||||
|
if [ "$res" -gt 0 ]; then
|
||||||
|
git add $OUTPUT_FILE
|
||||||
|
git commit --amend
|
||||||
|
echo "Populated Changelog in $OUTPUT_FILE"
|
||||||
|
fi
|
File diff suppressed because it is too large
Load Diff
@ -1,8 +1,8 @@
|
|||||||
###############################################################################
|
###############################################################################
|
||||||
#
|
#
|
||||||
# Developed with Kate
|
# Developed with VSCodium and richterger perl plugin
|
||||||
#
|
#
|
||||||
# (c) 2018-2021 Copyright: Marko Oldenburg (leongaultier at gmail dot com)
|
# (c) 2018-2025 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net)
|
||||||
# All rights reserved
|
# All rights reserved
|
||||||
#
|
#
|
||||||
# Special thanks goes to:
|
# Special thanks goes to:
|
||||||
@ -43,7 +43,7 @@ package FHEM::Automation::ShuttersControl::Dev;
|
|||||||
use FHEM::Automation::ShuttersControl::Dev::Readings;
|
use FHEM::Automation::ShuttersControl::Dev::Readings;
|
||||||
use FHEM::Automation::ShuttersControl::Dev::Attr;
|
use FHEM::Automation::ShuttersControl::Dev::Attr;
|
||||||
|
|
||||||
our @ISA =
|
use base
|
||||||
qw(FHEM::Automation::ShuttersControl::Dev::Readings FHEM::Automation::ShuttersControl::Dev::Attr);
|
qw(FHEM::Automation::ShuttersControl::Dev::Readings FHEM::Automation::ShuttersControl::Dev::Attr);
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
###############################################################################
|
###############################################################################
|
||||||
#
|
#
|
||||||
# Developed with Kate
|
# Developed with VSCodium and richterger perl plugin
|
||||||
#
|
#
|
||||||
# (c) 2018-2021 Copyright: Marko Oldenburg (fhemdevelopment@cooltux.net)
|
# (c) 2018-2025 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net)
|
||||||
# All rights reserved
|
# All rights reserved
|
||||||
#
|
#
|
||||||
# Special thanks goes to:
|
# Special thanks goes to:
|
||||||
@ -44,23 +44,12 @@ use strict;
|
|||||||
use warnings;
|
use warnings;
|
||||||
use utf8;
|
use utf8;
|
||||||
|
|
||||||
use GPUtils qw(GP_Import);
|
|
||||||
|
|
||||||
## Import der FHEM Funktionen
|
|
||||||
BEGIN {
|
|
||||||
GP_Import(
|
|
||||||
qw(
|
|
||||||
AttrVal
|
|
||||||
gettimeofday)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub getShuttersOffset {
|
sub getShuttersOffset {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
my $name = $self->{name};
|
my $name = $self->{name};
|
||||||
|
|
||||||
return AttrVal( $name, 'ASC_shuttersDriveDelay', -1 );
|
return ::AttrVal( $name, 'ASC_shuttersDriveDelay', -1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getBrightnessMinVal {
|
sub getBrightnessMinVal {
|
||||||
@ -70,7 +59,7 @@ sub getBrightnessMinVal {
|
|||||||
|
|
||||||
return $self->{ASC_brightness}->{triggermin}
|
return $self->{ASC_brightness}->{triggermin}
|
||||||
if ( exists( $self->{ASC_brightness}->{LASTGETTIME} )
|
if ( exists( $self->{ASC_brightness}->{LASTGETTIME} )
|
||||||
&& ( gettimeofday() - $self->{ASC_brightness}->{LASTGETTIME} ) < 2 );
|
&& ( ::gettimeofday() - $self->{ASC_brightness}->{LASTGETTIME} ) < 2 );
|
||||||
$FHEM::Automation::ShuttersControl::ascDev->getBrightnessMaxVal;
|
$FHEM::Automation::ShuttersControl::ascDev->getBrightnessMaxVal;
|
||||||
|
|
||||||
return $self->{ASC_brightness}->{triggermin};
|
return $self->{ASC_brightness}->{triggermin};
|
||||||
@ -83,8 +72,8 @@ sub getBrightnessMaxVal {
|
|||||||
|
|
||||||
return $self->{ASC_brightness}->{triggermax}
|
return $self->{ASC_brightness}->{triggermax}
|
||||||
if ( exists( $self->{ASC_brightness}->{LASTGETTIME} )
|
if ( exists( $self->{ASC_brightness}->{LASTGETTIME} )
|
||||||
&& ( gettimeofday() - $self->{ASC_brightness}->{LASTGETTIME} ) < 2 );
|
&& ( ::gettimeofday() - $self->{ASC_brightness}->{LASTGETTIME} ) < 2 );
|
||||||
$self->{ASC_brightness}->{LASTGETTIME} = int( gettimeofday() );
|
$self->{ASC_brightness}->{LASTGETTIME} = int( ::gettimeofday() );
|
||||||
|
|
||||||
my ( $triggermax, $triggermin ) =
|
my ( $triggermax, $triggermin ) =
|
||||||
FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $name,
|
FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $name,
|
||||||
@ -104,7 +93,7 @@ sub _getTwilightDevice {
|
|||||||
|
|
||||||
my $name = $self->{name};
|
my $name = $self->{name};
|
||||||
|
|
||||||
return AttrVal( $name, 'ASC_twilightDevice', 'none' );
|
return ::AttrVal( $name, 'ASC_twilightDevice', 'none' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getAutoAstroModeEvening {
|
sub getAutoAstroModeEvening {
|
||||||
@ -112,7 +101,7 @@ sub getAutoAstroModeEvening {
|
|||||||
|
|
||||||
my $name = $self->{name};
|
my $name = $self->{name};
|
||||||
|
|
||||||
return AttrVal( $name, 'ASC_autoAstroModeEvening', 'REAL' );
|
return ::AttrVal( $name, 'ASC_autoAstroModeEvening', 'REAL' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getAutoAstroModeEveningHorizon {
|
sub getAutoAstroModeEveningHorizon {
|
||||||
@ -120,7 +109,7 @@ sub getAutoAstroModeEveningHorizon {
|
|||||||
|
|
||||||
my $name = $self->{name};
|
my $name = $self->{name};
|
||||||
|
|
||||||
return AttrVal( $name, 'ASC_autoAstroModeEveningHorizon', 0 );
|
return ::AttrVal( $name, 'ASC_autoAstroModeEveningHorizon', 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getAutoAstroModeMorning {
|
sub getAutoAstroModeMorning {
|
||||||
@ -128,7 +117,7 @@ sub getAutoAstroModeMorning {
|
|||||||
|
|
||||||
my $name = $self->{name};
|
my $name = $self->{name};
|
||||||
|
|
||||||
return AttrVal( $name, 'ASC_autoAstroModeMorning', 'REAL' );
|
return ::AttrVal( $name, 'ASC_autoAstroModeMorning', 'REAL' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getAutoAstroModeMorningHorizon {
|
sub getAutoAstroModeMorningHorizon {
|
||||||
@ -136,7 +125,7 @@ sub getAutoAstroModeMorningHorizon {
|
|||||||
|
|
||||||
my $name = $self->{name};
|
my $name = $self->{name};
|
||||||
|
|
||||||
return AttrVal( $name, 'ASC_autoAstroModeMorningHorizon', 0 );
|
return ::AttrVal( $name, 'ASC_autoAstroModeMorningHorizon', 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getAutoShuttersControlMorning {
|
sub getAutoShuttersControlMorning {
|
||||||
@ -144,7 +133,7 @@ sub getAutoShuttersControlMorning {
|
|||||||
|
|
||||||
my $name = $self->{name};
|
my $name = $self->{name};
|
||||||
|
|
||||||
return AttrVal( $name, 'ASC_autoShuttersControlMorning', 'on' );
|
return ::AttrVal( $name, 'ASC_autoShuttersControlMorning', 'on' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getAutoShuttersControlEvening {
|
sub getAutoShuttersControlEvening {
|
||||||
@ -152,7 +141,7 @@ sub getAutoShuttersControlEvening {
|
|||||||
|
|
||||||
my $name = $self->{name};
|
my $name = $self->{name};
|
||||||
|
|
||||||
return AttrVal( $name, 'ASC_autoShuttersControlEvening', 'on' );
|
return ::AttrVal( $name, 'ASC_autoShuttersControlEvening', 'on' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getAutoShuttersControlComfort {
|
sub getAutoShuttersControlComfort {
|
||||||
@ -160,7 +149,7 @@ sub getAutoShuttersControlComfort {
|
|||||||
|
|
||||||
my $name = $self->{name};
|
my $name = $self->{name};
|
||||||
|
|
||||||
return AttrVal( $name, 'ASC_autoShuttersControlComfort', 'off' );
|
return ::AttrVal( $name, 'ASC_autoShuttersControlComfort', 'off' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getFreezeTemp {
|
sub getFreezeTemp {
|
||||||
@ -168,7 +157,7 @@ sub getFreezeTemp {
|
|||||||
|
|
||||||
my $name = $self->{name};
|
my $name = $self->{name};
|
||||||
|
|
||||||
return AttrVal( $name, 'ASC_freezeTemp', 3 );
|
return ::AttrVal( $name, 'ASC_freezeTemp', 3 );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getSlatDriveCmdInverse {
|
sub getSlatDriveCmdInverse {
|
||||||
@ -176,7 +165,7 @@ sub getSlatDriveCmdInverse {
|
|||||||
|
|
||||||
my $name = $self->{name};
|
my $name = $self->{name};
|
||||||
|
|
||||||
return AttrVal( $name, 'ASC_slatDriveCmdInverse', 0 );
|
return ::AttrVal( $name, 'ASC_slatDriveCmdInverse', 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub _getTempSensor {
|
sub _getTempSensor {
|
||||||
@ -186,11 +175,11 @@ sub _getTempSensor {
|
|||||||
|
|
||||||
return $self->{ASC_tempSensor}->{device}
|
return $self->{ASC_tempSensor}->{device}
|
||||||
if ( exists( $self->{ASC_tempSensor}->{LASTGETTIME} )
|
if ( exists( $self->{ASC_tempSensor}->{LASTGETTIME} )
|
||||||
&& ( gettimeofday() - $self->{ASC_tempSensor}->{LASTGETTIME} ) < 2 );
|
&& ( ::gettimeofday() - $self->{ASC_tempSensor}->{LASTGETTIME} ) < 2 );
|
||||||
$self->{ASC_tempSensor}->{LASTGETTIME} = int( gettimeofday() );
|
$self->{ASC_tempSensor}->{LASTGETTIME} = int( ::gettimeofday() );
|
||||||
my ( $device, $reading ) =
|
my ( $device, $reading ) =
|
||||||
FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $name, 'ASC_tempSensor',
|
FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $name,
|
||||||
'none' );
|
'ASC_tempSensor', 'none' );
|
||||||
|
|
||||||
## erwartetes Ergebnis
|
## erwartetes Ergebnis
|
||||||
# DEVICE:READING
|
# DEVICE:READING
|
||||||
@ -208,7 +197,7 @@ sub getTempSensorReading {
|
|||||||
|
|
||||||
return $self->{ASC_tempSensor}->{reading}
|
return $self->{ASC_tempSensor}->{reading}
|
||||||
if ( exists( $self->{ASC_tempSensor}->{LASTGETTIME} )
|
if ( exists( $self->{ASC_tempSensor}->{LASTGETTIME} )
|
||||||
&& ( gettimeofday() - $self->{ASC_tempSensor}->{LASTGETTIME} ) < 2 );
|
&& ( ::gettimeofday() - $self->{ASC_tempSensor}->{LASTGETTIME} ) < 2 );
|
||||||
$FHEM::Automation::ShuttersControl::ascDev->_getTempSensor;
|
$FHEM::Automation::ShuttersControl::ascDev->_getTempSensor;
|
||||||
return $self->{ASC_tempSensor}->{reading};
|
return $self->{ASC_tempSensor}->{reading};
|
||||||
}
|
}
|
||||||
@ -220,8 +209,9 @@ sub _getResidentsDev {
|
|||||||
|
|
||||||
return $self->{ASC_residentsDev}->{device}
|
return $self->{ASC_residentsDev}->{device}
|
||||||
if ( exists( $self->{ASC_residentsDev}->{LASTGETTIME} )
|
if ( exists( $self->{ASC_residentsDev}->{LASTGETTIME} )
|
||||||
&& ( gettimeofday() - $self->{ASC_residentsDev}->{LASTGETTIME} ) < 2 );
|
&& ( ::gettimeofday() - $self->{ASC_residentsDev}->{LASTGETTIME} ) <
|
||||||
$self->{ASC_residentsDev}->{LASTGETTIME} = int( gettimeofday() );
|
2 );
|
||||||
|
$self->{ASC_residentsDev}->{LASTGETTIME} = int( ::gettimeofday() );
|
||||||
my ( $device, $reading ) =
|
my ( $device, $reading ) =
|
||||||
FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $name,
|
FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $name,
|
||||||
'ASC_residentsDev', 'none' );
|
'ASC_residentsDev', 'none' );
|
||||||
@ -240,7 +230,8 @@ sub getResidentsReading {
|
|||||||
|
|
||||||
return $self->{ASC_residentsDev}->{reading}
|
return $self->{ASC_residentsDev}->{reading}
|
||||||
if ( exists( $self->{ASC_residentsDev}->{LASTGETTIME} )
|
if ( exists( $self->{ASC_residentsDev}->{LASTGETTIME} )
|
||||||
&& ( gettimeofday() - $self->{ASC_residentsDev}->{LASTGETTIME} ) < 2 );
|
&& ( ::gettimeofday() - $self->{ASC_residentsDev}->{LASTGETTIME} ) <
|
||||||
|
2 );
|
||||||
$FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev;
|
$FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev;
|
||||||
return $self->{ASC_residentsDev}->{reading};
|
return $self->{ASC_residentsDev}->{reading};
|
||||||
}
|
}
|
||||||
@ -252,11 +243,11 @@ sub _getRainSensor {
|
|||||||
|
|
||||||
return $self->{ASC_rainSensor}->{device}
|
return $self->{ASC_rainSensor}->{device}
|
||||||
if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
|
if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
|
||||||
&& ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
|
&& ( ::gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
|
||||||
$self->{ASC_rainSensor}->{LASTGETTIME} = int( gettimeofday() );
|
$self->{ASC_rainSensor}->{LASTGETTIME} = int( ::gettimeofday() );
|
||||||
my ( $device, $reading, $max, $hyst, $pos, $wait ) =
|
my ( $device, $reading, $max, $hyst, $pos, $wait ) =
|
||||||
FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $name, 'ASC_rainSensor',
|
FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $name,
|
||||||
'none' );
|
'ASC_rainSensor', 'none' );
|
||||||
|
|
||||||
## erwartetes Ergebnis
|
## erwartetes Ergebnis
|
||||||
# DEVICE:READING MAX:HYST
|
# DEVICE:READING MAX:HYST
|
||||||
@ -266,10 +257,10 @@ sub _getRainSensor {
|
|||||||
$self->{ASC_rainSensor}->{reading} =
|
$self->{ASC_rainSensor}->{reading} =
|
||||||
( $reading ne 'none' ? $reading : 'rain' );
|
( $reading ne 'none' ? $reading : 'rain' );
|
||||||
$self->{ASC_rainSensor}->{triggermax} = (
|
$self->{ASC_rainSensor}->{triggermax} = (
|
||||||
( $max ne 'none'
|
( $max ne 'none' && $max =~ m{\A(-?\d+(\.\d+)?)\z}xms )
|
||||||
&& $max =~ m{\A(-?\d+(\.\d+)?)\z}xms )
|
|
||||||
? $max
|
? $max
|
||||||
: 1000 );
|
: 1000
|
||||||
|
);
|
||||||
|
|
||||||
$self->{ASC_rainSensor}->{triggerhyst} = (
|
$self->{ASC_rainSensor}->{triggerhyst} = (
|
||||||
$hyst ne 'none'
|
$hyst ne 'none'
|
||||||
@ -277,10 +268,11 @@ sub _getRainSensor {
|
|||||||
: ( $self->{ASC_rainSensor}->{triggermax} * 0 )
|
: ( $self->{ASC_rainSensor}->{triggermax} * 0 )
|
||||||
);
|
);
|
||||||
|
|
||||||
$self->{ASC_rainSensor}->{shuttersClosedPos} =
|
$self->{ASC_rainSensor}->{shuttersClosedPos} = (
|
||||||
( $pos ne 'none'
|
$pos ne 'none'
|
||||||
? $pos
|
? $pos
|
||||||
: $FHEM::Automation::ShuttersControl::shutters->getClosedPos );
|
: $FHEM::Automation::ShuttersControl::shutters->getClosedPos
|
||||||
|
);
|
||||||
$self->{ASC_rainSensor}->{waitingTime} =
|
$self->{ASC_rainSensor}->{waitingTime} =
|
||||||
( $wait ne 'none' ? $wait : 0 );
|
( $wait ne 'none' ? $wait : 0 );
|
||||||
|
|
||||||
@ -294,7 +286,7 @@ sub getRainSensorReading {
|
|||||||
|
|
||||||
return $self->{ASC_rainSensor}->{reading}
|
return $self->{ASC_rainSensor}->{reading}
|
||||||
if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
|
if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
|
||||||
&& ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
|
&& ( ::gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
|
||||||
$FHEM::Automation::ShuttersControl::ascDev->_getRainSensor;
|
$FHEM::Automation::ShuttersControl::ascDev->_getRainSensor;
|
||||||
return $self->{ASC_rainSensor}->{reading};
|
return $self->{ASC_rainSensor}->{reading};
|
||||||
}
|
}
|
||||||
@ -306,7 +298,7 @@ sub getRainTriggerMax {
|
|||||||
|
|
||||||
return $self->{ASC_rainSensor}->{triggermax}
|
return $self->{ASC_rainSensor}->{triggermax}
|
||||||
if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
|
if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
|
||||||
&& ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
|
&& ( ::gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
|
||||||
$FHEM::Automation::ShuttersControl::ascDev->_getRainSensor;
|
$FHEM::Automation::ShuttersControl::ascDev->_getRainSensor;
|
||||||
return $self->{ASC_rainSensor}->{triggermax};
|
return $self->{ASC_rainSensor}->{triggermax};
|
||||||
}
|
}
|
||||||
@ -318,7 +310,7 @@ sub getRainTriggerMin {
|
|||||||
|
|
||||||
return $self->{ASC_rainSensor}->{triggerhyst}
|
return $self->{ASC_rainSensor}->{triggerhyst}
|
||||||
if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
|
if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
|
||||||
&& ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
|
&& ( ::gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
|
||||||
$FHEM::Automation::ShuttersControl::ascDev->_getRainSensor;
|
$FHEM::Automation::ShuttersControl::ascDev->_getRainSensor;
|
||||||
return $self->{ASC_rainSensor}->{triggerhyst};
|
return $self->{ASC_rainSensor}->{triggerhyst};
|
||||||
}
|
}
|
||||||
@ -330,7 +322,7 @@ sub getRainSensorShuttersClosedPos {
|
|||||||
|
|
||||||
return $self->{ASC_rainSensor}->{shuttersClosedPos}
|
return $self->{ASC_rainSensor}->{shuttersClosedPos}
|
||||||
if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
|
if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
|
||||||
&& ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
|
&& ( ::gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
|
||||||
$FHEM::Automation::ShuttersControl::ascDev->_getRainSensor;
|
$FHEM::Automation::ShuttersControl::ascDev->_getRainSensor;
|
||||||
return $self->{ASC_rainSensor}->{shuttersClosedPos};
|
return $self->{ASC_rainSensor}->{shuttersClosedPos};
|
||||||
}
|
}
|
||||||
@ -342,7 +334,7 @@ sub getRainWaitingTime {
|
|||||||
|
|
||||||
return $self->{ASC_rainSensor}->{waitingTime}
|
return $self->{ASC_rainSensor}->{waitingTime}
|
||||||
if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
|
if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
|
||||||
&& ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
|
&& ( ::gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
|
||||||
$FHEM::Automation::ShuttersControl::ascDev->_getRainSensor;
|
$FHEM::Automation::ShuttersControl::ascDev->_getRainSensor;
|
||||||
return $self->{ASC_rainSensor}->{waitingTime};
|
return $self->{ASC_rainSensor}->{waitingTime};
|
||||||
}
|
}
|
||||||
@ -354,11 +346,11 @@ sub _getWindSensor {
|
|||||||
|
|
||||||
return $self->{ASC_windSensor}->{device}
|
return $self->{ASC_windSensor}->{device}
|
||||||
if ( exists( $self->{ASC_windSensor}->{LASTGETTIME} )
|
if ( exists( $self->{ASC_windSensor}->{LASTGETTIME} )
|
||||||
&& ( gettimeofday() - $self->{ASC_windSensor}->{LASTGETTIME} ) < 2 );
|
&& ( ::gettimeofday() - $self->{ASC_windSensor}->{LASTGETTIME} ) < 2 );
|
||||||
$self->{ASC_windSensor}->{LASTGETTIME} = int( gettimeofday() );
|
$self->{ASC_windSensor}->{LASTGETTIME} = int( ::gettimeofday() );
|
||||||
my ( $device, $reading ) =
|
my ( $device, $reading ) =
|
||||||
FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $name, 'ASC_windSensor',
|
FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $name,
|
||||||
'none' );
|
'ASC_windSensor', 'none' );
|
||||||
|
|
||||||
return $device if ( $device eq 'none' );
|
return $device if ( $device eq 'none' );
|
||||||
$self->{ASC_windSensor}->{device} = $device;
|
$self->{ASC_windSensor}->{device} = $device;
|
||||||
@ -375,7 +367,7 @@ sub getWindSensorReading {
|
|||||||
|
|
||||||
return $self->{ASC_windSensor}->{reading}
|
return $self->{ASC_windSensor}->{reading}
|
||||||
if ( exists( $self->{ASC_windSensor}->{LASTGETTIME} )
|
if ( exists( $self->{ASC_windSensor}->{LASTGETTIME} )
|
||||||
&& ( gettimeofday() - $self->{ASC_windSensor}->{LASTGETTIME} ) < 2 );
|
&& ( ::gettimeofday() - $self->{ASC_windSensor}->{LASTGETTIME} ) < 2 );
|
||||||
$FHEM::Automation::ShuttersControl::ascDev->_getWindSensor;
|
$FHEM::Automation::ShuttersControl::ascDev->_getWindSensor;
|
||||||
return (
|
return (
|
||||||
defined( $self->{ASC_windSensor}->{reading} )
|
defined( $self->{ASC_windSensor}->{reading} )
|
||||||
@ -389,18 +381,23 @@ sub getBlockAscDrivesAfterManual {
|
|||||||
|
|
||||||
my $name = $self->{name};
|
my $name = $self->{name};
|
||||||
|
|
||||||
return AttrVal( $name, 'ASC_blockAscDrivesAfterManual', 0 );
|
return ::AttrVal( $name, 'ASC_blockAscDrivesAfterManual', 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getAdvDate {
|
sub getAdvStartDate {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
my $name = $self->{name};
|
my $name = $self->{name};
|
||||||
|
|
||||||
return AttrVal( $name, 'ASC_advDate', 'FirstAdvent' );
|
return ::AttrVal( $name, 'ASC_advStartDate', 'FirstAdvent' );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub getAdvEndDate {
|
||||||
|
my $self = shift;
|
||||||
|
|
||||||
|
my $name = $self->{name};
|
||||||
|
|
||||||
|
return ::AttrVal( $name, 'ASC_advEndDate', 'EpiphanyDay' );
|
||||||
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
###############################################################################
|
###############################################################################
|
||||||
#
|
#
|
||||||
# Developed with Kate
|
# Developed with VSCodium and richterger perl plugin
|
||||||
#
|
#
|
||||||
# (c) 2018-2021 Copyright: Marko Oldenburg (fhemdevelopment@cooltux.net)
|
# (c) 2018-2025 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net)
|
||||||
# All rights reserved
|
# All rights reserved
|
||||||
#
|
#
|
||||||
# Special thanks goes to:
|
# Special thanks goes to:
|
||||||
@ -48,12 +48,7 @@ use GPUtils qw(GP_Import);
|
|||||||
|
|
||||||
## Import der FHEM Funktionen
|
## Import der FHEM Funktionen
|
||||||
BEGIN {
|
BEGIN {
|
||||||
GP_Import(
|
GP_Import(qw(defs));
|
||||||
qw(
|
|
||||||
readingsSingleUpdate
|
|
||||||
ReadingsVal
|
|
||||||
defs)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setDelayCmdReading {
|
sub setDelayCmdReading {
|
||||||
@ -62,7 +57,7 @@ sub setDelayCmdReading {
|
|||||||
my $name = $self->{name};
|
my $name = $self->{name};
|
||||||
my $hash = $defs{$name};
|
my $hash = $defs{$name};
|
||||||
|
|
||||||
readingsSingleUpdate(
|
::readingsSingleUpdate(
|
||||||
$hash,
|
$hash,
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getShuttersDev
|
$FHEM::Automation::ShuttersControl::shutters->getShuttersDev
|
||||||
. '_lastDelayPosValue',
|
. '_lastDelayPosValue',
|
||||||
@ -79,7 +74,7 @@ sub setStateReading {
|
|||||||
my $name = $self->{name};
|
my $name = $self->{name};
|
||||||
my $hash = $defs{$name};
|
my $hash = $defs{$name};
|
||||||
|
|
||||||
readingsSingleUpdate(
|
::readingsSingleUpdate(
|
||||||
$hash, 'state',
|
$hash, 'state',
|
||||||
(
|
(
|
||||||
defined($value)
|
defined($value)
|
||||||
@ -97,7 +92,7 @@ sub setPosReading {
|
|||||||
my $name = $self->{name};
|
my $name = $self->{name};
|
||||||
my $hash = $defs{$name};
|
my $hash = $defs{$name};
|
||||||
|
|
||||||
readingsSingleUpdate(
|
::readingsSingleUpdate(
|
||||||
$hash,
|
$hash,
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getShuttersDev
|
$FHEM::Automation::ShuttersControl::shutters->getShuttersDev
|
||||||
. '_PosValue',
|
. '_PosValue',
|
||||||
@ -113,7 +108,7 @@ sub setLastPosReading {
|
|||||||
my $name = $self->{name};
|
my $name = $self->{name};
|
||||||
my $hash = $defs{$name};
|
my $hash = $defs{$name};
|
||||||
|
|
||||||
readingsSingleUpdate(
|
::readingsSingleUpdate(
|
||||||
$hash,
|
$hash,
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getShuttersDev
|
$FHEM::Automation::ShuttersControl::shutters->getShuttersDev
|
||||||
. '_lastPosValue',
|
. '_lastPosValue',
|
||||||
@ -128,7 +123,7 @@ sub getPartyMode {
|
|||||||
|
|
||||||
my $name = $self->{name};
|
my $name = $self->{name};
|
||||||
|
|
||||||
return ReadingsVal( $name, 'partyMode', 'off' );
|
return ::ReadingsVal( $name, 'partyMode', 'off' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getHardLockOut {
|
sub getHardLockOut {
|
||||||
@ -136,7 +131,7 @@ sub getHardLockOut {
|
|||||||
|
|
||||||
my $name = $self->{name};
|
my $name = $self->{name};
|
||||||
|
|
||||||
return ReadingsVal( $name, 'hardLockOut', 'none' );
|
return ::ReadingsVal( $name, 'hardLockOut', 'none' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getSunriseTimeWeHoliday {
|
sub getSunriseTimeWeHoliday {
|
||||||
@ -144,7 +139,7 @@ sub getSunriseTimeWeHoliday {
|
|||||||
|
|
||||||
my $name = $self->{name};
|
my $name = $self->{name};
|
||||||
|
|
||||||
return ReadingsVal( $name, 'sunriseTimeWeHoliday', 'none' );
|
return ::ReadingsVal( $name, 'sunriseTimeWeHoliday', 'none' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getMonitoredDevs {
|
sub getMonitoredDevs {
|
||||||
@ -152,14 +147,14 @@ sub getMonitoredDevs {
|
|||||||
|
|
||||||
my $name = $self->{name};
|
my $name = $self->{name};
|
||||||
|
|
||||||
$self->{monitoredDevs} = ReadingsVal( $name, '.monitoredDevs', 'none' );
|
$self->{monitoredDevs} = ::ReadingsVal( $name, '.monitoredDevs', 'none' );
|
||||||
return $self->{monitoredDevs};
|
return $self->{monitoredDevs};
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getOutTemp {
|
sub getOutTemp {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return ReadingsVal(
|
return ::ReadingsVal(
|
||||||
$FHEM::Automation::ShuttersControl::ascDev->_getTempSensor,
|
$FHEM::Automation::ShuttersControl::ascDev->_getTempSensor,
|
||||||
$FHEM::Automation::ShuttersControl::ascDev->getTempSensorReading,
|
$FHEM::Automation::ShuttersControl::ascDev->getTempSensorReading,
|
||||||
-100 );
|
-100 );
|
||||||
@ -169,7 +164,8 @@ sub getResidentsStatus {
|
|||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
my $val =
|
my $val =
|
||||||
ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev,
|
::ReadingsVal(
|
||||||
|
$FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev,
|
||||||
$FHEM::Automation::ShuttersControl::ascDev->getResidentsReading,
|
$FHEM::Automation::ShuttersControl::ascDev->getResidentsReading,
|
||||||
'none' );
|
'none' );
|
||||||
|
|
||||||
@ -178,7 +174,7 @@ sub getResidentsStatus {
|
|||||||
return $1 && $1 eq 'pet' ? 'absent' : $2;
|
return $1 && $1 eq 'pet' ? 'absent' : $2;
|
||||||
}
|
}
|
||||||
elsif (
|
elsif (
|
||||||
ReadingsVal(
|
::ReadingsVal(
|
||||||
$FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev,
|
$FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev,
|
||||||
'homealoneType', '-' ) eq 'PET'
|
'homealoneType', '-' ) eq 'PET'
|
||||||
)
|
)
|
||||||
@ -196,7 +192,8 @@ sub getResidentsLastStatus {
|
|||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
my $val =
|
my $val =
|
||||||
ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev,
|
::ReadingsVal(
|
||||||
|
$FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev,
|
||||||
'lastState', 'none' );
|
'lastState', 'none' );
|
||||||
|
|
||||||
if ( $val =~ m{^(?:(.+)_)?(.+)$}xms ) {
|
if ( $val =~ m{^(?:(.+)_)?(.+)$}xms ) {
|
||||||
@ -204,7 +201,7 @@ sub getResidentsLastStatus {
|
|||||||
return $1 && $1 eq 'pet' ? 'absent' : $2;
|
return $1 && $1 eq 'pet' ? 'absent' : $2;
|
||||||
}
|
}
|
||||||
elsif (
|
elsif (
|
||||||
ReadingsVal(
|
::ReadingsVal(
|
||||||
$FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev,
|
$FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev,
|
||||||
'lastHomealoneType', '-' ) eq 'PET'
|
'lastHomealoneType', '-' ) eq 'PET'
|
||||||
)
|
)
|
||||||
@ -223,7 +220,7 @@ sub getAutoShuttersControlShading {
|
|||||||
|
|
||||||
my $name = $self->{name};
|
my $name = $self->{name};
|
||||||
|
|
||||||
return ReadingsVal( $name, 'controlShading', 'none' );
|
return ::ReadingsVal( $name, 'controlShading', 'none' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getSelfDefense {
|
sub getSelfDefense {
|
||||||
@ -231,7 +228,7 @@ sub getSelfDefense {
|
|||||||
|
|
||||||
my $name = $self->{name};
|
my $name = $self->{name};
|
||||||
|
|
||||||
return ReadingsVal( $name, 'selfDefense', 'none' );
|
return ::ReadingsVal( $name, 'selfDefense', 'none' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getAzimuth {
|
sub getAzimuth {
|
||||||
@ -239,13 +236,13 @@ sub getAzimuth {
|
|||||||
|
|
||||||
my $azimuth;
|
my $azimuth;
|
||||||
|
|
||||||
$azimuth = ReadingsVal(
|
$azimuth = ::ReadingsVal(
|
||||||
$FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice,
|
$FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice,
|
||||||
'azimuth', -1 )
|
'azimuth', -1 )
|
||||||
if (
|
if (
|
||||||
$defs{ $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice }
|
$defs{ $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice }
|
||||||
->{TYPE} eq 'Twilight' );
|
->{TYPE} eq 'Twilight' );
|
||||||
$azimuth = ReadingsVal(
|
$azimuth = ::ReadingsVal(
|
||||||
$FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice,
|
$FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice,
|
||||||
'SunAz', -1 )
|
'SunAz', -1 )
|
||||||
if (
|
if (
|
||||||
@ -260,13 +257,13 @@ sub getElevation {
|
|||||||
|
|
||||||
my $elevation;
|
my $elevation;
|
||||||
|
|
||||||
$elevation = ReadingsVal(
|
$elevation = ::ReadingsVal(
|
||||||
$FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice,
|
$FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice,
|
||||||
'elevation', -1 )
|
'elevation', -1 )
|
||||||
if (
|
if (
|
||||||
$defs{ $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice }
|
$defs{ $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice }
|
||||||
->{TYPE} eq 'Twilight' );
|
->{TYPE} eq 'Twilight' );
|
||||||
$elevation = ReadingsVal(
|
$elevation = ::ReadingsVal(
|
||||||
$FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice,
|
$FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice,
|
||||||
'SunAlt', -1 )
|
'SunAlt', -1 )
|
||||||
if (
|
if (
|
||||||
@ -281,7 +278,7 @@ sub getASCenable {
|
|||||||
|
|
||||||
my $name = $self->{name};
|
my $name = $self->{name};
|
||||||
|
|
||||||
return ReadingsVal( $name, 'ascEnable', 'none' );
|
return ::ReadingsVal( $name, 'ascEnable', 'none' );
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,8 +1,8 @@
|
|||||||
###############################################################################
|
###############################################################################
|
||||||
#
|
#
|
||||||
# Developed with Kate
|
# Developed with VSCodium and richterger perl plugin
|
||||||
#
|
#
|
||||||
# (c) 2018-2021 Copyright: Marko Oldenburg (fhemsupport@cooltux.net)
|
# (c) 2018-2025 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net)
|
||||||
# All rights reserved
|
# All rights reserved
|
||||||
#
|
#
|
||||||
# Special thanks goes to:
|
# Special thanks goes to:
|
||||||
@ -46,7 +46,9 @@ use POSIX qw(strftime);
|
|||||||
use utf8;
|
use utf8;
|
||||||
|
|
||||||
require Exporter;
|
require Exporter;
|
||||||
our @ISA = qw(Exporter);
|
use base qw(Exporter);
|
||||||
|
|
||||||
|
# our @ISA = qw(Exporter);
|
||||||
our @EXPORT_OK = qw(
|
our @EXPORT_OK = qw(
|
||||||
PositionValueWindowRec
|
PositionValueWindowRec
|
||||||
AutoSearchTwilightDev
|
AutoSearchTwilightDev
|
||||||
@ -82,28 +84,14 @@ our %EXPORT_TAGS = (
|
|||||||
PerlCodeCheck
|
PerlCodeCheck
|
||||||
IsAdv
|
IsAdv
|
||||||
IsInTime
|
IsInTime
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
use GPUtils qw(GP_Import);
|
use GPUtils qw(GP_Import);
|
||||||
## Import der FHEM Funktionen
|
## Import der FHEM Funktionen
|
||||||
BEGIN {
|
BEGIN {
|
||||||
GP_Import(
|
GP_Import(qw(cmdFromAnalyze));
|
||||||
qw(
|
|
||||||
devspec2array
|
|
||||||
CommandAttr
|
|
||||||
AttrVal
|
|
||||||
Log3
|
|
||||||
computeAlignTime
|
|
||||||
gettimeofday
|
|
||||||
sunset
|
|
||||||
sunset_abs
|
|
||||||
sunrise
|
|
||||||
sunrise_abs
|
|
||||||
cmdFromAnalyze
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sub PositionValueWindowRec {
|
sub PositionValueWindowRec {
|
||||||
@ -156,12 +144,12 @@ sub AutoSearchTwilightDev {
|
|||||||
|
|
||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
|
|
||||||
if ( devspec2array('TYPE=(Astro|Twilight)') > 0 ) {
|
if ( ::devspec2array('TYPE=(Astro|Twilight)') > 0 ) {
|
||||||
CommandAttr( undef,
|
::CommandAttr( undef,
|
||||||
$name
|
$name
|
||||||
. ' ASC_twilightDevice '
|
. ' ASC_twilightDevice '
|
||||||
. ( devspec2array('TYPE=(Astro|Twilight)') )[0] )
|
. ( ::devspec2array('TYPE=(Astro|Twilight)') )[0] )
|
||||||
if ( AttrVal( $name, 'ASC_twilightDevice', 'none' ) eq 'none' );
|
if ( ::AttrVal( $name, 'ASC_twilightDevice', 'none' ) eq 'none' );
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@ -172,8 +160,10 @@ sub GetAttrValues {
|
|||||||
my $attribut = shift;
|
my $attribut = shift;
|
||||||
my $default = shift;
|
my $default = shift;
|
||||||
|
|
||||||
my @values = split( ' ',
|
my @values = split(
|
||||||
AttrVal( $dev, $attribut, ( defined($default) ? $default : 'none' ) ) );
|
' ',
|
||||||
|
::AttrVal( $dev, $attribut, ( defined($default) ? $default : 'none' ) )
|
||||||
|
);
|
||||||
my ( $value1, $value2 ) = split( ':', $values[0] );
|
my ( $value1, $value2 ) = split( ':', $values[0] );
|
||||||
|
|
||||||
my ( $value3, $value4, $value5, $value6, $value7, $value8 );
|
my ( $value3, $value4, $value5, $value6, $value7, $value8 );
|
||||||
@ -217,7 +207,7 @@ sub CheckIfShuttersWindowRecOpen {
|
|||||||
m{[Cc]lose|true}xms )
|
m{[Cc]lose|true}xms )
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
} # CK: covers: close|closed
|
} # CK: covers: close|closed
|
||||||
}
|
}
|
||||||
|
|
||||||
sub ExtractNotifyDevFromEvent {
|
sub ExtractNotifyDevFromEvent {
|
||||||
@ -227,10 +217,10 @@ sub ExtractNotifyDevFromEvent {
|
|||||||
|
|
||||||
my %notifyDevs;
|
my %notifyDevs;
|
||||||
while ( my $notifyDev = each %{ $hash->{monitoredDevs} } ) {
|
while ( my $notifyDev = each %{ $hash->{monitoredDevs} } ) {
|
||||||
Log3( $hash->{NAME}, 4,
|
::Log3( $hash->{NAME}, 4,
|
||||||
"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - NotifyDev: "
|
"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - NotifyDev: "
|
||||||
. $notifyDev );
|
. $notifyDev );
|
||||||
Log3( $hash->{NAME}, 5,
|
::Log3( $hash->{NAME}, 5,
|
||||||
"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - ShuttersDev: "
|
"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - ShuttersDev: "
|
||||||
. $shuttersDev );
|
. $shuttersDev );
|
||||||
|
|
||||||
@ -238,10 +228,10 @@ sub ExtractNotifyDevFromEvent {
|
|||||||
&& $hash->{monitoredDevs}{$notifyDev}{$shuttersDev} eq
|
&& $hash->{monitoredDevs}{$notifyDev}{$shuttersDev} eq
|
||||||
$shuttersAttr )
|
$shuttersAttr )
|
||||||
{
|
{
|
||||||
Log3( $hash->{NAME}, 4,
|
::Log3( $hash->{NAME}, 4,
|
||||||
"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - ShuttersDevHash: "
|
"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - ShuttersDevHash: "
|
||||||
. $hash->{monitoredDevs}{$notifyDev}{$shuttersDev} );
|
. $hash->{monitoredDevs}{$notifyDev}{$shuttersDev} );
|
||||||
Log3( $hash->{NAME}, 5,
|
::Log3( $hash->{NAME}, 5,
|
||||||
"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - return ShuttersDev: "
|
"AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - return ShuttersDev: "
|
||||||
. $notifyDev );
|
. $notifyDev );
|
||||||
$notifyDevs{$notifyDev} = $shuttersDev;
|
$notifyDevs{$notifyDev} = $shuttersDev;
|
||||||
@ -279,24 +269,27 @@ sub _IsDay {
|
|||||||
(
|
(
|
||||||
(
|
(
|
||||||
(
|
(
|
||||||
int( gettimeofday() / 86400 ) != int(
|
int( ::gettimeofday() / 86400 ) != int(
|
||||||
computeAlignTime( '24:00',
|
::computeAlignTime(
|
||||||
|
'24:00',
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
->getTimeUpEarly ) / 86400
|
->getTimeUpEarly
|
||||||
|
) / 86400
|
||||||
)
|
)
|
||||||
&& ( !IsWe()
|
&& (
|
||||||
|| ( IsWe()
|
!IsWe()
|
||||||
&& ( $FHEM::Automation::ShuttersControl::ascDev
|
|| (
|
||||||
->getSunriseTimeWeHoliday eq 'off'
|
IsWe()
|
||||||
|| $FHEM::Automation::ShuttersControl::shutters
|
&& ( $FHEM::Automation::ShuttersControl::ascDev
|
||||||
->getTimeUpWeHoliday eq '01:25'
|
->getSunriseTimeWeHoliday eq 'off'
|
||||||
)
|
|| $FHEM::Automation::ShuttersControl::shutters
|
||||||
)
|
->getTimeUpWeHoliday eq '01:25' )
|
||||||
)
|
)
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|| (
|
|| (
|
||||||
int( gettimeofday() / 86400 ) != int(
|
int( ::gettimeofday() / 86400 ) != int(
|
||||||
computeAlignTime(
|
::computeAlignTime(
|
||||||
'24:00',
|
'24:00',
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
->getTimeUpWeHoliday
|
->getTimeUpWeHoliday
|
||||||
@ -309,23 +302,23 @@ sub _IsDay {
|
|||||||
->getTimeUpWeHoliday ne '01:25'
|
->getTimeUpWeHoliday ne '01:25'
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
&& int( gettimeofday() / 86400 ) == int(
|
&& int( ::gettimeofday() / 86400 ) == int(
|
||||||
computeAlignTime(
|
::computeAlignTime(
|
||||||
'24:00',
|
'24:00',
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpLate
|
$FHEM::Automation::ShuttersControl::shutters->getTimeUpLate
|
||||||
) / 86400
|
) / 86400
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|| (
|
|| (
|
||||||
int( gettimeofday() / 86400 ) != int(
|
int( ::gettimeofday() / 86400 ) != int(
|
||||||
computeAlignTime(
|
::computeAlignTime(
|
||||||
'24:00',
|
'24:00',
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
->getTimeDownEarly
|
->getTimeDownEarly
|
||||||
) / 86400
|
) / 86400
|
||||||
)
|
)
|
||||||
&& int( gettimeofday() / 86400 ) == int(
|
&& int( ::gettimeofday() / 86400 ) == int(
|
||||||
computeAlignTime(
|
::computeAlignTime(
|
||||||
'24:00',
|
'24:00',
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
->getTimeDownLate
|
->getTimeDownLate
|
||||||
@ -390,25 +383,32 @@ sub _IsDay {
|
|||||||
. $FHEM::Automation::ShuttersControl::shutters->getSunrise );
|
. $FHEM::Automation::ShuttersControl::shutters->getSunrise );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
$respIsDay = 1
|
$respIsDay = 1
|
||||||
if (
|
if (
|
||||||
( $FHEM::Automation::ShuttersControl::shutters->getDown eq 'roommate'
|
(
|
||||||
and ( $FHEM::Automation::ShuttersControl::shutters->getRoommates ne 'asleep'
|
$FHEM::Automation::ShuttersControl::shutters->getDown eq 'roommate'
|
||||||
or $FHEM::Automation::ShuttersControl::shutters->getRoommates ne 'gotosleep' )
|
and ( $FHEM::Automation::ShuttersControl::shutters->getRoommates ne
|
||||||
)
|
'asleep'
|
||||||
or ( $FHEM::Automation::ShuttersControl::shutters->getUp eq 'roommate'
|
or $FHEM::Automation::ShuttersControl::shutters->getRoommates
|
||||||
and ( $FHEM::Automation::ShuttersControl::shutters->getRoommates ne 'asleep'
|
ne 'gotosleep' )
|
||||||
or $FHEM::Automation::ShuttersControl::shutters->getRoommates ne 'gotosleep' )
|
)
|
||||||
)
|
or (
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->getUp eq 'roommate'
|
||||||
|
and ( $FHEM::Automation::ShuttersControl::shutters->getRoommates ne
|
||||||
|
'asleep'
|
||||||
|
or $FHEM::Automation::ShuttersControl::shutters->getRoommates
|
||||||
|
ne 'gotosleep' )
|
||||||
|
)
|
||||||
|
or ( $FHEM::Automation::ShuttersControl::shutters->getShuttersPlace eq
|
||||||
|
'awning' )
|
||||||
);
|
);
|
||||||
|
|
||||||
return $respIsDay;
|
return $respIsDay;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub ShuttersSunrise {
|
sub ShuttersSunrise {
|
||||||
my $shuttersDev = shift;
|
my $shuttersDev = shift;
|
||||||
my $tm = shift; # Tm steht für Timemode und bedeutet Realzeit oder Unixzeit
|
my $tm = shift; # Tm steht für Timemode und bedeutet Realzeit oder Unixzeit
|
||||||
|
|
||||||
my $autoAstroMode;
|
my $autoAstroMode;
|
||||||
$FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
|
$FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
|
||||||
@ -436,7 +436,7 @@ sub ShuttersSunrise {
|
|||||||
my $oldFuncHash =
|
my $oldFuncHash =
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getInTimerFuncHash;
|
$FHEM::Automation::ShuttersControl::shutters->getInTimerFuncHash;
|
||||||
my $shuttersSunriseUnixtime =
|
my $shuttersSunriseUnixtime =
|
||||||
computeAlignTime( '24:00', sunrise( 'REAL', 0, '4:30', '8:30' ) );
|
::computeAlignTime( '24:00', ::sunrise( 'REAL', 0, '4:30', '8:30' ) );
|
||||||
|
|
||||||
if ( $tm eq 'unix' ) {
|
if ( $tm eq 'unix' ) {
|
||||||
if ( $FHEM::Automation::ShuttersControl::shutters->getUp eq 'astro' ) {
|
if ( $FHEM::Automation::ShuttersControl::shutters->getUp eq 'astro' ) {
|
||||||
@ -449,11 +449,11 @@ sub ShuttersSunrise {
|
|||||||
if ( !IsWe('tomorrow') ) {
|
if ( !IsWe('tomorrow') ) {
|
||||||
if (
|
if (
|
||||||
IsWe()
|
IsWe()
|
||||||
&& int( gettimeofday() / 86400 ) == int(
|
&& int( ::gettimeofday() / 86400 ) == int(
|
||||||
(
|
(
|
||||||
computeAlignTime(
|
::computeAlignTime(
|
||||||
'24:00',
|
'24:00',
|
||||||
sunrise_abs(
|
::sunrise_abs(
|
||||||
$autoAstroMode,
|
$autoAstroMode,
|
||||||
0,
|
0,
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
@ -465,9 +465,9 @@ sub ShuttersSunrise {
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
$shuttersSunriseUnixtime = (
|
$shuttersSunriseUnixtime = (
|
||||||
computeAlignTime(
|
::computeAlignTime(
|
||||||
'24:00',
|
'24:00',
|
||||||
sunrise_abs(
|
::sunrise_abs(
|
||||||
$autoAstroMode,
|
$autoAstroMode,
|
||||||
0,
|
0,
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
@ -477,11 +477,11 @@ sub ShuttersSunrise {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
elsif (
|
elsif (
|
||||||
int( gettimeofday() / 86400 ) == int(
|
int( ::gettimeofday() / 86400 ) == int(
|
||||||
(
|
(
|
||||||
computeAlignTime(
|
::computeAlignTime(
|
||||||
'24:00',
|
'24:00',
|
||||||
sunrise_abs(
|
::sunrise_abs(
|
||||||
$autoAstroMode,
|
$autoAstroMode,
|
||||||
0,
|
0,
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
@ -495,9 +495,9 @@ sub ShuttersSunrise {
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
$shuttersSunriseUnixtime = (
|
$shuttersSunriseUnixtime = (
|
||||||
computeAlignTime(
|
::computeAlignTime(
|
||||||
'24:00',
|
'24:00',
|
||||||
sunrise_abs(
|
::sunrise_abs(
|
||||||
$autoAstroMode,
|
$autoAstroMode,
|
||||||
0,
|
0,
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
@ -508,9 +508,9 @@ sub ShuttersSunrise {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$shuttersSunriseUnixtime = (
|
$shuttersSunriseUnixtime = (
|
||||||
computeAlignTime(
|
::computeAlignTime(
|
||||||
'24:00',
|
'24:00',
|
||||||
sunrise_abs(
|
::sunrise_abs(
|
||||||
$autoAstroMode,
|
$autoAstroMode,
|
||||||
0,
|
0,
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
@ -526,11 +526,11 @@ sub ShuttersSunrise {
|
|||||||
if (
|
if (
|
||||||
IsWe()
|
IsWe()
|
||||||
&& (
|
&& (
|
||||||
int( gettimeofday() / 86400 ) == int(
|
int( ::gettimeofday() / 86400 ) == int(
|
||||||
(
|
(
|
||||||
computeAlignTime(
|
::computeAlignTime(
|
||||||
'24:00',
|
'24:00',
|
||||||
sunrise_abs(
|
::sunrise_abs(
|
||||||
$autoAstroMode,
|
$autoAstroMode,
|
||||||
0,
|
0,
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
@ -539,11 +539,11 @@ sub ShuttersSunrise {
|
|||||||
) + 1
|
) + 1
|
||||||
) / 86400
|
) / 86400
|
||||||
)
|
)
|
||||||
|| int( gettimeofday() / 86400 ) != int(
|
|| int( ::gettimeofday() / 86400 ) != int(
|
||||||
(
|
(
|
||||||
computeAlignTime(
|
::computeAlignTime(
|
||||||
'24:00',
|
'24:00',
|
||||||
sunrise_abs(
|
::sunrise_abs(
|
||||||
$autoAstroMode,
|
$autoAstroMode,
|
||||||
0,
|
0,
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
@ -556,9 +556,9 @@ sub ShuttersSunrise {
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
$shuttersSunriseUnixtime = (
|
$shuttersSunriseUnixtime = (
|
||||||
computeAlignTime(
|
::computeAlignTime(
|
||||||
'24:00',
|
'24:00',
|
||||||
sunrise_abs(
|
::sunrise_abs(
|
||||||
$autoAstroMode,
|
$autoAstroMode,
|
||||||
0,
|
0,
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
@ -568,11 +568,11 @@ sub ShuttersSunrise {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
elsif (
|
elsif (
|
||||||
int( gettimeofday() / 86400 ) == int(
|
int( ::gettimeofday() / 86400 ) == int(
|
||||||
(
|
(
|
||||||
computeAlignTime(
|
::computeAlignTime(
|
||||||
'24:00',
|
'24:00',
|
||||||
sunrise_abs(
|
::sunrise_abs(
|
||||||
$autoAstroMode,
|
$autoAstroMode,
|
||||||
0,
|
0,
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
@ -586,9 +586,9 @@ sub ShuttersSunrise {
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
$shuttersSunriseUnixtime = (
|
$shuttersSunriseUnixtime = (
|
||||||
computeAlignTime(
|
::computeAlignTime(
|
||||||
'24:00',
|
'24:00',
|
||||||
sunrise_abs(
|
::sunrise_abs(
|
||||||
$autoAstroMode,
|
$autoAstroMode,
|
||||||
0,
|
0,
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
@ -601,11 +601,11 @@ sub ShuttersSunrise {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (
|
if (
|
||||||
int( gettimeofday() / 86400 ) == int(
|
int( ::gettimeofday() / 86400 ) == int(
|
||||||
(
|
(
|
||||||
computeAlignTime(
|
::computeAlignTime(
|
||||||
'24:00',
|
'24:00',
|
||||||
sunrise_abs(
|
::sunrise_abs(
|
||||||
$autoAstroMode,
|
$autoAstroMode,
|
||||||
0,
|
0,
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
@ -617,9 +617,9 @@ sub ShuttersSunrise {
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
$shuttersSunriseUnixtime = (
|
$shuttersSunriseUnixtime = (
|
||||||
computeAlignTime(
|
::computeAlignTime(
|
||||||
'24:00',
|
'24:00',
|
||||||
sunrise_abs(
|
::sunrise_abs(
|
||||||
$autoAstroMode,
|
$autoAstroMode,
|
||||||
0,
|
0,
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
@ -630,9 +630,9 @@ sub ShuttersSunrise {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$shuttersSunriseUnixtime = (
|
$shuttersSunriseUnixtime = (
|
||||||
computeAlignTime(
|
::computeAlignTime(
|
||||||
'24:00',
|
'24:00',
|
||||||
sunrise_abs(
|
::sunrise_abs(
|
||||||
$autoAstroMode,
|
$autoAstroMode,
|
||||||
0,
|
0,
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
@ -646,9 +646,9 @@ sub ShuttersSunrise {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$shuttersSunriseUnixtime = (
|
$shuttersSunriseUnixtime = (
|
||||||
computeAlignTime(
|
::computeAlignTime(
|
||||||
'24:00',
|
'24:00',
|
||||||
sunrise_abs(
|
::sunrise_abs(
|
||||||
$autoAstroMode,
|
$autoAstroMode,
|
||||||
0,
|
0,
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
@ -669,11 +669,11 @@ sub ShuttersSunrise {
|
|||||||
{
|
{
|
||||||
if ( !IsWe('tomorrow') ) {
|
if ( !IsWe('tomorrow') ) {
|
||||||
if (
|
if (
|
||||||
int( gettimeofday() / 86400 ) == int(
|
int( ::gettimeofday() / 86400 ) == int(
|
||||||
(
|
(
|
||||||
computeAlignTime(
|
::computeAlignTime(
|
||||||
'24:00',
|
'24:00',
|
||||||
sunrise_abs(
|
::sunrise_abs(
|
||||||
$autoAstroMode,
|
$autoAstroMode,
|
||||||
0,
|
0,
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
@ -690,7 +690,7 @@ sub ShuttersSunrise {
|
|||||||
( $shuttersSunriseUnixtime + 86400 )
|
( $shuttersSunriseUnixtime + 86400 )
|
||||||
if ( $shuttersSunriseUnixtime <
|
if ( $shuttersSunriseUnixtime <
|
||||||
( $oldFuncHash->{sunrisetime} + 180 )
|
( $oldFuncHash->{sunrisetime} + 180 )
|
||||||
&& $oldFuncHash->{sunrisetime} < gettimeofday() );
|
&& $oldFuncHash->{sunrisetime} < ::gettimeofday() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -698,7 +698,7 @@ sub ShuttersSunrise {
|
|||||||
$shuttersSunriseUnixtime = ( $shuttersSunriseUnixtime + 86400 )
|
$shuttersSunriseUnixtime = ( $shuttersSunriseUnixtime + 86400 )
|
||||||
if ( $shuttersSunriseUnixtime <
|
if ( $shuttersSunriseUnixtime <
|
||||||
( $oldFuncHash->{sunrisetime} + 180 )
|
( $oldFuncHash->{sunrisetime} + 180 )
|
||||||
&& $oldFuncHash->{sunrisetime} < gettimeofday() );
|
&& $oldFuncHash->{sunrisetime} < ::gettimeofday() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
elsif ( $FHEM::Automation::ShuttersControl::shutters->getUp eq 'time' )
|
elsif ( $FHEM::Automation::ShuttersControl::shutters->getUp eq 'time' )
|
||||||
@ -711,8 +711,8 @@ sub ShuttersSunrise {
|
|||||||
{
|
{
|
||||||
if ( !IsWe('tomorrow') ) {
|
if ( !IsWe('tomorrow') ) {
|
||||||
if (
|
if (
|
||||||
int( gettimeofday() / 86400 ) == int(
|
int( ::gettimeofday() / 86400 ) == int(
|
||||||
computeAlignTime(
|
::computeAlignTime(
|
||||||
'24:00',
|
'24:00',
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
->getTimeUpWeHoliday
|
->getTimeUpWeHoliday
|
||||||
@ -720,13 +720,13 @@ sub ShuttersSunrise {
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
$shuttersSunriseUnixtime = computeAlignTime( '24:00',
|
$shuttersSunriseUnixtime = ::computeAlignTime( '24:00',
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
->getTimeUpWeHoliday );
|
->getTimeUpWeHoliday );
|
||||||
}
|
}
|
||||||
elsif (
|
elsif (
|
||||||
int( gettimeofday() / 86400 ) == int(
|
int( ::gettimeofday() / 86400 ) == int(
|
||||||
computeAlignTime(
|
::computeAlignTime(
|
||||||
'24:00',
|
'24:00',
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
->getTimeUpEarly
|
->getTimeUpEarly
|
||||||
@ -736,12 +736,12 @@ sub ShuttersSunrise {
|
|||||||
->getSunrise
|
->getSunrise
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
$shuttersSunriseUnixtime = computeAlignTime( '24:00',
|
$shuttersSunriseUnixtime = ::computeAlignTime( '24:00',
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
->getTimeUpEarly ) + 86400;
|
->getTimeUpEarly ) + 86400;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$shuttersSunriseUnixtime = computeAlignTime( '24:00',
|
$shuttersSunriseUnixtime = ::computeAlignTime( '24:00',
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
->getTimeUpEarly );
|
->getTimeUpEarly );
|
||||||
}
|
}
|
||||||
@ -749,8 +749,8 @@ sub ShuttersSunrise {
|
|||||||
else {
|
else {
|
||||||
if (
|
if (
|
||||||
IsWe()
|
IsWe()
|
||||||
&& int( gettimeofday() / 86400 ) == int(
|
&& int( ::gettimeofday() / 86400 ) == int(
|
||||||
computeAlignTime(
|
::computeAlignTime(
|
||||||
'24:00',
|
'24:00',
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
->getTimeUpWeHoliday
|
->getTimeUpWeHoliday
|
||||||
@ -758,13 +758,13 @@ sub ShuttersSunrise {
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
$shuttersSunriseUnixtime = computeAlignTime( '24:00',
|
$shuttersSunriseUnixtime = ::computeAlignTime( '24:00',
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
->getTimeUpWeHoliday );
|
->getTimeUpWeHoliday );
|
||||||
}
|
}
|
||||||
elsif (
|
elsif (
|
||||||
int( gettimeofday() / 86400 ) == int(
|
int( ::gettimeofday() / 86400 ) == int(
|
||||||
computeAlignTime(
|
::computeAlignTime(
|
||||||
'24:00',
|
'24:00',
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
->getTimeUpEarly
|
->getTimeUpEarly
|
||||||
@ -772,13 +772,13 @@ sub ShuttersSunrise {
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
$shuttersSunriseUnixtime = computeAlignTime( '24:00',
|
$shuttersSunriseUnixtime = ::computeAlignTime( '24:00',
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
->getTimeUpEarly );
|
->getTimeUpEarly );
|
||||||
}
|
}
|
||||||
elsif (
|
elsif (
|
||||||
int( gettimeofday() / 86400 ) != int(
|
int( ::gettimeofday() / 86400 ) != int(
|
||||||
computeAlignTime(
|
::computeAlignTime(
|
||||||
'24:00',
|
'24:00',
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
->getTimeUpWeHoliday
|
->getTimeUpWeHoliday
|
||||||
@ -786,19 +786,19 @@ sub ShuttersSunrise {
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
$shuttersSunriseUnixtime = computeAlignTime( '24:00',
|
$shuttersSunriseUnixtime = ::computeAlignTime( '24:00',
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
->getTimeUpWeHoliday );
|
->getTimeUpWeHoliday );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$shuttersSunriseUnixtime = computeAlignTime( '24:00',
|
$shuttersSunriseUnixtime = ::computeAlignTime( '24:00',
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
->getTimeUpWeHoliday ) + 86400;
|
->getTimeUpWeHoliday ) + 86400;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$shuttersSunriseUnixtime = computeAlignTime( '24:00',
|
$shuttersSunriseUnixtime = ::computeAlignTime( '24:00',
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
->getTimeUpEarly );
|
->getTimeUpEarly );
|
||||||
}
|
}
|
||||||
@ -806,15 +806,14 @@ sub ShuttersSunrise {
|
|||||||
elsif ( $FHEM::Automation::ShuttersControl::shutters->getUp eq
|
elsif ( $FHEM::Automation::ShuttersControl::shutters->getUp eq
|
||||||
'brightness' )
|
'brightness' )
|
||||||
{
|
{
|
||||||
$shuttersSunriseUnixtime = computeAlignTime( '24:00',
|
$shuttersSunriseUnixtime = ::computeAlignTime( '24:00',
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpLate
|
$FHEM::Automation::ShuttersControl::shutters->getTimeUpLate );
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $shuttersSunriseUnixtime;
|
return $shuttersSunriseUnixtime;
|
||||||
}
|
}
|
||||||
elsif ( $tm eq 'real' ) {
|
elsif ( $tm eq 'real' ) {
|
||||||
return sunrise_abs(
|
return ::sunrise_abs(
|
||||||
$autoAstroMode,
|
$autoAstroMode,
|
||||||
0,
|
0,
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly,
|
$FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly,
|
||||||
@ -830,7 +829,7 @@ sub ShuttersSunrise {
|
|||||||
|
|
||||||
sub ShuttersSunset {
|
sub ShuttersSunset {
|
||||||
my $shuttersDev = shift;
|
my $shuttersDev = shift;
|
||||||
my $tm = shift; # Tm steht für Timemode und bedeutet Realzeit oder Unixzeit
|
my $tm = shift; # Tm steht für Timemode und bedeutet Realzeit oder Unixzeit
|
||||||
|
|
||||||
my $autoAstroMode;
|
my $autoAstroMode;
|
||||||
$FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
|
$FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
|
||||||
@ -858,15 +857,15 @@ sub ShuttersSunset {
|
|||||||
my $oldFuncHash =
|
my $oldFuncHash =
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getInTimerFuncHash;
|
$FHEM::Automation::ShuttersControl::shutters->getInTimerFuncHash;
|
||||||
my $shuttersSunsetUnixtime =
|
my $shuttersSunsetUnixtime =
|
||||||
computeAlignTime( '24:00', sunset( 'REAL', 0, '15:30', '21:30' ) );
|
::computeAlignTime( '24:00', ::sunset( 'REAL', 0, '15:30', '21:30' ) );
|
||||||
|
|
||||||
if ( $tm eq 'unix' ) {
|
if ( $tm eq 'unix' ) {
|
||||||
if ( $FHEM::Automation::ShuttersControl::shutters->getDown eq 'astro' )
|
if ( $FHEM::Automation::ShuttersControl::shutters->getDown eq 'astro' )
|
||||||
{
|
{
|
||||||
$shuttersSunsetUnixtime = (
|
$shuttersSunsetUnixtime = (
|
||||||
computeAlignTime(
|
::computeAlignTime(
|
||||||
'24:00',
|
'24:00',
|
||||||
sunset_abs(
|
::sunset_abs(
|
||||||
$autoAstroMode,
|
$autoAstroMode,
|
||||||
0,
|
0,
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
@ -880,13 +879,13 @@ sub ShuttersSunset {
|
|||||||
$shuttersSunsetUnixtime += 86400
|
$shuttersSunsetUnixtime += 86400
|
||||||
if ( $shuttersSunsetUnixtime <
|
if ( $shuttersSunsetUnixtime <
|
||||||
( $oldFuncHash->{sunsettime} + 180 )
|
( $oldFuncHash->{sunsettime} + 180 )
|
||||||
&& $oldFuncHash->{sunsettime} < gettimeofday() );
|
&& $oldFuncHash->{sunsettime} < ::gettimeofday() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
elsif (
|
elsif (
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getDown eq 'time' )
|
$FHEM::Automation::ShuttersControl::shutters->getDown eq 'time' )
|
||||||
{
|
{
|
||||||
$shuttersSunsetUnixtime = computeAlignTime( '24:00',
|
$shuttersSunsetUnixtime = ::computeAlignTime( '24:00',
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getTimeDownEarly
|
$FHEM::Automation::ShuttersControl::shutters->getTimeDownEarly
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -894,13 +893,13 @@ sub ShuttersSunset {
|
|||||||
'brightness' )
|
'brightness' )
|
||||||
{
|
{
|
||||||
$shuttersSunsetUnixtime =
|
$shuttersSunsetUnixtime =
|
||||||
computeAlignTime( '24:00',
|
::computeAlignTime( '24:00',
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getTimeDownLate );
|
$FHEM::Automation::ShuttersControl::shutters->getTimeDownLate );
|
||||||
}
|
}
|
||||||
return $shuttersSunsetUnixtime;
|
return $shuttersSunsetUnixtime;
|
||||||
}
|
}
|
||||||
elsif ( $tm eq 'real' ) {
|
elsif ( $tm eq 'real' ) {
|
||||||
return sunset_abs(
|
return ::sunset_abs(
|
||||||
$autoAstroMode,
|
$autoAstroMode,
|
||||||
0,
|
0,
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getTimeDownEarly,
|
$FHEM::Automation::ShuttersControl::shutters->getTimeDownEarly,
|
||||||
@ -923,7 +922,7 @@ sub IsAfterShuttersTimeBlocking {
|
|||||||
|
|
||||||
if (
|
if (
|
||||||
(
|
(
|
||||||
int( gettimeofday() ) -
|
int( ::gettimeofday() ) -
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getLastManPosTimestamp
|
$FHEM::Automation::ShuttersControl::shutters->getLastManPosTimestamp
|
||||||
) <
|
) <
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getBlockingTimeAfterManual
|
$FHEM::Automation::ShuttersControl::shutters->getBlockingTimeAfterManual
|
||||||
@ -933,7 +932,7 @@ sub IsAfterShuttersTimeBlocking {
|
|||||||
$FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime
|
$FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime
|
||||||
)
|
)
|
||||||
&& $FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime
|
&& $FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime
|
||||||
- ( int( gettimeofday() ) ) <
|
- ( int( ::gettimeofday() ) ) <
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
->getBlockingTimeBeforDayOpen
|
->getBlockingTimeBeforDayOpen
|
||||||
)
|
)
|
||||||
@ -943,7 +942,7 @@ sub IsAfterShuttersTimeBlocking {
|
|||||||
$FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime
|
$FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime
|
||||||
)
|
)
|
||||||
&& $FHEM::Automation::ShuttersControl::shutters->getSunsetUnixTime
|
&& $FHEM::Automation::ShuttersControl::shutters->getSunsetUnixTime
|
||||||
- ( int( gettimeofday() ) ) <
|
- ( int( ::gettimeofday() ) ) <
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
->getBlockingTimeBeforNightClose
|
->getBlockingTimeBeforNightClose
|
||||||
)
|
)
|
||||||
@ -982,7 +981,7 @@ sub IsAfterShuttersManualBlocking {
|
|||||||
}
|
}
|
||||||
elsif (
|
elsif (
|
||||||
(
|
(
|
||||||
int( gettimeofday() ) -
|
int( ::gettimeofday() ) -
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getLastManPosTimestamp
|
$FHEM::Automation::ShuttersControl::shutters->getLastManPosTimestamp
|
||||||
) <
|
) <
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getBlockingTimeAfterManual
|
$FHEM::Automation::ShuttersControl::shutters->getBlockingTimeAfterManual
|
||||||
@ -994,25 +993,6 @@ sub IsAfterShuttersManualBlocking {
|
|||||||
else { return 1 }
|
else { return 1 }
|
||||||
}
|
}
|
||||||
|
|
||||||
sub makeReadingName {
|
|
||||||
my ($rname) = shift;
|
|
||||||
my %charHash = (
|
|
||||||
chr(0xe4) => "ae", # ä
|
|
||||||
chr(0xc4) => "Ae", # Ä
|
|
||||||
chr(0xfc) => "ue", # ü
|
|
||||||
chr(0xdc) => "Ue", # Ü
|
|
||||||
chr(0xf6) => "oe", # ö
|
|
||||||
chr(0xd6) => "Oe", # Ö
|
|
||||||
chr(0xdf) => "ss" # ß
|
|
||||||
);
|
|
||||||
my $charHashkeys = join( "", keys(%charHash) );
|
|
||||||
|
|
||||||
return $rname if ( $rname =~ m{^\./}xms );
|
|
||||||
$rname =~ s/([$charHashkeys])/$charHash{$1}/xgi;
|
|
||||||
$rname =~ s/[^a-z0-9._\-\/]/_/xgi;
|
|
||||||
return $rname;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub IsWe {
|
sub IsWe {
|
||||||
return main::IsWe( shift, shift );
|
return main::IsWe( shift, shift );
|
||||||
}
|
}
|
||||||
@ -1038,24 +1018,32 @@ sub PerlCodeCheck {
|
|||||||
sub IsAdv {
|
sub IsAdv {
|
||||||
use HTTP::Date;
|
use HTTP::Date;
|
||||||
my ( undef, undef, undef, $monthday, $month, $year, undef, undef, undef ) =
|
my ( undef, undef, undef, $monthday, $month, $year, undef, undef, undef ) =
|
||||||
localtime( gettimeofday() );
|
localtime( ::gettimeofday() );
|
||||||
my $adv = 0;
|
my $adv = 0;
|
||||||
$year += 1900;
|
$year += 1900;
|
||||||
|
|
||||||
if ( $month < 1 ) {
|
if ( $month < 1
|
||||||
if ( $monthday < 7 ) {
|
&& $FHEM::Automation::ShuttersControl::ascDev->getAdvEndDate eq
|
||||||
$adv = 1;
|
'EpiphanyDay' )
|
||||||
}
|
{
|
||||||
|
$adv = $monthday < 7 ? 1 : 0;
|
||||||
|
}
|
||||||
|
elsif ($month < 2
|
||||||
|
&& $FHEM::Automation::ShuttersControl::ascDev->getAdvEndDate eq
|
||||||
|
'CandlemasDay' )
|
||||||
|
{
|
||||||
|
$adv = $month = 1 || ( $month = 2 && $monthday < 3 ) ? 1 : 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
my $time = str2time( $year . '-12-25' );
|
my $time = str2time( $year . '-12-25' );
|
||||||
my $wday = ( localtime($time) )[6];
|
my $wday = ( localtime($time) )[6];
|
||||||
$wday = $wday ? $wday : 7;
|
$wday = $wday ? $wday : 7;
|
||||||
$time -= ( $FHEM::Automation::ShuttersControl::ascDev
|
$time -= (
|
||||||
->getAdvDate eq 'DeadSunday'
|
$FHEM::Automation::ShuttersControl::ascDev->getAdvStartDate eq
|
||||||
? ($wday + 27) * 86400
|
'DeadSunday'
|
||||||
: ($wday + 21) * 86400
|
? ( $wday + 27 ) * 86400
|
||||||
);
|
: ( $wday + 21 ) * 86400
|
||||||
|
);
|
||||||
$adv = 1 if ( $time < time );
|
$adv = 1 if ( $time < time );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1065,18 +1053,19 @@ sub IsAdv {
|
|||||||
sub IsInTime {
|
sub IsInTime {
|
||||||
my $dfi = shift;
|
my $dfi = shift;
|
||||||
|
|
||||||
$dfi =~ s/{([^\x7d]*)}/$cmdFromAnalyze=$1; eval $1/ge; # Forum #69787
|
$dfi =~ s/{([^\x7d]*)}/$cmdFromAnalyze=$1; eval $1/ge; # Forum #69787
|
||||||
my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime(gettimeofday());
|
my ( $sec, $min, $hour, $mday, $month, $year, $wday, $yday, $isdst ) =
|
||||||
my $dhms = sprintf("%s\@%02d:%02d:%02d", $wday, $hour, $min, $sec);
|
localtime( ::gettimeofday() );
|
||||||
foreach my $ft (split(" ", $dfi)) {
|
my $dhms = sprintf( "%s\@%02d:%02d:%02d", $wday, $hour, $min, $sec );
|
||||||
my ($from, $to) = split("-", $ft);
|
foreach my $ft ( split( " ", $dfi ) ) {
|
||||||
if(defined($from) && defined($to)) {
|
my ( $from, $to ) = split( "-", $ft );
|
||||||
$from = "$wday\@$from" if(index($from,"@") < 0);
|
if ( defined($from) && defined($to) ) {
|
||||||
$to = "$wday\@$to" if(index($to, "@") < 0);
|
$from = "$wday\@$from" if ( index( $from, "@" ) < 0 );
|
||||||
return 1 if($from le $dhms && $dhms le $to);
|
$to = "$wday\@$to" if ( index( $to, "@" ) < 0 );
|
||||||
|
return 1 if ( $from le $dhms && $dhms le $to );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
###############################################################################
|
###############################################################################
|
||||||
#
|
#
|
||||||
# Developed with Kate
|
# Developed with VSCodium and richterger perl plugin
|
||||||
#
|
#
|
||||||
# (c) 2018-2021 Copyright: Marko Oldenburg (fhemdevelopment@cooltux.net)
|
# (c) 2018-2025 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net)
|
||||||
# All rights reserved
|
# All rights reserved
|
||||||
#
|
#
|
||||||
# Special thanks goes to:
|
# Special thanks goes to:
|
||||||
@ -47,7 +47,9 @@ use utf8;
|
|||||||
use FHEM::Automation::ShuttersControl::Helper qw (:ALL);
|
use FHEM::Automation::ShuttersControl::Helper qw (:ALL);
|
||||||
|
|
||||||
require Exporter;
|
require Exporter;
|
||||||
our @ISA = qw(Exporter);
|
use base qw(Exporter);
|
||||||
|
|
||||||
|
# our @ISA = qw(Exporter);
|
||||||
our @EXPORT_OK = qw(
|
our @EXPORT_OK = qw(
|
||||||
RainProcessing
|
RainProcessing
|
||||||
);
|
);
|
||||||
@ -55,16 +57,15 @@ our %EXPORT_TAGS = (
|
|||||||
ALL => [
|
ALL => [
|
||||||
qw(
|
qw(
|
||||||
RainProcessing
|
RainProcessing
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
sub RainProcessing {
|
sub RainProcessing {
|
||||||
my ( $hash, $val, $triggerMax, $triggerMin ) = @_;
|
my ( $hash, $val, $triggerMax, $triggerMin ) = @_;
|
||||||
|
|
||||||
my $rainClosedPos = $FHEM::Automation::ShuttersControl::ascDev
|
my $rainClosedPos = $FHEM::Automation::ShuttersControl::ascDev
|
||||||
->getRainSensorShuttersClosedPos;
|
->getRainSensorShuttersClosedPos;
|
||||||
|
|
||||||
for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
|
for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
|
||||||
$FHEM::Automation::ShuttersControl::shutters->setShuttersDev(
|
$FHEM::Automation::ShuttersControl::shutters->setShuttersDev(
|
||||||
@ -75,44 +76,53 @@ sub RainProcessing {
|
|||||||
$FHEM::Automation::ShuttersControl::shutters->getRainProtection eq
|
$FHEM::Automation::ShuttersControl::shutters->getRainProtection eq
|
||||||
'off' );
|
'off' );
|
||||||
|
|
||||||
if ( $val > $triggerMax
|
if (
|
||||||
|
$val > $triggerMax
|
||||||
&& $FHEM::Automation::ShuttersControl::shutters->getStatus !=
|
&& $FHEM::Automation::ShuttersControl::shutters->getStatus !=
|
||||||
$rainClosedPos
|
$rainClosedPos
|
||||||
&& $FHEM::Automation::ShuttersControl::shutters
|
&& $FHEM::Automation::ShuttersControl::shutters
|
||||||
->getRainProtectionStatus eq 'unprotected'
|
->getRainProtectionStatus eq 'unprotected'
|
||||||
|| ( $FHEM::Automation::ShuttersControl::shutters
|
|| ( $FHEM::Automation::ShuttersControl::shutters
|
||||||
->getRainProtectionStatus eq 'unprotected'
|
->getRainProtectionStatus eq 'unprotected'
|
||||||
&& $FHEM::Automation::ShuttersControl::shutters
|
&& $FHEM::Automation::ShuttersControl::shutters
|
||||||
->getRainUnprotectionDelayObj ne 'none')
|
->getRainUnprotectionDelayObj ne 'none' )
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
_RainProtected();
|
_RainProtected();
|
||||||
}
|
}
|
||||||
elsif ( ( $val == 0 || $val < $triggerMin )
|
elsif ( ( $val == 0 || $val < $triggerMin )
|
||||||
&& $FHEM::Automation::ShuttersControl::shutters->getStatus ==
|
&& $FHEM::Automation::ShuttersControl::shutters->getStatus ==
|
||||||
$rainClosedPos
|
$rainClosedPos
|
||||||
&& IsAfterShuttersManualBlocking($shuttersDev)
|
&& IsAfterShuttersManualBlocking($shuttersDev)
|
||||||
&& $FHEM::Automation::ShuttersControl::shutters
|
&& $FHEM::Automation::ShuttersControl::shutters
|
||||||
->getRainProtectionStatus eq 'protected' )
|
->getRainProtectionStatus eq 'protected' )
|
||||||
{
|
{
|
||||||
my %funcHash = (
|
my %funcHash = ( shuttersdevice => $shuttersDev, );
|
||||||
shuttersdevice => $shuttersDev,
|
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
|
->setRainUnprotectionDelayObj( \%funcHash );
|
||||||
|
::InternalTimer(
|
||||||
|
::gettimeofday() +
|
||||||
|
$FHEM::Automation::ShuttersControl::ascDev
|
||||||
|
->getRainWaitingTime,
|
||||||
|
\&_RainUnprotected, \%funcHash
|
||||||
);
|
);
|
||||||
|
|
||||||
$FHEM::Automation::ShuttersControl::shutters->setRainUnprotectionDelayObj(\%funcHash);
|
|
||||||
::InternalTimer( ::gettimeofday() + $FHEM::Automation::ShuttersControl::ascDev->getRainWaitingTime
|
|
||||||
, \&_RainUnprotected
|
|
||||||
, \%funcHash );
|
|
||||||
|
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
->setRainProtectionStatus('unprotected');
|
->setRainProtectionStatus('unprotected');
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
if ( $FHEM::Automation::ShuttersControl::shutters->getStatus !=
|
||||||
->setRainProtectionStatus('unprotected')
|
$rainClosedPos
|
||||||
if ( $FHEM::Automation::ShuttersControl::shutters->getStatus !=
|
&& ( $val == 0 || $val < $triggerMin ) )
|
||||||
$rainClosedPos
|
{
|
||||||
&& ($val == 0 || $val < $triggerMin) );
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
|
->setRainProtectionStatus('unprotected');
|
||||||
|
}
|
||||||
|
elsif ( $val > $triggerMax ) {
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
|
->setRainProtectionStatus('protected');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -121,55 +131,76 @@ sub RainProcessing {
|
|||||||
|
|
||||||
### es muss noch beobachtet werden ob die Auswahl des Rollos welches bearbeitet werden soll bestehen bleibt oder mit in die neuen Funktionen übergeben werden muss
|
### es muss noch beobachtet werden ob die Auswahl des Rollos welches bearbeitet werden soll bestehen bleibt oder mit in die neuen Funktionen übergeben werden muss
|
||||||
sub _RainProtected {
|
sub _RainProtected {
|
||||||
::RemoveInternalTimer($FHEM::Automation::ShuttersControl::shutters->getRainUnprotectionDelayObj)
|
::RemoveInternalTimer( $FHEM::Automation::ShuttersControl::shutters
|
||||||
if($FHEM::Automation::ShuttersControl::shutters->getRainUnprotectionDelayObj ne 'none');
|
->getRainUnprotectionDelayObj )
|
||||||
|
if ( $FHEM::Automation::ShuttersControl::shutters
|
||||||
$FHEM::Automation::ShuttersControl::shutters->setRainUnprotectionDelayObj('none');
|
->getRainUnprotectionDelayObj ne 'none' );
|
||||||
|
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->setRainUnprotectionDelayObj(
|
||||||
|
'none');
|
||||||
|
|
||||||
$FHEM::Automation::ShuttersControl::shutters->setLastDrive(
|
$FHEM::Automation::ShuttersControl::shutters->setLastDrive(
|
||||||
'rain protected');
|
'rain protected');
|
||||||
$FHEM::Automation::ShuttersControl::shutters->setDriveCmd(
|
|
||||||
$FHEM::Automation::ShuttersControl::ascDev
|
$FHEM::Automation::ShuttersControl::shutters->setDriveCmd(
|
||||||
->getRainSensorShuttersClosedPos);
|
$FHEM::Automation::ShuttersControl::ascDev
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
->getRainSensorShuttersClosedPos );
|
||||||
->setRainProtectionStatus('protected');
|
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->setRainProtectionStatus(
|
||||||
|
'protected');
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub _RainUnprotected {
|
sub _RainUnprotected {
|
||||||
my $h = shift;
|
my $h = shift;
|
||||||
|
my $targetPos = $FHEM::Automation::ShuttersControl::shutters->getLastPos;
|
||||||
|
|
||||||
my $shuttersDev = $h->{shuttersdevice};
|
my $shuttersDev = $h->{shuttersdevice};
|
||||||
$FHEM::Automation::ShuttersControl::shutters->setShuttersDev(
|
$FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
|
||||||
$shuttersDev);
|
|
||||||
|
|
||||||
$FHEM::Automation::ShuttersControl::shutters->setLastDrive(
|
$FHEM::Automation::ShuttersControl::shutters->setLastDrive(
|
||||||
'rain un-protected');
|
'rain un-protected');
|
||||||
|
|
||||||
if ( $FHEM::Automation::ShuttersControl::shutters->getRainUnprotectionDelayObj ne 'none' ) {
|
if ( $FHEM::Automation::ShuttersControl::shutters
|
||||||
::RemoveInternalTimer($FHEM::Automation::ShuttersControl::shutters->getRainUnprotectionDelayObj);
|
->getRainUnprotectionDelayObj ne 'none' )
|
||||||
$FHEM::Automation::ShuttersControl::shutters->setRainUnprotectionDelayObj('none');
|
{
|
||||||
|
::RemoveInternalTimer( $FHEM::Automation::ShuttersControl::shutters
|
||||||
|
->getRainUnprotectionDelayObj );
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
|
->setRainUnprotectionDelayObj('none');
|
||||||
}
|
}
|
||||||
|
|
||||||
$FHEM::Automation::ShuttersControl::shutters->setDriveCmd(
|
if ( $FHEM::Automation::ShuttersControl::shutters->getIsDay
|
||||||
(
|
&& !$FHEM::Automation::ShuttersControl::shutters->getIfInShading
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getIsDay
|
&& $FHEM::Automation::ShuttersControl::shutters->getLastPos ==
|
||||||
? $FHEM::Automation::ShuttersControl::shutters->getLastPos
|
$FHEM::Automation::ShuttersControl::shutters->getShadingPos )
|
||||||
: (
|
{
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$targetPos = $FHEM::Automation::ShuttersControl::shutters->getOpenPos;
|
||||||
->getPrivacyDownStatus == 2
|
}
|
||||||
? $FHEM::Automation::ShuttersControl::shutters
|
else {
|
||||||
->getPrivacyDownPos
|
$targetPos = $FHEM::Automation::ShuttersControl::shutters->getLastPos;
|
||||||
: $FHEM::Automation::ShuttersControl::shutters
|
}
|
||||||
->getClosedPos
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
if ( !$FHEM::Automation::ShuttersControl::shutters->getIsDay
|
||||||
->setRainProtectionStatus('unprotected');
|
&& $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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
###############################################################################
|
###############################################################################
|
||||||
#
|
#
|
||||||
# Developed with Kate
|
# Developed with VSCodium and richterger perl plugin
|
||||||
#
|
#
|
||||||
# (c) 2018-2021 Copyright: Marko Oldenburg (fhemdevelopment@cooltux.net)
|
# (c) 2018-2025 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net)
|
||||||
# All rights reserved
|
# All rights reserved
|
||||||
#
|
#
|
||||||
# Special thanks goes to:
|
# Special thanks goes to:
|
||||||
@ -44,37 +44,41 @@ use strict;
|
|||||||
use warnings;
|
use warnings;
|
||||||
use utf8;
|
use utf8;
|
||||||
|
|
||||||
use GPUtils qw(GP_Import);
|
require Exporter;
|
||||||
|
use base qw(Exporter);
|
||||||
|
|
||||||
## Import der FHEM Funktionen
|
# our @ISA = qw(Exporter);
|
||||||
BEGIN {
|
our @EXPORT_OK = qw(
|
||||||
GP_Import(
|
getRoommateStatus
|
||||||
|
getRoommateLastStatus
|
||||||
|
);
|
||||||
|
our %EXPORT_TAGS = (
|
||||||
|
ALL => [
|
||||||
qw(
|
qw(
|
||||||
ReadingsVal)
|
getRoommateStatus
|
||||||
);
|
getRoommateLastStatus
|
||||||
}
|
)
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
sub _getRoommateStatus {
|
sub getRoommateStatus {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
my $roommate = $self->{roommate};
|
my $roommate = $self->{roommate};
|
||||||
|
|
||||||
return ReadingsVal( $roommate,
|
return ::ReadingsVal( $roommate,
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getRoommatesReading,
|
$FHEM::Automation::ShuttersControl::shutters->getRoommatesReading,
|
||||||
'none' );
|
'none' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub _getRoommateLastStatus {
|
sub getRoommateLastStatus {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
my $roommate = $self->{roommate};
|
my $roommate = $self->{roommate};
|
||||||
my $default = $self->{defaultarg};
|
my $default = $self->{defaultarg};
|
||||||
|
|
||||||
$default = 'none' if ( !defined($default) );
|
$default = 'none' if ( !defined($default) );
|
||||||
return ReadingsVal( $roommate, 'lastState', $default );
|
return ::ReadingsVal( $roommate, 'lastState', $default );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
###############################################################################
|
###############################################################################
|
||||||
#
|
#
|
||||||
# Developed with Kate
|
# Developed with VSCodium and richterger perl plugin
|
||||||
#
|
#
|
||||||
# (c) 2018-2021 Copyright: Marko Oldenburg (fhemdevelopment@cooltux.net)
|
# (c) 2018-2025 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net)
|
||||||
# All rights reserved
|
# All rights reserved
|
||||||
#
|
#
|
||||||
# Special thanks goes to:
|
# Special thanks goes to:
|
||||||
@ -48,7 +48,9 @@ use utf8;
|
|||||||
use FHEM::Automation::ShuttersControl::Helper qw (IsInTime);
|
use FHEM::Automation::ShuttersControl::Helper qw (IsInTime);
|
||||||
|
|
||||||
require Exporter;
|
require Exporter;
|
||||||
our @ISA = qw(Exporter);
|
use base qw(Exporter);
|
||||||
|
|
||||||
|
# our @ISA = qw(Exporter);
|
||||||
our @EXPORT_OK = qw(
|
our @EXPORT_OK = qw(
|
||||||
CheckASC_ConditionsForShadingFn
|
CheckASC_ConditionsForShadingFn
|
||||||
ShadingProcessing
|
ShadingProcessing
|
||||||
@ -60,31 +62,13 @@ our %EXPORT_TAGS = (
|
|||||||
CheckASC_ConditionsForShadingFn
|
CheckASC_ConditionsForShadingFn
|
||||||
ShadingProcessing
|
ShadingProcessing
|
||||||
ShadingProcessingDriveCommand
|
ShadingProcessingDriveCommand
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
use GPUtils qw(GP_Import);
|
|
||||||
## Import der FHEM Funktionen
|
|
||||||
BEGIN {
|
|
||||||
GP_Import(
|
|
||||||
qw(
|
|
||||||
Log3
|
|
||||||
gettimeofday
|
|
||||||
InternalTimer
|
|
||||||
ReadingsVal
|
|
||||||
readingsBeginUpdate
|
|
||||||
readingsBulkUpdate
|
|
||||||
readingsBulkUpdateIfChanged
|
|
||||||
readingsEndUpdate
|
|
||||||
defs
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub CheckASC_ConditionsForShadingFn {
|
sub CheckASC_ConditionsForShadingFn {
|
||||||
my $hash = shift;
|
my $hash = shift;
|
||||||
my $value = shift;
|
my $value = shift;
|
||||||
|
|
||||||
my $error;
|
my $error;
|
||||||
|
|
||||||
@ -98,14 +82,14 @@ sub CheckASC_ConditionsForShadingFn {
|
|||||||
my $count = 1;
|
my $count = 1;
|
||||||
for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
|
for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
|
||||||
my %funcHash = (
|
my %funcHash = (
|
||||||
hash => $hash,
|
hash => $hash,
|
||||||
shuttersdevice => $shuttersDev,
|
shuttersdevice => $shuttersDev,
|
||||||
value => $value,
|
value => $value,
|
||||||
attrEvent => 0,
|
attrEvent => 0,
|
||||||
);
|
);
|
||||||
|
|
||||||
InternalTimer(
|
::InternalTimer(
|
||||||
gettimeofday() + $count,
|
::gettimeofday() + $count,
|
||||||
'FHEM::Automation::ShuttersControl::Shading::_CheckShuttersConditionsForShadingFn',
|
'FHEM::Automation::ShuttersControl::Shading::_CheckShuttersConditionsForShadingFn',
|
||||||
\%funcHash
|
\%funcHash
|
||||||
);
|
);
|
||||||
@ -121,86 +105,93 @@ sub CheckASC_ConditionsForShadingFn {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub _CheckShuttersConditionsForShadingFn {
|
sub _CheckShuttersConditionsForShadingFn {
|
||||||
my $funcHash = shift;
|
my $funcHash = shift;
|
||||||
|
|
||||||
my $hash = $funcHash->{hash};
|
my $hash = $funcHash->{hash};
|
||||||
my $shuttersDev = $funcHash->{shuttersdevice};
|
my $shuttersDev = $funcHash->{shuttersdevice};
|
||||||
my $value = $funcHash->{value};
|
my $value = $funcHash->{value};
|
||||||
|
|
||||||
$FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
|
$FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
|
||||||
my $shuttersDevHash = $defs{$shuttersDev};
|
my $shuttersDevHash = $::defs{$shuttersDev};
|
||||||
my $message = '';
|
my $message = '';
|
||||||
my $errorMessage;
|
my $errorMessage;
|
||||||
my $warnMessage;
|
my $warnMessage;
|
||||||
my $infoMessage;
|
my $infoMessage;
|
||||||
|
|
||||||
if ( $value eq 'off' ) {
|
if ( $value eq 'off' ) {
|
||||||
$FHEM::Automation::ShuttersControl::shutters->setShadingStatus('out');
|
$FHEM::Automation::ShuttersControl::shutters->setShadingStatus('out');
|
||||||
$infoMessage .= ' shading was deactivated ' . ($funcHash->{attrEvent} ? 'in the device' : 'globally');
|
$infoMessage .= ' shading was deactivated '
|
||||||
$errorMessage .= '';
|
. ( $funcHash->{attrEvent} ? 'in the device' : 'globally' );
|
||||||
|
$errorMessage .= '';
|
||||||
ShadingProcessingDriveCommand( $hash, $shuttersDev );
|
ShadingProcessingDriveCommand( $hash, $shuttersDev );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$infoMessage .= (
|
$infoMessage .= (
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getShadingMode ne 'off'
|
$FHEM::Automation::ShuttersControl::shutters->getShadingMode ne
|
||||||
&& $FHEM::Automation::ShuttersControl::ascDev
|
'off'
|
||||||
->getAutoShuttersControlShading eq 'on'
|
&& $FHEM::Automation::ShuttersControl::ascDev
|
||||||
&& $FHEM::Automation::ShuttersControl::shutters->getOutTemp == -100
|
->getAutoShuttersControlShading eq 'on'
|
||||||
|
&& $FHEM::Automation::ShuttersControl::shutters->getOutTemp ==
|
||||||
|
-100
|
||||||
? ' shading active, global temp sensor is set, but shutters temperature sensor is not set'
|
? ' shading active, global temp sensor is set, but shutters temperature sensor is not set'
|
||||||
: ''
|
: ''
|
||||||
);
|
);
|
||||||
|
|
||||||
$warnMessage .= (
|
$warnMessage .= (
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getShadingMode eq 'off'
|
$FHEM::Automation::ShuttersControl::shutters->getShadingMode eq
|
||||||
&& $FHEM::Automation::ShuttersControl::ascDev
|
'off'
|
||||||
->getAutoShuttersControlShading eq 'on'
|
&& $FHEM::Automation::ShuttersControl::ascDev
|
||||||
|
->getAutoShuttersControlShading eq 'on'
|
||||||
? ' global shading active but ASC_Shading_Mode attribut is not set or off'
|
? ' global shading active but ASC_Shading_Mode attribut is not set or off'
|
||||||
: ''
|
: ''
|
||||||
);
|
);
|
||||||
|
|
||||||
$errorMessage .= (
|
$errorMessage .= (
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getShadingMode ne 'off'
|
$FHEM::Automation::ShuttersControl::shutters->getShadingMode ne
|
||||||
&& $FHEM::Automation::ShuttersControl::ascDev
|
'off'
|
||||||
->getAutoShuttersControlShading ne 'on'
|
&& $FHEM::Automation::ShuttersControl::ascDev
|
||||||
&& $FHEM::Automation::ShuttersControl::ascDev
|
->getAutoShuttersControlShading ne 'on'
|
||||||
->getAutoShuttersControlShading ne 'off'
|
&& $FHEM::Automation::ShuttersControl::ascDev
|
||||||
|
->getAutoShuttersControlShading ne 'off'
|
||||||
? ' ASC_Shading_Mode attribut is set but global shading has errors, look at ASC device '
|
? ' ASC_Shading_Mode attribut is set but global shading has errors, look at ASC device '
|
||||||
. '<a href="'
|
. '<a href="'
|
||||||
. '/fhem?detail='
|
. '/fhem?detail='
|
||||||
. ReadingsVal( $shuttersDev, 'associatedWith', 'ASC device' )
|
. ::ReadingsVal( $shuttersDev, 'associatedWith', 'ASC device' )
|
||||||
. $::FW_CSRF . '">'
|
. $::FW_CSRF . '">'
|
||||||
. ReadingsVal( $shuttersDev, 'associatedWith', 'ASC device' )
|
. ::ReadingsVal( $shuttersDev, 'associatedWith', 'ASC device' )
|
||||||
. '</a>'
|
. '</a>'
|
||||||
: ''
|
: ''
|
||||||
);
|
);
|
||||||
|
|
||||||
$errorMessage .= (
|
$errorMessage .= (
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getBrightness == -1
|
$FHEM::Automation::ShuttersControl::shutters->getBrightness == -1
|
||||||
&& $FHEM::Automation::ShuttersControl::shutters->getShadingMode ne
|
&& $FHEM::Automation::ShuttersControl::shutters->getShadingMode
|
||||||
'off'
|
ne 'off'
|
||||||
? ' no brightness sensor found, please set ASC_BrightnessSensor attribut'
|
? ' no brightness sensor found, please set ASC_BrightnessSensor attribut'
|
||||||
: ''
|
: ''
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
$message .= ' ERROR: ' . $errorMessage
|
$message .= ' ERROR: ' . $errorMessage
|
||||||
if ( defined($errorMessage)
|
if ( defined($errorMessage)
|
||||||
&& $errorMessage ne '' );
|
&& $errorMessage ne '' );
|
||||||
|
|
||||||
$message .= ' WARN: ' . $warnMessage
|
$message .= ' WARN: ' . $warnMessage
|
||||||
if ( defined($warnMessage)
|
if ( defined($warnMessage)
|
||||||
&& $warnMessage ne ''
|
&& $warnMessage ne ''
|
||||||
&& $errorMessage eq '' );
|
&& $errorMessage eq '' );
|
||||||
|
|
||||||
$message .= ' INFO: ' . $infoMessage
|
$message .= ' INFO: ' . $infoMessage
|
||||||
if ( defined($infoMessage)
|
if ( defined($infoMessage)
|
||||||
&& $infoMessage ne ''
|
&& $infoMessage ne ''
|
||||||
&& $errorMessage eq '' );
|
&& $errorMessage eq '' );
|
||||||
|
|
||||||
readingsBeginUpdate($shuttersDevHash);
|
::readingsBeginUpdate($shuttersDevHash);
|
||||||
readingsBulkUpdateIfChanged( $shuttersDevHash, 'ASC_ShadingMessage',
|
::readingsBulkUpdateIfChanged( $shuttersDevHash, 'ASC_ShadingMessage',
|
||||||
'<html>' . $message . ' </html>' );
|
'<html>' . $message . ' </html>' );
|
||||||
readingsEndUpdate( $shuttersDevHash, 1 );
|
::readingsEndUpdate( $shuttersDevHash, 1 );
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub ShadingProcessing {
|
sub ShadingProcessing {
|
||||||
@ -215,12 +206,18 @@ sub ShadingProcessing {
|
|||||||
$FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
|
$FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev);
|
||||||
my $brightness =
|
my $brightness =
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getBrightnessAverage;
|
$FHEM::Automation::ShuttersControl::shutters->getBrightnessAverage;
|
||||||
|
|
||||||
$FHEM::Automation::ShuttersControl::shutters->setShadingBetweenTheTimeSuspend(
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
( IsInTime($FHEM::Automation::ShuttersControl::shutters->getShadingBetweenTheTime)
|
->setShadingBetweenTheTimeSuspend(
|
||||||
? 0
|
(
|
||||||
: 1 )
|
IsInTime(
|
||||||
);
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
|
->getShadingBetweenTheTime
|
||||||
|
)
|
||||||
|
? 0
|
||||||
|
: 1
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
FHEM::Automation::ShuttersControl::ASC_Debug(
|
FHEM::Automation::ShuttersControl::ASC_Debug(
|
||||||
'ShadingProcessing: '
|
'ShadingProcessing: '
|
||||||
@ -250,7 +247,7 @@ sub ShadingProcessing {
|
|||||||
. ', Ist es nach der Hälfte der Beschattungswartezeit: '
|
. ', Ist es nach der Hälfte der Beschattungswartezeit: '
|
||||||
. (
|
. (
|
||||||
(
|
(
|
||||||
int( gettimeofday() ) -
|
int( ::gettimeofday() ) -
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
->getShadingStatusTimestamp
|
->getShadingStatusTimestamp
|
||||||
) < (
|
) < (
|
||||||
@ -260,7 +257,7 @@ sub ShadingProcessing {
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
Log3( $name, 4,
|
::Log3( $name, 4,
|
||||||
"AutoShuttersControl ($name) - Shading Processing, Rollladen: "
|
"AutoShuttersControl ($name) - Shading Processing, Rollladen: "
|
||||||
. $shuttersDev
|
. $shuttersDev
|
||||||
. " Azimuth: "
|
. " Azimuth: "
|
||||||
@ -279,18 +276,22 @@ sub ShadingProcessing {
|
|||||||
|| $brightness == -1
|
|| $brightness == -1
|
||||||
|| $outTemp == -100
|
|| $outTemp == -100
|
||||||
|| (
|
|| (
|
||||||
int( gettimeofday() ) -
|
int( ::gettimeofday() ) -
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
->getShadingStatusTimestamp ) < (
|
->getShadingStatusTimestamp ) < (
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
->getShadingWaitingPeriod / 2
|
->getShadingWaitingPeriod / 2
|
||||||
)
|
)
|
||||||
|
|| $FHEM::Automation::ShuttersControl::shutters
|
||||||
|
->getExternalTriggerStatus
|
||||||
|| $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq 'off'
|
|| $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq 'off'
|
||||||
|| $FHEM::Automation::ShuttersControl::ascDev
|
|| $FHEM::Automation::ShuttersControl::ascDev
|
||||||
->getAutoShuttersControlShading eq 'off'
|
->getAutoShuttersControlShading eq 'off'
|
||||||
|
|| $FHEM::Automation::ShuttersControl::shutters
|
||||||
|
->getExternalTriggerStatus
|
||||||
);
|
);
|
||||||
|
|
||||||
Log3( $name, 4,
|
::Log3( $name, 4,
|
||||||
"AutoShuttersControl ($name) - Shading Processing, Rollladen: "
|
"AutoShuttersControl ($name) - Shading Processing, Rollladen: "
|
||||||
. $shuttersDev
|
. $shuttersDev
|
||||||
. " Nach dem return" );
|
. " Nach dem return" );
|
||||||
@ -300,7 +301,7 @@ sub ShadingProcessing {
|
|||||||
my $getStatus = $FHEM::Automation::ShuttersControl::shutters->getStatus;
|
my $getStatus = $FHEM::Automation::ShuttersControl::shutters->getStatus;
|
||||||
my $oldShadingStatus =
|
my $oldShadingStatus =
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getShadingStatus;
|
$FHEM::Automation::ShuttersControl::shutters->getShadingStatus;
|
||||||
my $shuttersDevHash = $defs{$shuttersDev};
|
my $shuttersDevHash = $::defs{$shuttersDev};
|
||||||
|
|
||||||
my $getModeUp = $FHEM::Automation::ShuttersControl::shutters->getModeUp;
|
my $getModeUp = $FHEM::Automation::ShuttersControl::shutters->getModeUp;
|
||||||
my $homemode = $FHEM::Automation::ShuttersControl::shutters->getHomemode;
|
my $homemode = $FHEM::Automation::ShuttersControl::shutters->getHomemode;
|
||||||
@ -316,9 +317,9 @@ sub ShadingProcessing {
|
|||||||
->getShadingMinOutsideTemperature - 4
|
->getShadingMinOutsideTemperature - 4
|
||||||
|| $azimuth < $azimuthLeft
|
|| $azimuth < $azimuthLeft
|
||||||
|| $azimuth > $azimuthRight
|
|| $azimuth > $azimuthRight
|
||||||
|| ( !$FHEM::Automation::ShuttersControl::shutters->getIsDay
|
|| ( !$FHEM::Automation::ShuttersControl::shutters->getIsDay
|
||||||
&& $FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime
|
&& $FHEM::Automation::ShuttersControl::shutters
|
||||||
- ( int( gettimeofday() ) ) > 7200 )
|
->getSunriseUnixTime - ( int( ::gettimeofday() ) ) > 7200 )
|
||||||
)
|
)
|
||||||
&& $FHEM::Automation::ShuttersControl::shutters->getShadingStatus ne
|
&& $FHEM::Automation::ShuttersControl::shutters->getShadingStatus ne
|
||||||
'out'
|
'out'
|
||||||
@ -331,7 +332,7 @@ sub ShadingProcessing {
|
|||||||
. ' - Es ist Nacht oder die Aussentemperatur unterhalb der Shading Temperatur. Die Beschattung wird Zwangsbeendet'
|
. ' - Es ist Nacht oder die Aussentemperatur unterhalb der Shading Temperatur. Die Beschattung wird Zwangsbeendet'
|
||||||
);
|
);
|
||||||
|
|
||||||
Log3( $name, 4,
|
::Log3( $name, 4,
|
||||||
"AutoShuttersControl ($name) - Shading Processing - Der Sonnenstand ist ausserhalb der Winkelangaben oder die Aussentemperatur unterhalb der Shading Temperatur "
|
"AutoShuttersControl ($name) - Shading Processing - Der Sonnenstand ist ausserhalb der Winkelangaben oder die Aussentemperatur unterhalb der Shading Temperatur "
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -358,7 +359,7 @@ sub ShadingProcessing {
|
|||||||
$FHEM::Automation::ShuttersControl::shutters->getShadingStatus
|
$FHEM::Automation::ShuttersControl::shutters->getShadingStatus
|
||||||
eq 'out reserved'
|
eq 'out reserved'
|
||||||
and (
|
and (
|
||||||
int( gettimeofday() ) -
|
int( ::gettimeofday() ) -
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
->getShadingStatusTimestamp )
|
->getShadingStatusTimestamp )
|
||||||
) > $FHEM::Automation::ShuttersControl::shutters
|
) > $FHEM::Automation::ShuttersControl::shutters
|
||||||
@ -369,7 +370,7 @@ sub ShadingProcessing {
|
|||||||
'out');
|
'out');
|
||||||
}
|
}
|
||||||
|
|
||||||
Log3( $name, 4,
|
::Log3( $name, 4,
|
||||||
"AutoShuttersControl ($name) - Shading Processing, Rollladen: "
|
"AutoShuttersControl ($name) - Shading Processing, Rollladen: "
|
||||||
. $shuttersDev
|
. $shuttersDev
|
||||||
. " In der Out Abfrage, Shadingwert: "
|
. " In der Out Abfrage, Shadingwert: "
|
||||||
@ -411,7 +412,7 @@ sub ShadingProcessing {
|
|||||||
$FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq
|
$FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq
|
||||||
'in reserved'
|
'in reserved'
|
||||||
and (
|
and (
|
||||||
int( gettimeofday() ) -
|
int( ::gettimeofday() ) -
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
->getShadingStatusTimestamp ) > (
|
->getShadingStatusTimestamp ) > (
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
@ -423,7 +424,7 @@ sub ShadingProcessing {
|
|||||||
'in');
|
'in');
|
||||||
}
|
}
|
||||||
|
|
||||||
Log3( $name, 4,
|
::Log3( $name, 4,
|
||||||
"AutoShuttersControl ($name) - Shading Processing, Rollladen: "
|
"AutoShuttersControl ($name) - Shading Processing, Rollladen: "
|
||||||
. $shuttersDev
|
. $shuttersDev
|
||||||
. " In der In Abfrage, Shadingwert: "
|
. " In der In Abfrage, Shadingwert: "
|
||||||
@ -468,22 +469,18 @@ sub ShadingProcessing {
|
|||||||
|| $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq
|
|| $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq
|
||||||
$homemode )
|
$homemode )
|
||||||
&& (
|
&& (
|
||||||
$getModeUp eq 'always'
|
$getModeUp eq 'always'
|
||||||
|| $getModeUp eq
|
|| $getModeUp eq $homemode
|
||||||
$homemode
|
|
||||||
|| $getModeUp eq 'off'
|
|| $getModeUp eq 'off'
|
||||||
|| $getModeUp eq
|
|| $getModeUp eq 'absent'
|
||||||
'absent'
|
|| $getModeUp eq 'gone'
|
||||||
|| $getModeUp eq
|
|| ( $getModeUp eq 'home'
|
||||||
'gone'
|
|
||||||
|| ( $getModeUp eq
|
|
||||||
'home'
|
|
||||||
&& $homemode ne 'asleep' )
|
&& $homemode ne 'asleep' )
|
||||||
)
|
)
|
||||||
&& (
|
&& (
|
||||||
(
|
(
|
||||||
(
|
(
|
||||||
int( gettimeofday() ) -
|
int( ::gettimeofday() ) -
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
->getShadingStatusTimestamp
|
->getShadingStatusTimestamp
|
||||||
) < 2
|
) < 2
|
||||||
@ -497,18 +494,18 @@ sub ShadingProcessing {
|
|||||||
)
|
)
|
||||||
&& $FHEM::Automation::ShuttersControl::shutters->getIfInShading
|
&& $FHEM::Automation::ShuttersControl::shutters->getIfInShading
|
||||||
)
|
)
|
||||||
|| ( !$FHEM::Automation::ShuttersControl::shutters->getIfInShading
|
|| ( !$FHEM::Automation::ShuttersControl::shutters->getIfInShading
|
||||||
&& $FHEM::Automation::ShuttersControl::shutters->getStatus ==
|
&& $FHEM::Automation::ShuttersControl::shutters->getStatus ==
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getShadingPos
|
$FHEM::Automation::ShuttersControl::shutters->getShadingPos )
|
||||||
)
|
|| ( !$FHEM::Automation::ShuttersControl::shutters
|
||||||
|| ( !$FHEM::Automation::ShuttersControl::shutters->getShadingBetweenTheTimeSuspend
|
->getShadingBetweenTheTimeSuspend
|
||||||
&& $FHEM::Automation::ShuttersControl::shutters->getStatus !=
|
&& $FHEM::Automation::ShuttersControl::shutters->getStatus !=
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getShadingPos )
|
$FHEM::Automation::ShuttersControl::shutters->getShadingPos )
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
readingsBeginUpdate($shuttersDevHash);
|
::readingsBeginUpdate($shuttersDevHash);
|
||||||
readingsBulkUpdate(
|
::readingsBulkUpdate(
|
||||||
$shuttersDevHash,
|
$shuttersDevHash,
|
||||||
'ASC_ShadingMessage',
|
'ASC_ShadingMessage',
|
||||||
'INFO: current shading status is \''
|
'INFO: current shading status is \''
|
||||||
@ -531,7 +528,7 @@ sub ShadingProcessing {
|
|||||||
) / 60
|
) / 60
|
||||||
. 'm'
|
. 'm'
|
||||||
);
|
);
|
||||||
readingsEndUpdate( $shuttersDevHash, 1 );
|
::readingsEndUpdate( $shuttersDevHash, 1 );
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -551,19 +548,28 @@ sub ShadingProcessingDriveCommand {
|
|||||||
$FHEM::Automation::ShuttersControl::shutters->setShadingStatus(
|
$FHEM::Automation::ShuttersControl::shutters->setShadingStatus(
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getShadingStatus );
|
$FHEM::Automation::ShuttersControl::shutters->getShadingStatus );
|
||||||
|
|
||||||
if ( IsInTime($FHEM::Automation::ShuttersControl::shutters->getShadingBetweenTheTime)
|
if (
|
||||||
&& $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq 'in'
|
IsInTime(
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
|
->getShadingBetweenTheTime
|
||||||
|
)
|
||||||
|
&& $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq
|
||||||
|
'in'
|
||||||
&& $getShadingPos != $getStatus
|
&& $getShadingPos != $getStatus
|
||||||
&& ( $getStatus != $FHEM::Automation::ShuttersControl::shutters->getClosedPos
|
&& (
|
||||||
|| ( $getStatus == $FHEM::Automation::ShuttersControl::shutters->getClosedPos
|
$getStatus !=
|
||||||
&& $marker
|
$FHEM::Automation::ShuttersControl::shutters->getClosedPos
|
||||||
)
|
|| ( $getStatus ==
|
||||||
)
|
$FHEM::Automation::ShuttersControl::shutters->getClosedPos
|
||||||
&& ( $getStatus != $FHEM::Automation::ShuttersControl::shutters->getSleepPos
|
&& $marker )
|
||||||
|| ( $getStatus == $FHEM::Automation::ShuttersControl::shutters->getSleepPos
|
)
|
||||||
&& $marker
|
&& (
|
||||||
)
|
$getStatus !=
|
||||||
)
|
$FHEM::Automation::ShuttersControl::shutters->getSleepPos
|
||||||
|
|| ( $getStatus ==
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->getSleepPos
|
||||||
|
&& $marker )
|
||||||
|
)
|
||||||
&& (
|
&& (
|
||||||
FHEM::Automation::ShuttersControl::CheckIfShuttersWindowRecOpen(
|
FHEM::Automation::ShuttersControl::CheckIfShuttersWindowRecOpen(
|
||||||
$shuttersDev) != 2
|
$shuttersDev) != 2
|
||||||
@ -602,10 +608,10 @@ sub ShadingProcessingDriveCommand {
|
|||||||
(
|
(
|
||||||
(
|
(
|
||||||
$getShadingPos ==
|
$getShadingPos ==
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getLastPos
|
$FHEM::Automation::ShuttersControl::shutters->getLastPos
|
||||||
|| $getShadingPos ==
|
|| $getShadingPos ==
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
->getShadingLastPos
|
->getShadingLastPos
|
||||||
)
|
)
|
||||||
? $FHEM::Automation::ShuttersControl::shutters->getOpenPos
|
? $FHEM::Automation::ShuttersControl::shutters->getOpenPos
|
||||||
: (
|
: (
|
||||||
@ -626,8 +632,10 @@ sub ShadingProcessingDriveCommand {
|
|||||||
: $FHEM::Automation::ShuttersControl::shutters->getOpenPos
|
: $FHEM::Automation::ShuttersControl::shutters->getOpenPos
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
) if ( $FHEM::Automation::ShuttersControl::shutters->getIsDay
|
)
|
||||||
|| $FHEM::Automation::ShuttersControl::shutters->getShuttersPlace eq 'awning' );
|
if ( $FHEM::Automation::ShuttersControl::shutters->getIsDay
|
||||||
|
|| $FHEM::Automation::ShuttersControl::shutters->getShuttersPlace
|
||||||
|
eq 'awning' );
|
||||||
|
|
||||||
FHEM::Automation::ShuttersControl::ASC_Debug(
|
FHEM::Automation::ShuttersControl::ASC_Debug(
|
||||||
'ShadingProcessingDriveCommand: '
|
'ShadingProcessingDriveCommand: '
|
||||||
@ -639,7 +647,7 @@ sub ShadingProcessingDriveCommand {
|
|||||||
. ' zum beenden der Beschattung gefahren' );
|
. ' zum beenden der Beschattung gefahren' );
|
||||||
}
|
}
|
||||||
|
|
||||||
Log3( $name, 4,
|
::Log3( $name, 4,
|
||||||
"AutoShuttersControl ($name) - Shading Processing - In der Routine zum fahren der Rollläden, Shading Wert: "
|
"AutoShuttersControl ($name) - Shading Processing - In der Routine zum fahren der Rollläden, Shading Wert: "
|
||||||
. $FHEM::Automation::ShuttersControl::shutters->getShadingStatus );
|
. $FHEM::Automation::ShuttersControl::shutters->getShadingStatus );
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
###############################################################################
|
###############################################################################
|
||||||
#
|
#
|
||||||
# Developed with Kate
|
# Developed with VSCodium and richterger perl plugin
|
||||||
#
|
#
|
||||||
# (c) 2018-2021 Copyright: Marko Oldenburg (fhemdevelopment@cooltux.net)
|
# (c) 2018-2025 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net)
|
||||||
# All rights reserved
|
# All rights reserved
|
||||||
#
|
#
|
||||||
# Special thanks goes to:
|
# Special thanks goes to:
|
||||||
@ -45,18 +45,18 @@
|
|||||||
|
|
||||||
package FHEM::Automation::ShuttersControl::Shutters;
|
package FHEM::Automation::ShuttersControl::Shutters;
|
||||||
|
|
||||||
use FHEM::Automation::ShuttersControl::Shutters::Readings;
|
|
||||||
use FHEM::Automation::ShuttersControl::Shutters::Attr;
|
|
||||||
use FHEM::Automation::ShuttersControl::Roommate;
|
|
||||||
use FHEM::Automation::ShuttersControl::Window;
|
|
||||||
|
|
||||||
our @ISA =
|
|
||||||
qw(FHEM::Automation::ShuttersControl::Shutters::Readings FHEM::Automation::ShuttersControl::Shutters::Attr FHEM::Automation::ShuttersControl::Roommate FHEM::Automation::ShuttersControl::Window);
|
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use utf8;
|
use utf8;
|
||||||
|
|
||||||
|
use FHEM::Automation::ShuttersControl::Shutters::Readings;
|
||||||
|
use FHEM::Automation::ShuttersControl::Shutters::Attr;
|
||||||
|
use FHEM::Automation::ShuttersControl::Roommate qw (:ALL);
|
||||||
|
use FHEM::Automation::ShuttersControl::Window;
|
||||||
|
|
||||||
|
use base
|
||||||
|
qw(FHEM::Automation::ShuttersControl::Shutters::Readings FHEM::Automation::ShuttersControl::Shutters::Attr FHEM::Automation::ShuttersControl::Roommate FHEM::Automation::ShuttersControl::Window);
|
||||||
|
|
||||||
sub new {
|
sub new {
|
||||||
my $class = shift;
|
my $class = shift;
|
||||||
my $self = {
|
my $self = {
|
||||||
@ -161,9 +161,6 @@ sub setDriveCmd {
|
|||||||
$FHEM::Automation::ShuttersControl::shutters->setDelayCmd($posValue);
|
$FHEM::Automation::ShuttersControl::shutters->setDelayCmd($posValue);
|
||||||
$FHEM::Automation::ShuttersControl::ascDev->setDelayCmdReading;
|
$FHEM::Automation::ShuttersControl::ascDev->setDelayCmdReading;
|
||||||
$FHEM::Automation::ShuttersControl::shutters->setNoDelay(0);
|
$FHEM::Automation::ShuttersControl::shutters->setNoDelay(0);
|
||||||
$FHEM::Automation::ShuttersControl::shutters->setExternalTriggerStatus(0)
|
|
||||||
if ( $FHEM::Automation::ShuttersControl::shutters
|
|
||||||
->getExternalTriggerStatus );
|
|
||||||
|
|
||||||
FHEM::Automation::ShuttersControl::ASC_Debug( 'setDriveCmd: '
|
FHEM::Automation::ShuttersControl::ASC_Debug( 'setDriveCmd: '
|
||||||
. $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
|
. $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
|
||||||
@ -177,7 +174,8 @@ sub setDriveCmd {
|
|||||||
if ( $FHEM::Automation::ShuttersControl::shutters->getDelayCmd ne
|
if ( $FHEM::Automation::ShuttersControl::shutters->getDelayCmd ne
|
||||||
'none' )
|
'none' )
|
||||||
; # setzt den Wert auf none da der Rolladen nun gesteuert werden kann.
|
; # setzt den Wert auf none da der Rolladen nun gesteuert werden kann.
|
||||||
$FHEM::Automation::ShuttersControl::shutters->setExternalTriggerStatus(0)
|
$FHEM::Automation::ShuttersControl::shutters->setExternalTriggerStatus(
|
||||||
|
0)
|
||||||
if ( $FHEM::Automation::ShuttersControl::shutters
|
if ( $FHEM::Automation::ShuttersControl::shutters
|
||||||
->getExternalTriggerStatus );
|
->getExternalTriggerStatus );
|
||||||
|
|
||||||
@ -233,7 +231,7 @@ sub setDriveCmd {
|
|||||||
::gettimeofday() +
|
::gettimeofday() +
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
->getSelfDefenseAbsentDelay,
|
->getSelfDefenseAbsentDelay,
|
||||||
\&FHEM::Automation::ShuttersControl::_SetCmdFn, \%h
|
\&FHEM::Automation::ShuttersControl::SetCmdFn, \%h
|
||||||
);
|
);
|
||||||
$FHEM::Automation::ShuttersControl::shutters->setSelfDefenseAbsent(
|
$FHEM::Automation::ShuttersControl::shutters->setSelfDefenseAbsent(
|
||||||
1, 0, \%h );
|
1, 0, \%h );
|
||||||
@ -247,7 +245,7 @@ sub setDriveCmd {
|
|||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
->getDelayStart
|
->getDelayStart
|
||||||
),
|
),
|
||||||
\&FHEM::Automation::ShuttersControl::_SetCmdFn,
|
\&FHEM::Automation::ShuttersControl::SetCmdFn,
|
||||||
\%h
|
\%h
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -258,7 +256,7 @@ sub setDriveCmd {
|
|||||||
elsif ($offSetStart < 1
|
elsif ($offSetStart < 1
|
||||||
|| $FHEM::Automation::ShuttersControl::shutters->getNoDelay )
|
|| $FHEM::Automation::ShuttersControl::shutters->getNoDelay )
|
||||||
{
|
{
|
||||||
FHEM::Automation::ShuttersControl::_SetCmdFn( \%h );
|
FHEM::Automation::ShuttersControl::SetCmdFn( \%h );
|
||||||
FHEM::Automation::ShuttersControl::ASC_Debug( 'FnSetDriveCmd: '
|
FHEM::Automation::ShuttersControl::ASC_Debug( 'FnSetDriveCmd: '
|
||||||
. $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
|
. $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
|
||||||
. ' - NICHT versetztes fahren' );
|
. ' - NICHT versetztes fahren' );
|
||||||
@ -346,8 +344,7 @@ sub setLastDriveReading {
|
|||||||
);
|
);
|
||||||
|
|
||||||
::InternalTimer( ::gettimeofday() + 0.1,
|
::InternalTimer( ::gettimeofday() + 0.1,
|
||||||
\&FHEM::Automation::ShuttersControl::_setShuttersLastDriveDelayed,
|
\&FHEM::Automation::ShuttersControl::setShuttersLastDriveDelayed, \%h );
|
||||||
\%h );
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -460,7 +457,8 @@ sub setRainUnprotectionDelayObj {
|
|||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $value = shift;
|
my $value = shift;
|
||||||
|
|
||||||
$self->{ $self->{shuttersDev} }->{RainProtection}->{UNPROTECTIONDELAYOBJVAL} = $value
|
$self->{ $self->{shuttersDev} }->{RainProtection}->{UNPROTECTIONDELAYOBJVAL}
|
||||||
|
= $value
|
||||||
if ( defined($value) );
|
if ( defined($value) );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -545,12 +543,13 @@ sub getAttrUpdateChanges {
|
|||||||
sub getIsDay {
|
sub getIsDay {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return FHEM::Automation::ShuttersControl::Helper::_IsDay( $self->{shuttersDev} );
|
return FHEM::Automation::ShuttersControl::Helper::_IsDay(
|
||||||
|
$self->{shuttersDev} );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getAntiFreezeStatus {
|
sub getAntiFreezeStatus {
|
||||||
use POSIX qw(strftime);
|
use POSIX qw(strftime);
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $daytime = strftime( "%P", localtime() );
|
my $daytime = strftime( "%P", localtime() );
|
||||||
$daytime = (
|
$daytime = (
|
||||||
defined($daytime) && $daytime
|
defined($daytime) && $daytime
|
||||||
@ -595,7 +594,7 @@ sub getShuttersPosCmdValueNegate {
|
|||||||
sub getQueryShuttersPos
|
sub getQueryShuttersPos
|
||||||
{ # Es wird geschaut ob die aktuelle Position des Rollos unterhalb der Zielposition ist
|
{ # Es wird geschaut ob die aktuelle Position des Rollos unterhalb der Zielposition ist
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $posValue = shift; # wenn dem so ist wird 1 zurück gegeben ansonsten 0
|
my $posValue = shift; # wenn dem so ist wird 1 zurück gegeben ansonsten 0
|
||||||
|
|
||||||
return (
|
return (
|
||||||
$FHEM::Automation::ShuttersControl::shutters
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
@ -756,10 +755,12 @@ sub getRainUnprotectionDelayObj {
|
|||||||
(
|
(
|
||||||
defined( $self->{ $self->{shuttersDev} }->{RainProtection} )
|
defined( $self->{ $self->{shuttersDev} }->{RainProtection} )
|
||||||
&& defined(
|
&& defined(
|
||||||
$self->{ $self->{shuttersDev} }->{RainProtection}->{UNPROTECTIONDELAYOBJVAL}
|
$self->{ $self->{shuttersDev} }->{RainProtection}
|
||||||
|
->{UNPROTECTIONDELAYOBJVAL}
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
? $self->{ $self->{shuttersDev} }->{RainProtection}->{UNPROTECTIONDELAYOBJVAL}
|
? $self->{ $self->{shuttersDev} }->{RainProtection}
|
||||||
|
->{UNPROTECTIONDELAYOBJVAL}
|
||||||
: 'none'
|
: 'none'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -821,7 +822,7 @@ sub getRoommatesStatus {
|
|||||||
$FHEM::Automation::ShuttersControl::shutters->setRoommate($ro);
|
$FHEM::Automation::ShuttersControl::shutters->setRoommate($ro);
|
||||||
my $currentPrio =
|
my $currentPrio =
|
||||||
$statePrio{ $FHEM::Automation::ShuttersControl::shutters
|
$statePrio{ $FHEM::Automation::ShuttersControl::shutters
|
||||||
->_getRoommateStatus };
|
->getRoommateStatus };
|
||||||
$minPrio = $currentPrio if ( $minPrio > $currentPrio );
|
$minPrio = $currentPrio if ( $minPrio > $currentPrio );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -854,7 +855,7 @@ sub getRoommatesLastStatus {
|
|||||||
$FHEM::Automation::ShuttersControl::shutters->setRoommate($ro);
|
$FHEM::Automation::ShuttersControl::shutters->setRoommate($ro);
|
||||||
my $currentPrio =
|
my $currentPrio =
|
||||||
$statePrio{ $FHEM::Automation::ShuttersControl::shutters
|
$statePrio{ $FHEM::Automation::ShuttersControl::shutters
|
||||||
->_getRoommateLastStatus };
|
->getRoommateLastStatus };
|
||||||
$minPrio = $currentPrio if ( $minPrio > $currentPrio );
|
$minPrio = $currentPrio if ( $minPrio > $currentPrio );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -884,7 +885,7 @@ sub getIdleDetection {
|
|||||||
### Begin Beschattung Objekt mit Daten befüllen
|
### Begin Beschattung Objekt mit Daten befüllen
|
||||||
sub setShadingStatus {
|
sub setShadingStatus {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $value = shift; ### Werte für value = in, out, in reserved, out reserved
|
my $value = shift; ### Werte für value = in, out, in reserved, out reserved
|
||||||
|
|
||||||
# Es wird durch das return die ShadingWaitingTime nicht mehr beachtet, Bugmeldung von Bernd Griemsmann
|
# Es wird durch das return die ShadingWaitingTime nicht mehr beachtet, Bugmeldung von Bernd Griemsmann
|
||||||
# return
|
# return
|
||||||
@ -899,7 +900,8 @@ sub setShadingStatus {
|
|||||||
|
|
||||||
$self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} = $value
|
$self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} = $value
|
||||||
if ( defined($value) );
|
if ( defined($value) );
|
||||||
$self->{ $self->{shuttersDev} }{ShadingStatus}{TIME} = int( ::gettimeofday() )
|
$self->{ $self->{shuttersDev} }{ShadingStatus}{TIME} =
|
||||||
|
int( ::gettimeofday() )
|
||||||
if ( defined( $self->{ $self->{shuttersDev} }{ShadingStatus} ) );
|
if ( defined( $self->{ $self->{shuttersDev} }{ShadingStatus} ) );
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@ -945,7 +947,7 @@ sub setShadingLastPos {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setShadingBetweenTheTimeSuspend { # Werte für value = 0, 1
|
sub setShadingBetweenTheTimeSuspend { # Werte für value = 0, 1
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $value = shift;
|
my $value = shift;
|
||||||
|
|
||||||
@ -996,7 +998,7 @@ sub getBrightnessAverage {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getShadingStatus { # Werte für value = in, out, in reserved, out reserved
|
sub getShadingStatus { # Werte für value = in, out, in reserved, out reserved
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@ -1007,12 +1009,16 @@ sub getShadingStatus { # Werte für value = in, out, in reserved, out reserved
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getShadingBetweenTheTimeSuspend { # Werte für value = 0, 1
|
sub getShadingBetweenTheTimeSuspend { # Werte für value = 0, 1
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
defined( $self->{ $self->{shuttersDev} }{ShadingBetweenTheTimeSuspend} )
|
defined(
|
||||||
&& defined( $self->{ $self->{shuttersDev} }{ShadingBetweenTheTimeSuspend}{VAL} )
|
$self->{ $self->{shuttersDev} }{ShadingBetweenTheTimeSuspend}
|
||||||
|
)
|
||||||
|
&& defined(
|
||||||
|
$self->{ $self->{shuttersDev} }{ShadingBetweenTheTimeSuspend}{VAL}
|
||||||
|
)
|
||||||
? $self->{ $self->{shuttersDev} }{ShadingBetweenTheTimeSuspend}{VAL}
|
? $self->{ $self->{shuttersDev} }{ShadingBetweenTheTimeSuspend}{VAL}
|
||||||
: 0
|
: 0
|
||||||
);
|
);
|
||||||
@ -1084,9 +1090,7 @@ sub getShadingLastPos {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
defined( $self->{ $self->{shuttersDev} }{ShadingLastPos} )
|
defined( $self->{ $self->{shuttersDev} }{ShadingLastPos} )
|
||||||
&& defined(
|
&& defined( $self->{ $self->{shuttersDev} }{ShadingLastPos}{VAL} )
|
||||||
$self->{ $self->{shuttersDev} }{ShadingLastPos}{VAL}
|
|
||||||
)
|
|
||||||
? $self->{ $self->{shuttersDev} }{ShadingLastPos}{VAL}
|
? $self->{ $self->{shuttersDev} }{ShadingLastPos}{VAL}
|
||||||
: $FHEM::Automation::ShuttersControl::shutters->getShadingPos
|
: $FHEM::Automation::ShuttersControl::shutters->getShadingPos
|
||||||
);
|
);
|
||||||
@ -1094,7 +1098,4 @@ sub getShadingLastPos {
|
|||||||
|
|
||||||
### Ende Beschattung
|
### Ende Beschattung
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
###############################################################################
|
###############################################################################
|
||||||
#
|
#
|
||||||
# Developed with Kate
|
# Developed with VSCodium and richterger perl plugin
|
||||||
#
|
#
|
||||||
# (c) 2018-2021 Copyright: Marko Oldenburg (fhemdevelopment@cooltux.net)
|
# (c) 2018-2025 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net)
|
||||||
# All rights reserved
|
# All rights reserved
|
||||||
#
|
#
|
||||||
# Special thanks goes to:
|
# Special thanks goes to:
|
||||||
@ -46,24 +46,12 @@ use utf8;
|
|||||||
|
|
||||||
use FHEM::Automation::ShuttersControl::Helper qw (IsAdv PerlCodeCheck);
|
use FHEM::Automation::ShuttersControl::Helper qw (IsAdv PerlCodeCheck);
|
||||||
|
|
||||||
use GPUtils qw(GP_Import);
|
|
||||||
|
|
||||||
## Import der FHEM Funktionen
|
|
||||||
BEGIN {
|
|
||||||
GP_Import(
|
|
||||||
qw(
|
|
||||||
AttrVal
|
|
||||||
CommandAttr
|
|
||||||
gettimeofday)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub _setAttributs {
|
sub _setAttributs {
|
||||||
my $shuttersDev = shift;
|
my $shuttersDev = shift;
|
||||||
my $attr = shift;
|
my $attr = shift;
|
||||||
my $attrVal = shift;
|
my $attrVal = shift;
|
||||||
|
|
||||||
CommandAttr( undef, $shuttersDev . ' ' . $attr . ' ' . $attrVal );
|
::CommandAttr( undef, $shuttersDev . ' ' . $attr . ' ' . $attrVal );
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -77,28 +65,28 @@ sub _getPosition {
|
|||||||
return $self->{ $self->{shuttersDev} }->{$attr}->{position}
|
return $self->{ $self->{shuttersDev} }->{$attr}->{position}
|
||||||
if (
|
if (
|
||||||
exists( $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} )
|
exists( $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} )
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} ) < 2
|
$self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} ) < 2
|
||||||
);
|
);
|
||||||
$self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} =
|
$self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} =
|
||||||
int( gettimeofday() );
|
int( ::gettimeofday() );
|
||||||
|
|
||||||
my $position;
|
my $position;
|
||||||
my $posAssignment;
|
my $posAssignment;
|
||||||
|
|
||||||
if (
|
if (
|
||||||
AttrVal( $self->{shuttersDev}, $attr,
|
::AttrVal( $self->{shuttersDev}, $attr,
|
||||||
$FHEM::Automation::ShuttersControl::userAttrList{$userAttrList}
|
$FHEM::Automation::ShuttersControl::userAttrList{$userAttrList}
|
||||||
[ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] ) =~
|
[ ::AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] ) =~
|
||||||
m{\A\{.+\}\z}xms
|
m{\A\{.+\}\z}xms
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
my $response = PerlCodeCheck(
|
my $response = PerlCodeCheck(
|
||||||
AttrVal(
|
::AttrVal(
|
||||||
$self->{shuttersDev},
|
$self->{shuttersDev},
|
||||||
$attr,
|
$attr,
|
||||||
$FHEM::Automation::ShuttersControl::userAttrList{$userAttrList}
|
$FHEM::Automation::ShuttersControl::userAttrList{$userAttrList}
|
||||||
[ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ]
|
[ ::AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ]
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -108,14 +96,14 @@ sub _getPosition {
|
|||||||
$position =~ m{\A\d+(\.\d+)?\z}xms
|
$position =~ m{\A\d+(\.\d+)?\z}xms
|
||||||
? $position
|
? $position
|
||||||
: $FHEM::Automation::ShuttersControl::userAttrList{$userAttrList}
|
: $FHEM::Automation::ShuttersControl::userAttrList{$userAttrList}
|
||||||
[ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ]
|
[ ::AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ]
|
||||||
);
|
);
|
||||||
|
|
||||||
$posAssignment = (
|
$posAssignment = (
|
||||||
defined($posAssignment)
|
defined($posAssignment)
|
||||||
&& $posAssignment =~ m{\A\d+(\.\d+)?\z}xms
|
&& $posAssignment =~ m{\A\d+(\.\d+)?\z}xms
|
||||||
? $posAssignment
|
? $posAssignment
|
||||||
: 'none'
|
: 'none'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -124,7 +112,7 @@ sub _getPosition {
|
|||||||
$self->{shuttersDev},
|
$self->{shuttersDev},
|
||||||
$attr,
|
$attr,
|
||||||
$FHEM::Automation::ShuttersControl::userAttrList{$userAttrList}
|
$FHEM::Automation::ShuttersControl::userAttrList{$userAttrList}
|
||||||
[ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ]
|
[ ::AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -145,8 +133,7 @@ sub _getPosition {
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
$self->{ $self->{shuttersDev} }->{$attr}->{position} =
|
$self->{ $self->{shuttersDev} }->{$attr}->{position} =
|
||||||
PerlCodeCheck(
|
PerlCodeCheck( $self->{ $self->{shuttersDev} }->{$attr}->{position} );
|
||||||
$self->{ $self->{shuttersDev} }->{$attr}->{position} );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@ -154,7 +141,7 @@ sub _getPosition {
|
|||||||
m{^\d+(\.\d+)?$}xms
|
m{^\d+(\.\d+)?$}xms
|
||||||
? $self->{ $self->{shuttersDev} }->{$attr}->{position}
|
? $self->{ $self->{shuttersDev} }->{$attr}->{position}
|
||||||
: $FHEM::Automation::ShuttersControl::userAttrList{$userAttrList}
|
: $FHEM::Automation::ShuttersControl::userAttrList{$userAttrList}
|
||||||
[ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ]
|
[ ::AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -167,7 +154,7 @@ sub _getPositionAssignment {
|
|||||||
return $self->{ $self->{shuttersDev} }->{$attr}->{posAssignment}
|
return $self->{ $self->{shuttersDev} }->{$attr}->{posAssignment}
|
||||||
if (
|
if (
|
||||||
exists( $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} )
|
exists( $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} )
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} ) < 2
|
$self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} ) < 2
|
||||||
);
|
);
|
||||||
$FHEM::Automation::ShuttersControl::shutters->$getFn;
|
$FHEM::Automation::ShuttersControl::shutters->$getFn;
|
||||||
@ -213,7 +200,7 @@ sub setShuttersPlace {
|
|||||||
sub getShuttersPlace {
|
sub getShuttersPlace {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_ShuttersPlace', 'window' );
|
return ::AttrVal( $self->{shuttersDev}, 'ASC_ShuttersPlace', 'window' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setSlatPosCmd {
|
sub setSlatPosCmd {
|
||||||
@ -236,15 +223,15 @@ sub getSlatPosCmd {
|
|||||||
$self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
|
$self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
|
||||||
->{LASTGETTIME}
|
->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
|
$self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
|
||||||
->{LASTGETTIME} ) < 2
|
->{LASTGETTIME} ) < 2
|
||||||
);
|
);
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}->{LASTGETTIME}
|
$self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}->{LASTGETTIME}
|
||||||
= int( gettimeofday() );
|
= int( ::gettimeofday() );
|
||||||
my ( $slatPosCmd, $slatDevice ) =
|
my ( $slatPosCmd, $slatDevice ) =
|
||||||
FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
|
FHEM::Automation::ShuttersControl::Helper::GetAttrValues(
|
||||||
'ASC_SlatPosCmd_SlatDevice', 'none:none' );
|
$self->{shuttersDev}, 'ASC_SlatPosCmd_SlatDevice', 'none:none' );
|
||||||
|
|
||||||
## Erwartetes Ergebnis
|
## Erwartetes Ergebnis
|
||||||
# upTime:upBrightnessVal
|
# upTime:upBrightnessVal
|
||||||
@ -268,7 +255,7 @@ sub getSlatDevice {
|
|||||||
$self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
|
$self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
|
||||||
->{LASTGETTIME}
|
->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
|
$self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
|
||||||
->{LASTGETTIME} ) < 2
|
->{LASTGETTIME} ) < 2
|
||||||
);
|
);
|
||||||
@ -299,15 +286,15 @@ sub getPrivacyUpTime {
|
|||||||
$self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
|
$self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
|
||||||
->{LASTGETTIME}
|
->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
|
$self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
|
||||||
->{LASTGETTIME} ) < 2
|
->{LASTGETTIME} ) < 2
|
||||||
);
|
);
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
|
$self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
|
||||||
->{LASTGETTIME} = int( gettimeofday() );
|
->{LASTGETTIME} = int( ::gettimeofday() );
|
||||||
my ( $upTime, $upBrightnessVal ) =
|
my ( $upTime, $upBrightnessVal ) =
|
||||||
FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
|
FHEM::Automation::ShuttersControl::Helper::GetAttrValues(
|
||||||
'ASC_PrivacyUpValue_beforeDayOpen', '-1:-1' );
|
$self->{shuttersDev}, 'ASC_PrivacyUpValue_beforeDayOpen', '-1:-1' );
|
||||||
|
|
||||||
## Erwartetes Ergebnis
|
## Erwartetes Ergebnis
|
||||||
# upTime:upBrightnessVal
|
# upTime:upBrightnessVal
|
||||||
@ -341,7 +328,7 @@ sub getPrivacyUpBrightnessVal {
|
|||||||
$self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
|
$self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
|
||||||
->{LASTGETTIME}
|
->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
|
$self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
|
||||||
->{LASTGETTIME} ) < 2
|
->{LASTGETTIME} ) < 2
|
||||||
);
|
);
|
||||||
@ -378,14 +365,15 @@ sub getPrivacyDownTime {
|
|||||||
$self->{ $self->{shuttersDev} }
|
$self->{ $self->{shuttersDev} }
|
||||||
->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME}
|
->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }
|
$self->{ $self->{shuttersDev} }
|
||||||
->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME} ) < 2
|
->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME} ) < 2
|
||||||
);
|
);
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_PrivacyDownValue_beforeNightClose}
|
$self->{ $self->{shuttersDev} }->{ASC_PrivacyDownValue_beforeNightClose}
|
||||||
->{LASTGETTIME} = int( gettimeofday() );
|
->{LASTGETTIME} = int( ::gettimeofday() );
|
||||||
my ( $downTime, $downBrightnessVal ) =
|
my ( $downTime, $downBrightnessVal ) =
|
||||||
FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
|
FHEM::Automation::ShuttersControl::Helper::GetAttrValues(
|
||||||
|
$self->{shuttersDev},
|
||||||
'ASC_PrivacyDownValue_beforeNightClose', '-1:-1' );
|
'ASC_PrivacyDownValue_beforeNightClose', '-1:-1' );
|
||||||
|
|
||||||
## Erwartetes Ergebnis
|
## Erwartetes Ergebnis
|
||||||
@ -420,7 +408,7 @@ sub getPrivacyDownBrightnessVal {
|
|||||||
$self->{ $self->{shuttersDev} }
|
$self->{ $self->{shuttersDev} }
|
||||||
->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME}
|
->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }
|
$self->{ $self->{shuttersDev} }
|
||||||
->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME} ) < 2
|
->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME} ) < 2
|
||||||
);
|
);
|
||||||
@ -497,7 +485,7 @@ sub setSelfDefenseMode {
|
|||||||
sub getSelfDefenseMode {
|
sub getSelfDefenseMode {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_Self_Defense_Mode', 'gone' );
|
return ::AttrVal( $self->{shuttersDev}, 'ASC_Self_Defense_Mode', 'gone' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setSelfDefenseAbsentDelay {
|
sub setSelfDefenseAbsentDelay {
|
||||||
@ -513,7 +501,14 @@ sub setSelfDefenseAbsentDelay {
|
|||||||
sub getSelfDefenseAbsentDelay {
|
sub getSelfDefenseAbsentDelay {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_Self_Defense_AbsentDelay', 300 );
|
return ::AttrVal( $self->{shuttersDev}, 'ASC_Self_Defense_AbsentDelay',
|
||||||
|
300 );
|
||||||
|
}
|
||||||
|
|
||||||
|
sub getCommandTemplate {
|
||||||
|
my $self = shift;
|
||||||
|
|
||||||
|
return ::AttrVal( $self->{shuttersDev}, 'ASC_CommandTemplate', 'none' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setWiggleValue {
|
sub setWiggleValue {
|
||||||
@ -528,7 +523,7 @@ sub setWiggleValue {
|
|||||||
sub getWiggleValue {
|
sub getWiggleValue {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_WiggleValue', 5 );
|
return ::AttrVal( $self->{shuttersDev}, 'ASC_WiggleValue', 5 );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setAdv {
|
sub setAdv {
|
||||||
@ -544,7 +539,7 @@ sub getAdv {
|
|||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
AttrVal( $self->{shuttersDev}, 'ASC_Adv', 'off' ) eq 'on'
|
::AttrVal( $self->{shuttersDev}, 'ASC_Adv', 'off' ) eq 'on'
|
||||||
? ( IsAdv == 1 ? 1 : 0 )
|
? ( IsAdv == 1 ? 1 : 0 )
|
||||||
: 0
|
: 0
|
||||||
);
|
);
|
||||||
@ -587,7 +582,7 @@ sub setShadingMode {
|
|||||||
sub getShadingMode {
|
sub getShadingMode {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_Shading_Mode', 'off' );
|
return ::AttrVal( $self->{shuttersDev}, 'ASC_Shading_Mode', 'off' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub _getTempSensor {
|
sub _getTempSensor {
|
||||||
@ -598,15 +593,15 @@ sub _getTempSensor {
|
|||||||
exists(
|
exists(
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME}
|
$self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} )
|
$self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} )
|
||||||
< 2
|
< 2
|
||||||
);
|
);
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} =
|
$self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} =
|
||||||
int( gettimeofday() );
|
int( ::gettimeofday() );
|
||||||
my ( $device, $reading ) =
|
my ( $device, $reading ) =
|
||||||
FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
|
FHEM::Automation::ShuttersControl::Helper::GetAttrValues(
|
||||||
'ASC_TempSensor', 'none' );
|
$self->{shuttersDev}, 'ASC_TempSensor', 'none' );
|
||||||
|
|
||||||
### erwartetes Ergebnis
|
### erwartetes Ergebnis
|
||||||
# DEVICE:READING
|
# DEVICE:READING
|
||||||
@ -625,7 +620,7 @@ sub getTempSensorReading {
|
|||||||
exists(
|
exists(
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME}
|
$self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} )
|
$self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} )
|
||||||
< 2
|
< 2
|
||||||
);
|
);
|
||||||
@ -658,15 +653,15 @@ sub _getIdleDetectionReading {
|
|||||||
$self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
|
$self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
|
||||||
->{LASTGETTIME}
|
->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
|
$self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
|
||||||
->{LASTGETTIME} ) < 2
|
->{LASTGETTIME} ) < 2
|
||||||
);
|
);
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}->{LASTGETTIME}
|
$self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}->{LASTGETTIME}
|
||||||
= int( gettimeofday() );
|
= int( ::gettimeofday() );
|
||||||
my ( $reading, $value ) =
|
my ( $reading, $value ) =
|
||||||
FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
|
FHEM::Automation::ShuttersControl::Helper::GetAttrValues(
|
||||||
'ASC_Shutter_IdleDetection', 'none' );
|
$self->{shuttersDev}, 'ASC_Shutter_IdleDetection', 'none' );
|
||||||
|
|
||||||
### erwartetes Ergebnis
|
### erwartetes Ergebnis
|
||||||
# READING:VALUE
|
# READING:VALUE
|
||||||
@ -688,7 +683,7 @@ sub getIdleDetectionValue {
|
|||||||
$self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
|
$self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
|
||||||
->{LASTGETTIME}
|
->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
|
$self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
|
||||||
->{LASTGETTIME} ) < 2
|
->{LASTGETTIME} ) < 2
|
||||||
);
|
);
|
||||||
@ -722,15 +717,15 @@ sub _getBrightnessSensor {
|
|||||||
$self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
|
$self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
|
||||||
->{LASTGETTIME}
|
->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
|
$self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
|
||||||
->{LASTGETTIME} ) < 2
|
->{LASTGETTIME} ) < 2
|
||||||
);
|
);
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{LASTGETTIME} =
|
$self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{LASTGETTIME} =
|
||||||
int( gettimeofday() );
|
int( ::gettimeofday() );
|
||||||
my ( $device, $reading, $max, $min ) =
|
my ( $device, $reading, $max, $min ) =
|
||||||
FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
|
FHEM::Automation::ShuttersControl::Helper::GetAttrValues(
|
||||||
'ASC_BrightnessSensor', 'none' );
|
$self->{shuttersDev}, 'ASC_BrightnessSensor', 'none' );
|
||||||
|
|
||||||
### erwartetes Ergebnis
|
### erwartetes Ergebnis
|
||||||
# DEVICE:READING MAX:MIN
|
# DEVICE:READING MAX:MIN
|
||||||
@ -754,7 +749,7 @@ sub getBrightnessReading {
|
|||||||
$self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
|
$self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
|
||||||
->{LASTGETTIME}
|
->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
|
$self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
|
||||||
->{LASTGETTIME} ) < 2
|
->{LASTGETTIME} ) < 2
|
||||||
);
|
);
|
||||||
@ -779,7 +774,7 @@ sub getShadingAzimuthLeft {
|
|||||||
$self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
|
$self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
|
||||||
->{LASTGETTIME}
|
->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
|
$self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
|
||||||
->{LASTGETTIME} ) < 2
|
->{LASTGETTIME} ) < 2
|
||||||
);
|
);
|
||||||
@ -808,15 +803,15 @@ sub getShadingAzimuthRight {
|
|||||||
$self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
|
$self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
|
||||||
->{LASTGETTIME}
|
->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
|
$self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
|
||||||
->{LASTGETTIME} ) < 2
|
->{LASTGETTIME} ) < 2
|
||||||
);
|
);
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}->{LASTGETTIME}
|
$self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}->{LASTGETTIME}
|
||||||
= int( gettimeofday() );
|
= int( ::gettimeofday() );
|
||||||
my ( $left, $right ) =
|
my ( $left, $right ) =
|
||||||
FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
|
FHEM::Automation::ShuttersControl::Helper::GetAttrValues(
|
||||||
'ASC_Shading_InOutAzimuth', '95:265' );
|
$self->{shuttersDev}, 'ASC_Shading_InOutAzimuth', '95:265' );
|
||||||
|
|
||||||
### erwartetes Ergebnis
|
### erwartetes Ergebnis
|
||||||
# MIN:MAX
|
# MIN:MAX
|
||||||
@ -843,8 +838,8 @@ sub setShadingMinOutsideTemperature {
|
|||||||
sub getShadingMinOutsideTemperature {
|
sub getShadingMinOutsideTemperature {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_Shading_Min_OutsideTemperature',
|
return ::AttrVal( $self->{shuttersDev},
|
||||||
18 );
|
'ASC_Shading_Min_OutsideTemperature', 18 );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setShadingMinMaxElevation {
|
sub setShadingMinMaxElevation {
|
||||||
@ -867,15 +862,15 @@ sub getShadingMinElevation {
|
|||||||
$self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
|
$self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
|
||||||
->{LASTGETTIME}
|
->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
|
$self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
|
||||||
->{LASTGETTIME} ) < 2
|
->{LASTGETTIME} ) < 2
|
||||||
);
|
);
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
|
$self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
|
||||||
->{LASTGETTIME} = int( gettimeofday() );
|
->{LASTGETTIME} = int( ::gettimeofday() );
|
||||||
my ( $min, $max ) =
|
my ( $min, $max ) =
|
||||||
FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
|
FHEM::Automation::ShuttersControl::Helper::GetAttrValues(
|
||||||
'ASC_Shading_MinMax_Elevation', '25.0:100.0' );
|
$self->{shuttersDev}, 'ASC_Shading_MinMax_Elevation', '25.0:100.0' );
|
||||||
|
|
||||||
### erwartetes Ergebnis
|
### erwartetes Ergebnis
|
||||||
# MIN:MAX
|
# MIN:MAX
|
||||||
@ -899,7 +894,7 @@ sub getShadingMaxElevation {
|
|||||||
$self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
|
$self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
|
||||||
->{LASTGETTIME}
|
->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
|
$self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
|
||||||
->{LASTGETTIME} ) < 2
|
->{LASTGETTIME} ) < 2
|
||||||
);
|
);
|
||||||
@ -937,15 +932,15 @@ sub getShadingStateChangeSunny {
|
|||||||
$self->{ $self->{shuttersDev} }
|
$self->{ $self->{shuttersDev} }
|
||||||
->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME}
|
->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }
|
$self->{ $self->{shuttersDev} }
|
||||||
->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} ) < 2
|
->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} ) < 2
|
||||||
);
|
);
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_Shading_StateChange_SunnyCloudy}
|
$self->{ $self->{shuttersDev} }->{ASC_Shading_StateChange_SunnyCloudy}
|
||||||
->{LASTGETTIME} = int( gettimeofday() );
|
->{LASTGETTIME} = int( ::gettimeofday() );
|
||||||
my ( $sunny, $cloudy, $maxBrightnessAverageArrayObjects ) =
|
my ( $sunny, $cloudy, $maxBrightnessAverageArrayObjects ) =
|
||||||
FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
|
FHEM::Automation::ShuttersControl::Helper::GetAttrValues(
|
||||||
'ASC_Shading_StateChange_SunnyCloudy',
|
$self->{shuttersDev}, 'ASC_Shading_StateChange_SunnyCloudy',
|
||||||
'35000:20000' );
|
'35000:20000' );
|
||||||
|
|
||||||
### erwartetes Ergebnis
|
### erwartetes Ergebnis
|
||||||
@ -976,7 +971,7 @@ sub getShadingStateChangeCloudy {
|
|||||||
$self->{ $self->{shuttersDev} }
|
$self->{ $self->{shuttersDev} }
|
||||||
->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME}
|
->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }
|
$self->{ $self->{shuttersDev} }
|
||||||
->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} ) < 2
|
->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} ) < 2
|
||||||
);
|
);
|
||||||
@ -996,7 +991,7 @@ sub getMaxBrightnessAverageArrayObjects {
|
|||||||
$self->{ $self->{shuttersDev} }
|
$self->{ $self->{shuttersDev} }
|
||||||
->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME}
|
->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }
|
$self->{ $self->{shuttersDev} }
|
||||||
->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} ) < 2
|
->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} ) < 2
|
||||||
);
|
);
|
||||||
@ -1019,7 +1014,7 @@ sub setShadingWaitingPeriod {
|
|||||||
sub getShadingWaitingPeriod {
|
sub getShadingWaitingPeriod {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_Shading_WaitingPeriod', 1200 );
|
return ::AttrVal( $self->{shuttersDev}, 'ASC_Shading_WaitingPeriod', 1200 );
|
||||||
}
|
}
|
||||||
### Ende Beschattung
|
### Ende Beschattung
|
||||||
sub setExternalTrigger {
|
sub setExternalTrigger {
|
||||||
@ -1040,16 +1035,16 @@ sub getExternalTriggerDevice {
|
|||||||
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
|
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
|
||||||
->{LASTGETTIME}
|
->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
|
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
|
||||||
->{LASTGETTIME} ) < 2
|
->{LASTGETTIME} ) < 2
|
||||||
);
|
);
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{LASTGETTIME} =
|
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{LASTGETTIME} =
|
||||||
int( gettimeofday() );
|
int( ::gettimeofday() );
|
||||||
my ( $device, $reading, $valueActive, $valueInactive, $posActive,
|
my ( $device, $reading, $valueActive, $valueInactive, $posActive,
|
||||||
$posInactive, $valueActive2, $posActive2 )
|
$posInactive, $valueActive2, $posActive2 )
|
||||||
= FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
|
= FHEM::Automation::ShuttersControl::Helper::GetAttrValues(
|
||||||
'ASC_ExternalTrigger', 'none' );
|
$self->{shuttersDev}, 'ASC_ExternalTrigger', 'none' );
|
||||||
|
|
||||||
### erwartetes Ergebnis
|
### erwartetes Ergebnis
|
||||||
# DEVICE:READING VALUEACTIVE:VALUEINACTIVE POSACTIVE:POSINACTIVE VALUEACTIVE2:POSACTIVE2
|
# DEVICE:READING VALUEACTIVE:VALUEINACTIVE POSACTIVE:POSINACTIVE VALUEACTIVE2:POSACTIVE2
|
||||||
@ -1064,10 +1059,11 @@ sub getExternalTriggerDevice {
|
|||||||
$valueInactive;
|
$valueInactive;
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive} =
|
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive} =
|
||||||
$posActive;
|
$posActive;
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posinactive} =
|
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posinactive} = (
|
||||||
( $posInactive ne 'none'
|
$posInactive ne 'none'
|
||||||
? $posInactive
|
? $posInactive
|
||||||
: $FHEM::Automation::ShuttersControl::shutters->getLastPos );
|
: $FHEM::Automation::ShuttersControl::shutters->getLastPos
|
||||||
|
);
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{valueactive2} =
|
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{valueactive2} =
|
||||||
$valueActive2;
|
$valueActive2;
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive2} =
|
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive2} =
|
||||||
@ -1086,7 +1082,7 @@ sub getExternalTriggerReading {
|
|||||||
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
|
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
|
||||||
->{LASTGETTIME}
|
->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
|
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
|
||||||
->{LASTGETTIME} ) < 2
|
->{LASTGETTIME} ) < 2
|
||||||
);
|
);
|
||||||
@ -1104,7 +1100,7 @@ sub getExternalTriggerValueActive {
|
|||||||
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
|
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
|
||||||
->{LASTGETTIME}
|
->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
|
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
|
||||||
->{LASTGETTIME} ) < 2
|
->{LASTGETTIME} ) < 2
|
||||||
);
|
);
|
||||||
@ -1124,7 +1120,7 @@ sub getExternalTriggerValueActive2 {
|
|||||||
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
|
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
|
||||||
->{LASTGETTIME}
|
->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
|
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
|
||||||
->{LASTGETTIME} ) < 2
|
->{LASTGETTIME} ) < 2
|
||||||
);
|
);
|
||||||
@ -1144,7 +1140,7 @@ sub getExternalTriggerValueInactive {
|
|||||||
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
|
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
|
||||||
->{LASTGETTIME}
|
->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
|
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
|
||||||
->{LASTGETTIME} ) < 2
|
->{LASTGETTIME} ) < 2
|
||||||
);
|
);
|
||||||
@ -1163,7 +1159,7 @@ sub getExternalTriggerPosActive {
|
|||||||
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
|
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
|
||||||
->{LASTGETTIME}
|
->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
|
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
|
||||||
->{LASTGETTIME} ) < 2
|
->{LASTGETTIME} ) < 2
|
||||||
);
|
);
|
||||||
@ -1181,7 +1177,7 @@ sub getExternalTriggerPosActive2 {
|
|||||||
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
|
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
|
||||||
->{LASTGETTIME}
|
->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
|
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
|
||||||
->{LASTGETTIME} ) < 2
|
->{LASTGETTIME} ) < 2
|
||||||
);
|
);
|
||||||
@ -1199,7 +1195,7 @@ sub getExternalTriggerPosInactive {
|
|||||||
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
|
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
|
||||||
->{LASTGETTIME}
|
->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
|
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
|
||||||
->{LASTGETTIME} ) < 2
|
->{LASTGETTIME} ) < 2
|
||||||
);
|
);
|
||||||
@ -1221,7 +1217,7 @@ sub setDelay {
|
|||||||
sub getDelay {
|
sub getDelay {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
my $val = AttrVal( $self->{shuttersDev}, 'ASC_Drive_Delay', -1 );
|
my $val = ::AttrVal( $self->{shuttersDev}, 'ASC_Drive_Delay', -1 );
|
||||||
return ( $val =~ m{^\d+$}xms ? $val : -1 );
|
return ( $val =~ m{^\d+$}xms ? $val : -1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1237,7 +1233,7 @@ sub setDelayStart {
|
|||||||
sub getDelayStart {
|
sub getDelayStart {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
my $val = AttrVal( $self->{shuttersDev}, 'ASC_Drive_DelayStart', -1 );
|
my $val = ::AttrVal( $self->{shuttersDev}, 'ASC_Drive_DelayStart', -1 );
|
||||||
return ( ( $val > 0 && $val =~ m{^\d+$}xms ) ? $val : -1 );
|
return ( ( $val > 0 && $val =~ m{^\d+$}xms ) ? $val : -1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1254,7 +1250,7 @@ sub setBlockingTimeAfterManual {
|
|||||||
sub getBlockingTimeAfterManual {
|
sub getBlockingTimeAfterManual {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_afterManual',
|
return ::AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_afterManual',
|
||||||
1200 );
|
1200 );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1271,7 +1267,7 @@ sub setBlockingTimeBeforNightClose {
|
|||||||
sub getBlockingTimeBeforNightClose {
|
sub getBlockingTimeBeforNightClose {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_beforNightClose',
|
return ::AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_beforNightClose',
|
||||||
3600 );
|
3600 );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1288,7 +1284,7 @@ sub setBlockingTimeBeforDayOpen {
|
|||||||
sub getBlockingTimeBeforDayOpen {
|
sub getBlockingTimeBeforDayOpen {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_beforDayOpen',
|
return ::AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_beforDayOpen',
|
||||||
3600 );
|
3600 );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1304,9 +1300,9 @@ sub setPosCmd {
|
|||||||
sub getPosCmd {
|
sub getPosCmd {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_Pos_Reading',
|
return ::AttrVal( $self->{shuttersDev}, 'ASC_Pos_Reading',
|
||||||
$FHEM::Automation::ShuttersControl::userAttrList{'ASC_Pos_Reading'}
|
$FHEM::Automation::ShuttersControl::userAttrList{'ASC_Pos_Reading'}
|
||||||
[ AttrVal( $self->{shuttersDev}, 'ASC', 1 ) ] );
|
[ ::AttrVal( $self->{shuttersDev}, 'ASC', 1 ) ] );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setOpenPos {
|
sub setOpenPos {
|
||||||
@ -1371,7 +1367,7 @@ sub setVentilatePosAfterDayClosed {
|
|||||||
sub getVentilatePosAfterDayClosed {
|
sub getVentilatePosAfterDayClosed {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_WindowRec_PosAfterDayClosed',
|
return ::AttrVal( $self->{shuttersDev}, 'ASC_WindowRec_PosAfterDayClosed',
|
||||||
'open' );
|
'open' );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1436,7 +1432,7 @@ sub setVentilateOpen {
|
|||||||
sub getVentilateOpen {
|
sub getVentilateOpen {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_Ventilate_Window_Open', 'on' );
|
return ::AttrVal( $self->{shuttersDev}, 'ASC_Ventilate_Window_Open', 'on' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setComfortOpenPos {
|
sub setComfortOpenPos {
|
||||||
@ -1476,7 +1472,7 @@ sub setPartyMode {
|
|||||||
sub getPartyMode {
|
sub getPartyMode {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_Partymode', 'off' );
|
return ::AttrVal( $self->{shuttersDev}, 'ASC_Partymode', 'off' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setRoommates {
|
sub setRoommates {
|
||||||
@ -1491,7 +1487,7 @@ sub setRoommates {
|
|||||||
sub getRoommates {
|
sub getRoommates {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_Roommate_Device', 'none' );
|
return ::AttrVal( $self->{shuttersDev}, 'ASC_Roommate_Device', 'none' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setRoommatesReading {
|
sub setRoommatesReading {
|
||||||
@ -1506,7 +1502,7 @@ sub setRoommatesReading {
|
|||||||
sub getRoommatesReading {
|
sub getRoommatesReading {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_Roommate_Reading', 'state' );
|
return ::AttrVal( $self->{shuttersDev}, 'ASC_Roommate_Reading', 'state' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getWindPos {
|
sub getWindPos {
|
||||||
@ -1519,7 +1515,7 @@ sub getWindPos {
|
|||||||
exists(
|
exists(
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
|
$self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
|
$self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
|
||||||
) < 2
|
) < 2
|
||||||
);
|
);
|
||||||
@ -1538,15 +1534,15 @@ sub getWindMax {
|
|||||||
exists(
|
exists(
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
|
$self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
|
$self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
|
||||||
) < 2
|
) < 2
|
||||||
);
|
);
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME} =
|
$self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME} =
|
||||||
int( gettimeofday() );
|
int( ::gettimeofday() );
|
||||||
my ( $max, $hyst, $pos ) =
|
my ( $max, $hyst, $pos ) =
|
||||||
FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
|
FHEM::Automation::ShuttersControl::Helper::GetAttrValues(
|
||||||
'ASC_WindParameters', '50:20' );
|
$self->{shuttersDev}, 'ASC_WindParameters', '50:20' );
|
||||||
|
|
||||||
## Erwartetes Ergebnis
|
## Erwartetes Ergebnis
|
||||||
# max:hyst pos
|
# max:hyst pos
|
||||||
@ -1554,10 +1550,11 @@ sub getWindMax {
|
|||||||
$self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggermax} = $max;
|
$self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggermax} = $max;
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggerhyst} =
|
$self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggerhyst} =
|
||||||
( $hyst ne 'none' ? $max - $hyst : $max - 20 );
|
( $hyst ne 'none' ? $max - $hyst : $max - 20 );
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{closedPos} =
|
$self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{closedPos} = (
|
||||||
( $pos ne 'none'
|
$pos ne 'none'
|
||||||
? $pos
|
? $pos
|
||||||
: $FHEM::Automation::ShuttersControl::shutters->getOpenPos );
|
: $FHEM::Automation::ShuttersControl::shutters->getOpenPos
|
||||||
|
);
|
||||||
|
|
||||||
return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggermax};
|
return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggermax};
|
||||||
}
|
}
|
||||||
@ -1581,7 +1578,7 @@ sub getWindMin {
|
|||||||
exists(
|
exists(
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
|
$self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
|
$self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
|
||||||
) < 2
|
) < 2
|
||||||
);
|
);
|
||||||
@ -1602,7 +1599,7 @@ sub setWindProtection {
|
|||||||
sub getWindProtection {
|
sub getWindProtection {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_WindProtection', 'off' );
|
return ::AttrVal( $self->{shuttersDev}, 'ASC_WindProtection', 'off' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setRainProtection {
|
sub setRainProtection {
|
||||||
@ -1617,7 +1614,7 @@ sub setRainProtection {
|
|||||||
sub getRainProtection {
|
sub getRainProtection {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_RainProtection', 'off' );
|
return ::AttrVal( $self->{shuttersDev}, 'ASC_RainProtection', 'off' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setModeUp {
|
sub setModeUp {
|
||||||
@ -1632,7 +1629,7 @@ sub setModeUp {
|
|||||||
sub getModeUp {
|
sub getModeUp {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_Mode_Up', 'always' );
|
return ::AttrVal( $self->{shuttersDev}, 'ASC_Mode_Up', 'always' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setModeDown {
|
sub setModeDown {
|
||||||
@ -1647,7 +1644,7 @@ sub setModeDown {
|
|||||||
sub getModeDown {
|
sub getModeDown {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_Mode_Down', 'always' );
|
return ::AttrVal( $self->{shuttersDev}, 'ASC_Mode_Down', 'always' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setLockOut {
|
sub setLockOut {
|
||||||
@ -1662,7 +1659,7 @@ sub setLockOut {
|
|||||||
sub getLockOut {
|
sub getLockOut {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_LockOut', 'off' );
|
return ::AttrVal( $self->{shuttersDev}, 'ASC_LockOut', 'off' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setLockOutCmd {
|
sub setLockOutCmd {
|
||||||
@ -1677,7 +1674,7 @@ sub setLockOutCmd {
|
|||||||
sub getLockOutCmd {
|
sub getLockOutCmd {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_LockOut_Cmd', 'none' );
|
return ::AttrVal( $self->{shuttersDev}, 'ASC_LockOut_Cmd', 'none' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setAntiFreeze {
|
sub setAntiFreeze {
|
||||||
@ -1692,7 +1689,7 @@ sub setAntiFreeze {
|
|||||||
sub getAntiFreeze {
|
sub getAntiFreeze {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_Antifreeze', 'off' );
|
return ::AttrVal( $self->{shuttersDev}, 'ASC_Antifreeze', 'off' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setAutoAstroModeMorning {
|
sub setAutoAstroModeMorning {
|
||||||
@ -1707,7 +1704,8 @@ sub setAutoAstroModeMorning {
|
|||||||
sub getAutoAstroModeMorning {
|
sub getAutoAstroModeMorning {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeMorning', 'none' );
|
return ::AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeMorning',
|
||||||
|
'none' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setAutoAstroModeEvening {
|
sub setAutoAstroModeEvening {
|
||||||
@ -1722,7 +1720,8 @@ sub setAutoAstroModeEvening {
|
|||||||
sub getAutoAstroModeEvening {
|
sub getAutoAstroModeEvening {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeEvening', 'none' );
|
return ::AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeEvening',
|
||||||
|
'none' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setAutoAstroModeMorningHorizon {
|
sub setAutoAstroModeMorningHorizon {
|
||||||
@ -1738,7 +1737,7 @@ sub setAutoAstroModeMorningHorizon {
|
|||||||
sub getAutoAstroModeMorningHorizon {
|
sub getAutoAstroModeMorningHorizon {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeMorningHorizon',
|
return ::AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeMorningHorizon',
|
||||||
0 );
|
0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1755,7 +1754,7 @@ sub setAutoAstroModeEveningHorizon {
|
|||||||
sub getAutoAstroModeEveningHorizon {
|
sub getAutoAstroModeEveningHorizon {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeEveningHorizon',
|
return ::AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeEveningHorizon',
|
||||||
0 );
|
0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1771,7 +1770,7 @@ sub setUp {
|
|||||||
sub getUp {
|
sub getUp {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_Up', 'astro' );
|
return ::AttrVal( $self->{shuttersDev}, 'ASC_Up', 'astro' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setDown {
|
sub setDown {
|
||||||
@ -1786,14 +1785,15 @@ sub setDown {
|
|||||||
sub getDown {
|
sub getDown {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_Down', 'astro' );
|
return ::AttrVal( $self->{shuttersDev}, 'ASC_Down', 'astro' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setShadingBetweenTheTime {
|
sub setShadingBetweenTheTime {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $attrVal = shift;
|
my $attrVal = shift;
|
||||||
|
|
||||||
_setAttributs( $self->{shuttersDev}, 'ASC_Shading_BetweenTheTime', $attrVal );
|
_setAttributs( $self->{shuttersDev}, 'ASC_Shading_BetweenTheTime',
|
||||||
|
$attrVal );
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1801,7 +1801,8 @@ sub setShadingBetweenTheTime {
|
|||||||
sub getShadingBetweenTheTime {
|
sub getShadingBetweenTheTime {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_Shading_BetweenTheTime', '00:00-24:00' );
|
return ::AttrVal( $self->{shuttersDev}, 'ASC_Shading_BetweenTheTime',
|
||||||
|
'00:00-24:00' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setTimeUpEarly {
|
sub setTimeUpEarly {
|
||||||
@ -1816,7 +1817,7 @@ sub setTimeUpEarly {
|
|||||||
sub getTimeUpEarly {
|
sub getTimeUpEarly {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_Early', '05:00' );
|
my $val = ::AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_Early', '05:00' );
|
||||||
|
|
||||||
if ( defined( PerlCodeCheck($val) ) ) {
|
if ( defined( PerlCodeCheck($val) ) ) {
|
||||||
$val = PerlCodeCheck($val);
|
$val = PerlCodeCheck($val);
|
||||||
@ -1841,7 +1842,7 @@ sub setTimeUpLate {
|
|||||||
sub getTimeUpLate {
|
sub getTimeUpLate {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_Late', '08:30' );
|
my $val = ::AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_Late', '08:30' );
|
||||||
|
|
||||||
if ( defined( PerlCodeCheck($val) ) ) {
|
if ( defined( PerlCodeCheck($val) ) ) {
|
||||||
$val = PerlCodeCheck($val);
|
$val = PerlCodeCheck($val);
|
||||||
@ -1866,7 +1867,7 @@ sub setTimeDownEarly {
|
|||||||
sub getTimeDownEarly {
|
sub getTimeDownEarly {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Down_Early', '16:00' );
|
my $val = ::AttrVal( $self->{shuttersDev}, 'ASC_Time_Down_Early', '16:00' );
|
||||||
|
|
||||||
if ( defined( PerlCodeCheck($val) ) ) {
|
if ( defined( PerlCodeCheck($val) ) ) {
|
||||||
$val = PerlCodeCheck($val);
|
$val = PerlCodeCheck($val);
|
||||||
@ -1891,7 +1892,7 @@ sub setTimeDownLate {
|
|||||||
sub getTimeDownLate {
|
sub getTimeDownLate {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Down_Late', '22:00' );
|
my $val = ::AttrVal( $self->{shuttersDev}, 'ASC_Time_Down_Late', '22:00' );
|
||||||
|
|
||||||
if ( defined( PerlCodeCheck($val) ) ) {
|
if ( defined( PerlCodeCheck($val) ) ) {
|
||||||
$val = PerlCodeCheck($val);
|
$val = PerlCodeCheck($val);
|
||||||
@ -1917,7 +1918,7 @@ sub getTimeUpWeHoliday {
|
|||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
my $val =
|
my $val =
|
||||||
AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_WE_Holiday', '01:25' );
|
::AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_WE_Holiday', '01:25' );
|
||||||
|
|
||||||
if ( defined( PerlCodeCheck($val) ) ) {
|
if ( defined( PerlCodeCheck($val) ) ) {
|
||||||
$val = PerlCodeCheck($val);
|
$val = PerlCodeCheck($val);
|
||||||
@ -1939,7 +1940,7 @@ sub getBrightnessMinVal {
|
|||||||
$self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
|
$self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
|
||||||
->{LASTGETTIME}
|
->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
|
$self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
|
||||||
->{LASTGETTIME} ) < 2
|
->{LASTGETTIME} ) < 2
|
||||||
);
|
);
|
||||||
@ -1958,7 +1959,7 @@ sub getBrightnessMaxVal {
|
|||||||
$self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
|
$self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
|
||||||
->{LASTGETTIME}
|
->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
|
$self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
|
||||||
->{LASTGETTIME} ) < 2
|
->{LASTGETTIME} ) < 2
|
||||||
);
|
);
|
||||||
@ -1980,7 +1981,7 @@ sub setDriveUpMaxDuration {
|
|||||||
sub getDriveUpMaxDuration {
|
sub getDriveUpMaxDuration {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_DriveUpMaxDuration', 60 );
|
return ::AttrVal( $self->{shuttersDev}, 'ASC_DriveUpMaxDuration', 60 );
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
###############################################################################
|
###############################################################################
|
||||||
#
|
#
|
||||||
# Developed with Kate
|
# Developed with VSCodium and richterger perl plugin
|
||||||
#
|
#
|
||||||
# (c) 2018-2021 Copyright: Marko Oldenburg (fhemdevelopment@cooltux.net)
|
# (c) 2018-2025 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net)
|
||||||
# All rights reserved
|
# All rights reserved
|
||||||
#
|
#
|
||||||
# Special thanks goes to:
|
# Special thanks goes to:
|
||||||
@ -44,21 +44,10 @@ use strict;
|
|||||||
use warnings;
|
use warnings;
|
||||||
use utf8;
|
use utf8;
|
||||||
|
|
||||||
use GPUtils qw(GP_Import);
|
|
||||||
|
|
||||||
## Import der FHEM Funktionen
|
|
||||||
BEGIN {
|
|
||||||
GP_Import(
|
|
||||||
qw(
|
|
||||||
ReadingsVal
|
|
||||||
ReadingsNum)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub getBrightness {
|
sub getBrightness {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return ReadingsNum(
|
return ::ReadingsNum(
|
||||||
$FHEM::Automation::ShuttersControl::shutters->_getBrightnessSensor,
|
$FHEM::Automation::ShuttersControl::shutters->_getBrightnessSensor,
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getBrightnessReading,
|
$FHEM::Automation::ShuttersControl::shutters->getBrightnessReading,
|
||||||
-1 );
|
-1 );
|
||||||
@ -67,7 +56,7 @@ sub getBrightness {
|
|||||||
sub getWindStatus {
|
sub getWindStatus {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return ReadingsVal(
|
return ::ReadingsVal(
|
||||||
$FHEM::Automation::ShuttersControl::ascDev->_getWindSensor,
|
$FHEM::Automation::ShuttersControl::ascDev->_getWindSensor,
|
||||||
$FHEM::Automation::ShuttersControl::ascDev->getWindSensorReading, -1 );
|
$FHEM::Automation::ShuttersControl::ascDev->getWindSensorReading, -1 );
|
||||||
}
|
}
|
||||||
@ -75,7 +64,7 @@ sub getWindStatus {
|
|||||||
sub getStatus {
|
sub getStatus {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return ReadingsNum( $self->{shuttersDev},
|
return ::ReadingsNum( $self->{shuttersDev},
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getPosCmd, 0 );
|
$FHEM::Automation::ShuttersControl::shutters->getPosCmd, 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -88,7 +77,7 @@ sub getDelayCmd {
|
|||||||
sub getASCenable {
|
sub getASCenable {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return ReadingsVal( $self->{shuttersDev}, 'ASC_Enable', 'on' );
|
return ::ReadingsVal( $self->{shuttersDev}, 'ASC_Enable', 'on' );
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
###############################################################################
|
###############################################################################
|
||||||
#
|
#
|
||||||
# Developed with Kate
|
# Developed with VSCodium and richterger perl plugin
|
||||||
#
|
#
|
||||||
# (c) 2018-2021 Copyright: Marko Oldenburg (fhemdevelopment@cooltux.net)
|
# (c) 2018-2025 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net)
|
||||||
# All rights reserved
|
# All rights reserved
|
||||||
#
|
#
|
||||||
# Special thanks goes to:
|
# Special thanks goes to:
|
||||||
@ -47,7 +47,7 @@ use utf8;
|
|||||||
use FHEM::Automation::ShuttersControl::Window::Attr;
|
use FHEM::Automation::ShuttersControl::Window::Attr;
|
||||||
use FHEM::Automation::ShuttersControl::Window::Readings;
|
use FHEM::Automation::ShuttersControl::Window::Readings;
|
||||||
|
|
||||||
our @ISA =
|
use base
|
||||||
qw(FHEM::Automation::ShuttersControl::Window::Attr FHEM::Automation::ShuttersControl::Window::Readings);
|
qw(FHEM::Automation::ShuttersControl::Window::Attr FHEM::Automation::ShuttersControl::Window::Readings);
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
###############################################################################
|
###############################################################################
|
||||||
#
|
#
|
||||||
# Developed with Kate
|
# Developed with VSCodium and richterger perl plugin
|
||||||
#
|
#
|
||||||
# (c) 2018-2021 Copyright: Marko Oldenburg (fhemdevelopment@cooltux.net)
|
# (c) 2018-2025 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net)
|
||||||
# All rights reserved
|
# All rights reserved
|
||||||
#
|
#
|
||||||
# Special thanks goes to:
|
# Special thanks goes to:
|
||||||
@ -44,17 +44,6 @@ use strict;
|
|||||||
use warnings;
|
use warnings;
|
||||||
use utf8;
|
use utf8;
|
||||||
|
|
||||||
use GPUtils qw(GP_Import);
|
|
||||||
|
|
||||||
## Import der FHEM Funktionen
|
|
||||||
BEGIN {
|
|
||||||
GP_Import(
|
|
||||||
qw(
|
|
||||||
AttrVal
|
|
||||||
gettimeofday)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub setSubTyp {
|
sub setSubTyp {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $attrVal = shift;
|
my $attrVal = shift;
|
||||||
@ -67,7 +56,8 @@ sub setSubTyp {
|
|||||||
sub getSubTyp {
|
sub getSubTyp {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return AttrVal( $self->{shuttersDev}, 'ASC_WindowRec_subType', 'twostate' );
|
return ::AttrVal( $self->{shuttersDev}, 'ASC_WindowRec_subType',
|
||||||
|
'twostate' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setWinDev {
|
sub setWinDev {
|
||||||
@ -87,15 +77,15 @@ sub _getWinDev {
|
|||||||
exists(
|
exists(
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME}
|
$self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} ) <
|
$self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} ) <
|
||||||
2
|
2
|
||||||
);
|
);
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} =
|
$self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} =
|
||||||
int( gettimeofday() );
|
int( ::gettimeofday() );
|
||||||
my ( $device, $reading ) =
|
my ( $device, $reading ) =
|
||||||
FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev},
|
FHEM::Automation::ShuttersControl::Helper::GetAttrValues(
|
||||||
'ASC_WindowRec', 'none' );
|
$self->{shuttersDev}, 'ASC_WindowRec', 'none' );
|
||||||
|
|
||||||
### erwartetes Ergebnis
|
### erwartetes Ergebnis
|
||||||
# DEVICE:READING VALUEACTIVE:VALUEINACTIVE POSACTIVE:POSINACTIVE
|
# DEVICE:READING VALUEACTIVE:VALUEINACTIVE POSACTIVE:POSINACTIVE
|
||||||
@ -116,7 +106,7 @@ sub getWinDevReading {
|
|||||||
exists(
|
exists(
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME}
|
$self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME}
|
||||||
)
|
)
|
||||||
&& ( gettimeofday() -
|
&& ( ::gettimeofday() -
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} ) <
|
$self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} ) <
|
||||||
2
|
2
|
||||||
);
|
);
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
###############################################################################
|
###############################################################################
|
||||||
#
|
#
|
||||||
# Developed with Kate
|
# Developed with VSCodium and richterger perl plugin
|
||||||
#
|
#
|
||||||
# (c) 2018-2021 Copyright: Marko Oldenburg (fhemdevelopment@cooltux.net)
|
# (c) 2018-2025 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net)
|
||||||
# All rights reserved
|
# All rights reserved
|
||||||
#
|
#
|
||||||
# Special thanks goes to:
|
# Special thanks goes to:
|
||||||
@ -44,20 +44,10 @@ use strict;
|
|||||||
use warnings;
|
use warnings;
|
||||||
use utf8;
|
use utf8;
|
||||||
|
|
||||||
use GPUtils qw(GP_Import);
|
|
||||||
|
|
||||||
## Import der FHEM Funktionen
|
|
||||||
BEGIN {
|
|
||||||
GP_Import(
|
|
||||||
qw(
|
|
||||||
ReadingsVal)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub getWinStatus {
|
sub getWinStatus {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return ReadingsVal(
|
return ::ReadingsVal(
|
||||||
$FHEM::Automation::ShuttersControl::shutters->_getWinDev,
|
$FHEM::Automation::ShuttersControl::shutters->_getWinDev,
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getWinDevReading,
|
$FHEM::Automation::ShuttersControl::shutters->getWinDevReading,
|
||||||
'closed' );
|
'closed' );
|
||||||
|
Loading…
Reference in New Issue
Block a user