Und noch ein Rollladen Script

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


Cool, danke für deine Mühen und fürs Teilen :slight_smile:

Rolladensteuerung etwas anders!

Hallo zusammen,
da ich sehe dass doch einige Benutzer Probleme mit dem hier im Forum vorhandenen Rollladenscript haben, will ich mal meine Version vorstellen.
Vor 1 1/2 Jahren habe ich auch mit dem Initialscript von boomx angefangen, habe aber kurze Zeit später meine eigene Version hochgeladen.
Was ist an dieser neuen Version anders oder besser? Nun zuerst habe ich versucht das Script so modular wie möglich aufzubauen. Dadurch
ist es leichter wartbar und überschaubarer so das auch LUA-Neulinge viel leichter Anpassungen vornehmen können.
Wie schon in meinem vorherigen Beitrag angedeutet, war ein wichtiger Punkt die Anwesenheitssimulation, da wir öfter mal verreisen und
dass soll ja nicht sofort ersichtlich sein. Deshalb gehen die Rollläden in 2 Stufen hoch oder runter. Das ist aber nur eine Option die
jeder so handhaben kann wie er will. Bedingungen können beliebig hinzugefügt oder abgeändert werden. Zu jeder Bedingung gibt es die
zugehörige Funktion die je nach Bedarf auch leicht abgeändert werden kann.
Der Sonnenauf- und untergang ist ein wichtiger Teil der Steuerung. Da sich aber der Sonnenauf/Untergang im Laufe eines Jahres (zwischen
Dezember und Juni)um bis zu fast 4 Std. verschiebt und von der geographischen Lage abhängt, habe ich die Möglichkeit geschaffen zu jedem
Monat, morgens und abends Korrekturwerte anzugeben, wie hier im Beispiel:

local function offSetM() -- offset Morning
  local month = tonumber(os.date('%m'))
   local tabm = { [1] = "5", [2] = "10", [3] ="15", [4] = "25", [5] = "40", [6] = "45",
         [7] = "45", [8] = "30", [9] = "20", [10] = "15", [11] = "10", [12] = 5 }
   return tonumber(tabm[month])
end

Natürlich kann man die Rollläden zu festen Zeiten hoch oder runter fahren.
Eine Besonderheit ist der Sonnenschutz. An ganz heißen Sommertagen Überhitzen sich die Räume mit der zur Sonnenseite zugewandten Fenster
doch sehr stark, so das man damit dagegen steuern kann und die Rollläden bis auf ein minumum schließen kann. Zur Steuerung wird die
Helligkeit und/oder die Außentemperatur verwendet.
Wichtiger ist natürlich die Temperatur da es auch im Winter Lichtverhältnisse bis zu einigen Zigtausend Lux gibt.
Was ist aber an diesem Sonnenschutz so besonders? Nun er merkt sich die Position der Rollläden und stellt den vorherigen Zustand wieder her.
Beispiel: Sie verlassen morgens das Haus und haben Ihre Rollläden so zwischen 40% und 60% gestellt so dass die Blumen noch genügend Licht haben.
Zwischen 11:00 und 15:00 wird es aber sehr heiß und der Sonnenschutz wird die Rollläden bis auf die z.B. eingestellten 85% schließen. Ist
die Temperatur wieder normal, wird der für jeden einzelnen Rollladen ermittelte vorherige Wert wiederhergestellt.

Im großen ganzen beschränkt sich die Konfiguration im ermitteln der IDs der vorhandnen Sensoren und Rollläden und eintragen derselben in die
zugehörigen Variablen.
Ist das Feiertage Script hier aus dem Forum installiert, kann es ohne Änderungen mit benutzt werden.

Die IDs der Rolläden werden in 3 verschiedenen Arrays eingetragen:
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}
Wer keinen Türsensor benutzen will, trägt für Abends keine ID der Terrassen- oder Balkontür Rollladen ein, so dass man sich nie aussperrt.

local rollerIDsS = {151, 217, 178, 179 } – IDs der Rolllaeden fuer den Sonnenschutz auf der Suedseite.

Die Variablen Namen sind zwar sprechend aber ich werde demnächst noch das Readme PDF fertigstellen wo alles nochmal erklärt wird. Bei
Problemen helfe ich Euch gerne.

--[[
%% autostart
%% properties
%% globals
--]]

-- Shutter_control.lua 
-- Section		: EG
-- Release date : 11.06.18
-- Version      : 1.1.7
-- Copyleft     : 12-2016 - 2018 {jeep}
-- benötigt wird eine Variable "rollershutter_runs" mit dem Wert 0

if (fibaro:countScenes()>1) then
   fibaro:debug('Doppelte Szene - wird abgebrochen.')
   fibaro:abort(); 
end

local function Debug( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
end

math.randomseed( os.time() ) 
local sourceTrigger  = fibaro:getSourceTrigger();
local luxSensorID    = nil -- ID of brigthness sensor 
local TempSensorID   = 427 -- ID of temperature sensor (ZWeather)
local doorSensorID   = nil -- ID of a door sensor
local lamp1ID        = 166 -- lamp ID(s) for presence simulation 

local randomMinValue = 7   -- kleinster Zufallswert
local randomMaxValue = 22  -- größter Zufallswert
local minuteslater   = 10  -- Initialisierung Variable fuer spaeteres Oeffnen oder Schliessen

local notbeforeM     = '08:30' -- nicht vorher Morgens 
local notafterM      = '08:10' -- nicht nach 08:10 Abends 
local notbeforeE     = '16:30' -- 
local notafterE      = '21:00' --

local rollerIDsM     = {150,164} -- IDs der Rolllaeden für morgens {n1, n2, nn}
local rollerIDsE     = {150}     -- IDs der Rolllaeden für abends {n1, n2, nn}
local rollerIDsS     = {418} -- IDs der Rolllaeden für Sonnenschutz Suedseite 
local toOpenValue    = 99  -- Initialwert fuer ganz offen  

local posQuarter  = 25  -- viertel offen 
local posHalf     = 50  -- halb offen
local pos3Quarter = 70  -- 3/4 offen
local posOpen     = 99  -- ganz offen
local posClose    = 0   -- zu --
local rollerStat     = nil -- gemeldeter Öffnungswert

local SUN_Protect   = true -- Soll der Sonnenschutz aktiviert werden (Sommerbetrieb = true)
local sunProLuxOn   = 45000 -- ab diesem Wert aktivieren
local sunProLuxOff  = 15000 -- ab diesem Wert deaktivieren
local sunProTempOn  = 26  -- Temperatur ab der der Sonnenschutz aktiviert wird
local sunProTempOff = 22  -- Temperatur ab der der Sonnenschutz deaktiviert wird
local sunProPos     = 80  -- Rollläden nicht ganz schließen, Schlitze verhindern 
                          -- Hitzestau und Schäden an den Lamellen.
local sunProtectActiv     -- = false                       

local checkTime   = "03:15" -- Uhrzeit zur Feststellug des Sonnenauf- und untergangs für den nächsten Tag
local checkSUN    = false   -- Die Variable stellt sich um checktime auf true

if luxSensorID ~= nil then
   brightness = fibaro:getValue(luxSensorID, 'value'); --Wert des Luxsensors
elseif (fibaro:getGlobal('brightness') ~= nil) then 
   brightness = tonumber(fibaro:getGlobalValue("brightness")); -- LuxWert aus globaler Variable
end
temperatur     = tonumber(string.format("%.2f",fibaro:getValue(TempSensorID, "value")));
--print(brightness)

local debug          = true   -- keine debug ausgaben
local debugonce      = true -- | false
local version        = "1.1.7"

-- Morning - negativer Wert - Morgens gehen die Rollläden früher auf
-- Evening - positver Wert - Abends gehen die Rollläden  später zu
local function offSetM() -- offset morning
  local month = tonumber(os.date('%m'))
   local tabm = { [1] = "5", [2] = "10", [3] ="15", [4] = "25", [5] = "40", [6] = "45",
         [7] = "45", [8] = "25", [9] ="20", [10] = "15", [11] = "10", [12] = 5 }
   return tonumber(tabm[month])
end  

local function offSetE() -- offset evening
  local month = tonumber(os.date('%m'))
   local tabm = { [1] = "5", [2] = "10", [3] ="15", [4] = "-5", [5] = "5", [6] = "10",
         [7] = "10", [8] = "15", [9] ="20", [10] = "10", [11] = "5", [12] = "-5" }
   return tonumber(tabm[month])
end

local function randomValue(randomMinValue, randomMaxValue)
   local random  = math.floor(math.random(randomMinValue, randomMaxValue));
   local minutes = math.floor((random*60)/60);
   return minutes;
end

local function calcTime( timeString, random )
  local std, min = timeString:match("([^,]+):([^,]+)")
  local newtimeString = os.date("%H:%M", -3600 + std*60*60 +  (min*60 + random*60  ));
  local laterClose    = os.date("%H:%M", -3600 + std*60*60 +  (min*60 + minuteslater*60 + random*60)  );
  
  return newtimeString, laterClose ;
end 

local function addrandom(str, random)
  local std, min = str:match("([^,]+):([^,]+)")
  local newtimeString = os.date("%H:%M", -3600 + std*60*60 +  (min*60 + random*60  ));
  return newtimeString
end  
-- ===================================================
-- Funktionen fuer den Sonnenschutz ein und auschalten
-- ===================================================
local function sunProtect(action)
   if action == "ON" then
     if sunProtectActiv == true then
        Debug('yellow','Sonnenschutz wird aktiviert')
        tdev = {} 
        if (rollerIDsS[1] ~= nil) then
           -- Speichere Position der Rolllaeden
           for r=1, #rollerIDsS do
              if rollerIDsS[r] ~= nil then
                 rollerStat = fibaro:getValue(rollerIDsS[r], 'value')
                 table.insert(tdev, {rollerIDsS[r],  rollerStat} )
                 print( tdev[r][1] ..' '.. tdev[r][2] )
               --  fibaro:call(rollerIDsS[r], 'setValue', sunProPos) 
              end
           end --for
        end    
     end
  else -- Sonnenschutz wird zurückgenommen, alter ZUstand wird wieder hergestellt
     Debug('orange','Sonnenschutz wird deaktiviert')
     if tdev ~= nil then 
         for r=1, #rollerIDsS do
            print( tdev[r][1] ..' '.. tdev[r][2] )
          --  fibaro:call(tdev[r][1],'setValue', tdev[r][2] )
         end
     end
  end  
end  

local function check4sunProtect()
  --print('Bri: '.. brightness)
  --print('Temp:'.. temperatur)
  if (temperatur >= sunProTempOn and brightness >= sunProLuxOn ) and sunProtectActiv ~= true then
     --spGMT = fibaro:getGlobalModificationTime('SunProtectOn')
     --print(spGMT)
     --print((os.time()- spGMT) / 60)
     sunProtectActiv = true
     sunProtect("ON")  
  elseif (temperatur <= sunProTempOff and brightness <= sunProLuxOff ) and sunProtectActiv == true then
    print('Sonnenschutz aus.')
    sunProtectActiv = false
    sunProtect("OFF") 
    
  end    
end
--
-- ========================================
-- Funktionen zum oeffnen und schliessen --
-- ========================================
--
local function earlymorning() -- 1.te Szene des Tages
   fibaro:setGlobal("rollershutter_runs", "1");
   fibaro:call(lamp1ID, "turnOn"); 
   if (rollerIDsM[1] ~= nil) then
      for r=1, #rollerIDsM do
         if rollerIDsM[r] ~= nil then
            fibaro:call(rollerIDsM[r],'setValue', posQuarter )
          end
         fibaro:sleep(math.random(4000,10000)) ; --4 bis 10 Sek. warten 
      end
   end  
   Debug('yellow','Rolllaeden ' ..posQuarter..'% geoeffnet - ' .. os.date("%c"));
   fibaro:setGlobal("rollershutter_runs", "0");  
end  -- function earlymorning

local function goodmorningSun()
   fibaro:setGlobal("rollershutter_runs", "1");
   fibaro:call(lamp1ID, "turnOff"); -- Lampe wieder ausschalten 
   Debug('yellow','Sonnenaufgang. Öffne Rollladen' .. os.date("%c")); 
   Debug('yellow','Temperatur: ' .. temperatur .. '° um ' .. os.date('%H:%M'));
       if (temperatur > 20) then   -- es ist sommerlich warm
          posOpen = 60     -- wir öffnen die Rolläden nicht ganz 
          Debug('yellow','Rolllaeden werden nur '..posOpen..'% geöffnet.')
       end
       if (rollerIDsM[1] ~= nil) then
          for r=1, #rollerIDsM do
             if rollerIDsM[r] ~= nil then
                fibaro:call(rollerIDsM[r],'setValue', posOpen )
                rollerStat=fibaro:getValue(rollerIDsM[r], 'value')
             end
             fibaro:sleep(math.random(3000,7000)); -- 3 bis 7 Sek. warten
          end
       end  
       Debug('yellow','Rolllaeden '..posOpen.. '% geöffnet' );
       posopen = 99;
       fibaro:setGlobal("rollershutter_runs", "0");  
end -- function goodmorningSun  

local function highNoon()
   --Ersatzfunction falls man die Sonnenschutzfunktion nicht nutzt.   
   fibaro:setGlobal("rollershutter_runs", "1");
   Debug('yellow','Mittagshitze. Öffne Rollladen minimal' .. os.date("%c")); 
    -- es ist moerderisch heiss, wir
    -- lassen nur einen kleinen Spalt offen
    local posOpen = 15
    if (rollerIDsM[1] ~= nil) then
       fibaro:debug('Rollläden nur einen Spalt öffnen.')
       for r=1, #rollerIDsM do
          if rollerIDsM[r] ~= nil then
             fibaro:call(rollerIDsM[r],'setValue', posOpen)
          end
          fibaro:sleep(math.random(4000,9000)); -- 4 bis 9 Sek. warten 
       end
    end  
    Debug('darkorange','Rollladen minimal geöffnet');
    fibaro:setGlobal("rollershutter_runs", "0");  
end  -- function highnoon

local function goodEvening() --Abenddaemmerung
       fibaro:setGlobal("rollershutter_runs", "1"); 
       fibaro:call(lamp1ID, "turnOn"); -- Licht an?
       if (rollerIDsE[1] ~= nil) then
          Debug('darkorange','Rollläden werden 3/4 geschlossen.' .. os.date("%c"))
          for r=1, #rollerIDsE do
             if rollerIDsE[r] ~= nil then
                fibaro:call(rollerIDsE[r],'setValue', pos3Quarter )
             end
             fibaro:sleep(math.random(5000,9000)) ;
          end 
       end  --
       Debug('darkorange','Rolllaeden '..pos3Quarter..'% geschlossen');
       fibaro:setGlobal("rollershutter_runs", "0"); 
   
end --end function goodEvening

local function goodNight()
fibaro:setGlobal("rollershutter_runs", "1"); 
       Debug('green','Es ist ganz dunkel... schließe Rollladen');
       if (rollerIDsE[1] ~= nil) then
          Debug('Rolllaeden werden geschlossen.' .. os.date("%c"))
          for r=1, #rollerIDsE do
             if rollerIDsE[r] ~= nil then
                fibaro:call(rollerIDsE[r],'setValue', posClose )
             end
             fibaro:sleep(math.random(5000,10000)) ;
             --local rollerstat = 1
          end
       end  
       Debug('blue','Rolllaeden '..posClose..'% geschlossen');
       fibaro:setGlobal("rollershutter_runs", "0"); 
end -- function goodnight

--######################################################
--                Initialize 
--######################################################
local sunriseHour = fibaro:getValue(1,"sunriseHour");
local sunsetHour  = fibaro:getValue(1,"sunsetHour");
local randminutes = randomValue(randomMinValue, randomMaxValue)
local newsunriseHour, laterOpen = calcTime(sunriseHour, tonumber(randminutes) + offSetM() )
local newsunsetHour, laterClose = calcTime(sunsetHour, tonumber(randminutes) + offSetE() )
-- 
local runEarly   = false -- Variablen für Funktionen  die nur einmal 
local runMorning = false -- ausgefuehrt werden sollen, wenn man Zeitvergleiche 
local runEvening = false -- mit '>=' und '<=' in den Bedingungen hat. 
local runNight   = false

function rollershutter()  -- Hauptprogramm
   math.randomseed( os.time() ) 
   temperatur = tonumber(string.format("%.2f",fibaro:getValue(TempSensorID, "value")));
   brightness = tonumber(fibaro:getGlobalValue("brightness"));
   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 randminutes = randomValue(randomMinValue, randomMaxValue)
   local minuteslater = randomValue(5,15)  -- Spaeteres Oeffnen oder Schliessen
   local holiday      = tonumber(fibaro:getGlobalValue("Feiertag_heute"));
   if (holiday == nil) then holiday = 0 end
        
   local rollershutter_runs = tonumber(fibaro:getGlobalValue("rollershutter_runs"));
   if (rollershutter_runs ~= 0 )  then  
      Debug('red',"Die Variable 'rollershutters_runs' hat für den Start einen falschen Wert, bitte korrigieren");   
   end
  
   if ( checkSUN == false) then
      newsunriseHour, laterOpen = calcTime(sunriseHour, tonumber(randminutes) + offSetM() ) 
      newsunsetHour, laterClose = calcTime(sunsetHour, tonumber(randminutes) + offSetE() )  
      randomMorning  = addrandom(notbeforeM,randomValue(4, 9))
      temperatur = tonumber(string.format("%.2f",fibaro:getValue(TempSensorID, "value")));
      checkSUN   = true
      runEarly, runMorning, runEvening,runNight = false,false,false,false
      Debug('lightblue','-- Zeiten für '.. (os.date("%d.%b %Y, "))..'Version: '..version..  ' --')
      Debug('orange','RealSunrise: ' .. sunriseHour);
      Debug('orange','New SunRise: ' .. newsunriseHour)
      Debug('yellow','Later Open: ' .. laterOpen)
      print('--')
      Debug('darkorange','RealSunset: ' .. sunsetHour);        
      Debug('darkorange','New SunSet: ' .. newsunsetHour)
      Debug('brown','LaterClose ' .. laterClose)
      Debug('skyblue','Temperatur: ' .. temperatur .. '° um ' .. os.date('%H:%M'));
      print('---------------------------------')
   end   
   
   -- Fuer Simulation die 2 folgenden Variablen mit zeitnaher Uhrzeit fuettern
   -- local newsunriseHour = "09:48"
   -- local newsunsetHour  = "22:24"
---------------------------------------------------------------
--- Ab hier koennen die verschiedenen Bedingungen zum Oeffnen 
--- und Schliessen  hinterlegt werden  
---------------------------------------------------------------  
  if ((actionTime == newsunriseHour and holiday == 0 
     and rollershutter_runs == 0) and runEarly == false  ) 
     then --Morgenröte
     earlymorning() --früh morgens 
     runEarly = true
    
  elseif ((actionTime >= notbeforeM and holiday == 1 
     and rollershutter_runs == 0) and runEarly == false )  
     then --Morgenröte 
     earlymorning() -- es ist Feiertag, deshalb um notbeforM oeffnen  
     runEarly = true
    
  elseif ((actionTime == laterOpen) and holiday == 0 and rollershutter_runs == 0  ) 
  --elseif ((actionTime >= newsunriseHour) and (actionTime >= notbeforeM or actionTime >= notafterM) and rollershutter_runs == 0  ) 
     then --Morgenröte
     goodmorningSun()  
     runMorning = true
    
  elseif ((actionTime == "12:00") and rollershutter_runs == 0 
     and temperatur >= 25)  
     then -- zusätzlicher Check um die Mittgaszeit falls man 
          -- keinen Sonnenschutz verwendet
         highNoon() 
  
  elseif ((actionTime == sunsetHour) and rollershutter_runs == 0 )    
     then --Abenddämmeung
     goodEvening()
     runEvening = true  

  elseif (actionTime == laterClose and rollershutter_runs == 0 )
     then -- Es wird/ist dunkel.
     goodNight()
     runNight = true
    
  elseif (actionTime == checkTime) then
     checkSUN = false 

-----------------------------  
-- Weitere Beispiele
-----------------------------
--  elseif (actionTime == randomMorning) --Oeffnen zu fester Uhrzeit + zufall 
--     then 
--     goodmorningSun()
 
--  elseif (actionTime == notafterE) -- Schliessen zu fester Uhrzeit    
--     then
--     goodNight()
--    
    
  end -- Ende der elseif Bedingungen
  
 
  if ((actionTime > newsunriseHour and actionTime < "20:00") -- Zeit in der auf Sonnenschutzbedingung gepüft wird
     and SUN_Protect == true) then
     check4sunProtect()  -- Pruefen ob der Sonnenschutz aktiviert werden soll
  end
    
    
  setTimeout(rollershutter, 60*1000);  
end -- function rollershutter

if (sourceTrigger["type"] == "autostart") then
	rollershutter();
end

Hi Jeep,

sehr cool, Danke. Wie Du evtl. gesehen hast habe ich mit dem anderen Rolladenskript auch ein paar Problemchen. Meist läuft es sehr gut, aber leider nicht immer :-).
Also werde ich am Wochenede mal Deine Szene einbauen.

