Rolladen mit LUA ansteuern

Hallo miteinander,

ich habe vor einen (oder mehrere) Rollanden zu einer bestimmten Zeit anzusteuern und zu bewegen.
nur ist die bestimmte zeit Variable (Sonnenaufgang und Sonnenuntergang) und das Bewegen bezieht sich auf drei Zustände: Geschlossen, Offen und “etwas offen”.

Ich hab mich mal in dem Code probiert und folgendes programmiert:

--[[
%% autostart
%% properties
%% weather
%% events
%% globals
--]]

local sourceTrigger = fibaro:getSourceTrigger();
function tempFunc()
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
 ( ((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == fibaro:getValue(1, "sunriseHour")) )
)
then
	fibaro:call(6, "setValue", "40");
end
if (
 ( ((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7) and os.date("%H:%M", os.time()-60*60) == fibaro:getValue(1, "sunriseHour")) )
)
then
	fibaro:call(6, "open");
end
if (
startSource["type"] == "other"
)
then
	setTimeout(function()
		fibaro:call(8, "close");
	end, 30000)
end
setTimeout(tempFunc, 60*1000)
end
if (sourceTrigger["type"] == "autostart") then
tempFunc()
else

local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
startSource["type"] == "other"
)
then
	fibaro:call(6, "setValue", "40");
end

end

Scheint aber nicht so ganz zu funktionieren.

Habe den Haken bei automatisch Starten gesetzt, aber was sich hinter max. ausgeführten Instanzen verbirgt, weiß ich nicht :-/

Wäre toll, wenn man mir sagen könnte, wo ich meinen Denkfehler habe.

Grüße Andreas

test.png

Hi,
Hast Du dir folgenden Beitrag angesehen?
https://www.siio.de/board/thema/rollladen-steuerung-sonnenaufgang-untergang/

Versuche im ersten Schritt mal das umzusetzen und dann deinen Spezialpart.

Viele Grüße Hoggle

Hallo Hoggle,

hab mir den Beitrag angesehen, denke für den Tipp. Sehe ich das richtig, dass der Rolladen dann überhaupt nicht geöffnet/geschlossen wird, wenn die Temperaturen unter 0°C sind? Muss man dann wohl per Hand betätigen.

Um den Rolladen nur zum Teil zu öffnen muss man dann zwangsläufig den Code so verändern:



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
--[[
%% autostart
%% properties
%% globals
--]]
 
local sourceTrigger = fibaro:getSourceTrigger();
local version = '2.0';
 
fibaro:debug('Rollladen-Steuerung erstmalig gestartet (Ver.' .. version .. ')');
 
function rollershutter()
    local version = '2.0';
    local sunriseHour = fibaro:getValue(1,"sunriseHour");
  	local sunsetHour = fibaro:getValue(1,"sunsetHour");
    local currentDate = os.date("*t");
  	local temp = tonumber(fibaro:getValue(3, "Temperature"));
  	local rollershutter_runs = tonumber(fibaro:getGlobalValue("rollershutter_runs"));
  	local random = math.random(35);
  	local min = math.floor((random*100)/60);
 
