In diesem kurzen Tutorial gebe ich dir ein LUA Script an die Hand, welches automatisch die Tageszeiten als Variable setzt. Es berücksichtigt auch den Sonnenauf- und Untergang.
Im letzten Tutorial "Die perfekte Lichtsteuerung mit Fibaro LUA" hatte ich das Script von "Controlliving.nl" gepostet, welches die Lichter bei Bewegung intelligent einschaltet. Dabei werden neben Helligkeit, Anwesenheit und Sleepmodus auch die Tageszeiten berücksichtigt.
Hierzu ließt das Script die vordefinierte Variable "TimeOfDay" aus. Diese hatten wir bereits im letzen Tutorial angelegt, mit den Werten: Morning ; Day ; Evening ; Night
Das folgende LUA Script wird genau diese Werte berücksichtigen und auf die Variable "mappen".
Szene erstellen
Zunächst erstelle auf der Weboberfläche des Fibaro Home Center 2 unter "Szenen" > links: "Szene hinzufügen" eine neue LUA Szene.
In diese kannst du das folgende Script 1:1 übernehmen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
--[[ %% properties 222 value 352 value %% globals --]] -------------------------------------------------------------------------- local day = {9, 00}; local night = {23, 59}; --------------------------------------------------------------------------- local SunSet = fibaro:getValue(1, "sunsetHour") fibaro:debug('Sonne geht unter: ' ..SunSet); local Sunrise = fibaro:getValue(1, "sunriseHour") fibaro:debug('Sonne geht auf: ' ..Sunrise); --------------------------------------------------------------------------- if fibaro:countScenes() > 1 then fibaro:debug("stop scene"); fibaro:abort(); end local day = os.date("%H:%M", -3600+ day[1]*60*60 + day[2]*60); local night = os.date("%H:%M", -3600+ night[1]*60*60 + night[2]*60); local ostime = os.date("%H:%M", os.time()); if (night > fibaro:getValue(1, "sunriseHour") and (ostime >= night or ostime < fibaro:getValue(1, "sunriseHour"))) or (night < fibaro:getValue(1, "sunriseHour") and ostime >= night and ostime < fibaro:getValue(1, "sunriseHour")) then fibaro:debug("Nacht"); fibaro:setGlobal("TimeOfDay", "Night"); --fibaro:abort(); end if ((ostime >= fibaro:getValue(1, "sunsetHour") or ostime < night) and night < fibaro:getValue(1, "sunriseHour")) or (ostime >= fibaro:getValue(1, "sunsetHour") and ostime < night) then fibaro:debug("Abend"); fibaro:setGlobal("TimeOfDay", "Evening"); --fibaro:abort(); end if ostime >= day and ostime < fibaro:getValue(1, "sunsetHour") then fibaro:debug("Tag"); fibaro:setGlobal("TimeOfDay", "Day"); --fibaro:abort(); end if ostime >= fibaro:getValue(1, "sunriseHour") and ostime < day then fibaro:debug("Sonnenaufgang"); fibaro:setGlobal("TimeOfDay", "Morning"); --fibaro:abort(); end |
Hier noch eine kurze Erklärung
Getriggert, also ausgelöst wird das Script bei mir durch zwei Bewegungsmelder. Deren IDs stehen oben in den %% properties. Somit wird die Tageszeit jeweils bei "Bewegung" neu berechnet.
Tag und Nacht: in den Zeilen: 9 & 10 legst du jeweils die Startzeit fest, wann bei dir der Tag und wann bei dir Nacht beginnt.
1 2 3 4 |
-------------------------------------------------------------------------- local day = {9, 00}; local night = {23, 59}; --------------------------------------------------------------------------- |
Die Tageszeiten "Morning" und "Evening" werden vom Script anhand des Sonnenauf- und Untergang berechnet. Das passiert ab Zeile 34 für "Evening"
1 |
if ((ostime >= fibaro:getValue(1, "sunsetHour") or ostime < night) ... |
und ab Zeile 47 wird geprüft ob es "Morning" ist:
1 |
if ostime >= fibaro:getValue(1, "sunriseHour") ... |
Das Script prüft quasi stets die Uhrzeit mit einer "if" - also "Wenn" anfrage, ob ein bestimmter Wert schon erreicht ober überschritten , aber dennoch kleiner als der die Nachfolgende Variabel (Tageszeit) ist.
Zeitgesteuerte Szene
Wenn du möchtest, dass das Skript automatisch in 1 min-Zeitintervallen die Variablen ändert, dann nutze bitte folgendes Skript. Die Erklärungen von oben gelten natürlich auch hier.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
--[[ %% autostart %% properties %% globals --]] local sourceTrigger = fibaro:getSourceTrigger(); local version = '1.0'; fibaro:debug('VarTime-Controller (Ver.' .. version .. ')'); function varTime() -------------------------------------------------------------------------- local day = {9, 00}; local night = {23, 59}; --------------------------------------------------------------------------- local SunSet = fibaro:getValue(1, "sunsetHour") fibaro:debug('Sonne geht unter: ' ..SunSet); local Sunrise = fibaro:getValue(1, "sunriseHour") fibaro:debug('Sonne geht auf: ' ..Sunrise); --------------------------------------------------------------------------- local day = os.date("%H:%M", -3600+ day[1]*60*60 + day[2]*60); local night = os.date("%H:%M", -3600+ night[1]*60*60 + night[2]*60); local ostime = os.date("%H:%M", os.time()); if (night > fibaro:getValue(1, "sunriseHour") and (ostime >= night or ostime < fibaro:getValue(1, "sunriseHour"))) or (night < fibaro:getValue(1, "sunriseHour") and ostime >= night and ostime < fibaro:getValue(1, "sunriseHour")) then fibaro:debug("Nacht"); fibaro:setGlobal("TimeOfDay", "Night"); --fibaro:abort(); end if ((ostime >= fibaro:getValue(1, "sunsetHour") or ostime < night) and night < fibaro:getValue(1, "sunriseHour")) or (ostime >= fibaro:getValue(1, "sunsetHour") and ostime < night) then fibaro:debug("Abend"); fibaro:setGlobal("TimeOfDay", "Evening"); --fibaro:abort(); end if ostime >= day and ostime < fibaro:getValue(1, "sunsetHour") then fibaro:debug("Tag"); fibaro:setGlobal("TimeOfDay", "Day"); --fibaro:abort(); end if ostime >= fibaro:getValue(1, "sunriseHour") and ostime < day then fibaro:debug("Sonnenaufgang"); fibaro:setGlobal("TimeOfDay", "Morning"); --fibaro:abort(); end setTimeout(varTime, 60*1000); end if (sourceTrigger["type"] == "autostart") then varTime(); end |
Script Variationen
Gerade was die Tageszeiten angeht, sind wir wohl alle sehr unterschiedlich. Der Sonnenauf- bzw. Untergang ist nicht zwingend ausschlaggebend für unseren "Tagesstart" - also die Variable Morning, bzw. Evening. In diesem Fall kannst du das Script auch abwandeln und Beispielsweise feste Tageszeiten setzen. Dazu musst an die Zeilen 9 & 10 die beiden Variablen Morning & Evening anfügen und diesen in den "if" Abfragen (analog zur "Night" und "Day" Abfrage), anstelle der Abfrage nach "Sonnenauf- und Untergang" einsetzen.
Wenn man ganz auf starre Tageszeiten verzichten möchte, muss man zu einem VD - also einem Virtual Device greifen, um als eine Art "Wecker" zu bauen. Dieser könnte dann jeweils die Variable auf "Morning" setzen.
Oder einfach einen Wecker umbauen, wie die Kollegen: Wake up Light Alarm Clock
Deine Ideen sind wie immer herzlich willkommen, da unten haben wir ein Kommentarfeld eingebaut ;-)