--[[
%% 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
 
Redigerat:
Nyfniken skrev:
Av någon anledning så har den övriga familjen väldigt låg toleranströskel för barnsjukdomar i automatiken.
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:
Jag hade missat att veckodagar numreras 0-6, söndag till lördag i stället för 1-7 måndag till söndag.
Nej det där stämmer inte heller. Iallafall inte på min HC2... I mitt fall är det:
Söndag = 1
Måndag = 2
Tisdag = 3
Onsdag = 4
Torsdag = 5
Fredag = 6
Lördag = 7
 
Bamsefar skrev:
Nej det där stämmer inte heller. Iallafall inte på min HC2... I mitt fall är det:
Söndag = 1
Måndag = 2
Tisdag = 3
Onsdag = 4
Torsdag = 5
Fredag = 6
Lördag = 7
Puh! Det där var nära ögat!
 
Nyfniken skrev:
Puh! Det där var nära ögat!
Jag kör test på din kod nu. Hoppas att det fungerar som det ska. Jag ändrade på veckodagarna men funderar lite på kvällsbelysningen. Den refererar väl till om dagnumret är mindre eller lika med fem så är det en vardag, eller har jag fattat något fel?
 
OpiMaza
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
Tyvärr så får jag inte "off" funktionen att fungera, vet inte vad jag gör för fel.
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)
 
OpiMaza
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
 
Söndag till Torsdag:

if (now.wday <= 5) then
lightsOut = lightsOutWeekday;
else
lightsOut = lightsOutWeekend;
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:
--[[
%% 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
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
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
Och släcka:

--[[
%% 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
 
iSnobben skrev:
Jag ändrade på veckodagarna men funderar lite på kvällsbelysningen. Den refererar väl till om dagnumret är mindre eller lika med fem så är det en vardag, eller har jag fattat något fel?
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.
 
Bamsefar, det var en sjujäkla massa kod för något som känns väldigt enkelt.
 
OpiMaza skrev:
Tyvärr så får jag inte "off" funktionen att fungera, vet inte vad jag gör för fel.
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?
Det kan vara det. Hemma hos mig fungerade i alla fall kvälls-scriptet igår.

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.
 
OpiMaza
Nyfniken skrev:
Det kan vara det. Hemma hos mig fungerade i alla fall kvälls-scriptet igår.

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.

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.
 
Nyfniken skrev:
Bamsefar, det var en sjujäkla massa kod för något som känns väldigt enkelt.
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.

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:
Vi vill skicka notiser för ämnen du bevakar och händelser som berör dig.