Rollladen-Steuerung (Sonnenaufgang/-untergang)

Hey ,

ich nochmal. Hatte das Script jetz folgendermaßen zum Laufen gebracht.

--[[
%% autostart
%% properties
%% globals
--]]
 
local sourceTrigger = fibaro:getSourceTrigger();
local version = '2.0';
 
fibaro:debug('Rollershutter-Controller started for the first time (Ver.' .. version .. ')');
 
function rollershutter()
   local version = '2.0';
    local sunriseHour = '7:00'; --fibaro:getValue(1,'sunriseHour');
   local sunsetHour = '21:00'; --fibaro:getValue(1,'sunsetHour');
    local currentDate = os.date('*t');
   local temp = tonumber(fibaro:getValue(3, 'Temperature'));
   local rollershutter_runs = tonumber(fibaro:getGlobalValue('rollershutter_runs'));
   local random = math.random(35);
   local min = math.floor((random*100)/60);
 
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) == sunriseHour)) and rollershutter_runs == 0 and tonumber(temp)>=0)
   then
       fibaro:debug('Rollershutter-Controller started (Ver.' .. version .. ')');
           fibaro:setGlobal('rollershutter_runs', '1');
       fibaro:debug('Sunrise... Opening rollershutters');
       fibaro:debug('Waiting ' .. min .. ' min');
           -- fibaro:sleep(random*100000);
                fibaro:call(64, 'open');
                fibaro:call(102, 'open');
                fibaro:call(66, 'open');
                fibaro:call(68, 'open');
                fibaro:call(188, 'open');
                fibaro:call(23, 'open');
    			fibaro:call(27, 'open');
    			fibaro:call(25, 'open');
       fibaro:debug('Rollershutters opened');
       fibaro:setGlobal('rollershutter_runs', '0');
elseif ((((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) == sunsetHour)) and rollershutter_runs == 0 and tonumber(temp)>=0)
 then
       fibaro:debug('Rollershutter-Controller started (Ver.' .. version .. ')');
           fibaro:setGlobal('rollershutter_runs', '1'); 
       fibaro:debug('Sunset... Closing rollershutters');
       fibaro:debug('Waiting ' .. min .. ' min');
           -- fibaro:sleep(random*100000);
                fibaro:call(102, 'close');
                fibaro:call(66, 'close');
                fibaro:call(188, 'close');
    			fibaro:call(23, 'close');
    			fibaro:call(27, 'close');
    			fibaro:call(25, 'close');
    while 		(tonumber(fibaro:getValue(176, 'value')) > 0) do
  				fibaro:sleep(10*1000)
  end
                fibaro:call(64, 'close');
    while 
    			(tonumber(fibaro:getValue(18, 'value')) > 0) do
 				 fibaro:sleep(10*1000)
  end
    			fibaro:call(68, 'close');
       fibaro:debug('Rollershutters closed');
       fibaro:setGlobal('rollershutter_runs', '0');
elseif ((((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) == sunriseHour)) and rollershutter_runs == 0 and tonumber(temp)<=0)
   then
       fibaro:debug('Rollershutter-Controller started (Ver.' .. version .. ')');
           fibaro:setGlobal('rollershutter_runs', '1');
       fibaro:debug('Sunrise... Temperatur < 0... Rollershutters stay closed.');
       fibaro:setGlobal('rollershutter_runs', '0');
elseif ((((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) == sunsetHour)) and rollershutter_runs == 0 and tonumber(temp)<=0)
 then
       fibaro:debug('Rollershutter-Controller started (Ver.' .. version .. ')');
           fibaro:setGlobal('rollershutter_runs', '1');
       fibaro:debug('Sunset... Temperatur < 0... Rollershutters stay opened.');
       fibaro:setGlobal('rollershutter_runs', '0');
end
   setTimeout(rollershutter, 60*1000);
end
 
if (sourceTrigger['type'] == 'autostart') then
 rollershutter();
end

