Lichtsteuerung Teil 2: Fibaro Tageszeiten Variable via LUA setzen

Geschrieben von crissxcross

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:

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.

Die Tageszeiten "Morning" und "Evening" werden vom Script anhand des Sonnenauf- und Untergang berechnet. Das passiert ab Zeile 34 für "Evening"

und ab Zeile 47 wird geprüft ob es "Morning" ist:

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.

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 ;-)

Diesen Blogpost hat geschrieben ...

crissxcross

Chris, Gründer und Blogger von siio.
Gelernter IT-Systemelektroniker, seit vielen Jahren beruflich als Produktmanager im Smart Home unterwegs. Technikverliebter Familienvater, Apple Fan. Nach einigen Jahren Stadtleben wieder froh auf dem Land zu sein.

26 Kommentare

  • super Geschichte. Aber leider immer alles in LUA. Wäre Toll wenn jemand das mal als normale wenn dann Regel posten könnte. ich denke es gibt einige die sich mit LUA nicht auskennen.

    • Hallo. Lass mich ein paar Sachen ausführen, die keinesfalls wertend sind. LUA ist das mächtigste Werkzeug was du mit Fibaro an die Hand bekommst. Das Home Center Lite ist als Einstiegsdroge gut, aber wenn du eine perfekte Automation willst, wirst du um das HC2 aufgrund LUA nicht herumkommen. Speziell das Lichtsteuerungsscript aus Teil 1, wirst du niemals in der Blockszene nachbilden, da es zu komplex ist, viele Werte, Variablen berücksichtigt und Zeitschleifen nutzt.
      Ich wollte bislang immer mit dem siio Blog, das Leser die wie du sagst, nicht programmieren können, es schaffen dennoch LUA Scripte zu verwenden, aber auch zu verstehen. Daher findest du in all meinen Tutorials Erklärungen. Das man LUA nicht in 2h lernt - ist leider so. Ich bin auch kein Programmierer, aber habe vieles verstanden indem ich mir LUA Scripte per Coy & Paste genommen habe, gelesen, geändert und probiert. Das ist auch der Ansatz des siio Blogs, euch soetwas an die Hand zu geben.

      Was die Tageszeiten angeht, dies kannst du auch per Blockszene machen. Musst allerdings für jede Tageszeit eine Szene anlegen. Dazu gibt es schon ein Tutorial hier auf siio, schau mal in die "Fibaro Wissensdatenbank" rein: http://siio.de/fibaro-db

  • Danke für die Erläuterung, Chriss!
    Wozu ist denn die Prüfung in Zeile 18 bzw. wie oder durch was wird "countScenes" verändert?
    Danke im Voraus
    Hoggle

  • Der umgebaute Radiowecker hat was.
    Als Nicht-Elektriker habe ich an meinen Radiowecker einen WallPlug zwischengeschaltet - der gemessene Stromverbrauch lässt sich leider nicht für eine Steuerung sinnvoll nutzen.....

  • Hi Chris Cross,

    vielen Dank für das Script. Ich habe Morning und Evening gegen Uhrzeiten ersetzt.

    Wenn ich auf Start gehe, läuft das Script auch und die Tageszeit wird geändert. Aber leider läuft es dann nicht weiter automatisch durch. Woran kann das denn liegen?

    Das ist das Script:

    --[[
    %% properties
    %% globals
    --]]

    ...

    Gruß
    NatP

    • Hi,

      du brauchst auch einen Trigger, welcher die Szene startet. Bei Chris sind das die MotionSensors. Soll die Szene automatisch starten, dann benötigst du ein %%autostart oben in den propeties. Dann läuft das Skript jede Sekunde. (Würde noch ein fibaro:sleep mit einbauen)

      Gruß

      Edit: Hab deine Texte zwecks Übersichtlichkeit mal ein wenig gekürzt :)

  • Hi Leute,

    das Format der Scripte auf dieser Seite scheint irgendwie zerschossen zu sein....
    Insbesondere das "Script zu Zeitgesteuerte Szene".
    In anderen Browsern sieht es auch nicht besser aus....
    Könnte Ihr bitte mal schauen?
    Danke
    VG
    Hoggle

  • Hi Chris,
    was muss ich tun, wenn ich möchte, dass nicht der Tag zB. um 6 beginnt, sondern der Morgen und dieser dann in den Tag wechselt, sobald die Sonne aufgeht?
    Ich denke das würde mehr Sinn machen, da ich ja bereits anderes Licht haben möchte, wenn ich um 6 aufstehe, aber der Sonnenaufgang momentan ja noch 1,5 Std. weit weg ist.

    • Hi,

      du musst die Zeilen 9-15 anpassen. Hier sind die Daten für die einzelnen Setzpunkte hinterlegt.

      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);

      Gruß

      • Hi, aber es reicht doch nicht, wenn ich in 9 einfach "day" durch "morning" ersetze und dieses auf "6, 00"
        Wo erklär ich dem Script denn, dass "day" dann bei Sonnenaufgang startet?

  • Ich habe das Script mal folgendermaßen umgebaut.
    Nun startet der Morgen um 6:00 und wird dann mit dem Sonnenaufgang zum Tag.

    Ich habe einige Überschneidungen mit den anderen Tageszeiten korrigiert und nun scheint es korrekt zu laufen.
    Mal gucken wie es dann ist, wenn der Sonnenaufgang im Frühling wieder vor die 6:00 Uhr rutscht :-)

    --[[
    %% autostart
    %% properties
    %% globals
    --]]

    local sourceTrigger = fibaro:getSourceTrigger();
    local version = '1.0';

    fibaro:debug('VarTime-Controller (Ver.' .. version .. ')');

    function varTime()
    --------------------------------------------------------------------------
    local morning = {6, 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 morning = os.date("%H:%M", -3600+ morning[1]*60*60 + morning[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, "sunsetHour") and (ostime >= night and ostime < fibaro:getValue(1, "sunriseHour")))
    or (night = night and ostime = fibaro:getValue(1, "sunsetHour") or ostime < night) and night = fibaro:getValue(1, "sunsetHour") and ostime = morning and ostime = fibaro:getValue(1, "sunriseHour") and ostime > morning and ostime < fibaro:getValue(1, "sunsetHour") then
    fibaro:debug("Tag");
    fibaro:setGlobal("TimeOfDay", "Day");
    --fibaro:abort();
    end
    setTimeout(varTime, 60*1000);
    end

    if (sourceTrigger["type"] == "autostart") then
    varTime();
    end

  • Hier nochmal ein Update – Abendvariable wurde nicht korrekt gesetzt:

    --[[
    %% autostart
    %% properties
    %% globals
    --]]

    local sourceTrigger = fibaro:getSourceTrigger();
    local version = '1.0';

    fibaro:debug('VarTime-Controller (Ver.' .. version .. ')');

    function varTime()
    --------------------------------------------------------------------------
    local morning = {5, 30};
    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 morning = os.date("%H:%M", -3600+ morning[1]*60*60 + morning[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 (ostime >= night)
    or (ostime < fibaro:getValue(1, "sunriseHour") and ostime = fibaro:getValue(1, "sunsetHour") or ostime < night) and night = fibaro:getValue(1, "sunsetHour") and ostime = morning and ostime = fibaro:getValue(1, "sunriseHour") and ostime > morning and ostime < fibaro:getValue(1, "sunsetHour") then
    fibaro:debug("Tag");
    fibaro:setGlobal("TimeOfDay", "Day");
    --fibaro:abort();
    end
    setTimeout(varTime, 60*1000);
    end

    if (sourceTrigger["type"] == "autostart") then
    varTime();
    end

  • Hi
    Begeistert nutze ich die Scene und finde diese super. Ich habe versucht mir eine "Preevening" variable zu bauen. Diese soll von 19:45 bis "Evening" dauern. Leider Funktioniert es aber nicht.
    Kann mir da jemand helfen? Alternativ könnte es auch so sein, dass Evening um 19:45 startet ausser wenn sonnenuntergang schon vorher ist, dann soll schon vorher auf Evening gewechselt werden.
    Anbei mein Lua Script welches ich versucht habe entsprechend meinem wissen anzupassen.

    --[[
    %% autostart
    %% properties
    %% globals
    --]]

    local sourceTrigger = fibaro:getSourceTrigger();
    local version = '1.1';

    fibaro:debug('VarTime-Controller (Ver.' .. version .. ')');

    function varTime()
    --------------------------------------------------------------------------
    local day = {8, 00};
    local night = {22, 30};
    local preevening = {19, 45}
    --Globale Variable "TimeOfDay" mit Inhalt Day,Night,Evening,PreEvening und Morning muss erstellt werden
    ---------------------------------------------------------------------------
    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 preevening = os.date("%H:%M", -3600+ preevening[1]*60*60 + preevening[2]*60);
    local ostime = os.date("%H:%M", os.time());
    -- Abfrage für Nacht
    if (night > fibaro:getValue(1, "sunriseHour") and (ostime >= night or ostime < fibaro:getValue(1, "sunriseHour")))
    or (night = night and ostime = fibaro:getValue(1, "sunsetHour") or ostime < night) and night = fibaro:getValue(1, "sunsetHour") and ostime = day and ostime = preevening and ostime > fibaro:getValue(1, "sunsetHour") then
    fibaro:debug("Vorabend");
    fibaro:setGlobal("TimeOfDay", "PreEvening");
    --fibaro:abort();
    end
    -- Abfrage für Sonnenaufgang/Morgen
    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

  • Hallo ich verstehe leider nicht, wie genau die Zeilen dann aussehen müssen:
    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.
    Kann ich mir das irgendwo Kopieren?
    Ich möchte die Tageszeiten mit Uhrzeiten nicht mit Sonnen auf oder Untergang in meiner Autostart Szene integrieren.

Gib deinen Senf dazu!

Cookie Consent mit Real Cookie Banner