Tageszeiten Automatik | Event-Trigger Script (universell)

Hey,
hier wieder einmal eine kleine Idee für ein Script. Eine etwas einfachere Version davon habe ich (oder chris) schon einmal gepostet, es geht darum eine Variable je nach Zeit in 4 Zustände zu setzen (Früh,tag,nachmittag,nacht).
Was bisher nicht ging, ist das dies automatisch passiert, denn die Fibaro hat ja de fac­to keinen Trigger “Uhrzeit”. Man konnte nur die Variable per Event abfragen und ändern. Dieses Script ändert sich (es läuft immer) und die Variable TimeOfDay kann als Event genutzt werden. Ihr könnt als Beispiel die Rollläden schließen, sobald Nacht ist. Es wird dabei nicht ständig aktualisiert, sondern das script pausiert sich selbst so lang, bis das nächste Event (der nächste Tageszeitenwechsel) ansteht. Wer keine lust hat darüber zu grübeln, muss das auch nicht :wink: Der CPU wird hier auf jeden fall nur zu den 4 Zeiten, in denen die Variable wechselt, belastet.
Wer lust hat, kann das Ganze einmal testen, ich bin mir selbst noch nicht 100% sicher ob alles so geht.

Viel Spass damit;)

--[[
%% autostart
%% properties
%% globals
--]]
 
--------------------------------------------------------------------------
local day  = {9, 00};
local night  = {23, 50};
 --Globale Variable "TimeOfDay" mit Inhalt Day,Night,Evening und Morning muss erstellt werden
---------------------------------------------------------------------------
if fibaro:countScenes() > 1 then
  fibaro:debug("stop scene");
  fibaro:abort();
end

function timeConvert(s)
  local timestring = s
  h, m = string.match(s, "(%d+):(%d+)")
  timestring = h*60 + m
  return tonumber(timestring)
end
fibaro:debug("start instanz");

function tempFunc()
  local timeout = 0;
  local TimeOfDay = fibaro:getGlobalValue("TimeOfDay")
  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") and ostime < day) ))
      or (night < fibaro:getValue(1, "sunriseHour") and ostime >= night and ostime < day and ostime < fibaro:getValue(1, "sunriseHour")) then
    if TimeOfDay ~= "Night" then
      fibaro:debug("Nacht");
      fibaro:setGlobal("TimeOfDay", "Night");
      if timeConvert(ostime) > timeConvert(fibaro:getValue(1, "sunriseHour")) then
        timeout = timeConvert(fibaro:getValue(1, "sunriseHour")) + (1439 - timeConvert(ostime))
      else 
        timeout = timeConvert(fibaro:getValue(1, "sunriseHour")) - timeConvert(ostime)
      end
      fibaro:debug ("Minuten Pausiert: "..timeout)
    end
          --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
    if TimeOfDay ~= "Evening" then
      fibaro:debug("Abend");
      fibaro:setGlobal("TimeOfDay", "Evening");
      if timeConvert(ostime) < timeConvert(night) then
        timeout = timeConvert(night) - timeConvert(ostime)
      else 
        timeout = timeConvert(night) + (1439 - timeConvert(ostime))
      end
      fibaro:debug ("Minuten Pausiert: "..timeout)
    end
          --fibaro:abort();
  end
   
  if ostime >= day and ostime < fibaro:getValue(1, "sunsetHour") then
    if TimeOfDay ~= "Day" then
      fibaro:debug("Tag");
      fibaro:setGlobal("TimeOfDay", "Day");
      if timeConvert(ostime) < timeConvert(fibaro:getValue(1, "sunsetHour")) then
        timeout = timeConvert(fibaro:getValue(1, "sunsetHour")) - timeConvert(ostime)
      else 
        timeout = 0
      end
      fibaro:debug ("Minuten Pausiert: "..timeout)
    end
          --fibaro:abort();
  end
   
  if ostime >= fibaro:getValue(1, "sunriseHour") and ostime < day then
    if TimeOfDay ~= "Morning" then
      fibaro:debug("Sonnenaufgang");
      fibaro:setGlobal("TimeOfDay", "Morning");
      if timeConvert(ostime) < timeConvert(day) then
        timeout = timeConvert(day) - timeConvert(ostime)
      else 
        timeout = 0
      end
      fibaro:debug ("Minuten Pausiert: "..timeout)
    end
          --fibaro:abort();
  end
  setTimeout(tempFunc, (2*1000 + timeout*60) )
