Sonnenschutz Beschattungssteuerung Rolladen / Jalousiesteuerung

Hallo,

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).

Hat jemand vielleicht so ein Skript im Einsatz?

Gruß

Hi,

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!

Gruß

Hi michelec,

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

hi,

das end in der letzten Zeile schließt keine funktion/bedingung. Lösche es mal und schau was im Debug erscheint.

Gruß

Hi,

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.

Gruß

Hi,

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.

Schöne Grüße

@buche11

Hi,

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 :slight_smile:

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 :slight_smile: