200 998 läst · 1 109 svar
201k läst
1,1k svar
Fibaro Home Center 2
--[[
%% properties
%% autostart
%% globals
--]]
-- Deklarera variabler
local lightsOnWeekday = "05:45";
local lightsOnWeekend = "07:00";
local sunriseOffset = 45;
local lightsOn;
local lightsOut = "00:00";
local device = 4;
local now = os.date("*t");
-- Räkna om tändtiden till antal minuter sedan midnatt
lightsOnWeekday = string.sub(lightsOnWeekday,1,2) * 60 + string.sub(lightsOnWeekday,4,5)
lightsOnWeekend = string.sub(lightsOnWeekend,1,2) * 60 + string.sub(lightsOnWeekend,4,5)
while true do
-- Hämta aktuell tid
now = os.date("*t");
-- Räkna om aktuell tid till antal minuter sedan midnatt
time = string.format("%02d", now.hour) * 60 + string.format("%02d", now.min);
-- Avgör om det är vardag eller helg och sätt tändtiden därefter
if ((now.wday == 6) or (now.wday == 0)) then
lightsOn = lightsOnWeekend;
else
lightsOn = lightsOnWeekday;
end
-- Hämta tid för soluppgången
lightsOut = fibaro:getValue(1, "sunriseHour");
-- Räkna om tiden för soluppgång tillantalet minuter sedan midnatt och lägg till offset
lightsOut = string.sub(lightsOut,1,2) * 60 + string.sub(lightsOut,4,5) + sunriseOffset
-- Tänd lampan om det är tänd-tid samt att tändtid inte är efter släck-tid
if ((lightsOn <= lightsOut) and (time == lightsOn)) then
fibaro:call(device, "turnOn");
end
-- Släck lampan släck-tid, oavsett hur lampan tändes
if (time == lightsOut) then
fibaro:call(device, "turnOff");
end
-- Sov 55 sekunder
fibaro:sleep(55*1000);
end
%% properties
%% autostart
%% globals
--]]
-- Deklarera variabler
local lightsOnWeekday = "05:45";
local lightsOnWeekend = "07:00";
local sunriseOffset = 45;
local lightsOn;
local lightsOut = "00:00";
local device = 4;
local now = os.date("*t");
-- Räkna om tändtiden till antal minuter sedan midnatt
lightsOnWeekday = string.sub(lightsOnWeekday,1,2) * 60 + string.sub(lightsOnWeekday,4,5)
lightsOnWeekend = string.sub(lightsOnWeekend,1,2) * 60 + string.sub(lightsOnWeekend,4,5)
while true do
-- Hämta aktuell tid
now = os.date("*t");
-- Räkna om aktuell tid till antal minuter sedan midnatt
time = string.format("%02d", now.hour) * 60 + string.format("%02d", now.min);
-- Avgör om det är vardag eller helg och sätt tändtiden därefter
if ((now.wday == 6) or (now.wday == 0)) then
lightsOn = lightsOnWeekend;
else
lightsOn = lightsOnWeekday;
end
-- Hämta tid för soluppgången
lightsOut = fibaro:getValue(1, "sunriseHour");
-- Räkna om tiden för soluppgång tillantalet minuter sedan midnatt och lägg till offset
lightsOut = string.sub(lightsOut,1,2) * 60 + string.sub(lightsOut,4,5) + sunriseOffset
-- Tänd lampan om det är tänd-tid samt att tändtid inte är efter släck-tid
if ((lightsOn <= lightsOut) and (time == lightsOn)) then
fibaro:call(device, "turnOn");
end
-- Släck lampan släck-tid, oavsett hur lampan tändes
if (time == lightsOut) then
fibaro:call(device, "turnOff");
end
-- Sov 55 sekunder
fibaro:sleep(55*1000);
end
--[[
%% properties
%% autostart
%% globals
--]]
local device = 4;
local lightsOutWeekday = "22:15";
local lightsOutWeekend = "00:30";
local sunsetOffset = -30;
local lightsOn;
local lightsOut;
local now = os.date("*t");
lightsOutWeekday = string.sub(lightsOutWeekday,1,2) * 60 + string.sub(lightsOutWeekday,4,5)
lightsOutWeekend = string.sub(lightsOutWeekend,1,2) * 60 + string.sub(lightsOutWeekend,4,5)
while true do
now = os.date("*t");
time = string.format("%02d", now.hour) * 60 + string.format("%02d", now.min);
lightsOn = fibaro:getValue(1, "sunsetHour");
lightsOn = string.sub(lightsOn,1,2) * 60 + string.sub(lightsOn,4,5);
lightsOn = lightsOn + sunsetOffset;
if (now.wday <= 5) then
lightsOut = lightsOutWeekday;
else
lightsOut = lightsOutWeekend;
end
if (((lightsOut < 720) or (lightsOn < lightsOut)) and (time == lightsOn)) then
fibaro:call(device, "turnOn");
while (time ~= lightsOut) do
now = os.date("*t");
time = string.format("%02d", now.hour) * 60 + string.format("%02d", now.min);
fibaro:sleep(55*1000);
end
fibaro:call(device, "turnOff");
end
fibaro:sleep(55*1000);
end
%% properties
%% autostart
%% globals
--]]
local device = 4;
local lightsOutWeekday = "22:15";
local lightsOutWeekend = "00:30";
local sunsetOffset = -30;
local lightsOn;
local lightsOut;
local now = os.date("*t");
lightsOutWeekday = string.sub(lightsOutWeekday,1,2) * 60 + string.sub(lightsOutWeekday,4,5)
lightsOutWeekend = string.sub(lightsOutWeekend,1,2) * 60 + string.sub(lightsOutWeekend,4,5)
while true do
now = os.date("*t");
time = string.format("%02d", now.hour) * 60 + string.format("%02d", now.min);
lightsOn = fibaro:getValue(1, "sunsetHour");
lightsOn = string.sub(lightsOn,1,2) * 60 + string.sub(lightsOn,4,5);
lightsOn = lightsOn + sunsetOffset;
if (now.wday <= 5) then
lightsOut = lightsOutWeekday;
else
lightsOut = lightsOutWeekend;
end
if (((lightsOut < 720) or (lightsOn < lightsOut)) and (time == lightsOn)) then
fibaro:call(device, "turnOn");
while (time ~= lightsOut) do
now = os.date("*t");
time = string.format("%02d", now.hour) * 60 + string.format("%02d", now.min);
fibaro:sleep(55*1000);
end
fibaro:call(device, "turnOff");
end
fibaro:sleep(55*1000);
end
Redigerat:
Japp - det där känner jag igen - bara alltförväl... Fast min fru har blivit riktigt snäll sedan jag installerade LED list i hennes walk-in-garderob...Nyfniken skrev:
Nej det där stämmer inte heller. Iallafall inte på min HC2... I mitt fall är det:Nyfniken skrev:
Söndag = 1
Måndag = 2
Tisdag = 3
Onsdag = 4
Torsdag = 5
Fredag = 6
Lördag = 7
Tyvärr så får jag inte "off" funktionen att fungera, vet inte vad jag gör för fel.Nyfniken skrev:--[[
%% properties
%% autostart
%% globals
--]]
local device = 4;
local lightsOutWeekday = "22:15";
local lightsOutWeekend = "00:30";
local sunsetOffset = -30;
local lightsOn;
local lightsOut;
local now = os.date("*t");
lightsOutWeekday = string.sub(lightsOutWeekday,1,2) * 60 + string.sub(lightsOutWeekday,4,5)
lightsOutWeekend = string.sub(lightsOutWeekend,1,2) * 60 + string.sub(lightsOutWeekend,4,5)
while true do
now = os.date("*t");
time = string.format("%02d", now.hour) * 60 + string.format("%02d", now.min);
lightsOn = fibaro:getValue(1, "sunsetHour");
lightsOn = string.sub(lightsOn,1,2) * 60 + string.sub(lightsOn,4,5);
lightsOn = lightsOn + sunsetOffset;
if (now.wday <= 5) then
lightsOut = lightsOutWeekday;
else
lightsOut = lightsOutWeekend;
end
if (((lightsOut < 720) or (lightsOn < lightsOut)) and (time == lightsOn)) then
fibaro:call(device, "turnOn");
while (time ~= lightsOut) do
now = os.date("*t");
time = string.format("%02d", now.hour) * 60 + string.format("%02d", now.min);
fibaro:sleep(55*1000);
end
fibaro:call(device, "turnOff");
end
fibaro:sleep(55*1000);
end
När allt ska tändas så går det helt perfekt, har det något att göra med söndag till måndag du skrev om nyss?
Alltså Söndag har värde = 1 och Lördag värde = 7. Ett test som:
(now.wday <= 5)
Inkluderar Söndag till Torsdag.
Vill man enbart ha arbetsdagarna måndag till fredag så måste man testa:
(now.wday >= 2 and now.wday <= 6)
(now.wday <= 5)
Inkluderar Söndag till Torsdag.
Vill man enbart ha arbetsdagarna måndag till fredag så måste man testa:
(now.wday >= 2 and now.wday <= 6)
Ser ni något galet här?
--[[
%% properties
%% autostart
%% globals
--]]
local device = 4;
local lightsOutWeekday = "22:10";
local lightsOutWeekend = "00:30";
local sunsetOffset = -20;
local lightsOn;
local lightsOut;
local now = os.date("*t");
lightsOutWeekday = string.sub(lightsOutWeekday,1,2) * 60 + string.sub(lightsOutWeekday,4,5)
lightsOutWeekend = string.sub(lightsOutWeekend,1,2) * 60 + string.sub(lightsOutWeekend,4,5)
while true do
now = os.date("*t");
time = string.format("%02d", now.hour) * 60 + string.format("%02d", now.min);
lightsOn = fibaro:getValue(1, "sunsetHour");
lightsOn = string.sub(lightsOn,1,2) * 60 + string.sub(lightsOn,4,5);
lightsOn = lightsOn + sunsetOffset;
if (now.wday <= 5) then
lightsOut = lightsOutWeekday;
else
lightsOut = lightsOutWeekend;
end
if (((lightsOut < 720) or (lightsOn < lightsOut)) and (time == lightsOn)) then
fibaro:call(4, "turnOn");
fibaro:call(5, "turnOn");
fibaro:call(6, "turnOn");
fibaro:call(7, "turnOn");
fibaro:call(8, "turnOn");
fibaro:call(9, "turnOn");
fibaro:call(10, "turnOn");
fibaro:call(11, "turnOn");
while (time ~= lightsOut) do
now = os.date("*t");
time = string.format("%02d", now.hour) * 60 + string.format("%02d", now.min);
fibaro:sleep(55*1000);
end
fibaro:call(4, "turnOff");
fibaro:call(5, "turnOff");
fibaro:call(6, "turnOff");
fibaro:call(7, "turnOff");
fibaro:call(8, "turnOff");
fibaro:call(9, "turnOff");
fibaro:call(10, "turnOff");
fibaro:call(11, "turnOff");
end
fibaro:sleep(55*1000);
end
--[[
%% properties
%% autostart
%% globals
--]]
local device = 4;
local lightsOutWeekday = "22:10";
local lightsOutWeekend = "00:30";
local sunsetOffset = -20;
local lightsOn;
local lightsOut;
local now = os.date("*t");
lightsOutWeekday = string.sub(lightsOutWeekday,1,2) * 60 + string.sub(lightsOutWeekday,4,5)
lightsOutWeekend = string.sub(lightsOutWeekend,1,2) * 60 + string.sub(lightsOutWeekend,4,5)
while true do
now = os.date("*t");
time = string.format("%02d", now.hour) * 60 + string.format("%02d", now.min);
lightsOn = fibaro:getValue(1, "sunsetHour");
lightsOn = string.sub(lightsOn,1,2) * 60 + string.sub(lightsOn,4,5);
lightsOn = lightsOn + sunsetOffset;
if (now.wday <= 5) then
lightsOut = lightsOutWeekday;
else
lightsOut = lightsOutWeekend;
end
if (((lightsOut < 720) or (lightsOn < lightsOut)) and (time == lightsOn)) then
fibaro:call(4, "turnOn");
fibaro:call(5, "turnOn");
fibaro:call(6, "turnOn");
fibaro:call(7, "turnOn");
fibaro:call(8, "turnOn");
fibaro:call(9, "turnOn");
fibaro:call(10, "turnOn");
fibaro:call(11, "turnOn");
while (time ~= lightsOut) do
now = os.date("*t");
time = string.format("%02d", now.hour) * 60 + string.format("%02d", now.min);
fibaro:sleep(55*1000);
end
fibaro:call(4, "turnOff");
fibaro:call(5, "turnOff");
fibaro:call(6, "turnOff");
fibaro:call(7, "turnOff");
fibaro:call(8, "turnOff");
fibaro:call(9, "turnOff");
fibaro:call(10, "turnOff");
fibaro:call(11, "turnOff");
end
fibaro:sleep(55*1000);
end
Flera av er verkar försöka lösa samma sak, men jag får intryck av att det strular. Jag skulle rekommendera en flerstegs lösning: Ett LUA script (scen) som uppdaterar en variabel, TOD = TimeOfDay, och scener som triggar på TOD för på/av av ljus - i mitt fall fönsterbelysning (observera att det finns ett special fall, vill inte tända inne i sovrummet under helgerna).
Jag har exempelvis denna LUA kod för TOD hanteringen (TOD är en global variabel) i ett script:
Jag har exempelvis denna LUA kod för TOD hanteringen (TOD är en global variabel) i ett script:
Observera att jag använder en ljussensor som indikator för om det är mörkt eller ljust, dvs jag använder inte solens upp/nedgång. Således blir min rutin för att tända lite annorlunda:--[[
%% autostart
%% properties
%% globals
--]]
--Settings
LVariablesDevice = 14; -- ID of helperdevice for GlobalVars!
LExecuteSecond = 60; -- Execute Every N-th second
LMorningHour ="0600"; --Time which is considered to be morning
LDayHour ="0800"; --Time which is considered to be morning
LDinnerHour ="1600"; --Time which is considered to be morning
LEveningHour ="1830"; --Time which is considered to be morning
LTurndownHour ="2100"; --Time which is considered to be turndown before night
LNightHour = "2215"; -- Time which is considered to be night
LMidnightHour ="0100"; --Time which is considered to be morning
LMidnightTime =0; -- Time when values are reset if empty it will run imediately
--kill any extra instances of the same scene
if (fibaro:countScenes() > 1) then fibaro:abort() end;
--Loop
while true do
-- Current Time
LCurrentDate = os.date("*t"); -- Current Date in table format
LCurrentTime = os.time(); -- Current time in unix format
if (LMidnightTime < LCurrentTime) then
-- MorningTime
if ( LCurrentDate.wday == 1 or LCurrentDate.wday == 7 ) then
LMorningTime = os.time{year=LCurrentDate.year, month=LCurrentDate.month, day=LCurrentDate.day, hour=string.sub(LMorningHour, 1 , 2), min=string.sub(LMorningHour, 3)}+7200;
else
LMorningTime = os.time{year=LCurrentDate.year, month=LCurrentDate.month, day=LCurrentDate.day, hour=string.sub(LMorningHour, 1 , 2), min=string.sub(LMorningHour, 3)};
end
-- DayTime
if ( LCurrentDate.wday == 1 or LCurrentDate.wday == 7 ) then
LDayTime = os.time{year=LCurrentDate.year, month=LCurrentDate.month, day=LCurrentDate.day, hour=string.sub(LDayHour, 1 , 2), min=string.sub(LDayHour, 3)}+7200;
else
LDayTime = os.time{year=LCurrentDate.year, month=LCurrentDate.month, day=LCurrentDate.day, hour=string.sub(LDayHour, 1 , 2), min=string.sub(LDayHour, 3)};
end
-- DinnerTime
LDinnerTime = os.time{year=LCurrentDate.year, month=LCurrentDate.month, day=LCurrentDate.day, hour=string.sub(LDinnerHour, 1 , 2), min=string.sub(LDinnerHour, 3)};
-- EveningTime
LEveningTime = os.time{year=LCurrentDate.year, month=LCurrentDate.month, day=LCurrentDate.day, hour=string.sub(LEveningHour, 1 , 2), min=string.sub(LEveningHour, 3)};
-- TurndownTime
LTurndownTime = os.time{year=LCurrentDate.year, month=LCurrentDate.month, day=LCurrentDate.day, hour=string.sub(LTurndownHour, 1 , 2), min=string.sub(LTurndownHour, 3)};
-- NightTime
if ( LCurrentDate.wday == 6 or LCurrentDate.wday == 7 ) then
LNightTime = os.time{year=LCurrentDate.year, month=LCurrentDate.month, day=LCurrentDate.day, hour=string.sub(LNightHour, 1 , 2), min=string.sub(LNightHour, 3)}+3600;
else
LNightTime = os.time{year=LCurrentDate.year, month=LCurrentDate.month, day=LCurrentDate.day, hour=string.sub(LNightHour, 1 , 2), min=string.sub(LNightHour, 3)};
end
-- MidnightTime
LMidnightTime = os.time{year=LCurrentDate.year, month=LCurrentDate.month, day=LCurrentDate.day+1, hour=string.sub(LMidnightHour, 1 , 2), min=string.sub(LMidnightHour, 3)};
-- Debuginformation
fibaro:debug(" -|- MorningTime: "..os.date("%Y-%m-%d %H:%M:%S",LMorningTime));
fibaro:debug(" -|- DayTime: "..os.date("%Y-%m-%d %H:%M:%S",LDayTime));
fibaro:debug(" -|- DinnerTime: "..os.date("%Y-%m-%d %H:%M:%S",LDinnerTime));
fibaro:debug(" -|- EveningTime: "..os.date("%Y-%m-%d %H:%M:%S",LEveningTime));
fibaro:debug(" -|- TurndownTime: "..os.date("%Y-%m-%d %H:%M:%S",LTurndownTime));
fibaro:debug(" -|- NightTime: "..os.date("%Y-%m-%d %H:%M:%S",LNightTime));
fibaro:debug(" -|- MidnightTime: "..os.date("%Y-%m-%d %H:%M:%S",LMidnightTime));
end
if (LCurrentTime > LNightTime or LCurrentTime < LMorningTime) then
if (fibaro:getGlobalValue("TOD") == "TurnDown") then
fibaro:setGlobal("TOD","Natt");
fibaro:debug("Natt");
end
elseif (LCurrentTime > LTurndownTime) then
if (fibaro:getGlobalValue("TOD") == "Kväll") then
fibaro:setGlobal("TOD","TurnDown");
fibaro:debug("TurnDown");
end
elseif (LCurrentTime > LEveningTime) then
if (fibaro:getGlobalValue("TOD") == "Middag") then
fibaro:setGlobal("TOD","Kväll");
fibaro:debug("Kväll");
end
elseif (LCurrentTime > LDinnerTime) then
if (fibaro:getGlobalValue("TOD") == "Dag") then
fibaro:setGlobal("TOD","Middag");
fibaro:debug("Middag");
end
elseif (LCurrentTime > LDayTime) then
if (fibaro:getGlobalValue("TOD") == "Morgon") then
fibaro:setGlobal("TOD","Dag");
fibaro:debug("Dag");
end
elseif (LCurrentTime > LMorningTime) then
if (fibaro:getGlobalValue("TOD") == "Natt") then
fibaro:setGlobal("TOD","Morgon");
fibaro:debug("Morgon");
end
end
--Sleep XX seconds
fibaro:sleep(LExecuteSecond*1000);
end
Och släcka:--[[
%% autostart
%% properties
%% globals
TOD
Dagsljus
--]]
-- Current Time
LCurrentDate = os.date("*t"); -- Current Date in table format
if ( fibaro:getGlobalValue("TOD") ~= "Natt" and fibaro:getGlobalValue("Dagsljus") == "Mörkt" )
then
fibaro:call(42, "turnOn");
fibaro:call(45, "turnOn");
fibaro:call(36, "turnOn");
fibaro:call(30, "turnOn");
fibaro:call(33, "turnOn");
-- Sovrum specialbehandlas under helgdagar för extra sen morgon ;-)
if ( fibaro:getGlobalValue("TOD") ~= "Morgon" or
( ( LCurrentDate.wday >= 1 and LCurrentDate.wday <= 7 )
and fibaro:getGlobalValue("TOD") == "Morgon"
)
)
then
fibaro:call(48, "turnOn");
end
end
--[[
%% autostart
%% properties
%% globals
Dagsljus
TOD
--]]
if ( fibaro:getGlobalValue("Dagsljus") == "Ljust" or fibaro:getGlobalValue("TOD") == "Natt" )
then
fibaro:call(48, "turnOff");
fibaro:call(42, "turnOff");
fibaro:call(45, "turnOff");
fibaro:call(36, "turnOff");
fibaro:call(30, "turnOff");
fibaro:call(33, "turnOff");
end
Det beror ju på hur man vill ha det. När lamporna ska släckas så tittar jag på nästkommande dag. Är nästa dag en vardag så vill jag att det släcks tidigt. Är nästa dag en lördag/söndag så får det vara tänt längre. Därför funkar <= 5, eftersom den returnerar true om nästa dag är måndag-fredag.iSnobben skrev:
Det kan vara det. Hemma hos mig fungerade i alla fall kvälls-scriptet igår.OpiMaza skrev:
Kom ihåg att släck-funktionen bara fungerar om scriptet startats före tänd-tid. När lamporna tänds så går den in i släck-loopen och väntar på rätt tid. Om lamporna aldrig tänts så ligger den inte i den loopen.
Nyfniken skrev:
Ok det kan va det, jag va inne och pillade i den igår när det va tänt.
Jag väntar tills i kväll innan jag ändrar något.
Japp - men min kod styr egentligen mycket mera än bara just det ni efterfrågar. Det är därför jag valt att inte visa koden tidigare.... I mitt fall så använder jag en variabel, TOD, för att styra hur bostaden uppför sig. TOD kombineras med variabel DagsLjus som då t.ex. tänder fönsterbelysningen under visa dagsperioder (men inte under natten). Sedan finns även en variabel för Hemma - som talar om via våra mobiler om någon befinner sig just hemma, och då styrs viss belysning och media i bostaden därefter. Det finns även en variabel för Projektor som indikerar om vi har slagit på projektorn, som då styr belysningen på ett speciellt sätt. Dvs vi har rätt många variabler som tillsammans eller var för sig påverkar hur bostaden uppför sig. T.ex. så tänds köket på olika sätt beroende på när på dygnet man rör sig i just köket, och om det är ljust ute osv. Våra regler får nog anses som hyggligt komplexa - utan att för den sakens skull vara överjävliga helt enkelt.Nyfniken skrev:
EDIT: Alltså skälet till så mycket kod i det första LUA scriptet är alltså enkom för att TOD skall få rätt värde, det går säkert att skriva på något enklare sätt med det är kopierat från en annan kod som fanns på nätet och förädlat i olika omgångar. Skulle antagligen tjäna på att skrivas om då det är rätt simpel logik i grund och botten. Det som skall läggas till är helgdagshantering - dvs att räkna ut alla helgdagar som finns i sverige plus ett antal andra fasta som vi har och som då skall styra om vardagar till heldagsbeteende... Så jag har bara börjat på sätt och vis - kommer ju från Vera lägret för bara ett par veckor sedan...
Redigerat: