im Vorgriff auf die HC2-Steuerung der Weihnachtsbeleuchtung habe ich versucht meine Umwälzpumpe smart zu machen.
In LUA.
Mittlerweile denke ich, dass zwei simple Block-Szenen das Problem schon längst gelöst hätten.
Aber es sollte eine LUA sein…
Kurz vorweg: Die Umwälzpumpe (über Fibaro WallPLug) soll die Woche über morgens um 5:55 angehen und in der Nacht wieder aus. Am Wochenende sind die Zeiten verschoben.
Durch die An-/Abwesenheitssteuerung soll die Pumpe an- bzw. ausgeschaltet werden. Bei Anwesenheit gilt der Zeitplan.
Ich habe das Gefühl, HC geht nur einmal durch die Szene durch und das war es dann. Oder die Bedingungen sind verquer. Zum Spielen hatte ich die Aus-Zeit entsprechend angepasst.
Der Debug gibt nur nach dem Speichern der Szene etwas aus. Sonst nichts.
Kann mir jemand sagen, was ich da falsch mache/denke?
--[[
%% properties
%% autostart
%% globals
--]]
-- Sonntag ist 1
local sourceTrigger = fibaro:getSourceTrigger();
function tempFunc()
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
-- Pumpe AN
if ( (((currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "05:55") )
and ( fibaro:getGlobalValue("Anwesend") == "Ja" ) )
then
fibaro:call(56, "turnOn");
fibaro:debug("Mo-Fr, Pumpe an");
end
if ((((currentDate.wday == 1 or currentDate.wday == 7) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "07:00") )
and ( fibaro:getGlobalValue("Anwesend") == "Ja") )
then
fibaro:call(56, "turnOn");
fibaro:debug("Sa-So, Pumpe an");
end
--Pumpe AUS
if ( ((currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "20:52")
and fibaro:getGlobalValue("Anwesend") == "Ja" )
then
fibaro:call(56, "turnOff");
fibaro:debug("Mo-Do, Pumpe aus");
end
if ((((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 7) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "01:00") )
and fibaro:getGlobalValue("Anwesend") == "Ja" )
then
fibaro:call(56, "turnOff");
fibaro:debug("Fr-So, Pumpe aus");
end
fibaro:debug("Oder No action");
end
if (sourceTrigger["type"] == "autostart")
then tempFunc()
fibaro:debug("Type Autostart");
end
Hey, unabhängig davon was du vor hast, braucht jede Szene einen Trigger. Oben steht autostart drinnen, die Szene Startet also 1. wenn du auf start drückst und wenn deine HC2 bootet. Alles andere müsstest du mit einer loop lösen. Oder du startest die Szene durch irgend ein Event mehrfach am tag und prüfst die Bedingungen.
dein Skript, startet wie Daniel schon richtig bemerkt hat einmal. Du startest aber hier:
if (sourceTrigger[“type”] == “autostart”)
then tempFunc()
fibaro:debug(“Type Autostart”);
end
immer wieder die tempfunc-Funktion. Diese ist bei dir aber leer: function tempFunc()
Deine ganzen Prüfungen müssen in diese Funktion verlagert werden. Wenn du dann mit der oben genannten Schleife die Funktion immer wieder ausführst, dann prüft er auch immer die Bedingungen.
Ah, sorry. Hab was übersehen. So wie du es machst ist es richtig. Es hat aber eine Kleinigkeit gefehlt. Zeile 9-38 ist die Funktion tempfunc Versuch mal das hier:
--[[
%% properties
%% autostart
%% globals
--]]
fibaro:debug('Erstmalig gestartet')
-- Sonntag ist 1
local sourceTrigger = fibaro:getSourceTrigger();
function tempFunc()
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
fibaro:debug('Funktion gestartet')
-- Pumpe AN
if ( (((currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "14:30") ))
then
fibaro:debug("Mo-Fr, Pumpe an");
end
if ((((currentDate.wday == 1 or currentDate.wday == 7) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "07:00") ))
then
fibaro:debug("Sa-So, Pumpe an");
end
--Pumpe AUS
if ( ((currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "20:52"))
then
fibaro:debug("Mo-Do, Pumpe aus");
end
if ((((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 7) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "01:00") ))
then
fibaro:debug("Fr-So, Pumpe aus");
end
fibaro:debug("Oder No action");
setTimeout(tempFunc, 60*1000)
end
if (sourceTrigger["type"] == "autostart")
then tempFunc()
fibaro:debug("Type Autostart");
end
Das lief bei mir sauber durch (Hab die Variablen entfernt, hatte keine Lust die anzulegen ):
[DEBUG] 14:28:58: Erstmalig gestartet
[DEBUG] 14:28:58: Oder No action
[DEBUG] 14:28:58: Type Autostart
[DEBUG] 14:29:58: Erstmalig gestartet
[DEBUG] 14:29:58: Oder No action
[DEBUG] 14:30:58: Erstmalig gestartet
[DEBUG] 14:30:58: Mo-Fr, Pumpe an
[DEBUG] 14:30:58: Oder No action
[DEBUG] 14:31:58: Erstmalig gestartet
[DEBUG] 14:31:58: Oder No action
Bei so einem Skript macht es glaub ich keinen Unterschied. Du sparst dir mit elseif ein end aber bei verschachtelten Skripten macht es schon Sinn, um ein wenig die Übersicht zu erhöhen.