Jedoch ergibt sich ein Problem bei geöffneter Tür. Ich habe 2 Kontakte jeweils vorne und hinten am haus.
Ist eine tür auf bleibt das Rollo oben allerdings auch das an der Haushinterseite welche mit dem 2.Kontakt belegt ist.
Es soll ja nur das oben bleiben bei dem auch die Tür auf ist.
Gibt es nen Tipp

Danke schonmal.

Grüße

Hi,

das funktioniert in der Form mit diesem Skript nicht. Dafür benötigst du dann eine andere Lösung.

Gruß

mmh,

das ist nicht gut… wenn ich die szene dupliziere und aufteile dann müsste es doch gehen oder. verteile dann die Rolläden auf 2 Szenen.
Oder habt ihr eine bessere Lösung.

Danke und Grüße

Du kannst dein jeweiliges Rollo in eine if-Bedingung mit dem jeweiligen Fenstersensor setzen.

Hey Hoggle,

Mache ich das in der szene oder mach ich eine neue?
Sorry aber bin wirklich nicht so firm mit Lua. Lerne jeden Tag hier über das forum aber ist nicht so einfach.
Wo setze ich die Bedingung ein?
Sag mal warum bleiben beide Rollos oben? Es ist ja nur eine Tür auf?

then
       fibaro:debug('Rollershutter-Controller started (Ver.' .. version .. ')');
           fibaro:setGlobal('rollershutter_runs', '1'); 
       fibaro:debug('Sunset... Closing rollershutters');
       fibaro:debug('Waiting ' .. min .. ' min');
           -- fibaro:sleep(random*100000);
                fibaro:call(102, 'close');
                fibaro:call(66, 'close');
                fibaro:call(188, 'close');
    			fibaro:call(23, 'close');
    			fibaro:call(27, 'close');
    			fibaro:call(25, 'close');
    while 		(tonumber(fibaro:getValue(176, 'value')) > 0) do
  				fibaro:sleep(10*1000)
  end
                fibaro:call(64, 'close');
    while 
    			(tonumber(fibaro:getValue(18, 'value')) > 0) do
 				 fibaro:sleep(10*1000)
  end

Habe den Code nicht so intensiv studiert… Sorry.
Mit dem ersten while wartet er in dieser Schleife so lange, wie dass Fenster offen ist.
Wennnes geschlossen wird, geht der Code weiter.

Wenn du statt while das if nutzt, würde bei dem ersten offenem Fenster er trotzdem zum nächsten if gehen und dort ggf das Rollo schließen.

Mit dem if wird der Code dann abgearbeitet, aber wenn das Fenster geschlossen wird, bleiben die Rollos oben, weil ja der Code durchlaufen wurde.

Ah ok Klasse.
Hab ich verstanden. Thx
Ich wurschtel mich mal da durch.

Zusatz…

jetzt weiß ich auch warum die rollershutter_runs nicht wieder auf 0 gesetzt wurde. Muss ich nochmal gucken.

Hey,

habe das Problem jetzt umgangen indem ich die Szene dupliziert habe (Küchenseite/Wohnzimmerseite).
Vorsichtshalber habe ich ne 2. Variable angelegt damit die sich nicht in die Quere kommen. Klappt super.

Nochmals danke

Hallo, ich hätte da eine Verständnisfrage zum Script von alando22. Also die ganz lange Luxusversion.
In der neuen Version 2.3 ist in Zeile 31 folgendes dazu gekommen. In 2.1 war das auskommentiert.

local maxTempStart = 7					-- Temperatur unterhalb der die Rolladen abends schließen sollen

Die Rollos gehen dann nur noch zu wenn es kälter als 7 Grad ist? Das verstehe ich doch bestimmt falsch?
Wobei der debug recht eindeutig ist.
[DEBUG] 00:26:35: Die Rolladen werden um 20:33 zuzüglich einer zufälligen Verzögerung geschlossen, sofern die Temperatur 7 °C unterschreitet.)

@Nachtmensch
Es ist so, wie du es beschreibst: Die Rolläden fahren NUR dann runter wenn die Temperatur den in der Variablen maxTempStart definierten Wert unterschreitet.

