Und noch ein Rollladen Script

@jeep

Danke, da ist tatsächlich was beim kopieren schief gelaufen…

@ Jeep

in welcher Zeile finde ich denn die Variablensteuerung ?
Ich finde nichts wo ich den Wert ändern kann (version 1.3.1) :frowning:

@cruncher

setz einfach in der Variablensteuerung den Wert von „´rollershutters_runs“ auf 0
Dann sollte es funktionieren. Das kann passieren wenn das Script unkontrolliert beendet wird, oder zu viele Instanzen laufen.

Grüße, Jeep

@cruncher,
die Variable “rollershutter_runs” ist eine globale Variable, die musst Du im Menü, unter “Steuerungen-> Variablensteuerung” anlegen.

@ Jeep

ich habe es gefunden :slight_smile:
Vielen Dank…

Hallo @jeep,

ich würde gerne auch Dein Rolladen-Script ausprobieren. Du schreibst aber am 21.02.19, dass Du die Ver. 1.3.3 noch hochladen möchtest. Würdest Du das noch tun?
Als LUA-Neuling würde ich große Probleme haben in einem so komplexen Script irgendwelche Fehler zu finden und zu korrigieren.
Das kleine Script zur Überprüfung des Zustandes der Terrassentür habe ich bereits mit kleinen Modifikationen (ich nutze den POPP Tür-/Kippsensor mit zwei Zuständen) erfolgreich getestet.

Vielen Dank schon mal im Voraus!
Gruß, Dirk

Hi Dirk,

bitte schön, da ist es. Bitte das angehängte PDF beachten, da gibts noch Unterschiede zu den Vorgängerversionen.

--[[
%% autostart
--]]

-- Shutter_control.lua 
-- Section		: EG
-- Version      : 1.3.5
-- Release date : 22.04.2019
-- Copyleft     : 12-2016 - 2019 {jeep}

-- Documentation: RollerShutterControl1.3.5.pdf

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   = 462 -- 427 -- ID of temperature sensor (ZWeather)
local doorSensorID   = 202 -- nil ID of a door sensor
local lamp1ID        = 166 -- lamp ID(s) for presence simulation 

local randomMinValue = 5   -- kleinster Zufallswert
local randomMaxValue = 15  -- größter Zufallswert
local minuteslater   = 8  -- Initialisierung Variable fuer spaeteres Oeffnen oder Schliessen

local notbeforeM     = '07:40' -- 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 Abenddaemmerung {n1, n2, nn}
local rollerIDsN     = {150,}    -- IDs der Rolllaeden für Nachtanbruch bevor man schlafen geht 
local rollerIDsS     = {150,170,172} -- IDs der Rolllaeden für Sonnenschutz Suedseite 
local rollerIDsNC    = {} -- IDs der Rolllaeden die nicht geschlossen werden
                                 -- solange eine Tür offen ist.
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   = false -- 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 = 24  -- Temperatur ab der der Sonnenschutz deaktiviert wird
local sunProChkOff  = "20:00" -- (+) Ab dieser Zeit wird nicht mehr auf Sonnenschutz geprüft 
local sunProTimeOff = "19:30" -- (+) Zeit um der der Sonnenschutz auf alle Fälle beendet Wird.  
local sunProPos     = 15   -- Rollläden nicht ganz schließen, Schlitze verhindern 
                           -- Hitzestau und Schäden an den Lamellen.
local sunProtectActiv      -- = false                      
local debug   = true       -- debug ausgaben ja | nein
---------------End user defined variables ---------------------
local checkTime   = "03:15" -- Uhrzeit zur Feststellug des Sonnenauf- und untergangs für den nächsten Tag
local checkDay    = false   -- Die Variable stellt sich um 'checktime' auf true
local version     = "1.3.5"
temperatur = tonumber(string.format("%.2f",fibaro:getValue(TempSensorID, "value")));

