Sonnensteuerung

hallo Ich bräuchte mal eure Hilfe habe mir diesesn LUA code entsprechent angepasst.
Es geht um die Automatische Steuerung der Rolladen bei sonne via Motion Sensor. Sie Soll den LUX messen. Ist ein schwellwert erreicht dann nach x Zeit runter fällt der LUX unter einen schwellwert dann nach x Zeit hoch. leider geht das so nicht wie ich mir das Vorstelle mit unter gar nicht

ich habe die Variablen angelegt

SunFirstMax = 0
SunFirstMin = 0

TagNacht mit 0 & 1
RolloSunDown mit 0 & 1

hier der Code vieleicht mache ich ja was falsch ?? wäre schön wenn jemand helfen könnte Vielen Dank

–[[
%% autostart
%% properties
320 value
%% globals
–]]

local startSource = fibaro:getSourceTrigger();
function tempFunc()

if (tonumber(fibaro:getGlobalValue(“TagNacht”)) == tonumber(“1”) ) then
local startSunLux = 4100; – über 4100 Lux für zu
local startSunDelay = 300000; – 3 Min bis zu
local endSunLux = 1000; – unter 1000 Lux für auf
local endSunDelay = 300000; – 3 Min bis auf
local gSunFirstMax = (fibaro:getGlobal(“SunFirstMax”));
local gSunFirstMin = (fibaro:getGlobal(“SunFirstMin”));
gSunFirstMaxTime = tonumber(gSunFirstMaxTime)
gSunFirstMaxTime = fibaro:getGlobalModificationTime(“SunFirstMax”);
gSunFirstMinTime = fibaro:getGlobalModificationTime(“SunFirstMin”);
gSunFirstMinTime = tonumber(gSunFirstMinTime);
local currentLux = tonumber(fibaro:getValue(320, “value”));
– currentLux = 17000;
– nur für Debug !!
fibaro:debug("— Current Lux: " … currentLux … " RolloDown: " … fibaro:getGlobalValue(“RolloSunDown”) … " parallele Szenen: " … fibaro:countScenes() … " —");

if ( currentLux >= startSunLux and fibaro:getGlobalValue(“RolloSunDown”) ~= 1) then
if (gSunFirstMaxTime == 0 or gSunFirstMaxTime == nil or gSunFirstMax == 0) then
fibaro:setGlobal(“SunFirstMax”,currentLux);
fibaro:debug(“New Max Timestamp (Down)”);
setTimeout(tempFunc, startSunDelay) – sicherheitshalber diese Szene / Funktion schonmal für zukünftigen Zeitpunkt aufrufen, falls es da dann keinen Trigger gibt
elseif (os.time() - gSunFirstMaxTime >= startSunDelay ) then

fibaro:call(133, “setValue”, “45”);
fibaro:call(72, “setValue”, “45”);
–fibaro:call(113, „setValue“, „45“);
–fibaro:call(114, „setValue“, „45“);

fibaro:debug("*** Aktion: ZU nach " … os.time() - gSunFirstMaxTime);
fibaro:setGlobal(“RolloSunDown”,1);
else
fibaro:debug("Restzeit bis zu " … os.time() - gSunFirstMaxTime - startSunDelay);
end
else
fibaro:setGlobal(“SunFirstMax”,0);
fibaro:debug(“RolloDown Restzeit reset”);
end

if ( currentLux <= endSunLux and fibaro:getGlobalValue(“RolloSunDown”) == 1)
then
if (gSunFirstMinTime ~= 0
or gSunFirstMinTime == nil
or gSunFirstMin == ‘0’)
then
fibaro:setGlobal(“SunFirstMin”, currentLux);
fibaro:debug(“New Min Timestamp (Up)”);
setTimeout(tempFunc, endSunDelay)
–sicherheitshalber diese Szene / Funktion schonmal für zukünftigen Zeitpunkt aufrufen, falls es da dann keinen Trigger gibt
elseif (os.time() - gSunFirstMinTime >= endSunDelay) then

fibaro:call(133, “open”);
fibaro:call(72, “open”);
–fibaro:call(118, “open”);
–fibaro:call(120, “open”);

