From 578b96a4ff281a6f2a23a09b23eb1338ea8b634a Mon Sep 17 00:00:00 2001
From: Marko Oldenburg
Date: Wed, 3 Jun 2020 12:59:04 +0200
Subject: [PATCH] change package code in mutiple files
---
FHEM/73_AutoShuttersControl.pm | 1184 +++++
.../FHEM/Automation/ShuttersControl.pm | 4704 +----------------
lib/FHEM/Automation/ShuttersControl/Dev.pm | 79 +
.../Automation/ShuttersControl/Dev/Attr.pm | 388 ++
.../ShuttersControl/Dev/Readings.pm | 242 +
.../Automation/ShuttersControl/Roommate.pm | 76 +
.../Automation/ShuttersControl/Shutters.pm | 937 ++++
.../ShuttersControl/Shutters/Attr.pm | 1948 +++++++
.../ShuttersControl/Shutters/Readings.pm | 92 +
lib/FHEM/Automation/ShuttersControl/Window.pm | 50 +
.../Automation/ShuttersControl/Window/Attr.pm | 129 +
.../ShuttersControl/Window/Readings.pm | 65 +
12 files changed, 5207 insertions(+), 4687 deletions(-)
create mode 100644 FHEM/73_AutoShuttersControl.pm
rename 73_AutoShuttersControl.pm => lib/FHEM/Automation/ShuttersControl.pm (51%)
create mode 100644 lib/FHEM/Automation/ShuttersControl/Dev.pm
create mode 100644 lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm
create mode 100644 lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm
create mode 100644 lib/FHEM/Automation/ShuttersControl/Roommate.pm
create mode 100644 lib/FHEM/Automation/ShuttersControl/Shutters.pm
create mode 100644 lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm
create mode 100644 lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm
create mode 100644 lib/FHEM/Automation/ShuttersControl/Window.pm
create mode 100644 lib/FHEM/Automation/ShuttersControl/Window/Attr.pm
create mode 100644 lib/FHEM/Automation/ShuttersControl/Window/Readings.pm
diff --git a/FHEM/73_AutoShuttersControl.pm b/FHEM/73_AutoShuttersControl.pm
new file mode 100644
index 0000000..c8c716f
--- /dev/null
+++ b/FHEM/73_AutoShuttersControl.pm
@@ -0,0 +1,1184 @@
+###############################################################################
+#
+# Developed with Kate
+#
+# (c) 2018-2020 Copyright: Marko Oldenburg (leongaultier at gmail dot com)
+# All rights reserved
+#
+# Special thanks goes to:
+# - Bernd (Cluni) this module is based on the logic of his script "Rollladensteuerung für HM/ROLLO inkl. Abschattung und Komfortfunktionen in Perl" (https://forum.fhem.de/index.php/topic,73964.0.html)
+# - Beta-User for many tests, many suggestions and good discussions
+# - pc1246 write english commandref
+# - FunkOdyssey commandref style
+# - sledge fix many typo in commandref
+# - many User that use with modul and report bugs
+# - Christoph (christoph.kaiser.in) Patch that expand RegEx for Window Events
+# - Julian (Loredo) expand Residents Events for new Residents functions
+# - Christoph (Christoph Morrison) for fix Commandref, many suggestions and good discussions
+#
+#
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License,or
+# any later version.
+#
+# The GNU General Public License can be found at
+# http://www.gnu.org/copyleft/gpl.html.
+# A copy is found in the textfile GPL.txt and important notices to the license
+# from the author is found in LICENSE.txt distributed with these scripts.
+#
+# This script is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+#
+# $Id$
+#
+###############################################################################
+
+### Notizen
+# !!!!! - Innerhalb einer Shutterschleife kein CommandAttr verwenden. Bring Fehler!!! Kommen Raumnamen in die Shutterliste !!!!!!
+#
+
+package FHEM::AutoShuttersControl;
+
+use strict;
+use warnings;
+use utf8;
+
+use FHEM::Automation::ShuttersControl;
+use FHEM::Meta;
+use GPUtils qw(GP_Import GP_Export);
+
+## Import der FHEM Funktionen
+#-- Run before package compilation
+BEGIN {
+ #-- Export to main context with different name
+ GP_Export(
+ qw(
+ Initialize
+ )
+ );
+}
+
+sub Initialize {
+ my $hash = shift;
+
+## Da ich mit package arbeite müssen in die Initialize für die jeweiligen hash Fn Funktionen der Funktionsname
+ # und davor mit :: getrennt der eigentliche package Name des Modules
+ $hash->{SetFn} = \&Set;
+ $hash->{GetFn} = \&Get;
+ $hash->{DefFn} = \&Define;
+ $hash->{NotifyFn} = \&Notify;
+ $hash->{UndefFn} = \&Undef;
+ $hash->{AttrList} =
+ 'ASC_tempSensor '
+ . 'ASC_brightnessDriveUpDown '
+ . 'ASC_autoShuttersControlMorning:on,off '
+ . 'ASC_autoShuttersControlEvening:on,off '
+ . 'ASC_autoShuttersControlComfort:on,off '
+ . 'ASC_residentsDev '
+ . 'ASC_rainSensor '
+ . 'ASC_autoAstroModeMorning:REAL,CIVIL,NAUTIC,ASTRONOMIC,HORIZON '
+ . 'ASC_autoAstroModeMorningHorizon:-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9 '
+ . 'ASC_autoAstroModeEvening:REAL,CIVIL,NAUTIC,ASTRONOMIC,HORIZON '
+ . 'ASC_autoAstroModeEveningHorizon:-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9 '
+ . 'ASC_freezeTemp:-5,-4,-3,-2,-1,0,1,2,3,4,5 '
+ . 'ASC_shuttersDriveDelay '
+ . 'ASC_twilightDevice '
+ . 'ASC_windSensor '
+ . 'ASC_expert:1 '
+ . 'ASC_blockAscDrivesAfterManual:0,1 '
+ . 'ASC_debug:1 '
+ . 'ASC_slatDriveCmdInverse:0,1 '
+ . $readingFnAttributes;
+ $hash->{NotifyOrderPrefix} = '51-'; # Order Nummer für NotifyFn
+ $hash->{FW_detailFn} = \&ShuttersInformation;
+ $hash->{parseParams} = 1;
+
+ return FHEM::Meta::InitMod( __FILE__, $hash );
+}
+
+
+1;
+
+=pod
+=item device
+=item summary Module for controlling shutters depending on various conditions
+=item summary_DE Modul zur automatischen Rolladensteuerung auf Basis bestimmter Ereignisse
+
+
+=begin html
+
+
+AutoShuttersControl
+
+
+ AutoShuttersControl (ASC) provides a complete automation for shutters with comprehensive
+ configuration options, e.g. open or close shutters depending on the sunrise or sunset,
+ by outdoor brightness or randomly for simulate presence.
+
+ So that ASC can drive the blinds on the basis of the astronomical times, it is very important to
+ correctly set the location (latitude, longitude) in the device "global".
+
+
+ After telling ASC which shutters should be controlled, several in-depth configuration options
+ are provided. With these and in combination with a resident presence state, complex scenarios are possible:
+ For example, shutters could be opened if a resident awakes from sleep and the sun is already rosen. Or if a
+ closed window with shutters down is tilted, the shutters could be half opened for ventilation.
+ Many more is possible.
+
+
+ Define
+
+
+ This creates an new AutoShuttersControl device, called myASControl.
+ Now was the new global attribute ASC added to the FHEM installation.
+ Each shutter that is to be controlled by AutoShuttersControl must now have the attribute ASC set to 1 or 2.
+ The value 1 is to be used with devices whose state is given as position (i.e. ROLLO or Siro, shutters
+ openend is 0, shutters closed is 100), 2 with devices whose state is given as percent closed (i.e. HomeMatic,
+ shutters opened is 100, closed is 0).
+
+
+ After setting the attributes to all devices who should be controlled, the automatic scan at the main device
+ can be started for example with
+ set myASControl scanForShutters
+
+
+
+
+ Readings
+
+
+
+ Set
+
+ - ascEnable on|off - enable or disable the global control by ASC
+ - controlShading on|off - enable or disable the global shading control by ASC
+ - createNewNotifyDev - re-creates the internal structure for NOTIFYDEV. Is only present if
+ the
+ ASC_Expert attribute is set to 1.
+
+ - hardLockOut on|off -
- hardLockOut - on/off - Aktiviert den hardwareseitigen Aussperrschutz für die Rollläden, bei denen das Attributs ASC_LockOut entsprechend auf hard gesetzt ist. Mehr Informationen in der Beschreibung bei den Attributen für die Rollladengeräten.
+
+ - partyMode on|off - controls the global party mode for shutters. Every shutters whose
+ ASC_Partymode attribute is set to on, is not longer controlled by ASC. The last saved
+ working command send to the device, i.e. by a event, created by a window or presence event, will be executed
+ once the party mode is disabled.
+
+ - renewAllTimer - resets the sunrise and sunset timers for every associated
+ shutter device and creates new internal FHEM timers.
+
+ - renewTimer - resets the sunrise and sunset timers for selected shutter
+ device and creates new internal FHEM timers.
+
+ - scanForShutters - scans the whole FHEM installation for (new) devices whose ASC
+ attribute is set (to 1 or 2, see above).
+
+ - selfDefense on|off - controls the self defense function. This function listens for
+ example on a residents device. If this device is set to absent and a window is still open, ASC will close
+ the shutter for a rudimentary burglary protection.
+
+ - shutterASCenableToggle on|off - controls if the ASC controls are shown at a associated
+ shutter device.
+
+ - sunriseTimeWeHoliday on|off - controls the weekend and holiday support. If enabled, the
+ ASC_Time_Up_WE_Holiday attribute is considered.
+
+ - wiggle - wiggles a device for a given value (default 5%, controlled by
+ ASC_WiggleValue) up or down and back after a minute. Useful as a deterrence in combination with
+ alarm system.
+
+
+
+
+ Get
+
+ - showNotifyDevsInformations - shows the generated NOTIFYDEV structure. Useful for
+ debugging and only shown if the ASC_expert attribute is set to 1.
+
+
+
+
+ Attributes
+
+ At the global ASC device:
+
+
+
+ - ASC_autoAstroModeEvening - REAL, CIVIL, NAUTIC, ASTRONOMIC or HORIZON
+
+ - ASC_autoAstroModeEveningHorizon - Height above the horizon. Is only considered
+ if the ASC_autoAstroModeEvening attribute is set to HORIZON. Defaults to 0.
+
+
+ - ASC_autoAstroModeMorning - REAL, CIVIL, NAUTIC, ASTRONOMIC or HORIZON
+
+ - ASC_autoAstroModeMorningHorizon - Height above the horizon. Is only considered
+ if the ASC_autoAstroModeMorning attribute is set to HORIZON. Defaults to 0.
+
+
+ - ASC_autoShuttersControlComfort - on|off -
+ Controls the comfort functions: If a three state sensor, like the HmIP-SRH window handle
+ sensor, is installed, ASC will open the window if the sensor signals open position. The
+ ASC_ComfortOpen_Pos attribute has to be set for the shutter to on, defaults to off.
+
+
+ - ASC_autoShuttersControlEvening - on|off - Enables the automatic control by ASC
+ at the evenings.
+
+
+ - ASC_autoShuttersControlMorning - on|off - Enables the automatic control by ASC
+ at the mornings.
+
+
+ - ASC_blockAscDrivesAfterManual 0|1 - If set to 1, ASC will not
+ automatically control a shutter if there was an manual control to the shutter. To be considered, the
+ ASC_ShuttersLastDrive reading has to contain the value manual and the shutter is in
+ an unknown (i.e. not otherwise configured in ASC) position.
+
+
+ - ASC_brightnessDriveUpDown - VALUE-MORNING:VALUE-EVENING - Drive the shutters by
+ brightness. VALUE-MORNING sets the brightness threshold for the morning. If the value is
+ reached in the morning, the shutter will go up. Vice versa in the evening. This is a global setting
+ and can be overwritte per device with the ASC_BrightnessSensor attribute (see below).
+
+
+ - ASC_debug -
+ Extendend logging for debugging purposes
+
+
+ - ASC_expert - Switches the export mode on. Currently, if set to 1, get
+ and set will contain additional functions regarding the NOTIFYDEFs.
+
+
+ - ASC_freezeTemp - Temperature threshold for the freeze protection. The freeze protection
+ prevents the shutter to be operated by ASC. Last operating order will be kept.
+
+
+ - ASC_rainSensor DEVICENAME[:READINGNAME] MAXTRIGGER[:HYSTERESE] [CLOSEDPOS] - Contains
+ settings for the rain protection. DEVICNAME specifies a rain sensor, the optional
+ READINGNAME the name of the reading at the DEVICENAME. The READINGNAME
+ should contain the values rain and dry or a numeral rain amount. MAXTRIGGER
+ sets the threshold for the amount of rain for when the shutter is driven to CLOSEDPOS as soon
+ the threshold is reached. HYSTERESE sets a hysteresis for MAXTRIGGER.
+
+
+ - ASC_residentsDev DEVICENAME[:READINGNAME] - DEVICENAME points to a device
+ for presence, e.g. of type RESIDENTS. READINGNAME points to a reading at
+ DEVICENAME which contains a presence state, e.g. rgr_Residents:state. The target
+ should contain values alike the RESIDENTS family.
+
+
+ - ASC_shuttersDriveDelay - Maximum random drive delay in seconds for calculating
+ the operating time. 0 equals to no delay.
+
+
+ - ASC_tempSensor DEVICENAME[:READINGNAME] - DEVICENAME points to a device
+ with a temperature, READINGNAME to a reading located at the DEVICENAME, for example
+ OUTDOOR_TEMP:measured-temp. READINGNAME defaults to temperature.
+
+
+ - ASC_twilightDevice - points to a DEVICENAME containing values regarding
+ the sun position. Supports currently devices of type Twilight or Astro.
+
+
+ - ASC_windSensor DEVICENAME[:READINGNAME] - DEVICENAME points to a device
+ containing a wind speed. Reads from the wind reading, if not otherwise specified by
+ READINGNAME.
+
+
+
+ At shutter devices, controlled by ASC:
+
+
+
+ AutoShuttersControl API description
+
+
+ It's possible to access internal data of the ASC module by calling the API function.
+
+ Data points of a shutter device, controlled by ASC
+
+
{ ascAPIget('Getter','SHUTTERS_DEVICENAME') }
+
+
+
+ Getter |
+ Description |
+
+
+ FreezeStatus |
+ 1 = soft, 2 = daytime, 3 = hard |
+
+
+ NoDelay |
+ Was the offset handling deactivated (e.g. by operations triggered by a window event) |
+
+
+ LastDrive |
+ Reason for the last action caused by ASC |
+
+
+ LastPos |
+ Last position of the shutter |
+
+
+ LastPosTimestamp |
+ Timestamp of the last position |
+
+
+ LastManPos |
+ Last position manually set of the shutter |
+
+
+ LastManPosTimestamp |
+ Timestamp of the last position manually set |
+
+
+ SunsetUnixTime |
+ Calculated sunset time in seconds since the UNIX epoche |
+
+
+ Sunset |
+ 1 = operation in the evening was made, 0 = operation in the evening was not yet made |
+
+
+ SunriseUnixTime |
+ Calculated sunrise time in seconds since the UNIX epoche |
+
+
+ Sunrise |
+ 1 = operation in the morning was made, 0 = operation in the morning was not yet made |
+
+
+ RoommatesStatus |
+ Current state of the room mate set for this shutter |
+
+
+ RoommatesLastStatus |
+ Last state of the room mate set for this shutter |
+
+
+ ShadingStatus |
+ Value of the current shading state. Can hold in, out, in reserved or
+ out reserved |
+
+
+ ShadingStatusTimestamp |
+ Timestamp of the last shading state |
+
+
+ IfInShading |
+ Is the shutter currently in shading (depends on the shading mode) |
+
+
+ WindProtectionStatus |
+ Current state of the wind protection. Can hold protection or unprotection |
+
+
+ RainProtectionStatus |
+ Current state of the rain protection. Can hold protection or unprotection |
+
+
+ DelayCmd |
+ Last operation order in the waiting queue. Set for example by the party mode |
+
+
+ Status |
+ Position of the shutter |
+
+
+ ASCenable |
+ Does ASC control the shutter? |
+
+
+ PrivacyDownStatus |
+ Is the shutter currently in privacyDown mode |
+
+
+ outTemp |
+ Current temperature of a configured temperature device, return -100 is no device configured |
+
+
+
+ Übersicht für das Rollladen-Device mit Parameterübergabe
+
+ { ascAPIget('Getter','ROLLODEVICENAME',VALUE) }
+
+
+
+ Getter | Erläuterung |
+
+
+ QueryShuttersPos | Rückgabewert 1 bedeutet das die aktuelle Position des Rollos unterhalb der Valueposition ist. 0 oder nichts bedeutet oberhalb der Valueposition. |
+
+
+
+ Data points of the ASC device
+
+ { ascAPIget('Getter') }
+
+
+
+ Getter |
+ Description |
+
+
+ OutTemp |
+ Current temperature of a configured temperature device, return -100 is no device configured |
+
+
+ ResidentsStatus |
+ Current state of a configured resident device |
+
+
+ ResidentsLastStatus |
+ Last state of a configured resident device |
+
+
+ Azimuth |
+ Current azimuth of the sun |
+
+
+ Elevation |
+ Current elevation of the sun |
+
+
+ ASCenable |
+ Is ASC globally activated? |
+
+
+
+
+=end html
+
+=begin html_DE
+
+
+AutoShuttersControl
+
+ AutoShuttersControl (ASC) ermöglicht eine vollständige Automatisierung der vorhandenen Rollläden. Das Modul bietet umfangreiche Konfigurationsmöglichkeiten, um Rollläden bspw. nach Sonnenauf- und untergangszeiten, nach Helligkeitswerten oder rein zeitgesteuert zu steuern.
+
Damit ASC auf Basis der astronomischen Zeiten die Rollos fahren kann, ist es ganz wichtig im Device "global" die Location (Latitude,Longitude) korrekt zu setzen.
+
+
+ Man kann festlegen, welche Rollläden von ASC in die Automatisierung mit aufgenommen werden sollen. Daraufhin stehen diverse Attribute zur Feinkonfiguration zur Verfügung. So sind unter anderem komplexe Lösungen wie Fahrten in Abhängigkeit des Bewohnerstatus einfach umsetzbar. Beispiel: Hochfahren von Rollläden, wenn der Bewohner erwacht ist und draußen bereits die Sonne aufgegangen ist. Weiterhin ist es möglich, dass der geschlossene Rollladen z.B. nach dem Ankippen eines Fensters in eine Lüftungsposition fährt. Und vieles mehr.
+
+
+ Define
+
+ define <name> AutoShuttersControl
+
+ Beispiel:
+
+
+ define myASControl AutoShuttersControl
+
+
+ Der Befehl erstellt ein AutoShuttersControl Device mit Namen myASControl.
+ Nachdem das Device angelegt wurde, muss in allen Rollläden Devices, welche gesteuert werden sollen, das Attribut ASC mit Wert 1 oder 2 gesetzt werden.
+ Dabei bedeutet 1 = "Prozent geschlossen" (z.B. ROLLO oder Siro Modul) - Rollo Oben 0, Rollo Unten 100, 2 = "Prozent geöffnet" (z.B. Homematic) - Rollo Oben 100, Rollo Unten 0.
+ Die Voreinstellung für den Befehl zum prozentualen Fahren ist in beiden Fällen unterschiedlich. 1="position" und 2="pct". Dies kann, soweit erforderlich, zu späterer Zeit noch angepasst werden.
+ Habt Ihr das Attribut gesetzt, könnt Ihr den automatischen Scan nach den Devices anstoßen.
+
+
+
+ Readings
+
+ Im ASC-Device
+
+ - ..._nextAstroTimeEvent - Uhrzeit des nächsten Astro-Events: Sonnenauf- oder Sonnenuntergang oder feste Zeit
+ - ..._PosValue - aktuelle Position des Rollladens
+ - ..._lastPosValue - letzte Position des Rollladens
+ - ..._lastDelayPosValue - letzter abgesetzter Fahrbefehl, welcher beim nächsten zulässigen Event ausgeführt wird.
+ - partyMode - on/off - Partymodus-Status
+ - ascEnable - on/off - globale ASC Steuerung bei den Rollläden aktiv oder inaktiv
+ - controlShading - on/off - globale Beschattungsfunktion aktiv oder inaktiv
+ - hardLockOut - on/off - Status des hardwareseitigen Aussperrschutzes / gilt nur für Rolläden mit dem Attribut bei denen das Attributs ASC_LockOut entsprechend auf hard gesetzt ist
+ - room_... - Auflistung aller Rollläden, die in den jeweiligen Rämen gefunden wurde. Beispiel: room_Schlafzimmer: Terrasse
+ - selfDefense - Selbstschutz-Status
+ - state - Status des ASC-Devices: active, enabled, disabled oder weitere Statusinformationen
+ - sunriseTimeWeHoliday - on/off - Status der Wochenendunterstützung
+ - userAttrList - Das ASC-Modul verteilt an die gesteuerten Rollladen-Geräte diverse Benutzerattribute (userattr). In diesem Reading kann der Status dieser Verteilung geprüft werden.
+
+ In den Rollläden-Geräten
+
+ - ASC_Enable - on/off - wird der Rollladen über ASC gesteuert oder nicht
+ - ASC_Time_DriveUp - Im Astro-Modus ist hier die Sonnenaufgangszeit für das Rollo gespeichert. Im Brightnessmodus ist hier der Zeitpunkt aus dem Attribut ASC_Time_Up_Late gespeichert. Im Timemodus ist hier der Zeitpunkt aus dem Attribut ASC_Time_Up_Early gespeichert.
+ - ASC_Time_DriveDown - Im Astro-Modus ist hier die Sonnenuntergangszeit für das Rollo gespeichert. Im Brightnessmodus ist hier der Zeitpunkt aus dem Attribut ASC_Time_Down_Late gespeichert. Im Timemodus ist hier der Zeitpunkt aus dem Attribut ASC_Time_Down_Early gespeichert.
+ - ASC_ShuttersLastDrive - Grund der letzten Fahrt vom Rollladen
+ - ASC_ShadingMessage -
+ - ASC_Time_PrivacyDriveDown -
+ - ASC_Time_PrivacyDriveUp -
+
+
+
+
+ Set
+
+ - advDriveDown - holt bei allen Rollläden durch ASC_Adv on ausgesetzte Fahrten nach.
+ - ascEnable - on/off - Aktivieren oder deaktivieren der globalen ASC Steuerung
+ - controlShading - on/off - Aktiviert oder deaktiviert die globale Beschattungssteuerung
+ - createNewNotifyDev - Legt die interne Struktur für NOTIFYDEV neu an. Diese Funktion steht nur zur Verfügung, wenn Attribut ASC_expert auf 1 gesetzt ist.
+ - hardLockOut - on/off - Aktiviert den hardwareseitigen Aussperrschutz für die Rollläden, bei denen das Attributs ASC_LockOut entsprechend auf hard gesetzt ist. Mehr Informationen in der Beschreibung bei den Attributen für die Rollladengeräten.
+ - partyMode - on/off - Aktiviert den globalen Partymodus. Alle Rollladen-Geräten, in welchen das Attribut ASC_Partymode auf on gesetzt ist, werden durch ASC nicht mehr gesteuert. Der letzte Schaltbefehl, der bspw. durch ein Fensterevent oder Wechsel des Bewohnerstatus an die Rollläden gesendet wurde, wird beim Deaktivieren des Partymodus ausgeführt
+ - renewTimer - erneuert beim ausgewählten Rollladen die Zeiten für Sonnenauf- und -untergang und setzt die internen Timer neu.
+ - renewAllTimer - erneuert bei allen Rollläden die Zeiten für Sonnenauf- und -untergang und setzt die internen Timer neu.
+ - scanForShutters - Durchsucht das System nach GerätenRo mit dem Attribut ASC = 1 oder ASC = 2
+ - selfDefense - on/off - Aktiviert bzw. deaktiviert die Selbstschutzfunktion. Beispiel: Wenn das Residents-Gerät absent meldet, die Selbstschutzfunktion aktiviert wurde und ein Fenster im Haus noch geöffnet ist, so wird an diesem Fenster der Rollladen deaktivieren dann heruntergefahren.
+ - shutterASCenableToggle - on/off - Aktivieren oder deaktivieren der ASC Kontrolle beim einzelnen Rollladens
+ - sunriseTimeWeHoliday - on/off - Aktiviert die Wochenendunterstützung und somit, ob im Rollladengerät das Attribut ASC_Time_Up_WE_Holiday beachtet werden soll oder nicht.
+ - wiggle - bewegt einen oder mehrere Rollläden um einen definierten Wert (Default: 5%) und nach einer Minute wieder zurück in die Ursprungsposition. Diese Funktion könnte bspw. zur Abschreckung in einem Alarmsystem eingesetzt werden.
+
+
+
+ Get
+
+ - showNotifyDevsInformations - zeigt eine Übersicht der abgelegten NOTIFYDEV Struktur. Diese Funktion wird primär fürs Debugging genutzt. Hierzu ist das Attribut ASC_expert = 1 zu setzen.
+
+
+
+ Attributes
+
+ Im ASC-Device
+
+
+ - ASC_autoAstroModeEvening - REAL, CIVIL, NAUTIC, ASTRONOMIC oder HORIZON
+
+ - ASC_autoAstroModeEveningHorizon - Höhe über dem Horizont. Wird nur berücksichtigt, wenn im Attribut ASC_autoAstroModeEvening der Wert HORIZON ausgewählt wurde. (default: 0)
+
+ - ASC_autoAstroModeMorning - REAL, CIVIL, NAUTIC, ASTRONOMIC oder HORIZON
+
+ - ASC_autoAstroModeMorningHorizon - Höhe über dem Horizont. Wird nur berücksichtigt, wenn im Attribut ASC_autoAstroModeMorning der Wert HORIZON ausgewählt wurde. (default: 0)
+
+ - ASC_autoShuttersControlComfort - on/off - schaltet die Komfortfunktion an. Bedeutet, dass ein Rollladen mit einem threestate-Sensor am Fenster beim Öffnen in eine Offenposition fährt. Hierzu muss beim Rollladen das Attribut ASC_ComfortOpen_Pos entsprechend konfiguriert sein. (default: off)
+
+ - ASC_autoShuttersControlEvening - on/off - Aktiviert die automatische Steuerung durch das ASC-Modul am Abend.
+
+ - ASC_autoShuttersControlMorning - on/off - Aktiviert die automatische Steuerung durch das ASC-Modul am Morgen.
+
+ - ASC_blockAscDrivesAfterManual - 0,1 - wenn dieser Wert auf 1 gesetzt ist, dann werden Rollläden vom ASC-Modul nicht mehr gesteuert, wenn zuvor manuell eingegriffen wurde. Voraussetzung hierfür ist jedoch, dass im Reading ASC_ShuttersLastDrive der Status manual enthalten ist und sich der Rollladen auf eine unbekannte (nicht in den Attributen anderweitig konfigurierte) Position befindet.
+
+ - ASC_brightnessDriveUpDown - WERT-MORGENS:WERT-ABENDS - Werte bei dem Schaltbedingungen für Sonnenauf- und -untergang geprüft werden sollen. Diese globale Einstellung kann durch die WERT-MORGENS:WERT-ABENDS Einstellung von ASC_BrightnessSensor im Rollladen selbst überschrieben werden.
+
+ - ASC_debug - Aktiviert die erweiterte Logausgabe für Debugausgaben
+
+ - ASC_expert - ist der Wert 1, so werden erweiterte Informationen bezüglich des NotifyDevs unter set und get angezeigt
+
+ - ASC_freezeTemp - Temperatur, ab welcher der Frostschutz greifen soll und der Rollladen nicht mehr fährt. Der letzte Fahrbefehl wird gespeichert.
+
+ - ASC_rainSensor - DEVICENAME[:READINGNAME] MAXTRIGGER[:HYSTERESE] [CLOSEDPOS] - 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".
+
+ - ASC_residentsDev - DEVICENAME[:READINGNAME] - der Inhalt ist eine Kombination aus Devicenamen und Readingnamen des Residents-Device der obersten Ebene (z.B. rgr_Residents:state)
+
+ - ASC_shuttersDriveDelay - maximale Zufallsverzögerung in Sekunden bei der Berechnung der Fahrzeiten. 0 bedeutet keine Verzögerung
+
+ - ASC_tempSensor - DEVICENAME[:READINGNAME] - der Inhalt ist eine Kombination aus Device und Reading für die Außentemperatur
+
+ - ASC_twilightDevice - das Device, welches die Informationen zum Sonnenstand liefert. Wird unter anderem für die Beschattung verwendet.
+
+ - ASC_windSensor - DEVICE[:READING] - Sensor für die Windgeschwindigkeit. Kombination aus Device und Reading.
+ - ASC_slatDriveCmdInverse - Vertauscht wie Reihnfolge der Fahrbefehle für Slat und Drive
+
+
+
+ In den Rollläden-Geräten
+
+ - ASC - 0/1/2 0 = "kein Anlegen der Attribute beim ersten Scan bzw. keine Beachtung eines Fahrbefehles",1 = "Inverse oder Rollo - Bsp.: Rollo oben 0, Rollo unten 100 und der Befehl zum prozentualen Fahren ist position",2 = "Homematic Style - Bsp.: Rollo oben 100, Rollo unten 0 und der Befehl zum prozentualen Fahren ist pct
+ - ASC_Antifreeze - soft/am/pm/hard/off - Frostschutz, wenn soft fährt der Rollladen in die ASC_Antifreeze_Pos und wenn hard/am/pm wird gar nicht oder innerhalb der entsprechenden Tageszeit nicht gefahren (default: off)
+ - ASC_Antifreeze_Pos - Position die angefahren werden soll, wenn der Fahrbefehl komplett schließen lautet, aber der Frostschutz aktiv ist (Default: ist abhängig vom AttributASC 85/15) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
+ - ASC_AutoAstroModeEvening - aktuell REAL,CIVIL,NAUTIC,ASTRONOMIC (default: none)
+ - ASC_AutoAstroModeEveningHorizon - Höhe über Horizont, wenn beim Attribut ASC_autoAstroModeEvening HORIZON ausgewählt (default: none)
+ - ASC_AutoAstroModeMorning - aktuell REAL,CIVIL,NAUTIC,ASTRONOMIC (default: none)
+ - ASC_AutoAstroModeMorningHorizon - Höhe über Horizont,a wenn beim Attribut ASC_autoAstroModeMorning HORIZON ausgewählt (default: none)
+ - ASC_BlockingTime_afterManual - wie viel Sekunden soll die Automatik nach einer manuellen Fahrt aussetzen. (default: 1200)
+ - ASC_BlockingTime_beforDayOpen - wie viel Sekunden vor dem morgendlichen öffnen soll keine schließen Fahrt mehr stattfinden. (default: 3600)
+ - ASC_BlockingTime_beforNightClose - wie viel Sekunden vor dem nächtlichen schließen soll keine öffnen Fahrt mehr stattfinden. (default: 3600)
+ - ASC_BrightnessSensor - DEVICE[:READING] WERT-MORGENS:WERT-ABENDS / 'Sensorname[:brightness [400:800]]' Angaben zum Helligkeitssensor mit (Readingname, optional) für die Beschattung und dem Fahren der Rollladen nach brightness und den optionalen Brightnesswerten für Sonnenauf- und Sonnenuntergang. (default: none)
+ - ASC_Down - astro/time/brightness - bei astro wird Sonnenuntergang berechnet, bei time wird der Wert aus ASC_Time_Down_Early als Fahrzeit verwendet und bei brightness muss ASC_Time_Down_Early und ASC_Time_Down_Late korrekt gesetzt werden. Der Timer läuft dann nach ASC_Time_Down_Late Zeit, es wird aber in der Zeit zwischen ASC_Time_Down_Early und ASC_Time_Down_Late geschaut, ob die als Attribut im Moduldevice hinterlegte ASC_brightnessDriveUpDown der Down Wert erreicht wurde. Wenn ja, wird der Rollladen runter gefahren (default: astro)
+
+ Beschreibung der besonderen Positionsattribute
+ - ASC_Closed_Pos - in 10 Schritten von 0 bis 100 (Default: ist abhängig vom AttributASC 0/100)
+ - ASC_Open_Pos - in 10 Schritten von 0 bis 100 (default: ist abhängig vom AttributASC 100/0)
+ - ASC_Sleep_Pos - in 10 Schritten von 0 bis 100 (default: ist abhängig vom AttributASC 75/25) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
+ - ASC_ComfortOpen_Pos - in 10 Schritten von 0 bis 100 (Default: ist abhängig vom AttributASC 20/80) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
+ - ASC_Shading_Pos - Position des Rollladens für die Beschattung (Default: ist abhängig vom AttributASC 80/20) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
+ - ASC_Ventilate_Pos - in 10 Schritten von 0 bis 100 (default: ist abhängig vom Attribut ASC 70/30) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
+
+ In Bezug auf die Verwendung mit Lamellen gibt es folgende ergänzende Parameter.
+
+ - Wird die gesamte Position inklusive der Lamellen mit Hilfe einer "festen Zurdnung" angefahren, so z.B. set ROLLONAME Beschattung dann wird hinter dem Positionswert mittels : getrennt die "feste Zuordnung" geschrieben. Beispiel: attr ROLLONAME ASC_Shading_Pos 30:Beschattung
+ - Wird hingegen ein ander Command verwendet z.B. slatPct oder ähnliches dann muss hinter der normalen Positionsangebe noch die Position für die Lamellen mit angegeb werden. Beispiel: attr ROLLONAME ASC_Shading_Pos 30:75. Bitte beachtet in diesem Zusammenhang auch das Attribut ASC_SlatPosCmd_SlatDevice wo mindesten die Angabe des SlatPosCMD Voraussetzung ist.
+
+
+ - ASC_Shutter_IdleDetection - READING:VALUE gibt das Reading an welches Auskunft über den Fahrstatus des Rollos gibt, sowie als zweites den Wert im Reading welcher aus sagt das das Rollo nicht fährt
+ - ASC_DriveUpMaxDuration - die Dauer des Hochfahrens des Rollladens plus 5 Sekunden (default: 60)
+ - ASC_Drive_Delay - maximaler Wert für einen zufällig ermittelte Verzögerungswert in Sekunden bei der Berechnung der Fahrzeiten.
+ - ASC_Drive_DelayStart - in Sekunden verzögerter Wert ab welchen das Rollo gefahren werden soll.
+ - ASC_LockOut - soft/hard/off - stellt entsprechend den Aussperrschutz ein. Bei global aktivem Aussperrschutz (set ASC-Device lockOut soft) und einem Fensterkontakt open bleibt dann der Rollladen oben. Dies gilt nur bei Steuerbefehlen über das ASC Modul. Stellt man global auf hard, wird bei entsprechender Möglichkeit versucht den Rollladen hardwareseitig zu blockieren. Dann ist auch ein Fahren über die Taster nicht mehr möglich. (default: off)
+ - ASC_LockOut_Cmd - inhibit/blocked/protection - set Befehl für das Rollladen-Device zum Hardware sperren. Dieser Befehl wird gesetzt werden, wenn man "ASC_LockOut" auf hard setzt (default: none)
+ - ASC_Mode_Down - always/home/absent/off - Wann darf die Automatik steuern. immer, niemals, bei Abwesenheit des Roommate (ist kein Roommate und absent eingestellt, wird gar nicht gesteuert) (default: always)
+ - ASC_Mode_Up - always/home/absent/off - Wann darf die Automatik steuern. immer, niemals, bei Abwesenheit des Roommate (ist kein Roommate und absent eingestellt, wird gar nicht gesteuert) (default: always)
+ - ASC_Partymode - on/off - schaltet den Partymodus an oder aus. Wird am ASC Device set ASC-DEVICE partyMode on geschalten, werden alle Fahrbefehle an den Rollläden, welche das Attribut auf on haben, zwischengespeichert und später erst ausgeführt (default: off)
+ - ASC_Pos_Reading - Name des Readings, welches die Position des Rollladen in Prozent an gibt; wird bei unbekannten Device Typen auch als set Befehl zum fahren verwendet
+ - ASC_PrivacyUpValue_beforeDayOpen - wie viele Sekunden vor dem morgendlichen öffnen soll der Rollladen in die Sichtschutzposition fahren, oder bei Brightness ab welchem minimum Brightnesswert soll das Rollo in die Privacy Position fahren. Bei Brightness muss zusätzlich zum Zeitwert der Brightnesswert mit angegeben werden 1800:600 bedeutet 30 min vor day open oder bei über einem Brightnesswert von 600 (default: -1)
+ - ASC_PrivacyDownValue_beforeNightClose - wie viele Sekunden vor dem abendlichen schließen soll der Rollladen in die Sichtschutzposition fahren, oder bei Brightness ab welchem minimum Brightnesswert soll das Rollo in die Privacy Position fahren. Bei Brightness muss zusätzlich zum Zeitwert der Brightnesswert mit angegeben werden 1800:300 bedeutet 30 min vor night close oder bei unter einem Brightnesswert von 300 (default: -1)
+ - ASC_PrivacyUp_Pos - Position den Rollladens für den morgendlichen Sichtschutz (default: 50) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
+ - ASC_PrivacyDown_Pos - Position den Rollladens für den abendlichen Sichtschutz (default: 50) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
+ - ASC_ExternalTrigger - DEVICE:READING VALUEACTIVE:VALUEINACTIVE POSACTIVE:[POSINACTIVE VALUEACTIVE2:POSACTIVE2], Beispiel: "WohnzimmerTV:state on:off 66:100" bedeutet das wenn ein "state:on" Event kommt soll das Rollo in Position 66 fahren, kommt ein "state:off" Event soll es in Position 100 fahren. Es ist möglich die POSINACTIVE weg zu lassen dann fährt das Rollo in LastStatus Position.
+ - ASC_WindProtection - on/off - soll der Rollladen beim Windschutz beachtet werden. on=JA, off=NEIN. (default off)
+ - ASC_RainProtection - on/off - soll der Rollladen beim Regenschutz beachtet werden. on=JA, off=NEIN. (default off)
+ - ASC_Roommate_Device - mit Komma getrennte Namen des/der Roommate Device/s, welche den/die Bewohner des Raumes vom Rollladen wiedergibt. Es macht nur Sinn in Schlaf- oder Kinderzimmern (default: none)
+ - ASC_Adv - on/off bei on wird das runterfahren des Rollos während der Weihnachtszeit (1. Advent bis 6. Januar) ausgesetzt! Durch set ASCDEVICE advDriveDown werden alle ausgesetzten Fahrten nachgeholt.
+ - ASC_Roommate_Reading - das Reading zum Roommate Device, welches den Status wieder gibt (default: state)
+ - ASC_Self_Defense_Mode - absent/gone/off - ab welchen Residents Status soll Selfdefense aktiv werden ohne das Fenster auf sind. (default: gone)
+ - ASC_Self_Defense_AbsentDelay - um wie viele Sekunden soll das fahren in Selfdefense bei Residents absent verzögert werden. (default: 300)
+ - ASC_Self_Defense_Exclude - on/off - bei on Wert wird dieser Rollladen bei aktiven Self Defense und offenen Fenster nicht runter gefahren, wenn Residents absent ist. (default: off), off bedeutet das es ausgeschlossen ist vom Self Defense
+
+ Beschreibung der Beschattungsfunktion
+ Damit die Beschattung Funktion hat, müssen folgende Anforderungen erfüllt sein.
+ Im ASC Device das Reading "controlShading" mit dem Wert on, sowie ein Astro/Twilight Device im Attribut "ASC_twilightDevice" und das Attribut "ASC_tempSensor".
+ In den Rollladendevices benötigt ihr ein Helligkeitssensor als Attribut "ASC_BrightnessSensor", sofern noch nicht vorhanden. Findet der Sensor nur für die Beschattung Verwendung ist der Wert DEVICENAME[:READING] ausreichend.
+ Alle weiteren Attribute sind optional und wenn nicht gesetzt mit Default-Werten belegt. Ihr solltet sie dennoch einmal anschauen und entsprechend Euren Gegebenheiten setzen. Die Werte für die Fensterposition und den Vor- Nachlaufwinkel sowie die Grenzwerte für die StateChange_Cloudy und StateChange_Sunny solltet ihr besondere Beachtung dabei schenken.
+ - ASC_Shading_InOutAzimuth - Azimut Wert ab dem bei Überschreiten Beschattet und bei Unterschreiten Endschattet werden soll. (default: 95:265)
+ - ASC_Shading_MinMax_Elevation - ab welcher min Höhe des Sonnenstandes soll beschattet und ab welcher max Höhe wieder beendet werden, immer in Abhängigkeit der anderen einbezogenen Sensorwerte (default: 25.0:100.0)
+ - ASC_Shading_Min_OutsideTemperature - ab welcher Temperatur soll Beschattet werden, immer in Abhängigkeit der anderen einbezogenen Sensorwerte (default: 18)
+ - ASC_Shading_Mode - absent,always,off,home / wann soll die Beschattung nur stattfinden. (default: off)
+ - ASC_Shading_Pos - Position des Rollladens für die Beschattung (Default: ist abhängig vom AttributASC 80/20) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
+ - ASC_Shading_StateChange_SunnyCloudy - Brightness Wert ab welchen die Beschattung stattfinden und aufgehoben werden soll, immer in Abhängigkeit der anderen einbezogenen Sensorwerte. Ein optionaler dritter Wert gibt an wie, viele Brightnesswerte für den aktuellen Brightness-Durchschnitt berücksichtigt werden. Standard ist 3, es sollten nicht mehr als 5 berücksichtigt werden. (default: 35000:20000 [3])
+ - ASC_Shading_WaitingPeriod - wie viele Sekunden soll gewartet werden bevor eine weitere Auswertung der Sensordaten für die Beschattung stattfinden soll (default: 1200)
+
+ - ASC_ShuttersPlace - window/terrace - 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 (default: window)
+ - ASC_Time_Down_Early - Sonnenuntergang frühste Zeit zum Runterfahren (default: 16:00) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!
+ - ASC_Time_Down_Late - Sonnenuntergang späteste Zeit zum Runterfahren (default: 22:00) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!
+ - ASC_Time_Up_Early - Sonnenaufgang frühste Zeit zum Hochfahren (default: 05:00) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!
+ - ASC_Time_Up_Late - Sonnenaufgang späteste Zeit zum Hochfahren (default: 08:30) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!
+ - ASC_Time_Up_WE_Holiday - Sonnenaufgang frühste Zeit zum Hochfahren am Wochenende und/oder Urlaub (holiday2we wird beachtet). (default: 08:00) ACHTUNG!!! in Verbindung mit Brightness für ASC_Up muss die Uhrzeit kleiner sein wie die Uhrzeit aus ASC_Time_Up_Late !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!
+ - ASC_Up - astro/time/brightness - bei astro wird Sonnenaufgang berechnet, bei time wird der Wert aus ASC_Time_Up_Early als Fahrzeit verwendet und bei brightness muss ASC_Time_Up_Early und ASC_Time_Up_Late korrekt gesetzt werden. Der Timer läuft dann nach ASC_Time_Up_Late Zeit, es wird aber in der Zeit zwischen ASC_Time_Up_Early und ASC_Time_Up_Late geschaut, ob die als Attribut im Moduldevice hinterlegte Down Wert von ASC_brightnessDriveUpDown erreicht wurde. Wenn ja, wird der Rollladen hoch gefahren (default: astro)
+ - ASC_Ventilate_Window_Open - auf lüften, wenn das Fenster gekippt/geöffnet wird und aktuelle Position unterhalb der Lüften-Position ist (default: on)
+ - ASC_WiggleValue - Wert um welchen sich die Position des Rollladens ändern soll (default: 5)
+ - ASC_WindParameters - TRIGGERMAX[:HYSTERESE] [DRIVEPOSITION] / Angabe von Max Wert ab dem für Wind getriggert werden soll, Hytsrese Wert ab dem der Windschutz aufgehoben werden soll TRIGGERMAX - HYSTERESE / Ist es bei einigen Rollläden nicht gewünscht das gefahren werden soll, so ist der TRIGGERMAX Wert mit -1 an zu geben. (default: '50:20 ClosedPosition')
+ - ASC_WindowRec_PosAfterDayClosed - open,lastManual / auf welche Position soll das Rollo nach dem schließen am Tag fahren. Open Position oder letzte gespeicherte manuelle Position (default: open)
+ - ASC_WindowRec - WINDOWREC:[READING], Name des Fensterkontaktes, an dessen Fenster der Rollladen angebracht ist (default: none). Reading ist optional
+ - ASC_WindowRec_subType - Typ des verwendeten Fensterkontaktes: twostate (optisch oder magnetisch) oder threestate (Drehgriffkontakt) (default: twostate)
+ - ASC_SlatPosCmd_SlatDevice - Angaben zu einem Slat (Lamellen) CMD und sofern diese Lamellen über ein anderes Device gesteuert werden zum Slat Device. Beispiel: attr ROLLO ASC_SlatPosCmd_SlatDevice slatPct[:ROLLOSLATDEVICE] [ ] bedeutet optinal. Kann also auch weg gelassen werden. Wenn Ihr das SLAT Device mit angibt dann bitte ohne []. Beispiel: attr ROLLO ASC_SlatPosCmd_SlatDevice slatPct:ROLLOSLATDEVICE. Damit das ganze dann auch greift muss in den 6 Positionsangaben ASC_Open_Pos, ASC_Closed_Pos, ASC_Ventilate_Pos, ASC_ComfortOpen_Pos, ASC_Shading_Pos und ASC_Sleep_Pos ein weiterer Parameter für die Lamellenstellung mit angegeben werden.
+
+
+
+ Beschreibung der AutoShuttersControl API
+ Mit dem Aufruf der API Funktion und Übergabe der entsprechenden Parameter ist es möglich auf interne Daten zu zu greifen.
+
+ Übersicht für das Rollladen-Device
+
+ { ascAPIget('Getter','ROLLODEVICENAME') }
+
+
+ Getter | Erläuterung |
+ FreezeStatus | 1=soft, 2=Daytime, 3=hard |
+ AntiFreezePos | konfigurierte Position beim AntiFreeze Status |
+ AntiFreezePosAssignment | konfigurierte Lamellen Position bei der AntiFreeze Position |
+ AntiFreeze | aktuelle Konfiguration für AntiFreeze |
+ ShuttersPlace | aktuelle Konfiguration an welchem Platz sich das Rollo befindet, Fenster oder Terrasse |
+ SlatPosCmd | welcher PosCmd ist aktuell für den Lamellen Befehl konfiguriert |
+ SlatDevice | welches Device aktuell für die Lamellen Steuerung konfiguriert ist |
+ PrivacyUpTime | Privacy Zeit in Sekunden zum fahren in die Privacy Pos vor dem vollen öffnen |
+ PrivacyUpBrightnessVal | Privacy Brightness Wert zum fahren in die Privacy Pos |
+ PrivacyUpPos | Position für die Privacy Up Fahrt |
+ PrivacyUpPositionAssignment | Position für die Lamellenfahrt von Privacy Up |
+ PrivacyDownTime | Privacy Zeit in Sekunden zum fahren in die Privacy Pos vor dem vollen schließ |
+ PrivacyDownBrightnessVal | Privacy Brightness Wert zum fahren in die Privacy Pos |
+ PrivacyDownPos | Position für die Privacy Down Fahrt |
+ PrivacyDownPositionAssignment | Position für die Lamellenfahrt von Privacy Down |
+ SelfDefenseMode | Modus für den SelfDefense |
+ SelfDefenseAbsentDelay | Verzögerungszeit der SelfDefense Fahrt bei absent |
+ WiggleValue | um welchen Wert soll das Rollo bei einer wiggle Fahrt fahren |
+ Adv | Ist es in der definierten Weihnachtszeit |
+ ShadingPos | konfigurierte Position für die Beschattungsfahrt |
+ ShadingPositionAssignment | Position für die Lamellenfahrt für die Beschattungsfahrt |
+ ShadingMode | welcher aktuelle Modus für das Beschatten ist konfiguriert |
+ IdleDetectionValue | welcher Wert im IdleDetectionRading zeigt an dass das Rollo aktuell nicht in Bewegung ist |
+ ShadingAzimuthLeft | ab welchem Azimut beginnt die Beschattung |
+ ShadingAzimuthRight | ab welchem Azimut endet die Beschattung |
+ ShadingMinOutsideTemperature | über welchem Temperaturwert beginnt die Beschattung |
+ ShadingMinElevation | über welchem Elevationwert beginnt die Beschattung |
+ ShadingMaxElevation | über welchem Elevationwert endet die Beschattung |
+ ShadingStateChangeSunny | über welchem Brightnesswert beginnt die Beschattung |
+ ShadingStateChangeCloudy | unter welchem Brightnesswert endet die Beschattung |
+ ShadingWaitingPeriod | nach welcher Wartezeit werden Beschattungsrelevante Sensorwerte wieder beachtet und die Beschattungsroutine abgearbeitet |
+ ExternalTriggerDevice | konfiguriertes Triggerdevice |
+ ExternalTriggerReading | kofiguriertes Triggerdevice Reading |
+ ExternalTriggerValueActive | Wert mit welchen der externe Trigger Prozess ausgel&uoml;st werden soll. |
+ ExternalTriggerValueActive2 | weiterer Wert mit welchen der externe zweite Trigger Prozess ausgel&uoml;st werden soll. |
+ ExternalTriggerValueInactive | Wert mit welchen der externe Trigger Prozess beendet werden soll |
+ ExternalTriggerPosActive | Rolloposition welche angefahren werden soll wenn der erste externe Trigger aktiv wird. |
+ ExternalTriggerPosActive2 | Rolloposition welche angefahren werden soll wenn der zweite externe Trigger aktiv wird. |
+ ExternalTriggerPosInactive | Rolloposition welche angefahren werden soll wenn der externe Trigger inaktiv wird. |
+ ExternalTriggerState | aktueller Status des externen Triggers, 0 oder 1 |
+ Delay | konfigurierte Verzögerungswert welcher für die Zufallsberechnung werwendet werden soll |
+ DelayStart | konfigurierter fester Verzögerungswert |
+ BlockingTimeAfterManual | konfigurierte Blockzeit nach einer manuellen Fahrt |
+ BlockingTimeBeforNightClose | konfigurierte Blockzeit vor dem nächtlichen schließen |
+ BlockingTimeBeforDayOpen | konfigurierte Blockzeit vor dem morgendlichen öffnen |
+ PosCmd | welches Kommando wird zum fahren der Rollos verwendet (pct, position?) |
+ OpenPos | Position für Rollo ganz auf |
+ OpenPositionAssignment | Slat-Position für Rollo ganz auf |
+ VentilatePos | Lüften Position |
+ VentilatePositionAssignment | Lüften Slat-Position |
+ VentilatePosAfterDayClosed | Position des Rollos beim schließen des Fensters am Tag |
+ ClosedPos | Position für Rollo ganz geschlossen |
+ ClosedPositionAssignment | Slat-Position für Rollo ganz geschlossen |
+ SleepPos | Position für schlafen |
+ SleepPositionAssignment | Slat-Position für schlafen |
+ VentilateOpen | Lüften aktiv? |
+ ComfortOpenPos | Comfort Position |
+ ComfortOpenPositionAssignment | Slat-Comfort Position |
+ PartyMode | Abfrage Party Mode |
+ Roommates | Abfrage Roommates / Antwort als String |
+ RoommatesReading | Roommates Reading |
+ RoommatesStatus | Roommates Status unter Berücksichtigung aller Roommates und dessen Status |
+ RoommatesLastStatus | Roommates letzter Status unter Berücksichtigung aller Roommates und dessen letzten Status |
+ WindPos | Rollo Position bei Windtrigger |
+ WindMax | Wert über dem die Windprotection aktiviert werden soll |
+ WindMin | Wert unter dem die Windprotection aufgehoben werden soll |
+ WindProtection | Windprotection soll aktiv sein oder nicht |
+ WindProtectionStatus | aktueller Status der Wind Protection „protected“ oder „unprotected“ |
+ RainProtection | Rain Protection soll aktiv sein oder nicht |
+ RainProtectionStatus | aktueller Status der Regen Protection „unprotected“ oder „unprotected“ |
+ ModeUp | |
+ ModeDown | |
+ LockOut | |
+ LockOutCmd | |
+ AutoAstroModeMorning | |
+ AutoAstroModeEvening | |
+ AutoAstroModeMorningHorizon | |
+ AutoAstroModeEveningHorizon | |
+ Up | |
+ Down | |
+ TimeUpEarly | |
+ TimeUpLate | |
+ TimeDownEarly | |
+ TimeDownLate | |
+ TimeUpWeHoliday | |
+ | |
+ | |
+ | |
+ | |
+ | |
+ | |
+ | |
+ | |
+ | |
+
+
+
+
+
+
+ NoDelay | Wurde die Behandlung von Offset deaktiviert (Beispiel bei Fahrten über Fensterevents) |
+ LastDrive | Grund des letzten Fahrens |
+ LastPos | die letzte Position des Rollladens |
+ LastPosTimestamp | Timestamp der letzten festgestellten Position |
+ LastManPos | Position der letzten manuellen Fahrt |
+ LastManPosTimestamp | Timestamp der letzten manuellen Position |
+ SunsetUnixTime | berechnete Unixzeit für Abends (Sonnenuntergang) |
+ Sunset | 1=Abendfahrt wurde durchgeführt, 0=noch keine Abendfahrt durchgeführt |
+ SunriseUnixTime | berechnete Unixzeit für Morgens (Sonnenaufgang) |
+ Sunrise | 1=Morgenfahrt wurde durchgeführt, 0=noch keine Morgenfahrt durchgeführt |
+ RoommatesStatus | aktueller Status der/des Roommate/s für den Rollladen |
+ RoommatesLastStatus | letzter Status der/des Roommate/s für den Rollladen |
+ ShadingStatus | Ausgabe des aktuellen Shading Status, „in“, „out“, „in reserved“, „out reserved“ |
+ ShadingStatusTimestamp | Timestamp des letzten Beschattungsstatus |
+ IfInShading | Befindet sich der Rollladen, in Abhängigkeit des Shading Mode, in der Beschattung |
+ DelayCmd | letzter Fahrbefehl welcher in die Warteschlange kam. Grund z.B. Partymodus. |
+ Status | Position des Rollladens |
+ ASCenable | Abfrage ob für den Rollladen die ASC Steuerung aktiv ist. |
+ IsDay | Abfrage ob das Rollo im Tag oder Nachtmodus ist. Also nach Sunset oder nach Sunrise |
+ PrivacyDownStatus | Abfrage ob das Rollo aktuell im PrivacyDown Status steht |
+ OutTemp | aktuelle Außentemperatur sofern ein Sensor definiert ist, wenn nicht kommt -100 als Wert zurück |
+
+
+ Übersicht für das Rollladen-Device mit Parameterübergabe
+
+ { ascAPIget('Getter','ROLLODEVICENAME',VALUE) }
+
+
+ Getter | Erläuterung |
+ QueryShuttersPos | Rückgabewert 1 bedeutet das die aktuelle Position des Rollos unterhalb der Valueposition ist. 0 oder nichts bedeutet oberhalb der Valueposition. |
+
+
+ Übersicht für das ASC Device
+
+ { ascAPIget('Getter') }
+
+
+ Getter | Erläuterung |
+ OutTemp | aktuelle Außentemperatur sofern ein Sensor definiert ist, wenn nicht kommt -100 als Wert zurück |
+ ResidentsStatus | aktueller Status des Residents Devices |
+ ResidentsLastStatus | letzter Status des Residents Devices |
+ Azimuth | Azimut Wert |
+ Elevation | Elevation Wert |
+ ASCenable | ist die ASC Steuerung global aktiv? |
+
+
+
+=end html_DE
+
+=for :application/json;q=META.json 73_AutoShuttersControl.pm
+{
+ "abstract": "Module for controlling shutters depending on various conditions",
+ "x_lang": {
+ "de": {
+ "abstract": "Modul zur Automatischen Rolladensteuerung auf Basis bestimmter Ereignisse"
+ }
+ },
+ "keywords": [
+ "fhem-mod-device",
+ "fhem-core",
+ "Shutter",
+ "Automation",
+ "Rollladen",
+ "Rollo",
+ "Control"
+ ],
+ "release_status": "testing",
+ "license": "GPL_2",
+ "version": "v0.9.20",
+ "author": [
+ "Marko Oldenburg "
+ ],
+ "x_fhem_maintainer": [
+ "CoolTux"
+ ],
+ "x_fhem_maintainer_github": [
+ "LeonGaultier"
+ ],
+ "prereqs": {
+ "runtime": {
+ "requires": {
+ "FHEM": 5.00918799,
+ "perl": 5.016,
+ "Meta": 0,
+ "JSON": 0,
+ "Date::Parse": 0
+ },
+ "recommends": {
+ },
+ "suggests": {
+ }
+ }
+ }
+}
+=end :application/json;q=META.json
+
+=cut
diff --git a/73_AutoShuttersControl.pm b/lib/FHEM/Automation/ShuttersControl.pm
similarity index 51%
rename from 73_AutoShuttersControl.pm
rename to lib/FHEM/Automation/ShuttersControl.pm
index 83d2248..e9d29f0 100644
--- a/73_AutoShuttersControl.pm
+++ b/lib/FHEM/Automation/ShuttersControl.pm
@@ -60,7 +60,7 @@ sub ascAPIset {
}
## unserer packagename
-package FHEM::AutoShuttersControl;
+package FHEM::Automation::ShuttersControl;
use strict;
use warnings;
@@ -73,6 +73,9 @@ use GPUtils qw(GP_Import GP_Export);
use Data::Dumper; #only for Debugging
use Date::Parse;
+use FHEM::Automation::ShuttersControl::Shutters;
+use FHEM::Automation::ShuttersControl::Dev;
+
# try to use JSON::MaybeXS wrapper
# for chance of better performance + open code
eval {
@@ -185,17 +188,18 @@ BEGIN {
computeAlignTime
ReplaceEventMap)
);
+
+ #-- Export to main context with different name
+ GP_Export(
+ qw(
+ ascAPIget
+ ascAPIset
+ DevStateIcon
+ )
+ );
}
-#-- Export to main context with different name
-GP_Export(
- qw(
- Initialize
- ascAPIget
- ascAPIset
- DevStateIcon
- )
-);
+
## Die Attributsliste welche an die Rolläden verteilt wird. Zusammen mit Default Werten
my %userAttrList = (
@@ -496,10 +500,10 @@ sub Notify {
WriteReadingsShuttersList($hash);
UserAttributs_Readings_ForShutters( $hash, 'add' );
InternalTimer( gettimeofday() + 3,
- 'FHEM::AutoShuttersControl::RenewSunRiseSetShuttersTimer',
+ 'FHEM::Automation::ShuttersControl::RenewSunRiseSetShuttersTimer',
$hash );
InternalTimer( gettimeofday() + 5,
- 'FHEM::AutoShuttersControl::AutoSearchTwilightDev', $hash );
+ 'FHEM::Automation::ShuttersControl::AutoSearchTwilightDev', $hash );
InternalTimer(
gettimeofday() + 5,
sub() { CommandSet( undef, $name . ' controlShading on' ) },
@@ -4944,7 +4948,7 @@ sub _CheckASC_ConditionsForShadingFn {
my $count = 1;
for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) {
InternalTimer( gettimeofday() + $count,
- 'FHEM::AutoShuttersControl::_CheckShuttersConditionsForShadingFn',
+ 'FHEM::Automation::ShuttersControl::_CheckShuttersConditionsForShadingFn',
$shuttersDev );
$count++;
@@ -5022,4679 +5026,5 @@ sub _CheckShuttersConditionsForShadingFn {
readingsEndUpdate( $shuttersDevHash, 1 );
}
-######################################
-######################################
-########## Begin der Klassendeklarierungen für OOP (Objektorientierte Programmierung) #########################
-## Klasse Rolläden (Shutters) und die Subklassen Attr und Readings ##
-## desweiteren wird noch die Klasse ASC_Roommate mit eingebunden
-
-package ASC_Shutters;
-our @ISA =
- qw(ASC_Shutters::Readings ASC_Shutters::Attr ASC_Roommate ASC_Window);
-
-use strict;
-use warnings;
-use utf8;
-
-use GPUtils qw(GP_Import);
-
-## Import der FHEM Funktionen
-BEGIN {
- GP_Import(
- qw(
- defs
- ReadingsVal
- readingsSingleUpdate
- gettimeofday
- InternalTimer
- CommandSet
- Log3)
- );
-}
-
-sub new {
- my $class = shift;
- my $self = {
- shuttersDev => undef,
- defaultarg => undef,
- roommate => undef,
- };
-
- bless $self, $class;
- return $self;
-}
-
-sub setShuttersDev {
- my $self = shift;
- my $shuttersDev = shift;
-
- $self->{shuttersDev} = $shuttersDev if ( defined($shuttersDev) );
- return $self->{shuttersDev};
-}
-
-sub getShuttersDev {
- my $self = shift;
-
- return $self->{shuttersDev};
-}
-
-sub setAttrUpdateChanges {
- my ( $self, $attr, $value ) = @_;
-
- $self->{ $self->{shuttersDev} }{AttrUpdateChanges}{$attr} = $value;
- return;
-}
-
-sub setHardLockOut {
- my $self = shift;
- my $cmd = shift;
-
- if ( $shutters->getLockOut eq 'hard'
- && $shutters->getLockOutCmd ne 'none' )
- {
- CommandSet( undef, $self->{shuttersDev} . ' inhibit ' . $cmd )
- if ( $shutters->getLockOutCmd eq 'inhibit' );
- CommandSet( undef,
- $self->{shuttersDev} . ' '
- . ( $cmd eq 'on' ? 'blocked' : 'unblocked' ) )
- if ( $shutters->getLockOutCmd eq 'blocked' );
- CommandSet( undef,
- $self->{shuttersDev} . ' '
- . ( $cmd eq 'on' ? 'protectionOn' : 'protectionOff' ) )
- if ( $shutters->getLockOutCmd eq 'protected' );
- }
- return;
-}
-
-sub setNoDelay {
- my $self = shift;
- my $noDelay = shift;
-
- $self->{ $self->{shuttersDev} }{noDelay} = $noDelay;
- return;
-}
-
-sub setSelfDefenseAbsent {
- my ( $self, $timerrun, $active, $timerhash ) = @_;
-
- $self->{ $self->{shuttersDev} }{selfDefenseAbsent}{timerrun} = $timerrun;
- $self->{ $self->{shuttersDev} }{selfDefenseAbsent}{active} = $active;
- $self->{ $self->{shuttersDev} }{selfDefenseAbsent}{timerhash} = $timerhash
- if ( defined($timerhash) );
- return;
-}
-
-sub setDriveCmd {
- my $self = shift;
- my $posValue = shift;
-
- my $offSet;
- my $offSetStart;
-
- if (
- ( $shutters->getPartyMode eq 'on' && $ascDev->getPartyMode eq 'on' )
- || ( $shutters->getAdv
- && !$shutters->getQueryShuttersPos($posValue)
- && !$shutters->getAdvDelay
- && !$shutters->getExternalTriggerState
- && !$shutters->getSelfDefenseState )
- )
- {
- $shutters->setDelayCmd($posValue);
- $ascDev->setDelayCmdReading;
- $shutters->setNoDelay(0);
- $shutters->setExternalTriggerState(0)
- if ( $shutters->getExternalTriggerState );
-
- FHEM::AutoShuttersControl::ASC_Debug( 'setDriveCmd: '
- . $shutters->getShuttersDev
- . ' - Die Fahrt wird zurückgestellt. Grund kann ein geöffnetes Fenster sein oder ein aktivierter Party Modus oder Weihnachtszeit'
- );
- }
- else {
- $shutters->setAdvDelay(0)
- if ( $shutters->getAdvDelay );
- $shutters->setDelayCmd('none')
- if ( $shutters->getDelayCmd ne 'none' )
- ; # setzt den Wert auf none da der Rolladen nun gesteuert werden kann.
- $shutters->setExternalTriggerState(0)
- if ( $shutters->getExternalTriggerState );
-
- ### antifreeze Routine
- if ( $shutters->getAntiFreezeStatus > 0 ) {
- if ( $shutters->getAntiFreezeStatus != 1 ) {
-
- $posValue = $shutters->getStatus;
- $shutters->setLastDrive('no drive - antifreeze defense');
- $shutters->setLastDriveReading;
- $ascDev->setStateReading;
- }
- elsif ( $posValue == $shutters->getClosedPos ) {
- $posValue = $shutters->getAntiFreezePos;
- $shutters->setLastDrive(
- $shutters->getLastDrive . ' - antifreeze mode' );
- }
- }
-
- my %h = (
- shuttersDev => $self->{shuttersDev},
- posValue => $posValue,
- );
-
- $offSet = $shutters->getDelay if ( $shutters->getDelay > -1 );
- $offSet = $ascDev->getShuttersOffset if ( $shutters->getDelay < 0 );
- $offSetStart = $shutters->getDelayStart;
-
- if ( $shutters->getSelfDefenseAbsent
- && !$shutters->getSelfDefenseAbsentTimerrun
- && $shutters->getSelfDefenseMode ne 'off'
- && $shutters->getSelfDefenseState
- && $ascDev->getSelfDefense eq 'on' )
- {
- InternalTimer(
- gettimeofday() + $shutters->getSelfDefenseAbsentDelay,
- \&FHEM::AutoShuttersControl::_SetCmdFn, \%h );
- $shutters->setSelfDefenseAbsent( 1, 0, \%h );
- }
- elsif ( $offSetStart > 0 && !$shutters->getNoDelay ) {
- InternalTimer(
- gettimeofday() +
- int( rand($offSet) + $shutters->getDelayStart ),
- \&FHEM::AutoShuttersControl::_SetCmdFn, \%h
- );
-
- FHEM::AutoShuttersControl::ASC_Debug( 'FnSetDriveCmd: '
- . $shutters->getShuttersDev
- . ' - versetztes fahren' );
- }
- elsif ( $offSetStart < 1 || $shutters->getNoDelay ) {
- FHEM::AutoShuttersControl::_SetCmdFn( \%h );
- FHEM::AutoShuttersControl::ASC_Debug( 'FnSetDriveCmd: '
- . $shutters->getShuttersDev
- . ' - NICHT versetztes fahren' );
- }
-
- FHEM::AutoShuttersControl::ASC_Debug( 'FnSetDriveCmd: '
- . $shutters->getShuttersDev
- . ' - NoDelay: '
- . ( $shutters->getNoDelay ? 'JA' : 'NEIN' ) );
- $shutters->setNoDelay(0);
- }
-
- return;
-}
-
-sub setSunsetUnixTime {
- my $self = shift;
- my $unixtime = shift;
-
- $self->{ $self->{shuttersDev} }{sunsettime} = $unixtime;
- return;
-}
-
-sub setSunset {
- my $self = shift;
- my $value = shift;
-
- $self->{ $self->{shuttersDev} }{sunset} = $value;
- return;
-}
-
-sub setSunriseUnixTime {
- my $self = shift;
- my $unixtime = shift;
-
- $self->{ $self->{shuttersDev} }{sunrisetime} = $unixtime;
- return;
-}
-
-sub setSunrise {
- my $self = shift;
- my $value = shift;
-
- $self->{ $self->{shuttersDev} }{sunrise} = $value;
- return;
-}
-
-sub setDelayCmd {
- my $self = shift;
- my $posValue = shift;
-
- $self->{ $self->{shuttersDev} }{delayCmd} = $posValue;
- return;
-}
-
-sub setLastDrive {
- my $self = shift;
- my $lastDrive = shift;
-
- $self->{ $self->{shuttersDev} }{lastDrive} = $lastDrive;
- return;
-}
-
-sub setPosSetCmd {
- my $self = shift;
- my $posSetCmd = shift;
-
- $self->{ $self->{shuttersDev} }{posSetCmd} = $posSetCmd;
- return;
-}
-
-sub setLastDriveReading {
- my $self = shift;
- my $shuttersDevHash = $defs{ $self->{shuttersDev} };
-
- my %h = (
- devHash => $shuttersDevHash,
- lastDrive => $shutters->getLastDrive,
- );
-
- InternalTimer( gettimeofday() + 0.1,
- \&FHEM::AutoShuttersControl::_setShuttersLastDriveDelayed, \%h );
- return;
-}
-
-sub setLastPos {
-
-# letzte ermittelte Position bevor die Position des Rolladen über ASC geändert wurde
- my $self = shift;
- my $position = shift;
-
- $self->{ $self->{shuttersDev} }{lastPos}{VAL} = $position
- if ( defined($position) );
- $self->{ $self->{shuttersDev} }{lastPos}{TIME} = int( gettimeofday() )
- if ( defined( $self->{ $self->{shuttersDev} }{lastPos} ) );
- return;
-}
-
-sub setLastManPos {
- my $self = shift;
- my $position = shift;
-
- $self->{ $self->{shuttersDev} }{lastManPos}{VAL} = $position
- if ( defined($position) );
- $self->{ $self->{shuttersDev} }{lastManPos}{TIME} = int( gettimeofday() )
- if ( defined( $self->{ $self->{shuttersDev} }{lastManPos} )
- && defined( $self->{ $self->{shuttersDev} }{lastManPos}{TIME} ) );
- $self->{ $self->{shuttersDev} }{lastManPos}{TIME} =
- int( gettimeofday() ) - 86400
- if ( defined( $self->{ $self->{shuttersDev} }{lastManPos} )
- && !defined( $self->{ $self->{shuttersDev} }{lastManPos}{TIME} ) );
- return;
-}
-
-sub setDefault {
- my $self = shift;
- my $defaultarg = shift;
-
- $self->{defaultarg} = $defaultarg if ( defined($defaultarg) );
- return $self->{defaultarg};
-}
-
-sub setRoommate {
- my $self = shift;
- my $roommate = shift;
-
- $self->{roommate} = $roommate if ( defined($roommate) );
- return $self->{roommate};
-}
-
-sub setInTimerFuncHash {
- my $self = shift;
- my $inTimerFuncHash = shift;
-
- $self->{ $self->{shuttersDev} }{inTimerFuncHash} = $inTimerFuncHash
- if ( defined($inTimerFuncHash) );
- return;
-}
-
-sub setPrivacyDownStatus {
- my $self = shift;
- my $statusValue = shift;
-
- $self->{ $self->{shuttersDev} }->{privacyDownStatus} = $statusValue;
- return;
-}
-
-sub setPrivacyUpStatus {
- my $self = shift;
- my $statusValue = shift;
-
- $self->{ $self->{shuttersDev} }->{privacyUpStatus} = $statusValue;
- return;
-}
-
-sub setSelfDefenseState {
- my $self = shift;
- my $value = shift;
-
- $self->{ $self->{shuttersDev} }{selfDefenseState} = $value;
- return;
-}
-
-sub setAdvDelay {
- my $self = shift;
- my $advDelay = shift;
-
- $self->{ $self->{shuttersDev} }->{AdvDelay} = $advDelay;
- return;
-}
-
-sub getHomemode {
- my $self = shift;
-
- my $homemode = $shutters->getRoommatesStatus;
- $homemode = $ascDev->getResidentsStatus
- if ( $homemode eq 'none' );
- return $homemode;
-}
-
-sub getAdvDelay {
- my $self = shift;
-
- return (
- defined( $self->{ $self->{shuttersDev} }->{AdvDelay} )
- ? $self->{ $self->{shuttersDev} }->{AdvDelay}
- : 0
- );
-}
-
-sub getPrivacyDownStatus {
- my $self = shift;
-
- return (
- defined( $self->{ $self->{shuttersDev} }->{privacyDownStatus} )
- ? $self->{ $self->{shuttersDev} }->{privacyDownStatus}
- : undef
- );
-}
-
-sub getPrivacyUpStatus {
- my $self = shift;
-
- return (
- defined( $self->{ $self->{shuttersDev} }->{privacyUpStatus} )
- ? $self->{ $self->{shuttersDev} }->{privacyUpStatus}
- : undef
- );
-}
-
-sub getAttrUpdateChanges {
- my $self = shift;
- my $attr = shift;
-
- return (
- defined( $self->{ $self->{shuttersDev} }{AttrUpdateChanges} )
- && defined(
- $self->{ $self->{shuttersDev} }{AttrUpdateChanges}{$attr} )
- ? $self->{ $self->{shuttersDev} }{AttrUpdateChanges}{$attr}
- : 'none'
- );
-}
-
-sub getIsDay {
- my $self = shift;
-
- return FHEM::AutoShuttersControl::_IsDay( $self->{shuttersDev} );
-}
-
-sub getAntiFreezeStatus {
- use POSIX qw(strftime);
- my $self = shift;
- my $daytime = strftime( "%P", localtime() );
- $daytime = (
- defined($daytime) && $daytime
- ? $daytime
- : ( strftime( "%k", localtime() ) < 12 ? 'am' : 'pm' )
- );
- my $outTemp = $ascDev->getOutTemp;
-
-# $outTemp = $shutters->getOutTemp if ( $shutters->getOutTemp != -100 ); sollte raus das der Sensor im Rollo auch ein Innentemperatursensor sein kann.
-
- if ( $shutters->getAntiFreeze ne 'off'
- && $outTemp <= $ascDev->getFreezeTemp )
- {
-
- if ( $shutters->getAntiFreeze eq 'soft' ) {
- return 1;
- }
- elsif ( $shutters->getAntiFreeze eq $daytime ) {
- return 2;
- }
- elsif ( $shutters->getAntiFreeze eq 'hard' ) {
- return 3;
- }
- }
- else { return 0; }
-}
-
-sub getShuttersPosCmdValueNegate {
- my $self = shift;
-
- return ( $shutters->getOpenPos < $shutters->getClosedPos ? 1 : 0 );
-}
-
-sub getQueryShuttersPos
-{ # Es wird geschaut ob die aktuelle Position des Rollos unterhalb der Zielposition ist
- my $self = shift;
- my $posValue = shift; # wenn dem so ist wird 1 zurück gegeben ansonsten 0
-
- return (
- $shutters->getShuttersPosCmdValueNegate
- ? $shutters->getStatus > $posValue
- : $shutters->getStatus < $posValue
- );
-}
-
-sub getPosSetCmd {
- my $self = shift;
-
- return (
- defined( $self->{ $self->{shuttersDev} }{posSetCmd} )
- ? $self->{ $self->{shuttersDev} }{posSetCmd}
- : $shutters->getPosCmd
- );
-}
-
-sub getNoDelay {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }{noDelay};
-}
-
-sub getSelfDefenseState {
- my $self = shift;
-
- return (
- defined( $self->{ $self->{shuttersDev} }{selfDefenseState} )
- ? $self->{ $self->{shuttersDev} }{selfDefenseState}
- : 0
- );
-}
-
-sub getSelfDefenseAbsent {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }{selfDefenseAbsent}{active};
-}
-
-sub getSelfDefenseAbsentTimerrun {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }{selfDefenseAbsent}{timerrun};
-}
-
-sub getSelfDefenseAbsentTimerhash {
- my $self = shift;
-
- return (
- defined(
- $self->{ $self->{shuttersDev} }{selfDefenseAbsent}{timerhash}
- )
- ? $self->{ $self->{shuttersDev} }{selfDefenseAbsent}{timerhash}
- : undef
- );
-}
-
-sub getLastDrive {
- my $self = shift;
-
- $self->{ $self->{shuttersDev} }{lastDrive} =
- ReadingsVal( $self->{shuttersDev}, 'ASC_ShuttersLastDrive', 'none' )
- if ( !defined( $self->{ $self->{shuttersDev} }{lastDrive} ) );
-
- return $self->{ $self->{shuttersDev} }{lastDrive};
-}
-
-sub getLastPos
-{ # letzte ermittelte Position bevor die Position des Rolladen über ASC geändert wurde
- my $self = shift;
-
- return (
- defined( $self->{ $self->{shuttersDev} }{lastPos} )
- && defined( $self->{ $self->{shuttersDev} }{lastPos}{VAL} )
- ? $self->{ $self->{shuttersDev} }{lastPos}{VAL}
- : 50
- );
-}
-
-sub getLastPosTimestamp {
- my $self = shift;
-
- return (
- defined( $self->{ $self->{shuttersDev} } )
- && defined( $self->{ $self->{shuttersDev} }{lastPos} )
- && defined( $self->{ $self->{shuttersDev} }{lastPos}{TIME} )
- ? $self->{ $self->{shuttersDev} }{lastPos}{TIME}
- : 0
- );
-}
-
-sub getLastManPos
-{ # letzte ermittelte Position bevor die Position des Rolladen manuell (nicht über ASC) geändert wurde
- my $self = shift;
-
- return (
- defined( $self->{ $self->{shuttersDev} }{lastManPos} )
- && defined( $self->{ $self->{shuttersDev} }{lastManPos}{VAL} )
- ? $self->{ $self->{shuttersDev} }{lastManPos}{VAL}
- : 50
- );
-}
-
-sub getLastManPosTimestamp {
- my $self = shift;
-
- return (
- defined( $self->{ $self->{shuttersDev} } )
- && defined( $self->{ $self->{shuttersDev} }{lastManPos} )
- && defined( $self->{ $self->{shuttersDev} }{lastManPos}{TIME} )
- ? $self->{ $self->{shuttersDev} }{lastManPos}{TIME}
- : 0
- );
-}
-
-sub getInTimerFuncHash {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }{inTimerFuncHash};
-}
-
-sub getSunsetUnixTime {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }{sunsettime};
-}
-
-sub getSunset {
- my $self = shift;
-
- return (
- defined( $self->{ $self->{shuttersDev} }{sunset} )
- ? $self->{ $self->{shuttersDev} }{sunset}
- : 0
- );
-}
-
-sub getSunriseUnixTime {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }{sunrisetime};
-}
-
-sub getSunrise {
- my $self = shift;
-
- return (
- defined( $self->{ $self->{shuttersDev} }{sunrise} )
- ? $self->{ $self->{shuttersDev} }{sunrise}
- : 0
- );
-}
-
-sub getRoommatesStatus {
- my $self = shift;
-
- my $loop = 0;
- my @roState;
- my %statePrio = (
- 'asleep' => 1,
- 'gotosleep' => 2,
- 'awoken' => 3,
- 'home' => 4,
- 'absent' => 5,
- 'gone' => 6,
- 'none' => 7
- );
- my $minPrio = 10;
-
- for my $ro ( split( ",", $shutters->getRoommates ) ) {
- $shutters->setRoommate($ro);
- my $currentPrio = $statePrio{ $shutters->_getRoommateStatus };
- $minPrio = $currentPrio if ( $minPrio > $currentPrio );
- }
-
- my %revStatePrio = reverse %statePrio;
- return $revStatePrio{$minPrio};
-}
-
-sub getRoommatesLastStatus {
- my $self = shift;
-
- my $loop = 0;
- my @roState;
- my %statePrio = (
- 'asleep' => 1,
- 'gotosleep' => 2,
- 'awoken' => 3,
- 'home' => 6,
- 'absent' => 5,
- 'gone' => 4,
- 'none' => 7
- );
- my $minPrio = 10;
-
- for my $ro ( split( ",", $shutters->getRoommates ) ) {
- $shutters->setRoommate($ro);
- my $currentPrio = $statePrio{ $shutters->_getRoommateLastStatus };
- $minPrio = $currentPrio if ( $minPrio > $currentPrio );
- }
-
- my %revStatePrio = reverse %statePrio;
- return $revStatePrio{$minPrio};
-}
-
-sub getOutTemp {
- my $self = shift;
-
- return ReadingsVal( $shutters->_getTempSensor,
- $shutters->getTempSensorReading, -100 );
-}
-
-sub getIdleDetection {
- my $self = shift;
-
- return ReadingsVal( $self->{shuttersDev},
- $shutters->_getIdleDetectionReading, 'none' );
-}
-
-### Begin Beschattung Objekt mit Daten befüllen
-sub setShadingStatus {
- my $self = shift;
- my $value = shift; ### Werte für value = in, out, in reserved, out reserved
-
- return
- if ( defined($value)
- && exists( $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} )
- && $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} eq $value );
-
- $shutters->setShadingLastStatus( ( $value eq 'in' ? 'out' : 'in' ) )
- if ( $value eq 'in'
- || $value eq 'out' );
-
- $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} = $value
- if ( defined($value) );
- $self->{ $self->{shuttersDev} }{ShadingStatus}{TIME} = int( gettimeofday() )
- if ( defined( $self->{ $self->{shuttersDev} }{ShadingStatus} ) );
-
- return;
-}
-
-sub setShadingLastStatus {
- my $self = shift;
- my $value = shift; ### Werte für value = in, out
-
- return
- if ( defined($value)
- && exists( $self->{ $self->{shuttersDev} }{ShadingLastStatus}{VAL} )
- && $self->{ $self->{shuttersDev} }{ShadingLastStatus}{VAL} eq $value );
-
- $self->{ $self->{shuttersDev} }{ShadingLastStatus}{VAL} = $value
- if ( defined($value) );
- $self->{ $self->{shuttersDev} }{ShadingLastStatus}{TIME} =
- int( gettimeofday() )
- if ( defined( $self->{ $self->{shuttersDev} }{ShadingLastStatus} ) );
- $self->{ $self->{shuttersDev} }{ShadingManualDriveStatus}{VAL} = 0
- if ( $value eq 'out' );
-
- return;
-}
-
-sub setShadingManualDriveStatus {
- my $self = shift;
- my $value = shift; ### Werte für value = 0, 1
-
- $self->{ $self->{shuttersDev} }{ShadingManualDriveStatus}{VAL} = $value
- if ( defined($value) );
-
- return;
-}
-
-sub setWindProtectionStatus { # Werte protected, unprotected
- my $self = shift;
- my $value = shift;
-
- $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{VAL} = $value
- if ( defined($value) );
-
- return;
-}
-
-sub setRainProtectionStatus { # Werte protected, unprotected
- my $self = shift;
- my $value = shift;
-
- $self->{ $self->{shuttersDev} }->{RainProtection}->{VAL} = $value
- if ( defined($value) );
- return;
-}
-
-sub setExternalTriggerState {
- my $self = shift;
- my $value = shift;
-
- $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{event} = $value
- if ( defined($value) );
-
- return;
-}
-
-sub setPushBrightnessInArray {
- my $self = shift;
- my $value = shift;
-
- unshift(
- @{ $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL} },
- $value
- );
- pop( @{ $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL} } )
- if (
- scalar(
- @{
- $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL}
- }
- ) > $shutters->getMaxBrightnessAverageArrayObjects
- );
-
- return;
-}
-
-sub getBrightnessAverage {
- my $self = shift;
-
- return FHEM::AutoShuttersControl::_averageBrightness(
- @{ $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL} } )
- if (
- ref( $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL} )
- eq 'ARRAY'
- && scalar(
- @{
- $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL}
- }
- ) > 0
- );
-
- return;
-}
-
-sub getShadingStatus { # Werte für value = in, out, in reserved, out reserved
- my $self = shift;
-
- return (
- defined( $self->{ $self->{shuttersDev} }{ShadingStatus} )
- && defined( $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} )
- ? $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL}
- : 'out'
- );
-}
-
-sub getShadingLastStatus { # Werte für value = in, out
- my $self = shift;
-
- return (
- defined( $self->{ $self->{shuttersDev} }{ShadingLastStatus} )
- && defined( $self->{ $self->{shuttersDev} }{ShadingLastStatus}{VAL} )
- ? $self->{ $self->{shuttersDev} }{ShadingLastStatus}{VAL}
- : 'out'
- );
-}
-
-sub getShadingManualDriveStatus { # Werte für value = 0, 1
- my $self = shift;
-
- return (
- defined( $self->{ $self->{shuttersDev} }{ShadingManualDriveStatus} )
- && defined(
- $self->{ $self->{shuttersDev} }{ShadingManualDriveStatus}{VAL}
- )
- ? $self->{ $self->{shuttersDev} }{ShadingManualDriveStatus}{VAL}
- : 0
- );
-}
-
-sub getIfInShading {
- my $self = shift;
-
- return (
- (
- $shutters->getShadingMode ne 'off'
- && $shutters->getShadingLastStatus eq 'out'
- ) ? 1 : 0
- );
-}
-
-sub getWindProtectionStatus { # Werte protected, unprotected
- my $self = shift;
-
- return (
- (
- defined( $self->{ $self->{shuttersDev} }->{ASC_WindParameters} )
- && defined(
- $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{VAL}
- )
- )
- ? $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{VAL}
- : 'unprotected'
- );
-}
-
-sub getRainProtectionStatus { # Werte protected, unprotected
- my $self = shift;
-
- return (
- (
- defined( $self->{ $self->{shuttersDev} }->{RainProtection} )
- && defined(
- $self->{ $self->{shuttersDev} }->{RainProtection}->{VAL}
- )
- )
- ? $self->{ $self->{shuttersDev} }->{RainProtection}->{VAL}
- : 'unprotected'
- );
-}
-
-sub getShadingStatusTimestamp {
- my $self = shift;
-
- return (
- defined( $self->{ $self->{shuttersDev} } )
- && defined( $self->{ $self->{shuttersDev} }{ShadingStatus} )
- && defined( $self->{ $self->{shuttersDev} }{ShadingStatus}{TIME} )
- ? $self->{ $self->{shuttersDev} }{ShadingStatus}{TIME}
- : 0
- );
-}
-
-sub getShadingLastStatusTimestamp {
- my $self = shift;
-
- return (
- defined( $self->{ $self->{shuttersDev} } )
- && defined( $self->{ $self->{shuttersDev} }{ShadingLastStatus} )
- && defined( $self->{ $self->{shuttersDev} }{ShadingLastStatus}{TIME} )
- ? $self->{ $self->{shuttersDev} }{ShadingLastStatus}{TIME}
- : 0
- );
-}
-### Ende Beschattung
-
-## Subklasse Attr von ASC_Shutters##
-package ASC_Shutters::Attr;
-
-use strict;
-use warnings;
-use utf8;
-
-use GPUtils qw(GP_Import);
-
-## Import der FHEM Funktionen
-BEGIN {
- GP_Import(
- qw(
- AttrVal
- CommandAttr
- gettimeofday)
- );
-}
-
-sub _setAttributs {
- my $shuttersDev = shift;
- my $attr = shift;
- my $attrVal = shift;
-
- CommandAttr( undef, $shuttersDev . ' ' . $attr . ' ' . $attrVal );
-
- return;
-}
-
-sub _getPosition {
- my $self = shift;
-
- my $attr = shift;
- my $userAttrList = shift;
-
- return $self->{ $self->{shuttersDev} }->{$attr}->{position}
- if (
- exists( $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} ) < 2
- );
- $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} =
- int( gettimeofday() );
-
- my $position;
- my $posAssignment;
-
- if (
- AttrVal( $self->{shuttersDev}, $attr,
- $userAttrList{$userAttrList}
- [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] ) =~
- m{\A\{.+\}\z}xms
- )
- {
- my $response = FHEM::AutoShuttersControl::_perlCodeCheck(
- AttrVal(
- $self->{shuttersDev},
- $attr,
- $userAttrList{$userAttrList}
- [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ]
- )
- );
-
- ( $position, $posAssignment ) = split ':', $response;
-
- $position = (
- $position =~ m{\A\d+(\.\d+)?\z}xms
- ? $position
- : $userAttrList{$userAttrList}
- [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ]
- );
-
- $posAssignment = (
- $posAssignment =~ m{\A\d+(\.\d+)?\z}xms
- ? $posAssignment
- : 'none'
- );
- }
- else {
- ( $position, $posAssignment ) =
- FHEM::AutoShuttersControl::GetAttrValues(
- $self->{shuttersDev},
- $attr,
- $userAttrList{$userAttrList}
- [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ]
- );
- }
-
- ### erwartetes Ergebnis
- # DEVICE:READING
- $self->{ $self->{shuttersDev} }->{$attr}->{position} = $position;
- $self->{ $self->{shuttersDev} }->{$attr}->{posAssignment} =
- $posAssignment;
-
- return $self->{ $self->{shuttersDev} }->{$attr}->{position};
-
- if (
- defined(
- FHEM::AutoShuttersControl::_perlCodeCheck(
- $self->{ $self->{shuttersDev} }->{$attr}->{position}
- )
- )
- )
- {
- $self->{ $self->{shuttersDev} }->{$attr}->{position} =
- FHEM::AutoShuttersControl::_perlCodeCheck(
- $self->{ $self->{shuttersDev} }->{$attr}->{position} );
- }
-
- return (
- $self->{ $self->{shuttersDev} }->{$attr}->{position} =~
- m{^\d+(\.\d+)?$}xms
- ? $self->{ $self->{shuttersDev} }->{$attr}->{position}
- : $userAttrList{$userAttrList}
- [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ]
- );
-}
-
-sub _getPositionAssignment {
- my $self = shift;
-
- my $attr = shift;
- my $getFn = shift;
-
- return $self->{ $self->{shuttersDev} }->{$attr}->{posAssignment}
- if (
- exists( $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} ) < 2
- );
- $shutters->$getFn;
-
- return ( $self->{ $self->{shuttersDev} }->{$attr}->{posAssignment} );
-}
-
-sub setAntiFreezePos {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_Antifreeze_Pos', $attrVal );
-
- return;
-}
-
-sub getAntiFreezePos {
- my $self = shift;
-
- return $shutters->_getPosition( 'ASC_Antifreeze_Pos',
-'ASC_Antifreeze_Pos:5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100'
- );
-}
-
-sub getAntiFreezePosAssignment {
- my $self = shift;
-
- return $shutters->_getPositionAssignment( 'ASC_Antifreeze_Pos',
- 'getAntiFreezePos' );
-}
-
-sub setShuttersPlace {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_ShuttersPlace', $attrVal );
-
- return;
-}
-
-sub getShuttersPlace {
- my $self = shift;
-
- return AttrVal( $self->{shuttersDev}, 'ASC_ShuttersPlace', 'window' );
-}
-
-sub setSlatPosCmd {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_SlatPosCmd_SlatDevice',
- $attrVal );
-
- return;
-}
-
-sub getSlatPosCmd {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
- ->{poscmd}
- if (
- exists(
- $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
- ->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
- ->{LASTGETTIME} ) < 2
- );
- $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}->{LASTGETTIME}
- = int( gettimeofday() );
- my ( $slatPosCmd, $slatDevice ) =
- FHEM::AutoShuttersControl::GetAttrValues( $self->{shuttersDev},
- 'ASC_SlatPosCmd_SlatDevice', 'none:none' );
-
- ## Erwartetes Ergebnis
- # upTime:upBrightnessVal
-
- $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}->{poscmd} =
- $slatPosCmd;
- $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}->{device} =
- $slatDevice;
-
- return $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
- ->{poscmd};
-}
-
-sub getSlatDevice {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
- ->{device}
- if (
- exists(
- $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
- ->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
- ->{LASTGETTIME} ) < 2
- );
- $shutters->getSlatPosCmd;
-
- return (
- $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}->{device}
- );
-}
-
-sub setPrivacyUpTime {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_PrivacyUpValue_beforeDayOpen',
- $attrVal );
-
- return;
-}
-
-sub getPrivacyUpTime {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
- ->{uptime}
- if (
- exists(
- $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
- ->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
- ->{LASTGETTIME} ) < 2
- );
- $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
- ->{LASTGETTIME} = int( gettimeofday() );
- my ( $upTime, $upBrightnessVal ) =
- FHEM::AutoShuttersControl::GetAttrValues( $self->{shuttersDev},
- 'ASC_PrivacyUpValue_beforeDayOpen', '-1:-1' );
-
- ## Erwartetes Ergebnis
- # upTime:upBrightnessVal
-
- $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
- ->{uptime} = $upTime;
- $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
- ->{upbrightnessval} =
- ( $upBrightnessVal ne 'none' ? $upBrightnessVal : -1 );
-
- $shutters->setPrivacyUpStatus(0)
- if ( defined( $shutters->getPrivacyUpStatus )
- && $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
- ->{uptime} == -1 );
-
- return $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
- ->{uptime};
-}
-
-sub getPrivacyUpBrightnessVal {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
- ->{upbrightnessval}
- if (
- exists(
- $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
- ->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
- ->{LASTGETTIME} ) < 2
- );
- $shutters->getPrivacyUpTime;
-
- return (
- defined(
- $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
- ->{upbrightnessval}
- )
- ? $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
- ->{upbrightnessval}
- : -1
- );
-}
-
-sub setPrivacyDownTime {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev},
- 'ASC_PrivacyDownValue_beforeNightClose', $attrVal );
-
- return;
-}
-
-sub getPrivacyDownTime {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }
- ->{ASC_PrivacyDownValue_beforeNightClose}->{downtime}
- if (
- exists(
- $self->{ $self->{shuttersDev} }
- ->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }
- ->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME} ) < 2
- );
- $self->{ $self->{shuttersDev} }->{ASC_PrivacyDownValue_beforeNightClose}
- ->{LASTGETTIME} = int( gettimeofday() );
- my ( $downTime, $downBrightnessVal ) =
- FHEM::AutoShuttersControl::GetAttrValues( $self->{shuttersDev},
- 'ASC_PrivacyDownValue_beforeNightClose', '-1:-1' );
-
- ## Erwartetes Ergebnis
- # downTime:downBrightnessVal
-
- $self->{ $self->{shuttersDev} }->{ASC_PrivacyDownValue_beforeNightClose}
- ->{downtime} = $downTime;
- $self->{ $self->{shuttersDev} }->{ASC_PrivacyDownValue_beforeNightClose}
- ->{downbrightnessval} =
- ( $downBrightnessVal ne 'none' ? $downBrightnessVal : -1 );
-
- $shutters->setPrivacyDownStatus(0)
- if ( defined( $shutters->getPrivacyDownStatus )
- && $self->{ $self->{shuttersDev} }
- ->{ASC_PrivacyDownValue_beforeNightClose}->{downtime} == -1 );
-
- return $self->{ $self->{shuttersDev} }
- ->{ASC_PrivacyDownValue_beforeNightClose}->{downtime};
-}
-
-sub getPrivacyDownBrightnessVal {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }
- ->{ASC_PrivacyDownValue_beforeNightClose}->{downbrightnessval}
- if (
- exists(
- $self->{ $self->{shuttersDev} }
- ->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }
- ->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME} ) < 2
- );
- $shutters->getPrivacyDownTime;
-
- return (
- defined(
- $self->{ $self->{shuttersDev} }
- ->{ASC_PrivacyDownValue_beforeNightClose}->{downbrightnessval}
- )
- ? $self->{ $self->{shuttersDev} }
- ->{ASC_PrivacyDownValue_beforeNightClose}->{downbrightnessval}
- : -1
- );
-}
-
-sub setPrivacyUpPos {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_PrivacyUp_Pos', $attrVal );
-
- return;
-}
-
-sub getPrivacyUpPos {
- my $self = shift;
-
- return $shutters->_getPosition( 'ASC_PrivacyUp_Pos', 'ASC_PrivacyUp_Pos' );
-}
-
-sub getPrivacyUpPositionAssignment {
- my $self = shift;
-
- return $shutters->_getPositionAssignment( 'ASC_PrivacyUp_Pos',
- 'getPrivacyUpPos' );
-}
-
-sub setPrivacyDownPos {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_PrivacyDown_Pos', $attrVal );
-
- return;
-}
-
-sub getPrivacyDownPos {
- my $self = shift;
-
- return $shutters->_getPosition( 'ASC_PrivacyDown_Pos',
- 'ASC_PrivacyDown_Pos' );
-}
-
-sub getPrivacyDownPositionAssignment {
- my $self = shift;
-
- return $shutters->_getPositionAssignment( 'ASC_PrivacyDown_Pos',
- 'getPrivacyDownPos' );
-}
-
-sub setSelfDefenseMode {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_Self_Defense_Mode', $attrVal );
-
- return;
-}
-
-sub getSelfDefenseMode {
- my $self = shift;
-
- return AttrVal( $self->{shuttersDev}, 'ASC_Self_Defense_Mode', 'gone' );
-}
-
-sub setSelfDefenseAbsentDelay {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_Self_Defense_AbsentDelay',
- $attrVal );
-
- return;
-}
-
-sub getSelfDefenseAbsentDelay {
- my $self = shift;
-
- return AttrVal( $self->{shuttersDev}, 'ASC_Self_Defense_AbsentDelay', 300 );
-}
-
-sub setWiggleValue {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_WiggleValue', $attrVal );
-
- return;
-}
-
-sub getWiggleValue {
- my $self = shift;
-
- return AttrVal( $self->{shuttersDev}, 'ASC_WiggleValue', 5 );
-}
-
-sub setAdv {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_Adv', $attrVal );
-
- return;
-}
-
-sub getAdv {
- my $self = shift;
-
- return (
- AttrVal( $self->{shuttersDev}, 'ASC_Adv', 'off' ) eq 'on'
- ? ( FHEM::AutoShuttersControl::_IsAdv == 1 ? 1 : 0 )
- : 0
- );
-}
-
-### Begin Beschattung
-sub setShadingPos {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_Shading_Pos', $attrVal );
-
- return;
-}
-
-sub getShadingPos {
- my $self = shift;
-
- return $shutters->_getPosition( 'ASC_Shading_Pos',
- 'ASC_Shading_Pos:10,20,30,40,50,60,70,80,90,100' );
-}
-
-sub getShadingPositionAssignment {
- my $self = shift;
-
- return $shutters->_getPositionAssignment( 'ASC_Shading_Pos',
- 'getShadingPos' );
-}
-
-sub setShadingMode {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_Shading_Mode', $attrVal );
-
- return;
-}
-
-sub getShadingMode {
- my $self = shift;
-
- return AttrVal( $self->{shuttersDev}, 'ASC_Shading_Mode', 'off' );
-}
-
-sub _getTempSensor {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{device}
- if (
- exists(
- $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} )
- < 2
- );
- $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} =
- int( gettimeofday() );
- my ( $device, $reading ) =
- FHEM::AutoShuttersControl::GetAttrValues( $self->{shuttersDev},
- 'ASC_TempSensor', 'none' );
-
- ### erwartetes Ergebnis
- # DEVICE:READING
- $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{device} = $device;
- $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{reading} =
- ( $reading ne 'none' ? $reading : 'temperature' );
-
- return $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{device};
-}
-
-sub getTempSensorReading {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{reading}
- if (
- exists(
- $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} )
- < 2
- );
- $shutters->_getTempSensor;
-
- return (
- defined( $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{reading} )
- ? $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{reading}
- : 'temperature'
- );
-}
-
-sub setIdleDetectionReading {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_Shutter_IdleDetection',
- $attrVal );
-
- return;
-}
-
-sub _getIdleDetectionReading {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
- ->{reading}
- if (
- exists(
- $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
- ->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
- ->{LASTGETTIME} ) < 2
- );
- $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}->{LASTGETTIME}
- = int( gettimeofday() );
- my ( $reading, $value ) =
- FHEM::AutoShuttersControl::GetAttrValues( $self->{shuttersDev},
- 'ASC_Shutter_IdleDetection', 'none' );
-
- ### erwartetes Ergebnis
- # READING:VALUE
- $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}->{reading} =
- $reading;
- $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}->{value} =
- $value;
-
- return $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
- ->{reading};
-}
-
-sub getIdleDetectionValue {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}->{value}
- if (
- exists(
- $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
- ->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
- ->{LASTGETTIME} ) < 2
- );
- $shutters->_getIdleDetectionReading;
-
- return (
- defined(
- $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
- ->{value}
- )
- ? $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}->{value}
- : 'none'
- );
-}
-
-sub setBrightnessSensor {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_BrightnessSensor', $attrVal );
-
- return;
-}
-
-sub _getBrightnessSensor {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{device}
- if (
- exists(
- $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
- ->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
- ->{LASTGETTIME} ) < 2
- );
- $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{LASTGETTIME} =
- int( gettimeofday() );
- my ( $device, $reading, $max, $min ) =
- FHEM::AutoShuttersControl::GetAttrValues( $self->{shuttersDev},
- 'ASC_BrightnessSensor', 'none' );
-
- ### erwartetes Ergebnis
- # DEVICE:READING MAX:MIN
- $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{device} = $device;
- $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{reading} =
- ( $reading ne 'none' ? $reading : 'brightness' );
- $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{triggermin} =
- ( $min ne 'none' ? $min : -1 );
- $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{triggermax} =
- ( $max ne 'none' ? $max : -1 );
-
- return $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{device};
-}
-
-sub getBrightnessReading {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{reading}
- if (
- exists(
- $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
- ->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
- ->{LASTGETTIME} ) < 2
- );
- $shutters->_getBrightnessSensor;
-
- return (
- defined(
- $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{reading}
- )
- ? $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{reading}
- : 'brightness'
- );
-}
-
-sub getShadingAzimuthLeft {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
- ->{leftVal}
- if (
- exists(
- $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
- ->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
- ->{LASTGETTIME} ) < 2
- );
- $shutters->getShadingAzimuthRight;
-
- return $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
- ->{leftVal};
-}
-
-sub setShadingInOutAzimuth {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_Shading_InOutAzimuth', $attrVal );
-
- return;
-}
-
-sub getShadingAzimuthRight {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
- ->{rightVal}
- if (
- exists(
- $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
- ->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
- ->{LASTGETTIME} ) < 2
- );
- $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}->{LASTGETTIME}
- = int( gettimeofday() );
- my ( $left, $right ) =
- FHEM::AutoShuttersControl::GetAttrValues( $self->{shuttersDev},
- 'ASC_Shading_InOutAzimuth', '95:265' );
-
- ### erwartetes Ergebnis
- # MIN:MAX
-
- $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}->{leftVal} =
- $left;
- $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}->{rightVal} =
- $right;
-
- return $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
- ->{rightVal};
-}
-
-sub setShadingMinOutsideTemperature {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_Shading_Min_OutsideTemperature',
- $attrVal );
-
- return;
-}
-
-sub getShadingMinOutsideTemperature {
- my $self = shift;
-
- return AttrVal( $self->{shuttersDev}, 'ASC_Shading_Min_OutsideTemperature',
- 18 );
-}
-
-sub setShadingMinMaxElevation {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_Shading_MinMax_Elevation',
- $attrVal );
-
- return;
-}
-
-sub getShadingMinElevation {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
- ->{minVal}
- if (
- exists(
- $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
- ->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
- ->{LASTGETTIME} ) < 2
- );
- $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
- ->{LASTGETTIME} = int( gettimeofday() );
- my ( $min, $max ) =
- FHEM::AutoShuttersControl::GetAttrValues( $self->{shuttersDev},
- 'ASC_Shading_MinMax_Elevation', '25.0:100.0' );
-
- ### erwartetes Ergebnis
- # MIN:MAX
-
- $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}->{minVal} =
- $min;
- $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}->{maxVal} =
- ( $max ne 'none' ? $max : 100 );
-
- return $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
- ->{minVal};
-}
-
-sub getShadingMaxElevation {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
- ->{maxVal}
- if (
- exists(
- $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
- ->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
- ->{LASTGETTIME} ) < 2
- );
- $shutters->getShadingMinElevation;
-
- return $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
- ->{maxVal};
-}
-
-sub setShadingStateChangeSunnyCloudy {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_Shading_StateChange_SunnyCloudy',
- $attrVal );
-
- return;
-}
-
-sub getShadingStateChangeSunny {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }
- ->{ASC_Shading_StateChange_SunnyCloudy}->{sunny}
- if (
- exists(
- $self->{ $self->{shuttersDev} }
- ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }
- ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} ) < 2
- );
- $self->{ $self->{shuttersDev} }->{ASC_Shading_StateChange_SunnyCloudy}
- ->{LASTGETTIME} = int( gettimeofday() );
- my ( $sunny, $cloudy, $maxBrightnessAverageArrayObjects ) =
- FHEM::AutoShuttersControl::GetAttrValues( $self->{shuttersDev},
- 'ASC_Shading_StateChange_SunnyCloudy',
- '35000:20000' );
-
- ### erwartetes Ergebnis
- # SUNNY:CLOUDY [BrightnessAverage]
-
- $self->{ $self->{shuttersDev} }->{ASC_Shading_StateChange_SunnyCloudy}
- ->{sunny} = $sunny;
- $self->{ $self->{shuttersDev} }->{ASC_Shading_StateChange_SunnyCloudy}
- ->{cloudy} = $cloudy;
- $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{MAXOBJECT} = (
- defined($maxBrightnessAverageArrayObjects)
- && $maxBrightnessAverageArrayObjects ne 'none'
- ? $maxBrightnessAverageArrayObjects
- : 3
- );
-
- return $self->{ $self->{shuttersDev} }
- ->{ASC_Shading_StateChange_SunnyCloudy}->{sunny};
-}
-
-sub getShadingStateChangeCloudy {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }
- ->{ASC_Shading_StateChange_SunnyCloudy}->{cloudy}
- if (
- exists(
- $self->{ $self->{shuttersDev} }
- ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }
- ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} ) < 2
- );
- $shutters->getShadingStateChangeSunny;
-
- return $self->{ $self->{shuttersDev} }
- ->{ASC_Shading_StateChange_SunnyCloudy}->{cloudy};
-}
-
-sub getMaxBrightnessAverageArrayObjects {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}
- ->{MAXOBJECT}
- if (
- exists(
- $self->{ $self->{shuttersDev} }
- ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }
- ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} ) < 2
- );
- $shutters->getShadingStateChangeSunny;
-
- return $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}
- ->{MAXOBJECT};
-}
-
-sub setShadingWaitingPeriod {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_Shading_WaitingPeriod',
- $attrVal );
-
- return;
-}
-
-sub getShadingWaitingPeriod {
- my $self = shift;
-
- return AttrVal( $self->{shuttersDev}, 'ASC_Shading_WaitingPeriod', 1200 );
-}
-### Ende Beschattung
-sub setExternalTrigger {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_ExternalTrigger', $attrVal );
-
- return;
-}
-
-sub getExternalTriggerDevice {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{device}
- if (
- exists(
- $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
- ->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
- ->{LASTGETTIME} ) < 2
- );
- $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{LASTGETTIME} =
- int( gettimeofday() );
- my ( $device, $reading, $valueActive, $valueInactive, $posActive,
- $posInactive, $valueActive2, $posActive2 )
- = FHEM::AutoShuttersControl::GetAttrValues( $self->{shuttersDev},
- 'ASC_ExternalTrigger', 'none' );
-
- ### erwartetes Ergebnis
-# DEVICE:READING VALUEACTIVE:VALUEINACTIVE POSACTIVE:POSINACTIVE VALUEACTIVE2:POSACTIVE2
-
- $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{device} =
- $device;
- $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{reading} =
- $reading;
- $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{valueactive} =
- $valueActive;
- $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{valueinactive} =
- $valueInactive;
- $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive} =
- $posActive;
- $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posinactive} =
- ( $posInactive ne 'none' ? $posInactive : $shutters->getLastPos );
- $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{valueactive2} =
- $valueActive2;
- $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive2} =
- $posActive2;
-
- return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{device};
-
-}
-
-sub getExternalTriggerReading {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{reading}
- if (
- exists(
- $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
- ->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
- ->{LASTGETTIME} ) < 2
- );
- $shutters->getExternalTriggerDevice;
-
- return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{reading};
-}
-
-sub getExternalTriggerValueActive {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{valueactive}
- if (
- exists(
- $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
- ->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
- ->{LASTGETTIME} ) < 2
- );
- $shutters->getExternalTriggerDevice;
-
- return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
- ->{valueactive};
-}
-
-sub getExternalTriggerValueActive2 {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
- ->{valueactive2}
- if (
- exists(
- $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
- ->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
- ->{LASTGETTIME} ) < 2
- );
- $shutters->getExternalTriggerDevice;
-
- return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
- ->{valueactive2};
-}
-
-sub getExternalTriggerValueInactive {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
- ->{valueinactive}
- if (
- exists(
- $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
- ->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
- ->{LASTGETTIME} ) < 2
- );
- $shutters->getExternalTriggerDevice;
-
- return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
- ->{valueinactive};
-}
-
-sub getExternalTriggerPosActive {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive}
- if (
- exists(
- $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
- ->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
- ->{LASTGETTIME} ) < 2
- );
- $shutters->getExternalTriggerDevice;
-
- return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive};
-}
-
-sub getExternalTriggerPosActive2 {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive2}
- if (
- exists(
- $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
- ->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
- ->{LASTGETTIME} ) < 2
- );
- $shutters->getExternalTriggerDevice;
-
- return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive2};
-}
-
-sub getExternalTriggerPosInactive {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posinactive}
- if (
- exists(
- $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
- ->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
- ->{LASTGETTIME} ) < 2
- );
- $shutters->getExternalTriggerDevice;
-
- return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
- ->{posinactive};
-}
-
-sub getExternalTriggerState {
- my $self = shift;
-
- return (
- (
- defined(
- $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{event}
- )
- and
- $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{event}
- ) ? 1 : 0
- );
-}
-
-sub setDelay {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_Drive_Delay', $attrVal );
-
- return;
-}
-
-sub getDelay {
- my $self = shift;
-
- my $val = AttrVal( $self->{shuttersDev}, 'ASC_Drive_Delay', -1 );
- return ( $val =~ m{^\d+$}xms ? $val : -1 );
-}
-
-sub setDelayStart {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_Drive_DelayStart', $attrVal );
-
- return;
-}
-
-sub getDelayStart {
- my $self = shift;
-
- my $val = AttrVal( $self->{shuttersDev}, 'ASC_Drive_DelayStart', -1 );
- return ( ( $val > 0 && $val =~ m{^\d+$}xms ) ? $val : -1 );
-}
-
-sub setBlockingTimeAfterManual {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_BlockingTime_afterManual',
- $attrVal );
-
- return;
-}
-
-sub getBlockingTimeAfterManual {
- my $self = shift;
-
- return AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_afterManual',
- 1200 );
-}
-
-sub setBlockingTimeBeforNightClose {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_BlockingTime_beforNightClose',
- $attrVal );
-
- return;
-}
-
-sub getBlockingTimeBeforNightClose {
- my $self = shift;
-
- return AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_beforNightClose',
- 3600 );
-}
-
-sub setBlockingTimeBeforDayOpen {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_BlockingTime_beforDayOpen',
- $attrVal );
-
- return;
-}
-
-sub getBlockingTimeBeforDayOpen {
- my $self = shift;
-
- return AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_beforDayOpen',
- 3600 );
-}
-
-sub setPosCmd {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_Pos_Reading', $attrVal );
-
- return;
-}
-
-sub getPosCmd {
- my $self = shift;
-
- return AttrVal( $self->{shuttersDev}, 'ASC_Pos_Reading',
- $userAttrList{'ASC_Pos_Reading'}
- [ AttrVal( $self->{shuttersDev}, 'ASC', 1 ) ] );
-}
-
-sub setOpenPos {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_Open_Pos', $attrVal );
-
- return;
-}
-
-sub getOpenPos {
- my $self = shift;
-
- return $shutters->_getPosition( 'ASC_Open_Pos',
- 'ASC_Open_Pos:0,10,20,30,40,50,60,70,80,90,100' );
-}
-
-sub getOpenPositionAssignment {
- my $self = shift;
-
- return $shutters->_getPositionAssignment( 'ASC_Open_Pos', 'getOpenPos' );
-}
-
-sub setVentilatePos {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_Ventilate_Pos', $attrVal );
-
- return;
-}
-
-sub getVentilatePos {
- my $self = shift;
-
- return $shutters->_getPosition( 'ASC_Ventilate_Pos',
- 'ASC_Ventilate_Pos:10,20,30,40,50,60,70,80,90,100' );
-}
-
-sub getVentilatePositionAssignment {
- my $self = shift;
-
- return $shutters->_getPositionAssignment( 'ASC_Ventilate_Pos',
- 'getVentilatePos' );
-}
-
-sub setVentilatePosAfterDayClosed {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_WindowRec_PosAfterDayClosed',
- $attrVal );
-
- return;
-}
-
-sub getVentilatePosAfterDayClosed {
- my $self = shift;
-
- return AttrVal( $self->{shuttersDev}, 'ASC_WindowRec_PosAfterDayClosed',
- 'open' );
-}
-
-sub setClosedPos {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_Closed_Pos', $attrVal );
-
- return;
-}
-
-sub getClosedPos {
- my $self = shift;
-
- return $shutters->_getPosition( 'ASC_Closed_Pos',
- 'ASC_Closed_Pos:0,10,20,30,40,50,60,70,80,90,100' );
-}
-
-sub getClosedPositionAssignment {
- my $self = shift;
-
- return $shutters->_getPositionAssignment( 'ASC_Closed_Pos',
- 'getClosedPos' );
-}
-
-sub setSleepPos {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_Sleep_Pos', $attrVal );
-
- return;
-}
-
-sub getSleepPos {
- my $self = shift;
-
- return $shutters->_getPosition( 'ASC_Sleep_Pos',
- 'ASC_Sleep_Pos:0,10,20,30,40,50,60,70,80,90,100' );
-}
-
-sub getSleepPositionAssignment {
- my $self = shift;
-
- return $shutters->_getPositionAssignment( 'ASC_Sleep_Pos', 'getSleepPos' );
-}
-
-sub setVentilateOpen {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_Ventilate_Window_Open',
- $attrVal );
-
- return;
-}
-
-sub getVentilateOpen {
- my $self = shift;
-
- return AttrVal( $self->{shuttersDev}, 'ASC_Ventilate_Window_Open', 'on' );
-}
-
-sub setComfortOpenPos {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_ComfortOpen_Pos', $attrVal );
-
- return;
-}
-
-sub getComfortOpenPos {
- my $self = shift;
-
- return $shutters->_getPosition( 'ASC_ComfortOpen_Pos',
- 'ASC_ComfortOpen_Pos:0,10,20,30,40,50,60,70,80,90,100' );
-}
-
-sub getComfortOpenPositionAssignment {
- my $self = shift;
-
- return $shutters->_getPositionAssignment( 'ASC_ComfortOpen_Pos',
- 'getComfortOpenPos' );
-}
-
-sub setPartyMode {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_Partymode', $attrVal );
-
- return;
-}
-
-sub getPartyMode {
- my $self = shift;
-
- return AttrVal( $self->{shuttersDev}, 'ASC_Partymode', 'off' );
-}
-
-sub setRoommates {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_Roommate_Device', $attrVal );
-
- return;
-}
-
-sub getRoommates {
- my $self = shift;
-
- return AttrVal( $self->{shuttersDev}, 'ASC_Roommate_Device', 'none' );
-}
-
-sub setRoommatesReading {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_Roommate_Reading', $attrVal );
-
- return;
-}
-
-sub getRoommatesReading {
- my $self = shift;
-
- return AttrVal( $self->{shuttersDev}, 'ASC_Roommate_Reading', 'state' );
-}
-
-sub getWindPos {
- my $self = shift;
-
- my $name = $self->{name};
-
- return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{closedPos}
- if (
- exists(
- $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
- ) < 2
- );
- $shutters->getWindMax;
-
- return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{closedPos};
-}
-
-sub getWindMax {
- my $self = shift;
-
- my $name = $self->{name};
-
- return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggermax}
- if (
- exists(
- $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
- ) < 2
- );
- $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME} =
- int( gettimeofday() );
- my ( $max, $hyst, $pos ) =
- FHEM::AutoShuttersControl::GetAttrValues( $self->{shuttersDev},
- 'ASC_WindParameters', '50:20' );
-
- ## Erwartetes Ergebnis
- # max:hyst pos
-
- $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggermax} = $max;
- $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggerhyst} =
- ( $hyst ne 'none' ? $max - $hyst : $max - 20 );
- $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{closedPos} =
- ( $pos ne 'none' ? $pos : $shutters->getOpenPos );
-
- return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggermax};
-}
-
-sub setWindParameters {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_WindParameters', $attrVal );
-
- return;
-}
-
-sub getWindMin {
- my $self = shift;
-
- my $name = $self->{name};
-
- return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggerhyst}
- if (
- exists(
- $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
- ) < 2
- );
- $shutters->getWindMax;
-
- return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggerhyst};
-}
-
-sub setWindProtection {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_WindProtection', $attrVal );
-
- return;
-}
-
-sub getWindProtection {
- my $self = shift;
-
- return AttrVal( $self->{shuttersDev}, 'ASC_WindProtection', 'off' );
-}
-
-sub setRainProtection {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_RainProtection', $attrVal );
-
- return;
-}
-
-sub getRainProtection {
- my $self = shift;
-
- return AttrVal( $self->{shuttersDev}, 'ASC_RainProtection', 'off' );
-}
-
-sub setModeUp {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_Mode_Up', $attrVal );
-
- return;
-}
-
-sub getModeUp {
- my $self = shift;
-
- return AttrVal( $self->{shuttersDev}, 'ASC_Mode_Up', 'always' );
-}
-
-sub setModeDown {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_Mode_Down', $attrVal );
-
- return;
-}
-
-sub getModeDown {
- my $self = shift;
-
- return AttrVal( $self->{shuttersDev}, 'ASC_Mode_Down', 'always' );
-}
-
-sub setLockOut {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_LockOut', $attrVal );
-
- return;
-}
-
-sub getLockOut {
- my $self = shift;
-
- return AttrVal( $self->{shuttersDev}, 'ASC_LockOut', 'off' );
-}
-
-sub setLockOutCmd {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_LockOut_Cmd', $attrVal );
-
- return;
-}
-
-sub getLockOutCmd {
- my $self = shift;
-
- return AttrVal( $self->{shuttersDev}, 'ASC_LockOut_Cmd', 'none' );
-}
-
-sub setAntiFreeze {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_Antifreeze', $attrVal );
-
- return;
-}
-
-sub getAntiFreeze {
- my $self = shift;
-
- return AttrVal( $self->{shuttersDev}, 'ASC_Antifreeze', 'off' );
-}
-
-sub setAutoAstroModeMorning {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_AutoAstroModeMorning', $attrVal );
-
- return;
-}
-
-sub getAutoAstroModeMorning {
- my $self = shift;
-
- return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeMorning', 'none' );
-}
-
-sub setAutoAstroModeEvening {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_AutoAstroModeEvening', $attrVal );
-
- return;
-}
-
-sub getAutoAstroModeEvening {
- my $self = shift;
-
- return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeEvening', 'none' );
-}
-
-sub setAutoAstroModeMorningHorizon {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_AutoAstroModeMorningHorizon',
- $attrVal );
-
- return;
-}
-
-sub getAutoAstroModeMorningHorizon {
- my $self = shift;
-
- return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeMorningHorizon',
- 0 );
-}
-
-sub setAutoAstroModeEveningHorizon {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_AutoAstroModeEveningHorizon',
- $attrVal );
-
- return;
-}
-
-sub getAutoAstroModeEveningHorizon {
- my $self = shift;
-
- return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeEveningHorizon',
- 0 );
-}
-
-sub setUp {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_Up', $attrVal );
-
- return;
-}
-
-sub getUp {
- my $self = shift;
-
- return AttrVal( $self->{shuttersDev}, 'ASC_Up', 'astro' );
-}
-
-sub setDown {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_Down', $attrVal );
-
- return;
-}
-
-sub getDown {
- my $self = shift;
-
- return AttrVal( $self->{shuttersDev}, 'ASC_Down', 'astro' );
-}
-
-sub setTimeUpEarly {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_Time_Up_Early', $attrVal );
-
- return;
-}
-
-sub getTimeUpEarly {
- my $self = shift;
-
- my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_Early', '05:00' );
-
- if ( defined( FHEM::AutoShuttersControl::_perlCodeCheck($val) ) ) {
- $val = FHEM::AutoShuttersControl::_perlCodeCheck($val);
- }
-
- return (
- $val =~ m{^(?:[01]?\d|2[0-3]):(?:[0-5]\d)(:(?:[0-5]\d))?$}xms
- ? $val
- : '05:00'
- );
-}
-
-sub setTimeUpLate {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_Time_Up_Late', $attrVal );
-
- return;
-}
-
-sub getTimeUpLate {
- my $self = shift;
-
- my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_Late', '08:30' );
-
- if ( defined( FHEM::AutoShuttersControl::_perlCodeCheck($val) ) ) {
- $val = FHEM::AutoShuttersControl::_perlCodeCheck($val);
- }
-
- return (
- $val =~ m{^(?:[01]?\d|2[0-3]):(?:[0-5]\d)(:(?:[0-5]\d))?$}xms
- ? $val
- : '08:30'
- );
-}
-
-sub setTimeDownEarly {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_Time_Down_Early', $attrVal );
-
- return;
-}
-
-sub getTimeDownEarly {
- my $self = shift;
-
- my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Down_Early', '16:00' );
-
- if ( defined( FHEM::AutoShuttersControl::_perlCodeCheck($val) ) ) {
- $val = FHEM::AutoShuttersControl::_perlCodeCheck($val);
- }
-
- return (
- $val =~ m{^(?:[01]?\d|2[0-3]):(?:[0-5]\d)(:(?:[0-5]\d))?$}xms
- ? $val
- : '16:00'
- );
-}
-
-sub setTimeDownLate {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_Time_Down_Late', $attrVal );
-
- return;
-}
-
-sub getTimeDownLate {
- my $self = shift;
-
- my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Down_Late', '22:00' );
-
- if ( defined( FHEM::AutoShuttersControl::_perlCodeCheck($val) ) ) {
- $val = FHEM::AutoShuttersControl::_perlCodeCheck($val);
- }
-
- return (
- $val =~ m{^(?:[01]?\d|2[0-3]):(?:[0-5]\d)(:(?:[0-5]\d))?$}xms
- ? $val
- : '22:00'
- );
-}
-
-sub setTimeUpWeHoliday {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_Time_Up_WE_Holiday', $attrVal );
-
- return;
-}
-
-sub getTimeUpWeHoliday {
- my $self = shift;
-
- my $val =
- AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_WE_Holiday', '01:25' );
-
- if ( defined( FHEM::AutoShuttersControl::_perlCodeCheck($val) ) ) {
- $val = FHEM::AutoShuttersControl::_perlCodeCheck($val);
- }
-
- return (
- $val =~ m{^(?:[01]?\d|2[0-3]):(?:[0-5]\d)(:(?:[0-5]\d))?$}xms
- ? $val
- : '01:25'
- );
-}
-
-sub getBrightnessMinVal {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{triggermin}
- if (
- exists(
- $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
- ->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
- ->{LASTGETTIME} ) < 2
- );
- $shutters->_getBrightnessSensor;
-
- return $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
- ->{triggermin};
-}
-
-sub getBrightnessMaxVal {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{triggermax}
- if (
- exists(
- $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
- ->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
- ->{LASTGETTIME} ) < 2
- );
- $shutters->_getBrightnessSensor;
-
- return $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
- ->{triggermax};
-}
-
-sub setDriveUpMaxDuration {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_DriveUpMaxDuration', $attrVal );
-
- return;
-}
-
-sub getDriveUpMaxDuration {
- my $self = shift;
-
- return AttrVal( $self->{shuttersDev}, 'ASC_DriveUpMaxDuration', 60 );
-}
-
-## Subklasse Readings von ASC_Shutters ##
-package ASC_Shutters::Readings;
-
-use strict;
-use warnings;
-use utf8;
-
-use GPUtils qw(GP_Import);
-
-## Import der FHEM Funktionen
-BEGIN {
- GP_Import(
- qw(
- ReadingsVal
- ReadingsNum)
- );
-}
-
-sub getBrightness {
- my $self = shift;
-
- return ReadingsNum( $shutters->_getBrightnessSensor,
- $shutters->getBrightnessReading, -1 );
-}
-
-sub getWindStatus {
- my $self = shift;
-
- return ReadingsVal( $ascDev->_getWindSensor,
- $ascDev->getWindSensorReading, -1 );
-}
-
-sub getStatus {
- my $self = shift;
-
- return ReadingsNum( $self->{shuttersDev}, $shutters->getPosCmd, 0 );
-}
-
-sub getDelayCmd {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }{delayCmd};
-}
-
-sub getASCenable {
- my $self = shift;
-
- return ReadingsVal( $self->{shuttersDev}, 'ASC_Enable', 'on' );
-}
-
-## Klasse Fenster (Window) und die Subklassen Attr und Readings ##
-package ASC_Window;
-
-use strict;
-use warnings;
-use utf8;
-
-our @ISA = qw(ASC_Window::Attr ASC_Window::Readings);
-
-## Subklasse Attr von Klasse ASC_Window ##
-package ASC_Window::Attr;
-
-use strict;
-use warnings;
-use utf8;
-
-use GPUtils qw(GP_Import);
-
-## Import der FHEM Funktionen
-BEGIN {
- GP_Import(
- qw(
- AttrVal
- gettimeofday)
- );
-}
-
-sub setSubTyp {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_WindowRec_subType', $attrVal );
-
- return;
-}
-
-sub getSubTyp {
- my $self = shift;
-
- return AttrVal( $self->{shuttersDev}, 'ASC_WindowRec_subType', 'twostate' );
-}
-
-sub setWinDev {
- my $self = shift;
- my $attrVal = shift;
-
- _setAttributs( $self->{shuttersDev}, 'ASC_WindowRec', $attrVal );
-
- return;
-}
-
-sub _getWinDev {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{device}
- if (
- exists(
- $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} ) <
- 2
- );
- $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} =
- int( gettimeofday() );
- my ( $device, $reading ) =
- FHEM::AutoShuttersControl::GetAttrValues( $self->{shuttersDev},
- 'ASC_WindowRec', 'none' );
-
- ### erwartetes Ergebnis
- # DEVICE:READING VALUEACTIVE:VALUEINACTIVE POSACTIVE:POSINACTIVE
-
- $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{device} =
- $device;
- $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{reading} =
- ( $reading ne 'none' ? $reading : 'state' );
-
- return $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{device};
-}
-
-sub getWinDevReading {
- my $self = shift;
-
- return $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{reading}
- if (
- exists(
- $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME}
- )
- && ( gettimeofday() -
- $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} ) <
- 2
- );
- $shutters->_getWinDev;
-
- return $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{reading};
-}
-
-## Subklasse Readings von Klasse ASC_Window ##
-package ASC_Window::Readings;
-
-use strict;
-use warnings;
-use utf8;
-
-use GPUtils qw(GP_Import);
-
-## Import der FHEM Funktionen
-BEGIN {
- GP_Import(
- qw(
- ReadingsVal)
- );
-}
-
-sub getWinStatus {
- my $self = shift;
-
- return ReadingsVal( $shutters->_getWinDev, $shutters->getWinDevReading,
- 'closed' );
-}
-
-## Klasse ASC_Roommate ##
-package ASC_Roommate;
-
-use strict;
-use warnings;
-use utf8;
-
-use GPUtils qw(GP_Import);
-
-## Import der FHEM Funktionen
-BEGIN {
- GP_Import(
- qw(
- ReadingsVal)
- );
-}
-
-sub _getRoommateStatus {
- my $self = shift;
-
- my $roommate = $self->{roommate};
-
- return ReadingsVal( $roommate, $shutters->getRoommatesReading, 'none' );
-}
-
-sub _getRoommateLastStatus {
- my $self = shift;
-
- my $roommate = $self->{roommate};
- my $default = $self->{defaultarg};
-
- $default = 'none' if ( !defined($default) );
- return ReadingsVal( $roommate, 'lastState', $default );
-}
-
-## Klasse ASC_Dev plus Subklassen ASC_Attr_Dev und ASC_Readings_Dev##
-package ASC_Dev;
-our @ISA = qw(ASC_Dev::Readings ASC_Dev::Attr);
-
-use strict;
-use warnings;
-use utf8;
-
-sub new {
- my $class = shift;
-
- my $self = { name => undef, };
-
- bless $self, $class;
- return $self;
-}
-
-sub setName {
- my $self = shift;
- my $name = shift;
-
- $self->{name} = $name if ( defined($name) );
- return $self->{name};
-}
-
-sub setDefault {
- my $self = shift;
- my $defaultarg = shift;
-
- $self->{defaultarg} = $defaultarg if ( defined($defaultarg) );
- return $self->{defaultarg};
-}
-
-sub getName {
- my $self = shift;
- return $self->{name};
-}
-
-## Subklasse Readings ##
-package ASC_Dev::Readings;
-
-use strict;
-use warnings;
-use utf8;
-
-use GPUtils qw(GP_Import);
-
-## Import der FHEM Funktionen
-BEGIN {
- GP_Import(
- qw(
- readingsSingleUpdate
- ReadingsVal
- defs)
- );
-}
-
-sub setDelayCmdReading {
- my $self = shift;
-
- my $name = $self->{name};
- my $hash = $defs{$name};
-
- readingsSingleUpdate( $hash,
- $shutters->getShuttersDev . '_lastDelayPosValue',
- $shutters->getDelayCmd, 1 );
- return;
-}
-
-sub setStateReading {
- my $self = shift;
- my $value = shift;
-
- my $name = $self->{name};
- my $hash = $defs{$name};
-
- readingsSingleUpdate( $hash, 'state',
- ( defined($value) ? $value : $shutters->getLastDrive ), 1 );
- return;
-}
-
-sub setPosReading {
- my $self = shift;
-
- my $name = $self->{name};
- my $hash = $defs{$name};
-
- readingsSingleUpdate( $hash, $shutters->getShuttersDev . '_PosValue',
- $shutters->getStatus, 1 );
- return;
-}
-
-sub setLastPosReading {
- my $self = shift;
-
- my $name = $self->{name};
- my $hash = $defs{$name};
-
- readingsSingleUpdate( $hash, $shutters->getShuttersDev . '_lastPosValue',
- $shutters->getLastPos, 1 );
- return;
-}
-
-sub getPartyMode {
- my $self = shift;
-
- my $name = $self->{name};
-
- return ReadingsVal( $name, 'partyMode', 'off' );
-}
-
-sub getHardLockOut {
- my $self = shift;
-
- my $name = $self->{name};
-
- return ReadingsVal( $name, 'hardLockOut', 'none' );
-}
-
-sub getSunriseTimeWeHoliday {
- my $self = shift;
-
- my $name = $self->{name};
-
- return ReadingsVal( $name, 'sunriseTimeWeHoliday', 'none' );
-}
-
-sub getMonitoredDevs {
- my $self = shift;
-
- my $name = $self->{name};
-
- $self->{monitoredDevs} = ReadingsVal( $name, '.monitoredDevs', 'none' );
- return $self->{monitoredDevs};
-}
-
-sub getOutTemp {
- my $self = shift;
-
- return ReadingsVal( $ascDev->_getTempSensor, $ascDev->getTempSensorReading,
- -100 );
-}
-
-sub getResidentsStatus {
- my $self = shift;
-
- my $val =
- ReadingsVal( $ascDev->_getResidentsDev, $ascDev->getResidentsReading,
- 'none' );
-
- if ( $val =~ m{^(?:(.+)_)?(.+)$}xms ) {
- return ( $1, $2 ) if (wantarray);
- return $1 && $1 eq 'pet' ? 'absent' : $2;
- }
- elsif (
- ReadingsVal( $ascDev->_getResidentsDev, 'homealoneType', '-' ) eq
- 'PET' )
- {
- return ( 'pet', 'absent' ) if (wantarray);
- return 'absent';
- }
- else {
- return ( undef, $val ) if (wantarray);
- return $val;
- }
-}
-
-sub getResidentsLastStatus {
- my $self = shift;
-
- my $val = ReadingsVal( $ascDev->_getResidentsDev, 'lastState', 'none' );
-
- if ( $val =~ m{^(?:(.+)_)?(.+)$}xms ) {
- return ( $1, $2 ) if (wantarray);
- return $1 && $1 eq 'pet' ? 'absent' : $2;
- }
- elsif (
- ReadingsVal( $ascDev->_getResidentsDev, 'lastHomealoneType', '-' ) eq
- 'PET' )
- {
- return ( 'pet', 'absent' ) if (wantarray);
- return 'absent';
- }
- else {
- return ( undef, $val ) if (wantarray);
- return $val;
- }
-}
-
-sub getAutoShuttersControlShading {
- my $self = shift;
-
- my $name = $self->{name};
-
- return ReadingsVal( $name, 'controlShading', 'none' );
-}
-
-sub getSelfDefense {
- my $self = shift;
-
- my $name = $self->{name};
-
- return ReadingsVal( $name, 'selfDefense', 'none' );
-}
-
-sub getAzimuth {
- my $self = shift;
-
- my $azimuth;
-
- $azimuth = ReadingsVal( $ascDev->_getTwilightDevice, 'azimuth', -1 )
- if ( $defs{ $ascDev->_getTwilightDevice }->{TYPE} eq 'Twilight' );
- $azimuth = ReadingsVal( $ascDev->_getTwilightDevice, 'SunAz', -1 )
- if ( $defs{ $ascDev->_getTwilightDevice }->{TYPE} eq 'Astro' );
-
- return $azimuth;
-}
-
-sub getElevation {
- my $self = shift;
-
- my $elevation;
-
- $elevation = ReadingsVal( $ascDev->_getTwilightDevice, 'elevation', -1 )
- if ( $defs{ $ascDev->_getTwilightDevice }->{TYPE} eq 'Twilight' );
- $elevation = ReadingsVal( $ascDev->_getTwilightDevice, 'SunAlt', -1 )
- if ( $defs{ $ascDev->_getTwilightDevice }->{TYPE} eq 'Astro' );
-
- return $elevation;
-}
-
-sub getASCenable {
- my $self = shift;
-
- my $name = $self->{name};
-
- return ReadingsVal( $name, 'ascEnable', 'none' );
-}
-
-## Subklasse Attr ##
-package ASC_Dev::Attr;
-
-use strict;
-use warnings;
-use utf8;
-
-use GPUtils qw(GP_Import);
-
-## Import der FHEM Funktionen
-BEGIN {
- GP_Import(
- qw(
- AttrVal
- gettimeofday)
- );
-}
-
-sub getShuttersOffset {
- my $self = shift;
-
- my $name = $self->{name};
-
- return AttrVal( $name, 'ASC_shuttersDriveDelay', -1 );
-}
-
-sub getBrightnessMinVal {
- my $self = shift;
-
- my $name = $self->{name};
-
- return $self->{ASC_brightness}->{triggermin}
- if ( exists( $self->{ASC_brightness}->{LASTGETTIME} )
- && ( gettimeofday() - $self->{ASC_brightness}->{LASTGETTIME} ) < 2 );
- $ascDev->getBrightnessMaxVal;
-
- return $self->{ASC_brightness}->{triggermin};
-}
-
-sub getBrightnessMaxVal {
- my $self = shift;
-
- my $name = $self->{name};
-
- return $self->{ASC_brightness}->{triggermax}
- if ( exists( $self->{ASC_brightness}->{LASTGETTIME} )
- && ( gettimeofday() - $self->{ASC_brightness}->{LASTGETTIME} ) < 2 );
- $self->{ASC_brightness}->{LASTGETTIME} = int( gettimeofday() );
-
- my ( $triggermax, $triggermin ) =
- FHEM::AutoShuttersControl::GetAttrValues( $name,
- 'ASC_brightnessDriveUpDown', '800:500' );
-
- ## erwartetes Ergebnis
- # max:min
-
- $self->{ASC_brightness}->{triggermin} = $triggermin;
- $self->{ASC_brightness}->{triggermax} = $triggermax;
-
- return $self->{ASC_brightness}->{triggermax};
-}
-
-sub _getTwilightDevice {
- my $self = shift;
-
- my $name = $self->{name};
-
- return AttrVal( $name, 'ASC_twilightDevice', 'none' );
-}
-
-sub getAutoAstroModeEvening {
- my $self = shift;
-
- my $name = $self->{name};
-
- return AttrVal( $name, 'ASC_autoAstroModeEvening', 'REAL' );
-}
-
-sub getAutoAstroModeEveningHorizon {
- my $self = shift;
-
- my $name = $self->{name};
-
- return AttrVal( $name, 'ASC_autoAstroModeEveningHorizon', 0 );
-}
-
-sub getAutoAstroModeMorning {
- my $self = shift;
-
- my $name = $self->{name};
-
- return AttrVal( $name, 'ASC_autoAstroModeMorning', 'REAL' );
-}
-
-sub getAutoAstroModeMorningHorizon {
- my $self = shift;
-
- my $name = $self->{name};
-
- return AttrVal( $name, 'ASC_autoAstroModeMorningHorizon', 0 );
-}
-
-sub getAutoShuttersControlMorning {
- my $self = shift;
-
- my $name = $self->{name};
-
- return AttrVal( $name, 'ASC_autoShuttersControlMorning', 'on' );
-}
-
-sub getAutoShuttersControlEvening {
- my $self = shift;
-
- my $name = $self->{name};
-
- return AttrVal( $name, 'ASC_autoShuttersControlEvening', 'on' );
-}
-
-sub getAutoShuttersControlComfort {
- my $self = shift;
-
- my $name = $self->{name};
-
- return AttrVal( $name, 'ASC_autoShuttersControlComfort', 'off' );
-}
-
-sub getFreezeTemp {
- my $self = shift;
-
- my $name = $self->{name};
-
- return AttrVal( $name, 'ASC_freezeTemp', 3 );
-}
-
-sub getSlatDriveCmdInverse {
- my $self = shift;
-
- my $name = $self->{name};
-
- return AttrVal( $name, 'ASC_slatDriveCmdInverse', 0 );
-}
-
-sub _getTempSensor {
- my $self = shift;
-
- my $name = $self->{name};
-
- return $self->{ASC_tempSensor}->{device}
- if ( exists( $self->{ASC_tempSensor}->{LASTGETTIME} )
- && ( gettimeofday() - $self->{ASC_tempSensor}->{LASTGETTIME} ) < 2 );
- $self->{ASC_tempSensor}->{LASTGETTIME} = int( gettimeofday() );
- my ( $device, $reading ) =
- FHEM::AutoShuttersControl::GetAttrValues( $name, 'ASC_tempSensor',
- 'none' );
-
- ## erwartetes Ergebnis
- # DEVICE:READING
- $self->{ASC_tempSensor}->{device} = $device;
- $self->{ASC_tempSensor}->{reading} =
- ( $reading ne 'none' ? $reading : 'temperature' );
-
- return $self->{ASC_tempSensor}->{device};
-}
-
-sub getTempSensorReading {
- my $self = shift;
-
- my $name = $self->{name};
-
- return $self->{ASC_tempSensor}->{reading}
- if ( exists( $self->{ASC_tempSensor}->{LASTGETTIME} )
- && ( gettimeofday() - $self->{ASC_tempSensor}->{LASTGETTIME} ) < 2 );
- $ascDev->_getTempSensor;
- return $self->{ASC_tempSensor}->{reading};
-}
-
-sub _getResidentsDev {
- my $self = shift;
-
- my $name = $self->{name};
-
- return $self->{ASC_residentsDev}->{device}
- if ( exists( $self->{ASC_residentsDev}->{LASTGETTIME} )
- && ( gettimeofday() - $self->{ASC_residentsDev}->{LASTGETTIME} ) < 2 );
- $self->{ASC_residentsDev}->{LASTGETTIME} = int( gettimeofday() );
- my ( $device, $reading ) =
- FHEM::AutoShuttersControl::GetAttrValues( $name, 'ASC_residentsDev',
- 'none' );
-
- $self->{ASC_residentsDev}->{device} = $device;
- $self->{ASC_residentsDev}->{reading} =
- ( $reading ne 'none' ? $reading : 'state' );
-
- return $self->{ASC_residentsDev}->{device};
-}
-
-sub getResidentsReading {
- my $self = shift;
-
- my $name = $self->{name};
-
- return $self->{ASC_residentsDev}->{reading}
- if ( exists( $self->{ASC_residentsDev}->{LASTGETTIME} )
- && ( gettimeofday() - $self->{ASC_residentsDev}->{LASTGETTIME} ) < 2 );
- $ascDev->_getResidentsDev;
- return $self->{ASC_residentsDev}->{reading};
-}
-
-sub _getRainSensor {
- my $self = shift;
-
- my $name = $self->{name};
-
- return $self->{ASC_rainSensor}->{device}
- if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
- && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
- $self->{ASC_rainSensor}->{LASTGETTIME} = int( gettimeofday() );
- my ( $device, $reading, $max, $hyst, $pos, $wait ) =
- FHEM::AutoShuttersControl::GetAttrValues( $name, 'ASC_rainSensor',
- 'none' );
-
- ## erwartetes Ergebnis
- # DEVICE:READING MAX:HYST
-
- return $device if ( $device eq 'none' );
- $self->{ASC_rainSensor}->{device} = $device;
- $self->{ASC_rainSensor}->{reading} =
- ( $reading ne 'none' ? $reading : 'state' );
- $self->{ASC_rainSensor}->{triggermax} = ( $max ne 'none' ? $max : 1000 );
- $self->{ASC_rainSensor}->{triggerhyst} = (
- $hyst ne 'none'
- ? $max - $hyst
- : ( $self->{ASC_rainSensor}->{triggermax} * 0 )
- );
- $self->{ASC_rainSensor}->{shuttersClosedPos} =
- ( $pos ne 'none' ? $pos : $shutters->getClosedPos );
- $self->{ASC_rainSensor}->{waitingTime} =
- ( $pos ne 'none' ? $wait : 900 );
-
- return $self->{ASC_rainSensor}->{device};
-}
-
-sub getRainSensorReading {
- my $self = shift;
-
- my $name = $self->{name};
-
- return $self->{ASC_rainSensor}->{reading}
- if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
- && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
- $ascDev->_getRainSensor;
- return $self->{ASC_rainSensor}->{reading};
-}
-
-sub getRainTriggerMax {
- my $self = shift;
-
- my $name = $self->{name};
-
- return $self->{ASC_rainSensor}->{triggermax}
- if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
- && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
- $ascDev->_getRainSensor;
- return $self->{ASC_rainSensor}->{triggermax};
-}
-
-sub getRainTriggerMin {
- my $self = shift;
-
- my $name = $self->{name};
-
- return $self->{ASC_rainSensor}->{triggerhyst}
- if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
- && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
- $ascDev->_getRainSensor;
- return $self->{ASC_rainSensor}->{triggerhyst};
-}
-
-sub getRainSensorShuttersClosedPos {
- my $self = shift;
-
- my $name = $self->{name};
-
- return $self->{ASC_rainSensor}->{shuttersClosedPos}
- if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
- && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
- $ascDev->_getRainSensor;
- return $self->{ASC_rainSensor}->{shuttersClosedPos};
-}
-
-sub getRainWaitingTime {
- my $self = shift;
-
- my $name = $self->{name};
-
- return $self->{ASC_rainSensor}->{waitingTime}
- if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
- && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
- $ascDev->_getRainSensor;
- return $self->{ASC_rainSensor}->{waitingTime};
-}
-
-sub _getWindSensor {
- my $self = shift;
-
- my $name = $self->{name};
-
- return $self->{ASC_windSensor}->{device}
- if ( exists( $self->{ASC_windSensor}->{LASTGETTIME} )
- && ( gettimeofday() - $self->{ASC_windSensor}->{LASTGETTIME} ) < 2 );
- $self->{ASC_windSensor}->{LASTGETTIME} = int( gettimeofday() );
- my ( $device, $reading ) =
- FHEM::AutoShuttersControl::GetAttrValues( $name, 'ASC_windSensor',
- 'none' );
-
- return $device if ( $device eq 'none' );
- $self->{ASC_windSensor}->{device} = $device;
- $self->{ASC_windSensor}->{reading} =
- ( $reading ne 'none' ? $reading : 'wind' );
-
- return $self->{ASC_windSensor}->{device};
-}
-
-sub getWindSensorReading {
- my $self = shift;
-
- my $name = $self->{name};
-
- return $self->{ASC_windSensor}->{reading}
- if ( exists( $self->{ASC_windSensor}->{LASTGETTIME} )
- && ( gettimeofday() - $self->{ASC_windSensor}->{LASTGETTIME} ) < 2 );
- $ascDev->_getWindSensor;
- return (
- defined( $self->{ASC_windSensor}->{reading} )
- ? $self->{ASC_windSensor}->{reading}
- : 'wind'
- );
-}
-
-sub getBlockAscDrivesAfterManual {
- my $self = shift;
-
- my $name = $self->{name};
-
- return AttrVal( $name, 'ASC_blockAscDrivesAfterManual', 0 );
-}
1;
-
-=pod
-=item device
-=item summary Module for controlling shutters depending on various conditions
-=item summary_DE Modul zur automatischen Rolladensteuerung auf Basis bestimmter Ereignisse
-
-
-=begin html
-
-
-AutoShuttersControl
-
-
- AutoShuttersControl (ASC) provides a complete automation for shutters with comprehensive
- configuration options, e.g. open or close shutters depending on the sunrise or sunset,
- by outdoor brightness or randomly for simulate presence.
-
- So that ASC can drive the blinds on the basis of the astronomical times, it is very important to
- correctly set the location (latitude, longitude) in the device "global".
-
-
- After telling ASC which shutters should be controlled, several in-depth configuration options
- are provided. With these and in combination with a resident presence state, complex scenarios are possible:
- For example, shutters could be opened if a resident awakes from sleep and the sun is already rosen. Or if a
- closed window with shutters down is tilted, the shutters could be half opened for ventilation.
- Many more is possible.
-
-
- Define
-
-
- define <name> AutoShuttersControl
-
-
- Usage:
-
-
- define myASControl AutoShuttersControl
-
-
-
- This creates an new AutoShuttersControl device, called myASControl.
- Now was the new global attribute ASC added to the FHEM installation.
- Each shutter that is to be controlled by AutoShuttersControl must now have the attribute ASC set to 1 or 2.
- The value 1 is to be used with devices whose state is given as position (i.e. ROLLO or Siro, shutters
- openend is 0, shutters closed is 100), 2 with devices whose state is given as percent closed (i.e. HomeMatic,
- shutters opened is 100, closed is 0).
-
-
- After setting the attributes to all devices who should be controlled, the automatic scan at the main device
- can be started for example with
- set myASControl scanForShutters
-
-
-
-
- Readings
-
-
-
- Set
-
- - ascEnable on|off - enable or disable the global control by ASC
- - controlShading on|off - enable or disable the global shading control by ASC
- - createNewNotifyDev - re-creates the internal structure for NOTIFYDEV. Is only present if
- the
- ASC_Expert attribute is set to 1.
-
- - hardLockOut on|off -
- hardLockOut - on/off - Aktiviert den hardwareseitigen Aussperrschutz für die Rollläden, bei denen das Attributs ASC_LockOut entsprechend auf hard gesetzt ist. Mehr Informationen in der Beschreibung bei den Attributen für die Rollladengeräten.
-
- - partyMode on|off - controls the global party mode for shutters. Every shutters whose
- ASC_Partymode attribute is set to on, is not longer controlled by ASC. The last saved
- working command send to the device, i.e. by a event, created by a window or presence event, will be executed
- once the party mode is disabled.
-
- - renewAllTimer - resets the sunrise and sunset timers for every associated
- shutter device and creates new internal FHEM timers.
-
- - renewTimer - resets the sunrise and sunset timers for selected shutter
- device and creates new internal FHEM timers.
-
- - scanForShutters - scans the whole FHEM installation for (new) devices whose ASC
- attribute is set (to 1 or 2, see above).
-
- - selfDefense on|off - controls the self defense function. This function listens for
- example on a residents device. If this device is set to absent and a window is still open, ASC will close
- the shutter for a rudimentary burglary protection.
-
- - shutterASCenableToggle on|off - controls if the ASC controls are shown at a associated
- shutter device.
-
- - sunriseTimeWeHoliday on|off - controls the weekend and holiday support. If enabled, the
- ASC_Time_Up_WE_Holiday attribute is considered.
-
- - wiggle - wiggles a device for a given value (default 5%, controlled by
- ASC_WiggleValue) up or down and back after a minute. Useful as a deterrence in combination with
- alarm system.
-
-
-
-
- Get
-
- - showNotifyDevsInformations - shows the generated NOTIFYDEV structure. Useful for
- debugging and only shown if the ASC_expert attribute is set to 1.
-
-
-
-
- Attributes
-
- At the global ASC device:
-
-
-
- - ASC_autoAstroModeEvening - REAL, CIVIL, NAUTIC, ASTRONOMIC or HORIZON
-
- - ASC_autoAstroModeEveningHorizon - Height above the horizon. Is only considered
- if the ASC_autoAstroModeEvening attribute is set to HORIZON. Defaults to 0.
-
-
- - ASC_autoAstroModeMorning - REAL, CIVIL, NAUTIC, ASTRONOMIC or HORIZON
-
- - ASC_autoAstroModeMorningHorizon - Height above the horizon. Is only considered
- if the ASC_autoAstroModeMorning attribute is set to HORIZON. Defaults to 0.
-
-
- - ASC_autoShuttersControlComfort - on|off -
- Controls the comfort functions: If a three state sensor, like the HmIP-SRH window handle
- sensor, is installed, ASC will open the window if the sensor signals open position. The
- ASC_ComfortOpen_Pos attribute has to be set for the shutter to on, defaults to off.
-
-
- - ASC_autoShuttersControlEvening - on|off - Enables the automatic control by ASC
- at the evenings.
-
-
- - ASC_autoShuttersControlMorning - on|off - Enables the automatic control by ASC
- at the mornings.
-
-
- - ASC_blockAscDrivesAfterManual 0|1 - If set to 1, ASC will not
- automatically control a shutter if there was an manual control to the shutter. To be considered, the
- ASC_ShuttersLastDrive reading has to contain the value manual and the shutter is in
- an unknown (i.e. not otherwise configured in ASC) position.
-
-
- - ASC_brightnessDriveUpDown - VALUE-MORNING:VALUE-EVENING - Drive the shutters by
- brightness. VALUE-MORNING sets the brightness threshold for the morning. If the value is
- reached in the morning, the shutter will go up. Vice versa in the evening. This is a global setting
- and can be overwritte per device with the ASC_BrightnessSensor attribute (see below).
-
-
- - ASC_debug -
- Extendend logging for debugging purposes
-
-
- - ASC_expert - Switches the export mode on. Currently, if set to 1, get
- and set will contain additional functions regarding the NOTIFYDEFs.
-
-
- - ASC_freezeTemp - Temperature threshold for the freeze protection. The freeze protection
- prevents the shutter to be operated by ASC. Last operating order will be kept.
-
-
- - ASC_rainSensor DEVICENAME[:READINGNAME] MAXTRIGGER[:HYSTERESE] [CLOSEDPOS] - Contains
- settings for the rain protection. DEVICNAME specifies a rain sensor, the optional
- READINGNAME the name of the reading at the DEVICENAME. The READINGNAME
- should contain the values rain and dry or a numeral rain amount. MAXTRIGGER
- sets the threshold for the amount of rain for when the shutter is driven to CLOSEDPOS as soon
- the threshold is reached. HYSTERESE sets a hysteresis for MAXTRIGGER.
-
-
- - ASC_residentsDev DEVICENAME[:READINGNAME] - DEVICENAME points to a device
- for presence, e.g. of type RESIDENTS. READINGNAME points to a reading at
- DEVICENAME which contains a presence state, e.g. rgr_Residents:state. The target
- should contain values alike the RESIDENTS family.
-
-
- - ASC_shuttersDriveDelay - Maximum random drive delay in seconds for calculating
- the operating time. 0 equals to no delay.
-
-
- - ASC_tempSensor DEVICENAME[:READINGNAME] - DEVICENAME points to a device
- with a temperature, READINGNAME to a reading located at the DEVICENAME, for example
- OUTDOOR_TEMP:measured-temp. READINGNAME defaults to temperature.
-
-
- - ASC_twilightDevice - points to a DEVICENAME containing values regarding
- the sun position. Supports currently devices of type Twilight or Astro.
-
-
- - ASC_windSensor DEVICENAME[:READINGNAME] - DEVICENAME points to a device
- containing a wind speed. Reads from the wind reading, if not otherwise specified by
- READINGNAME.
-
-
-
- At shutter devices, controlled by ASC:
-
-
-
- AutoShuttersControl API description
-
-
- It's possible to access internal data of the ASC module by calling the API function.
-
- Data points of a shutter device, controlled by ASC
-
-
{ ascAPIget('Getter','SHUTTERS_DEVICENAME') }
-
-
-
- Getter |
- Description |
-
-
- FreezeStatus |
- 1 = soft, 2 = daytime, 3 = hard |
-
-
- NoDelay |
- Was the offset handling deactivated (e.g. by operations triggered by a window event) |
-
-
- LastDrive |
- Reason for the last action caused by ASC |
-
-
- LastPos |
- Last position of the shutter |
-
-
- LastPosTimestamp |
- Timestamp of the last position |
-
-
- LastManPos |
- Last position manually set of the shutter |
-
-
- LastManPosTimestamp |
- Timestamp of the last position manually set |
-
-
- SunsetUnixTime |
- Calculated sunset time in seconds since the UNIX epoche |
-
-
- Sunset |
- 1 = operation in the evening was made, 0 = operation in the evening was not yet made |
-
-
- SunriseUnixTime |
- Calculated sunrise time in seconds since the UNIX epoche |
-
-
- Sunrise |
- 1 = operation in the morning was made, 0 = operation in the morning was not yet made |
-
-
- RoommatesStatus |
- Current state of the room mate set for this shutter |
-
-
- RoommatesLastStatus |
- Last state of the room mate set for this shutter |
-
-
- ShadingStatus |
- Value of the current shading state. Can hold in, out, in reserved or
- out reserved |
-
-
- ShadingStatusTimestamp |
- Timestamp of the last shading state |
-
-
- IfInShading |
- Is the shutter currently in shading (depends on the shading mode) |
-
-
- WindProtectionStatus |
- Current state of the wind protection. Can hold protection or unprotection |
-
-
- RainProtectionStatus |
- Current state of the rain protection. Can hold protection or unprotection |
-
-
- DelayCmd |
- Last operation order in the waiting queue. Set for example by the party mode |
-
-
- Status |
- Position of the shutter |
-
-
- ASCenable |
- Does ASC control the shutter? |
-
-
- PrivacyDownStatus |
- Is the shutter currently in privacyDown mode |
-
-
- outTemp |
- Current temperature of a configured temperature device, return -100 is no device configured |
-
-
-
- Übersicht für das Rollladen-Device mit Parameterübergabe
-
- { ascAPIget('Getter','ROLLODEVICENAME',VALUE) }
-
-
-
- Getter | Erläuterung |
-
-
- QueryShuttersPos | Rückgabewert 1 bedeutet das die aktuelle Position des Rollos unterhalb der Valueposition ist. 0 oder nichts bedeutet oberhalb der Valueposition. |
-
-
-
- Data points of the ASC device
-
- { ascAPIget('Getter') }
-
-
-
- Getter |
- Description |
-
-
- OutTemp |
- Current temperature of a configured temperature device, return -100 is no device configured |
-
-
- ResidentsStatus |
- Current state of a configured resident device |
-
-
- ResidentsLastStatus |
- Last state of a configured resident device |
-
-
- Azimuth |
- Current azimuth of the sun |
-
-
- Elevation |
- Current elevation of the sun |
-
-
- ASCenable |
- Is ASC globally activated? |
-
-
-
-
-=end html
-
-=begin html_DE
-
-
-AutoShuttersControl
-
- AutoShuttersControl (ASC) ermöglicht eine vollständige Automatisierung der vorhandenen Rollläden. Das Modul bietet umfangreiche Konfigurationsmöglichkeiten, um Rollläden bspw. nach Sonnenauf- und untergangszeiten, nach Helligkeitswerten oder rein zeitgesteuert zu steuern.
-
Damit ASC auf Basis der astronomischen Zeiten die Rollos fahren kann, ist es ganz wichtig im Device "global" die Location (Latitude,Longitude) korrekt zu setzen.
-
-
- Man kann festlegen, welche Rollläden von ASC in die Automatisierung mit aufgenommen werden sollen. Daraufhin stehen diverse Attribute zur Feinkonfiguration zur Verfügung. So sind unter anderem komplexe Lösungen wie Fahrten in Abhängigkeit des Bewohnerstatus einfach umsetzbar. Beispiel: Hochfahren von Rollläden, wenn der Bewohner erwacht ist und draußen bereits die Sonne aufgegangen ist. Weiterhin ist es möglich, dass der geschlossene Rollladen z.B. nach dem Ankippen eines Fensters in eine Lüftungsposition fährt. Und vieles mehr.
-
-
- Define
-
- define <name> AutoShuttersControl
-
- Beispiel:
-
-
- define myASControl AutoShuttersControl
-
-
- Der Befehl erstellt ein AutoShuttersControl Device mit Namen myASControl.
- Nachdem das Device angelegt wurde, muss in allen Rollläden Devices, welche gesteuert werden sollen, das Attribut ASC mit Wert 1 oder 2 gesetzt werden.
- Dabei bedeutet 1 = "Prozent geschlossen" (z.B. ROLLO oder Siro Modul) - Rollo Oben 0, Rollo Unten 100, 2 = "Prozent geöffnet" (z.B. Homematic) - Rollo Oben 100, Rollo Unten 0.
- Die Voreinstellung für den Befehl zum prozentualen Fahren ist in beiden Fällen unterschiedlich. 1="position" und 2="pct". Dies kann, soweit erforderlich, zu späterer Zeit noch angepasst werden.
- Habt Ihr das Attribut gesetzt, könnt Ihr den automatischen Scan nach den Devices anstoßen.
-
-
-
- Readings
-
- Im ASC-Device
-
- - ..._nextAstroTimeEvent - Uhrzeit des nächsten Astro-Events: Sonnenauf- oder Sonnenuntergang oder feste Zeit
- - ..._PosValue - aktuelle Position des Rollladens
- - ..._lastPosValue - letzte Position des Rollladens
- - ..._lastDelayPosValue - letzter abgesetzter Fahrbefehl, welcher beim nächsten zulässigen Event ausgeführt wird.
- - partyMode - on/off - Partymodus-Status
- - ascEnable - on/off - globale ASC Steuerung bei den Rollläden aktiv oder inaktiv
- - controlShading - on/off - globale Beschattungsfunktion aktiv oder inaktiv
- - hardLockOut - on/off - Status des hardwareseitigen Aussperrschutzes / gilt nur für Rolläden mit dem Attribut bei denen das Attributs ASC_LockOut entsprechend auf hard gesetzt ist
- - room_... - Auflistung aller Rollläden, die in den jeweiligen Rämen gefunden wurde. Beispiel: room_Schlafzimmer: Terrasse
- - selfDefense - Selbstschutz-Status
- - state - Status des ASC-Devices: active, enabled, disabled oder weitere Statusinformationen
- - sunriseTimeWeHoliday - on/off - Status der Wochenendunterstützung
- - userAttrList - Das ASC-Modul verteilt an die gesteuerten Rollladen-Geräte diverse Benutzerattribute (userattr). In diesem Reading kann der Status dieser Verteilung geprüft werden.
-
- In den Rollläden-Geräten
-
- - ASC_Enable - on/off - wird der Rollladen über ASC gesteuert oder nicht
- - ASC_Time_DriveUp - Im Astro-Modus ist hier die Sonnenaufgangszeit für das Rollo gespeichert. Im Brightnessmodus ist hier der Zeitpunkt aus dem Attribut ASC_Time_Up_Late gespeichert. Im Timemodus ist hier der Zeitpunkt aus dem Attribut ASC_Time_Up_Early gespeichert.
- - ASC_Time_DriveDown - Im Astro-Modus ist hier die Sonnenuntergangszeit für das Rollo gespeichert. Im Brightnessmodus ist hier der Zeitpunkt aus dem Attribut ASC_Time_Down_Late gespeichert. Im Timemodus ist hier der Zeitpunkt aus dem Attribut ASC_Time_Down_Early gespeichert.
- - ASC_ShuttersLastDrive - Grund der letzten Fahrt vom Rollladen
- - ASC_ShadingMessage -
- - ASC_Time_PrivacyDriveDown -
- - ASC_Time_PrivacyDriveUp -
-
-
-
-
- Set
-
- - advDriveDown - holt bei allen Rollläden durch ASC_Adv on ausgesetzte Fahrten nach.
- - ascEnable - on/off - Aktivieren oder deaktivieren der globalen ASC Steuerung
- - controlShading - on/off - Aktiviert oder deaktiviert die globale Beschattungssteuerung
- - createNewNotifyDev - Legt die interne Struktur für NOTIFYDEV neu an. Diese Funktion steht nur zur Verfügung, wenn Attribut ASC_expert auf 1 gesetzt ist.
- - hardLockOut - on/off - Aktiviert den hardwareseitigen Aussperrschutz für die Rollläden, bei denen das Attributs ASC_LockOut entsprechend auf hard gesetzt ist. Mehr Informationen in der Beschreibung bei den Attributen für die Rollladengeräten.
- - partyMode - on/off - Aktiviert den globalen Partymodus. Alle Rollladen-Geräten, in welchen das Attribut ASC_Partymode auf on gesetzt ist, werden durch ASC nicht mehr gesteuert. Der letzte Schaltbefehl, der bspw. durch ein Fensterevent oder Wechsel des Bewohnerstatus an die Rollläden gesendet wurde, wird beim Deaktivieren des Partymodus ausgeführt
- - renewTimer - erneuert beim ausgewählten Rollladen die Zeiten für Sonnenauf- und -untergang und setzt die internen Timer neu.
- - renewAllTimer - erneuert bei allen Rollläden die Zeiten für Sonnenauf- und -untergang und setzt die internen Timer neu.
- - scanForShutters - Durchsucht das System nach GerätenRo mit dem Attribut ASC = 1 oder ASC = 2
- - selfDefense - on/off - Aktiviert bzw. deaktiviert die Selbstschutzfunktion. Beispiel: Wenn das Residents-Gerät absent meldet, die Selbstschutzfunktion aktiviert wurde und ein Fenster im Haus noch geöffnet ist, so wird an diesem Fenster der Rollladen deaktivieren dann heruntergefahren.
- - shutterASCenableToggle - on/off - Aktivieren oder deaktivieren der ASC Kontrolle beim einzelnen Rollladens
- - sunriseTimeWeHoliday - on/off - Aktiviert die Wochenendunterstützung und somit, ob im Rollladengerät das Attribut ASC_Time_Up_WE_Holiday beachtet werden soll oder nicht.
- - wiggle - bewegt einen oder mehrere Rollläden um einen definierten Wert (Default: 5%) und nach einer Minute wieder zurück in die Ursprungsposition. Diese Funktion könnte bspw. zur Abschreckung in einem Alarmsystem eingesetzt werden.
-
-
-
- Get
-
- - showNotifyDevsInformations - zeigt eine Übersicht der abgelegten NOTIFYDEV Struktur. Diese Funktion wird primär fürs Debugging genutzt. Hierzu ist das Attribut ASC_expert = 1 zu setzen.
-
-
-
- Attributes
-
- Im ASC-Device
-
-
- - ASC_autoAstroModeEvening - REAL, CIVIL, NAUTIC, ASTRONOMIC oder HORIZON
-
- - ASC_autoAstroModeEveningHorizon - Höhe über dem Horizont. Wird nur berücksichtigt, wenn im Attribut ASC_autoAstroModeEvening der Wert HORIZON ausgewählt wurde. (default: 0)
-
- - ASC_autoAstroModeMorning - REAL, CIVIL, NAUTIC, ASTRONOMIC oder HORIZON
-
- - ASC_autoAstroModeMorningHorizon - Höhe über dem Horizont. Wird nur berücksichtigt, wenn im Attribut ASC_autoAstroModeMorning der Wert HORIZON ausgewählt wurde. (default: 0)
-
- - ASC_autoShuttersControlComfort - on/off - schaltet die Komfortfunktion an. Bedeutet, dass ein Rollladen mit einem threestate-Sensor am Fenster beim Öffnen in eine Offenposition fährt. Hierzu muss beim Rollladen das Attribut ASC_ComfortOpen_Pos entsprechend konfiguriert sein. (default: off)
-
- - ASC_autoShuttersControlEvening - on/off - Aktiviert die automatische Steuerung durch das ASC-Modul am Abend.
-
- - ASC_autoShuttersControlMorning - on/off - Aktiviert die automatische Steuerung durch das ASC-Modul am Morgen.
-
- - ASC_blockAscDrivesAfterManual - 0,1 - wenn dieser Wert auf 1 gesetzt ist, dann werden Rollläden vom ASC-Modul nicht mehr gesteuert, wenn zuvor manuell eingegriffen wurde. Voraussetzung hierfür ist jedoch, dass im Reading ASC_ShuttersLastDrive der Status manual enthalten ist und sich der Rollladen auf eine unbekannte (nicht in den Attributen anderweitig konfigurierte) Position befindet.
-
- - ASC_brightnessDriveUpDown - WERT-MORGENS:WERT-ABENDS - Werte bei dem Schaltbedingungen für Sonnenauf- und -untergang geprüft werden sollen. Diese globale Einstellung kann durch die WERT-MORGENS:WERT-ABENDS Einstellung von ASC_BrightnessSensor im Rollladen selbst überschrieben werden.
-
- - ASC_debug - Aktiviert die erweiterte Logausgabe für Debugausgaben
-
- - ASC_expert - ist der Wert 1, so werden erweiterte Informationen bezüglich des NotifyDevs unter set und get angezeigt
-
- - ASC_freezeTemp - Temperatur, ab welcher der Frostschutz greifen soll und der Rollladen nicht mehr fährt. Der letzte Fahrbefehl wird gespeichert.
-
- - ASC_rainSensor - DEVICENAME[:READINGNAME] MAXTRIGGER[:HYSTERESE] [CLOSEDPOS] - 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".
-
- - ASC_residentsDev - DEVICENAME[:READINGNAME] - der Inhalt ist eine Kombination aus Devicenamen und Readingnamen des Residents-Device der obersten Ebene (z.B. rgr_Residents:state)
-
- - ASC_shuttersDriveDelay - maximale Zufallsverzögerung in Sekunden bei der Berechnung der Fahrzeiten. 0 bedeutet keine Verzögerung
-
- - ASC_tempSensor - DEVICENAME[:READINGNAME] - der Inhalt ist eine Kombination aus Device und Reading für die Außentemperatur
-
- - ASC_twilightDevice - das Device, welches die Informationen zum Sonnenstand liefert. Wird unter anderem für die Beschattung verwendet.
-
- - ASC_windSensor - DEVICE[:READING] - Sensor für die Windgeschwindigkeit. Kombination aus Device und Reading.
- - ASC_slatDriveCmdInverse - Vertauscht wie Reihnfolge der Fahrbefehle für Slat und Drive
-
-
-
- In den Rollläden-Geräten
-
- - ASC - 0/1/2 0 = "kein Anlegen der Attribute beim ersten Scan bzw. keine Beachtung eines Fahrbefehles",1 = "Inverse oder Rollo - Bsp.: Rollo oben 0, Rollo unten 100 und der Befehl zum prozentualen Fahren ist position",2 = "Homematic Style - Bsp.: Rollo oben 100, Rollo unten 0 und der Befehl zum prozentualen Fahren ist pct
- - ASC_Antifreeze - soft/am/pm/hard/off - Frostschutz, wenn soft fährt der Rollladen in die ASC_Antifreeze_Pos und wenn hard/am/pm wird gar nicht oder innerhalb der entsprechenden Tageszeit nicht gefahren (default: off)
- - ASC_Antifreeze_Pos - Position die angefahren werden soll, wenn der Fahrbefehl komplett schließen lautet, aber der Frostschutz aktiv ist (Default: ist abhängig vom AttributASC 85/15) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
- - ASC_AutoAstroModeEvening - aktuell REAL,CIVIL,NAUTIC,ASTRONOMIC (default: none)
- - ASC_AutoAstroModeEveningHorizon - Höhe über Horizont, wenn beim Attribut ASC_autoAstroModeEvening HORIZON ausgewählt (default: none)
- - ASC_AutoAstroModeMorning - aktuell REAL,CIVIL,NAUTIC,ASTRONOMIC (default: none)
- - ASC_AutoAstroModeMorningHorizon - Höhe über Horizont,a wenn beim Attribut ASC_autoAstroModeMorning HORIZON ausgewählt (default: none)
- - ASC_BlockingTime_afterManual - wie viel Sekunden soll die Automatik nach einer manuellen Fahrt aussetzen. (default: 1200)
- - ASC_BlockingTime_beforDayOpen - wie viel Sekunden vor dem morgendlichen öffnen soll keine schließen Fahrt mehr stattfinden. (default: 3600)
- - ASC_BlockingTime_beforNightClose - wie viel Sekunden vor dem nächtlichen schließen soll keine öffnen Fahrt mehr stattfinden. (default: 3600)
- - ASC_BrightnessSensor - DEVICE[:READING] WERT-MORGENS:WERT-ABENDS / 'Sensorname[:brightness [400:800]]' Angaben zum Helligkeitssensor mit (Readingname, optional) für die Beschattung und dem Fahren der Rollladen nach brightness und den optionalen Brightnesswerten für Sonnenauf- und Sonnenuntergang. (default: none)
- - ASC_Down - astro/time/brightness - bei astro wird Sonnenuntergang berechnet, bei time wird der Wert aus ASC_Time_Down_Early als Fahrzeit verwendet und bei brightness muss ASC_Time_Down_Early und ASC_Time_Down_Late korrekt gesetzt werden. Der Timer läuft dann nach ASC_Time_Down_Late Zeit, es wird aber in der Zeit zwischen ASC_Time_Down_Early und ASC_Time_Down_Late geschaut, ob die als Attribut im Moduldevice hinterlegte ASC_brightnessDriveUpDown der Down Wert erreicht wurde. Wenn ja, wird der Rollladen runter gefahren (default: astro)
-
- Beschreibung der besonderen Positionsattribute
- - ASC_Closed_Pos - in 10 Schritten von 0 bis 100 (Default: ist abhängig vom AttributASC 0/100)
- - ASC_Open_Pos - in 10 Schritten von 0 bis 100 (default: ist abhängig vom AttributASC 100/0)
- - ASC_Sleep_Pos - in 10 Schritten von 0 bis 100 (default: ist abhängig vom AttributASC 75/25) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
- - ASC_ComfortOpen_Pos - in 10 Schritten von 0 bis 100 (Default: ist abhängig vom AttributASC 20/80) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
- - ASC_Shading_Pos - Position des Rollladens für die Beschattung (Default: ist abhängig vom AttributASC 80/20) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
- - ASC_Ventilate_Pos - in 10 Schritten von 0 bis 100 (default: ist abhängig vom Attribut ASC 70/30) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
-
- In Bezug auf die Verwendung mit Lamellen gibt es folgende ergänzende Parameter.
-
- - Wird die gesamte Position inklusive der Lamellen mit Hilfe einer "festen Zurdnung" angefahren, so z.B. set ROLLONAME Beschattung dann wird hinter dem Positionswert mittels : getrennt die "feste Zuordnung" geschrieben. Beispiel: attr ROLLONAME ASC_Shading_Pos 30:Beschattung
- - Wird hingegen ein ander Command verwendet z.B. slatPct oder ähnliches dann muss hinter der normalen Positionsangebe noch die Position für die Lamellen mit angegeb werden. Beispiel: attr ROLLONAME ASC_Shading_Pos 30:75. Bitte beachtet in diesem Zusammenhang auch das Attribut ASC_SlatPosCmd_SlatDevice wo mindesten die Angabe des SlatPosCMD Voraussetzung ist.
-
-
- - ASC_Shutter_IdleDetection - READING:VALUE gibt das Reading an welches Auskunft über den Fahrstatus des Rollos gibt, sowie als zweites den Wert im Reading welcher aus sagt das das Rollo nicht fährt
- - ASC_DriveUpMaxDuration - die Dauer des Hochfahrens des Rollladens plus 5 Sekunden (default: 60)
- - ASC_Drive_Delay - maximaler Wert für einen zufällig ermittelte Verzögerungswert in Sekunden bei der Berechnung der Fahrzeiten.
- - ASC_Drive_DelayStart - in Sekunden verzögerter Wert ab welchen das Rollo gefahren werden soll.
- - ASC_LockOut - soft/hard/off - stellt entsprechend den Aussperrschutz ein. Bei global aktivem Aussperrschutz (set ASC-Device lockOut soft) und einem Fensterkontakt open bleibt dann der Rollladen oben. Dies gilt nur bei Steuerbefehlen über das ASC Modul. Stellt man global auf hard, wird bei entsprechender Möglichkeit versucht den Rollladen hardwareseitig zu blockieren. Dann ist auch ein Fahren über die Taster nicht mehr möglich. (default: off)
- - ASC_LockOut_Cmd - inhibit/blocked/protection - set Befehl für das Rollladen-Device zum Hardware sperren. Dieser Befehl wird gesetzt werden, wenn man "ASC_LockOut" auf hard setzt (default: none)
- - ASC_Mode_Down - always/home/absent/off - Wann darf die Automatik steuern. immer, niemals, bei Abwesenheit des Roommate (ist kein Roommate und absent eingestellt, wird gar nicht gesteuert) (default: always)
- - ASC_Mode_Up - always/home/absent/off - Wann darf die Automatik steuern. immer, niemals, bei Abwesenheit des Roommate (ist kein Roommate und absent eingestellt, wird gar nicht gesteuert) (default: always)
- - ASC_Partymode - on/off - schaltet den Partymodus an oder aus. Wird am ASC Device set ASC-DEVICE partyMode on geschalten, werden alle Fahrbefehle an den Rollläden, welche das Attribut auf on haben, zwischengespeichert und später erst ausgeführt (default: off)
- - ASC_Pos_Reading - Name des Readings, welches die Position des Rollladen in Prozent an gibt; wird bei unbekannten Device Typen auch als set Befehl zum fahren verwendet
- - ASC_PrivacyUpValue_beforeDayOpen - wie viele Sekunden vor dem morgendlichen öffnen soll der Rollladen in die Sichtschutzposition fahren, oder bei Brightness ab welchem minimum Brightnesswert soll das Rollo in die Privacy Position fahren. Bei Brightness muss zusätzlich zum Zeitwert der Brightnesswert mit angegeben werden 1800:600 bedeutet 30 min vor day open oder bei über einem Brightnesswert von 600 (default: -1)
- - ASC_PrivacyDownValue_beforeNightClose - wie viele Sekunden vor dem abendlichen schließen soll der Rollladen in die Sichtschutzposition fahren, oder bei Brightness ab welchem minimum Brightnesswert soll das Rollo in die Privacy Position fahren. Bei Brightness muss zusätzlich zum Zeitwert der Brightnesswert mit angegeben werden 1800:300 bedeutet 30 min vor night close oder bei unter einem Brightnesswert von 300 (default: -1)
- - ASC_PrivacyUp_Pos - Position den Rollladens für den morgendlichen Sichtschutz (default: 50) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
- - ASC_PrivacyDown_Pos - Position den Rollladens für den abendlichen Sichtschutz (default: 50) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
- - ASC_ExternalTrigger - DEVICE:READING VALUEACTIVE:VALUEINACTIVE POSACTIVE:[POSINACTIVE VALUEACTIVE2:POSACTIVE2], Beispiel: "WohnzimmerTV:state on:off 66:100" bedeutet das wenn ein "state:on" Event kommt soll das Rollo in Position 66 fahren, kommt ein "state:off" Event soll es in Position 100 fahren. Es ist möglich die POSINACTIVE weg zu lassen dann fährt das Rollo in LastStatus Position.
- - ASC_WindProtection - on/off - soll der Rollladen beim Windschutz beachtet werden. on=JA, off=NEIN. (default off)
- - ASC_RainProtection - on/off - soll der Rollladen beim Regenschutz beachtet werden. on=JA, off=NEIN. (default off)
- - ASC_Roommate_Device - mit Komma getrennte Namen des/der Roommate Device/s, welche den/die Bewohner des Raumes vom Rollladen wiedergibt. Es macht nur Sinn in Schlaf- oder Kinderzimmern (default: none)
- - ASC_Adv - on/off bei on wird das runterfahren des Rollos während der Weihnachtszeit (1. Advent bis 6. Januar) ausgesetzt! Durch set ASCDEVICE advDriveDown werden alle ausgesetzten Fahrten nachgeholt.
- - ASC_Roommate_Reading - das Reading zum Roommate Device, welches den Status wieder gibt (default: state)
- - ASC_Self_Defense_Mode - absent/gone/off - ab welchen Residents Status soll Selfdefense aktiv werden ohne das Fenster auf sind. (default: gone)
- - ASC_Self_Defense_AbsentDelay - um wie viele Sekunden soll das fahren in Selfdefense bei Residents absent verzögert werden. (default: 300)
- - ASC_Self_Defense_Exclude - on/off - bei on Wert wird dieser Rollladen bei aktiven Self Defense und offenen Fenster nicht runter gefahren, wenn Residents absent ist. (default: off), off bedeutet das es ausgeschlossen ist vom Self Defense
-
- Beschreibung der Beschattungsfunktion
- Damit die Beschattung Funktion hat, müssen folgende Anforderungen erfüllt sein.
- Im ASC Device das Reading "controlShading" mit dem Wert on, sowie ein Astro/Twilight Device im Attribut "ASC_twilightDevice" und das Attribut "ASC_tempSensor".
- In den Rollladendevices benötigt ihr ein Helligkeitssensor als Attribut "ASC_BrightnessSensor", sofern noch nicht vorhanden. Findet der Sensor nur für die Beschattung Verwendung ist der Wert DEVICENAME[:READING] ausreichend.
- Alle weiteren Attribute sind optional und wenn nicht gesetzt mit Default-Werten belegt. Ihr solltet sie dennoch einmal anschauen und entsprechend Euren Gegebenheiten setzen. Die Werte für die Fensterposition und den Vor- Nachlaufwinkel sowie die Grenzwerte für die StateChange_Cloudy und StateChange_Sunny solltet ihr besondere Beachtung dabei schenken.
- - ASC_Shading_InOutAzimuth - Azimut Wert ab dem bei Überschreiten Beschattet und bei Unterschreiten Endschattet werden soll. (default: 95:265)
- - ASC_Shading_MinMax_Elevation - ab welcher min Höhe des Sonnenstandes soll beschattet und ab welcher max Höhe wieder beendet werden, immer in Abhängigkeit der anderen einbezogenen Sensorwerte (default: 25.0:100.0)
- - ASC_Shading_Min_OutsideTemperature - ab welcher Temperatur soll Beschattet werden, immer in Abhängigkeit der anderen einbezogenen Sensorwerte (default: 18)
- - ASC_Shading_Mode - absent,always,off,home / wann soll die Beschattung nur stattfinden. (default: off)
- - ASC_Shading_Pos - Position des Rollladens für die Beschattung (Default: ist abhängig vom AttributASC 80/20) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!
- - ASC_Shading_StateChange_SunnyCloudy - Brightness Wert ab welchen die Beschattung stattfinden und aufgehoben werden soll, immer in Abhängigkeit der anderen einbezogenen Sensorwerte. Ein optionaler dritter Wert gibt an wie, viele Brightnesswerte für den aktuellen Brightness-Durchschnitt berücksichtigt werden. Standard ist 3, es sollten nicht mehr als 5 berücksichtigt werden. (default: 35000:20000 [3])
- - ASC_Shading_WaitingPeriod - wie viele Sekunden soll gewartet werden bevor eine weitere Auswertung der Sensordaten für die Beschattung stattfinden soll (default: 1200)
-
- - ASC_ShuttersPlace - window/terrace - 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 (default: window)
- - ASC_Time_Down_Early - Sonnenuntergang frühste Zeit zum Runterfahren (default: 16:00) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!
- - ASC_Time_Down_Late - Sonnenuntergang späteste Zeit zum Runterfahren (default: 22:00) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!
- - ASC_Time_Up_Early - Sonnenaufgang frühste Zeit zum Hochfahren (default: 05:00) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!
- - ASC_Time_Up_Late - Sonnenaufgang späteste Zeit zum Hochfahren (default: 08:30) !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!
- - ASC_Time_Up_WE_Holiday - Sonnenaufgang frühste Zeit zum Hochfahren am Wochenende und/oder Urlaub (holiday2we wird beachtet). (default: 08:00) ACHTUNG!!! in Verbindung mit Brightness für ASC_Up muss die Uhrzeit kleiner sein wie die Uhrzeit aus ASC_Time_Up_Late !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!
- - ASC_Up - astro/time/brightness - bei astro wird Sonnenaufgang berechnet, bei time wird der Wert aus ASC_Time_Up_Early als Fahrzeit verwendet und bei brightness muss ASC_Time_Up_Early und ASC_Time_Up_Late korrekt gesetzt werden. Der Timer läuft dann nach ASC_Time_Up_Late Zeit, es wird aber in der Zeit zwischen ASC_Time_Up_Early und ASC_Time_Up_Late geschaut, ob die als Attribut im Moduldevice hinterlegte Down Wert von ASC_brightnessDriveUpDown erreicht wurde. Wenn ja, wird der Rollladen hoch gefahren (default: astro)
- - ASC_Ventilate_Window_Open - auf lüften, wenn das Fenster gekippt/geöffnet wird und aktuelle Position unterhalb der Lüften-Position ist (default: on)
- - ASC_WiggleValue - Wert um welchen sich die Position des Rollladens ändern soll (default: 5)
- - ASC_WindParameters - TRIGGERMAX[:HYSTERESE] [DRIVEPOSITION] / Angabe von Max Wert ab dem für Wind getriggert werden soll, Hytsrese Wert ab dem der Windschutz aufgehoben werden soll TRIGGERMAX - HYSTERESE / Ist es bei einigen Rollläden nicht gewünscht das gefahren werden soll, so ist der TRIGGERMAX Wert mit -1 an zu geben. (default: '50:20 ClosedPosition')
- - ASC_WindowRec_PosAfterDayClosed - open,lastManual / auf welche Position soll das Rollo nach dem schließen am Tag fahren. Open Position oder letzte gespeicherte manuelle Position (default: open)
- - ASC_WindowRec - WINDOWREC:[READING], Name des Fensterkontaktes, an dessen Fenster der Rollladen angebracht ist (default: none). Reading ist optional
- - ASC_WindowRec_subType - Typ des verwendeten Fensterkontaktes: twostate (optisch oder magnetisch) oder threestate (Drehgriffkontakt) (default: twostate)
- - ASC_SlatPosCmd_SlatDevice - Angaben zu einem Slat (Lamellen) CMD und sofern diese Lamellen über ein anderes Device gesteuert werden zum Slat Device. Beispiel: attr ROLLO ASC_SlatPosCmd_SlatDevice slatPct[:ROLLOSLATDEVICE] [ ] bedeutet optinal. Kann also auch weg gelassen werden. Wenn Ihr das SLAT Device mit angibt dann bitte ohne []. Beispiel: attr ROLLO ASC_SlatPosCmd_SlatDevice slatPct:ROLLOSLATDEVICE. Damit das ganze dann auch greift muss in den 6 Positionsangaben ASC_Open_Pos, ASC_Closed_Pos, ASC_Ventilate_Pos, ASC_ComfortOpen_Pos, ASC_Shading_Pos und ASC_Sleep_Pos ein weiterer Parameter für die Lamellenstellung mit angegeben werden.
-
-
-
- Beschreibung der AutoShuttersControl API
- Mit dem Aufruf der API Funktion und Übergabe der entsprechenden Parameter ist es möglich auf interne Daten zu zu greifen.
-
- Übersicht für das Rollladen-Device
-
- { ascAPIget('Getter','ROLLODEVICENAME') }
-
-
- Getter | Erläuterung |
- FreezeStatus | 1=soft, 2=Daytime, 3=hard |
- AntiFreezePos | konfigurierte Position beim AntiFreeze Status |
- AntiFreezePosAssignment | konfigurierte Lamellen Position bei der AntiFreeze Position |
- AntiFreeze | aktuelle Konfiguration für AntiFreeze |
- ShuttersPlace | aktuelle Konfiguration an welchem Platz sich das Rollo befindet, Fenster oder Terrasse |
- SlatPosCmd | welcher PosCmd ist aktuell für den Lamellen Befehl konfiguriert |
- SlatDevice | welches Device aktuell für die Lamellen Steuerung konfiguriert ist |
- PrivacyUpTime | Privacy Zeit in Sekunden zum fahren in die Privacy Pos vor dem vollen öffnen |
- PrivacyUpBrightnessVal | Privacy Brightness Wert zum fahren in die Privacy Pos |
- PrivacyUpPos | Position für die Privacy Up Fahrt |
- PrivacyUpPositionAssignment | Position für die Lamellenfahrt von Privacy Up |
- PrivacyDownTime | Privacy Zeit in Sekunden zum fahren in die Privacy Pos vor dem vollen schließ |
- PrivacyDownBrightnessVal | Privacy Brightness Wert zum fahren in die Privacy Pos |
- PrivacyDownPos | Position für die Privacy Down Fahrt |
- PrivacyDownPositionAssignment | Position für die Lamellenfahrt von Privacy Down |
- SelfDefenseMode | Modus für den SelfDefense |
- SelfDefenseAbsentDelay | Verzögerungszeit der SelfDefense Fahrt bei absent |
- WiggleValue | um welchen Wert soll das Rollo bei einer wiggle Fahrt fahren |
- Adv | Ist es in der definierten Weihnachtszeit |
- ShadingPos | konfigurierte Position für die Beschattungsfahrt |
- ShadingPositionAssignment | Position für die Lamellenfahrt für die Beschattungsfahrt |
- ShadingMode | welcher aktuelle Modus für das Beschatten ist konfiguriert |
- IdleDetectionValue | welcher Wert im IdleDetectionRading zeigt an dass das Rollo aktuell nicht in Bewegung ist |
- ShadingAzimuthLeft | ab welchem Azimut beginnt die Beschattung |
- ShadingAzimuthRight | ab welchem Azimut endet die Beschattung |
- ShadingMinOutsideTemperature | über welchem Temperaturwert beginnt die Beschattung |
- ShadingMinElevation | über welchem Elevationwert beginnt die Beschattung |
- ShadingMaxElevation | über welchem Elevationwert endet die Beschattung |
- ShadingStateChangeSunny | über welchem Brightnesswert beginnt die Beschattung |
- ShadingStateChangeCloudy | unter welchem Brightnesswert endet die Beschattung |
- ShadingWaitingPeriod | nach welcher Wartezeit werden Beschattungsrelevante Sensorwerte wieder beachtet und die Beschattungsroutine abgearbeitet |
- ExternalTriggerDevice | konfiguriertes Triggerdevice |
- ExternalTriggerReading | kofiguriertes Triggerdevice Reading |
- ExternalTriggerValueActive | Wert mit welchen der externe Trigger Prozess ausgel&uoml;st werden soll. |
- ExternalTriggerValueActive2 | weiterer Wert mit welchen der externe zweite Trigger Prozess ausgel&uoml;st werden soll. |
- ExternalTriggerValueInactive | Wert mit welchen der externe Trigger Prozess beendet werden soll |
- ExternalTriggerPosActive | Rolloposition welche angefahren werden soll wenn der erste externe Trigger aktiv wird. |
- ExternalTriggerPosActive2 | Rolloposition welche angefahren werden soll wenn der zweite externe Trigger aktiv wird. |
- ExternalTriggerPosInactive | Rolloposition welche angefahren werden soll wenn der externe Trigger inaktiv wird. |
- ExternalTriggerState | aktueller Status des externen Triggers, 0 oder 1 |
- Delay | konfigurierte Verzögerungswert welcher für die Zufallsberechnung werwendet werden soll |
- DelayStart | konfigurierter fester Verzögerungswert |
- BlockingTimeAfterManual | konfigurierte Blockzeit nach einer manuellen Fahrt |
- BlockingTimeBeforNightClose | konfigurierte Blockzeit vor dem nächtlichen schließen |
- BlockingTimeBeforDayOpen | konfigurierte Blockzeit vor dem morgendlichen öffnen |
- PosCmd | welches Kommando wird zum fahren der Rollos verwendet (pct, position?) |
- OpenPos | Position für Rollo ganz auf |
- OpenPositionAssignment | Slat-Position für Rollo ganz auf |
- VentilatePos | Lüften Position |
- VentilatePositionAssignment | Lüften Slat-Position |
- VentilatePosAfterDayClosed | Position des Rollos beim schließen des Fensters am Tag |
- ClosedPos | Position für Rollo ganz geschlossen |
- ClosedPositionAssignment | Slat-Position für Rollo ganz geschlossen |
- SleepPos | Position für schlafen |
- SleepPositionAssignment | Slat-Position für schlafen |
- VentilateOpen | Lüften aktiv? |
- ComfortOpenPos | Comfort Position |
- ComfortOpenPositionAssignment | Slat-Comfort Position |
- PartyMode | Abfrage Party Mode |
- Roommates | Abfrage Roommates / Antwort als String |
- RoommatesReading | Roommates Reading |
- RoommatesStatus | Roommates Status unter Berücksichtigung aller Roommates und dessen Status |
- RoommatesLastStatus | Roommates letzter Status unter Berücksichtigung aller Roommates und dessen letzten Status |
- WindPos | Rollo Position bei Windtrigger |
- WindMax | Wert über dem die Windprotection aktiviert werden soll |
- WindMin | Wert unter dem die Windprotection aufgehoben werden soll |
- WindProtection | Windprotection soll aktiv sein oder nicht |
- WindProtectionStatus | aktueller Status der Wind Protection „protected“ oder „unprotected“ |
- RainProtection | Rain Protection soll aktiv sein oder nicht |
- RainProtectionStatus | aktueller Status der Regen Protection „unprotected“ oder „unprotected“ |
- ModeUp | |
- ModeDown | |
- LockOut | |
- LockOutCmd | |
- AutoAstroModeMorning | |
- AutoAstroModeEvening | |
- AutoAstroModeMorningHorizon | |
- AutoAstroModeEveningHorizon | |
- Up | |
- Down | |
- TimeUpEarly | |
- TimeUpLate | |
- TimeDownEarly | |
- TimeDownLate | |
- TimeUpWeHoliday | |
- | |
- | |
- | |
- | |
- | |
- | |
- | |
- | |
- | |
-
-
-
-
-
-
- NoDelay | Wurde die Behandlung von Offset deaktiviert (Beispiel bei Fahrten über Fensterevents) |
- LastDrive | Grund des letzten Fahrens |
- LastPos | die letzte Position des Rollladens |
- LastPosTimestamp | Timestamp der letzten festgestellten Position |
- LastManPos | Position der letzten manuellen Fahrt |
- LastManPosTimestamp | Timestamp der letzten manuellen Position |
- SunsetUnixTime | berechnete Unixzeit für Abends (Sonnenuntergang) |
- Sunset | 1=Abendfahrt wurde durchgeführt, 0=noch keine Abendfahrt durchgeführt |
- SunriseUnixTime | berechnete Unixzeit für Morgens (Sonnenaufgang) |
- Sunrise | 1=Morgenfahrt wurde durchgeführt, 0=noch keine Morgenfahrt durchgeführt |
- RoommatesStatus | aktueller Status der/des Roommate/s für den Rollladen |
- RoommatesLastStatus | letzter Status der/des Roommate/s für den Rollladen |
- ShadingStatus | Ausgabe des aktuellen Shading Status, „in“, „out“, „in reserved“, „out reserved“ |
- ShadingStatusTimestamp | Timestamp des letzten Beschattungsstatus |
- IfInShading | Befindet sich der Rollladen, in Abhängigkeit des Shading Mode, in der Beschattung |
- DelayCmd | letzter Fahrbefehl welcher in die Warteschlange kam. Grund z.B. Partymodus. |
- Status | Position des Rollladens |
- ASCenable | Abfrage ob für den Rollladen die ASC Steuerung aktiv ist. |
- IsDay | Abfrage ob das Rollo im Tag oder Nachtmodus ist. Also nach Sunset oder nach Sunrise |
- PrivacyDownStatus | Abfrage ob das Rollo aktuell im PrivacyDown Status steht |
- OutTemp | aktuelle Außentemperatur sofern ein Sensor definiert ist, wenn nicht kommt -100 als Wert zurück |
-
-
- Übersicht für das Rollladen-Device mit Parameterübergabe
-
- { ascAPIget('Getter','ROLLODEVICENAME',VALUE) }
-
-
- Getter | Erläuterung |
- QueryShuttersPos | Rückgabewert 1 bedeutet das die aktuelle Position des Rollos unterhalb der Valueposition ist. 0 oder nichts bedeutet oberhalb der Valueposition. |
-
-
- Übersicht für das ASC Device
-
- { ascAPIget('Getter') }
-
-
- Getter | Erläuterung |
- OutTemp | aktuelle Außentemperatur sofern ein Sensor definiert ist, wenn nicht kommt -100 als Wert zurück |
- ResidentsStatus | aktueller Status des Residents Devices |
- ResidentsLastStatus | letzter Status des Residents Devices |
- Azimuth | Azimut Wert |
- Elevation | Elevation Wert |
- ASCenable | ist die ASC Steuerung global aktiv? |
-
-
-
-=end html_DE
-
-=for :application/json;q=META.json 73_AutoShuttersControl.pm
-{
- "abstract": "Module for controlling shutters depending on various conditions",
- "x_lang": {
- "de": {
- "abstract": "Modul zur Automatischen Rolladensteuerung auf Basis bestimmter Ereignisse"
- }
- },
- "keywords": [
- "fhem-mod-device",
- "fhem-core",
- "Shutter",
- "Automation",
- "Rollladen",
- "Rollo",
- "Control"
- ],
- "release_status": "testing",
- "license": "GPL_2",
- "version": "v0.9.20",
- "author": [
- "Marko Oldenburg "
- ],
- "x_fhem_maintainer": [
- "CoolTux"
- ],
- "x_fhem_maintainer_github": [
- "LeonGaultier"
- ],
- "prereqs": {
- "runtime": {
- "requires": {
- "FHEM": 5.00918799,
- "perl": 5.016,
- "Meta": 0,
- "JSON": 0,
- "Date::Parse": 0
- },
- "recommends": {
- },
- "suggests": {
- }
- }
- }
-}
-=end :application/json;q=META.json
-
-=cut
diff --git a/lib/FHEM/Automation/ShuttersControl/Dev.pm b/lib/FHEM/Automation/ShuttersControl/Dev.pm
new file mode 100644
index 0000000..71a92bb
--- /dev/null
+++ b/lib/FHEM/Automation/ShuttersControl/Dev.pm
@@ -0,0 +1,79 @@
+###############################################################################
+#
+# Developed with Kate
+#
+# (c) 2018-2020 Copyright: Marko Oldenburg (leongaultier at gmail dot com)
+# All rights reserved
+#
+# Special thanks goes to:
+# - Bernd (Cluni) this module is based on the logic of his script "Rollladensteuerung für HM/ROLLO inkl. Abschattung und Komfortfunktionen in Perl" (https://forum.fhem.de/index.php/topic,73964.0.html)
+# - Beta-User for many tests, many suggestions and good discussions
+# - pc1246 write english commandref
+# - FunkOdyssey commandref style
+# - sledge fix many typo in commandref
+# - many User that use with modul and report bugs
+# - Christoph (christoph.kaiser.in) Patch that expand RegEx for Window Events
+# - Julian (Loredo) expand Residents Events for new Residents functions
+# - Christoph (Christoph Morrison) for fix Commandref, many suggestions and good discussions
+#
+#
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License,or
+# any later version.
+#
+# The GNU General Public License can be found at
+# http://www.gnu.org/copyleft/gpl.html.
+# A copy is found in the textfile GPL.txt and important notices to the license
+# from the author is found in LICENSE.txt distributed with these scripts.
+#
+# This script is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+#
+# $Id$
+#
+###############################################################################
+
+## Klasse ASC_Dev plus Subklassen ASC_Attr_Dev und ASC_Readings_Dev##
+package FHEM::Automation::ShuttersControl::Dev;
+our @ISA = qw(FHEM::Automation::ShuttersControl::Dev::Readings FHEM::Automation::ShuttersControl::Dev::Attr);
+
+use strict;
+use warnings;
+use utf8;
+
+sub new {
+ my $class = shift;
+
+ my $self = { name => undef, };
+
+ bless $self, $class;
+ return $self;
+}
+
+sub setName {
+ my $self = shift;
+ my $name = shift;
+
+ $self->{name} = $name if ( defined($name) );
+ return $self->{name};
+}
+
+sub setDefault {
+ my $self = shift;
+ my $defaultarg = shift;
+
+ $self->{defaultarg} = $defaultarg if ( defined($defaultarg) );
+ return $self->{defaultarg};
+}
+
+sub getName {
+ my $self = shift;
+ return $self->{name};
+}
+
+
+1;
diff --git a/lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm b/lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm
new file mode 100644
index 0000000..3825771
--- /dev/null
+++ b/lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm
@@ -0,0 +1,388 @@
+###############################################################################
+#
+# Developed with Kate
+#
+# (c) 2018-2020 Copyright: Marko Oldenburg (leongaultier at gmail dot com)
+# All rights reserved
+#
+# Special thanks goes to:
+# - Bernd (Cluni) this module is based on the logic of his script "Rollladensteuerung für HM/ROLLO inkl. Abschattung und Komfortfunktionen in Perl" (https://forum.fhem.de/index.php/topic,73964.0.html)
+# - Beta-User for many tests, many suggestions and good discussions
+# - pc1246 write english commandref
+# - FunkOdyssey commandref style
+# - sledge fix many typo in commandref
+# - many User that use with modul and report bugs
+# - Christoph (christoph.kaiser.in) Patch that expand RegEx for Window Events
+# - Julian (Loredo) expand Residents Events for new Residents functions
+# - Christoph (Christoph Morrison) for fix Commandref, many suggestions and good discussions
+#
+#
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License,or
+# any later version.
+#
+# The GNU General Public License can be found at
+# http://www.gnu.org/copyleft/gpl.html.
+# A copy is found in the textfile GPL.txt and important notices to the license
+# from the author is found in LICENSE.txt distributed with these scripts.
+#
+# This script is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+#
+# $Id$
+#
+###############################################################################
+
+## Subklasse Attr ##
+package ASC_Dev::Attr;
+
+use strict;
+use warnings;
+use utf8;
+
+use GPUtils qw(GP_Import);
+
+## Import der FHEM Funktionen
+BEGIN {
+ GP_Import(
+ qw(
+ AttrVal
+ gettimeofday)
+ );
+}
+
+sub getShuttersOffset {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return AttrVal( $name, 'ASC_shuttersDriveDelay', -1 );
+}
+
+sub getBrightnessMinVal {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return $self->{ASC_brightness}->{triggermin}
+ if ( exists( $self->{ASC_brightness}->{LASTGETTIME} )
+ && ( gettimeofday() - $self->{ASC_brightness}->{LASTGETTIME} ) < 2 );
+ $ascDev->getBrightnessMaxVal;
+
+ return $self->{ASC_brightness}->{triggermin};
+}
+
+sub getBrightnessMaxVal {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return $self->{ASC_brightness}->{triggermax}
+ if ( exists( $self->{ASC_brightness}->{LASTGETTIME} )
+ && ( gettimeofday() - $self->{ASC_brightness}->{LASTGETTIME} ) < 2 );
+ $self->{ASC_brightness}->{LASTGETTIME} = int( gettimeofday() );
+
+ my ( $triggermax, $triggermin ) =
+ FHEM::Automation::ShuttersControl::GetAttrValues( $name,
+ 'ASC_brightnessDriveUpDown', '800:500' );
+
+ ## erwartetes Ergebnis
+ # max:min
+
+ $self->{ASC_brightness}->{triggermin} = $triggermin;
+ $self->{ASC_brightness}->{triggermax} = $triggermax;
+
+ return $self->{ASC_brightness}->{triggermax};
+}
+
+sub _getTwilightDevice {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return AttrVal( $name, 'ASC_twilightDevice', 'none' );
+}
+
+sub getAutoAstroModeEvening {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return AttrVal( $name, 'ASC_autoAstroModeEvening', 'REAL' );
+}
+
+sub getAutoAstroModeEveningHorizon {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return AttrVal( $name, 'ASC_autoAstroModeEveningHorizon', 0 );
+}
+
+sub getAutoAstroModeMorning {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return AttrVal( $name, 'ASC_autoAstroModeMorning', 'REAL' );
+}
+
+sub getAutoAstroModeMorningHorizon {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return AttrVal( $name, 'ASC_autoAstroModeMorningHorizon', 0 );
+}
+
+sub getAutoShuttersControlMorning {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return AttrVal( $name, 'ASC_autoShuttersControlMorning', 'on' );
+}
+
+sub getAutoShuttersControlEvening {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return AttrVal( $name, 'ASC_autoShuttersControlEvening', 'on' );
+}
+
+sub getAutoShuttersControlComfort {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return AttrVal( $name, 'ASC_autoShuttersControlComfort', 'off' );
+}
+
+sub getFreezeTemp {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return AttrVal( $name, 'ASC_freezeTemp', 3 );
+}
+
+sub getSlatDriveCmdInverse {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return AttrVal( $name, 'ASC_slatDriveCmdInverse', 0 );
+}
+
+sub _getTempSensor {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return $self->{ASC_tempSensor}->{device}
+ if ( exists( $self->{ASC_tempSensor}->{LASTGETTIME} )
+ && ( gettimeofday() - $self->{ASC_tempSensor}->{LASTGETTIME} ) < 2 );
+ $self->{ASC_tempSensor}->{LASTGETTIME} = int( gettimeofday() );
+ my ( $device, $reading ) =
+ FHEM::Automation::ShuttersControl::GetAttrValues( $name, 'ASC_tempSensor',
+ 'none' );
+
+ ## erwartetes Ergebnis
+ # DEVICE:READING
+ $self->{ASC_tempSensor}->{device} = $device;
+ $self->{ASC_tempSensor}->{reading} =
+ ( $reading ne 'none' ? $reading : 'temperature' );
+
+ return $self->{ASC_tempSensor}->{device};
+}
+
+sub getTempSensorReading {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return $self->{ASC_tempSensor}->{reading}
+ if ( exists( $self->{ASC_tempSensor}->{LASTGETTIME} )
+ && ( gettimeofday() - $self->{ASC_tempSensor}->{LASTGETTIME} ) < 2 );
+ $ascDev->_getTempSensor;
+ return $self->{ASC_tempSensor}->{reading};
+}
+
+sub _getResidentsDev {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return $self->{ASC_residentsDev}->{device}
+ if ( exists( $self->{ASC_residentsDev}->{LASTGETTIME} )
+ && ( gettimeofday() - $self->{ASC_residentsDev}->{LASTGETTIME} ) < 2 );
+ $self->{ASC_residentsDev}->{LASTGETTIME} = int( gettimeofday() );
+ my ( $device, $reading ) =
+ FHEM::Automation::ShuttersControl::GetAttrValues( $name, 'ASC_residentsDev',
+ 'none' );
+
+ $self->{ASC_residentsDev}->{device} = $device;
+ $self->{ASC_residentsDev}->{reading} =
+ ( $reading ne 'none' ? $reading : 'state' );
+
+ return $self->{ASC_residentsDev}->{device};
+}
+
+sub getResidentsReading {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return $self->{ASC_residentsDev}->{reading}
+ if ( exists( $self->{ASC_residentsDev}->{LASTGETTIME} )
+ && ( gettimeofday() - $self->{ASC_residentsDev}->{LASTGETTIME} ) < 2 );
+ $ascDev->_getResidentsDev;
+ return $self->{ASC_residentsDev}->{reading};
+}
+
+sub _getRainSensor {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return $self->{ASC_rainSensor}->{device}
+ if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
+ && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
+ $self->{ASC_rainSensor}->{LASTGETTIME} = int( gettimeofday() );
+ my ( $device, $reading, $max, $hyst, $pos, $wait ) =
+ FHEM::Automation::ShuttersControl::GetAttrValues( $name, 'ASC_rainSensor',
+ 'none' );
+
+ ## erwartetes Ergebnis
+ # DEVICE:READING MAX:HYST
+
+ return $device if ( $device eq 'none' );
+ $self->{ASC_rainSensor}->{device} = $device;
+ $self->{ASC_rainSensor}->{reading} =
+ ( $reading ne 'none' ? $reading : 'state' );
+ $self->{ASC_rainSensor}->{triggermax} = ( $max ne 'none' ? $max : 1000 );
+ $self->{ASC_rainSensor}->{triggerhyst} = (
+ $hyst ne 'none'
+ ? $max - $hyst
+ : ( $self->{ASC_rainSensor}->{triggermax} * 0 )
+ );
+ $self->{ASC_rainSensor}->{shuttersClosedPos} =
+ ( $pos ne 'none' ? $pos : $shutters->getClosedPos );
+ $self->{ASC_rainSensor}->{waitingTime} =
+ ( $pos ne 'none' ? $wait : 900 );
+
+ return $self->{ASC_rainSensor}->{device};
+}
+
+sub getRainSensorReading {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return $self->{ASC_rainSensor}->{reading}
+ if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
+ && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
+ $ascDev->_getRainSensor;
+ return $self->{ASC_rainSensor}->{reading};
+}
+
+sub getRainTriggerMax {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return $self->{ASC_rainSensor}->{triggermax}
+ if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
+ && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
+ $ascDev->_getRainSensor;
+ return $self->{ASC_rainSensor}->{triggermax};
+}
+
+sub getRainTriggerMin {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return $self->{ASC_rainSensor}->{triggerhyst}
+ if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
+ && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
+ $ascDev->_getRainSensor;
+ return $self->{ASC_rainSensor}->{triggerhyst};
+}
+
+sub getRainSensorShuttersClosedPos {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return $self->{ASC_rainSensor}->{shuttersClosedPos}
+ if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
+ && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
+ $ascDev->_getRainSensor;
+ return $self->{ASC_rainSensor}->{shuttersClosedPos};
+}
+
+sub getRainWaitingTime {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return $self->{ASC_rainSensor}->{waitingTime}
+ if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} )
+ && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 );
+ $ascDev->_getRainSensor;
+ return $self->{ASC_rainSensor}->{waitingTime};
+}
+
+sub _getWindSensor {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return $self->{ASC_windSensor}->{device}
+ if ( exists( $self->{ASC_windSensor}->{LASTGETTIME} )
+ && ( gettimeofday() - $self->{ASC_windSensor}->{LASTGETTIME} ) < 2 );
+ $self->{ASC_windSensor}->{LASTGETTIME} = int( gettimeofday() );
+ my ( $device, $reading ) =
+ FHEM::Automation::ShuttersControl::GetAttrValues( $name, 'ASC_windSensor',
+ 'none' );
+
+ return $device if ( $device eq 'none' );
+ $self->{ASC_windSensor}->{device} = $device;
+ $self->{ASC_windSensor}->{reading} =
+ ( $reading ne 'none' ? $reading : 'wind' );
+
+ return $self->{ASC_windSensor}->{device};
+}
+
+sub getWindSensorReading {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return $self->{ASC_windSensor}->{reading}
+ if ( exists( $self->{ASC_windSensor}->{LASTGETTIME} )
+ && ( gettimeofday() - $self->{ASC_windSensor}->{LASTGETTIME} ) < 2 );
+ $ascDev->_getWindSensor;
+ return (
+ defined( $self->{ASC_windSensor}->{reading} )
+ ? $self->{ASC_windSensor}->{reading}
+ : 'wind'
+ );
+}
+
+sub getBlockAscDrivesAfterManual {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return AttrVal( $name, 'ASC_blockAscDrivesAfterManual', 0 );
+}
+
+
+1;
diff --git a/lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm b/lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm
new file mode 100644
index 0000000..c433750
--- /dev/null
+++ b/lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm
@@ -0,0 +1,242 @@
+###############################################################################
+#
+# Developed with Kate
+#
+# (c) 2018-2020 Copyright: Marko Oldenburg (leongaultier at gmail dot com)
+# All rights reserved
+#
+# Special thanks goes to:
+# - Bernd (Cluni) this module is based on the logic of his script "Rollladensteuerung für HM/ROLLO inkl. Abschattung und Komfortfunktionen in Perl" (https://forum.fhem.de/index.php/topic,73964.0.html)
+# - Beta-User for many tests, many suggestions and good discussions
+# - pc1246 write english commandref
+# - FunkOdyssey commandref style
+# - sledge fix many typo in commandref
+# - many User that use with modul and report bugs
+# - Christoph (christoph.kaiser.in) Patch that expand RegEx for Window Events
+# - Julian (Loredo) expand Residents Events for new Residents functions
+# - Christoph (Christoph Morrison) for fix Commandref, many suggestions and good discussions
+#
+#
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License,or
+# any later version.
+#
+# The GNU General Public License can be found at
+# http://www.gnu.org/copyleft/gpl.html.
+# A copy is found in the textfile GPL.txt and important notices to the license
+# from the author is found in LICENSE.txt distributed with these scripts.
+#
+# This script is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+#
+# $Id$
+#
+###############################################################################
+
+## Subklasse Readings ##
+package FHEM::Automation::ShuttersControl::Dev::Readings;
+
+use strict;
+use warnings;
+use utf8;
+
+use GPUtils qw(GP_Import);
+
+## Import der FHEM Funktionen
+BEGIN {
+ GP_Import(
+ qw(
+ readingsSingleUpdate
+ ReadingsVal
+ defs)
+ );
+}
+
+sub setDelayCmdReading {
+ my $self = shift;
+
+ my $name = $self->{name};
+ my $hash = $defs{$name};
+
+ readingsSingleUpdate( $hash,
+ $shutters->getShuttersDev . '_lastDelayPosValue',
+ $shutters->getDelayCmd, 1 );
+ return;
+}
+
+sub setStateReading {
+ my $self = shift;
+ my $value = shift;
+
+ my $name = $self->{name};
+ my $hash = $defs{$name};
+
+ readingsSingleUpdate( $hash, 'state',
+ ( defined($value) ? $value : $shutters->getLastDrive ), 1 );
+ return;
+}
+
+sub setPosReading {
+ my $self = shift;
+
+ my $name = $self->{name};
+ my $hash = $defs{$name};
+
+ readingsSingleUpdate( $hash, $shutters->getShuttersDev . '_PosValue',
+ $shutters->getStatus, 1 );
+ return;
+}
+
+sub setLastPosReading {
+ my $self = shift;
+
+ my $name = $self->{name};
+ my $hash = $defs{$name};
+
+ readingsSingleUpdate( $hash, $shutters->getShuttersDev . '_lastPosValue',
+ $shutters->getLastPos, 1 );
+ return;
+}
+
+sub getPartyMode {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return ReadingsVal( $name, 'partyMode', 'off' );
+}
+
+sub getHardLockOut {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return ReadingsVal( $name, 'hardLockOut', 'none' );
+}
+
+sub getSunriseTimeWeHoliday {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return ReadingsVal( $name, 'sunriseTimeWeHoliday', 'none' );
+}
+
+sub getMonitoredDevs {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ $self->{monitoredDevs} = ReadingsVal( $name, '.monitoredDevs', 'none' );
+ return $self->{monitoredDevs};
+}
+
+sub getOutTemp {
+ my $self = shift;
+
+ return ReadingsVal( $ascDev->_getTempSensor, $ascDev->getTempSensorReading,
+ -100 );
+}
+
+sub getResidentsStatus {
+ my $self = shift;
+
+ my $val =
+ ReadingsVal( $ascDev->_getResidentsDev, $ascDev->getResidentsReading,
+ 'none' );
+
+ if ( $val =~ m{^(?:(.+)_)?(.+)$}xms ) {
+ return ( $1, $2 ) if (wantarray);
+ return $1 && $1 eq 'pet' ? 'absent' : $2;
+ }
+ elsif (
+ ReadingsVal( $ascDev->_getResidentsDev, 'homealoneType', '-' ) eq
+ 'PET' )
+ {
+ return ( 'pet', 'absent' ) if (wantarray);
+ return 'absent';
+ }
+ else {
+ return ( undef, $val ) if (wantarray);
+ return $val;
+ }
+}
+
+sub getResidentsLastStatus {
+ my $self = shift;
+
+ my $val = ReadingsVal( $ascDev->_getResidentsDev, 'lastState', 'none' );
+
+ if ( $val =~ m{^(?:(.+)_)?(.+)$}xms ) {
+ return ( $1, $2 ) if (wantarray);
+ return $1 && $1 eq 'pet' ? 'absent' : $2;
+ }
+ elsif (
+ ReadingsVal( $ascDev->_getResidentsDev, 'lastHomealoneType', '-' ) eq
+ 'PET' )
+ {
+ return ( 'pet', 'absent' ) if (wantarray);
+ return 'absent';
+ }
+ else {
+ return ( undef, $val ) if (wantarray);
+ return $val;
+ }
+}
+
+sub getAutoShuttersControlShading {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return ReadingsVal( $name, 'controlShading', 'none' );
+}
+
+sub getSelfDefense {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return ReadingsVal( $name, 'selfDefense', 'none' );
+}
+
+sub getAzimuth {
+ my $self = shift;
+
+ my $azimuth;
+
+ $azimuth = ReadingsVal( $ascDev->_getTwilightDevice, 'azimuth', -1 )
+ if ( $defs{ $ascDev->_getTwilightDevice }->{TYPE} eq 'Twilight' );
+ $azimuth = ReadingsVal( $ascDev->_getTwilightDevice, 'SunAz', -1 )
+ if ( $defs{ $ascDev->_getTwilightDevice }->{TYPE} eq 'Astro' );
+
+ return $azimuth;
+}
+
+sub getElevation {
+ my $self = shift;
+
+ my $elevation;
+
+ $elevation = ReadingsVal( $ascDev->_getTwilightDevice, 'elevation', -1 )
+ if ( $defs{ $ascDev->_getTwilightDevice }->{TYPE} eq 'Twilight' );
+ $elevation = ReadingsVal( $ascDev->_getTwilightDevice, 'SunAlt', -1 )
+ if ( $defs{ $ascDev->_getTwilightDevice }->{TYPE} eq 'Astro' );
+
+ return $elevation;
+}
+
+sub getASCenable {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return ReadingsVal( $name, 'ascEnable', 'none' );
+}
+
+
+1;
diff --git a/lib/FHEM/Automation/ShuttersControl/Roommate.pm b/lib/FHEM/Automation/ShuttersControl/Roommate.pm
new file mode 100644
index 0000000..071da3f
--- /dev/null
+++ b/lib/FHEM/Automation/ShuttersControl/Roommate.pm
@@ -0,0 +1,76 @@
+###############################################################################
+#
+# Developed with Kate
+#
+# (c) 2018-2020 Copyright: Marko Oldenburg (leongaultier at gmail dot com)
+# All rights reserved
+#
+# Special thanks goes to:
+# - Bernd (Cluni) this module is based on the logic of his script "Rollladensteuerung für HM/ROLLO inkl. Abschattung und Komfortfunktionen in Perl" (https://forum.fhem.de/index.php/topic,73964.0.html)
+# - Beta-User for many tests, many suggestions and good discussions
+# - pc1246 write english commandref
+# - FunkOdyssey commandref style
+# - sledge fix many typo in commandref
+# - many User that use with modul and report bugs
+# - Christoph (christoph.kaiser.in) Patch that expand RegEx for Window Events
+# - Julian (Loredo) expand Residents Events for new Residents functions
+# - Christoph (Christoph Morrison) for fix Commandref, many suggestions and good discussions
+#
+#
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License,or
+# any later version.
+#
+# The GNU General Public License can be found at
+# http://www.gnu.org/copyleft/gpl.html.
+# A copy is found in the textfile GPL.txt and important notices to the license
+# from the author is found in LICENSE.txt distributed with these scripts.
+#
+# This script is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+#
+# $Id$
+#
+###############################################################################
+
+## Klasse ASC_Roommate ##
+package FHEM::Automation::ShuttersControl::Roommate;
+
+use strict;
+use warnings;
+use utf8;
+
+use GPUtils qw(GP_Import);
+
+## Import der FHEM Funktionen
+BEGIN {
+ GP_Import(
+ qw(
+ ReadingsVal)
+ );
+}
+
+sub _getRoommateStatus {
+ my $self = shift;
+
+ my $roommate = $self->{roommate};
+
+ return ReadingsVal( $roommate, $shutters->getRoommatesReading, 'none' );
+}
+
+sub _getRoommateLastStatus {
+ my $self = shift;
+
+ my $roommate = $self->{roommate};
+ my $default = $self->{defaultarg};
+
+ $default = 'none' if ( !defined($default) );
+ return ReadingsVal( $roommate, 'lastState', $default );
+}
+
+
+1;
diff --git a/lib/FHEM/Automation/ShuttersControl/Shutters.pm b/lib/FHEM/Automation/ShuttersControl/Shutters.pm
new file mode 100644
index 0000000..058a1fa
--- /dev/null
+++ b/lib/FHEM/Automation/ShuttersControl/Shutters.pm
@@ -0,0 +1,937 @@
+###############################################################################
+#
+# Developed with Kate
+#
+# (c) 2018-2020 Copyright: Marko Oldenburg (leongaultier at gmail dot com)
+# All rights reserved
+#
+# Special thanks goes to:
+# - Bernd (Cluni) this module is based on the logic of his script "Rollladensteuerung für HM/ROLLO inkl. Abschattung und Komfortfunktionen in Perl" (https://forum.fhem.de/index.php/topic,73964.0.html)
+# - Beta-User for many tests, many suggestions and good discussions
+# - pc1246 write english commandref
+# - FunkOdyssey commandref style
+# - sledge fix many typo in commandref
+# - many User that use with modul and report bugs
+# - Christoph (christoph.kaiser.in) Patch that expand RegEx for Window Events
+# - Julian (Loredo) expand Residents Events for new Residents functions
+# - Christoph (Christoph Morrison) for fix Commandref, many suggestions and good discussions
+#
+#
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License,or
+# any later version.
+#
+# The GNU General Public License can be found at
+# http://www.gnu.org/copyleft/gpl.html.
+# A copy is found in the textfile GPL.txt and important notices to the license
+# from the author is found in LICENSE.txt distributed with these scripts.
+#
+# This script is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+#
+# $Id$
+#
+###############################################################################
+
+######################################
+######################################
+########## Begin der Klassendeklarierungen für OOP (Objektorientierte Programmierung) #########################
+## Klasse Rolläden (Shutters) und die Subklassen Attr und Readings ##
+## desweiteren wird noch die Klasse ASC_Roommate mit eingebunden
+
+package FHEM::Automation::ShuttersControl::Shutters;
+our @ISA =
+ qw(FHEM::Automation::ShuttersControl::Shutters::Readings FHEM::Automation::ShuttersControl::Shutters::Attr FHEM::Automation::ShuttersControl::Roommate FHEM::Automation::ShuttersControl::Window);
+
+use strict;
+use warnings;
+use utf8;
+
+use GPUtils qw(GP_Import);
+
+## Import der FHEM Funktionen
+BEGIN {
+ GP_Import(
+ qw(
+ defs
+ ReadingsVal
+ readingsSingleUpdate
+ gettimeofday
+ InternalTimer
+ CommandSet
+ Log3)
+ );
+}
+
+sub new {
+ my $class = shift;
+ my $self = {
+ shuttersDev => undef,
+ defaultarg => undef,
+ roommate => undef,
+ };
+
+ bless $self, $class;
+ return $self;
+}
+
+sub setShuttersDev {
+ my $self = shift;
+ my $shuttersDev = shift;
+
+ $self->{shuttersDev} = $shuttersDev if ( defined($shuttersDev) );
+ return $self->{shuttersDev};
+}
+
+sub getShuttersDev {
+ my $self = shift;
+
+ return $self->{shuttersDev};
+}
+
+sub setAttrUpdateChanges {
+ my ( $self, $attr, $value ) = @_;
+
+ $self->{ $self->{shuttersDev} }{AttrUpdateChanges}{$attr} = $value;
+ return;
+}
+
+sub setHardLockOut {
+ my $self = shift;
+ my $cmd = shift;
+
+ if ( $shutters->getLockOut eq 'hard'
+ && $shutters->getLockOutCmd ne 'none' )
+ {
+ CommandSet( undef, $self->{shuttersDev} . ' inhibit ' . $cmd )
+ if ( $shutters->getLockOutCmd eq 'inhibit' );
+ CommandSet( undef,
+ $self->{shuttersDev} . ' '
+ . ( $cmd eq 'on' ? 'blocked' : 'unblocked' ) )
+ if ( $shutters->getLockOutCmd eq 'blocked' );
+ CommandSet( undef,
+ $self->{shuttersDev} . ' '
+ . ( $cmd eq 'on' ? 'protectionOn' : 'protectionOff' ) )
+ if ( $shutters->getLockOutCmd eq 'protected' );
+ }
+ return;
+}
+
+sub setNoDelay {
+ my $self = shift;
+ my $noDelay = shift;
+
+ $self->{ $self->{shuttersDev} }{noDelay} = $noDelay;
+ return;
+}
+
+sub setSelfDefenseAbsent {
+ my ( $self, $timerrun, $active, $timerhash ) = @_;
+
+ $self->{ $self->{shuttersDev} }{selfDefenseAbsent}{timerrun} = $timerrun;
+ $self->{ $self->{shuttersDev} }{selfDefenseAbsent}{active} = $active;
+ $self->{ $self->{shuttersDev} }{selfDefenseAbsent}{timerhash} = $timerhash
+ if ( defined($timerhash) );
+ return;
+}
+
+sub setDriveCmd {
+ my $self = shift;
+ my $posValue = shift;
+
+ my $offSet;
+ my $offSetStart;
+
+ if (
+ ( $shutters->getPartyMode eq 'on' && $ascDev->getPartyMode eq 'on' )
+ || ( $shutters->getAdv
+ && !$shutters->getQueryShuttersPos($posValue)
+ && !$shutters->getAdvDelay
+ && !$shutters->getExternalTriggerState
+ && !$shutters->getSelfDefenseState )
+ )
+ {
+ $shutters->setDelayCmd($posValue);
+ $ascDev->setDelayCmdReading;
+ $shutters->setNoDelay(0);
+ $shutters->setExternalTriggerState(0)
+ if ( $shutters->getExternalTriggerState );
+
+ FHEM::AutoShuttersControl::ASC_Debug( 'setDriveCmd: '
+ . $shutters->getShuttersDev
+ . ' - Die Fahrt wird zurückgestellt. Grund kann ein geöffnetes Fenster sein oder ein aktivierter Party Modus oder Weihnachtszeit'
+ );
+ }
+ else {
+ $shutters->setAdvDelay(0)
+ if ( $shutters->getAdvDelay );
+ $shutters->setDelayCmd('none')
+ if ( $shutters->getDelayCmd ne 'none' )
+ ; # setzt den Wert auf none da der Rolladen nun gesteuert werden kann.
+ $shutters->setExternalTriggerState(0)
+ if ( $shutters->getExternalTriggerState );
+
+ ### antifreeze Routine
+ if ( $shutters->getAntiFreezeStatus > 0 ) {
+ if ( $shutters->getAntiFreezeStatus != 1 ) {
+
+ $posValue = $shutters->getStatus;
+ $shutters->setLastDrive('no drive - antifreeze defense');
+ $shutters->setLastDriveReading;
+ $ascDev->setStateReading;
+ }
+ elsif ( $posValue == $shutters->getClosedPos ) {
+ $posValue = $shutters->getAntiFreezePos;
+ $shutters->setLastDrive(
+ $shutters->getLastDrive . ' - antifreeze mode' );
+ }
+ }
+
+ my %h = (
+ shuttersDev => $self->{shuttersDev},
+ posValue => $posValue,
+ );
+
+ $offSet = $shutters->getDelay if ( $shutters->getDelay > -1 );
+ $offSet = $ascDev->getShuttersOffset if ( $shutters->getDelay < 0 );
+ $offSetStart = $shutters->getDelayStart;
+
+ if ( $shutters->getSelfDefenseAbsent
+ && !$shutters->getSelfDefenseAbsentTimerrun
+ && $shutters->getSelfDefenseMode ne 'off'
+ && $shutters->getSelfDefenseState
+ && $ascDev->getSelfDefense eq 'on' )
+ {
+ InternalTimer(
+ gettimeofday() + $shutters->getSelfDefenseAbsentDelay,
+ \&FHEM::Automation::ShuttersControl::_SetCmdFn, \%h );
+ $shutters->setSelfDefenseAbsent( 1, 0, \%h );
+ }
+ elsif ( $offSetStart > 0 && !$shutters->getNoDelay ) {
+ InternalTimer(
+ gettimeofday() +
+ int( rand($offSet) + $shutters->getDelayStart ),
+ \&FHEM::Automation::ShuttersControl::_SetCmdFn, \%h
+ );
+
+ FHEM::AutoShuttersControl::ASC_Debug( 'FnSetDriveCmd: '
+ . $shutters->getShuttersDev
+ . ' - versetztes fahren' );
+ }
+ elsif ( $offSetStart < 1 || $shutters->getNoDelay ) {
+ FHEM::Automation::ShuttersControl::_SetCmdFn( \%h );
+ FHEM::AutoShuttersControl::ASC_Debug( 'FnSetDriveCmd: '
+ . $shutters->getShuttersDev
+ . ' - NICHT versetztes fahren' );
+ }
+
+ FHEM::AutoShuttersControl::ASC_Debug( 'FnSetDriveCmd: '
+ . $shutters->getShuttersDev
+ . ' - NoDelay: '
+ . ( $shutters->getNoDelay ? 'JA' : 'NEIN' ) );
+ $shutters->setNoDelay(0);
+ }
+
+ return;
+}
+
+sub setSunsetUnixTime {
+ my $self = shift;
+ my $unixtime = shift;
+
+ $self->{ $self->{shuttersDev} }{sunsettime} = $unixtime;
+ return;
+}
+
+sub setSunset {
+ my $self = shift;
+ my $value = shift;
+
+ $self->{ $self->{shuttersDev} }{sunset} = $value;
+ return;
+}
+
+sub setSunriseUnixTime {
+ my $self = shift;
+ my $unixtime = shift;
+
+ $self->{ $self->{shuttersDev} }{sunrisetime} = $unixtime;
+ return;
+}
+
+sub setSunrise {
+ my $self = shift;
+ my $value = shift;
+
+ $self->{ $self->{shuttersDev} }{sunrise} = $value;
+ return;
+}
+
+sub setDelayCmd {
+ my $self = shift;
+ my $posValue = shift;
+
+ $self->{ $self->{shuttersDev} }{delayCmd} = $posValue;
+ return;
+}
+
+sub setLastDrive {
+ my $self = shift;
+ my $lastDrive = shift;
+
+ $self->{ $self->{shuttersDev} }{lastDrive} = $lastDrive;
+ return;
+}
+
+sub setPosSetCmd {
+ my $self = shift;
+ my $posSetCmd = shift;
+
+ $self->{ $self->{shuttersDev} }{posSetCmd} = $posSetCmd;
+ return;
+}
+
+sub setLastDriveReading {
+ my $self = shift;
+ my $shuttersDevHash = $defs{ $self->{shuttersDev} };
+
+ my %h = (
+ devHash => $shuttersDevHash,
+ lastDrive => $shutters->getLastDrive,
+ );
+
+ InternalTimer( gettimeofday() + 0.1,
+ \&FHEM::Automation::ShuttersControl::_setShuttersLastDriveDelayed, \%h );
+ return;
+}
+
+sub setLastPos {
+
+# letzte ermittelte Position bevor die Position des Rolladen über ASC geändert wurde
+ my $self = shift;
+ my $position = shift;
+
+ $self->{ $self->{shuttersDev} }{lastPos}{VAL} = $position
+ if ( defined($position) );
+ $self->{ $self->{shuttersDev} }{lastPos}{TIME} = int( gettimeofday() )
+ if ( defined( $self->{ $self->{shuttersDev} }{lastPos} ) );
+ return;
+}
+
+sub setLastManPos {
+ my $self = shift;
+ my $position = shift;
+
+ $self->{ $self->{shuttersDev} }{lastManPos}{VAL} = $position
+ if ( defined($position) );
+ $self->{ $self->{shuttersDev} }{lastManPos}{TIME} = int( gettimeofday() )
+ if ( defined( $self->{ $self->{shuttersDev} }{lastManPos} )
+ && defined( $self->{ $self->{shuttersDev} }{lastManPos}{TIME} ) );
+ $self->{ $self->{shuttersDev} }{lastManPos}{TIME} =
+ int( gettimeofday() ) - 86400
+ if ( defined( $self->{ $self->{shuttersDev} }{lastManPos} )
+ && !defined( $self->{ $self->{shuttersDev} }{lastManPos}{TIME} ) );
+ return;
+}
+
+sub setDefault {
+ my $self = shift;
+ my $defaultarg = shift;
+
+ $self->{defaultarg} = $defaultarg if ( defined($defaultarg) );
+ return $self->{defaultarg};
+}
+
+sub setRoommate {
+ my $self = shift;
+ my $roommate = shift;
+
+ $self->{roommate} = $roommate if ( defined($roommate) );
+ return $self->{roommate};
+}
+
+sub setInTimerFuncHash {
+ my $self = shift;
+ my $inTimerFuncHash = shift;
+
+ $self->{ $self->{shuttersDev} }{inTimerFuncHash} = $inTimerFuncHash
+ if ( defined($inTimerFuncHash) );
+ return;
+}
+
+sub setPrivacyDownStatus {
+ my $self = shift;
+ my $statusValue = shift;
+
+ $self->{ $self->{shuttersDev} }->{privacyDownStatus} = $statusValue;
+ return;
+}
+
+sub setPrivacyUpStatus {
+ my $self = shift;
+ my $statusValue = shift;
+
+ $self->{ $self->{shuttersDev} }->{privacyUpStatus} = $statusValue;
+ return;
+}
+
+sub setSelfDefenseState {
+ my $self = shift;
+ my $value = shift;
+
+ $self->{ $self->{shuttersDev} }{selfDefenseState} = $value;
+ return;
+}
+
+sub setAdvDelay {
+ my $self = shift;
+ my $advDelay = shift;
+
+ $self->{ $self->{shuttersDev} }->{AdvDelay} = $advDelay;
+ return;
+}
+
+sub getHomemode {
+ my $self = shift;
+
+ my $homemode = $shutters->getRoommatesStatus;
+ $homemode = $ascDev->getResidentsStatus
+ if ( $homemode eq 'none' );
+ return $homemode;
+}
+
+sub getAdvDelay {
+ my $self = shift;
+
+ return (
+ defined( $self->{ $self->{shuttersDev} }->{AdvDelay} )
+ ? $self->{ $self->{shuttersDev} }->{AdvDelay}
+ : 0
+ );
+}
+
+sub getPrivacyDownStatus {
+ my $self = shift;
+
+ return (
+ defined( $self->{ $self->{shuttersDev} }->{privacyDownStatus} )
+ ? $self->{ $self->{shuttersDev} }->{privacyDownStatus}
+ : undef
+ );
+}
+
+sub getPrivacyUpStatus {
+ my $self = shift;
+
+ return (
+ defined( $self->{ $self->{shuttersDev} }->{privacyUpStatus} )
+ ? $self->{ $self->{shuttersDev} }->{privacyUpStatus}
+ : undef
+ );
+}
+
+sub getAttrUpdateChanges {
+ my $self = shift;
+ my $attr = shift;
+
+ return (
+ defined( $self->{ $self->{shuttersDev} }{AttrUpdateChanges} )
+ && defined(
+ $self->{ $self->{shuttersDev} }{AttrUpdateChanges}{$attr} )
+ ? $self->{ $self->{shuttersDev} }{AttrUpdateChanges}{$attr}
+ : 'none'
+ );
+}
+
+sub getIsDay {
+ my $self = shift;
+
+ return FHEM::AutoShuttersControl::_IsDay( $self->{shuttersDev} );
+}
+
+sub getAntiFreezeStatus {
+ use POSIX qw(strftime);
+ my $self = shift;
+ my $daytime = strftime( "%P", localtime() );
+ $daytime = (
+ defined($daytime) && $daytime
+ ? $daytime
+ : ( strftime( "%k", localtime() ) < 12 ? 'am' : 'pm' )
+ );
+ my $outTemp = $ascDev->getOutTemp;
+
+# $outTemp = $shutters->getOutTemp if ( $shutters->getOutTemp != -100 ); sollte raus das der Sensor im Rollo auch ein Innentemperatursensor sein kann.
+
+ if ( $shutters->getAntiFreeze ne 'off'
+ && $outTemp <= $ascDev->getFreezeTemp )
+ {
+
+ if ( $shutters->getAntiFreeze eq 'soft' ) {
+ return 1;
+ }
+ elsif ( $shutters->getAntiFreeze eq $daytime ) {
+ return 2;
+ }
+ elsif ( $shutters->getAntiFreeze eq 'hard' ) {
+ return 3;
+ }
+ }
+ else { return 0; }
+}
+
+sub getShuttersPosCmdValueNegate {
+ my $self = shift;
+
+ return ( $shutters->getOpenPos < $shutters->getClosedPos ? 1 : 0 );
+}
+
+sub getQueryShuttersPos
+{ # Es wird geschaut ob die aktuelle Position des Rollos unterhalb der Zielposition ist
+ my $self = shift;
+ my $posValue = shift; # wenn dem so ist wird 1 zurück gegeben ansonsten 0
+
+ return (
+ $shutters->getShuttersPosCmdValueNegate
+ ? $shutters->getStatus > $posValue
+ : $shutters->getStatus < $posValue
+ );
+}
+
+sub getPosSetCmd {
+ my $self = shift;
+
+ return (
+ defined( $self->{ $self->{shuttersDev} }{posSetCmd} )
+ ? $self->{ $self->{shuttersDev} }{posSetCmd}
+ : $shutters->getPosCmd
+ );
+}
+
+sub getNoDelay {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }{noDelay};
+}
+
+sub getSelfDefenseState {
+ my $self = shift;
+
+ return (
+ defined( $self->{ $self->{shuttersDev} }{selfDefenseState} )
+ ? $self->{ $self->{shuttersDev} }{selfDefenseState}
+ : 0
+ );
+}
+
+sub getSelfDefenseAbsent {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }{selfDefenseAbsent}{active};
+}
+
+sub getSelfDefenseAbsentTimerrun {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }{selfDefenseAbsent}{timerrun};
+}
+
+sub getSelfDefenseAbsentTimerhash {
+ my $self = shift;
+
+ return (
+ defined(
+ $self->{ $self->{shuttersDev} }{selfDefenseAbsent}{timerhash}
+ )
+ ? $self->{ $self->{shuttersDev} }{selfDefenseAbsent}{timerhash}
+ : undef
+ );
+}
+
+sub getLastDrive {
+ my $self = shift;
+
+ $self->{ $self->{shuttersDev} }{lastDrive} =
+ ReadingsVal( $self->{shuttersDev}, 'ASC_ShuttersLastDrive', 'none' )
+ if ( !defined( $self->{ $self->{shuttersDev} }{lastDrive} ) );
+
+ return $self->{ $self->{shuttersDev} }{lastDrive};
+}
+
+sub getLastPos
+{ # letzte ermittelte Position bevor die Position des Rolladen über ASC geändert wurde
+ my $self = shift;
+
+ return (
+ defined( $self->{ $self->{shuttersDev} }{lastPos} )
+ && defined( $self->{ $self->{shuttersDev} }{lastPos}{VAL} )
+ ? $self->{ $self->{shuttersDev} }{lastPos}{VAL}
+ : 50
+ );
+}
+
+sub getLastPosTimestamp {
+ my $self = shift;
+
+ return (
+ defined( $self->{ $self->{shuttersDev} } )
+ && defined( $self->{ $self->{shuttersDev} }{lastPos} )
+ && defined( $self->{ $self->{shuttersDev} }{lastPos}{TIME} )
+ ? $self->{ $self->{shuttersDev} }{lastPos}{TIME}
+ : 0
+ );
+}
+
+sub getLastManPos
+{ # letzte ermittelte Position bevor die Position des Rolladen manuell (nicht über ASC) geändert wurde
+ my $self = shift;
+
+ return (
+ defined( $self->{ $self->{shuttersDev} }{lastManPos} )
+ && defined( $self->{ $self->{shuttersDev} }{lastManPos}{VAL} )
+ ? $self->{ $self->{shuttersDev} }{lastManPos}{VAL}
+ : 50
+ );
+}
+
+sub getLastManPosTimestamp {
+ my $self = shift;
+
+ return (
+ defined( $self->{ $self->{shuttersDev} } )
+ && defined( $self->{ $self->{shuttersDev} }{lastManPos} )
+ && defined( $self->{ $self->{shuttersDev} }{lastManPos}{TIME} )
+ ? $self->{ $self->{shuttersDev} }{lastManPos}{TIME}
+ : 0
+ );
+}
+
+sub getInTimerFuncHash {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }{inTimerFuncHash};
+}
+
+sub getSunsetUnixTime {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }{sunsettime};
+}
+
+sub getSunset {
+ my $self = shift;
+
+ return (
+ defined( $self->{ $self->{shuttersDev} }{sunset} )
+ ? $self->{ $self->{shuttersDev} }{sunset}
+ : 0
+ );
+}
+
+sub getSunriseUnixTime {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }{sunrisetime};
+}
+
+sub getSunrise {
+ my $self = shift;
+
+ return (
+ defined( $self->{ $self->{shuttersDev} }{sunrise} )
+ ? $self->{ $self->{shuttersDev} }{sunrise}
+ : 0
+ );
+}
+
+sub getRoommatesStatus {
+ my $self = shift;
+
+ my $loop = 0;
+ my @roState;
+ my %statePrio = (
+ 'asleep' => 1,
+ 'gotosleep' => 2,
+ 'awoken' => 3,
+ 'home' => 4,
+ 'absent' => 5,
+ 'gone' => 6,
+ 'none' => 7
+ );
+ my $minPrio = 10;
+
+ for my $ro ( split( ",", $shutters->getRoommates ) ) {
+ $shutters->setRoommate($ro);
+ my $currentPrio = $statePrio{ $shutters->_getRoommateStatus };
+ $minPrio = $currentPrio if ( $minPrio > $currentPrio );
+ }
+
+ my %revStatePrio = reverse %statePrio;
+ return $revStatePrio{$minPrio};
+}
+
+sub getRoommatesLastStatus {
+ my $self = shift;
+
+ my $loop = 0;
+ my @roState;
+ my %statePrio = (
+ 'asleep' => 1,
+ 'gotosleep' => 2,
+ 'awoken' => 3,
+ 'home' => 6,
+ 'absent' => 5,
+ 'gone' => 4,
+ 'none' => 7
+ );
+ my $minPrio = 10;
+
+ for my $ro ( split( ",", $shutters->getRoommates ) ) {
+ $shutters->setRoommate($ro);
+ my $currentPrio = $statePrio{ $shutters->_getRoommateLastStatus };
+ $minPrio = $currentPrio if ( $minPrio > $currentPrio );
+ }
+
+ my %revStatePrio = reverse %statePrio;
+ return $revStatePrio{$minPrio};
+}
+
+sub getOutTemp {
+ my $self = shift;
+
+ return ReadingsVal( $shutters->_getTempSensor,
+ $shutters->getTempSensorReading, -100 );
+}
+
+sub getIdleDetection {
+ my $self = shift;
+
+ return ReadingsVal( $self->{shuttersDev},
+ $shutters->_getIdleDetectionReading, 'none' );
+}
+
+### Begin Beschattung Objekt mit Daten befüllen
+sub setShadingStatus {
+ my $self = shift;
+ my $value = shift; ### Werte für value = in, out, in reserved, out reserved
+
+ return
+ if ( defined($value)
+ && exists( $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} )
+ && $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} eq $value );
+
+ $shutters->setShadingLastStatus( ( $value eq 'in' ? 'out' : 'in' ) )
+ if ( $value eq 'in'
+ || $value eq 'out' );
+
+ $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} = $value
+ if ( defined($value) );
+ $self->{ $self->{shuttersDev} }{ShadingStatus}{TIME} = int( gettimeofday() )
+ if ( defined( $self->{ $self->{shuttersDev} }{ShadingStatus} ) );
+
+ return;
+}
+
+sub setShadingLastStatus {
+ my $self = shift;
+ my $value = shift; ### Werte für value = in, out
+
+ return
+ if ( defined($value)
+ && exists( $self->{ $self->{shuttersDev} }{ShadingLastStatus}{VAL} )
+ && $self->{ $self->{shuttersDev} }{ShadingLastStatus}{VAL} eq $value );
+
+ $self->{ $self->{shuttersDev} }{ShadingLastStatus}{VAL} = $value
+ if ( defined($value) );
+ $self->{ $self->{shuttersDev} }{ShadingLastStatus}{TIME} =
+ int( gettimeofday() )
+ if ( defined( $self->{ $self->{shuttersDev} }{ShadingLastStatus} ) );
+ $self->{ $self->{shuttersDev} }{ShadingManualDriveStatus}{VAL} = 0
+ if ( $value eq 'out' );
+
+ return;
+}
+
+sub setShadingManualDriveStatus {
+ my $self = shift;
+ my $value = shift; ### Werte für value = 0, 1
+
+ $self->{ $self->{shuttersDev} }{ShadingManualDriveStatus}{VAL} = $value
+ if ( defined($value) );
+
+ return;
+}
+
+sub setWindProtectionStatus { # Werte protected, unprotected
+ my $self = shift;
+ my $value = shift;
+
+ $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{VAL} = $value
+ if ( defined($value) );
+
+ return;
+}
+
+sub setRainProtectionStatus { # Werte protected, unprotected
+ my $self = shift;
+ my $value = shift;
+
+ $self->{ $self->{shuttersDev} }->{RainProtection}->{VAL} = $value
+ if ( defined($value) );
+ return;
+}
+
+sub setExternalTriggerState {
+ my $self = shift;
+ my $value = shift;
+
+ $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{event} = $value
+ if ( defined($value) );
+
+ return;
+}
+
+sub setPushBrightnessInArray {
+ my $self = shift;
+ my $value = shift;
+
+ unshift(
+ @{ $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL} },
+ $value
+ );
+ pop( @{ $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL} } )
+ if (
+ scalar(
+ @{
+ $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL}
+ }
+ ) > $shutters->getMaxBrightnessAverageArrayObjects
+ );
+
+ return;
+}
+
+sub getBrightnessAverage {
+ my $self = shift;
+
+ return FHEM::AutoShuttersControl::_averageBrightness(
+ @{ $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL} } )
+ if (
+ ref( $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL} )
+ eq 'ARRAY'
+ && scalar(
+ @{
+ $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL}
+ }
+ ) > 0
+ );
+
+ return;
+}
+
+sub getShadingStatus { # Werte für value = in, out, in reserved, out reserved
+ my $self = shift;
+
+ return (
+ defined( $self->{ $self->{shuttersDev} }{ShadingStatus} )
+ && defined( $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} )
+ ? $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL}
+ : 'out'
+ );
+}
+
+sub getShadingLastStatus { # Werte für value = in, out
+ my $self = shift;
+
+ return (
+ defined( $self->{ $self->{shuttersDev} }{ShadingLastStatus} )
+ && defined( $self->{ $self->{shuttersDev} }{ShadingLastStatus}{VAL} )
+ ? $self->{ $self->{shuttersDev} }{ShadingLastStatus}{VAL}
+ : 'out'
+ );
+}
+
+sub getShadingManualDriveStatus { # Werte für value = 0, 1
+ my $self = shift;
+
+ return (
+ defined( $self->{ $self->{shuttersDev} }{ShadingManualDriveStatus} )
+ && defined(
+ $self->{ $self->{shuttersDev} }{ShadingManualDriveStatus}{VAL}
+ )
+ ? $self->{ $self->{shuttersDev} }{ShadingManualDriveStatus}{VAL}
+ : 0
+ );
+}
+
+sub getIfInShading {
+ my $self = shift;
+
+ return (
+ (
+ $shutters->getShadingMode ne 'off'
+ && $shutters->getShadingLastStatus eq 'out'
+ ) ? 1 : 0
+ );
+}
+
+sub getWindProtectionStatus { # Werte protected, unprotected
+ my $self = shift;
+
+ return (
+ (
+ defined( $self->{ $self->{shuttersDev} }->{ASC_WindParameters} )
+ && defined(
+ $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{VAL}
+ )
+ )
+ ? $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{VAL}
+ : 'unprotected'
+ );
+}
+
+sub getRainProtectionStatus { # Werte protected, unprotected
+ my $self = shift;
+
+ return (
+ (
+ defined( $self->{ $self->{shuttersDev} }->{RainProtection} )
+ && defined(
+ $self->{ $self->{shuttersDev} }->{RainProtection}->{VAL}
+ )
+ )
+ ? $self->{ $self->{shuttersDev} }->{RainProtection}->{VAL}
+ : 'unprotected'
+ );
+}
+
+sub getShadingStatusTimestamp {
+ my $self = shift;
+
+ return (
+ defined( $self->{ $self->{shuttersDev} } )
+ && defined( $self->{ $self->{shuttersDev} }{ShadingStatus} )
+ && defined( $self->{ $self->{shuttersDev} }{ShadingStatus}{TIME} )
+ ? $self->{ $self->{shuttersDev} }{ShadingStatus}{TIME}
+ : 0
+ );
+}
+
+sub getShadingLastStatusTimestamp {
+ my $self = shift;
+
+ return (
+ defined( $self->{ $self->{shuttersDev} } )
+ && defined( $self->{ $self->{shuttersDev} }{ShadingLastStatus} )
+ && defined( $self->{ $self->{shuttersDev} }{ShadingLastStatus}{TIME} )
+ ? $self->{ $self->{shuttersDev} }{ShadingLastStatus}{TIME}
+ : 0
+ );
+}
+### Ende Beschattung
+
+
+1;
diff --git a/lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm b/lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm
new file mode 100644
index 0000000..d132347
--- /dev/null
+++ b/lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm
@@ -0,0 +1,1948 @@
+###############################################################################
+#
+# Developed with Kate
+#
+# (c) 2018-2020 Copyright: Marko Oldenburg (leongaultier at gmail dot com)
+# All rights reserved
+#
+# Special thanks goes to:
+# - Bernd (Cluni) this module is based on the logic of his script "Rollladensteuerung für HM/ROLLO inkl. Abschattung und Komfortfunktionen in Perl" (https://forum.fhem.de/index.php/topic,73964.0.html)
+# - Beta-User for many tests, many suggestions and good discussions
+# - pc1246 write english commandref
+# - FunkOdyssey commandref style
+# - sledge fix many typo in commandref
+# - many User that use with modul and report bugs
+# - Christoph (christoph.kaiser.in) Patch that expand RegEx for Window Events
+# - Julian (Loredo) expand Residents Events for new Residents functions
+# - Christoph (Christoph Morrison) for fix Commandref, many suggestions and good discussions
+#
+#
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License,or
+# any later version.
+#
+# The GNU General Public License can be found at
+# http://www.gnu.org/copyleft/gpl.html.
+# A copy is found in the textfile GPL.txt and important notices to the license
+# from the author is found in LICENSE.txt distributed with these scripts.
+#
+# This script is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+#
+# $Id$
+#
+###############################################################################
+
+## Subklasse Attr von ASC_Shutters##
+package FHEM::Automation::ShuttersControl::Shutters::Attr;
+
+use strict;
+use warnings;
+use utf8;
+
+use GPUtils qw(GP_Import);
+
+## Import der FHEM Funktionen
+BEGIN {
+ GP_Import(
+ qw(
+ AttrVal
+ CommandAttr
+ gettimeofday)
+ );
+}
+
+sub _setAttributs {
+ my $shuttersDev = shift;
+ my $attr = shift;
+ my $attrVal = shift;
+
+ CommandAttr( undef, $shuttersDev . ' ' . $attr . ' ' . $attrVal );
+
+ return;
+}
+
+sub _getPosition {
+ my $self = shift;
+
+ my $attr = shift;
+ my $userAttrList = shift;
+
+ return $self->{ $self->{shuttersDev} }->{$attr}->{position}
+ if (
+ exists( $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} ) < 2
+ );
+ $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} =
+ int( gettimeofday() );
+
+ my $position;
+ my $posAssignment;
+
+ if (
+ AttrVal( $self->{shuttersDev}, $attr,
+ $userAttrList{$userAttrList}
+ [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] ) =~
+ m{\A\{.+\}\z}xms
+ )
+ {
+ my $response = FHEM::Automation::ShuttersControl::_perlCodeCheck(
+ AttrVal(
+ $self->{shuttersDev},
+ $attr,
+ $userAttrList{$userAttrList}
+ [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ]
+ )
+ );
+
+ ( $position, $posAssignment ) = split ':', $response;
+
+ $position = (
+ $position =~ m{\A\d+(\.\d+)?\z}xms
+ ? $position
+ : $userAttrList{$userAttrList}
+ [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ]
+ );
+
+ $posAssignment = (
+ $posAssignment =~ m{\A\d+(\.\d+)?\z}xms
+ ? $posAssignment
+ : 'none'
+ );
+ }
+ else {
+ ( $position, $posAssignment ) =
+ FHEM::Automation::ShuttersControl::GetAttrValues(
+ $self->{shuttersDev},
+ $attr,
+ $userAttrList{$userAttrList}
+ [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ]
+ );
+ }
+
+ ### erwartetes Ergebnis
+ # DEVICE:READING
+ $self->{ $self->{shuttersDev} }->{$attr}->{position} = $position;
+ $self->{ $self->{shuttersDev} }->{$attr}->{posAssignment} =
+ $posAssignment;
+
+ return $self->{ $self->{shuttersDev} }->{$attr}->{position};
+
+ if (
+ defined(
+ FHEM::Automation::ShuttersControl::_perlCodeCheck(
+ $self->{ $self->{shuttersDev} }->{$attr}->{position}
+ )
+ )
+ )
+ {
+ $self->{ $self->{shuttersDev} }->{$attr}->{position} =
+ FHEM::Automation::ShuttersControl::_perlCodeCheck(
+ $self->{ $self->{shuttersDev} }->{$attr}->{position} );
+ }
+
+ return (
+ $self->{ $self->{shuttersDev} }->{$attr}->{position} =~
+ m{^\d+(\.\d+)?$}xms
+ ? $self->{ $self->{shuttersDev} }->{$attr}->{position}
+ : $userAttrList{$userAttrList}
+ [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ]
+ );
+}
+
+sub _getPositionAssignment {
+ my $self = shift;
+
+ my $attr = shift;
+ my $getFn = shift;
+
+ return $self->{ $self->{shuttersDev} }->{$attr}->{posAssignment}
+ if (
+ exists( $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} ) < 2
+ );
+ $shutters->$getFn;
+
+ return ( $self->{ $self->{shuttersDev} }->{$attr}->{posAssignment} );
+}
+
+sub setAntiFreezePos {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Antifreeze_Pos', $attrVal );
+
+ return;
+}
+
+sub getAntiFreezePos {
+ my $self = shift;
+
+ return $shutters->_getPosition( 'ASC_Antifreeze_Pos',
+'ASC_Antifreeze_Pos:5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100'
+ );
+}
+
+sub getAntiFreezePosAssignment {
+ my $self = shift;
+
+ return $shutters->_getPositionAssignment( 'ASC_Antifreeze_Pos',
+ 'getAntiFreezePos' );
+}
+
+sub setShuttersPlace {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_ShuttersPlace', $attrVal );
+
+ return;
+}
+
+sub getShuttersPlace {
+ my $self = shift;
+
+ return AttrVal( $self->{shuttersDev}, 'ASC_ShuttersPlace', 'window' );
+}
+
+sub setSlatPosCmd {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_SlatPosCmd_SlatDevice',
+ $attrVal );
+
+ return;
+}
+
+sub getSlatPosCmd {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
+ ->{poscmd}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
+ ->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
+ ->{LASTGETTIME} ) < 2
+ );
+ $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}->{LASTGETTIME}
+ = int( gettimeofday() );
+ my ( $slatPosCmd, $slatDevice ) =
+ FHEM::Automation::ShuttersControl::GetAttrValues( $self->{shuttersDev},
+ 'ASC_SlatPosCmd_SlatDevice', 'none:none' );
+
+ ## Erwartetes Ergebnis
+ # upTime:upBrightnessVal
+
+ $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}->{poscmd} =
+ $slatPosCmd;
+ $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}->{device} =
+ $slatDevice;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
+ ->{poscmd};
+}
+
+sub getSlatDevice {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
+ ->{device}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
+ ->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}
+ ->{LASTGETTIME} ) < 2
+ );
+ $shutters->getSlatPosCmd;
+
+ return (
+ $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}->{device}
+ );
+}
+
+sub setPrivacyUpTime {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_PrivacyUpValue_beforeDayOpen',
+ $attrVal );
+
+ return;
+}
+
+sub getPrivacyUpTime {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
+ ->{uptime}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
+ ->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
+ ->{LASTGETTIME} ) < 2
+ );
+ $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
+ ->{LASTGETTIME} = int( gettimeofday() );
+ my ( $upTime, $upBrightnessVal ) =
+ FHEM::Automation::ShuttersControl::GetAttrValues( $self->{shuttersDev},
+ 'ASC_PrivacyUpValue_beforeDayOpen', '-1:-1' );
+
+ ## Erwartetes Ergebnis
+ # upTime:upBrightnessVal
+
+ $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
+ ->{uptime} = $upTime;
+ $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
+ ->{upbrightnessval} =
+ ( $upBrightnessVal ne 'none' ? $upBrightnessVal : -1 );
+
+ $shutters->setPrivacyUpStatus(0)
+ if ( defined( $shutters->getPrivacyUpStatus )
+ && $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
+ ->{uptime} == -1 );
+
+ return $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
+ ->{uptime};
+}
+
+sub getPrivacyUpBrightnessVal {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
+ ->{upbrightnessval}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
+ ->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
+ ->{LASTGETTIME} ) < 2
+ );
+ $shutters->getPrivacyUpTime;
+
+ return (
+ defined(
+ $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
+ ->{upbrightnessval}
+ )
+ ? $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
+ ->{upbrightnessval}
+ : -1
+ );
+}
+
+sub setPrivacyDownTime {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev},
+ 'ASC_PrivacyDownValue_beforeNightClose', $attrVal );
+
+ return;
+}
+
+sub getPrivacyDownTime {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }
+ ->{ASC_PrivacyDownValue_beforeNightClose}->{downtime}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }
+ ->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }
+ ->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME} ) < 2
+ );
+ $self->{ $self->{shuttersDev} }->{ASC_PrivacyDownValue_beforeNightClose}
+ ->{LASTGETTIME} = int( gettimeofday() );
+ my ( $downTime, $downBrightnessVal ) =
+ FHEM::Automation::ShuttersControl::GetAttrValues( $self->{shuttersDev},
+ 'ASC_PrivacyDownValue_beforeNightClose', '-1:-1' );
+
+ ## Erwartetes Ergebnis
+ # downTime:downBrightnessVal
+
+ $self->{ $self->{shuttersDev} }->{ASC_PrivacyDownValue_beforeNightClose}
+ ->{downtime} = $downTime;
+ $self->{ $self->{shuttersDev} }->{ASC_PrivacyDownValue_beforeNightClose}
+ ->{downbrightnessval} =
+ ( $downBrightnessVal ne 'none' ? $downBrightnessVal : -1 );
+
+ $shutters->setPrivacyDownStatus(0)
+ if ( defined( $shutters->getPrivacyDownStatus )
+ && $self->{ $self->{shuttersDev} }
+ ->{ASC_PrivacyDownValue_beforeNightClose}->{downtime} == -1 );
+
+ return $self->{ $self->{shuttersDev} }
+ ->{ASC_PrivacyDownValue_beforeNightClose}->{downtime};
+}
+
+sub getPrivacyDownBrightnessVal {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }
+ ->{ASC_PrivacyDownValue_beforeNightClose}->{downbrightnessval}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }
+ ->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }
+ ->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME} ) < 2
+ );
+ $shutters->getPrivacyDownTime;
+
+ return (
+ defined(
+ $self->{ $self->{shuttersDev} }
+ ->{ASC_PrivacyDownValue_beforeNightClose}->{downbrightnessval}
+ )
+ ? $self->{ $self->{shuttersDev} }
+ ->{ASC_PrivacyDownValue_beforeNightClose}->{downbrightnessval}
+ : -1
+ );
+}
+
+sub setPrivacyUpPos {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_PrivacyUp_Pos', $attrVal );
+
+ return;
+}
+
+sub getPrivacyUpPos {
+ my $self = shift;
+
+ return $shutters->_getPosition( 'ASC_PrivacyUp_Pos', 'ASC_PrivacyUp_Pos' );
+}
+
+sub getPrivacyUpPositionAssignment {
+ my $self = shift;
+
+ return $shutters->_getPositionAssignment( 'ASC_PrivacyUp_Pos',
+ 'getPrivacyUpPos' );
+}
+
+sub setPrivacyDownPos {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_PrivacyDown_Pos', $attrVal );
+
+ return;
+}
+
+sub getPrivacyDownPos {
+ my $self = shift;
+
+ return $shutters->_getPosition( 'ASC_PrivacyDown_Pos',
+ 'ASC_PrivacyDown_Pos' );
+}
+
+sub getPrivacyDownPositionAssignment {
+ my $self = shift;
+
+ return $shutters->_getPositionAssignment( 'ASC_PrivacyDown_Pos',
+ 'getPrivacyDownPos' );
+}
+
+sub setSelfDefenseMode {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Self_Defense_Mode', $attrVal );
+
+ return;
+}
+
+sub getSelfDefenseMode {
+ my $self = shift;
+
+ return AttrVal( $self->{shuttersDev}, 'ASC_Self_Defense_Mode', 'gone' );
+}
+
+sub setSelfDefenseAbsentDelay {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Self_Defense_AbsentDelay',
+ $attrVal );
+
+ return;
+}
+
+sub getSelfDefenseAbsentDelay {
+ my $self = shift;
+
+ return AttrVal( $self->{shuttersDev}, 'ASC_Self_Defense_AbsentDelay', 300 );
+}
+
+sub setWiggleValue {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_WiggleValue', $attrVal );
+
+ return;
+}
+
+sub getWiggleValue {
+ my $self = shift;
+
+ return AttrVal( $self->{shuttersDev}, 'ASC_WiggleValue', 5 );
+}
+
+sub setAdv {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Adv', $attrVal );
+
+ return;
+}
+
+sub getAdv {
+ my $self = shift;
+
+ return (
+ AttrVal( $self->{shuttersDev}, 'ASC_Adv', 'off' ) eq 'on'
+ ? ( FHEM::Automation::ShuttersControl::_IsAdv == 1 ? 1 : 0 )
+ : 0
+ );
+}
+
+### Begin Beschattung
+sub setShadingPos {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Shading_Pos', $attrVal );
+
+ return;
+}
+
+sub getShadingPos {
+ my $self = shift;
+
+ return $shutters->_getPosition( 'ASC_Shading_Pos',
+ 'ASC_Shading_Pos:10,20,30,40,50,60,70,80,90,100' );
+}
+
+sub getShadingPositionAssignment {
+ my $self = shift;
+
+ return $shutters->_getPositionAssignment( 'ASC_Shading_Pos',
+ 'getShadingPos' );
+}
+
+sub setShadingMode {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Shading_Mode', $attrVal );
+
+ return;
+}
+
+sub getShadingMode {
+ my $self = shift;
+
+ return AttrVal( $self->{shuttersDev}, 'ASC_Shading_Mode', 'off' );
+}
+
+sub _getTempSensor {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{device}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} )
+ < 2
+ );
+ $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} =
+ int( gettimeofday() );
+ my ( $device, $reading ) =
+ FHEM::Automation::ShuttersControl::GetAttrValues( $self->{shuttersDev},
+ 'ASC_TempSensor', 'none' );
+
+ ### erwartetes Ergebnis
+ # DEVICE:READING
+ $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{device} = $device;
+ $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{reading} =
+ ( $reading ne 'none' ? $reading : 'temperature' );
+
+ return $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{device};
+}
+
+sub getTempSensorReading {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{reading}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} )
+ < 2
+ );
+ $shutters->_getTempSensor;
+
+ return (
+ defined( $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{reading} )
+ ? $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{reading}
+ : 'temperature'
+ );
+}
+
+sub setIdleDetectionReading {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Shutter_IdleDetection',
+ $attrVal );
+
+ return;
+}
+
+sub _getIdleDetectionReading {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
+ ->{reading}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
+ ->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
+ ->{LASTGETTIME} ) < 2
+ );
+ $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}->{LASTGETTIME}
+ = int( gettimeofday() );
+ my ( $reading, $value ) =
+ FHEM::Automation::ShuttersControl::GetAttrValues( $self->{shuttersDev},
+ 'ASC_Shutter_IdleDetection', 'none' );
+
+ ### erwartetes Ergebnis
+ # READING:VALUE
+ $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}->{reading} =
+ $reading;
+ $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}->{value} =
+ $value;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
+ ->{reading};
+}
+
+sub getIdleDetectionValue {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}->{value}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
+ ->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
+ ->{LASTGETTIME} ) < 2
+ );
+ $shutters->_getIdleDetectionReading;
+
+ return (
+ defined(
+ $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}
+ ->{value}
+ )
+ ? $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}->{value}
+ : 'none'
+ );
+}
+
+sub setBrightnessSensor {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_BrightnessSensor', $attrVal );
+
+ return;
+}
+
+sub _getBrightnessSensor {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{device}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
+ ->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
+ ->{LASTGETTIME} ) < 2
+ );
+ $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{LASTGETTIME} =
+ int( gettimeofday() );
+ my ( $device, $reading, $max, $min ) =
+ FHEM::Automation::ShuttersControl::GetAttrValues( $self->{shuttersDev},
+ 'ASC_BrightnessSensor', 'none' );
+
+ ### erwartetes Ergebnis
+ # DEVICE:READING MAX:MIN
+ $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{device} = $device;
+ $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{reading} =
+ ( $reading ne 'none' ? $reading : 'brightness' );
+ $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{triggermin} =
+ ( $min ne 'none' ? $min : -1 );
+ $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{triggermax} =
+ ( $max ne 'none' ? $max : -1 );
+
+ return $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{device};
+}
+
+sub getBrightnessReading {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{reading}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
+ ->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
+ ->{LASTGETTIME} ) < 2
+ );
+ $shutters->_getBrightnessSensor;
+
+ return (
+ defined(
+ $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{reading}
+ )
+ ? $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{reading}
+ : 'brightness'
+ );
+}
+
+sub getShadingAzimuthLeft {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
+ ->{leftVal}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
+ ->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
+ ->{LASTGETTIME} ) < 2
+ );
+ $shutters->getShadingAzimuthRight;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
+ ->{leftVal};
+}
+
+sub setShadingInOutAzimuth {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Shading_InOutAzimuth', $attrVal );
+
+ return;
+}
+
+sub getShadingAzimuthRight {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
+ ->{rightVal}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
+ ->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
+ ->{LASTGETTIME} ) < 2
+ );
+ $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}->{LASTGETTIME}
+ = int( gettimeofday() );
+ my ( $left, $right ) =
+ FHEM::Automation::ShuttersControl::GetAttrValues( $self->{shuttersDev},
+ 'ASC_Shading_InOutAzimuth', '95:265' );
+
+ ### erwartetes Ergebnis
+ # MIN:MAX
+
+ $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}->{leftVal} =
+ $left;
+ $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}->{rightVal} =
+ $right;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}
+ ->{rightVal};
+}
+
+sub setShadingMinOutsideTemperature {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Shading_Min_OutsideTemperature',
+ $attrVal );
+
+ return;
+}
+
+sub getShadingMinOutsideTemperature {
+ my $self = shift;
+
+ return AttrVal( $self->{shuttersDev}, 'ASC_Shading_Min_OutsideTemperature',
+ 18 );
+}
+
+sub setShadingMinMaxElevation {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Shading_MinMax_Elevation',
+ $attrVal );
+
+ return;
+}
+
+sub getShadingMinElevation {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
+ ->{minVal}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
+ ->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
+ ->{LASTGETTIME} ) < 2
+ );
+ $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
+ ->{LASTGETTIME} = int( gettimeofday() );
+ my ( $min, $max ) =
+ FHEM::Automation::ShuttersControl::GetAttrValues( $self->{shuttersDev},
+ 'ASC_Shading_MinMax_Elevation', '25.0:100.0' );
+
+ ### erwartetes Ergebnis
+ # MIN:MAX
+
+ $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}->{minVal} =
+ $min;
+ $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}->{maxVal} =
+ ( $max ne 'none' ? $max : 100 );
+
+ return $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
+ ->{minVal};
+}
+
+sub getShadingMaxElevation {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
+ ->{maxVal}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
+ ->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
+ ->{LASTGETTIME} ) < 2
+ );
+ $shutters->getShadingMinElevation;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation}
+ ->{maxVal};
+}
+
+sub setShadingStateChangeSunnyCloudy {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Shading_StateChange_SunnyCloudy',
+ $attrVal );
+
+ return;
+}
+
+sub getShadingStateChangeSunny {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }
+ ->{ASC_Shading_StateChange_SunnyCloudy}->{sunny}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }
+ ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }
+ ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} ) < 2
+ );
+ $self->{ $self->{shuttersDev} }->{ASC_Shading_StateChange_SunnyCloudy}
+ ->{LASTGETTIME} = int( gettimeofday() );
+ my ( $sunny, $cloudy, $maxBrightnessAverageArrayObjects ) =
+ FHEM::Automation::ShuttersControl::GetAttrValues( $self->{shuttersDev},
+ 'ASC_Shading_StateChange_SunnyCloudy',
+ '35000:20000' );
+
+ ### erwartetes Ergebnis
+ # SUNNY:CLOUDY [BrightnessAverage]
+
+ $self->{ $self->{shuttersDev} }->{ASC_Shading_StateChange_SunnyCloudy}
+ ->{sunny} = $sunny;
+ $self->{ $self->{shuttersDev} }->{ASC_Shading_StateChange_SunnyCloudy}
+ ->{cloudy} = $cloudy;
+ $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{MAXOBJECT} = (
+ defined($maxBrightnessAverageArrayObjects)
+ && $maxBrightnessAverageArrayObjects ne 'none'
+ ? $maxBrightnessAverageArrayObjects
+ : 3
+ );
+
+ return $self->{ $self->{shuttersDev} }
+ ->{ASC_Shading_StateChange_SunnyCloudy}->{sunny};
+}
+
+sub getShadingStateChangeCloudy {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }
+ ->{ASC_Shading_StateChange_SunnyCloudy}->{cloudy}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }
+ ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }
+ ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} ) < 2
+ );
+ $shutters->getShadingStateChangeSunny;
+
+ return $self->{ $self->{shuttersDev} }
+ ->{ASC_Shading_StateChange_SunnyCloudy}->{cloudy};
+}
+
+sub getMaxBrightnessAverageArrayObjects {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}
+ ->{MAXOBJECT}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }
+ ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }
+ ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} ) < 2
+ );
+ $shutters->getShadingStateChangeSunny;
+
+ return $self->{ $self->{shuttersDev} }->{BrightnessAverageArray}
+ ->{MAXOBJECT};
+}
+
+sub setShadingWaitingPeriod {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Shading_WaitingPeriod',
+ $attrVal );
+
+ return;
+}
+
+sub getShadingWaitingPeriod {
+ my $self = shift;
+
+ return AttrVal( $self->{shuttersDev}, 'ASC_Shading_WaitingPeriod', 1200 );
+}
+### Ende Beschattung
+sub setExternalTrigger {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_ExternalTrigger', $attrVal );
+
+ return;
+}
+
+sub getExternalTriggerDevice {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{device}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
+ ->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
+ ->{LASTGETTIME} ) < 2
+ );
+ $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{LASTGETTIME} =
+ int( gettimeofday() );
+ my ( $device, $reading, $valueActive, $valueInactive, $posActive,
+ $posInactive, $valueActive2, $posActive2 )
+ = FHEM::Automation::ShuttersControl::GetAttrValues( $self->{shuttersDev},
+ 'ASC_ExternalTrigger', 'none' );
+
+ ### erwartetes Ergebnis
+# DEVICE:READING VALUEACTIVE:VALUEINACTIVE POSACTIVE:POSINACTIVE VALUEACTIVE2:POSACTIVE2
+
+ $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{device} =
+ $device;
+ $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{reading} =
+ $reading;
+ $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{valueactive} =
+ $valueActive;
+ $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{valueinactive} =
+ $valueInactive;
+ $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive} =
+ $posActive;
+ $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posinactive} =
+ ( $posInactive ne 'none' ? $posInactive : $shutters->getLastPos );
+ $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{valueactive2} =
+ $valueActive2;
+ $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive2} =
+ $posActive2;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{device};
+
+}
+
+sub getExternalTriggerReading {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{reading}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
+ ->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
+ ->{LASTGETTIME} ) < 2
+ );
+ $shutters->getExternalTriggerDevice;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{reading};
+}
+
+sub getExternalTriggerValueActive {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{valueactive}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
+ ->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
+ ->{LASTGETTIME} ) < 2
+ );
+ $shutters->getExternalTriggerDevice;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
+ ->{valueactive};
+}
+
+sub getExternalTriggerValueActive2 {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
+ ->{valueactive2}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
+ ->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
+ ->{LASTGETTIME} ) < 2
+ );
+ $shutters->getExternalTriggerDevice;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
+ ->{valueactive2};
+}
+
+sub getExternalTriggerValueInactive {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
+ ->{valueinactive}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
+ ->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
+ ->{LASTGETTIME} ) < 2
+ );
+ $shutters->getExternalTriggerDevice;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
+ ->{valueinactive};
+}
+
+sub getExternalTriggerPosActive {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
+ ->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
+ ->{LASTGETTIME} ) < 2
+ );
+ $shutters->getExternalTriggerDevice;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive};
+}
+
+sub getExternalTriggerPosActive2 {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive2}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
+ ->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
+ ->{LASTGETTIME} ) < 2
+ );
+ $shutters->getExternalTriggerDevice;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive2};
+}
+
+sub getExternalTriggerPosInactive {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posinactive}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
+ ->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
+ ->{LASTGETTIME} ) < 2
+ );
+ $shutters->getExternalTriggerDevice;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}
+ ->{posinactive};
+}
+
+sub getExternalTriggerState {
+ my $self = shift;
+
+ return (
+ (
+ defined(
+ $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{event}
+ )
+ and
+ $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{event}
+ ) ? 1 : 0
+ );
+}
+
+sub setDelay {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Drive_Delay', $attrVal );
+
+ return;
+}
+
+sub getDelay {
+ my $self = shift;
+
+ my $val = AttrVal( $self->{shuttersDev}, 'ASC_Drive_Delay', -1 );
+ return ( $val =~ m{^\d+$}xms ? $val : -1 );
+}
+
+sub setDelayStart {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Drive_DelayStart', $attrVal );
+
+ return;
+}
+
+sub getDelayStart {
+ my $self = shift;
+
+ my $val = AttrVal( $self->{shuttersDev}, 'ASC_Drive_DelayStart', -1 );
+ return ( ( $val > 0 && $val =~ m{^\d+$}xms ) ? $val : -1 );
+}
+
+sub setBlockingTimeAfterManual {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_BlockingTime_afterManual',
+ $attrVal );
+
+ return;
+}
+
+sub getBlockingTimeAfterManual {
+ my $self = shift;
+
+ return AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_afterManual',
+ 1200 );
+}
+
+sub setBlockingTimeBeforNightClose {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_BlockingTime_beforNightClose',
+ $attrVal );
+
+ return;
+}
+
+sub getBlockingTimeBeforNightClose {
+ my $self = shift;
+
+ return AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_beforNightClose',
+ 3600 );
+}
+
+sub setBlockingTimeBeforDayOpen {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_BlockingTime_beforDayOpen',
+ $attrVal );
+
+ return;
+}
+
+sub getBlockingTimeBeforDayOpen {
+ my $self = shift;
+
+ return AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_beforDayOpen',
+ 3600 );
+}
+
+sub setPosCmd {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Pos_Reading', $attrVal );
+
+ return;
+}
+
+sub getPosCmd {
+ my $self = shift;
+
+ return AttrVal( $self->{shuttersDev}, 'ASC_Pos_Reading',
+ $userAttrList{'ASC_Pos_Reading'}
+ [ AttrVal( $self->{shuttersDev}, 'ASC', 1 ) ] );
+}
+
+sub setOpenPos {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Open_Pos', $attrVal );
+
+ return;
+}
+
+sub getOpenPos {
+ my $self = shift;
+
+ return $shutters->_getPosition( 'ASC_Open_Pos',
+ 'ASC_Open_Pos:0,10,20,30,40,50,60,70,80,90,100' );
+}
+
+sub getOpenPositionAssignment {
+ my $self = shift;
+
+ return $shutters->_getPositionAssignment( 'ASC_Open_Pos', 'getOpenPos' );
+}
+
+sub setVentilatePos {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Ventilate_Pos', $attrVal );
+
+ return;
+}
+
+sub getVentilatePos {
+ my $self = shift;
+
+ return $shutters->_getPosition( 'ASC_Ventilate_Pos',
+ 'ASC_Ventilate_Pos:10,20,30,40,50,60,70,80,90,100' );
+}
+
+sub getVentilatePositionAssignment {
+ my $self = shift;
+
+ return $shutters->_getPositionAssignment( 'ASC_Ventilate_Pos',
+ 'getVentilatePos' );
+}
+
+sub setVentilatePosAfterDayClosed {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_WindowRec_PosAfterDayClosed',
+ $attrVal );
+
+ return;
+}
+
+sub getVentilatePosAfterDayClosed {
+ my $self = shift;
+
+ return AttrVal( $self->{shuttersDev}, 'ASC_WindowRec_PosAfterDayClosed',
+ 'open' );
+}
+
+sub setClosedPos {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Closed_Pos', $attrVal );
+
+ return;
+}
+
+sub getClosedPos {
+ my $self = shift;
+
+ return $shutters->_getPosition( 'ASC_Closed_Pos',
+ 'ASC_Closed_Pos:0,10,20,30,40,50,60,70,80,90,100' );
+}
+
+sub getClosedPositionAssignment {
+ my $self = shift;
+
+ return $shutters->_getPositionAssignment( 'ASC_Closed_Pos',
+ 'getClosedPos' );
+}
+
+sub setSleepPos {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Sleep_Pos', $attrVal );
+
+ return;
+}
+
+sub getSleepPos {
+ my $self = shift;
+
+ return $shutters->_getPosition( 'ASC_Sleep_Pos',
+ 'ASC_Sleep_Pos:0,10,20,30,40,50,60,70,80,90,100' );
+}
+
+sub getSleepPositionAssignment {
+ my $self = shift;
+
+ return $shutters->_getPositionAssignment( 'ASC_Sleep_Pos', 'getSleepPos' );
+}
+
+sub setVentilateOpen {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Ventilate_Window_Open',
+ $attrVal );
+
+ return;
+}
+
+sub getVentilateOpen {
+ my $self = shift;
+
+ return AttrVal( $self->{shuttersDev}, 'ASC_Ventilate_Window_Open', 'on' );
+}
+
+sub setComfortOpenPos {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_ComfortOpen_Pos', $attrVal );
+
+ return;
+}
+
+sub getComfortOpenPos {
+ my $self = shift;
+
+ return $shutters->_getPosition( 'ASC_ComfortOpen_Pos',
+ 'ASC_ComfortOpen_Pos:0,10,20,30,40,50,60,70,80,90,100' );
+}
+
+sub getComfortOpenPositionAssignment {
+ my $self = shift;
+
+ return $shutters->_getPositionAssignment( 'ASC_ComfortOpen_Pos',
+ 'getComfortOpenPos' );
+}
+
+sub setPartyMode {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Partymode', $attrVal );
+
+ return;
+}
+
+sub getPartyMode {
+ my $self = shift;
+
+ return AttrVal( $self->{shuttersDev}, 'ASC_Partymode', 'off' );
+}
+
+sub setRoommates {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Roommate_Device', $attrVal );
+
+ return;
+}
+
+sub getRoommates {
+ my $self = shift;
+
+ return AttrVal( $self->{shuttersDev}, 'ASC_Roommate_Device', 'none' );
+}
+
+sub setRoommatesReading {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Roommate_Reading', $attrVal );
+
+ return;
+}
+
+sub getRoommatesReading {
+ my $self = shift;
+
+ return AttrVal( $self->{shuttersDev}, 'ASC_Roommate_Reading', 'state' );
+}
+
+sub getWindPos {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{closedPos}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
+ ) < 2
+ );
+ $shutters->getWindMax;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{closedPos};
+}
+
+sub getWindMax {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggermax}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
+ ) < 2
+ );
+ $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME} =
+ int( gettimeofday() );
+ my ( $max, $hyst, $pos ) =
+ FHEM::Automation::ShuttersControl::GetAttrValues( $self->{shuttersDev},
+ 'ASC_WindParameters', '50:20' );
+
+ ## Erwartetes Ergebnis
+ # max:hyst pos
+
+ $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggermax} = $max;
+ $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggerhyst} =
+ ( $hyst ne 'none' ? $max - $hyst : $max - 20 );
+ $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{closedPos} =
+ ( $pos ne 'none' ? $pos : $shutters->getOpenPos );
+
+ return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggermax};
+}
+
+sub setWindParameters {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_WindParameters', $attrVal );
+
+ return;
+}
+
+sub getWindMin {
+ my $self = shift;
+
+ my $name = $self->{name};
+
+ return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggerhyst}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME}
+ ) < 2
+ );
+ $shutters->getWindMax;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggerhyst};
+}
+
+sub setWindProtection {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_WindProtection', $attrVal );
+
+ return;
+}
+
+sub getWindProtection {
+ my $self = shift;
+
+ return AttrVal( $self->{shuttersDev}, 'ASC_WindProtection', 'off' );
+}
+
+sub setRainProtection {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_RainProtection', $attrVal );
+
+ return;
+}
+
+sub getRainProtection {
+ my $self = shift;
+
+ return AttrVal( $self->{shuttersDev}, 'ASC_RainProtection', 'off' );
+}
+
+sub setModeUp {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Mode_Up', $attrVal );
+
+ return;
+}
+
+sub getModeUp {
+ my $self = shift;
+
+ return AttrVal( $self->{shuttersDev}, 'ASC_Mode_Up', 'always' );
+}
+
+sub setModeDown {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Mode_Down', $attrVal );
+
+ return;
+}
+
+sub getModeDown {
+ my $self = shift;
+
+ return AttrVal( $self->{shuttersDev}, 'ASC_Mode_Down', 'always' );
+}
+
+sub setLockOut {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_LockOut', $attrVal );
+
+ return;
+}
+
+sub getLockOut {
+ my $self = shift;
+
+ return AttrVal( $self->{shuttersDev}, 'ASC_LockOut', 'off' );
+}
+
+sub setLockOutCmd {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_LockOut_Cmd', $attrVal );
+
+ return;
+}
+
+sub getLockOutCmd {
+ my $self = shift;
+
+ return AttrVal( $self->{shuttersDev}, 'ASC_LockOut_Cmd', 'none' );
+}
+
+sub setAntiFreeze {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Antifreeze', $attrVal );
+
+ return;
+}
+
+sub getAntiFreeze {
+ my $self = shift;
+
+ return AttrVal( $self->{shuttersDev}, 'ASC_Antifreeze', 'off' );
+}
+
+sub setAutoAstroModeMorning {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_AutoAstroModeMorning', $attrVal );
+
+ return;
+}
+
+sub getAutoAstroModeMorning {
+ my $self = shift;
+
+ return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeMorning', 'none' );
+}
+
+sub setAutoAstroModeEvening {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_AutoAstroModeEvening', $attrVal );
+
+ return;
+}
+
+sub getAutoAstroModeEvening {
+ my $self = shift;
+
+ return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeEvening', 'none' );
+}
+
+sub setAutoAstroModeMorningHorizon {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_AutoAstroModeMorningHorizon',
+ $attrVal );
+
+ return;
+}
+
+sub getAutoAstroModeMorningHorizon {
+ my $self = shift;
+
+ return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeMorningHorizon',
+ 0 );
+}
+
+sub setAutoAstroModeEveningHorizon {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_AutoAstroModeEveningHorizon',
+ $attrVal );
+
+ return;
+}
+
+sub getAutoAstroModeEveningHorizon {
+ my $self = shift;
+
+ return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeEveningHorizon',
+ 0 );
+}
+
+sub setUp {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Up', $attrVal );
+
+ return;
+}
+
+sub getUp {
+ my $self = shift;
+
+ return AttrVal( $self->{shuttersDev}, 'ASC_Up', 'astro' );
+}
+
+sub setDown {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Down', $attrVal );
+
+ return;
+}
+
+sub getDown {
+ my $self = shift;
+
+ return AttrVal( $self->{shuttersDev}, 'ASC_Down', 'astro' );
+}
+
+sub setTimeUpEarly {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Time_Up_Early', $attrVal );
+
+ return;
+}
+
+sub getTimeUpEarly {
+ my $self = shift;
+
+ my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_Early', '05:00' );
+
+ if ( defined( FHEM::Automation::ShuttersControl::_perlCodeCheck($val) ) ) {
+ $val = FHEM::Automation::ShuttersControl::_perlCodeCheck($val);
+ }
+
+ return (
+ $val =~ m{^(?:[01]?\d|2[0-3]):(?:[0-5]\d)(:(?:[0-5]\d))?$}xms
+ ? $val
+ : '05:00'
+ );
+}
+
+sub setTimeUpLate {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Time_Up_Late', $attrVal );
+
+ return;
+}
+
+sub getTimeUpLate {
+ my $self = shift;
+
+ my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_Late', '08:30' );
+
+ if ( defined( FHEM::Automation::ShuttersControl::_perlCodeCheck($val) ) ) {
+ $val = FHEM::Automation::ShuttersControl::_perlCodeCheck($val);
+ }
+
+ return (
+ $val =~ m{^(?:[01]?\d|2[0-3]):(?:[0-5]\d)(:(?:[0-5]\d))?$}xms
+ ? $val
+ : '08:30'
+ );
+}
+
+sub setTimeDownEarly {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Time_Down_Early', $attrVal );
+
+ return;
+}
+
+sub getTimeDownEarly {
+ my $self = shift;
+
+ my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Down_Early', '16:00' );
+
+ if ( defined( FHEM::Automation::ShuttersControl::_perlCodeCheck($val) ) ) {
+ $val = FHEM::Automation::ShuttersControl::_perlCodeCheck($val);
+ }
+
+ return (
+ $val =~ m{^(?:[01]?\d|2[0-3]):(?:[0-5]\d)(:(?:[0-5]\d))?$}xms
+ ? $val
+ : '16:00'
+ );
+}
+
+sub setTimeDownLate {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Time_Down_Late', $attrVal );
+
+ return;
+}
+
+sub getTimeDownLate {
+ my $self = shift;
+
+ my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Down_Late', '22:00' );
+
+ if ( defined( FHEM::Automation::ShuttersControl::_perlCodeCheck($val) ) ) {
+ $val = FHEM::Automation::ShuttersControl::_perlCodeCheck($val);
+ }
+
+ return (
+ $val =~ m{^(?:[01]?\d|2[0-3]):(?:[0-5]\d)(:(?:[0-5]\d))?$}xms
+ ? $val
+ : '22:00'
+ );
+}
+
+sub setTimeUpWeHoliday {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_Time_Up_WE_Holiday', $attrVal );
+
+ return;
+}
+
+sub getTimeUpWeHoliday {
+ my $self = shift;
+
+ my $val =
+ AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_WE_Holiday', '01:25' );
+
+ if ( defined( FHEM::Automation::ShuttersControl::_perlCodeCheck($val) ) ) {
+ $val = FHEM::Automation::ShuttersControl::_perlCodeCheck($val);
+ }
+
+ return (
+ $val =~ m{^(?:[01]?\d|2[0-3]):(?:[0-5]\d)(:(?:[0-5]\d))?$}xms
+ ? $val
+ : '01:25'
+ );
+}
+
+sub getBrightnessMinVal {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{triggermin}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
+ ->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
+ ->{LASTGETTIME} ) < 2
+ );
+ $shutters->_getBrightnessSensor;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
+ ->{triggermin};
+}
+
+sub getBrightnessMaxVal {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{triggermax}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
+ ->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
+ ->{LASTGETTIME} ) < 2
+ );
+ $shutters->_getBrightnessSensor;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}
+ ->{triggermax};
+}
+
+sub setDriveUpMaxDuration {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_DriveUpMaxDuration', $attrVal );
+
+ return;
+}
+
+sub getDriveUpMaxDuration {
+ my $self = shift;
+
+ return AttrVal( $self->{shuttersDev}, 'ASC_DriveUpMaxDuration', 60 );
+}
+
+
+1;
diff --git a/lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm b/lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm
new file mode 100644
index 0000000..00d7e16
--- /dev/null
+++ b/lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm
@@ -0,0 +1,92 @@
+###############################################################################
+#
+# Developed with Kate
+#
+# (c) 2018-2020 Copyright: Marko Oldenburg (leongaultier at gmail dot com)
+# All rights reserved
+#
+# Special thanks goes to:
+# - Bernd (Cluni) this module is based on the logic of his script "Rollladensteuerung für HM/ROLLO inkl. Abschattung und Komfortfunktionen in Perl" (https://forum.fhem.de/index.php/topic,73964.0.html)
+# - Beta-User for many tests, many suggestions and good discussions
+# - pc1246 write english commandref
+# - FunkOdyssey commandref style
+# - sledge fix many typo in commandref
+# - many User that use with modul and report bugs
+# - Christoph (christoph.kaiser.in) Patch that expand RegEx for Window Events
+# - Julian (Loredo) expand Residents Events for new Residents functions
+# - Christoph (Christoph Morrison) for fix Commandref, many suggestions and good discussions
+#
+#
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License,or
+# any later version.
+#
+# The GNU General Public License can be found at
+# http://www.gnu.org/copyleft/gpl.html.
+# A copy is found in the textfile GPL.txt and important notices to the license
+# from the author is found in LICENSE.txt distributed with these scripts.
+#
+# This script is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+#
+# $Id$
+#
+###############################################################################
+
+
+## Subklasse Readings von ASC_Shutters ##
+package FHEM::Automation::ShuttersControl::Shutters::Readings;
+
+use strict;
+use warnings;
+use utf8;
+
+use GPUtils qw(GP_Import);
+
+## Import der FHEM Funktionen
+BEGIN {
+ GP_Import(
+ qw(
+ ReadingsVal
+ ReadingsNum)
+ );
+}
+
+sub getBrightness {
+ my $self = shift;
+
+ return ReadingsNum( $shutters->_getBrightnessSensor,
+ $shutters->getBrightnessReading, -1 );
+}
+
+sub getWindStatus {
+ my $self = shift;
+
+ return ReadingsVal( $ascDev->_getWindSensor,
+ $ascDev->getWindSensorReading, -1 );
+}
+
+sub getStatus {
+ my $self = shift;
+
+ return ReadingsNum( $self->{shuttersDev}, $shutters->getPosCmd, 0 );
+}
+
+sub getDelayCmd {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }{delayCmd};
+}
+
+sub getASCenable {
+ my $self = shift;
+
+ return ReadingsVal( $self->{shuttersDev}, 'ASC_Enable', 'on' );
+}
+
+
+1;
diff --git a/lib/FHEM/Automation/ShuttersControl/Window.pm b/lib/FHEM/Automation/ShuttersControl/Window.pm
new file mode 100644
index 0000000..9b4caae
--- /dev/null
+++ b/lib/FHEM/Automation/ShuttersControl/Window.pm
@@ -0,0 +1,50 @@
+###############################################################################
+#
+# Developed with Kate
+#
+# (c) 2018-2020 Copyright: Marko Oldenburg (leongaultier at gmail dot com)
+# All rights reserved
+#
+# Special thanks goes to:
+# - Bernd (Cluni) this module is based on the logic of his script "Rollladensteuerung für HM/ROLLO inkl. Abschattung und Komfortfunktionen in Perl" (https://forum.fhem.de/index.php/topic,73964.0.html)
+# - Beta-User for many tests, many suggestions and good discussions
+# - pc1246 write english commandref
+# - FunkOdyssey commandref style
+# - sledge fix many typo in commandref
+# - many User that use with modul and report bugs
+# - Christoph (christoph.kaiser.in) Patch that expand RegEx for Window Events
+# - Julian (Loredo) expand Residents Events for new Residents functions
+# - Christoph (Christoph Morrison) for fix Commandref, many suggestions and good discussions
+#
+#
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License,or
+# any later version.
+#
+# The GNU General Public License can be found at
+# http://www.gnu.org/copyleft/gpl.html.
+# A copy is found in the textfile GPL.txt and important notices to the license
+# from the author is found in LICENSE.txt distributed with these scripts.
+#
+# This script is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+#
+# $Id$
+#
+###############################################################################
+
+## Klasse Fenster (Window) und die Subklassen Attr und Readings ##
+package FHEM::Automation::ShuttersControl::Window;
+
+use strict;
+use warnings;
+use utf8;
+
+our @ISA = qw(FHEM::Automation::ShuttersControl::Window::Attr FHEM::Automation::ShuttersControl::Window::Readings);
+
+
+1;
diff --git a/lib/FHEM/Automation/ShuttersControl/Window/Attr.pm b/lib/FHEM/Automation/ShuttersControl/Window/Attr.pm
new file mode 100644
index 0000000..9e08d62
--- /dev/null
+++ b/lib/FHEM/Automation/ShuttersControl/Window/Attr.pm
@@ -0,0 +1,129 @@
+###############################################################################
+#
+# Developed with Kate
+#
+# (c) 2018-2020 Copyright: Marko Oldenburg (leongaultier at gmail dot com)
+# All rights reserved
+#
+# Special thanks goes to:
+# - Bernd (Cluni) this module is based on the logic of his script "Rollladensteuerung für HM/ROLLO inkl. Abschattung und Komfortfunktionen in Perl" (https://forum.fhem.de/index.php/topic,73964.0.html)
+# - Beta-User for many tests, many suggestions and good discussions
+# - pc1246 write english commandref
+# - FunkOdyssey commandref style
+# - sledge fix many typo in commandref
+# - many User that use with modul and report bugs
+# - Christoph (christoph.kaiser.in) Patch that expand RegEx for Window Events
+# - Julian (Loredo) expand Residents Events for new Residents functions
+# - Christoph (Christoph Morrison) for fix Commandref, many suggestions and good discussions
+#
+#
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License,or
+# any later version.
+#
+# The GNU General Public License can be found at
+# http://www.gnu.org/copyleft/gpl.html.
+# A copy is found in the textfile GPL.txt and important notices to the license
+# from the author is found in LICENSE.txt distributed with these scripts.
+#
+# This script is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+#
+# $Id$
+#
+###############################################################################
+
+## Subklasse Attr von Klasse ASC_Window ##
+package FHEM::Automation::ShuttersControl::Window::Attr;
+
+use strict;
+use warnings;
+use utf8;
+
+use GPUtils qw(GP_Import);
+
+## Import der FHEM Funktionen
+BEGIN {
+ GP_Import(
+ qw(
+ AttrVal
+ gettimeofday)
+ );
+}
+
+sub setSubTyp {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_WindowRec_subType', $attrVal );
+
+ return;
+}
+
+sub getSubTyp {
+ my $self = shift;
+
+ return AttrVal( $self->{shuttersDev}, 'ASC_WindowRec_subType', 'twostate' );
+}
+
+sub setWinDev {
+ my $self = shift;
+ my $attrVal = shift;
+
+ _setAttributs( $self->{shuttersDev}, 'ASC_WindowRec', $attrVal );
+
+ return;
+}
+
+sub _getWinDev {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{device}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} ) <
+ 2
+ );
+ $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} =
+ int( gettimeofday() );
+ my ( $device, $reading ) =
+ FHEM::Automation::ShuttersControl::GetAttrValues( $self->{shuttersDev},
+ 'ASC_WindowRec', 'none' );
+
+ ### erwartetes Ergebnis
+ # DEVICE:READING VALUEACTIVE:VALUEINACTIVE POSACTIVE:POSINACTIVE
+
+ $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{device} =
+ $device;
+ $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{reading} =
+ ( $reading ne 'none' ? $reading : 'state' );
+
+ return $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{device};
+}
+
+sub getWinDevReading {
+ my $self = shift;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{reading}
+ if (
+ exists(
+ $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME}
+ )
+ && ( gettimeofday() -
+ $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} ) <
+ 2
+ );
+ $shutters->_getWinDev;
+
+ return $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{reading};
+}
+
+
+1;
diff --git a/lib/FHEM/Automation/ShuttersControl/Window/Readings.pm b/lib/FHEM/Automation/ShuttersControl/Window/Readings.pm
new file mode 100644
index 0000000..5e8ff5f
--- /dev/null
+++ b/lib/FHEM/Automation/ShuttersControl/Window/Readings.pm
@@ -0,0 +1,65 @@
+###############################################################################
+#
+# Developed with Kate
+#
+# (c) 2018-2020 Copyright: Marko Oldenburg (leongaultier at gmail dot com)
+# All rights reserved
+#
+# Special thanks goes to:
+# - Bernd (Cluni) this module is based on the logic of his script "Rollladensteuerung für HM/ROLLO inkl. Abschattung und Komfortfunktionen in Perl" (https://forum.fhem.de/index.php/topic,73964.0.html)
+# - Beta-User for many tests, many suggestions and good discussions
+# - pc1246 write english commandref
+# - FunkOdyssey commandref style
+# - sledge fix many typo in commandref
+# - many User that use with modul and report bugs
+# - Christoph (christoph.kaiser.in) Patch that expand RegEx for Window Events
+# - Julian (Loredo) expand Residents Events for new Residents functions
+# - Christoph (Christoph Morrison) for fix Commandref, many suggestions and good discussions
+#
+#
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License,or
+# any later version.
+#
+# The GNU General Public License can be found at
+# http://www.gnu.org/copyleft/gpl.html.
+# A copy is found in the textfile GPL.txt and important notices to the license
+# from the author is found in LICENSE.txt distributed with these scripts.
+#
+# This script is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+#
+# $Id$
+#
+###############################################################################
+
+## Subklasse Readings von Klasse ASC_Window ##
+package FHEM::Automation::ShuttersControl::Window::Readings;
+
+use strict;
+use warnings;
+use utf8;
+
+use GPUtils qw(GP_Import);
+
+## Import der FHEM Funktionen
+BEGIN {
+ GP_Import(
+ qw(
+ ReadingsVal)
+ );
+}
+
+sub getWinStatus {
+ my $self = shift;
+
+ return ReadingsVal( $shutters->_getWinDev, $shutters->getWinDevReading,
+ 'closed' );
+}
+
+
+1;