24

Lichtsteuerung Teil 2: Fibaro Tageszeiten Variable via LUA setzen

by crissxcross1. September 2015

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

About The Author
crissxcross
crissxcross
Hi, ich bin crissxcross, gelernter IT-Systemelektroniker. Beruflich arbeite ich als Produktmarketing-Manager im Bereich Smart Home. Auch privat interessiere ich mich für Smart Home und bin selbst Hausautomatisierer :-) Falls ich nicht vor dem Monitor sitze fotografiere ich gern und bin ein großer Apple Fan.
24 Comments
  • maccwinn
    2. September 2015 at 7:36

    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.

    • crissxcross
      2. September 2015 at 10:09

      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

  • Hoggle
    Hoggle
    2. September 2015 at 7:45

    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

  • Hoggle
    Hoggle
    3. September 2015 at 20:40

    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…..

  • NatP
    4. September 2015 at 6:05

    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

    • boomx
      boomx
      4. September 2015 at 20:57

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

      • Zero-G
        5. September 2015 at 11:24

        Hi,

        leider startet die Szene dann nur einmal automatisch, nicht jede Sekunde oder mit fibaro:sleep seltener.
        Muss man noch etwas einbauen?

        Danke & Gruß

  • Hoggle
    Hoggle
    5. September 2015 at 21:07

    Super.
    Danke boomx.

  • Hoggle
    Hoggle
    9. September 2015 at 19:39

    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

  • Thorsten
    25. September 2016 at 8:04

    läuft prima…DANKE!

  • Basti
    Basti
    6. Oktober 2016 at 6:13

    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.

    • boomx
      6. Oktober 2016 at 11:09

      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ß

      • Basti
        Basti
        6. Oktober 2016 at 20:12

        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?

        • boomx
          6. Oktober 2016 at 22:11

          Das ist richtig. Das sind aber die jeweiligen Zeitpunkte bei denen die Variable verändert wird. Da kannst du jetzt die Zeit eintragen, die du möchtest. :)

          Gruß

          • Basti
            Basti
            8. Oktober 2016 at 7:48

            Nein, ich möchte ja den Morgen zu einem früheren Zeitpunkt und den Tag dann bei Sonnenaufgang.

  • Basti
    Basti
    8. Oktober 2016 at 7:51

    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

  • Basti
    Basti
    20. Oktober 2016 at 22:02

    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

Leave a Response