OK das verstehe ich nicht, worin besteht der Sinn dieser Temparaturabfrage?
Ich möchte ja dass die Rollos JEDEN Abend schließen und nicht nur an wenigen ausgewählten Wintertagen.

Dann trag dort 40° ein und du hast dein Ziel erreicht :wink: Vielleicht hat der Autor des Codes dafür eine Verwendung, deshalb muss es doch nicht sinnfrei sein…

Gruß

Ja so könnte ich es natürlich einfach umgehen, aber ich wollte ja verstehen wofür das gedacht ist.
Bevor ich eine evtl. wichtige Funktion rausprogrammiere :wink:

Ich wohne in einer Penthouse Wohnung, wo ich die Rolläden ausschließlich als Sonnenschutz und Kälteschutz nutze. Der Einbruchsschutz ist für mich nicht maßgeblich.
Solange die Temperaturen halbwegs moderat sind, möchte ich die Sicht nicht künstlich einschränken. Deshalb diese Temperaturschwelle.
Und wie boomx schon sagte, trag dort einfach einen hohen Wert ein und die Rolläden schließen immer. Du musst dafür nichts rausprogrammieren.

Ok, das sind dann wirklich komplett andere Anforderungen auf die ich selbst nicht gekommen wäre.
Ich wohne im ersten Stock mit bodentiefen 4fach-wärmeverglasten Fenstern an einer Hauptstrasse mit Ausblick auf eine Hauswand und Autos.
Ich benötige zu 99% nur Sichtschutz vorn und Einbruchschutz hinten.

Mit rausprogrammieren meinte ich nur das entfernen der Temperaturangaben in den debugs wie in der 2.1er Version. Hat auch geklappt.

Vielen Dank für den tollen Script, läuft super bisher :wink:

Hallo zusammen
Scheint ein ganz tolles Rolladenscript zu sein, gratuliere den Autoren und den Tipgebern zu dieser tollen Arbeit.
Wie sieht denn jetzt die Version 2.3 in der endgültigen Form aus?
Es wurden ja einige Änderungen in den vorhergehenden Posts gemacht, relativ schwierig für einen LUA-Leihen dies nachzuvollziehen.
Kann jemand die lauffähige Version 2.3 posten?
Vielen Dank und schönen Abend zusammen.

Findest du auf Seite 17 :slight_smile:

Ich habe noch eine Ergänzung aus meinen früheren grafischen Szenen in den Script übernommen.

Problem: Sollte man schon länger bei geöffneter Türe auf dem Balkon sein und den Sonnenuntergang nicht bemerken würde das Rolle sofort runter sausen wenn man die Türe von außen zuzieht. Wenn z.B. der Zigarettenrauch nicht in die Wohnung soll etc.

Lösung: Das Rollo schließt bei Sonnenuntergang trotz geöffneter Türe zur Warnung schon ein kleines Stück. Sobald die Türe geschlossen ist fährt das Rollo den Rest herunter.

Für Sonnenschutz:


fibaro:call(rs_flur, "setValue", "90"); --Rolladen schließen erst einmal nur zu 10%
 
		while
			(tonumber(fibaro:getValue(doorID1, 'value')) > 0) do	--prüft ob Tür offen, wenn ja wird Rolladen nicht geschlossen
  			fibaro:sleep(10*1000)
            debug('orangered',"Türe Flur ist geöffnet, Rollo Flur wurde nicht geschlossen");
		end
			fibaro:call(rs_flur, "setValue", sunProtectPosition1); --Rolladen schließen nun komplett
            debug('darkgreen',"Türe Flur ist geschlossen, Rollo Flur fährt in Sonnenschutzposition");
      

Für Sonnenuntergang:


