ich hab im Forum/Internet einmal nach einer Sonnensteuerung/Beschattungssteuerung gesucht aber nichts gefunden was meine Wünsche erfüllen würde.
Ich suche ein Skript mit dem ich meine Jalousien/Rolläden bei einem festgelegten Wert Sonneneinstrahlung (über mehrere Motion Eyes draußen) herunterfahren kann. Die Jalousien sollen dann so lange unten bleiben bis in einer Zeitspanne xy keine hohe Sonneneinstrahlung mehr gemessen wird (z.B. 20 Minuten Sonneneinstrahlung) und dann wieder hochfahren. Dies soll von Sonnenaufgang bis Sonnenuntergang laufen ( da dann die Rollos ünber Nacht ja zubleiben sollen).
in LUA lässt sich so ziemlich alles darstellen. Was Du im Skript brauchst sind Trigger, können die Variablen sein für Sunrise/Sunset. Das ganze löst eine Funktion aus die die LUX-Werte deiner Motion Eye’s abfragt -> prüft und entsprechend des Ergebnisses die Jalousiene/Rolläden triggered. Die Puzzelsteine dafür solltest du hier im Forum finden können. Sachen wie Türen/Fenster prüfen sind ähnlich, oder auch die Rollladen-Steuerung (Sonnenaufgang/-untergang) von Boomx gibt schon einiges her!
hab ich jetzt auch festgestellt: Selbst zusammensetzen/schreiben ist besser um den Inhalt auch zu verstehen! Hab jetzt einmal ein Skript von “Licht solange Bewegung” angepasst. Allerdings bekomme ich den Fehler : [DEBUG] 13:24:22: line 48: expected near ‘end’.
Das kann ich leider überhaupt nicht zuordnen. Kann mir da einer weiterhelfen woher der Fehler kommt?
Anbei das Skript:
`–[[
%% properties
155 value
%% globals
–]]
– VARIABLEN (Bewegungsmelder muss oben unter %% properties aufgeführt sein)
local scene = 58 – ID dieser Szene
local lux = 155 – ID der Helligkeit Terrasse 1
– Lösche doppelte Szene(n)
if (fibaro:countScenes()>1) then
fibaro:abort();
end
– Jalousei Schließen
if (tonumber(fibaro:getValue(lux, “value”)) > 20000 ) then
fibaro:call(8, “close”);
fibaro:call(8, “setValue2”, “20”);
fibaro:debug(“Schließe Jalousie”);
end
– Verzögerung in Sekunden nach der letzten erkannten Bewegung, bevor das Licht ausgeschaltet wird
local starttimer = 1200; – in Minuten<: xx Minuten warten bis Jalousien wieder hochfahren ohne Änderung des Timers
local timer = (starttimer);
fibaro:debug(“Starte Timer”);
repeat
fibaro:sleep(900000); – in Millisekunden: Nach 15 Min auf vorhandene Helligkeit prüfen
– Fahre Jalousie hoch, wenn Schalter manuell betätigt wird und warte 30 Minuten, um ein
– erneutes Aktivieren der Szene zu verhindern
if (tonumber(fibaro:getValue(8, “value”))) < 1 then
timer=1;
fibaro:call(8, “open”);
fibaro:sleep(1800000);
break
end
timer=timer-1;
– Timer zurücksetzen, wenn hohe Lichtstärke erkannt wird innherhalb der Verzögerungszeit
if (tonumber(fibaro:getValue(lux, “value”))) > 20000 then
timer=starttimer;
fibaro:debug(“Resete Time, Lichtstärke zu hoch, nicht öffnen”);
end
until (timer<1)
– Schalte Licht aus, wenn Timer vollständig abgelaufen ist
fibaro:call(8, “open”);
fibaro:call(8, “setValue2”, “100”);
fibaro:debug(“Timer abgelaufen/Fahre Jalousien hoch”);
fibaro:killScenes(scene);
end
--[[
%% properties
155 value
%% globals
--]]
-- VARIABLEN (Bewegungsmelder muss oben unter %% properties aufgeführt sein)
local scene = 58 -- ID dieser Szene
local lux = 155 -- ID der Helligkeit Terrasse 1
-- Lösche doppelte Szene(n)
if (fibaro:countScenes()>1) then
fibaro:abort();
end
-- Jalousei Schließen
if (tonumber(fibaro:getValue(lux, "value")) > 20000 ) then
fibaro:call(8, "close");
fibaro:call(8, "setValue2", "20");
fibaro:debug("Schließe Jalousie");
end
-- Verzögerung in Sekunden nach der letzten erkannten Bewegung, bevor das Licht ausgeschaltet wird
local starttimer = 1200; -- in Minuten<: xx Minuten warten bis Jalousien wieder hochfahren ohne Änderung des Timers
local timer = (starttimer);
fibaro:debug("Starte Timer");
repeat
fibaro:sleep(900000); -- in Millisekunden: Nach 15 Min auf vorhandene Helligkeit prüfen
-- Fahre Jalousie hoch, wenn Schalter manuell betätigt wird und warte 30 Minuten, um ein
-- erneutes Aktivieren der Szene zu verhindern
if (tonumber(fibaro:getValue(8, "value"))) < 1 then
timer=1;
fibaro:call(8, "open");
fibaro:sleep(1800000);
break
end
timer=timer-1;
-- Timer zurücksetzen, wenn hohe Lichtstärke erkannt wird innherhalb der Verzögerungszeit
if (tonumber(fibaro:getValue(lux, "value"))) > 20000 then
timer=starttimer;
fibaro:debug("Resete Time, Lichtstärke zu hoch, nicht öffnen");
end
until (timer<1)
-- Schalte Licht aus, wenn Timer vollständig abgelaufen ist
fibaro:call(8, "open");
fibaro:call(8, "setValue2", "100");
fibaro:debug("Timer abgelaufen/Fahre Jalousien hoch");
fibaro:killScenes(scene);
end
also ich hab es jetzt über einen anderen Weg noch einmal probiert da ich das mit dem Fehler/dem end nciht lösen konnte:
--[[
%% properties
155 value
%% globals
--]]
luxID = 155 -- ID der Helligkeit Terrasse 1
rollerIDs = {8, 13, 29}
luxValue = tonumber(fibaro:getValue(luxID, "value"))
laufzeit = 1200 -- Sekunden
a = 1 -- Vergleichswert
-- Lösche doppelte Szene(n)
if (fibaro:countScenes()>1) then
fibaro:abort();
end
-- Jalousie Schließen
if luxValue > 20000 then -- Lux Wert überprüfen
for i=1, #rollerIDs do
fibaro:call(rollerIDs[i],"close") -- Jalousien schließen
fibaro:debug('Jalousie mit der ID '..rollerIDs[i]..' geschlossen')
end
-- Timer starten
while a <= laufzeit do
if luxValue > 2000 then
a = 1
fibaro:debug('Weiterhin Sonnenschein setze Timer zurück')
else
a = a + 1
fibaro:debug('Timer läuft '..a..' Sekunden')
end
fibaro:debug('Timer läuft '..a..' Sekunden')
a = a + 1
fibaro:sleep(1000)
end
-- Jalousien öffnen
for i = 1, #rollerIDs do
fibaro:call(rollerIDs[i], "open")
fibaro:debug('Jalousien '..rollerIDs[i]..' geöffnet.')
end
end
Dazu aber noch einmal eine Frage: Gibt es auch eine Funktion die ich zu Anfang einbauen kann und folgendes macht:
“Starte Skript erst, wenn Helligkeit von >20000 Lux mindestens 5 Minuten besteht” .
Wenn ich da richtig denke: Dazu müsste doch ein Motionsensor im Vorfeld in 5 Minuten mehrmals die Helligkeit übermitteln und das irgendwo “zwischenspeichern”. Oder denk ich da zu kompliziert. Möchte nur verhindern, das gleich beim ersten Sonnenstrahl der für 1 Minute durchkommt die Rollos runterfahren.
du kannst dir die Funktion entsprechend anlegen. In dem kleine Lua Scripte Teil ist das beschrieben für Motion, ähnlich kannst Du das umsetzen für die LUX Werte.
Glaube aber in deinem Fall geht auch ein einfaches
if luxValue > 2000 then -- Lux Wert überprüfen
fibaro:sleep(5*60000) -- 5 Minuten "Pause"
if luxvalue > 2000 then
for i=1, #rollerIDs do
fibaro:call(rollerIDs[i],"close") -- Jalousien schließen
fibaro:debug('Jalousie mit der ID '..rollerIDs[i]..' geschlossen')
end
else
fibaro:debug('keine Aktion') -- kann natürlich sonstwas sein
end
end
Aber Vorsicht, du hast auch 2 verschiedene LuxWerte im Script. Einmal 20.000 und einmal 2.000
Hi michelec,
das mit der Verzögerung ist eine gute Idee, ist allerdings nicht ganz das was ich suche. Bei der Variante mit der “5 Minuten Pause” wird ja genau 2 x punktuell gemessen: 1 x zu Anfang und 1 x nach 5 Minuten. Wenn beide Lux-Werte genau zu diesem Zeitpunkt über 20.000 Lux sind startet das Sonnenskript. Es kann ja aber sein, das in den 5 Minuten 4 Minuten keine Werte größer 20.000 Lux anliegen und nur genau in der 5ten Minute.
Ist es auch möglich, ggf. in den 5 Minuten vor Start den Luxwert kontinuierlich (oder alle 30 Sekunden zu messen) und dann z.B. zu sagen: Wenn von Minute 1 bis Minute 5 der Luxwert im Durchschnitt über 20.000 Lux liegt dann starte den Sonnenschutz. Ansonsten soll das Skript nicht starten und wieder beim nächsten Auslöser starten.
denke schon das es möglich ist, würde das jetzt so lösen. Für jedes Messergebnis würde ich mir in einer temporären variable eine 1 vergeben wenn erfüllt und 0 wenn nicht. Sagen wir in deinem Beispiel, 5 Minuten Laufzeit alle 30 Sekunden eine Messung = 10 Messungen. Am Ende würde ich die Variablen addieren und wenn in der Summe 10 herauskommt -> Bedingung erfüllt. Keine Ahnung ob das LUA technisch jetzt sooo sauber ist. Wenn jemand eine “küzere” bzw. bessere Variante auf Lager hat kann er die gerne vorschlagen
if luxValue > 2000 then -- Lux Wert überprüfen
fibaro:sleep(30000) -- 30 Sekunden
a = 1
if luxvalue > 2000 then
fibaro:sleep(30000)
b = 1
if luxvalue > 2000 then
fibaro:sleep(30000)
c = 1
-- usw und sofort --
Total = a + b + c + --... usw --
end
end
end
end
if Total == 10 then
for i=1, #rollerIDs do
fibaro:call(rollderIDs[i],"close") -- Jalousien schließen
fibaro:debug('Jalouse mit der ID '..rollerIDs[i]..' geschlossen')
end
else
fibaro:debug('keine Aktion')
end
Müsstest Du mal testen, keine Ahnung ob es funktioniert