Vielen Dank fürs Teilen
Alex

1 „Gefällt mir“

Leider hat die vorige Version noch ein wenig debugging Code enthalten und der Sonnenschutz war deaktiviert.
Darum bitte nur diese Version (1.1.8) benutzen. Danke!

--[[
%% autostart
%% properties
%% globals
--]]

-- Shutter_control.lua 
-- Section		: EG
-- Release date : 11.06.18
-- Version      : 1.1.8
-- Copyleft     : 12-2016 - 2018 {jeep}
-- benötigt wird eine Variable "rollershutter_runs" mit dem Wert 0

if (fibaro:countScenes()>1) then
   fibaro:debug('Doppelte Szene - wird abgebrochen.')
   fibaro:abort(); 
end

local function Debug( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
end

math.randomseed( os.time() ) 
local sourceTrigger  = fibaro:getSourceTrigger();
local luxSensorID    = nil -- ID of brigthness sensor 
local TempSensorID   = 427 -- ID of temperature sensor (ZWeather)
local doorSensorID   = nil -- ID of a door sensor
local lamp1ID        = 166 -- lamp ID(s) for presence simulation 

local randomMinValue = 7   -- kleinster Zufallswert
local randomMaxValue = 22  -- größter Zufallswert
local minuteslater   = 10  -- Initialisierung Variable fuer spaeteres Oeffnen oder Schliessen

local notbeforeM     = '07:30' -- nicht vorher Morgens 
local notafterM      = '08:10' -- nicht nach 08:10 Abends 
local notbeforeE     = '16:30' -- 
local notafterE      = '21:00' --

local rollerIDsM     = {150,164} -- IDs der Rolllaeden für morgens {n1, n2, nn}
local rollerIDsE     = {150}     -- IDs der Rolllaeden für abends {n1, n2, nn}
local rollerIDsS     = {418} -- IDs der Rolllaeden für Sonnenschutz Suedseite 
local toOpenValue    = 99  -- Initialwert fuer ganz offen  

local posQuarter  = 25  -- viertel offen 
local posHalf     = 50  -- halb offen
local pos3Quarter = 70  -- 3/4 offen
local posOpen     = 99  -- ganz offen
local posClose    = 0   -- zu --
local rollerStat  = nil -- gemeldeter Öffnungswert

local SUN_Protect   = true -- Soll der Sonnenschutz aktiviert werden (Sommerbetrieb = true)
local sunProLuxOn   = 45000 -- ab diesem Wert aktivieren
local sunProLuxOff  = 15000 -- ab diesem Wert deaktivieren
local sunProTempOn  = 26  -- Temperatur ab der der Sonnenschutz aktiviert wird
local sunProTempOff = 22  -- Temperatur ab der der Sonnenschutz deaktiviert wird
local sunProPos     = 80  -- Rollläden nicht ganz schließen, Schlitze verhindern 
                          -- Hitzestau und Schäden an den Lamellen.
local sunProtectActiv     -- = false                       

local checkTime  = "03:15" -- Uhrzeit zur Feststellug des Sonnenauf- und untergangs für den nächsten Tag
local checkSUN   = false   -- Die Variable stellt sich um checktime auf true

if luxSensorID ~= nil then
   brightness = fibaro:getValue(luxSensorID, 'value'); --Wert des Luxsensors
elseif (fibaro:getGlobal('brightness') ~= nil) then 
   brightness = tonumber(fibaro:getGlobalValue("brightness")); -- LuxWert aus globaler Variable
end
temperatur     = tonumber(string.format("%.2f",fibaro:getValue(TempSensorID, "value")));

local debug          = true   -- keine debug ausgaben
local debugonce      = true -- | false
local version        = "1.1.8"

-- Morning - negativer Wert - Morgens gehen die Rollläden früher auf
-- Evening - positver Wert - Abends gehen die Rollläden  später zu
local function offSetM() -- offset morning
  local month = tonumber(os.date('%m'))
   local tabm = { [1] = "5", [2] = "10", [3] ="15", [4] = "25", [5] = "40", [6] = "45",
         [7] = "45", [8] = "25", [9] ="20", [10] = "15", [11] = "10", [12] = 5 }
   return tonumber(tabm[month])
end  

local function offSetE() -- offset evening
  local month = tonumber(os.date('%m'))
   local tabm = { [1] = "5", [2] = "10", [3] ="15", [4] = "-5", [5] = "5", [6] = "10",
         [7] = "10", [8] = "15", [9] ="20", [10] = "10", [11] = "5", [12] = "-5" }
   return tonumber(tabm[month])
end

local function randomValue(randomMinValue, randomMaxValue)
   local random  = math.floor(math.random(randomMinValue, randomMaxValue));
   local minutes = math.floor((random*60)/60);
   return minutes;
end

local function calcTime( timeString, random )

  local std, min = timeString:match("([^,]+):([^,]+)")
  local newtimeString = os.date("%H:%M", -3600 + std*60*60 +  (min*60 + random*60  ));
  local laterClose    = os.date("%H:%M", -3600 + std*60*60 +  (min*60 + minuteslater*60 + random*60)  );
  
  return newtimeString, laterClose ;
end 

local function addrandom(str, random)
  local std, min = str:match("([^,]+):([^,]+)")
  local newtimeString = os.date("%H:%M", -3600 + std*60*60 +  (min*60 + random*60  ));
  return newtimeString
end  
-- ===================================================
-- Funktionen fuer den Sonnenschutz ein und auschalten
-- ===================================================
local function sunProtect(action)
   if action == "ON" then
     if sunProtectActiv == true then
        Debug('yellow','Sonnenschutz wird aktiviert')
        tdev = {} 
        if (rollerIDsS[1] ~= nil) then
           -- Speichere Position der Rolllaeden
           for r=1, #rollerIDsS do
              if rollerIDsS[r] ~= nil then
                 rollerStat = fibaro:getValue(rollerIDsS[r], 'value')
                 table.insert(tdev, {rollerIDsS[r],  rollerStat} )
                 fibaro:call(rollerIDsS[r], 'setValue', sunProPos) 
              end
           end --for
        end    
     end
  else -- Sonnenschutz wird zurückgenommen, alter Zustand wird wieder hergestellt
     Debug('orange','Sonnenschutz wird deaktiviert')
     if tdev ~= nil then 
         for r=1, #rollerIDsS do
             fibaro:call(tdev[r][1],'setValue', tdev[r][2] )
         end
     end
  end  
end  

local function check4sunProtect()
  if (temperatur >= sunProTempOn and brightness >= sunProLuxOn ) and sunProtectActiv ~= true then
     sunProtectActiv = true
     sunProtect("ON")  
  elseif (temperatur <= sunProTempOff and brightness <= sunProLuxOff ) and sunProtectActiv == true then
    print('Sonnenschutz aus.')
    sunProtectActiv = false
    sunProtect("OFF") 
  
  end    
end
--
-- ========================================
-- Funktionen zum oeffnen und schliessen --
-- ========================================
--
local function earlymorning() -- 1.te Szene des Tages
   fibaro:setGlobal("rollershutter_runs", "1");
   fibaro:call(lamp1ID, "turnOn"); 
   if (rollerIDsM[1] ~= nil) then
      for r=1, #rollerIDsM do
         if rollerIDsM[r] ~= nil then
            fibaro:call(rollerIDsM[r],'setValue', posQuarter )
          end
         fibaro:sleep(math.random(4000,10000)) ; --4 bis 10 Sek. warten 
      end
   end  
   Debug('yellow','Rolllaeden ' ..posQuarter..'% geoeffnet - ' .. os.date("%c"));
   fibaro:setGlobal("rollershutter_runs", "0");  
end  -- function earlymorning

local function goodmorningSun()
   fibaro:setGlobal("rollershutter_runs", "1");
   fibaro:call(lamp1ID, "turnOff"); -- Lampe wieder ausschalten 
   Debug('yellow','Sonnenaufgang. Öffne Rollladen' .. os.date("%c")); 
   Debug('yellow','Temperatur: ' .. temperatur .. '° um ' .. os.date('%H:%M'));
       if (temperatur > 20) then   -- es ist sommerlich warm
          posOpen = 60     -- wir öffnen die Rolläden nicht ganz 
          Debug('yellow','Rolllaeden werden nur '..posOpen..'% geöffnet.')
       end
       if (rollerIDsM[1] ~= nil) then
          for r=1, #rollerIDsM do
             if rollerIDsM[r] ~= nil then
                fibaro:call(rollerIDsM[r],'setValue', posOpen )
                rollerStat=fibaro:getValue(rollerIDsM[r], 'value')
             end
             fibaro:sleep(math.random(3000,7000)); -- 3 bis 7 Sek. warten
          end
       end  
       Debug('yellow','Rolllaeden '..posOpen.. '% geöffnet' );
       posopen = 99;
       fibaro:setGlobal("rollershutter_runs", "0");  
end -- function goodmorningSun  

local function highNoon()
   --Ersatzfunction falls man die Sonnenschutzfunktion nicht nutzt.   
   fibaro:setGlobal("rollershutter_runs", "1");
   Debug('yellow','Mittagshitze. Öffne Rollladen minimal' .. os.date("%c")); 
    -- es ist moerderisch heiss, wir
    -- lassen nur einen kleinen Spalt offen
    local posOpen = 15
    if (rollerIDsM[1] ~= nil) then
       fibaro:debug('Rollläden nur einen Spalt öffnen.')
       for r=1, #rollerIDsM do
          if rollerIDsM[r] ~= nil then
             fibaro:call(rollerIDsM[r],'setValue', posOpen)
          end
          fibaro:sleep(math.random(4000,9000)); -- 4 bis 9 Sek. warten 
       end
    end  
    Debug('darkorange','Rollladen minimal geöffnet');
    fibaro:setGlobal("rollershutter_runs", "0");  
end  -- function highnoon

local function goodEvening() --Abenddaemmerung
       fibaro:setGlobal("rollershutter_runs", "1"); 
       fibaro:call(lamp1ID, "turnOn"); -- Licht an?
       if (rollerIDsE[1] ~= nil) then
          Debug('darkorange','Rollläden werden 3/4 geschlossen.' .. os.date("%c"))
          for r=1, #rollerIDsE do
             if rollerIDsE[r] ~= nil then
                fibaro:call(rollerIDsE[r],'setValue', pos3Quarter )
             end
             fibaro:sleep(math.random(5000,9000)) ;
          end 
       end  --
       Debug('darkorange','Rolllaeden '..pos3Quarter..'% geschlossen');
       fibaro:setGlobal("rollershutter_runs", "0"); 
   
end --end function goodEvening

local function goodNight()
fibaro:setGlobal("rollershutter_runs", "1"); 
       Debug('green','Es ist ganz dunkel... schließe Rollladen');
       if (rollerIDsE[1] ~= nil) then
          Debug('Rolllaeden werden geschlossen.' .. os.date("%c"))
          for r=1, #rollerIDsE do
             if rollerIDsE[r] ~= nil then
                fibaro:call(rollerIDsE[r],'setValue', posClose )
             end
             fibaro:sleep(math.random(5000,10000)) ;
             --local rollerstat = 1
          end
       end  
       Debug('blue','Rolllaeden '..posClose..'% geschlossen');
       fibaro:setGlobal("rollershutter_runs", "0"); 
end -- function goodnight

--######################################################
--                Initialize 
--######################################################
local sunriseHour = fibaro:getValue(1,"sunriseHour");
local sunsetHour  = fibaro:getValue(1,"sunsetHour");
local randminutes = randomValue(randomMinValue, randomMaxValue)
local newsunriseHour, laterOpen = calcTime(sunriseHour, tonumber(randminutes) + offSetM() )
local newsunsetHour, laterClose = calcTime(sunsetHour, tonumber(randminutes) + offSetE() )
-- 
local runEarly   = false -- Variablen für Funktionen  die nur einmal 
local runMorning = false -- ausgefuehrt werden sollen, wenn man Zeitvergleiche 
local runEvening = false -- mit '>=' und '<=' in den Bedingungen hat. 
local runNight   = false

function rollershutter()  -- Hauptprogramm
   math.randomseed( os.time() ) 
   temperatur = tonumber(string.format("%.2f",fibaro:getValue(TempSensorID, "value")));
   brightness = tonumber(fibaro:getGlobalValue("brightness"));
   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 randminutes = randomValue(randomMinValue, randomMaxValue)
   local minuteslater = randomValue(5,15)  -- Spaeteres Oeffnen oder Schliessen
   local holiday      = tonumber(fibaro:getGlobalValue("Feiertag_heute"));
   if (holiday == nil) then holiday = 0 end
        
   local rollershutter_runs = tonumber(fibaro:getGlobalValue("rollershutter_runs"));
   if (rollershutter_runs ~= 0 )  then  
      Debug('red',"Die Variable 'rollershutters_runs' hat für den Start einen falschen Wert, bitte korrigieren");   
   end
  
   if ( checkSUN == false) then
      newsunriseHour, laterOpen = calcTime(sunriseHour, tonumber(randminutes) + offSetM() ) 
      newsunsetHour, laterClose = calcTime(sunsetHour, tonumber(randminutes) + offSetE() )  
      randomMorning  = addrandom(notbeforeM,randomValue(4, 9))
      temperatur = tonumber(string.format("%.2f",fibaro:getValue(TempSensorID, "value")));
      checkSUN   = true
      runEarly, runMorning, runEvening,runNight = false,false,false,false
      Debug('lightblue','-- Zeiten für '.. (os.date("%d.%b %Y, "))..'Version: '..version..  ' --')
      Debug('orange','RealSunrise: ' .. sunriseHour);
      Debug('orange','New SunRise: ' .. newsunriseHour)
      Debug('yellow','Later Open: ' .. laterOpen)
      print('--')
      Debug('darkorange','RealSunset: ' .. sunsetHour);        
      Debug('darkorange','New SunSet: ' .. newsunsetHour)
      Debug('brown','LaterClose ' .. laterClose)
      Debug('skyblue','Temperatur: ' .. temperatur .. '° um ' .. os.date('%H:%M'));
      print('---------------------------------')
   end   
   
   -- Fuer Simulation die 2 folgenden Variablen mit zeitnaher Uhrzeit fuettern
   -- local newsunriseHour = "09:48"
   -- local newsunsetHour  = "22:24"
---------------------------------------------------------------
--- Ab hier koennen die verschiedenen Bedingungen zum Oeffnen 
--- und Schliessen  hinterlegt werden  
---------------------------------------------------------------  
  if ((actionTime == newsunriseHour and holiday == 0 
     and rollershutter_runs == 0) and runEarly == false  ) 
     then --Morgenroete
     earlymorning() --früh morgens 
     runEarly = true
    
  elseif ((actionTime >= notbeforeM and holiday == 1 
     and rollershutter_runs == 0) and runEarly == false )  
     then --Morgenroete 
     earlymorning() -- es ist Feiertag, deshalb um notbeforM oeffnen  
     runEarly = true
    
  elseif ((actionTime == laterOpen) and holiday == 0 and rollershutter_runs == 0  ) 
  --elseif ((actionTime >= newsunriseHour) and (actionTime >= notbeforeM or actionTime >= notafterM) and rollershutter_runs == 0  ) 
     then --Sonne ist schon da
     goodmorningSun()  
     runMorning = true
    
  elseif ((actionTime == "12:00") and rollershutter_runs == 0 
     and temperatur >= 25)  
     then -- zusätzlicher Check um die Mittgaszeit falls man 
          -- keinen Sonnenschutz verwendet
         highNoon() 
  
  elseif ((actionTime == sunsetHour) and rollershutter_runs == 0 )    
     then --Abenddämmeung
     goodEvening()
     runEvening = true  

  elseif (actionTime == laterClose and rollershutter_runs == 0 )
     then -- Es wird/ist dunkel.
     goodNight()
     runNight = true
    
  elseif (actionTime == checkTime) then
     checkSUN = false 

-----------------------------  
-- Weitere Beispiele
-----------------------------
--  elseif (actionTime == randomMorning) --Oeffnen zu fester Uhrzeit + zufall 
--     then 
--     goodmorningSun()
 
--  elseif (actionTime == notafterE) -- Schliessen zu fester Uhrzeit    
--     then
--     goodNight()
--    
    
  end -- Ende der elseif Bedingungen
  
 
  if ((actionTime > newsunriseHour and actionTime < "20:00") -- Zeit in der auf Sonnenschutzbedingung gepüft wird
     and SUN_Protect == true) then
     check4sunProtect()  -- Pruefen ob der Sonnenschutz aktiviert werden soll
  end
    
    
  setTimeout(rollershutter, 60*1000);  
end -- function rollershutter

if (sourceTrigger["type"] == "autostart") then
	rollershutter();
end

2 „Gefällt mir“

Hi Jeep,

hatte gestern noch die Szene eingebaut und bekomme leider eine für mich nict nachvollziehbare Fehlermeldung. Habe eigentlich nicht geändert außer den Sensor-/Geräte-Variablen und die habe ich jetzt schon x-mal überprüft.
Wäre prima wenn Du Dir mal den code und die Fehlermeldung ansehen könntest.

Ach ja, in der Version unten hatte ich zusätzlich die simulationszeiten in Zeile 299-300 aktiviert. Das macht aber keine Unterschied, weil das Script dort nie ankommt.

Gruß
Alex

[DEBUG] 12:54:23: – Zeiten für 30.Jun 2018, Version: 1.1.8 –
[DEBUG] 12:54:23: RealSunrise: 04:52
[DEBUG] 12:54:23: New SunRise: 05:59
[DEBUG] 12:54:23: Later Open: 06:09
[DEBUG] 12:54:23: –
[DEBUG] 12:54:23: RealSunset: 21:52
[DEBUG] 12:54:23: New SunSet: 22:24
[DEBUG] 12:54:23: LaterClose 22:34
[DEBUG] 12:54:23: Temperatur: 26° um 12:54
[DEBUG] 12:54:23: ---------------------------------
[DEBUG] 12:54:23: [1;31m2018-06-30 12:54:23.132173 [ fatal] Unknown exception: /opt/fibaro/FibaroSceneAPI.lua:334: attempt to concatenate local ‘deviceID’ (a nil value)
Copy sceneClick the button below to copy this scene. Created copy will be opened to be modified.Copy

--[[
%% autostart
%% properties
%% globals
--]]

-- Shutter_control.lua 
-- Section		: EG
-- Release date : 11.06.18
-- Version      : 1.1.8
-- Copyleft     : 12-2016 - 2018 {jeep}
-- benötigt wird eine Variable "rollershutter_runs" mit dem Wert 0

if (fibaro:countScenes()>1) then
   fibaro:debug('Doppelte Szene - wird abgebrochen.')
   fibaro:abort(); 
end

local function Debug( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
end

math.randomseed( os.time() ) 
local sourceTrigger  = fibaro:getSourceTrigger();
local luxSensorID    = 221 -- ID of brigthness sensor 
local TempSensorID   = 151 -- ID of temperature sensor (ZWeather)
local doorSensorID   = nil -- ID of a door sensor
local lamp1ID        = nil -- lamp ID(s) for presence simulation 

local randomMinValue = 7   -- kleinster Zufallswert
local randomMaxValue = 22  -- größter Zufallswert
local minuteslater   = 10  -- Initialisierung Variable fuer spaeteres Oeffnen oder Schliessen

local notbeforeM     = '07:30' -- nicht vorher Morgens 
local notafterM      = '08:40' -- nicht nach 08:10 Abends 
local notbeforeE     = '18:30' -- 
local notafterE      = '23:00' --

local rollerIDsM     = {118} -- IDs der Rolllaeden für morgens {n1, n2, nn}
local rollerIDsE     = {118} -- IDs der Rolllaeden für abends {n1, n2, nn}
local rollerIDsS     = {118} -- IDs der Rolllaeden für Sonnenschutz Suedseite 
local toOpenValue    = 100  -- Initialwert fuer ganz offen  

local posQuarter  = 30  -- viertel offen 
local posHalf     = 70  -- halb offen
local pos3Quarter = 85  -- 3/4 offen
local posOpen     = 99  -- ganz offen
local posClose    = 0   -- zu --
local rollerStat  = nil -- gemeldeter Öffnungswert

local SUN_Protect   = true -- Soll der Sonnenschutz aktiviert werden (Sommerbetrieb = true)
local sunProLuxOn   = 18000 -- ab diesem Wert aktivieren
local sunProLuxOff  = 4000 -- ab diesem Wert deaktivieren
local sunProTempOn  = 25  -- Temperatur ab der der Sonnenschutz aktiviert wird
local sunProTempOff = 21  -- Temperatur ab der der Sonnenschutz deaktiviert wird
local sunProPos     = 67  -- Rollläden nicht ganz schließen, Schlitze verhindern 
                          -- Hitzestau und Schäden an den Lamellen.
local sunProtectActiv     -- = false                       

local checkTime  = "03:15" -- Uhrzeit zur Feststellug des Sonnenauf- und untergangs für den nächsten Tag
local checkSUN   = false   -- Die Variable stellt sich um checktime auf true

if luxSensorID ~= nil then
   brightness = fibaro:getValue(luxSensorID, 'value'); --Wert des Luxsensors
elseif (fibaro:getGlobal('brightness') ~= nil) then 
   brightness = tonumber(fibaro:getGlobalValue("brightness")); -- LuxWert aus globaler Variable
end
temperatur     = tonumber(string.format("%.2f",fibaro:getValue(TempSensorID, "value")));

local debug          = true   -- keine debug ausgaben
local debugonce      = true -- | false
local version        = "1.1.8"

-- Morning - negativer Wert - Morgens gehen die Rollläden früher auf
-- Evening - positver Wert - Abends gehen die Rollläden  später zu
local function offSetM() -- offset morning
  local month = tonumber(os.date('%m'))
   local tabm = { [1] = "5", [2] = "10", [3] ="15", [4] = "25", [5] = "40", [6] = "45",
         [7] = "45", [8] = "25", [9] ="20", [10] = "15", [11] = "10", [12] = 5 }
   return tonumber(tabm[month])
end  

local function offSetE() -- offset evening
  local month = tonumber(os.date('%m'))
   local tabm = { [1] = "5", [2] = "10", [3] ="15", [4] = "-5", [5] = "5", [6] = "10",
         [7] = "10", [8] = "15", [9] ="20", [10] = "10", [11] = "5", [12] = "-5" }
   return tonumber(tabm[month])
end

local function randomValue(randomMinValue, randomMaxValue)
   local random  = math.floor(math.random(randomMinValue, randomMaxValue));
   local minutes = math.floor((random*60)/60);
   return minutes;
end

local function calcTime( timeString, random )

  local std, min = timeString:match("([^,]+):([^,]+)")
  local newtimeString = os.date("%H:%M", -3600 + std*60*60 +  (min*60 + random*60  ));
  local laterClose    = os.date("%H:%M", -3600 + std*60*60 +  (min*60 + minuteslater*60 + random*60)  );
  
  return newtimeString, laterClose ;
end 

local function addrandom(str, random)
  local std, min = str:match("([^,]+):([^,]+)")
  local newtimeString = os.date("%H:%M", -3600 + std*60*60 +  (min*60 + random*60  ));
  return newtimeString
end  
-- ===================================================
-- Funktionen fuer den Sonnenschutz ein und auschalten
-- ===================================================
local function sunProtect(action)
   if action == "ON" then
     if sunProtectActiv == true then
        Debug('yellow','Sonnenschutz wird aktiviert')
        tdev = {} 
        if (rollerIDsS[1] ~= nil) then
           -- Speichere Position der Rolllaeden
           for r=1, #rollerIDsS do
              if rollerIDsS[r] ~= nil then
                 rollerStat = fibaro:getValue(rollerIDsS[r], 'value')
                 table.insert(tdev, {rollerIDsS[r],  rollerStat} )
                 fibaro:call(rollerIDsS[r], 'setValue', sunProPos) 
              end
           end --for
        end    
     end
  else -- Sonnenschutz wird zurückgenommen, alter Zustand wird wieder hergestellt
     Debug('orange','Sonnenschutz wird deaktiviert')
     if tdev ~= nil then 
         for r=1, #rollerIDsS do
             fibaro:call(tdev[r][1],'setValue', tdev[r][2] )
         end
     end
  end  
end  

local function check4sunProtect()
  if (temperatur >= sunProTempOn and brightness >= sunProLuxOn ) and sunProtectActiv ~= true then
     sunProtectActiv = true
     sunProtect("ON")  
  elseif (temperatur <= sunProTempOff and brightness <= sunProLuxOff ) and sunProtectActiv == true then
    print('Sonnenschutz aus.')
    sunProtectActiv = false
    sunProtect("OFF") 
  
  end    
end
--
-- ========================================
-- Funktionen zum oeffnen und schliessen --
-- ========================================
--
local function earlymorning() -- 1.te Szene des Tages
   fibaro:setGlobal("rollershutter_runs", "1");
   fibaro:call(lamp1ID, "turnOn"); 
   if (rollerIDsM[1] ~= nil) then
      for r=1, #rollerIDsM do
         if rollerIDsM[r] ~= nil then
            fibaro:call(rollerIDsM[r],'setValue', posQuarter )
          end
         fibaro:sleep(math.random(4000,10000)) ; --4 bis 10 Sek. warten 
      end
   end  
   Debug('yellow','Rolllaeden ' ..posQuarter..'% geoeffnet - ' .. os.date("%c"));
   fibaro:setGlobal("rollershutter_runs", "0");  
end  -- function earlymorning

local function goodmorningSun()
   fibaro:setGlobal("rollershutter_runs", "1");
   fibaro:call(lamp1ID, "turnOff"); -- Lampe wieder ausschalten 
   Debug('yellow','Sonnenaufgang. Öffne Rollladen' .. os.date("%c")); 
   Debug('yellow','Temperatur: ' .. temperatur .. '° um ' .. os.date('%H:%M'));
       if (temperatur > 20) then   -- es ist sommerlich warm
          posOpen = 60     -- wir öffnen die Rolläden nicht ganz 
          Debug('yellow','Rolllaeden werden nur '..posOpen..'% geöffnet.')
       end
       if (rollerIDsM[1] ~= nil) then
          for r=1, #rollerIDsM do
             if rollerIDsM[r] ~= nil then
                fibaro:call(rollerIDsM[r],'setValue', posOpen )
                rollerStat=fibaro:getValue(rollerIDsM[r], 'value')
             end
             fibaro:sleep(math.random(3000,7000)); -- 3 bis 7 Sek. warten
          end
       end  
       Debug('yellow','Rolllaeden '..posOpen.. '% geöffnet' );
       posopen = 99;
       fibaro:setGlobal("rollershutter_runs", "0");  
end -- function goodmorningSun  

local function highNoon()
   --Ersatzfunction falls man die Sonnenschutzfunktion nicht nutzt.   
   fibaro:setGlobal("rollershutter_runs", "1");
   Debug('yellow','Mittagshitze. Öffne Rollladen minimal' .. os.date("%c")); 
    -- es ist moerderisch heiss, wir
    -- lassen nur einen kleinen Spalt offen
    local posOpen = 15
    if (rollerIDsM[1] ~= nil) then
       fibaro:debug('Rollläden nur einen Spalt öffnen.')
       for r=1, #rollerIDsM do
          if rollerIDsM[r] ~= nil then
             fibaro:call(rollerIDsM[r],'setValue', posOpen)
          end
          fibaro:sleep(math.random(4000,9000)); -- 4 bis 9 Sek. warten 
       end
    end  
    Debug('darkorange','Rollladen minimal geöffnet');
    fibaro:setGlobal("rollershutter_runs", "0");  
end  -- function highnoon

local function goodEvening() --Abenddaemmerung
       fibaro:setGlobal("rollershutter_runs", "1"); 
       fibaro:call(lamp1ID, "turnOn"); -- Licht an?
       if (rollerIDsE[1] ~= nil) then
          Debug('darkorange','Rollläden werden 3/4 geschlossen.' .. os.date("%c"))
          for r=1, #rollerIDsE do
             if rollerIDsE[r] ~= nil then
                fibaro:call(rollerIDsE[r],'setValue', pos3Quarter )
             end
             fibaro:sleep(math.random(5000,9000)) ;
          end 
       end  --
       Debug('darkorange','Rolllaeden '..pos3Quarter..'% geschlossen');
       fibaro:setGlobal("rollershutter_runs", "0"); 
   
end --end function goodEvening

local function goodNight()
fibaro:setGlobal("rollershutter_runs", "1"); 
       Debug('green','Es ist ganz dunkel... schließe Rollladen');
       if (rollerIDsE[1] ~= nil) then
          Debug('Rolllaeden werden geschlossen.' .. os.date("%c"))
          for r=1, #rollerIDsE do
             if rollerIDsE[r] ~= nil then
                fibaro:call(rollerIDsE[r],'setValue', posClose )
             end
             fibaro:sleep(math.random(5000,10000)) ;
             --local rollerstat = 1
          end
       end  
       Debug('blue','Rolllaeden '..posClose..'% geschlossen');
       fibaro:setGlobal("rollershutter_runs", "0"); 
end -- function goodnight

--######################################################
--                Initialize 
--######################################################
local sunriseHour = fibaro:getValue(1,"sunriseHour");
local sunsetHour  = fibaro:getValue(1,"sunsetHour");
local randminutes = randomValue(randomMinValue, randomMaxValue)
local newsunriseHour, laterOpen = calcTime(sunriseHour, tonumber(randminutes) + offSetM() )
local newsunsetHour, laterClose = calcTime(sunsetHour, tonumber(randminutes) + offSetE() )
-- 
local runEarly   = false -- Variablen für Funktionen  die nur einmal 
local runMorning = false -- ausgefuehrt werden sollen, wenn man Zeitvergleiche 
local runEvening = false -- mit '>=' und '<=' in den Bedingungen hat. 
local runNight   = false

function rollershutter()  -- Hauptprogramm
   math.randomseed( os.time() ) 
   temperatur = tonumber(string.format("%.2f",fibaro:getValue(TempSensorID, "value")));
   brightness = tonumber(fibaro:getGlobalValue("brightness"));
   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 randminutes = randomValue(randomMinValue, randomMaxValue)
   local minuteslater = randomValue(5,15)  -- Spaeteres Oeffnen oder Schliessen
   local holiday      = tonumber(fibaro:getGlobalValue("Feiertag_heute"));
   if (holiday == nil) then holiday = 0 end
        
   local rollershutter_runs = tonumber(fibaro:getGlobalValue("rollershutter_runs"));
   if (rollershutter_runs ~= 0 )  then  
      Debug('red',"Die Variable 'rollershutters_runs' hat für den Start einen falschen Wert, bitte korrigieren");   
   end
  
   if ( checkSUN == false) then
      newsunriseHour, laterOpen = calcTime(sunriseHour, tonumber(randminutes) + offSetM() ) 
      newsunsetHour, laterClose = calcTime(sunsetHour, tonumber(randminutes) + offSetE() )  
      randomMorning  = addrandom(notbeforeM,randomValue(4, 9))
      temperatur = tonumber(string.format("%.2f",fibaro:getValue(TempSensorID, "value")));
      checkSUN   = true
      runEarly, runMorning, runEvening,runNight = false,false,false,false
      Debug('lightblue','-- Zeiten für '.. (os.date("%d.%b %Y, "))..'Version: '..version..  ' --')
      Debug('orange','RealSunrise: ' .. sunriseHour);
      Debug('orange','New SunRise: ' .. newsunriseHour)
      Debug('yellow','Later Open: ' .. laterOpen)
      print('--')
      Debug('darkorange','RealSunset: ' .. sunsetHour);        
      Debug('darkorange','New SunSet: ' .. newsunsetHour)
      Debug('brown','LaterClose ' .. laterClose)
      Debug('skyblue','Temperatur: ' .. temperatur .. '° um ' .. os.date('%H:%M'));
      print('---------------------------------')
   end   
   
   -- Fuer Simulation die 2 folgenden Variablen mit zeitnaher Uhrzeit fuettern
   local newsunriseHour = "12:35"
   local newsunsetHour  = "13:21"
---------------------------------------------------------------
--- Ab hier koennen die verschiedenen Bedingungen zum Oeffnen 
--- und Schliessen  hinterlegt werden  
---------------------------------------------------------------  
  if ((actionTime == newsunriseHour and holiday == 0 
     and rollershutter_runs == 0) and runEarly == false  ) 
     then --Morgenroete
     earlymorning() --früh morgens 
     runEarly = true
    
  elseif ((actionTime >= notbeforeM and holiday == 1 
     and rollershutter_runs == 0) and runEarly == false )  
     then --Morgenroete 
     earlymorning() -- es ist Feiertag, deshalb um notbeforM oeffnen  
     runEarly = true
    
  elseif ((actionTime == laterOpen) and holiday == 0 and rollershutter_runs == 0  ) 
  --elseif ((actionTime >= newsunriseHour) and (actionTime >= notbeforeM or actionTime >= notafterM) and rollershutter_runs == 0  ) 
     then --Sonne ist schon da
     goodmorningSun()  
     runMorning = true
    
  elseif ((actionTime == "12:00") and rollershutter_runs == 0 
     and temperatur >= 25)  
     then -- zusätzlicher Check um die Mittgaszeit falls man 
          -- keinen Sonnenschutz verwendet
         highNoon() 
  
  elseif ((actionTime == sunsetHour) and rollershutter_runs == 0 )    
     then --Abenddämmeung
     goodEvening()
     runEvening = true  

  elseif (actionTime == laterClose and rollershutter_runs == 0 )
     then -- Es wird/ist dunkel.
     goodNight()
     runNight = true
    
  elseif (actionTime == checkTime) then
     checkSUN = false 

-----------------------------  
-- Weitere Beispiele
-----------------------------
--  elseif (actionTime == randomMorning) --Oeffnen zu fester Uhrzeit + zufall 
--     then 
--     goodmorningSun()
 
--  elseif (actionTime == notafterE) -- Schliessen zu fester Uhrzeit    
--     then
--     goodNight()
--    
    
  end -- Ende der elseif Bedingungen
  
 
  if ((actionTime > newsunriseHour and actionTime < "20:00") -- Zeit in der auf Sonnenschutzbedingung gepüft wird
     and SUN_Protect == true) then
     check4sunProtect()  -- Pruefen ob der Sonnenschutz aktiviert werden soll
  end
    
    
  setTimeout(rollershutter, 60*1000);  
end -- function rollershutter

if (sourceTrigger["type"] == "autostart") then
	rollershutter();
end

Hi Alex,

ich denke das Problem liegt daran dass Du die Vairable lamp1ID auf nil gesetzt hast. Das fange ich nicht ab da ich davon ausgehe dass jeder eine Lampe im Netz hat. Wenn nicht müsstest Du die Zeilen mit „fibaro:call(lamp1ID,…)“ auskommentieren.

Ach ja, in der Version unten hatte ich zusätzlich die simulationszeiten in Zeile 299-300 aktiviert. Das macht aber keine Unterschied, weil das Script dort nie ankommt.

Doch doch, sogar jede Minute einmal. Du kannst mal eine debug Ausgabe dazwischen positionieren. Bitte melden wenn Du die Fehlermeldung weiterhin bekommen solltest.

Hi Jeep,

ja, die fehlende Lampe war tatsächlich ein Problem. Ich hatte das auch schon vorher versucht und hatte eine Lampenvarible mit eingebaut. Der Test hatte sich aber dann mit einem anderen Fehler (rollershutterRuns = 1) überlagert und ich habe dann auch dir Lampe wieder herausgenommen.

Wie auch immer neuer Versuch mit Lampe führt dazu, dass zumindest die erste Phase (Rollladen auf 30%) läuft, dann aber im Anschluß die Szene wieder in den Fehler läuft. Das passiert dann wenn die Zeit für “newsunriseHour” erreicht wird. Ich versuche also jetzt noch mal die Szene ohne die beiden Variablen für die Simulation laufen zu lassen. Vielleicht liegt es ja daran. Die Fehlermeldung ist leider -zumindest für mich- etwas unspezifisch (s.u.)

Gruß und Vielen Dank für die Tipps
Alex

DEBUG] 13:09:16: – Zeiten für 01.Jul 2018, Version: 1.1.8 –
[DEBUG] 13:09:16: RealSunrise: 04:53
[DEBUG] 13:09:16: New SunRise: 05:46
[DEBUG] 13:09:16: Later Open: 05:56
[DEBUG] 13:09:16: –
[DEBUG] 13:09:16: RealSunset: 21:52
[DEBUG] 13:09:16: New SunSet: 22:10
[DEBUG] 13:09:16: LaterClose 22:20
[DEBUG] 13:09:16: Temperatur: 26.2° um 13:09
[DEBUG] 13:09:16: ---------------------------------
[DEBUG] 13:09:23: Rolllaeden 30% geoeffnet - Sun Jul 1 13:09:23 2018
[DEBUG] 13:21:23: [1;31m2018-07-01 13:21:23.964733 [ error] timer handler failed with error

--[[
%% autostart
%% properties
%% globals
--]]

-- Shutter_control.lua 
-- Section		: EG
-- Release date : 11.06.18
-- Version      : 1.1.8
-- Copyleft     : 12-2016 - 2018 {jeep}
-- benötigt wird eine Variable "rollershutter_runs" mit dem Wert 0

if (fibaro:countScenes()>1) then
   fibaro:debug('Doppelte Szene - wird abgebrochen.')
   fibaro:abort(); 
end

local function Debug( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
end

math.randomseed( os.time() ) 
local sourceTrigger  = fibaro:getSourceTrigger();
local luxSensorID    = 221 -- ID of brigthness sensor 
local TempSensorID   = 151 -- ID of temperature sensor (ZWeather)
local doorSensorID   = nil -- ID of a door sensor
local lamp1ID        = 283 -- lamp ID(s) for presence simulation 

local randomMinValue = 7   -- kleinster Zufallswert
local randomMaxValue = 22  -- größter Zufallswert
local minuteslater   = 10  -- Initialisierung Variable fuer spaeteres Oeffnen oder Schliessen

local notbeforeM     = '07:30' -- nicht vorher Morgens 
local notafterM      = '08:40' -- nicht nach 08:10 Abends 
local notbeforeE     = '18:30' -- 
local notafterE      = '23:00' --

local rollerIDsM     = {118} -- IDs der Rolllaeden für morgens {n1, n2, nn}
local rollerIDsE     = {118} -- IDs der Rolllaeden für abends {n1, n2, nn}
local rollerIDsS     = {118} -- IDs der Rolllaeden für Sonnenschutz Suedseite 
local toOpenValue    = 100  -- Initialwert fuer ganz offen  

local posQuarter  = 30  -- viertel offen 
local posHalf     = 70  -- halb offen
local pos3Quarter = 85  -- 3/4 offen
local posOpen     = 99  -- ganz offen
local posClose    = 0   -- zu --
local rollerStat  = nil -- gemeldeter Öffnungswert

local SUN_Protect   = true -- Soll der Sonnenschutz aktiviert werden (Sommerbetrieb = true)
local sunProLuxOn   = 18000 -- ab diesem Wert aktivieren
local sunProLuxOff  = 4000 -- ab diesem Wert deaktivieren
local sunProTempOn  = 25  -- Temperatur ab der der Sonnenschutz aktiviert wird
local sunProTempOff = 21  -- Temperatur ab der der Sonnenschutz deaktiviert wird
local sunProPos     = 67  -- Rollläden nicht ganz schließen, Schlitze verhindern 
                          -- Hitzestau und Schäden an den Lamellen.
local sunProtectActiv     -- = false                       

local checkTime  = "03:15" -- Uhrzeit zur Feststellug des Sonnenauf- und untergangs für den nächsten Tag
local checkSUN   = false   -- Die Variable stellt sich um checktime auf true

if luxSensorID ~= nil then
   brightness = fibaro:getValue(luxSensorID, 'value'); --Wert des Luxsensors
elseif (fibaro:getGlobal('brightness') ~= nil) then 
   brightness = tonumber(fibaro:getGlobalValue("brightness")); -- LuxWert aus globaler Variable
end
temperatur     = tonumber(string.format("%.2f",fibaro:getValue(TempSensorID, "value")));

local debug          = true   -- keine debug ausgaben
local debugonce      = true -- | false
local version        = "1.1.8"

-- Morning - negativer Wert - Morgens gehen die Rollläden früher auf
-- Evening - positver Wert - Abends gehen die Rollläden  später zu
local function offSetM() -- offset morning
  local month = tonumber(os.date('%m'))
   local tabm = { [1] = "5", [2] = "10", [3] ="15", [4] = "25", [5] = "40", [6] = "45",
         [7] = "45", [8] = "25", [9] ="20", [10] = "15", [11] = "10", [12] = 5 }
   return tonumber(tabm[month])
end  

local function offSetE() -- offset evening
  local month = tonumber(os.date('%m'))
   local tabm = { [1] = "5", [2] = "10", [3] ="15", [4] = "-5", [5] = "5", [6] = "10",
         [7] = "10", [8] = "15", [9] ="20", [10] = "10", [11] = "5", [12] = "-5" }
   return tonumber(tabm[month])
end

local function randomValue(randomMinValue, randomMaxValue)
   local random  = math.floor(math.random(randomMinValue, randomMaxValue));
   local minutes = math.floor((random*60)/60);
   return minutes;
end

local function calcTime( timeString, random )

  local std, min = timeString:match("([^,]+):([^,]+)")
  local newtimeString = os.date("%H:%M", -3600 + std*60*60 +  (min*60 + random*60  ));
  local laterClose    = os.date("%H:%M", -3600 + std*60*60 +  (min*60 + minuteslater*60 + random*60)  );
  
  return newtimeString, laterClose ;
end 

local function addrandom(str, random)
  local std, min = str:match("([^,]+):([^,]+)")
  local newtimeString = os.date("%H:%M", -3600 + std*60*60 +  (min*60 + random*60  ));
  return newtimeString
end  
-- ===================================================
-- Funktionen fuer den Sonnenschutz ein und auschalten
-- ===================================================
local function sunProtect(action)
   if action == "ON" then
     if sunProtectActiv == true then
        Debug('yellow','Sonnenschutz wird aktiviert')
        tdev = {} 
        if (rollerIDsS[1] ~= nil) then
           -- Speichere Position der Rolllaeden
           for r=1, #rollerIDsS do
              if rollerIDsS[r] ~= nil then
                 rollerStat = fibaro:getValue(rollerIDsS[r], 'value')
                 table.insert(tdev, {rollerIDsS[r],  rollerStat} )
                 fibaro:call(rollerIDsS[r], 'setValue', sunProPos) 
              end
           end --for
        end    
     end
  else -- Sonnenschutz wird zurückgenommen, alter Zustand wird wieder hergestellt
     Debug('orange','Sonnenschutz wird deaktiviert')
     if tdev ~= nil then 
         for r=1, #rollerIDsS do
             fibaro:call(tdev[r][1],'setValue', tdev[r][2] )
         end
     end
  end  
end  

local function check4sunProtect()
  if (temperatur >= sunProTempOn and brightness >= sunProLuxOn ) and sunProtectActiv ~= true then
     sunProtectActiv = true
     sunProtect("ON")  
  elseif (temperatur <= sunProTempOff and brightness <= sunProLuxOff ) and sunProtectActiv == true then
    print('Sonnenschutz aus.')
    sunProtectActiv = false
    sunProtect("OFF") 
  
  end    
end
--
-- ========================================
-- Funktionen zum oeffnen und schliessen --
-- ========================================
--
local function earlymorning() -- 1.te Szene des Tages
   fibaro:setGlobal("rollershutter_runs", "1");
   fibaro:call(lamp1ID, "turnOn"); 
   if (rollerIDsM[1] ~= nil) then
      for r=1, #rollerIDsM do
         if rollerIDsM[r] ~= nil then
            fibaro:call(rollerIDsM[r],'setValue', posQuarter )
          end
         fibaro:sleep(math.random(4000,10000)) ; --4 bis 10 Sek. warten 
      end
   end  
   Debug('yellow','Rolllaeden ' ..posQuarter..'% geoeffnet - ' .. os.date("%c"));
   fibaro:setGlobal("rollershutter_runs", "0");  
end  -- function earlymorning

local function goodmorningSun()
   fibaro:setGlobal("rollershutter_runs", "1");
   fibaro:call(lamp1ID, "turnOff"); -- Lampe wieder ausschalten 
   Debug('yellow','Sonnenaufgang. Öffne Rollladen' .. os.date("%c")); 
   Debug('yellow','Temperatur: ' .. temperatur .. '° um ' .. os.date('%H:%M'));
       if (temperatur > 20) then   -- es ist sommerlich warm
          posOpen = 60     -- wir öffnen die Rolläden nicht ganz 
          Debug('yellow','Rolllaeden werden nur '..posOpen..'% geöffnet.')
       end
       if (rollerIDsM[1] ~= nil) then
          for r=1, #rollerIDsM do
             if rollerIDsM[r] ~= nil then
                fibaro:call(rollerIDsM[r],'setValue', posOpen )
                rollerStat=fibaro:getValue(rollerIDsM[r], 'value')
             end
             fibaro:sleep(math.random(3000,7000)); -- 3 bis 7 Sek. warten
          end
       end  
       Debug('yellow','Rolllaeden '..posOpen.. '% geöffnet' );
       posopen = 99;
       fibaro:setGlobal("rollershutter_runs", "0");  
end -- function goodmorningSun  

local function highNoon()
   --Ersatzfunction falls man die Sonnenschutzfunktion nicht nutzt.   
   fibaro:setGlobal("rollershutter_runs", "1");
   Debug('yellow','Mittagshitze. Öffne Rollladen minimal' .. os.date("%c")); 
    -- es ist moerderisch heiss, wir
    -- lassen nur einen kleinen Spalt offen
    local posOpen = 15
    if (rollerIDsM[1] ~= nil) then
       fibaro:debug('Rollläden nur einen Spalt öffnen.')
       for r=1, #rollerIDsM do
          if rollerIDsM[r] ~= nil then
             fibaro:call(rollerIDsM[r],'setValue', posOpen)
          end
          fibaro:sleep(math.random(4000,9000)); -- 4 bis 9 Sek. warten 
       end
    end  
    Debug('darkorange','Rollladen minimal geöffnet');
    fibaro:setGlobal("rollershutter_runs", "0");  
end  -- function highnoon

local function goodEvening() --Abenddaemmerung
       fibaro:setGlobal("rollershutter_runs", "1"); 
       fibaro:call(lamp1ID, "turnOn"); -- Licht an?
       if (rollerIDsE[1] ~= nil) then
          Debug('darkorange','Rollläden werden 3/4 geschlossen.' .. os.date("%c"))
          for r=1, #rollerIDsE do
             if rollerIDsE[r] ~= nil then
                fibaro:call(rollerIDsE[r],'setValue', pos3Quarter )
             end
             fibaro:sleep(math.random(5000,9000)) ;
          end 
       end  --
       Debug('darkorange','Rolllaeden '..pos3Quarter..'% geschlossen');
       fibaro:setGlobal("rollershutter_runs", "0"); 
   
end --end function goodEvening

local function goodNight()
fibaro:setGlobal("rollershutter_runs", "1"); 
       Debug('green','Es ist ganz dunkel... schließe Rollladen');
       if (rollerIDsE[1] ~= nil) then
          Debug('Rolllaeden werden geschlossen.' .. os.date("%c"))
          for r=1, #rollerIDsE do
             if rollerIDsE[r] ~= nil then
                fibaro:call(rollerIDsE[r],'setValue', posClose )
             end
             fibaro:sleep(math.random(5000,10000)) ;
             --local rollerstat = 1
          end
       end  
       Debug('blue','Rolllaeden '..posClose..'% geschlossen');
       fibaro:setGlobal("rollershutter_runs", "0"); 
end -- function goodnight

--######################################################
--                Initialize 
--######################################################
local sunriseHour = fibaro:getValue(1,"sunriseHour");
local sunsetHour  = fibaro:getValue(1,"sunsetHour");
local randminutes = randomValue(randomMinValue, randomMaxValue)
local newsunriseHour, laterOpen = calcTime(sunriseHour, tonumber(randminutes) + offSetM() )
local newsunsetHour, laterClose = calcTime(sunsetHour, tonumber(randminutes) + offSetE() )
-- 
local runEarly   = false -- Variablen für Funktionen  die nur einmal 
local runMorning = false -- ausgefuehrt werden sollen, wenn man Zeitvergleiche 
local runEvening = false -- mit '>=' und '<=' in den Bedingungen hat. 
local runNight   = false

function rollershutter()  -- Hauptprogramm
   math.randomseed( os.time() ) 
   temperatur = tonumber(string.format("%.2f",fibaro:getValue(TempSensorID, "value")));
   brightness = tonumber(fibaro:getGlobalValue("brightness"));
   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 randminutes = randomValue(randomMinValue, randomMaxValue)
   local minuteslater = randomValue(5,15)  -- Spaeteres Oeffnen oder Schliessen
   local holiday      = tonumber(fibaro:getGlobalValue("Feiertag_heute"));
   if (holiday == nil) then holiday = 0 end
        
   local rollershutter_runs = tonumber(fibaro:getGlobalValue("rollershutter_runs"));
   if (rollershutter_runs ~= 0 )  then  
      Debug('red',"Die Variable 'rollershutters_runs' hat für den Start einen falschen Wert, bitte korrigieren");   
   end
  
   if ( checkSUN == false) then
      newsunriseHour, laterOpen = calcTime(sunriseHour, tonumber(randminutes) + offSetM() ) 
      newsunsetHour, laterClose = calcTime(sunsetHour, tonumber(randminutes) + offSetE() )  
      randomMorning  = addrandom(notbeforeM,randomValue(4, 9))
      temperatur = tonumber(string.format("%.2f",fibaro:getValue(TempSensorID, "value")));
      checkSUN   = true
      runEarly, runMorning, runEvening,runNight = false,false,false,false
      Debug('lightblue','-- Zeiten für '.. (os.date("%d.%b %Y, "))..'Version: '..version..  ' --')
      Debug('orange','RealSunrise: ' .. sunriseHour);
      Debug('orange','New SunRise: ' .. newsunriseHour)
      Debug('yellow','Later Open: ' .. laterOpen)
      print('--')
      Debug('darkorange','RealSunset: ' .. sunsetHour);        
      Debug('darkorange','New SunSet: ' .. newsunsetHour)
      Debug('brown','LaterClose ' .. laterClose)
      Debug('skyblue','Temperatur: ' .. temperatur .. '° um ' .. os.date('%H:%M'));
      print('---------------------------------')
   end   
   
   -- Fuer Simulation die 2 folgenden Variablen mit zeitnaher Uhrzeit fuettern
   local newsunriseHour = "13:20"
   local newsunsetHour  = "16:20"
---------------------------------------------------------------
--- Ab hier koennen die verschiedenen Bedingungen zum Oeffnen 
--- und Schliessen  hinterlegt werden  
---------------------------------------------------------------  
  if ((actionTime == newsunriseHour and holiday == 0 
     and rollershutter_runs == 0) and runEarly == false  ) 
     then --Morgenroete
     earlymorning() --früh morgens 
     runEarly = true
    
  elseif ((actionTime >= notbeforeM and holiday == 1 
     and rollershutter_runs == 0) and runEarly == false )  
     then --Morgenroete 
     earlymorning() -- es ist Feiertag, deshalb um notbeforM oeffnen  
     runEarly = true
    
  elseif ((actionTime == laterOpen) and holiday == 0 and rollershutter_runs == 0  ) 
  --elseif ((actionTime >= newsunriseHour) and (actionTime >= notbeforeM or actionTime >= notafterM) and rollershutter_runs == 0  ) 
     then --Sonne ist schon da
     goodmorningSun()  
     runMorning = true
    
  elseif ((actionTime == "12:00") and rollershutter_runs == 0 
     and temperatur >= 25)  
     then -- zusätzlicher Check um die Mittgaszeit falls man 
          -- keinen Sonnenschutz verwendet
         highNoon() 
  
  elseif ((actionTime == sunsetHour) and rollershutter_runs == 0 )    
     then --Abenddämmeung
     goodEvening()
     runEvening = true  

  elseif (actionTime == laterClose and rollershutter_runs == 0 )
     then -- Es wird/ist dunkel.
     goodNight()
     runNight = true
    
  elseif (actionTime == checkTime) then
     checkSUN = false 

-----------------------------  
-- Weitere Beispiele
-----------------------------
--  elseif (actionTime == randomMorning) --Oeffnen zu fester Uhrzeit + zufall 
--     then 
--     goodmorningSun()
 
--  elseif (actionTime == notafterE) -- Schliessen zu fester Uhrzeit    
--     then
--     goodNight()
--    
    
  end -- Ende der elseif Bedingungen
  
 
  if ((actionTime > newsunriseHour and actionTime < "20:00") -- Zeit in der auf Sonnenschutzbedingung gepüft wird
     and SUN_Protect == true) then
     check4sunProtect()  -- Pruefen ob der Sonnenschutz aktiviert werden soll
  end
    
    
  setTimeout(rollershutter, 60*1000);  
end -- function rollershutter

if (sourceTrigger["type"] == "autostart") then
	rollershutter();
end

Moin,

leider war es da auch nicht. Jetzt geht es gleich mit dieser Fehlermeldung los. Die Lampe ist eine Hue. Kann das einen Unterschied machen?

Gruß
Alex

[DEBUG] 15:01:09: – Zeiten für 01.Jul 2018, Version: 1.1.8 –
[DEBUG] 15:01:09: RealSunrise: 04:53
[DEBUG] 15:01:09: New SunRise: 05:46
[DEBUG] 15:01:09: Later Open: 05:56
[DEBUG] 15:01:09: –
[DEBUG] 15:01:09: RealSunset: 21:52
[DEBUG] 15:01:09: New SunSet: 22:10
[DEBUG] 15:01:09: LaterClose 22:20
[DEBUG] 15:01:09: Temperatur: 26.8° um 15:01
[DEBUG] 15:01:09: ---------------------------------
[DEBUG] 15:01:17: Rolllaeden 30% geoeffnet - Sun Jul 1 15:01:17 2018
[DEBUG] 15:01:17: [1;31m2018-07-01 15:01:17.438377 [ fatal] Unknown exception: /opt/fibaro/scenes/141.lua:140: attempt to compare number with nil

Hi Alex,

ja klar liegt es an der HUE. Die kann man so viel ich weiß (habe keine Hues) nicht mit fiabro Befehlen steuern.
Der nächste Fehler geht auf meine Kappe. ?
Ersetze bitte die Zeile 264 (brigthness=…) durch die folgenden 5.

if luxSensorID ~= nil then
   brightness = fibaro:getValue(luxSensorID, 'value'); --Wert des Luxsensors
elseif (fibaro:getGlobal('brightness') ~= nil) then 
   brightness = tonumber(fibaro:getGlobalValue("brightness")); -- LuxWert aus globaler Variable
end

Ich hole mir nämlich die Helligkeit aus einer globalen Variable, die von einem nicht ZWave Gerät per http request geliefert wird.
Sorry für die Umstände, freue mich aber über Dein feedback.

Hi Jeep,

ja die brightness Variable hatte ich auch gerade am Wickel. Ich habe jetzt mal Dein Update eingebaut und melde mich wieder…

Gruß
Alex

Moin Jeep,

prima es läuft bestens. Ich musste allerdings noch eine “tonumber” einsetzen damit die brightness Variable verwendet werden konnte. Ebenso auch in Zeile 64. Aber jetzt flutscht es und ich kann mich an die Feineinstellungen (weitere Shutter, Helligkeiten und Rollladenstellungen…) machen.

Ach ja, Philips Hue funktioniert wie jeder andere Fibaro Aktor einwandfrei. Kann man also auch als Anwesenheitssimulator benutzen.

Best Grüße aus S-H
Alex

Hier nochmal die bei mir laufende Szene:

--[[
%% autostart
%% properties
%% globals
--]]

-- Shutter_control.lua 
-- Section		: EG
-- Release date : 11.06.18
-- Version      : 1.1.8
-- Copyleft     : 12-2016 - 2018 {jeep}
-- benötigt wird eine Variable "rollershutter_runs" mit dem Wert 0

if (fibaro:countScenes()>1) then
   fibaro:debug('Doppelte Szene - wird abgebrochen.')
   fibaro:abort(); 
end

local function Debug( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
end

math.randomseed( os.time() ) 
local sourceTrigger  = fibaro:getSourceTrigger();
local luxSensorID    = 221 -- ID of brigthness sensor 
local TempSensorID   = 151 -- ID of temperature sensor (ZWeather)
local doorSensorID   = nil -- ID of a door sensor
local lamp1ID        = 283 -- lamp ID(s) for presence simulation 

local randomMinValue = 7   -- kleinster Zufallswert
local randomMaxValue = 22  -- größter Zufallswert
local minuteslater   = 10  -- Initialisierung Variable fuer spaeteres Oeffnen oder Schliessen

local notbeforeM     = '07:30' -- nicht vorher Morgens 
local notafterM      = '08:40' -- nicht nach 08:10 Abends 
local notbeforeE     = '18:30' -- 
local notafterE      = '23:00' --

local rollerIDsM     = {118} -- IDs der Rolllaeden für morgens {n1, n2, nn}
local rollerIDsE     = {118} -- IDs der Rolllaeden für abends {n1, n2, nn}
local rollerIDsS     = {118} -- IDs der Rolllaeden für Sonnenschutz Suedseite 
local toOpenValue    = 100  -- Initialwert fuer ganz offen  

local posQuarter  = 30  -- viertel offen 
local posHalf     = 70  -- halb offen
local pos3Quarter = 85  -- 3/4 offen
local posOpen     = 99  -- ganz offen
local posClose    = 0   -- zu --
local rollerStat  = nil -- gemeldeter Öffnungswert

local SUN_Protect   = true -- Soll der Sonnenschutz aktiviert werden (Sommerbetrieb = true)
local sunProLuxOn   = 18000 -- ab diesem Wert aktivieren
local sunProLuxOff  = 4000 -- ab diesem Wert deaktivieren
local sunProTempOn  = 25  -- Temperatur ab der der Sonnenschutz aktiviert wird
local sunProTempOff = 21  -- Temperatur ab der der Sonnenschutz deaktiviert wird
local sunProPos     = 67  -- Rollläden nicht ganz schließen, Schlitze verhindern 
                          -- Hitzestau und Schäden an den Lamellen.
local sunProtectActiv     -- = false                       

local checkTime  = "03:15" -- Uhrzeit zur Feststellug des Sonnenauf- und untergangs für den nächsten Tag
local checkSUN   = false   -- Die Variable stellt sich um checktime auf true

if luxSensorID ~= nil then
   brightness = tonumber(string.format("%.2f",fibaro:getValue(luxSensorID, "value"))); --Wert des Luxsensors
 elseif (fibaro:getGlobal('brightness') ~= nil) then 
   brightness = tonumber(fibaro:getGlobalValue("brightness")); -- LuxWert aus globaler Variable
end
temperatur     = tonumber(string.format("%.2f",fibaro:getValue(TempSensorID, "value")));

local debug          = true   -- keine debug ausgaben
local debugonce      = true -- | false
local version        = "1.1.8"

-- Morning - negativer Wert - Morgens gehen die Rollläden früher auf
-- Evening - positver Wert - Abends gehen die Rollläden  später zu
local function offSetM() -- offset morning
  local month = tonumber(os.date('%m'))
   local tabm = { [1] = "5", [2] = "10", [3] ="15", [4] = "25", [5] = "40", [6] = "45",
         [7] = "45", [8] = "25", [9] ="20", [10] = "15", [11] = "10", [12] = 5 }
   return tonumber(tabm[month])
end  

local function offSetE() -- offset evening
  local month = tonumber(os.date('%m'))
   local tabm = { [1] = "5", [2] = "10", [3] ="15", [4] = "-5", [5] = "5", [6] = "10",
         [7] = "10", [8] = "15", [9] ="20", [10] = "10", [11] = "5", [12] = "-5" }
   return tonumber(tabm[month])
end

local function randomValue(randomMinValue, randomMaxValue)
   local random  = math.floor(math.random(randomMinValue, randomMaxValue));
   local minutes = math.floor((random*60)/60);
   return minutes;
end

local function calcTime( timeString, random )

  local std, min = timeString:match("([^,]+):([^,]+)")
  local newtimeString = os.date("%H:%M", -3600 + std*60*60 +  (min*60 + random*60  ));
  local laterClose    = os.date("%H:%M", -3600 + std*60*60 +  (min*60 + minuteslater*60 + random*60)  );
  
  return newtimeString, laterClose ;
end 

local function addrandom(str, random)
  local std, min = str:match("([^,]+):([^,]+)")
  local newtimeString = os.date("%H:%M", -3600 + std*60*60 +  (min*60 + random*60  ));
  return newtimeString
end  
-- ===================================================
-- Funktionen fuer den Sonnenschutz ein und auschalten
-- ===================================================
local function sunProtect(action)
   if action == "ON" then
     if sunProtectActiv == true then
        Debug('yellow','Sonnenschutz wird aktiviert')
        tdev = {} 
        if (rollerIDsS[1] ~= nil) then
           -- Speichere Position der Rolllaeden
           for r=1, #rollerIDsS do
              if rollerIDsS[r] ~= nil then
                 rollerStat = fibaro:getValue(rollerIDsS[r], 'value')
                 table.insert(tdev, {rollerIDsS[r],  rollerStat} )
                 fibaro:call(rollerIDsS[r], 'setValue', sunProPos) 
              end
           end --for
        end    
     end
  else -- Sonnenschutz wird zurückgenommen, alter Zustand wird wieder hergestellt
     Debug('orange','Sonnenschutz wird deaktiviert')
     if tdev ~= nil then 
         for r=1, #rollerIDsS do
             fibaro:call(tdev[r][1],'setValue', tdev[r][2] )
         end
     end
  end  
end  

local function check4sunProtect()
  if (temperatur >= sunProTempOn and brightness >= sunProLuxOn ) and sunProtectActiv ~= true then
     sunProtectActiv = true
     sunProtect("ON")  
  elseif (temperatur <= sunProTempOff and brightness <= sunProLuxOff ) and sunProtectActiv == true then
    print('Sonnenschutz aus.')
    sunProtectActiv = false
    sunProtect("OFF") 
  
  end    
end
--
-- ========================================
-- Funktionen zum oeffnen und schliessen --
-- ========================================
--
local function earlymorning() -- 1.te Szene des Tages
   fibaro:setGlobal("rollershutter_runs", "1");
   fibaro:call(lamp1ID, "turnOn"); 
   if (rollerIDsM[1] ~= nil) then
      for r=1, #rollerIDsM do
         if rollerIDsM[r] ~= nil then
            fibaro:call(rollerIDsM[r],'setValue', posQuarter )
          end
         fibaro:sleep(math.random(4000,10000)) ; --4 bis 10 Sek. warten 
      end
   end  
   Debug('yellow','Rolllaeden ' ..posQuarter..'% geoeffnet - ' .. os.date("%c"));
   fibaro:setGlobal("rollershutter_runs", "0");  
end  -- function earlymorning

local function goodmorningSun()
   fibaro:setGlobal("rollershutter_runs", "1");
   fibaro:call(lamp1ID, "turnOff"); -- Lampe wieder ausschalten 
   Debug('yellow','Sonnenaufgang. Öffne Rollladen' .. os.date("%c")); 
   Debug('yellow','Temperatur: ' .. temperatur .. '° um ' .. os.date('%H:%M'));
       if (temperatur > 20) then   -- es ist sommerlich warm
          posOpen = 60     -- wir öffnen die Rolläden nicht ganz 
          Debug('yellow','Rolllaeden werden nur '..posOpen..'% geöffnet.')
       end
       if (rollerIDsM[1] ~= nil) then
          for r=1, #rollerIDsM do
             if rollerIDsM[r] ~= nil then
                fibaro:call(rollerIDsM[r],'setValue', posOpen )
                rollerStat=fibaro:getValue(rollerIDsM[r], 'value')
             end
             fibaro:sleep(math.random(3000,7000)); -- 3 bis 7 Sek. warten
          end
       end  
       Debug('yellow','Rolllaeden '..posOpen.. '% geöffnet' );
       posopen = 99;
       fibaro:setGlobal("rollershutter_runs", "0");  
end -- function goodmorningSun  

local function highNoon()
   --Ersatzfunction falls man die Sonnenschutzfunktion nicht nutzt.   
   fibaro:setGlobal("rollershutter_runs", "1");
   Debug('yellow','Mittagshitze. Öffne Rollladen minimal' .. os.date("%c")); 
    -- es ist moerderisch heiss, wir
    -- lassen nur einen kleinen Spalt offen
    local posOpen = 15
    if (rollerIDsM[1] ~= nil) then
       fibaro:debug('Rollläden nur einen Spalt öffnen.')
       for r=1, #rollerIDsM do
          if rollerIDsM[r] ~= nil then
             fibaro:call(rollerIDsM[r],'setValue', posOpen)
          end
          fibaro:sleep(math.random(4000,9000)); -- 4 bis 9 Sek. warten 
       end
    end  
    Debug('darkorange','Rollladen minimal geöffnet');
    fibaro:setGlobal("rollershutter_runs", "0");  
end  -- function highnoon

local function goodEvening() --Abenddaemmerung
       fibaro:setGlobal("rollershutter_runs", "1"); 
       fibaro:call(lamp1ID, "turnOn"); -- Licht an?
       if (rollerIDsE[1] ~= nil) then
          Debug('darkorange','Rollläden werden 3/4 geschlossen.' .. os.date("%c"))
          for r=1, #rollerIDsE do
             if rollerIDsE[r] ~= nil then
                fibaro:call(rollerIDsE[r],'setValue', pos3Quarter )
             end
             fibaro:sleep(math.random(5000,9000)) ;
          end 
       end  --
       Debug('darkorange','Rolllaeden '..pos3Quarter..'% geschlossen');
       fibaro:setGlobal("rollershutter_runs", "0"); 
   
end --end function goodEvening

local function goodNight()
fibaro:setGlobal("rollershutter_runs", "1"); 
       Debug('green','Es ist ganz dunkel... schließe Rollladen');
       if (rollerIDsE[1] ~= nil) then
          Debug('Rolllaeden werden geschlossen.' .. os.date("%c"))
          for r=1, #rollerIDsE do
             if rollerIDsE[r] ~= nil then
                fibaro:call(rollerIDsE[r],'setValue', posClose )
             end
             fibaro:sleep(math.random(5000,10000)) ;
             --local rollerstat = 1
          end
       end  
       Debug('blue','Rolllaeden '..posClose..'% geschlossen');
       fibaro:setGlobal("rollershutter_runs", "0"); 
end -- function goodnight

--######################################################
--                Initialize 
--######################################################
local sunriseHour = fibaro:getValue(1,"sunriseHour");
local sunsetHour  = fibaro:getValue(1,"sunsetHour");
local randminutes = randomValue(randomMinValue, randomMaxValue)
local newsunriseHour, laterOpen = calcTime(sunriseHour, tonumber(randminutes) + offSetM() )
local newsunsetHour, laterClose = calcTime(sunsetHour, tonumber(randminutes) + offSetE() )
-- 
local runEarly   = false -- Variablen für Funktionen  die nur einmal 
local runMorning = false -- ausgefuehrt werden sollen, wenn man Zeitvergleiche 
local runEvening = false -- mit '>=' und '<=' in den Bedingungen hat. 
local runNight   = false

function rollershutter()  -- Hauptprogramm
   math.randomseed( os.time() ) 
   temperatur = tonumber(string.format("%.2f",fibaro:getValue(TempSensorID, "value")));
if luxSensorID ~= nil then
   brightness = tonumber(string.format("%.2f",fibaro:getValue(luxSensorID, "value"))); --Wert des Luxsensors
 --  Debug('orange','brightness '..brightness.. 'LUX'); --ALEX
elseif (fibaro:getGlobal('brightness') ~= nil) then 
   brightness = tonumber(fibaro:getGlobalValue("brightness")); -- LuxWert aus globaler Variable
end
   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 randminutes = randomValue(randomMinValue, randomMaxValue)
   local minuteslater = randomValue(5,15)  -- Spaeteres Oeffnen oder Schliessen
   local holiday      = tonumber(fibaro:getGlobalValue("Feiertag_heute"));
   if (holiday == nil) then holiday = 0 end
        
   local rollershutter_runs = tonumber(fibaro:getGlobalValue("rollershutter_runs"));
   if (rollershutter_runs ~= 0 )  then  
      Debug('red',"Die Variable 'rollershutters_runs' hat für den Start einen falschen Wert, bitte korrigieren");   
   end
  
   if ( checkSUN == false) then
      newsunriseHour, laterOpen = calcTime(sunriseHour, tonumber(randminutes) + offSetM() ) 
      newsunsetHour, laterClose = calcTime(sunsetHour, tonumber(randminutes) + offSetE() )  
      randomMorning  = addrandom(notbeforeM,randomValue(4, 9))
      temperatur = tonumber(string.format("%.2f",fibaro:getValue(TempSensorID, "value")));
      checkSUN   = true
      runEarly, runMorning, runEvening,runNight = false,false,false,false
      Debug('lightblue','-- Zeiten für '.. (os.date("%d.%b %Y, "))..'Version: '..version..  ' --')
      Debug('orange','RealSunrise: ' .. sunriseHour);
      Debug('orange','New SunRise: ' .. newsunriseHour)
      Debug('yellow','Later Open: ' .. laterOpen)
      print('--')
      Debug('darkorange','RealSunset: ' .. sunsetHour);        
      Debug('darkorange','New SunSet: ' .. newsunsetHour)
      Debug('brown','LaterClose ' .. laterClose)
      Debug('skyblue','Temperatur: ' .. temperatur .. '° um ' .. os.date('%H:%M'));
      print('---------------------------------')
   end   
   
   -- Fuer Simulation die 2 folgenden Variablen mit zeitnaher Uhrzeit fuettern
   local newsunriseHour = "13:20"
   local newsunsetHour  = "16:20"
---------------------------------------------------------------
--- Ab hier koennen die verschiedenen Bedingungen zum Oeffnen 
--- und Schliessen  hinterlegt werden  
---------------------------------------------------------------  
  if ((actionTime == newsunriseHour and holiday == 0 
     and rollershutter_runs == 0) and runEarly == false  ) 
     then --Morgenroete
     earlymorning() --früh morgens 
     runEarly = true
    
  elseif ((actionTime >= notbeforeM and holiday == 1 
     and rollershutter_runs == 0) and runEarly == false )  
     then --Morgenroete 
     earlymorning() -- es ist Feiertag, deshalb um notbeforM oeffnen  
     runEarly = true
    
  elseif ((actionTime == laterOpen) and holiday == 0 and rollershutter_runs == 0  ) 
  --elseif ((actionTime >= newsunriseHour) and (actionTime >= notbeforeM or actionTime >= notafterM) and rollershutter_runs == 0  ) 
     then --Sonne ist schon da
     goodmorningSun()  
     runMorning = true
    
  elseif ((actionTime == "12:00") and rollershutter_runs == 0 
     and temperatur >= 25)  
     then -- zusätzlicher Check um die Mittgaszeit falls man 
          -- keinen Sonnenschutz verwendet
         highNoon() 
  
  elseif ((actionTime == sunsetHour) and rollershutter_runs == 0 )    
     then --Abenddämmeung
     goodEvening()
     runEvening = true  

  elseif (actionTime == laterClose and rollershutter_runs == 0 )
     then -- Es wird/ist dunkel.
     goodNight()
     runNight = true
    
  elseif (actionTime == checkTime) then
     checkSUN = false 

-----------------------------  
-- Weitere Beispiele
-----------------------------
--  elseif (actionTime == randomMorning) --Oeffnen zu fester Uhrzeit + zufall 
--     then 
--     goodmorningSun()
 
--  elseif (actionTime == notafterE) -- Schliessen zu fester Uhrzeit    
--     then
--     goodNight()
--    
    
  end -- Ende der elseif Bedingungen
  
 
  if ((actionTime > newsunriseHour and actionTime < "20:00") -- Zeit in der auf Sonnenschutzbedingung gepüft wird
     and SUN_Protect == true) then
     check4sunProtect()  -- Pruefen ob der Sonnenschutz aktiviert werden soll
  end
    
    
  setTimeout(rollershutter, 60*1000);  
end -- function rollershutter

if (sourceTrigger["type"] == "autostart") then
	rollershutter();
end'

Hi Alex,

super das es jetzt funktioniert. Ich stell mal die neue Version 1.1.9 rein. Es besteht keine Notwendigkeit zum update für Dich. Habe nur kleinere Anpassungen gemacht.
Konntest Du schon den Sonnenschutz testen? Der funktioniert bei mir an diesen Tagen einwandfrei. Das schöne daran ist dass er sich nur einmal am Tag einschaltet um dann später auf die vorige Position zu fahren.
Ich denke dass alle Funktionen leicht durchschaubar sind so das man leicht was ändern kann. Noch ein Hinweis, wenn man das Script, nach dem der Sonnenschutz sich aktiviert hat, neu startet und die Bedingungen für den Sonnenschutz nicht mehr erfüllt sind, bleiben die Rollläden in der Sonnenschutzpostion stehen bis sie Abends eingefahren waren.
Ich könnte die Positionstabelle in einer späteren Version als globale Variable wegsichern, dann wäre auch ein Neustart des Scripts oder HC2 möglich.

Änderungen sind folgendermaßen gekennzeichnet:
‘-- (-)’ am Anfang der Zeile, bedeutet diese Zeile ist auskommentiert.
‘-- (+)’ am Ende einer Zeile, bedeutet diese Zeile oder Funktion ist neu dazugekommen.

–Changelog für Version 1.1.9: Bug in der Variablen brightness behoben

--[[
%% autostart
%% properties
%% globals
--]]

-- Shutter_control.lua 
-- Section		: EG
-- Release date : 02.07.2018
-- Version      : 1.1.9
-- Copyleft     : 12-2016 - 2018 {jeep}
-- benötigt wird eine Variable "rollershutter_runs" mit dem Wert 0

if (fibaro:countScenes()>1) then
   fibaro:debug('Doppelte Szene - wird abgebrochen.')
   fibaro:abort(); 
end

local function Debug( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
end

math.randomseed( os.time() ) 
local sourceTrigger  = fibaro:getSourceTrigger();
local luxSensorID    = nil -- ID of brigthness sensor 
local TempSensorID   = 452 -- 427 -- ID of temperature sensor (ZWeather)
local doorSensorID   = nil -- ID of a door sensor
local lamp1ID        = 166 -- lamp ID(s) for presence simulation 

local randomMinValue = 7   -- kleinster Zufallswert
local randomMaxValue = 22  -- größter Zufallswert
local minuteslater   = 10  -- Initialisierung Variable fuer spaeteres Oeffnen oder Schliessen

local notbeforeM     = '07:30' -- nicht vorher Morgens 
local notafterM      = '08:10' -- nicht nach 08:10 
local notbeforeE     = '16:30' -- 
local notafterE      = '21:00' --

local rollerIDsM     = {150,164} -- IDs der Rolllaeden für morgens {n1, n2, nn}
local rollerIDsE     = {150}     -- IDs der Rolllaeden für abends {n1, n2, nn}
local rollerIDsS     = {150,418} -- IDs der Rolllaeden für Sonnenschutz Suedseite 
local toOpenValue    = 99  -- Initialwert fuer ganz offen  

local posQuarter  = 25  -- viertel offen 
local posHalf     = 50  -- halb offen
local pos3Quarter = 70  -- 3/4 offen
local posOpen     = 99  -- ganz offen
local posClose    = 0   -- zu --
local rollerStat     = nil -- gemeldeter Öffnungswert

local SUN_Protect   = true -- Soll der Sonnenschutz aktiviert werden (Sommerbetrieb = true)
local sunProLuxOn   = 35000 -- ab diesem Wert aktivieren
local sunProLuxOff  = 15000 -- ab diesem Wert deaktivieren
local sunProTempOn  = 25  -- Temperatur ab der der Sonnenschutz aktiviert wird
local sunProTempOff = 22  -- Temperatur ab der der Sonnenschutz deaktiviert wird
local sunProPos     = 30  -- Rollläden nicht ganz schließen, Schlitze verhindern 
                          -- Hitzestau und Schäden an den Lamellen.
local sunProtectActiv     -- = false                       

local checkTime   = "03:15" -- Uhrzeit zur Feststellug des Sonnenauf- und untergangs für den nächsten Tag
local checkSUN    = false   -- Die Variable stellt sich um 'checktime' auf true

if luxSensorID ~= nil then
   brightness = tonumber(ibaro:getValue(luxSensorID, 'value')); --Wert des Luxsensors
elseif (fibaro:getGlobal('brightness') ~= nil) then 
   brightness = tonumber(fibaro:getGlobalValue("brightness")); -- LuxWert aus globaler Variable
end
temperatur = tonumber(string.format("%.2f",fibaro:getValue(TempSensorID, "value")));

local debug          = true   -- keine debug ausgaben
local debugonce      = true -- | false
local version        = "1.1.9"

-- Morning - negativer Wert - Morgens gehen die Rollläden früher auf
-- Evening - positver Wert - Abends gehen die Rollläden  später zu
local function offSetM() -- offset morning
  local month = tonumber(os.date('%m'))
   local tabm = { [1] = "5", [2] = "10", [3] ="15", [4] = "25", [5] = "40", [6] = "45",
         [7] = "45", [8] = "25", [9] ="20", [10] = "15", [11] = "10", [12] = "5" }
   return tonumber(tabm[month])
end  

local function offSetE() -- offset evening
  local month = tonumber(os.date('%m'))
   local tabm = { [1] = "5", [2] = "10", [3] ="15", [4] = "-5", [5] = "5", [6] = "10",
         [7] = "10", [8] = "15", [9] ="20", [10] = "10", [11] = "5", [12] = "-5" }
   return tonumber(tabm[month])
end

local function randomValue(randomMinValue, randomMaxValue)
   local random  = math.floor(math.random(randomMinValue, randomMaxValue));
   local minutes = math.floor((random*60)/60);
   return minutes;
end

local function calcTime( timeString, random )

  local std, min = timeString:match("([^,]+):([^,]+)")
  local newtimeString = os.date("%H:%M", -3600 + std*60*60 +  (min*60 + random*60  ));
  local laterClose    = os.date("%H:%M", -3600 + std*60*60 +  (min*60 + minuteslater*60 + random*60)  );
  
  return newtimeString, laterClose ;
end 

local function addrandom(str, random)
  local std, min = str:match("([^,]+):([^,]+)")
  local newtimeString = os.date("%H:%M", -3600 + std*60*60 +  (min*60 + random*60  ));
  return newtimeString
end  
-- ===================================================
-- Funktionen fuer den Sonnenschutz ein und auschalten
-- ===================================================
local function sunProtect(action)
   if action == "ON" then
     if sunProtectActiv == true then
        print('Temperatur: '.. temperatur) --(+)
        print('Helligkeit: '.. brightness) --(+)
        Debug('yellow','Sonnenschutz wird aktiviert')
        tdev = {} 
        if (rollerIDsS[1] ~= nil) then
           -- Speichere Position der Rolllaeden
           for r=1, #rollerIDsS do
              if rollerIDsS[r] ~= nil then
                 rollerStat = fibaro:getValue(rollerIDsS[r], 'value')
                 table.insert(tdev, {rollerIDsS[r],  rollerStat} )
                 fibaro:call(rollerIDsS[r], 'setValue', sunProPos) 
              end
           end --for
        end    
     end
  else -- Sonnenschutz wird zurückgenommen, alter ZUstand wird wieder hergestellt
     Debug('orange','Sonnenschutz wird deaktiviert')
     print('Temperatur: '.. temperatur) --(+)
     print('Helligkeit: '.. brightness) --(+)
     if tdev ~= nil then 
         for r=1, #rollerIDsS do
             fibaro:call(tdev[r][1],'setValue', tdev[r][2] )
         end
     end
  end  
end  

local function check4sunProtect()
  if (temperatur >= sunProTempOn and brightness >= sunProLuxOn ) and sunProtectActiv ~= true then
     sunProtectActiv = true
     sunProtect("ON")  
  elseif (temperatur <= sunProTempOff and brightness <= sunProLuxOff ) and sunProtectActiv == true then
     print('Sonnenschutz aus.')
     sunProtectActiv = false
     sunProtect("OFF") 
  end    
end
--
-- ========================================
-- Funktionen zum oeffnen und schliessen --
-- ========================================
--
local function earlymorning() -- 1.te Szene des Tages
   fibaro:setGlobal("rollershutter_runs", "1");
   fibaro:call(lamp1ID, "turnOn"); 
   if (rollerIDsM[1] ~= nil) then
      for r=1, #rollerIDsM do
         if rollerIDsM[r] ~= nil then
            fibaro:call(rollerIDsM[r],'setValue', posQuarter )
          end
         fibaro:sleep(math.random(4000,10000)) ; --4 bis 10 Sek. warten 
      end
   end  
   Debug('orange','Rolllaeden ' ..posQuarter..'% geoeffnet - ' .. os.date("%c"));
   fibaro:setGlobal("rollershutter_runs", "0");  
end  -- function earlymorning

local function goodmorningSun()
   fibaro:setGlobal("rollershutter_runs", "1");
   fibaro:call(lamp1ID, "turnOff"); -- Lampe wieder ausschalten 
   Debug('yellow','Sonnenaufgang - ' .. os.date("%c")); 
   Debug('yellow','Temperatur: ' .. temperatur .. '° um ' .. os.date('%H:%M'));
       if (temperatur > 20) then   -- es ist sommerlich warm
          posOpen = 60     -- wir öffnen die Rolläden nicht ganz 
          Debug('yellow','Rolllaeden werden nur '..posOpen..'% geöffnet.')
       end
       if (rollerIDsM[1] ~= nil) then
          for r=1, #rollerIDsM do
             if rollerIDsM[r] ~= nil then
                fibaro:call(rollerIDsM[r],'setValue', posOpen )
                rollerStat=fibaro:getValue(rollerIDsM[r], 'value')
             end
             fibaro:sleep(math.random(3000,7000)); -- 3 bis 7 Sek. warten
          end
       end  
       Debug('yellow','Rolllaeden '..posOpen.. '% geöffnet' );
       posopen = 99;
       fibaro:setGlobal("rollershutter_runs", "0");  
end -- function goodmorningSun  

local function highNoon()
   --Ersatzfunction falls man die Sonnenschutzfunktion nicht nutzt.   
   fibaro:setGlobal("rollershutter_runs", "1");
   Debug('yellow','Mittagshitze. Öffne Rollladen minimal' .. os.date("%c")); 
    -- es ist moerderisch heiss, wir
    -- lassen nur einen kleinen Spalt offen
    local posOpen = 15
    if (rollerIDsM[1] ~= nil) then
       fibaro:debug('Rollläden nur einen Spalt öffnen.')
       for r=1, #rollerIDsE do
          if rollerIDsE[r] ~= nil then
             fibaro:call(rollerIDsE[r],'setValue', posOpen)
          end
          fibaro:sleep(math.random(4000,9000)); -- 4 bis 9 Sek. warten 
       end
    end  
    Debug('darkorange','Rollladen minimal geöffnet');
    fibaro:setGlobal("rollershutter_runs", "0");  
end  -- function highnoon

local function goodEvening() --Abenddaemmerung
       fibaro:setGlobal("rollershutter_runs", "1"); 
       fibaro:call(lamp1ID, "turnOn"); -- Licht an?
       if (rollerIDsE[1] ~= nil) then
          Debug('darkorange','Rollläden werden zur Haelfte geschlossen.' .. os.date("%c"))
          for r=1, #rollerIDsE do
             if rollerIDsE[r] ~= nil then
                fibaro:call(rollerIDsE[r],'setValue', posHalf )
             end
             fibaro:sleep(math.random(5000,9000)) ;
          end 
       end  --
       Debug('darkorange','Rolllaeden noch '..posHalf..'% offen');
       fibaro:setGlobal("rollershutter_runs", "0"); 
   
end --end function goodEvening

local function goodNight()
fibaro:setGlobal("rollershutter_runs", "1"); 
       Debug('green','Es ist ganz dunkel... schließe Rollladen');
       if (rollerIDsE[1] ~= nil) then
          Debug('blue','Rolllaeden werden geschlossen.' .. os.date("%c"))
          for r=1, #rollerIDsE do
             if rollerIDsE[r] ~= nil then
                fibaro:call(rollerIDsE[r],'setValue', posClose )
             end
             fibaro:sleep(math.random(5000,10000)) ;
             --local rollerstat = 1
          end
       end  
       Debug('blue','Rolllaeden '..posClose..'% offen.');
       fibaro:setGlobal("rollershutter_runs", "0"); 
end -- function goodnight

--######################################################
--                Initialize 
--######################################################
local sunriseHour = fibaro:getValue(1,"sunriseHour");
local sunsetHour  = fibaro:getValue(1,"sunsetHour");
local randminutes = randomValue(randomMinValue, randomMaxValue)
local newsunriseHour, laterOpen = calcTime(sunriseHour, tonumber(randminutes) + offSetM() )
local newsunsetHour, laterClose = calcTime(sunsetHour, tonumber(randminutes) + offSetE() )
-- 
local runEarly   = false -- Variablen für Funktionen  die nur einmal 
local runMorning = false -- ausgefuehrt werden sollen, wenn man Zeitvergleiche 
local runEvening = false -- mit '>=' und '<=' in den Bedingungen hat. 
local runNight   = false

function rollershutter()  -- Hauptprogramm
   math.randomseed( os.time() ) 
   temperatur = tonumber(string.format("%.2f",fibaro:getValue(TempSensorID, "value")));
   -- (-) brightness = tonumber(fibaro:getValue(luxSensorID, 'value')); -- Wert des Luxsensors 
   if luxSensorID ~= nil then  --(+)
      brightness = tonumber(fibaro:getValue(luxSensorID, 'value')); -- Wert des Luxsensors
   elseif (fibaro:getGlobal('brightness') ~= nil) then               
      brightness = tonumber(fibaro:getGlobalValue("brightness")); -- LuxWert aus globaler Variable
   end --(+)
   -- (-) 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 randminutes = randomValue(randomMinValue, randomMaxValue)
   local minuteslater = randomValue(5,15)  -- Spaeteres Oeffnen oder Schliessen
   local holiday      = tonumber(fibaro:getGlobalValue("Feiertag_heute"));
   if (holiday == nil) then holiday = 0 end
        
   local rollershutter_runs = tonumber(fibaro:getGlobalValue("rollershutter_runs"));
   if (rollershutter_runs ~= 0 )  then  
      Debug('red',"Die Variable 'rollershutters_runs' hat für den Start einen falschen Wert, bitte korrigieren");   
   end
  
   if ( checkSUN == false) then
      sunriseHour = fibaro:getValue(1,"sunriseHour"); -- (+)
      sunsetHour  = fibaro:getValue(1,"sunsetHour");  -- (+)
      newsunriseHour, laterOpen = calcTime(sunriseHour, tonumber(randminutes) + offSetM() ) 
      newsunsetHour, laterClose = calcTime(sunsetHour, tonumber(randminutes) + offSetE() )  
      randomMorning  = addrandom(notbeforeM,randomValue(4, 9))
      temperatur = tonumber(string.format("%.2f",fibaro:getValue(TempSensorID, "value")));
      checkSUN   = true
      runEarly, runMorning, runEvening,runNight = false,false,false,false
      Debug('lightblue','-- Zeiten für '.. (os.date("%d. %b %Y, "))..'Version: '..version..  ' --')
      Debug('orange','RealSunrise: ' .. sunriseHour);
      Debug('orange','New SunRise: ' .. newsunriseHour)
      Debug('yellow','Later Open: ' .. laterOpen)
      print('--')
      Debug('darkorange','RealSunset: ' .. sunsetHour);        
      Debug('darkorange','New SunSet: ' .. newsunsetHour)
      Debug('brown','LaterClose ' .. laterClose)
      Debug('skyblue','Temperatur: ' .. temperatur .. '° um ' .. os.date('%H:%M'));
      print('---------------------------------')
   end   
   
   -- Fuer Simulation die 2 folgenden Variablen mit zeitnaher Uhrzeit fuettern
   -- local newsunriseHour = "09:48"
   -- local newsunsetHour  = "22:39"
---------------------------------------------------------------
--- Ab hier koennen die verschiedenen Bedingungen zum Oeffnen 
--- und Schliessen  hinterlegt werden  
---------------------------------------------------------------  
  if ((actionTime == newsunriseHour and holiday == 0 
     and rollershutter_runs == 0) and runEarly == false  ) 
     then --Morgenröte
     earlymorning() --früh morgens 
     runEarly = true
    
  elseif ((actionTime >= notbeforeM and holiday == 1 
     and rollershutter_runs == 0) and runEarly == false )  
     then --Morgenröte 
     earlymorning() -- es ist Feiertag, deshalb um notbeforM oeffnen  
     runEarly = true
    
  elseif ((actionTime == laterOpen) and holiday == 0 and rollershutter_runs == 0  ) 
  --elseif ((actionTime >= newsunriseHour) and (actionTime >= notbeforeM or actionTime >= notafterM) and rollershutter_runs == 0  ) 
     then --Morgenröte
     goodmorningSun()  
     runMorning = true
    
  --elseif ((actionTime == "12:00") and rollershutter_runs == 0 
   --  and temperatur >= 25)  
    -- then -- zusätzlicher Check um die Mittgaszeit falls man 
          -- keinen Sonnenschutz verwendet
    --     highNoon() 
  
  elseif ((actionTime == sunsetHour) and rollershutter_runs == 0 )    
     then --Abenddämmeung
     goodEvening()
     runEvening = true  

  elseif (actionTime == laterClose and rollershutter_runs == 0 )
     then -- Es wird/ist dunkel.
     goodNight()
     runNight = true
    
  elseif (actionTime == checkTime) then
     checkSUN = false 

-----------------------------  
-- Weitere Beispiele
-----------------------------
--  elseif (actionTime == randomMorning) --Oeffnen zu fester Uhrzeit + zufall 
--     then 
--     goodmorningSun()
 
--  elseif (actionTime == notafterE) -- Schliessen zu fester Uhrzeit    
--     then
--     goodNight()
--    
    
  end -- Ende der elseif Bedingungen
  
 
  if ((actionTime > newsunriseHour and actionTime < "20:00") -- Zeit in der auf Sonnenschutzbedingung gepüft wird
     and SUN_Protect == true) then
     check4sunProtect()  -- Pruefen ob der Sonnenschutz aktiviert werden soll
  end
    
    
  setTimeout(rollershutter, 60*1000);  
end -- function rollershutter

if (sourceTrigger["type"] == "autostart") then
	rollershutter();
end

Moin Jeep,

Ja, die Szene läuft einwandfrei. Ich hatte unten noch den Start der ‘highNoon’ Funktion auskommentiert und jetzt läuft auch der Sonnenschutz so wie ich mir das vorgestellt hatte. Saubere Arebeit. Ich wünschte ich könnte selbst auch solch komplexe Szenen schreiben, aber bei mir dauert so etwas ewig und das Ergebnis ist weit weniger elegant ;-).
Vielen Dank und Grüße
Alex

Hi Jeep,

Ich habe eine kleine Verständnisfrage:
Müssten die Zeilen 191 und 192 nicht vertauscht werden?
In Zeile 191 wird der Wert der Rolladenstellung ausgegeben, der erst in der folgen Zeile gesetzt wird.

@Dreibits
Hi, ist schon OK so, ich setze den Wert auf posOpen gleich für den Lauf am nächsten morgen. Es kann ja sein dass dann die Temperatur kleiner als 20° ist und dann würden die Rollläden trotzdem wieder auf 60% öffnen. So gehen sie wieder voll auf.
Trotzdem Danke dass Du Dir das Script so genau anschaust.

Hallo Jeep,

mal wieder ein schönes Script von Dir. Schau mir es gerade mal an und es reizt mich es gleich mal aus zu probieren. Finde es schön das man es auch leicht erweitern kann. In der Zeile 64 hast du noch ein Schreibfehler drin. Das “f” fehlt bei Fibaro ! Nur für die, welche Lua gar nicht beherrschen.

Den door sensor, der im Script mit angegeben ist, ist aber noch beachtet worden ! Im alten Rollladen Script ist dort die sperre drin, welche verhindert das bei geöffneter Tür die Rolladen runterfahren. Baust du den sensor noch ein ?

Grüße

Guido

Hallo Guido,

vielen Dank für den Hinweis, da ist vermutlich beim copy/paste das ‘f’ verlorengegangen. Und da ich meine Helligkeit aus der globalen Variable beziehe ist es mir nicht aufgefallen. Also Zeile 64 so einbauen:
brightness = tonumber(fibaro:getValue(luxSensorID, ‘value’)); --Wert des Luxsensors
Für den doorsensor kann ich mal eine Beispielfunktion liefern. Was mich da aber stört ist, dass das Script dann solange pausieren muss und eventuelle Bedingungen versäumt werden könnten und gegen die Vollautomatisierung wehrt sich meine Frau mit recht. Die sagt dann einfach gegen später(wenn wir das Terrassenlicht und Mondschein genug betrachtet haben) - “Alexa Terrassentür 0%” und alles ist gut.
Darum hab ich ja zwei Rollläden-Arrays für morgens öffnen und für abends schließen. Einfach die Terrassentür nicht im array “rollerIDsE” hinzufügen.

Abend,

bei mir ist es genau anders rum. Mein Frau weigert sich Alexa einzuführen und wenn wir dann Abends auf der Terrasse den Mond betrachten und die Zeit verfliegt und dann schließen die Rolladen, oh das wäre schlecht ! Wenn Du Lust und Zeit hast fände ich es schön wenn du mal eine Routine baust wo der door sensor mit eingebaut ist ! Deine Ideen wie du es umsetzt sind für ein “Lua-Lerner” immer sehr interessant.

Grüße, Guido

Hallo Guido,

ich habe mal was gebastelt so dass Ihr die Nacht nicht draußen verbringen müsst. ? Ich stelle es hier nur als ausführbares Beispiel ein so dass Du einen
Trockenlauf machen kannst.
Damit man sich nicht ausschießt gibt es jetzt 3 Möglichkeiten.

  1. Man trägt einen Rolladen NICHT in der Variable ‘rollerIDsE’, steht für “roller IDs Evening” ein. Dann wird nichts passieren aber er muss manuell geschlossen werden.
  2. Man trägt den/die Rollläden in der Variablen ‘rollerIDsNC’, steht für “Roller Ids Not Close” ein.
  3. Eine Kombination aus 1. und 2. wäre auch möglich.

Du kannst im unteren Script eine gültige Door ID eintragen, aber beliebige IDs für Rollläden. Die kannst auch so lassen. Das Script macht dann einen Trockenlauf.
Einfach auf Start klicken.
Werde die Beispiele und Änderungen am Wochenende ins Hauptscript übertragen.

--[[
%% properties
%% events
%% globals
--]]

local function Debug( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
end

local doorSensorID   = 122 -- ID of a door sensor
local rollerIDsM     = {150, 164, 100, 102} -- IDs der Rolllaeden für morgens {n1, n2, nn}
local rollerIDsE     = {150, 164, 100, 102} -- IDs der Rolllaeden für abends {n1, n2, nn}
local rollerIDsS     = {418} -- IDs der Rolllaeden für Sonnenschutz Suedseite 
local rollerIDsNC    = {164,102}  -- Not Close if conditions are true (Terrasse)
local posClose       = 0

-- Function zum ueberpruefen welche IDs im Falle einer offenen Tuer
-- nicht geschlossen werden sollen.
local function check4NC(id) --check the NotClose IDs if a door is open 
   for i=1,#rollerIDsNC do
      if rollerIDsNC[i] == id then 
         return true
      end
   end -- for
   return false
end

local function goodNightWdoorCheck()
  doorvalue = tonumber(fibaro:getValue(doorSensorID, 'value'))
  fibaro:setGlobal("rollershutter_runs", "1"); 
       Debug('green','Es ist ganz dunkel... schließe Rollladen');
       if (rollerIDsE[1] ~= nil) then
          Debug('blue','Rolllaeden werden geschlossen.' .. os.date("%c"))
          for r=1, #rollerIDsE do
             if rollerIDsE[r] ~= nil then
			    if check4NC(rollerIDsE[r]) and doorvalue == 1 then
                   Debug('green', rollerIDsE[r] .. ' wird nicht geschlossen' )
				else   
                   Debug('blue', rollerIDsE[r] .. ' wird geschlossen' )
                   --fibaro:call(rollerIDsE[r],'setValue', posClose )
                end
             end
             fibaro:sleep(math.random(2000,4000)) ;
          end -- for
       end  
       Debug('blue','Rolllaeden '..posClose..'% offen.');
       fibaro:setGlobal("rollershutter_runs", "0"); 
end -- function goodnightWdoorcheck

goodNightWdoorCheck()

-- Hier die Bedingung und Funktion die dann noch noetig ist, damit die 
-- Rolllaeden nach Schliessen der Tuer geschlossen werden.
-- Bedingung:

--[[ (+)
 elseif (actionTime > laterClose and rollershutter_runs == 0 )
     then -- Tuer zu, dann auch Rollladen zu.
     closeAllNC()
     -- nicht vergessen die Variable weiter oben im Originalscript
     -- zu initialisieren 
     runcloseAll = true 
--]]

-- Die Funktion 'Close All Not Closed' ist im Prinzip eine Kopie der 
-- goodNight(), mit dem Unterschied das die Rolllaeden aus dem Array 
-- rollerIDsNC geschlossen werden.

local function closeAllNC()
   fibaro:setGlobal("rollershutter_runs", "1"); 
   Debug('green','Es ist dunkel, alle Türen sind zu... schließe Rollladen');
       if (rollerIDsNC[1] ~= nil) then
          Debug('blue','Rolllaeden werden geschlossen.' .. os.date("%c"))
          for r=1, #rollerIDsNC do
             if rollerIDsNC[r] ~= nil then
                fibaro:call(rollerIDsNC[r],'setValue', posClose )
             end
             fibaro:sleep(math.random(2000,5000)) ;
          end --for
       end  
       Debug('blue','Rolllaeden '..posClose..'% offen.');
       fibaro:setGlobal("rollershutter_runs", "0");  
       runCloseAll = true --bereits gelaufen
end