Und noch ein Rollladen Script

Hi @Cruncher,

kein Problem, die Variablen (Zeile 33-36) muss man dann in den Bedingungen abfragen. Hier mal ein Beispiel:

...
 elseif (actionTime == laterClose  and runNight == false ) 
    or ( actionTime  >= notafterE and runNight == false)
      then -- Es wird/ist dunkel.
      goodNightWdoorCheck() -- goodNight() oder goodNightWdoorCheck() 
      runNight = true
elseif
...

In diesem Fall würden die Rollläden dann schon um 21:00 schließen. Später im Herbst würden die Rollläden schon vor 21:00 schließen wenn laterClose dann kleiner als 21:00 Uhr wird.
Wenn Du noch weitere Fragen hast, immer her damit.

Hallo Jeep,

vielen Dank, ich werde das morgen mal ausprobieren…
Eine Sache ist mir noch aufgefallen… der Sonnenschutz funktioniert soweit ganz gut. Der Rollladen im Schlafzimmer fährt komplett runter, die Lamellen bleiben offen - perfekt.
Die beiden definierten im Wohnzimmer fahren nur zur hälfte runter… irgendeine Idee ?

Gruß, Cruncher

Hi @jeep,

es wird heißer und heißer und Dein Script nimmt an Wichtigkeit zu… :slight_smile:
Heute Morgen hatte ich das “Problem”, dass der Sonnenschutz vor “goodmorningSun” (also dem vollständigen Öffnen der Rollos) bereits gegriffen hat. Das hängt natürlich mit den eingestellten Werten Temperatur und Lux für den Sonnenschutz, der Positionierung der Sensoren, sowie der Zeiten zusammen.
Eine Sperre, dass die Rollläden nicht mehr hoch fahren, wenn der Sonnenschutz bereits aktiviert ist, habe ich bereits einprogrammiert und scheint auch zu funktionieren.
Mein Problem was ich aber vermutlich haben werde ist, dass die Positionen der Rollläden vor Aktivierung des Sonnenschutzes gespeichert und nach Deaktivierung des Sonnenschutzes ja wieder in diese Postion fahren werden. Das würde in meinem Fall aber bedeuten, dass die Rollläden dann von sunProPos = 15 in die Position posClose = 9 fahren, was natürlich nicht gewünscht ist.
Ich könnte die Speicherung der Positionen entfernen und dafür die Rollläden wieder vollständig oder auf eine bestimmte Position wieder hochfahren lassen, aber eigentlich möchte ich Positionsspeicherung nicht vollständig aufgeben.

Wäre es möglich folgende Bedingung im Sonnenschutz einzubauen? Wenn ja wie?
Wenn die Position der Rollläden vor Aktivierung des Sonnenschutzes <= sunProPos (in meinem Fall <= 15) dann fahre vollständig hoch, ansonsten fahre die Rollläden auf Speicherposition.
Das müsste vermutlich hier eingebaut werden:

  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