if ((((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == sunriseHour)) and rollershutter_runs == 0 and tonumber(temp)>=0)
  			then
      		fibaro:debug('Rollladen-Steuerung gestartet (Ver.' .. version .. ')');
          fibaro:setGlobal("rollershutter_runs", "1");
      		fibaro:debug(Sonnenaufgang. Öffne Rollladen einen Spalt');
      		fibaro:debug('Warte ' .. min .. ' min');
          fibaro:sleep(random*100000);
			fibaro:call(48, "setValue", "40");
      		fibaro:debug('Rollladen geöffnet');
      		fibaro:setGlobal("rollershutter_runs", "0");
elseif ((((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == sunriseHour)) and rollershutter_runs == 0 and tonumber(temp)>=0)
  			then
      		fibaro:debug('Rollladen-Steuerung gestartet (Ver.' .. version .. ')');
          fibaro:setGlobal("rollershutter_runs", "1");
      		fibaro:debug(Sonnenaufgang. Öffne Rollladen');
      		fibaro:debug('Warte ' .. min .. ' min');
          fibaro:sleep(random*100000);
      		fibaro:call(48, "open");
      		fibaro:debug('Rollladen geöffnet');
      		fibaro:setGlobal("rollershutter_runs", "0");
elseif ((((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == sunsetHour)) and rollershutter_runs == 0 and tonumber(temp)>=0)
			then
      		fibaro:debug('Rollladen-Steuerung gestartet (Ver.' .. version .. ')');
          fibaro:setGlobal("rollershutter_runs", "1"); 
      		fibaro:debug('Sonnenuntergang... Schließe Rollladen');
      		fibaro:debug('Waiting ' .. min .. ' min');
          fibaro:sleep(random*100000);
      		fibaro:call(48, "close");
      		fibaro:debug('Rollladen geschlossen');
      		fibaro:setGlobal("rollershutter_runs", "0");
elseif ((((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == sunriseHour)) and rollershutter_runs == 0 and tonumber(temp)< =0)
  			then
      		fibaro:debug('Rollladen-Steuerung gestartet (Ver.' .. version .. ')');
          fibaro:setGlobal("rollershutter_runs", "1");
      		fibaro:debug('Sonnenaufgang... Temperatur < 0... Rollladen bleibt geschlossen.');
          fibaro:call(98, "sendPush", "Temperatur unter 0. Rollladen wurde nicht geöffnet. Bitte manuell öffnen", "rollershutter");
      		fibaro:setGlobal("rollershutter_runs", "0");
elseif ((((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == sunsetHour)) and rollershutter_runs == 0 and tonumber(temp)<=0)
			then
      		fibaro:debug('Rollladen-Steuerung gestartet (Ver.' .. version .. ')');
          fibaro:setGlobal("rollershutter_runs", "1");
      		fibaro:debug('Sonnenuntergang... Temperatur < 0... Rollladen bleibt offen.');
          fibaro:call(98, "sendPush", "Temperatur unter 0. Rollladen wurde nicht geöffnet. Bitte manuell öffnen", "rollershutter");
      		fibaro:setGlobal("rollershutter_runs", "0");
end
  	setTimeout(rollershutter, 60*1000);
end
 
if (sourceTrigger["type"] == "autostart") then
	rollershutter();
end

Oder lieg ich da falsch? :slight_smile:

Grüße Andreas

Hi,

ja, das sieht gut aus.

Gruß

Du kannst auch die Null-Grad-Prüfung rausnehmen.

Joa, könnte ich - aber ich denke, das ist schon ganz gut so. Man weiß ja nie…
Cool wäre es, wenn man erkennt, dass der Motor nun gerade (z.b.) 125% der Leistung benötigt wie sonst und ihn erst dann abschält.
Aber wie man sowas umsetzen kann, ist die Frage.

Gruß Andreas

Hm, also irgendwie funktioniert das wohl doch nicht.
Ich hab im einem Fall (Schlafzimmer) eine grafische Lösung versucht, im anderen Fall (Kinderzimmer) den LUA-Code
Wie man im Anhang sehen kann, sind beide Rolläden komplett geschlossen, obwohl der Sonnenaufgang (07:49 Uhr)schon war (jetzt ist es 08:23 Uhr)
Bei dem Schlafzimmer hab ich die max. ausgeführten Instanzen auf 6 gestellt, beim LUA-Script auf 2.
Hilft das?

Gruß Andreas

Unbenannt.png

Was sagt denn der Debug der LUA-Szene? War es zum Sonnenaufgang <0 Grad?

hallo oceanman,

Ja, es war wärmer als 0°C, war aber eh egal, hab die Temperatur rausgenommen.

Debug sagte nur:


[DEBUG] 19:13:16: Rollladen-Steuerung Kinderzimmer erstmalig gestartet (Ver.2.0)
[DEBUG] 19:19:04: Rollladen-Steuerung Kinderzimmer erstmalig gestartet (Ver.2.0)

Nicht, dass ich nun n folge schweren Denkfehler mache…
Welche ID muss ich nun um LUA verwenden? 8 oder 7?
(Siehe Anhang)

Unbenannt-1.png

Hi,

hast du die Variable angelegt und welchen Status (0/1) hat diese? Wenn Sie auf 1 ist, dann setz den Status auf 0.

Die ID muss 8 sein.

Gruß

hallo boomx,

welche Variable genau meinst du? die einzige, die keiner anderen Funktion zugeordnet ist “min”
ID ist auf 8, dann passt es.

Du benötigst folgende Variable, sonst funktioniert das Skript nicht:

local rollershutter_runs = tonumber(fibaro:getGlobalValue("rollershutter_runs"));

Gruß

Die Variable existiert (Zeile 17). Sollte die nicht Global sein?

--[[
%% autostart
%% properties
%% globals
--]]
 
local sourceTrigger = fibaro:getSourceTrigger();
local version = '2.0';
 
fibaro:debug('Rollladen-Steuerung Kinderzimmer erstmalig gestartet (Ver.' .. version .. ')');
 
function rollershutter()
    local version = '2.0';
    local sunriseHour = fibaro:getValue(1,"sunriseHour");
  	local sunsetHour = fibaro:getValue(1,"sunsetHour");
    local currentDate = os.date("*t");
  	local rollershutter_runs = tonumber(fibaro:getGlobalValue("rollershutter_runs"));
  	local random = math.random(35);
  	local min = math.floor((random*100)/60);
 
if ((((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == sunriseHour)) and rollershutter_runs == 0)
  			then
      		fibaro:debug('Rollladen-Steuerung Kinderzimmer gestartet (Ver.' .. version .. ')');
          fibaro:setGlobal("rollershutter_runs", "1");
      		fibaro:debug('Sonnenaufgang. Öffne Rollladen einen Spalt');
      		fibaro:debug('Warte ' .. min .. ' min');
          fibaro:sleep(random*100000);
			fibaro:call(8, "setValue", "40");
      		fibaro:debug('Rollladen geöffnet');
      		fibaro:setGlobal("rollershutter_runs", "0");
elseif ((((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7) and os.date("%H:%M", os.time()-57*60) == fibaro:getValue(1, "sunriseHour")) and rollershutter_runs == 0))
  			then
      		fibaro:debug('Rollladen-Steuerung Kinderzimmer gestartet (Ver.' .. version .. ')');
          fibaro:setGlobal("rollershutter_runs", "1");
      		fibaro:debug('Sonnenaufgang. Öffne Rollladen');
      		fibaro:debug('Warte ' .. min .. ' min');
          fibaro:sleep(random*100000);
      		fibaro:call(8, "open");
      		fibaro:debug('Rollladen geöffnet');
      		fibaro:setGlobal("rollershutter_runs", "0");
elseif ((((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == sunsetHour)) and rollershutter_runs == 0)
			then
      		fibaro:debug('Rollladen-Steuerung Kinderzimmer gestartet (Ver.' .. version .. ')');
          fibaro:setGlobal("rollershutter_runs", "1"); 
      		fibaro:debug('Sonnenuntergang... Schließe Rollladen');
      		fibaro:debug('Waiting ' .. min .. ' min');
          fibaro:sleep(random*100000);
      		fibaro:call(8, "close");
      		fibaro:debug('Rollladen geschlossen');
      		fibaro:setGlobal("rollershutter_runs", "0");
end
  	setTimeout(rollershutter, 60*1000);
end
 
if (sourceTrigger["type"] == "autostart") then
	rollershutter();
end

Gruß Andreas

Das ist eine globale Variable, die muss erstellt werden und den Wert 0 haben.

ah, verstehe. Dann initialisiere ich die oben.

Dann bekomme ich den Fehler:
[DEBUG] 15:13:35: line 76: ‘end’ expected (to close ‘function’ at line 19) near

--[[
%% autostart
%% properties
%% globals
--]]
 
local sourceTrigger = fibaro:getSourceTrigger();--[[
%% autostart
%% properties
%% globals
--]]
 
local sourceTrigger = fibaro:getSourceTrigger();
local version = '2.0';
local rollershutter_runs = 0;
 
fibaro:debug('Rollladen-Steuerung Kinderzimmer erstmalig gestartet (Ver.' .. version .. ')');
 
function rollershutter()
    local version = '2.0';
    local sunriseHour = fibaro:getValue(1,"sunriseHour");
  	local sunsetHour = fibaro:getValue(1,"sunsetHour");
    local currentDate = os.date("*t");
  	local rollershutter_runs = tonumber(fibaro:getGlobalValue("rollershutter_runs"));
  	local random = math.random(35);
local version = '2.0';
local rollershutter_runs = 0;
 
fibaro:debug('Rollladen-Steuerung Kinderzimmer erstmalig gestartet (Ver.' .. version .. ')');
 
function rollershutter()
    local version = '2.0';
    local sunriseHour = fibaro:getValue(1,"sunriseHour");
  	local sunsetHour = fibaro:getValue(1,"sunsetHour");
    local currentDate = os.date("*t");
  	local rollershutter_runs = tonumber(fibaro:getGlobalValue("rollershutter_runs"));
  	local random = math.random(35);
  	local min = math.floor((random*100)/60);
 
if ((((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == sunriseHour)) and rollershutter_runs == 0)
  			then
      		fibaro:debug('Rollladen-Steuerung Kinderzimmer gestartet (Ver.' .. version .. ')');
          fibaro:setGlobal("rollershutter_runs", "1");
      		fibaro:debug('Sonnenaufgang. Öffne Rollladen einen Spalt');
      		fibaro:debug('Warte ' .. min .. ' min');
          fibaro:sleep(random*100000);
			fibaro:call(8, "setValue", "40");
      		fibaro:debug('Rollladen geöffnet');
      		fibaro:setGlobal("rollershutter_runs", "0");
elseif ((((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7) and os.date("%H:%M", os.time()-57*60) == fibaro:getValue(1, "sunriseHour")) and rollershutter_runs == 0))
  			then
      		fibaro:debug('Rollladen-Steuerung Kinderzimmer gestartet (Ver.' .. version .. ')');
          fibaro:setGlobal("rollershutter_runs", "1");
      		fibaro:debug('Sonnenaufgang. Öffne Rollladen');
      		fibaro:debug('Warte ' .. min .. ' min');
          fibaro:sleep(random*100000);
      		fibaro:call(8, "open");
      		fibaro:debug('Rollladen geöffnet');
      		fibaro:setGlobal("rollershutter_runs", "0");
elseif ((((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == sunsetHour)) and rollershutter_runs == 0)
			then
      		fibaro:debug('Rollladen-Steuerung Kinderzimmer gestartet (Ver.' .. version .. ')');
          fibaro:setGlobal("rollershutter_runs", "1"); 
      		fibaro:debug('Sonnenuntergang... Schließe Rollladen');
      		fibaro:debug('Waiting ' .. min .. ' min');
          fibaro:sleep(random*100000);
      		fibaro:call(8, "close");
      		fibaro:debug('Rollladen geschlossen');
      		fibaro:setGlobal("rollershutter_runs", "0");
end
  	setTimeout(rollershutter, 60*1000);
end
 
if (sourceTrigger["type"] == "autostart") then
	rollershutter();
end

okay, da gab’s wohl ein Fehler beim kopieren.
Jetzt hab ich es oben initialisiert und es kommt kein Fehler im Debug.

Kann ich es irgendwie im Vorfeld testen?

Die Szene wird so nicht funktionieren - wie BoomX schon sagte, muss die globale Variable “rollershutter_runs” angelegt werden, sonst wird es nicht laufen. Das Skript versucht im Verlauf, die globale Variable zu ändern (z.B. Zeile 49), findet sie dann aber nicht. Da bringt es nichts, die als lokale Variable zu definieren.

Zur Erläuterung: die legst du unter Steuerungen --> vabiable Steuerungen --> Variablen --> hinzufügen.

Ah - dann muss man die Variablen dort auch noch definieren. Gut zu wissen.
Muss ich sonst noch eine Variable dort definieren? Gibt es irgendwie ein Tutorial, bei dem ich die grundlegenden Funktionen lernen kann und nicht immer so doof hier fragen muss? :3

Grüße Andreas

Unbenannt-2.png

Auf der Siio-Seite findest du recht viele.
zB:
https://www.siio.de/fibaro-homecenter-guide-teil-4-globale-variablen/

Viele Grüße Hoggle