end
tempFunc()

Hi Danielboe,

Ich blick nicht durch.
Zum Copy&Paste für den Timeout in andere Scripte…
Kannst Du zum Timeout bitte noch etwas erläutern/sagen?
Wieso die 1439?

Danke im Voraus

VG Hoggle

Guten Morgen,

1440 Minuten sind 24 Stunden. Mit dem +1439 gewähleistest du, dass sich die beiden Variablen nicht gegenseitig überholen.

Gruß
Neospin

Neospin genau!
Und Hoggle: Du kannst das Script auch so verwenden. Es hat weder Abhängigkeiten noch sollte es mit etwas kolidieren. Nur die Globale Variable mit den 4 Punkten musst du anlegen, das wars.

Grüße

Mir ging es in erster Line um den Timeout-Part und dessen Verstehen. Warum Wieso weshalb.
Das Script pausiert im jeweiligen if-Bereich bis zum nächsten Zeitpunkt und ist solange in der Schleife “gefangen”?
Wenn man in dem Script mit elseif arbeiten würde (statt den ifs) würde es auch funktionieren?

Ich brauche nur die function zum definieren von oben und dann geht es hiermit allgemeingültig weiter

if timeConvert(ostime) < timeConvert(day) then
        timeout = timeConvert(day) - timeConvert(ostime)
      else 
        timeout = 0
      end
      fibaro:debug ("Minuten Pausiert: "..timeout)

VG Hoggle

Hallo Daniel,

das Skript ist der Hammer. Es läuft Top!!
Vielen Dank dafür…

Besteht die Möglichkeit den Sonnenaufgang 15min vorher und den Sonnenuntergang 15min später anzulegen?!
Ich hatte versucht es versucht durch:

if os.date("%H:%M", os.time()-15*60) == fibaro:getValue(1, “sunriseHour”) --15 Minuten nach Sonnenaufgang

anzupassen. Hatte aber keinen Erfolg.
Kannst du mir helfen?!

Beste Grüße,
nevv

Ich habe den gleichen Wunsch wie nevv. Evening geht bei mir 45min vor Sonnenuntergang los und Morning immer ab 7.00 Uhr weil vorher im Haus keiner aufsteht.
Zur Zeit habe ich da faulerweise 4 grafische Szenen laufen. Das Script von Daniel ist da um einiges besser…wenn ich denn Morgen und Abend einstellen könnte.
Gruß Carsten

Ist diese Meldung normal oder deutet das auf einen Fehler hin?
Script läuft bei mir seit gestern Abend.

Unbenannt3.jpg

Nein, kein Fehler
Das ist so okay.

Was passiert, wenn “Nacht” bereits 21:00 beginnen soll aber der Sonnenuntergang im Sommer erst 21:30 ist?

Dann wird direkt Nacht und Abend wird übersprungen. Sollte man bei den Triggern natürlich bedenken. Ich meine es ist auch alles Andere möglich, aber für mich ergibt es einfach so am meisten Sinn.
Im Klartext heißt es: If Abend or Nacht then… wenn man sicher gehen will.

Grüße

Ich lasse die Variable “Tageszeit” für Sonnenaufgang, Tag, Sonnenuntergang und Nacht durch Anpassung von “sunriseHour” und “sunsetHour” auch automatisch erstellen.

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