Eigentlich sollte das theoretisch nicht allzu schwer sein, allerdings bin ich mit der Interpretation der Zeilen 5-7 etwas überfordert und das bremst mich, da einfach mal was dran auszuprobieren:
if tdev ~= nil then
wenn Werte (IDs der RollerShutter für den Sonnenschutz (rollerIDsS[r]) sowie deren Status (rollerStat)) in der Table tdev hinterlegt sind, dann
for r=1, #rollerIDsS do
diese Zeile verstehe ich nicht
fibaro:call(tdev[r][1],‘setValue’, tdev[r][2]
die in tdev hinterlegten Werte abrufen und setzen, aber warum und woher jetzt tdev[r][1] und tdev[r][2]?

Mein größtes Verständnisproblem sind wohl wieder die Variablen…

Ich würde mich freuen, wenn Du eventuell etwas Licht ins Dunkle bringen könntest.
Aber fühle Dich bitte nicht verpflichtet, ich habe Dich schon genug genervt. Und zur Not bleiben die Rollläden nach Deaktivierung des Sonnenschutzes halt unten oder ich entferne die Positions-Speicherung.

Gruß, Dirk

Hallo @dirkg173,

wenn der Sonnenschutz schon so früh greift, ist die Postion des Temperatursensor ziemlich falsch oder der Wert von “sunProTempOn” zu niedrig. Ich würde an Deiner Stelle erst dort ansetzen. Aber lass uns mal schauen ob ich Dich auch richtig verstanden habe.
Da wäre aber noch eine Option, keine Ahnung ob das bei Dir dann relevant ist und zwar statt:

 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

erst später z.B. ab 09:00 Uhr auf Sonnenschutz prüfen, also:

 if (actionTime > '09:00' 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

Ist nur so eine Idee. Aber natürlich können wir auch die Position vor der Aktivierung berücksichtigen. Die wird ja beim aktivieren gespeichert.

Zur Erklärung der Zeilen: Die ‘if’ Abfrage hast Du ja richtig gedeutet, die ‘for’ Schleife zählt die Variable ‘r’ die mit =1 initialisiert wird, bis zur #(Anzahl) der Rollläden in ‘rollersIDsS’ Array. Dabei wird bei jedem Durchlauf die ‘fibaro:call’ Anweisung ausgeführt und die Rollläden auf den Wert in der Tabelle ‘tdev’ gesetzt. tdev ist eine zweidimensionale Tabelle hat also für jede Zeile zwei Spalten, [r][1] bedeutet einfach Zeile ‘r’, Feld 1, da steht die ID des Rollladen.
[r][2] bedeutet das der in Feld 2 gespeicherte Wert Anwendung findet. Aufgelöst musst Du Dir das so vorstellen:

Feld1…Feld2
ID…Wert
Rollladen1…75
Rollladen2…60
Rollladen3…80

Man könnten jetzt in Deinem Fall einen Rollladen als Referenz nehmen und den Wert abfragen. Z.B. ‘wert = fibaro:getValue(rollerIDsS[r], ‘value’)’, wenn der noch nicht in einer Tabelle steht. Will man den Wert aus der Tabelle abfragen muss man dass mit 'wert = json.encode(tdev[r][2]) machen.
Aber ehrlich gesagt ich würde lieber mit den Positionen von Temperatur- und Helligkeitssensor experimentieren, dann ist es logischer und folgt dem natürlichen Rhythmus, erst hell dann warm.

Hi @jeep,

vielen Dank für Deine Antwort und den Tipp, den Sonnenschutz zeitlich begrenzt zu starten. Deine Erklärung zu den drei Zeilen habe ich auch erstmal so weit verstanden. Das müsste ich allerdings auch mal praktisch umsetzen, damit die Logik dahinter auch wirklich hängenbleibt.

Bzgl. des Temp.-sensors (Netatmo Outdoor): Der ist in einer Schutzhülle (TFA Dostmann) an der Nordseite des Hauses ziemlich optimal positioniert. Ohne direkter Sonneneinstrahlung (evtl. mal kurz ziemlich spät am Abend bei untergehender Sonne), ca. 10 cm von der Hauswand entfernt, vom leicht überstehendem Hausdach geschützt aber dennoch sehr gut durchlüftet.
Die vor Überhitzung zu schützende südliche Hausseite bekommt schon sehr früh viel Sonne ab. Um schon rel. früh der Sonneneinstrahlung entgegenzuwirken, habe ich sunProTempOn bewusst auf 20 °C eingestellt. Da gestern bereits schon sehr früh die Temperatur erreicht wurde, wurde der Sonnenschutz schon vor dem vollständigen Öffnen der Rollos aktiviert. Jetzt muss ich dazu sagen, dass aufgrund meiner Einstellungen (notbeforeM und offSetM)die Rollläden aktuell erst zwischen 07:45 Uhr und ca. 08:25 Uhr geöffnet werden. Somit hat sich das ganze überschnitten.

Sicherlich kann ich auch noch was mit den Temperaturen spielen, aber ich werde erstmal Deinen Tipp mit der Sonnenschutzprüfung ab einer definierten Zeit umsetzen, der gefällt mir sehr gut!

Vielen Dank nochmals und viele Grüße,
Dirk

Hi @dirkg173

alles klar, prima dass es mit dem Tipp den Sonnenschutz später zu Starten zu einer guten Lösung führt.

Hallo zusammen,

meine Frau hat so ziemlich alle meine Bugs aufgedeckt.? Heute erzählt sie mir dass sie gestern mit dem Sonnenschutz Probleme hatte. Auf meine Frage was los war, meinte sie mir das es Ihr am Nachmittag auf einmal zu dunkel war und sie einen Rollladen ganz öffnete.
Als dann ca. 1 Std. später der Sonnenschutz zurückgenommen wurde, fuhr genau dieser Rollladen wieder in eine 50% Position, (das war die gespeicherte Postion vor der Aktivierung) was ihr ja gar nicht passte.
Ich habe jetzt den Sonnenschutz ein wenig überarbeitet, so dass Rollläden die man während aktiven Sonnenschutz bewegt, beim zurücknehmen des Sonnenschutz nicht mehr beachtet werden.
Um den Sonnenschutz ein wenig intelligenter zu machen hat eine kurze ‘if’ Abfrage gereicht.
if ( tonumber(fibaro:getValue(rollerIDsS[r], ‘value’)) == sunProPos )

Hier ist die ganze Funktion die man einfach gegen die alte austauschen muss.

-- ===================================================
-- Funktionen fuer den Sonnenschutz ein und ausschalten
-- ===================================================
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
             -- Pruefung ob Rollladen in der Zwischenzeit bewegt wurde
             if ( tonumber(fibaro:getValue(rollerIDsS[r], 'value')) == sunProPos ) then
                fibaro:call(tdev[r][1],'setValue', tdev[r][2] )
             end
         end --for
     end
  end  
end  

Hi @jeep,

bin ich also nicht der einzige, der “Probleme” mit dem Sonnenschutz hat, das gefällt mir… :wink:
Vielen Dank für die Erweiterung!

Gruß, Dirk

Hallo,

besteht die Möglichkeit das man den Sonnenschutz für die Ost und West Seite noch mit einbaut?

Gruß
Tucher

@Tucher,
theoretisch schon. Dazu müsste man zusätzliche Sensoren (Temperatur und Helligkeit) für Ost und West haben.
Du kannst aber auch Deine Rollladen IDs in der Variable ‘rollerIDsS’ setzen und die Werte für sunProTempOn und sunProLuxOn anpassen. Ich schließe meine Südseite zusammen mit zwei Rolläden auf der Ostseite. Temperatursensor ist auf der Ostseite und LUXsensor ist SüdOstWest montiert. Muss dazu sagen mein LUXSensor misst von 0 bis 120.000 LUX.

Hey Jeep,

zunächst mal danke für das Script!!!
Ich fände es toll, den DoorCheck auch bei Sonnenschutz durchführen zu lassen, inkl. autom Rolladen schließen, wenn Tür verschlossen wird.

Gruß
Alando22

Hallo zusammen,

hier noch mal die komplette Version in der die vorausgegangenen Fixes und Erweiterungen eingepflegt wurden.
Es besteht also nicht unbedingt der Zwang zum Update. Das PDF werde ich gelegentlich aktualisieren.

--[[
%% autostart
--]]

-- Shutter_control.lua 
-- Section		: EG
-- Version      : 1.3.7
-- Release date : 20.06.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:00' -- nicht vorher Morgens 
local notafterM      = '08:10' -- nicht nach 08:10 
local notbeforeE     = '17: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,418} -- IDs der Rolllaeden für Sonnenschutz Suedseite 
local rollerIDsNC    = {418} -- 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   = true -- Soll der Sonnenschutz aktiviert werden (Sommerbetrieb = true)
local sunProLuxOn   = 30000 -- 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.7"
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
             -- Pruefung ob Rollladen in der Zwischenzeit bewegt wurde
             if ( tonumber(fibaro:getValue(rollerIDsS[r], 'value')) == sunProPos ) then
                fibaro:call(tdev[r][1],'setValue', tdev[r][2] )
             end
         end --for
     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 (holiday == 1) then einORkein = 'ein' else einORkein = 'kein' 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('lightblue','Heute ist '..einORkein..' Feiertag oder Wochenende.')  
      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.
     goodNightWdoorCheck() -- 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

2 „Gefällt mir“

Hallo Jeep, zZ läuft bei uns vers 1.3.5, immer mit den entsprechenden Funktionsänderungen. Ein großes Lob an Dich. Es funzt alles. Noch eine Frage habe ich zum Lux-Sensor. Ich benutze im Moment den Fibaro FGMS-001, den ich in eine Ecke verpflanzt habe, dass er nicht das volle Sonnenlicht abbekommt, ist ja irgendwo eine Grenze. Du schreibst … mein LUXSensor misst von 0 bis 120.000 LUX. Kannst Du vielleicht sagen, welcher Sensor das ist? Ich habe bisher keinen für z-wave gefunden.
viele Grüße
bieer

Hallo @bieer,
prima das Du es gut einsetzen kannst. Das Problem mit ZWave LUX-Sensoren hat mich auch gefrustet. Als ich vor gut 4 Jahren (von einem XS1 Gateway mit 433 und 866MHz) auf ZWave umgestiegen bin, habe ich feststellen müssen dass es keine vernünftigen LUX-Sensoren gibt. Ich war den heilfroh dass ich mein altes XS1 nicht in Ebay verscherbelt habe. Habe mir dann ein VD gebastelt dass per API-Request die Werte vom XS1 holt und in eine globale Variable schreibt. Jetzt wisst ihr auch warum ich alternativ eine globale Variable dafür im Script habe.
Ich habe wie Du auf den Foto (in der Mitte) erkennen kannst auch einen ZWave “Sensative Strips Comfort” am laufen. Der geht bis 60.000 LUX. Aber trotz korrekter Parameter Einstellungen sendet der die Werte in in viel zu langen Abständen. Der alte nicht Zwave-Sensor (im Bild das untere vergilbte Teil) macht das im 1.5 Minuten Takt. Weiss leider nicht ob es den noch gibt.
Für alle Fälle, das Model ist ein “WS 2500-19”. Hatte noch ein Erdspieß dran den ich aber abgeschraubt habe.
Ich glaube aber hier im Forum was über einen anderen ZWave LUX-Sensor gelesen zu haben. Kommt aus China, muss aber nicht schlecht sein. Ob es dafür einen Distributor gibt weiß ich nicht.

photo_2019-07-01_12-29-22.jpg

Falls nicht bekannt, über folgenden Link findet man für die verschiedenen Regionen alle zertifizierten Z-Wave Produkte: https://products.z-wavealliance.org/regions

Gruß
Dirk

Dieser hier misst bis 180.000 Lux. Ob dieser allerdings mit dem Fibaro HC2 kompatibel ist, kann ich nicht sagen:
https://products.z-wavealliance.org/products/2485

https://climax-deutschland.com/product/lm-1zw/

Hallo zusammen,

hab bei Climax angerufen. Lieferzeit 6 -8 Wochen. Habe 2 bestellt. Wichtig ist nur dass der Luxwert relativ schnell übertragen wird. Kann ich erst testen wenn er da ist. Dann wird sichs zeigen ob ich ca. 100.-€ in den Sand gesetzt habe. Danke @dirk-

Guten Abend zusammen,
ich habe eine Frage zu der Umsetzung von dem Skript. Sie wurde so ähnlich im Verlauf schon mal gestellt, aber ganz schlau geworden darauf bin ich immer noch nicht.
Es geht um die Zeiten. Ich habe die Szene gestern Abend getestet und verstehe den Ablauf nicht so ganz.
local notbeforeM = ‘08:00’ – nicht vorher Morgens
local notafterM = ‘09:00’ – nicht nach 09:00
local notbeforeE = ‘17:30’ –
local notafterE = ‘21:00’ –

Als Debug kommt raus:
[DEBUG] 16:09:11: Heute ist kein Feiertag oder Wochenende.
[DEBUG] 16:09:11: RealSunrise: 05:59
[DEBUG] 16:09:11: New SunRise: 06:42
[DEBUG] 16:09:11: Later Open: 07:33
[DEBUG] 16:09:11: –
[DEBUG] 16:09:11: RealSunset: 21:19
[DEBUG] 16:09:11: New SunSet: 21:47
[DEBUG] 16:09:11: LaterClose 22:23
[DEBUG] 16:09:11: Temperatur: 24.9° um 16:09
[DEBUG] 16:09:11: Helligkeit: 204Lux
[DEBUG] 16:09:11: ---------------------------------

Heute Morgen fuhren dann die Rolladen pünktlich um 05:59 hoch.
Wie bekomme ich es hin, dass sich die Zeiten für Öffnung und Schließung innerhalb des eingestellten Korridors befindet und würden mir die Zeiten dann auch als Debug ausgeschmissen.

Grüß
Apfelkind

@Apfelkind15

diese Variablen können (müssen aber nicht) benutzt werden um die Rollläden zu festen Zeiten zu öffnen
oder zu schließen oder in Kombination mit Sonnenaufgang und Sonnenuntergang, je nachdem was zuerst eintritt.

Beispiel: Der aktuelle Sonnenaufgang ist gerade so um ca. 06:00 Uhr. Der durch Zufall und monatliche änderbare
versetze Sonnenaufgang, kann also einen Wert von z.B. ca. 6:40 ergeben.
Ab Mitte September (je nach geografischer Lage) ist der Sonnenaufgang um ca. 07:00 Uhr und der versetzte
Sonnenaufgang könnte z.B. 07:20 Uhr sein.
Wenn die Rollläden jetzt nicht bis zum realen oder versetzten Sonnenaufgang warten sollen also immer
um spätestens 06:55 öffnen sollen kann man diese Bedingung definieren.


local notafterM = 06:55
--
if ((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
...

Die Bedingungen beginnen an Zeile 390.
Und wenn man den Sonnenaufgang gar nicht nutzen will lässt man die ‘oder’ Zeile weg.
Ich habe diese Variablen nicht im Debug eingetragen weil, einmal eingestellt, sie sich ja nie ändern.

1 „Gefällt mir“

Hallo Zusammen,

ich habe in einem anderen Blog ein Script gefunden, in dem ich meinen Google Kalender ins HC2 einbinden kann. Sobald dort ein Feiertag oder Urlaub eingetragen ist, wird ein Wert in einer Variablen gespeichert. Ich würde jetzt gern wissen, ob man dieses Rollladen Script so ändern kann, dass die Rollladen im Schlaf- und Gästezimmer später hochfahren, wenn Urlaub oder Feiertag im Kalender steht. Ich habe mal ein Bild der Variablen angehängt…

MfG, Cruncher

Variable.png