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.
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
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.
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?
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
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
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