function tempFunc()
    local currentDate = os.date("*t");
    if os.date("%H:%M", os.time()+30*60) == fibaro:getValue(1, "sunriseHour") --30 Minuten vorher
      then
        fibaro:setGlobal("Tageszeit", "Sonnenaufgang");
    elseif os.date("%H:%M", os.time()-15*60) == fibaro:getValue(1, "sunriseHour") --15 Minuten später
      then
        fibaro:setGlobal("Tageszeit", "Tag");
    elseif os.date("%H:%M", os.time()+15*60) == fibaro:getValue(1, "sunsetHour") --15 Minuten vorher
      then
        fibaro:setGlobal("Tageszeit", "Sonnenuntergang");
    elseif os.date("%H:%M", os.time()-30*60) == fibaro:getValue(1, "sunsetHour") --30 Minuten später
      then
        fibaro:setGlobal("Tageszeit", "Nacht");
    end
    setTimeout(tempFunc, 60000)
end
tempFunc()

Hallo,also verstehe ich das richtig :Night 24-6 Uhr,Morning von 6-12 Uhr,von 12-18Uhr Day und dann 18-24 Uhr eveving ? gruß campos

Hatten gestern eine kurzen Stromausfall und heute bemerkte ich, dass das Tageszeiten Script nicht mehr läuft.
Beim Nachsehen habe ich festgestellt, dass ich das “Kästchen” starten, wenn Homecenter startet, nicht vorhanden ist.
Wie kann ich das ändern?

Dies ist in keiner LUA-Szene mehr da. Dies läuft über den Header:

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

Und dort %% autostart

Gruß

@danielboe: Danke erstmal für das tolle Script.
Genauso wie die User DecalPrint und nevv benötige ich die Möglichkeit x min. nach dem Sonnenaufgang auf Morning zu setzen bzw. x min. vor dem Sonnenuntergang auf Evening.

Leider habe ich die vorhanden Scripte nie so anpassen können, dass immer einwandfrei funktioniert.

Vielleicht kannst Du ja uns diese Modifikation nachliefern.

Danke.

Hallo an Alle,

Der Beitrag ist zwar schon etwas älter - aber beschreibt ziemlich genau meine Bedürfnisse!
Ich möchte die 4 Tageszeiten folgenderweise steuern:

Morgen --> ab 5.30
Tag --> ab 8.00
Abend --> 1 Stunde VOR Sonnenuntergang
Nacht --> ab Sonnenuntergang

Bin ein absoluter Laie was LUA betrifft - kann zwar halbwegs eine Logik erkennen, wenn ich einen Code lese, aber vom selber schreiben bin ich meilenweit entfernt!

Wäre Euch echt dankbar, wenn Ihr mir hier weiterhelfen könnt!

Vielen Dank, Joe

PS: Die Variable TimeofDay (Morning, Day, Evening, Night) habe ich bereits angelegt!

Hi,
Und welche Probleme genau hast du mit dem Script?

Viele Grüße Hoggle

Hi Hoggle,

Ersten Danke für das rasche Feedback!

Also bei “Morgen” und “Tag” ist mir klar, wie ich diese Werte definiere:

local morning = {5, 30};
local day = {8, 00};

Die “Nacht” ergibt sich dann in weiterer Folge aus einer “if - Bedingung” (fibaro:getValue(1, “sunsetHour”) --> auch noch klar!
Aber wie genau heißt dann MEIN Abend??
Ich hätte ja gerne, dass der “Abend” immer 1 Stunde vor Sonnenuntergang beginnt - da ist mir nicht klar, wie ich das in LUA “einbaue”…

Wie gesagt, ich fange gerade erst an, mich mit LUA auseinanderzusetzen und da ist wohl der beste Lehrer die Übung und Erfahrung!!!
Also habt bitte Geduld mit mir :slight_smile:

Gruß, Joe

Hi,

hast Du Dir auf Seite 1 mal den Post #23442 angesehen?

Oder ich habe das wie folgt ergänzt:


local vorher = 20 		 -- 20 Minuten vor Sonnenuntergang angehen
......

elseif os.date("%H:%M", os.time()+vorher*60) == SunSet   -- 20 Minuten vor Sonnenuntergang

VG Hoggle