if (sunProChkOff <= sunProTimeOff) then
   SUN_Protect  = false
   Debug('red', 'SunProChkoff muss groesser als sunProTimeOff sein.')  
   Debug('orange', 'Sonnenschutz wurde deaktiviert!')
end  

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

-- Korrektur des Sonnenauf und -untergangs über die Monate
-- 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] = "-20", [2] = "-5", [3] ="5", [4] = "15", [5] = "20", [6] = "25",
         [7] = "45", [8] = "30", [9] ="8", [10] = "5", [11] = "-5", [12] = "-20" }
  return tonumber(tabm[month])
end  

local function offSetE() -- offset evening
  local month = tonumber(os.date('%m'))
  local tabm = { [1] = "5", [2] = "12", [3] ="15", [4] = "10", [5] = "15", [6] = "10",
         [7] = "10", [8] = "15", [9] ="20", [10] = "15", [11] = "5", [12] = "2" }
  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
-- Neuen Sonnenaufgang berechnen
local 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
   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 

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
        if debug then print('Temperatur: '.. temperatur) end  
        if debug then print('Helligkeit: '.. brightness) end
        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 debug then print('Temperatur: '.. temperatur) end 
     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 
     or (os.date("%H:%M") >= sunProTimeOff and sunProtectActiv == true  ) then
     print('Sonnenschutz aus.')
     sunProtectActiv = false
     sunProtect("OFF") 
  end    
end 
-- Funktion 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 --

--
-- ========================================
-- Funktionen zum Oeffnen und Schliessen --
-- ========================================
--
local function earlymorning() -- 1.te Szene des Tages
   Debug('orange', 'Funktion earlymorning gestartet. ') 
   --fibaro:call(lamp1ID, "turnOn"); 
   if (rollerIDsM[1] ~= nil) then
      for r=1, #rollerIDsM do
         if rollerIDsM[r] ~= nil then
             rollerStat = tonumber(fibaro:getValue(rollerIDsM[r], 'value'))
             if debug then print('Rollerstat :'.. rollerStat) end
             if (rollerStat == 0) then 
                if debug then print(rollerIDsM[r]..' ist noch geschlossen') end
                fibaro:call(rollerIDsM[r],'setValue', posHalf )
             end
          end
         fibaro:sleep(math.random(4000,10000)) ; --4 bis 10 Sek. warten 
      end --for
   end  
   Debug('orange','Rolllaeden ' ..posQuarter..'% geoeffnet - ' .. os.date("%c"));
   
end  -- function earlymorning

local function goodmorningSun()
   Debug('yellow', 'Funktion goodmorning gestartet.') 
   --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;
end -- function goodmorningSun  