fibaro:debug("*** Aktion: AUF nach " … os.time() - gSunFirstMinTime);
fibaro:setGlobal(“RolloSunDown”,0);
else
fibaro:debug("Restzeit bis auf " … os.time() - gSunFirstMinTime - endSunDelay);
end
else
fibaro:setGlobal(“SunFirstMin”,0);
fibaro:debug(“RolloUp Restzeit reset”);
end
else
fibaro:debug(“Nachtabschaltung”);
end
end

if ( startSource[“type”] == “other” ) then
– manueller Start der Szene
if (fibaro:getGlobalValue(“RolloSunDown”) == 1) then
fibaro:debug(“Manuelles sofortiges Öffnen…”);
fibaro:call(133, “open”);
fibaro:call(72, “open”);
–fibaro:call(118, „open“);
–fibaro:call(120, „open“);
fibaro:setGlobal(“RolloSunDown”,0);
else
fibaro:debug(“Manueller sofortiger Sonnenschutz…”);
fibaro:call(133, “setValue”, “45”);
fibaro:call(72, “setValue”, “45”);
–fibaro:call(116, „setValue“, „45“);
–fibaro:call(114, „setValue“, „45“);

fibaro:setGlobal(“RolloSunDown”,1);
end
else
– automatischer Lauf
fibaro:debug("Scene läuft… ");
tempFunc();
end

Und was genau läuft an deinem Code nicht?

hi hoggle

also

  1. wenn er über 4100 LUX ist triggert er und es kommt eine Debug
    “Aktueller LUX zahl und restzeit bis zu -xxxxx” aber die rollos gehen nicht zu… ?? setzte ich den wert also “local startSunDelay = 60000” sollte er ja wenn er über 4100 geht in 60 sec zufahren … macht er aber nicht er fährt gar nicht zu… setzte ich den wert auf 10sec also 10000 geht er sofort zu… und warte keine 10sec.

  2. auf geht er gar nicht dann kommt nur eine Debug

rollodown restzeit reset
rolloup restzeit reset

gruß

Moin,

also wenn das oben dein Code ist, dann sind da noch relativ viele Zeichenfehler drin. Zumindest wenn ich mir das ganze in Notepad angucke. Womit ich damals das Problem hatte, waren diese “Wellen” (ich meine Ungleich?). Also hab ich hier ganz viel umgemodelt statt “~= 1” hab ich einfach “== 0” genommen.
Zudem hab ich Sachen wie currentLux mit tonumber(currentLux) umschlossen, da er sonst nicht wollte.
Hier mal mein Code, ich hoffe er kopiert das richtig… Ich hab die *1000 allerdings im Code so kann man oben die Sekunden angeben

Ich merk schon er macht es irgendwie nicht.

Ah jetzt siehe unten

--[[
%% autostart
%% properties
33 value
%% globals
--]]

local startSource = fibaro:getSourceTrigger();
function tempFunc()
  
if (tonumber(fibaro:getGlobalValue("TagNacht")) == tonumber("1") )
and (fibaro:getGlobalValue("Abwesenheit") == "ANwesend")
then
local startSunLux = 700; -- über 1.000 Lux für zu
local startSunDelay = 300; -- 5 Min bis zu
local endSunLux = 40; -- unter 200 Lux für auf
local endSunDelay = 1200; -- 20 Min bis auf
local gSunFirstMax = (fibaro:getGlobal("SunFirstMax"));
local gSunFirstMin = (fibaro:getGlobal("SunFirstMin"));
--gSunFirstMaxTime = tonumber(gSunFirstMaxTime)
gSunFirstMaxTime = fibaro:getGlobalModificationTime("SunFirstMax");
gSunFirstMinTime = fibaro:getGlobalModificationTime("SunFirstMin");
--gSunFirstMinTime = tonumber(gSunFirstMinTime);
local currentLux = tonumber(fibaro:getValue(33, "value"));
--currentLux = 17000; -- nur für Debug !!
fibaro:debug("— Current Lux: " .. currentLux .. " RolloDown: " .. fibaro:getGlobalValue("RolloSunDown") .. " parallele Szenen: " .. fibaro:countScenes() .. " —");
local instances = tonumber(fibaro:countScenes());
if (instances > 1) then fibaro:abort(); end    
if ( tonumber(currentLux) >= tonumber(startSunLux) and tonumber(fibaro:getGlobalValue("RolloSunDown")) == tonumber("0") ) then
if (tonumber(gSunFirstMaxTime) == tonumber("0") or gSunFirstMaxTime == nil or tonumber(gSunFirstMax) == tonumber("0")) then
fibaro:setGlobal("SunFirstMax",currentLux);
fibaro:debug("New Max Timestamp (Down)");
setTimeout(tempFunc, startSunDelay*1000) -- sicherheitshalber diese Szene / Funktion schonmal für zukünftigen Zeitpunkt aufrufen, falls es da dann keinen Trigger gibt
elseif (os.time() - gSunFirstMaxTime >= startSunDelay ) then