fibaro:call(rs_flur, "setValue", "90"); --Rolladen schließen erst einmal nur zu 10%
 
		while
			(tonumber(fibaro:getValue(doorID1, 'value')) > 0) do	--prüft ob Fester offen, wenn ja wird Rolladen nicht geschlossen
  			fibaro:sleep(10*1000)
            debug('orangered',"Türe Flur ist geöffnet, Rollo Flur wurde nicht geschlossen");
		end
			fibaro:call(rs_flur, 'close'); --Rolladen schließen nun komplett
            debug('darkgreen',"Türe Flur ist geschlossen, Rollo Flur schließt komplett");
    

Hey,

ich nochmal.
Habe folgendes anliegen. Ich möchte das das Rollo 20 Minuten vor Sonnenuntergang schließt.
Kann ich das in meinen Code unkompliziert einbinden? Oder wenn ich das Random nutzen möchte, zwischen 15 und 30 Minuten vor Sonnenuntergang.

hier nochmal mein Code:

--[[
%% autostart
%% properties
%% globals
--]]
 
local sourceTrigger = fibaro:getSourceTrigger();
local version = '2.0';
 
fibaro:debug('Rollershutter-Controller started for the first time (Ver.' .. version .. ')');
 
function rollershutter()
   local version = '2.0';
   local sunriseHour = fibaro:getValue(1,'sunriseHour'); -- '07:00';
   local sunsetHour = fibaro:getValue(1,'sunsetHour'); -- '21:00';
   local currentDate = os.date('*t');
   local temp = tonumber(fibaro:getValue(3, 'Temperature'));
   local rollershutter_run = tonumber(fibaro:getGlobalValue('rollershutter_run'));
   local random = math.random(60,90);
   local min = math.floor((random*100)/60);
 
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) == sunriseHour)) and rollershutter_run == 0 and tonumber(temp)>=0)
   then
       fibaro:debug('Rollershutter-Controller started (Ver.' .. version .. ')');
           fibaro:setGlobal('rollershutter_run', '1');
       fibaro:debug('Sunrise... Opening rollershutters');
       fibaro:debug('Waiting ' .. min .. ' min');
          -- fibaro:sleep(random*100000);
                fibaro:call(66, 'open');
                fibaro:call(68, 'open');
                fibaro:call(23, 'open');
    			fibaro:call(25, 'open');
       fibaro:debug('Rollershutters opened');
       fibaro:setGlobal('rollershutter_run', '0');
elseif ((((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) == sunsetHour)) and rollershutter_run == 0 and tonumber(temp)>=0)
 then
       fibaro:debug('Rollershutter-Controller started (Ver.' .. version .. ')');
           fibaro:setGlobal('rollershutter_run', '1'); 
       fibaro:debug('Sunset... Closing rollershutters');
       fibaro:debug('Waiting ' .. min .. ' min');
          -- fibaro:sleep(random*100000);
                fibaro:call(66, 'close');
    			fibaro:call(23, 'close');
    			fibaro:call(25, 'close');
    while 
    			(tonumber(fibaro:getValue(18, 'value')) > 0) do
 				 fibaro:sleep(10*1000)
  end
    			fibaro:call(68, 'close');
       fibaro:debug('Rollershutters closed');
       fibaro:setGlobal('rollershutter_run', '0');
elseif ((((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) == sunriseHour)) and rollershutter_run == 0 and tonumber(temp)<=0)
   then
       fibaro:debug('Rollershutter-Controller started (Ver.' .. version .. ')');
           fibaro:setGlobal('rollershutter_run', '1');
       fibaro:debug('Sunrise... Temperatur < 0... Rollershutters stay closed.');
       fibaro:setGlobal('rollershutter_run', '0');
elseif ((((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) == sunsetHour)) and rollershutter_run == 0 and tonumber(temp)<=0)
 then
       fibaro:debug('Rollershutter-Controller started (Ver.' .. version .. ')');
           fibaro:setGlobal('rollershutter_run', '1');
       fibaro:debug('Sunset... Temperatur < 0... Rollershutters stay opened.');
       fibaro:setGlobal('rollershutter_run', '0');
end
   setTimeout(rollershutter, 60*1000);
end
 
if (sourceTrigger['type'] == 'autostart') then
 rollershutter();
end