ich habe zwei Blockscenen erstellt, damit der Dimmer Abends um 23 Uhr das Licht dimmt und morgends um 7 Uhr das Licht wieder auf 100 % stellt. Beide Scenen funktionieren auch wunderbar, jedoch habe ich das Problem, das Punkt 23 Uhr und Punkt 7 Uhr bei eingeschaltetem Licht dieses ausgestellt wird. Dies kommt daher, dass ich bei den Blockscenen das Problem hatte, das nach dem dimmen das Licht anbliebt, sodass ich den Licht ausschalten Befehl ergänzt habe. Heute habe ich nun den ganzen Tag mit dem erweitertem Lua rumgespielt, jedoch will mir einfach nicht in den Kopf, was ich noch ergänzen muss, sodass das Script funktioniert. Anbei die Blockscene und das von mir gebastelte Script. Vielleicht kann ja jemand mal drüber schauen, bzw. mir einen Codeschnipsel zeigen.
Danke im Voraus.
--[[
--[[
%% autostart
%% globals
--]]
local sourceTrigger = fibaro:getSourceTrigger();
function tempFunc()
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
( ((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7)
and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "14:00") )
and fibaro:getValue(92, "energy") > 3
)
then
fibaro:call(92, "setValue", "15");
fibaro:debug('Dimmen');
else
fibaro:call(92, "setValue", "100");
fibaro:call(92, "turnOff");
fibaro:debug('Dimmen2');
end
if (
( ((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7)
and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "20:40") )
)
then
fibaro:call(92, "setValue", "15");
fibaro:debug('Dimmenlala');
else
fibaro:call(92, "setValue", "100");
fibaro:call(92, "turnOff");
fibaro:debug('Dimmenka');
end
setTimeout(tempFunc, 60*1000)
end
if (sourceTrigger["type"] == "autostart") then
tempFunc()
else
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
startSource["type"] == "other")
then
fibaro:call(92, "setValue", "15");
fibaro:debug('Dimmen3');
else
fibaro:call(92, "setValue", "100");
fibaro:call(92, "turnOff");
fibaro:debug('Dimmen4');
end
end
Ok, ich habe eingesehen, das mit dem Lua ist noch nichts für mich. Da werde ich mich erstmal ordentlich einlesen müssen. Daher die Frage, kann ich per Blockscenen umsetzen, dass das Licht um 23 Uhr gedimmt wird und falls das Licht bereits an ist, dieses auch anbleibt?
sowas in der Art habe ich mir auch schon als Strategie zurechtgelegt fürs Bad (warte noch auf die Budget- und Bastelzeit-Freigabe ), weil ich abends beim Zähneputzen vom hellen Licht erschlagen werde. Du könntest vor dem eigentlichen Dimmen zur festgelegten Uhrzeit eine while-Schleife einbauen, die dein Skript solange pausiert, wie das Licht noch an ist, und erst beim Ausschalten weitermacht mit Dimmen (damit beim nächsten manuellen Einschalten gleich gedimmt ist). Oder habe ich dein Ziel falsch verstanden?
Du hast das Ziel genau richtig verstanden. Gedimmtes Licht ab einer gewissen Uhrzeit, damit man nicht erblindet. Das mit der While-Schleife klingt schon einmal gut, wobei es doch möglich sein müsste, dass er den Zustand erkennt und demnach nur dimmt anstelle von dimmen und ausschalten. Ich warte nochmal ein paar Tage, vielleicht finde ich in der Blockscene noch etwas passendes. Alternativ muss ich dann doch solangsam mal mit Lua anfangen. Vielleicht hat jemand hier ja noch eine zündende Idee.
dann könntest du am Anfang der tempfunc() den Zustand “an/aus” abfragen und in einer Variablen zwischenspeichern und beim Ausschalten in Zeile 22 bzw. 35 mit einer if-Bedingung nur ausschalten, wenn der Zustand vorher auch “aus” war. Wobei ich mich gerade frage, warum du in Zeile 15 “energy > 3” zur Bedingung machst?!
Einfach den Code oben vergessen, war nur wildes zusammen geklicker eines Laien. Lese mich gerade in Lua ein. Mal schauen, ob ich die Tage etwas sinnigeres zusammen bekomme. Ich nehme deine Anregungen aber dankend an.
Sehr schön! Ich lese und schreibe hier eher mobil mit, weil ich viel mit Öffis unterwegs bin. Für Gedankengänge und Anregungen reicht das, aber fertige Codebeispiele bekomme ich von unterwegs nicht hin. Außerdem bin ich Freund vom IKEA-Prinzip. Was man selbst gebaut hat, weiß man mehr zu schätzen und versteht, wie es funktioniert
Habe mir jetzt gerade ein Dimmermodul fürs Bad bestellt und werde dein Skript vielleicht als Basis für eigene Versuche nehmen. Kann ich dann gern hier einstellen, aber es mangelt halt etwas an Bastelzeit dafür, kann also 2 Wochen dauern.
--[[
%% autostart
%% properties
92 power
%% weather
%% events
%% globals
--]]
local Zeit = "23:00"
local sourceTrigger = fibaro:getSourceTrigger();
function tempFunc()
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
( ((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == Zeit) and tonumber(fibaro:getValue(92, "power")) > 3 )
)
then
fibaro:call(92, "setValue", "8");
fibaro:debug("Licht an und nur dimmen");
end
if (
( ((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == Zeit) and tonumber(fibaro:getValue(92, "power")) < 3 )
)
then
fibaro:call(92, "setValue", "8");
fibaro:call(92, "turnOff");
fibaro:debug("Licht aus und nur dimmen");
end
setTimeout(tempFunc, 60*1000)
end
if (sourceTrigger["type"] == "autostart") then
tempFunc()
end
So das ist das neue Script und es scheint zu laufen. Kannst du gerne testen. Als nächstes werde ich mich dann mal daran machen, dass es morgens zu einer gewissen Uhrzeit wieder auf 100 % gedimmt wird.
Sieht gut aus, jetzt warte ich auf mein Modul und lege auch los
Ein paar echt nett gemeinte Tipps: lass die Wochentagsabfrage weg (sicherlich ein Relikt aus der Blockszenen-Umwandlung), wenn es eh jeden Tag gelten soll, das erhöht die Übersichtlichkeit. Du wirst es dir danken, wenn du in 1 Jahr wieder an diese Szene ran musst wegen Wartung oder so. Hier mag es noch gehen, ich habe aber einige gruselige Szenen aus meiner Fibaro-/LUA-Anfangszeit, da fällt die Wartung echt schwer
Und wenn du extrem energiesparende Lampen hast, kann die Abfrage der Leistung scheitern. Frag lieber über tonumber(fibaro:getValue(92, "value")) > 0 ab, ob die Lampe leuchtet. Stell dir vor, jemand hat vorher schon runtergedimmt auf 2W Gesamtleistung, dann klaust du ihm das letzte Licht
Der Umbau für morgens hält sich in Grenzen, da müssen ja nur Zeit und ein paar Werte angepasst werden.
Vielen Dank für deine Anregungen. Finde diese Klasse!
Habe demnach mal ein wenig im Code aufgeräumt, wobei ich getValue noch nicht testen konnte. Werde ich aber am Wochenende tun.
Anbei mal der aufgeräumte Code
--[[
%% autostart
%% properties
92 power
%% weather
%% events
%% globals
--]]
local Zeit = "23:00" --abends
local Zeit2 = "07:00" --morgens
local sourceTrigger = fibaro:getSourceTrigger();
function tempFunc()
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if
string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == Zeit and tonumber(fibaro:getValue(92, "power")) > 3
then
fibaro:call(92, "setValue", "8");
fibaro:debug("Licht abends an und nur dimmen");
end
if
string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == Zeit and tonumber(fibaro:getValue(92, "power")) < 3
--tonumber(fibaro:getValue(92, "value")) > 0
then
fibaro:call(92, "setValue", "8");
fibaro:call(92, "turnOff");
fibaro:debug("Licht abends aus und nur dimmen");
end
if
string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == Zeit2 and tonumber(fibaro:getValue(92, "power")) > 3
then
fibaro:call(92, "setValue", "100");
fibaro:debug("Licht morgens an und nur dimmen");
end
if
string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == Zeit2 and tonumber(fibaro:getValue(92, "power")) < 3
then
fibaro:call(92, "setValue", "100");
fibaro:call(92, "turnOff");
fibaro:debug("Licht morgens aus und nur dimmen");
end
setTimeout(tempFunc, 60*1000)
end
if (sourceTrigger["type"] == "autostart") then
tempFunc()
end
Hier arbeite ich mit der „sceneActivation“ des Dimmers.
Wird der Lichtschalter betätigt wird Tagsüber das Licht normal eingeschaltet. In der Nacht wird es nur auf 15% gedimmt.
Nochmaliges betätigen schaltet das Licht aus.
@Schnuckman79: Vielen Dank nochmal für den Tipp mit tonumber(fibaro:getValue(92, "value")) > 0. Es macht das Script noch universeller und ich muss nicht mehr nach der Wattzahl des Leuchtmittels schauen. @nevv: Ich kam leider noch nicht dazu dein Script zu testen, aber wenn ich es richtig in Erinnerung habe, war der Nachteil an der Sceneactivation doch, dass die Dimmung erst bei Betätigung des Schalters einsetzt. Dies würde ja bedeuten, dass ich wenige Sekunden das helle Licht nachts ertragen müsste?
das oben genannte Script läuft seit geraumer Zeit. Nun habe ich den Dimmer in Bad 2 eingebaut und das Script kopiert, jedoch reagiert nur bei Dimmer 2 das “Licht morgens aus und nur dimmen” nicht. Jemand eine Idee?
%% autostart
%% properties
92 power
%% weather
%% events
%% globals
--]]
local Zeit = "23:00" --abends
local Zeit2 = "07:00" --morgens
local sourceTrigger = fibaro:getSourceTrigger();
function tempFunc()
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if
string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == Zeit
--and tonumber(fibaro:getValue(92, "power")) > 3
and tonumber(fibaro:getValue(92, "value")) > 0
then
fibaro:call(92, "setValue", "8");
fibaro:debug("Licht abends an und nur dimmen");
end
if
string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == Zeit
--and tonumber(fibaro:getValue(92, "power")) < 3
and tonumber(fibaro:getValue(92, "value")) == 0
then
fibaro:call(92, "setValue", "8");
fibaro:call(92, "turnOff");
fibaro:debug("Licht abends aus und nur dimmen");
end
if
string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == Zeit2 and tonumber(fibaro:getValue(92, "power")) > 3
then
fibaro:call(92, "setValue", "100");
fibaro:debug("Licht morgens an und nur dimmen");
end
if
string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == Zeit2 and tonumber(fibaro:getValue(92, "power")) < 3
then
fibaro:call(92, "setValue", "100");
fibaro:call(92, "turnOff");
fibaro:debug("Licht morgens aus und nur dimmen");
end
setTimeout(tempFunc, 60*1000)
end
if (sourceTrigger["type"] == "autostart") then
tempFunc()
end