fibaro:call(11, "setValue", "45");
fibaro:call(15, "setValue", "45");
--fibaro:call(113, „setValue“, „45“);
--fibaro:call(114, „setValue“, „45“);

fibaro:debug("*** Aktion: ZU nach " .. os.time() - gSunFirstMaxTime);
fibaro:setGlobal("RolloSunDown",1);
else
fibaro:debug("Restzeit bis zu " .. os.time() - gSunFirstMaxTime - startSunDelay);
end
else
fibaro:setGlobal("SunFirstMax",0);
fibaro:debug("RolloDown Restzeit reset");
end

if ( currentLux <= endSunLux
and tonumber(fibaro:getGlobalValue("RolloSunDown")) == tonumber("1") )
then
if (tonumber(gSunFirstMinTime) == tonumber("0")
or gSunFirstMinTime == nil
or tonumber(gSunFirstMin) == tonumber("0"))
then
fibaro:setGlobal("SunFirstMin", currentLux); 
fibaro:debug("New Min Timestamp (Up)");
setTimeout(tempFunc, endSunDelay*1000);
--sicherheitshalber diese Szene / Funktion schonmal für zukünftigen Zeitpunkt aufrufen, falls es da dann keinen Trigger gibt
elseif (os.time() - gSunFirstMinTime >= endSunDelay) then

fibaro:call(11, "open");
fibaro:call(15, "open");
--fibaro:call(118, "open");
--fibaro:call(120, "open");

fibaro:debug("*** Aktion: AUF nach " .. os.time() - gSunFirstMinTime);
fibaro:setGlobal("RolloSunDown",0);
else
fibaro:debug("Restzeit bis auf " .. os.time() - gSunFirstMinTime - endSunDelay);
end
else
fibaro:setGlobal("SunFirstMin",0);
fibaro:debug("RolloUp Restzeit reset");
      
end
else
fibaro:debug("Nachtabschaltung");
end
end

if ( startSource["type"] == "other" ) then
-- manueller Start der Szene
if (tonumber(fibaro:getGlobalValue("RolloSunDown")) == tonumber("1") ) 
and (tonumber(fibaro:getGlobalValue("TagNacht")) == tonumber("1") )
and (fibaro:getGlobalValue("Abwesenheit") == "ANwesend")
    then
fibaro:debug("Manuelles sofortiges Öffnen..");
fibaro:call(11, "open");
fibaro:call(15, "open");
--fibaro:call(118, „open“);
--fibaro:call(120, „open“);
fibaro:setGlobal("RolloSunDown",0);
else
fibaro:debug("Manueller sofortiger Sonnenschutz..");
fibaro:call(11, "setValue", "45");
fibaro:call(15, "setValue", "45");
--fibaro:call(116, „setValue“, „45“);
--fibaro:call(114, „setValue“, „45“);

fibaro:setGlobal("RolloSunDown",1);
end
else
-- automatischer Lauf
fibaro:debug("Scene läuft.. ");
tempFunc();
end

So schreib es mal hier, da es vielleicht doch etwas mehr Text ist-

TagNacht steuer ich mit einer Tageszeiten Szene (Sonnenaufgang / Sonnenuntergang)
Die anderen Variabeln werden hier entsprechend gesetzt, es kommt bei mir aber vor das die Sonne teilweise bis abends auf unserer Terasse ist und sie somit nicht hochfahren vor Sonnenuntergang, deswegen setze ich in meiner Szene (Abends_Morgens_Rolladen) die Variabeln noch mal sicherheitshalber auf “0”. Damit er morgens nicht denkt das Rollo wäre unten und er fährt es bei Sonne nicht runter.