Erklärung / Hilfe zu meinem Skript

Hallo zusammen,

ich wollte meinen Fibaro Wall Plug zu einer bestimmten Tageszeit ein- und ausschalten.
Dies sollte Tagesunabhängig passieren.

Da ich in Sachen Lua Programmierung recht unerfahren bin, habe ich mich auf die Suche
für Beispielcode gemacht.

Nachdem ich einige Quellen (vor allem hier :-)) gefunden habe, konnte ich den Code für
meine Belange anpassen - was auch in der Praxis funktioniert.
Der Wall Plug tut was er soll.

Da ich den Code nicht zu 100% verstehe und ich mein Wissen gerne erweitern möchte,
wende mich an die Profis hier im Forum.

Hier aber erstmal der Programmcode:

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

local sourceTrigger = fibaro:getSourceTrigger();

function tempFunc()
  local currentDate = os.date("*t");
  local currentTime = string.format("%02d",currentDate.hour)..":"..string.format("%02d",currentDate.min)
  local startTime = "06:15";
  local stopTime = "22:00";

  if (currentTime == startTime) then
    fibaro:call(6, "turnOn");
  end
  if (currentTime == stopTime) then
    fibaro:call(6, "turnOff");
  end
  setTimeout(tempFunc, 60*1000)
end

if (sourceTrigger["type"] == "autostart") then
  fibaro:debug("Hallo");
  tempFunc()
else
  local currentDate = os.date("*t");
  local startSource = fibaro:getSourceTrigger();
  if (startSource["type"] == "other") then
    fibaro:call(6, "turnOff");
  end
end

  1. Warum benötige ich %% events und %% properties?
    Ist das hier erforderlich?
  2. Warum muss man eine Funktion für die Ausführung ansprechen und kann das nicht direkt machen?
    Ich habe es ohne Funktion versucht, aber dann läuft keine Instanz und der Wall Plug schaltet nicht.
  3. Wann wird der Trigger “other” ausgeführt?
    Ein manuelles Schalten am Gerät führt nicht zur Ausführung des Programmcodes.
    3a. Kann der Programmteil evtl. entfallen?
  4. Muss ich mir nochmal das Datum (Zeit) holen und den Trigger für “other” abfragen?
    Kann das nicht schon einaml außerhalb der Funktion passieren (wie im Code geschehen) und dann ist die Variable überall im Code verfügbar?
  5. Warum wird ein setTimeout benötigt?
    Ohne diesen funktioniert das Ganze nämlich nicht.
  6. Wann muss ein Semikolon am Zeielnende gesetzt werden und wann nicht?

Vielen Dank für Eure Unterstützung.

Gruß
Tom

Hi,

komme ich mal kurz zu deinen Fragen. Es sieht allerdings so aus, als ob es sich um eine umgewandelte Blockszene handelt, da macht das Debuggen nicht Spass, da die Blockszene eher schlechten LUA-Code fabriziert.

1.) Brauchst du eigentlich nicht. Wird aber beim Erstellen einer neuen Szene automatisch eingetragen. Solltest du CentralSceneEvent, bzw. Module als Trigger verwenden, dann brauchst du die Einträge.

2.) Kannst du auch direkt machen. Blockszenen generieren diese Art von Code.

3.) Wenn du die Szene manuell ausführst.

4.) Nein, brauchst du nicht.

5.) So prüft das Skript jede Minute die Zeit. Würde auch ohne funktionieren, aber dann wird jede Millisekunde geprüft. Ergo zu viel Last und unnötig.

6.) Wenn du mehrere LUA-Befehle in ein Zeile schreibst, dann brauchst du ein Semikolon. Ansonsten wird das nicht benötigt.

Gruß

Hallo boomx,

danke für deine Erklärung. Dadurch ist wieder etwas Licht ins Dunkel gekommen :slight_smile:

Du hast recht - nachdem das selbtsgeschriebene Skript nicht funktioniert hat, habe ich eine Blockszene umgewandelt.
Ich werde aber jetzt mit deiner “Unterstützung” versuchen das Skript entsprechend neu zu machen.

Nochmals vielen Dank.

Gruß
Tom