Rollladen-Steuerung (Sonnenaufgang/-untergang)

Hi,

dann würde ich den betreffenden Rollladen an die letzte Stelle des Skriptes setzen und davor dann

while door > 0 do
fibaro:sleep(10*1000)
end

Dann pausiert es solange die Tür zu ist. Sobald diese dann geschlossen wird, schließt auch der letzte Rollladen.

Gruß

Hi zurück :smiley:

Meinst Du so:

–[[
%% 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’);
local sunsetHour = 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(random100000);
fibaro:call(569, ‘open’);
fibaro:call(571, ‘open’);
fibaro:call(579, ‘open’);
fibaro:call(573, ‘open’);
fibaro:call(575, ‘open’);
fibaro:call(581, ‘open’);
fibaro:call(590, ‘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(590, ‘close’);
fibaro:call(571, ‘close’);
fibaro:call(579, ‘close’);
fibaro:call(573, ‘close’);
fibaro:call(575, ‘close’);
fibaro:call(581, ‘close’);
fibaro:call(569, ‘close’);while door > 0 do fibaro:sleep(101000)
end
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

Oh man…! Posten kann ich also auch nicht… :frowning:

Ja,

da gehört es grundsätzlich hin, aber der Code war nur beispielhaft :wink:

while (fibaro:getValue(doorID, 'value') > 0) do
fibaro:sleep(10*1000)
end

doorID bitte anpassen.

Hi,

das
fibaro:call(569, ‘close’)
musss aber hinter dem Dreizeiler kommen, oder?

Also:

.....
fibaro:call(581, ‘close’);
  while (fibaro:getValue(doorID, 'value') > 0) do
  fibaro:sleep(10*1000)
  end
fibaro:call(569, ‘close’);

VG Hoggle

Hi, klar. Hatte ich nicht gesehen, danke.

Die Logik hätte auch eine andere sein können…

Moin Hoggle!

Also so ungefähr?:

 fibaro:sleep(random*100000);
                fibaro:call(590, 'close');
                fibaro:call(571, 'close');
                fibaro:call(579, 'close');
    while 		(fibaro:getValue(doorID, 'value') > 0) do
  				fibaro:sleep(10*1000)
  end
                fibaro:call(573, 'close');
                fibaro:call(575, 'close');
                fibaro:call(581, 'close');
    while 
    			(fibaro:getValue(doorID, 'value') > 0) do
 				 fibaro:sleep(10*1000)
  end
    			fibaro:call(569, 'close');
       fibaro:debug('Rollershutters closed');

Ich habe die Zeilen ein wenig eingerückt… Jetzt noch die Fensterkontakt-IDs eintragen und dann ist es fertig, richtig?

Viele Grüße

Christian

Ja, beachte dabei bitte, dass die Rollläden, welche nach der while-Schleife geschlossen werden sollen, im Falle einer offenen Tür auch oben bleiben.

Hi Daniel!

Ja, das ist ok. Es wäre sonst blöd, wenn Du im Sommer draußen bist und von Deinem eigenen Haus ausgesperrt wirst. :slight_smile:

Allerdings sind die beiden Rolläden, zu denen ich die Schleife hinzugefügt habe, jetzt gar nicht heruntergefahren. Zum Testen, habe ich einen Kontakt geschlossen und einen offen gelassen um die Szene zu testen.

Hier mal die Szene und Debug:

--[[
%% 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');
   local sunsetHour = 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(569, 'open');
                fibaro:call(571, 'open');
                fibaro:call(579, 'open');
                fibaro:call(573, 'open');
                fibaro:call(575, 'open');
                fibaro:call(581, 'open');
    			fibaro:call(590, '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(590, 'close');
                fibaro:call(571, 'close');
                fibaro:call(579, 'close');
    while 		(fibaro:getValue(675, 'value') > 0) do
  				fibaro:sleep(10*1000)
  end
                fibaro:call(573, 'close');
                fibaro:call(575, 'close');
                fibaro:call(581, 'close');
    while 
    			(fibaro:getValue(672, 'value') > 0) do
 				 fibaro:sleep(10*1000)
  end
    			fibaro:call(569, '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

[DEBUG] 14:49:00: Rollershutter-Controller started for the first time (Ver.2.0)
[DEBUG] 15:57:01: Rollershutter-Controller started (Ver.2.0)
[DEBUG] 15:57:01: Sunset… Closing rollershutters
[DEBUG] 15:57:01: Waiting 31 min
[ERROR] 16:28:41: LUA error: /opt/fibaro/scenes/517.lua:48: attempt to compare number with string

Habe ich wieder irgendwo ein Komma vergessen?

Viele Grüße

Christian

Sorry, mein Fehler. Jetzt richtig!

--[[
%% 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');
   local sunsetHour = 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(569, 'open');
                fibaro:call(571, 'open');
                fibaro:call(579, 'open');
                fibaro:call(573, 'open');
                fibaro:call(575, 'open');
                fibaro:call(581, 'open');
    			fibaro:call(590, '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(590, 'close');
                fibaro:call(571, 'close');
                fibaro:call(579, 'close');
    while 		(tonumber(fibaro:getValue(675, 'value')) > 0) do
  				fibaro:sleep(10*1000)
  end
                fibaro:call(573, 'close');
                fibaro:call(575, 'close');
                fibaro:call(581, 'close');
    while 
    			(tonumber(fibaro:getValue(672, 'value')) > 0) do
 				 fibaro:sleep(10*1000)
  end
    			fibaro:call(569, '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

Gar kein Problem! :smiley:

Ich teste das morgens mal…

Ich wünsche Euch ein schönes Wochenende…

Vielen Dank.

Viele Grüße

Christian

Darf ich es noch etwas verkomplizieren?

Was ich gern noch hätte (wünsch mir was zu Weihnachten)

  1. Das Script soll zuerst prüfen ob jemand zu Hause ist. Dazu soll ein IPhone angepingt werden.
  2. Wenn jemand zu Hause ist - dann Abends die Rollläden nur zu 50% runter (setValue) - den Rest manuell. Wenn das Handy zu Hause ist morgens die Rollläden NICHT hoch
  3. Wenn keiner zu Hause ist (Handy ist nicht im Haus), dann Abends die Rollläden ganz runter (Close) und morgens automatisch alle auf

Das hätte einen erheblichen WAF Faktor!!! Weil die “W” sich nicht gerne reinreden läßt wann die Dinger morgens hochgehen, wenn die Familie aber weg ist hätte man es doch gerne.

Machbar?

LG

kandetvara

Hi,

schau mal z.B. hier:
Fibaro Anwesenheit per iPhone, Smartphone oder TV prüfen

Wenn Du die Variable hast, lässt Sich das hier oder übe eine 2. Szene integrieren.

VG Hoggle

danke für den hinweis - habe ich gelesen und verstanden. das wird dann nichts mit dem iPhone - das ist zu viel Workaround. ich muß mir was zu hause suchen, was die Anwesenheit anders feststellt - ich muß noch denken…

Du kannst ggf. mit Bewegungsmeldern arbeiten…

HI Hoggle - ja aber irgendwie such ich noch nach was komplexerem :wink: Also ich könnte den Bewegungsmelder nehmen und dem dann sagen - “wenn für so und soviel Stunden keine Bewegung, dann nicht zu Hause” Das löst aber mein Problem nicht, oder ich denke zu kurz. z.B fahre ich NAchmittags mit der Familie weg - dann möchte ich, dass die Variable auf “nicht zu Huse” schaltet und die Szene mmornens und abends die Dinger runterfährt. Aber wie weiss der Bewegungsmelder, ob ich nur einen Mittagsschlaf auf der Couch mache oder wirklich weg bin ? Das geht nicht. Netatmo Geräuschpegelmesser - gleiche Thematik, es sei denn ich schnarche :wink:
Ich such noch nach dem Device, welches 100% zeigt, dass ich da oder weg bin. Ich befürchte es wird ein physischer Schalter mit nem Dimmer dahinter sein muß, welcher eine Variable triggert bzw. Szene.
Ich denke gerade noch an die Dreambox - die läuft aufgrund der Kinder jeden Abend, wenn wir zu Hause sind. Aber klar wie ich damit umgehen will weiss ich auch nicht. Oder die Fritzbox - kann man bei der Fritzbox einen Binärausgang oder ein Signal aussteuern welches dann über z.B. einen verkabelten Fibaro Binärsensor ansteuert. Vielleicht sogar auf der Fritzbox “anrufen” und dadurch einen Ausgang der Fritzbox steuern? Du siehst ich denke…vielleicht auch zu kurz…
kandetvara

Nein, Du denkst nicht zu kurz.
Genau das sind die Probleme!
Richtig “intelligent” ist schwer zu automatisieren.

Bevor Du nen Taster nimmst (erkläre das mal den Kids… 2x Drücken für xy, Lange Drücken für xxxx oä), kannst Du über RFID nachdenken:
http://siio.de/sicherheitalarm/alarm-schalten-mit-zipato-rfid-tagreader-im-fibaro-hc2-update-2/

Was aber richtig toll wäre, wäre eine Pushnachricht das der betreffende Rolladen, der aufgrund einer offenen Tür nicht runtergefahren ist, eben nicht runter gefahren ist! :smiley:

Hallo Daniel!

Kannst Du mir bitte hier nochmals helfen? Wenn ich die Verzögerung durch den Zufallsgenerator raus haben möchte, was genau muß ich löschen?

Viele Grüße

Christian