Hallo zusammen,
ich nutze seit 2 Monaten dieses Rollladenscript. Im EG habe ich 6 Rollläden und im OG 2. Also habe ich das script 2 mal hinterlegt weil ich ja nicht gleichzeitig oben und unten sein kann und mein Hauptaugenmerk die Anwesenheitssimulation war.
Ich habe das Urscript von Daniel verwendet und es nach nach meinen Bedürfnissen angepasst. Zusätzlich habe ich es modularer aufgebaut so da man es leicht abändern oder erweitern kann.
Die Variable “rollershutter_runs” wird auch bei diesen Script benötigt. Gesteuert wird hauptsächlich über Sonnenaufgang, Sonnenuntergang, Temperatur und natürlich fast immer zufällig. Morgens und Abends werden die Rollläden in 2 Stufen geöffnet. Wehr mehr Bedingungen haben will kann dass leicht erweitern.
Man kann für morgens und abends unterschiedliche Rollläden angeben. Sind wir nicht im Urlaub wird der Rolladen an der Terrassentür nicht automatisch heruntergefahren, so das man sich nie aussperrt.
Also wer das Script nutzen will, einfach die Rolläden in den beiden Variablen ‘rollerIDsM’ und ‘rollerIDsE’ (Morning und Evening) eintragen.
Have fun.
--[[
%% autostart
%% properties
%% globals
--]]
-- file: RollladenEG.lua
-- Rollladensteuerrung
-- Copyleft 11-2016 {jeep}
-- benoetigt wird eine Variable "rollershutter_runs" mit dem Wert 0
local sourceTrigger = fibaro:getSourceTrigger();
local debug = true; -- false=keine debug ausgaben
local running = 0; --
local temperatur = tonumber(fibaro:getValue(3, "Temperature"));
local randomMinValue = -15; -- kleinster Zufallswert (kann auch negativ sein)
local randomMaxValue = 15; -- groesster Zufallswert
local offSetEvening = 10; -- positver Wert - Abends gehen die Rolllaeden spaeter zu
local offSetMorning = -20; -- negativer Wert - Morgens gehen die Rolllaeden frueher auf
local minuteslater = 40; -- Minuten um die spaeter geoeffnet oder geschlossen wird
local rollerXXp = 70; -- Rolllaeden nur xx % schließen (fuer Daemmerung oder Sommerhitze)
local rollerIDsM = {151, 217, 178, 179, 180, 182 }; -- IDs der Rolllaeden fuer morgens {n1, n2, nn}
local rollerIDsE = {151, 178, 179, 180, 182}; -- IDs der Rolllaeden fuer abends {n1, n2, nn}
local toOpenValue = 99; --
local notOpenbefore = "07:00" -- nicht vorher oeffnen
local notOpenafter = "08:10" -- nicht nachher oeffnen
local notClosebefore = "16:30" -- nicht vorher schliessen
local notCloseafter = "21:30" -- nicht nachher schliessen
local rollerStat = nil -- gemeldeter Oeffnungswert
local checkTime = "21:55" -- Uhrzeit zur Feststellug des Sonnenauf- und untergangs fuer den aktuellen Tag
local checkSUN = false -- Wurde checkTime aufgerufen?
-- Wert 99=ganz offen, 0=ganz zu
if (fibaro:countScenes()>1) then
fibaro:debug('Nicht noch einmal!');
fibaro:abort();
end
--
function calcTime( timeString, random )
-- Zeit nach Minuten umwandeln + Zufallszeit addieren
local HtimeString = string.sub(timeString,1,2)
local MtimeString = string.sub(timeString,4,5)
local timeStringMIN = tonumber(HtimeString * 60) + tonumber(MtimeString);
local timeStringMIN = timeStringMIN + random --Zufall
local laterCloseMIN = timeStringMIN + (minuteslater + random)
-- Neue SunRise Zeit wieder nach String hh:mm umwandeln
local timeStringHnew = math.floor(timeStringMIN / 60)
local timeStringMnew = timeStringMIN - (timeStringHnew * 60)
local laterCloseH = math.floor(laterCloseMIN /60)
local latercloseM = laterCloseMIN - (laterCloseH *60)
local newtimeString = string.format("%02d", timeStringHnew) .. ":" .. string.format("%02d", timeStringMnew)
local laterClose = string.format("%02d", laterCloseH) .. ":" .. string.format("%02d", latercloseM)
return newtimeString, laterClose ;
end
function randomValue(randomMinValue, randomMaxValue)
local random = math.floor(math.random(randomMinValue, randomMaxValue));
local minutes = math.floor((random*60)/60);
--local plusORminus = math.random(0, 1)
return minutes;
end
function earlymorning()
fibaro:setGlobal("rollershutter_runs", "1");
running = 1;
fibaro:debug('Kurz vor Sonnenaufgang. Oeffne Rollladen 70%' .. os.date("%c"));
toOpenValue = 70 -- wir oeffnen die Rolllaeden nicht ganz
fibaro:call(213, "turnOn"); -- wir schalten ein Licht vorher ein
if (rollerIDsM[1] ~= nil) then
for r=1, #rollerIDsM do
if rollerIDsM[r] ~= nil then
fibaro:call(rollerIDsM[r],'setValue', toOpenValue )
rollerStat=fibaro:getValue(rollerIDsM[r], 'value')
print(rollerStat)
end
-- Einige Sek. zwischen den Oeffnungen warten
-- um manuelles oeffnen zu simulieren
fibaro:sleep(math.random(4000,10000)) ; --4 bis 10 Sek. warten
end
end
fibaro:debug('Rollladen 70% geoeffnet' .. os.date("%c"));
fibaro:setGlobal("rollershutter_runs", "0");
running = 0;
end -- function earlymorning
function goodmorningSun()
fibaro:setGlobal("rollershutter_runs", "1");
running = 1;
fibaro:debug('Sonnenaufgang. Oeffne Rollladen' .. os.date("%c"));
fibaro:call(213, "turnOff"); -- wir schalten das Licht wieder aus
if (temperatur > 18) then -- es ist sommerlich warm
toOpenValue = 50 -- wir oeffnen die Rolllaeden nicht ganz
else
toOpenValue = 99
end
if (rollerIDsM[1] ~= nil) then
fibaro:debug('Rolllaeden werden geoeffnet.')
for r=1, #rollerIDsM do
if rollerIDsM[r] ~= nil then
fibaro:call(rollerIDsM[r],'setValue', toOpenValue )
rollerStat=fibaro:getValue(rollerIDsM[r], 'value')
print(rollerStat)
end
-- Einige Sek. zwischen den Oeffnungen warten
-- um manuelles oeffnen zu simulieren
fibaro:sleep(math.random(4000,9000)) ;
end
end
fibaro:debug('Rollladen geoeffnet');
fibaro:setGlobal("rollershutter_runs", "0");
running = 0;
end -- function goodmorningSun
function highNoon()
fibaro:setGlobal("rollershutter_runs", "1");
fibaro:debug('Mittagshitze. Oeffne/schliesse Rollladen minimal' .. os.date("%c"));
-- es ist moerderisch heiss, wir
-- lassen nur einen kleinen Spalt offen
toOpenValue = 15
if (rollerIDsM[1] ~= nil) then
fibaro:debug('Rolllaeden nur einen Spalt oeffnen.')
for r=1, #rollerIDsM do
if rollerIDsM[r] ~= nil then
fibaro:call(rollerIDsM[r],'setValue', toOpenValue )
rollerStat=fibaro:getValue(rollerIDsM[r], 'value')
print(rollerStat)
end
-- Einige Sek. zwischen den Oeffnungen warten
-- um manuelles oeffnen zu simulieren
fibaro:sleep(math.random(4000,9000)) ;
end
end
fibaro:debug('Rollladen minimal geoeffnet');
fibaro:setGlobal("rollershutter_runs", "0");
end
function goodEvening()
fibaro:setGlobal("rollershutter_runs", "1");
running = 1;
fibaro:debug('Sonnenuntergang... Schließe Rollladen');
if (rollerIDsE[1] ~= nil) then
fibaro:debug('Rolllaeden werden halb geschlossen.' .. os.date("%c"))
for r=1, #rollerIDsE do
if rollerIDsE[r] ~= nil then
fibaro:call(rollerIDsE[r],'setValue', rollerXXp )
end
-- Einige Sek. zwischen den Oeffnungen warten
-- um manuelles oeffnen zu simulieren
fibaro:sleep(math.random(5000,12000)) ;
end
end --
fibaro:debug('Rollladen halb geschlossen');
fibaro:setGlobal("rollershutter_runs", "0");
running = 0 ;
end --end function goodEvening
function goodNight()
fibaro:setGlobal("rollershutter_runs", "1");
running = 1
fibaro:debug('Es ist ganz dunkel... Schließe Rollladen');
if (rollerIDsE[1] ~= nil) then
fibaro:debug('Rolllaeden werden geschlossen.' .. os.date("%c"))
for r=1, #rollerIDsE do
if rollerIDsE[r] ~= nil then
fibaro:call(rollerIDsE[r],'setValue', '0' )
end
-- Einige Sek. zwischen den Oeffnungen warten
-- um manuelles oeffnen zu simulieren
fibaro:sleep(math.random(5000,15000)) ;
local rollerstat = 1
end
end
fibaro:debug('Rollladen geschlossen');
fibaro:setGlobal("rollershutter_runs", "0");
running = 0
checkSUN = false -- damit um checkTime wieder der naechste Sonnenaufgang errechnet wird
end -- function goodnight
-- ###################################################
-- Initialize
-- ###################################################
math.randomseed( os.time() )
local sunriseHour = fibaro:getValue(1,"sunriseHour");
local sunsetHour = fibaro:getValue(1,"sunsetHour");
local rminutes = randomValue(randomMinValue, randomMaxValue)
local newsunriseHour, laterOpen = calcTime(sunriseHour, tonumber(rminutes) + offSetMorning )
local newsunsetHour, laterClose = calcTime(sunsetHour, tonumber(rminutes) + offSetEvening)
--
local runEarly = false -- Variablen damit die Schleife nur einmal
local runMorning = false -- durchlaufen wird, wenn man Zeitvergleiche
local runEvening = false -- mit '>=' und '<=' in den Bedingungen hat.
local runNight = false
function rollershutter() -- Hauptprogramm
local sunriseHour = fibaro:getValue(1,"sunriseHour");
local sunsetHour = fibaro:getValue(1,"sunsetHour");
local currentDate = os.date("*t");
local actionTime = (string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min));
local currenttime = (string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min));
local rminutes = randomValue(randomMinValue, randomMaxValue)
local rollershutter_runs = tonumber(fibaro:getGlobalValue("rollershutter_runs"));
if (rollershutter_runs ~= 0 ) then
fibaro:debug("Die Variable 'rollershutters_runs' hat fuer den Start einen falschen Wert, bitte korrigieren");
end
fibaro:debug('rMin: ' .. rminutes)
if ( currenttime == checkTime and checkSUN == false) then
newsunriseHour, laterOpen = calcTime(sunriseHour, tonumber(rminutes) + offSetMorning )
newsunsetHour, laterClose = calcTime(sunsetHour, tonumber(rminutes) + offSetEvening )
checkSUN = true
runEarly = false
runMorning = false
runEvening = false
runNight = false
end
-- Fuer Simulation die 2 folgenden Variablen mit zeitnaher Uhrzeit fuettern
-- local newsunriseHour = "09:48"
-- local newsunsetHour = "22:24"
if (debug) then
--fibaro:debug('Running: ' .. running);
fibaro:debug('New SunRise: ' .. newsunriseHour);
fibaro:debug('Later Open:' .. laterOpen );
fibaro:debug('New SunSet: ' .. newsunsetHour);
fibaro:debug('Later Close:' .. laterClose );
end
if ((actionTime >= newsunriseHour) and actionTime >= notOpenbefore and
actionTime <= notOpenafter and runEarly == false and running == 0 )
then
earlymorning()
runEarly = true
elseif ((actionTime == laterOpen) and running == 0 )
then
goodmorningSun()
elseif ((actionTime == "12:00") and rollershutter_runs == 0 and temperatur >= 25)
then
highNoon()
elseif ((actionTime == newsunsetHour) and rollershutter_runs == 0 )
then
goodEvening()
elseif (currenttime == laterClose and running == 0 )
then
goodNight()
end
setTimeout(rollershutter, 60*1000);
end -- function rollershutter
if (sourceTrigger["type"] == "autostart") then
rollershutter();
end