local function highNoon() 
   --Ersatzfunction falls man die Sonnenschutzfunktion nicht nutzt.  
   --Ausschlafen wird wieder deaktiviert  
   Debug('yellow', 'Funktion highNoon gestartet.') 
   Debug('yellow','Mittagshitze. Schließe Rollladen bis bis auf n% ' .. 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');
    Debug('darkorange','Lange ausschlafen ist abgeschaltet.');
end  -- function highnoon

local function goodEvening() --Abenddaemmerung/twilight
       Debug('darkorange', 'Funktion goodevening gestartet.')
       -- 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');
      
end --end function goodEvening

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

--- Funktion goodnight mit Doorcheck
--- Es darf nur eine goodnight Funktion aktiviert werden!
local function goodNightWdoorCheck() 
  Debug('green', 'Funktion goodNNightWdoorCheck gestartet.') 
  doorvalue = tonumber(fibaro:getValue(doorSensorID, 'value'))
  Debug('green','Es ist ganz dunkel... schließe Rollladen');
  if (rollerIDsN[1] ~= nil) then
      Debug('blue','Rolllaeden werden geschlossen.' .. os.date("%c"))
      for r=1, #rollerIDsN do
         if rollerIDsN[r] ~= nil then
            if check4NC(rollerIDsN[r]) and doorvalue == 1 then
               Debug('green', rollerIDsN[r] .. ' wird nicht geschlossen' )
            else   
               Debug('blue', rollerIDsN[r] .. ' wird geschlossen' )
               fibaro:call(rollerIDsN[r],'setValue', posClose )
            end
         end
         fibaro:sleep(math.random(2000,4000)) ;
      end -- for
  end  
  Debug('blue','Rolllaeden '..posClose..'% offen.');
  runNight = true
end -- function goodnightWdoorcheck

-- 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()
   Debug('blue', 'Funktion closeAllNC gestartet')
   Debug('green','Es ist dunkel, alle Türen sind zu... schliesse alle 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,4000)) ;
       end --for
   end  
       Debug('blue','Rolllaeden '..posClose..'% offen.');
       runCloseAll = true --bereits gelaufen
end  
---
---  Ende der Funktionen fuer Oeffnen oder Schliessen  ---
--- ================================================== ---

-- ######################################################
--                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 sleepin = tonumber(fibaro:getGlobalValue("Ausschlafen")) or 0;
runEarly,runMorning,runEvening,runNight,runcloseAll = false,false,false,false,false 
--
--
function rollershutter()  -- Hauptprogramm
   math.randomseed( os.time() ) 
   temperatur = tonumber(string.format("%.2f",fibaro:getValue(TempSensorID, "value")));
   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 currentDate = os.date("*t");
   local actionTime  = (string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min));
   local randminutes  = randomValue(randomMinValue, randomMaxValue)
   local minuteslater = randomValue(randomMinValue, randomMaxValue)  -- Spaeteres Oeffnen oder Schliessen
   --local minuteslater = randomValue(4,8)  -- Spaeteres Oeffnen oder Schliessen
   local holiday      = tonumber(fibaro:getGlobalValue("Feiertag_heute"));
   if (holiday == nil) then holiday = 0 end
  
   if ( checkDay == 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() )  
      sleepin = tonumber(fibaro:getGlobalValue("Ausschlafen")) or 0; -- wird über ein VD aktiviert
      randomMorning  = addrandom(notbeforeM,randomValue(4, 9)) -- morgens nicht vorher + Zufall
      temperatur = tonumber(string.format("%.2f",fibaro:getValue(TempSensorID, "value")));
      checkDay   = true
      runEarly,runMorning,runEvening,runNight,runcloseAll= false,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'));
      Debug('skyblue','Helligkeit: ' ..brightness.. 'Lux')
      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. Bitte beachten dass die Bedingungen
--- Funktionen nicht 2-fach aufrufen!  
---------------------------------------------------------------  
  if ((actionTime >= notbeforeM and actionTime <= notafterM) and runEarly == false 
     or (actionTime == newsunriseHour) and runEarly == false )     
     then --Morgenroete 
     earlymorning() --früh morgens, egal ob Werktag oder Feiertag 
     runEarly = true
    
  --elseif (actionTime >= notbeforeM and holiday == 1 
  --   and runEarly == false )  
  --   then --Morgenröte 
  --   earlymorning() -- es ist Feiertag, deshalb um notbeforM oeffnen  
  --   runEarly = true
    
  elseif (actionTime == laterOpen and sleepin == 0 
     and runMorning == false ) 
     then --es ist schon hell
     goodmorningSun()  
     runMorning = true
    
 -- elseif (actionTime == "12:00")  
    --  and temperatur >= 25) -- zusaetzlicher Check um die Mittgaszeit falls man 
   -- then                      -- keinen Sonnenschutz verwendet   
            
   -- highNoon() 
  
  elseif ((actionTime == newsunsetHour) )    
     then --Abenddaemmeung
     goodEvening()
     runEvening = true  

  elseif (actionTime == laterClose )
     then -- Es wird/ist dunkel.
     goodNight() -- oder  goodNight() oder goodNightWdoorCheck() 
     runNight = true
   
  elseif (actionTime > laterClose   
     and (tonumber(fibaro:getValue(doorSensorID, 'value')) == 0) 
     and runcloseAll == false  )
     then -- Tuer zu, dann auch Rollladen zu.
     -- Bitte diese Funktion mit Bedacht aktivieren. Nicht ohne Smartphone
     -- oder FB hinausgehen.
     closeAllNC()
     runcloseAll = true  

  elseif (actionTime == checkTime) then
     checkDay = false 
    
  end -- Ende der elseif Bedingungen
  
  if (actionTime > newsunriseHour and actionTime < sunProChkOff -- 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

Wow, vielen Dank!!

Werde die PDF-Datei beachten und berichten, ob ich es hinbekommen und durchgeblickt habe… :wink:

Nochmals vielen Dank!
Gruß, Dirk

Hallo Jeep,
vielen Dank für das tolle Script. Ich habe es seit einigen Tagen geladen und es arbeitet sehr gut, …bis auf Folgendes:

  1. Das Terrassenrollo sollte bei geöffneter Tür ja nicht runter fahren. Das wird ignoriert. Es fährt mit allen anderen zur gegebenen Zeit runter, ist aber nur separat unter rollerIDsNC eingetragen. Wird es per Handschalter einzeln wieder geöffnet, fährt es selbständig nach ein paar Minuten wieder runter.

  2. Feiertage oder Sonntag -heute bzw -morgen werden nicht berücksichtigt und logischerweise auch nicht angezeigt, es gibt ja kein Debug dafür. Die 3 Globalen und das Feiertags-Script sind installiert.

Muss ich da eventuell noch was nachträglich eintragen. Es wäre schön, wenn es hierzu eine Info gäbe.
Viele Grüße
bieer

@bieer,

schön das es Dir gefällt. Zu 1., vermute ich folgendes:

284 --- Funktion goodnight mit Doorcheck
285 --- Es darf nur eine goodnight Funktion aktiviert werden!
286 local function goodNightWdoorCheck() 

Hast Du die richtige Function aufgerufen? Und nur eine der beiden. Entweder die mit doorCheck oder die goodNight ohne doorCheck.

Zu 2.
Das ist richtig dass es keine Debug-Ausgabe für den Feiertag gibt. Habe ich jetzt nachgeholt. Bitte Zeile 357 durch folgende ersetzen:
if (holiday == nil) then holiday = 0; einORkein = 'kein' else einORkein = 'ein' end

Dazu noch hinter Zeile 369 diese Zeile einfügen:
Debug('lightblue','Heute ist '…einORkein…' Feiertag oder Wochenende.')

Diese Code-Zeilen haben keine Auswirkungen auf die Funktionalität. Sie sind nur für die Debug-Ausgabe ob Feiertag oder nicht.

Es gibt ab Zeile 397 bis 401 ein Beispiel wo der Feiertag in der Bedingung abgefragt wird. Ich hab das nicht explizit aktiviert da es vermutlich nicht bei jedem passt. Aber die Bedingungen an eigene Bedürfnisse anzupassen sollte kein allzu großes Problem darstellen.
Noch 'ne kurze frage zum “Ausschlafen VD”. Hast Du das installiert? Dafür gibt es auch ein Beispiel der Bedingung in Zeile 403, da geht dann kein Rollladen auf wenn ‘sleepin’ auf 1 steht.
Wenn es noch Probleme geben sollte bitte hier melden.

@bieer,

da war ich wohl ein wenig zu schnell. Also für Punkt 2 sollte es korrekt so lauten:
Nach Zeile 357 diese Zeile einfügen: if (holiday == 1) then einORkein = 'ein' else einORkein = 'kein' end
Die Debug-Ausgabe nach Zeile 369 bleibt wie angegeben.

Hallo @jeep,

ich bin gestern auch endlich mal dazu gekommen Dein Script auszuprobieren.
Das Schließen der Rollläden abends hat soweit in 2 Stufen funktioniert, allerdings haben sich die Rollläden erst ca. 20-30 Minuten nach “notafterE” vollständig geschlossen (?). Heute Morgen haben sich die Rollläden nicht geöffnet, hatte allerdings einen Fehler eingebaut, den ich aber schon korrigieren konnte. Zumindest hat die Simulation mit einer gesetzten “newsunriseHour” soweit funktioniert, dass die Rollläden auf 25 % geöffnet haben. Mal abwarten, wie es morgen ausschaut.

Wie Du vielleicht schon erkannt hast, blicke ich bei den Zeiten leider nicht ganz durch. Prinzipiell kann ich zwar nachvollziehen, wie die einzelnen Zeiten berechnet werden, aber wie ich sie konkret beeinflussen kann, verstehe ich nicht ganz. Wie kann ich z.B. sicherstellen, dass die Rollläden werktags nicht vor 7:30 Uhr und am Wochenende und an Feiertagen (Feirtage-Script läuft) nicht vor 8:30 Uhr geöffnet werden, wenn der Sonnenaufgang vor den jeweiligen Zeiten liegt. In der dunkleren Jahreszeit sollten die Rollläden dann aber ungefähr entsprechend der Sonnenaufgangszeiten öffnen. Dasselbe gilt für das Schließen der Rollläden.
Muss ich das über die “Sonnenauf-/-untergangs Korrektur” steuern?
Kann ich die Zeiten zwischen “earlymorning()” und “goodmorningSun()” bzw. “goodEvening()” und “goodNightWdoorCheck()” so beeinflussen, dass eine Mindestzeit z.B. von 30 Minuten dazwischen liegt? Wenn ja, wie?

Unabhängig von meinen Fragen, aber kann es sein, dass Du “timeStringMIN” zweimal unterschiedlich definierst? Siehe Zeile 107 und 108 bzw. auf dem Screenshot.

Vielen Dank im Voraus!

Gruß, Dirk

Bildschirmfoto.jpg

Hallo @dirkg173,

kein Problem. Im Prinzip ist es recht einfach wenn man die Logik verstanden hat. Hier mal ein Beispiel dass Deinen Wunsch berücksichtigt:

 
local notbeforeM ='07:30'

if (actionTime >= newsunriseHour
      and actionTime >= notbeforeM 
      and holiday == 0 --Werktag
      and runEearly == false)
  then 
    functionxy() -- Beispiel
    Debug('green', 'Rollläden durch Funktion xy geöffnet') 
    runEarly = true 
      
  elseif
    (actionTime >= newsunriseHour 
      and actionTime >= '09:30' 
      and holiday == 1 -- Feiertag 
      and runEearly == false)
   then 
    functionxy() -- Beispiel
    Debug('green', 'Rollläden durch Funktion xy geöffnet')
    runEarly = true
      
  elseif ... u.s.w.      

Für Abends dann analog zum obigen Beispiel verfahren. Nicht vergessen die Variable für eine gelaufene Function (z.B. runEarly) wieder auf ‘true’ setzen so dass die Function beim nächsten Durchlauf nicht wiederholt wird.

Die Zeiten zwischen den 2 morgendlichen und abendlichen Funktionen liegen im Sommer so ca 30 Min. auseinander. Dies kann man mit den Variablen in den Zeilen 29-31 beeinflussen.

Zu Deiner Frage mit der Definition der timeStringMIN Variable - sie wird nicht zweimal unterschiedlich definiert, sondern verändert. Der Zufall wird noch hinzuaddiert.
Natürlich hätte ich es in eienr Zeile machen können, aber zu der Zeit konnte man das LUA-Eingabefenster nicht so frei positionieren wie jetzt.
Und kurze Zeilen sind besser lesbar. :wink:
a = 1
a = a + 1
Bedeutet das a jetzt den Wert 2 hat.
Viel Erfolg und wenn Du noch Fragen hast, dann gibt s meistens innerhalb eines Tages 'ne Antwort.

Hallo @jeep,

vielen Dank für das Beispiel. Ehrlich gesagt blicke ich noch nicht ganz durch, werde mich aber erst mal selber dran versuchen, bevor ich wieder um Hilfe bettle… :wink:
Kennst Du eigentlich das “Feiertage und Termine aus dem Google Kalender”-Script (einfach mal nach googeln, Uploadfilter (?) sei dank)? Man kann über den Google-Kalender außer Wochenenden und Feiertage ganz einfach auch andere Termine hinzufügen, z.B. Urlaubstage, Krankheitstage, etc., die dann entsprechend eine globale Variable auf 1 setzen. Mit dieser Möglichkeit ist man wesentlich flexibler als nur mit dem reinen Feiertags-Script.

Hallo @bieer,

das Problem, dass das Terrassenrollo runter geht, habe ich auch (gehabt!?). Das Problem ist, dass der Doorcheck NICHT in der goodEvening() Funktion berücksichtigt ist, sondern nur in der goodNightWdoorCheck() Funktion, deshalb fährt das Rollo bei geöffneter Terrassentür auf 50 % runter (zumindest bei mir). Ich habe versucht das auch in der goodEvening() Funktion zu integrieren und werde es heute oder morgen Abend ausprobieren und bescheid geben, ob es funktioniert hat.

Gruß, Dirk

Hallo @jeep,

ich hätte noch nochmal eine Fragen.
Was bedeutet diese Zeile?
local newsunriseHour, laterOpen = calcTime(sunriseHour, tonumber(randminutes) + offSetM() )

Dass dadurch die “newsunriseHour” berechnet wird ist klar, aber wie muss ich den ersten Teil deuten? Und wozu steht dort “laterOpen”?

local newsunriseHour, laterOpen

Hallo @Dirkg173,

diese Zeile ruft die function calcTime() auf und dient der Berechnung eines neuen Wertes für den verzögerten Sonnenaufgang(function earlymorning) und noch einen Wert laterOpen für die function goodmorningSun().

Der erste Teil bedeutet nur dass ich nach Ausführen von calcTime() 2 Rückgabewerte empfangen werde - newsunriseHour und lateropen. Eine Function kann ja mehrere Rückgabewerte enthalten.
Siehe Zeile 121 von calcTime. Lass dich hier nicht vom Namen der Rückgabevariabeln verwirren. Ich benutze die gleiche Function zum berechnen von neuen Sonnenaufgang und neuen Sonnenuntergang, füttere sie aber mit unterschiedliche Werten. Siehe nächste Zeile.
newsunsetHour, laterClose = calcTime(sunsetHour, tonumber(randminutes) + offSetE() )

Die Verwendung von vielen Funktionen und Variablen macht das Script flexibler, leichter lesbar und wartungsfreundlicher. Änderungen können schneller implementiert werden, da immer nur kleinere Codeabschnitte angepasst werden müssen.
Vielleicht sollte ich im Readme-PDF die Funktionen kurz erklären. Weiß aber nicht ob dass dann zu aufgebläht wirkt.

Hallo @jeep,

vielen Dank für Deine Hilfe, aber ich verstehe es einfach nicht.
Dass man durch
local newsunriseHour, laterOpen = calcTime(sunriseHour, tonumber(randminutes) + offSetM() )
Rückgabewerte erhält (newsunriseHour und laterOpen), leuchtet mir noch ein.
Aber warum bekommt man zwei unterschiedliche Werte? Und wie errechnet sich “laterOpen”?

Entschuldige bitte die ganzen (blöden) Fragen. Für mich als Lua-Anfänger ist es echt schwer da durchzublicken.

Gruß, Dirk

Hi @dirkg173,
kein Problem. Ich kann zwar programmieren kann aber verdammt schlecht was erklären. Das ist auch die Meinung meiner Frau und der muss ich einfach glauben.
Also ich probiers nochmal - die Ganze Logik der Berechnungen steckt ja in der Funktion calcTime() ab Zeile 103 die mit den zwei Parametern (sunsetHour und tonumber(randminutes) + offSetE() oder offSetM() ) aufgerufen wird.
Darüber ab Zeile 97 ist noch die Funktion ‘randomValue’ die die Zufallsminuten generiert.
Im ersten Teil von calcTime() wird der String von sunsetHour oder sunriseHour in Zahlen zerlegt und die Berechnungen durchgeführt. Da wird auch das laterClose oder laterOpen errechnet. Im Zweiten Teil von calcTime() wird dann zum Schluss alles wieder nach String (HH:MM) umgewandelt.
Die letzte Zeile in der Funktion calcTime() lautet: return newtimeString, laterClose ;. Also die Funktion gibt diese 2 Werte wieder an den Aufruf der Funktion zurück und schreibt sie in ‘newsunriseHour’ und ‘laterOpen’. Die Namen der Übergebenen Variablen und der Empfangenden müssen nicht identisch sein. Sie werden der Reihe nach abgelegt.

Vielleicht mal ein einfaches Beispiel :

local x = 2
local y = 4

local function berechne( a , b) -- vereinfachte Function für calcTime()
  a = a + 2
  b = b + 2
  return a , b  
end  

local newsunsetHour, laterClose = berechne( x , y ) 
print(newsunsetHour) 
print(laterClose)

Wenn Du diesen Code ausführst wird es bestimmt klarer.
Bis zum nächsten mal. :wink:

Hi @jeep,

nachdem ich jetzt anhand Deines Beispiels ein bisschen mit den Variablen, Zahlen und Namen rumgespielt habe, verstehe ich es jetzt. Vielen Dank dafür!!!

Für mich, der noch nie was mit Programmierung zutun hatte und auch nicht die Bedeutung aller Lua-Befehle kennt, ist es dennoch nicht ganz einfach durch so ein komplexes Script durchzublicken. Deshalb bin ich leider hin und wieder auf so hilfsbereite User wie Dich angewiesen. Mit einfachen Blockszenen kommt man ja leider nicht weit.

Vielen Dank nochmals und ein schönes langes Wochenende!

Gruß, Dirk

Hi @jeep!

Danke für das super Skript.
Zwei Dinge versteh ich allerdings nicht:

  1. Wozu benötige ich den Offssets für Sonnenauf-/untergang?
    Fibaro liefert doch Minuten genau Zeitpunkt für jede Location?
    Die passen für mich ziemlich gut.

  2. Wozu der random Faktor in der Zeitberechung?
    Warum sollt ich wollen, dass die Rollläden zu (relativ gesehen/abgesehen von Sunset verschiebungen, Feiertag etc.) verschiedenen Zeiten aufgehen!?

lg

Hi @Canuck54,

prima wenn es für Dich so passt. Du kannst natürlich sunriseHour und sunsetHour in den Bedingungen verwenden.
Denn random Faktor habe ich mit eingebaut um eine Anwesenheit zu simulieren, das war mein Ziel als ich vor ca 2 1/2 Jahren das Script angefangen habe. (Wir waren schon mal 2 Wochen weg ohne dass unsere Nachbarn das bemerkt haben.)
Die Offsets für Sonnenaufgang und -untergang habe ich deshalb gewählt weil wir einfach Langschläfer sind und es uns stört wenn zu dieser Zeit (aktueller sunrise ca. 4:45) die Rollläden im Schlafzimmer oder Wohnzimmer aufgehen.
Abends lasse ich sie ein wenig früher runter aber nicht ganz, so das der andere Nachbar nicht in unser großes Panoramafenster im Wohnzimmer reinglotzen kann.
Aber Du kannst auch den offset ignorieren. Am besten für alle Monate 0 (null) eintragen. Dann musst Du im Script nicht so viel ändern.
Viel Spaß mit dem Script.