Arbetsdag idag / imorgon - Hur man räknar ut Påsken varje år

Hjälp varandra att vara kreativa för att göra hemmet mer bekvämt.
Johan71
Medlem
Posts: 84
Joined: 24 Jan 2014, 11:46
10

if WorkDay(os.date("*t")) then

[ERROR] 09:15:55: line 119: 'then' expected near 'if'
MVH Johan
_____________________________
Fibaro Home Center 2
User avatar
Bamsefar
Z-Wave Kung
Posts: 1268
Joined: 25 Nov 2013, 15:06
10
Location: Stockholm

Johan71 wrote:if WorkDay(os.date("*t")) then

[ERROR] 09:15:55: line 119: 'then' expected near 'if'
Hmm två slarvfel - sorry det var inte meningen. Båda rättade. Btw observera att jag har lagt in två lediga dagar i Maj - du kanske är ledig också?

Jag har uppdaterat och lagt in den rättade koden i ett inlägg längre ned i denna tråd (eftersom postningarna ovan var felaktiga).
Last edited by Bamsefar on 26 Apr 2014, 09:47, edited 1 time in total.
Kör Home Assistant efter totalt nederlag för HomeSeer :twisted: :twisted: :mrgreen:
Johan71
Medlem
Posts: 84
Joined: 24 Jan 2014, 11:46
10

Tyvärr så slocknar mina lampor 22:05 oavsett vilken dag det är.
MVH Johan
_____________________________
Fibaro Home Center 2
User avatar
Bamsefar
Z-Wave Kung
Posts: 1268
Joined: 25 Nov 2013, 15:06
10
Location: Stockholm

Kan du klistra in det script du kör?
Kör Home Assistant efter totalt nederlag för HomeSeer :twisted: :twisted: :mrgreen:
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
11
Location: Västerås

Samma för mig. Men detta löser Bamsefar :)
Har din kod och bara ändrat enheterna, och har dina variabler Work today stämmer. Likaså work tomrrow stämmer.

Skickat från min GT-I9100 via Tapatalk 2
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
Johan71
Medlem
Posts: 84
Joined: 24 Jan 2014, 11:46
10

Detta är min scen som kallas för kalender.

Code: Select all

--[[
%% properties

%% globals
--]]

function Vacation_Days(dateForCheck)

  -- Ange vilka datum som skall anses som lediga datum
local LedigaDatum = { "2014-05-02" , "2014-05-30" }

  local datum

   for z,datum in pairs(LedigaDatum) do
      TestDatum = os.date("*t", os.time({year = tonumber(string.sub(datum,1,4)), month = tonumber(string.sub(datum,6,7)), day = tonumber(string.sub(datum,9))}))
       if ( TestDatum.year == dateForCheck.year and TestDatum.month == dateForCheck.month and TestDatum.day == dateForCheck.day ) then
         return true
      end
   end
   return false
end  

function Holidays_CalculateEaster(year) 
  golden = (year % 19) + 1 
  c = math.floor(year/400) + math.floor(8*(math.floor(year/100)+11)/25) - math.floor(year/100) 
  s = (11 * golden + c) % 30 
  if (s < 0) then 
    s = s + 30 
  end 
  pfm = os.time{year=year, month=4, day=19} - s * 24 * 60 * 60 
  if (pfm == os.time{year=year, month=4, day=19}) then 
    pfm = pfm - 24 * 60 * 60 
  elseif (pfm == os.time{year=year, month=4, day=18} and golden > 11) then 
    pfm = pfm - 24 * 60 * 60 
  end 
  sunday = pfm + (7 - tonumber(os.date("%w", pfm))) * 24 * 60 * 60 
  friday = sunday - 2 * 24 * 60 * 60 
 
  return {year, tonumber(os.date("%m", friday)), tonumber(os.date("%d", friday))}  
end

function WorkDay(dateToCheck)

        local easterDay
        local returnValue
  
      returnValue = true

       -- Indatum är en lördag eller Söndag
        if ( dateToCheck.wday == 1 or dateToCheck.wday == 7 ) then 
           returnValue = false
        -- Indatum är nationaldag        
      elseif ( dateToCheck.month == 6 and dateToCheck.day == 6 ) then
           returnValue = false 
        -- Indatum är Nyårsdag eller trettondag
        elseif ( dateToCheck.month == 1 and (dateToCheck.day == 1 or dateToCheck.day == 6 ) ) then
           returnValue = false
        -- Indatum är 1:a maj
        elseif ( dateToCheck.month == 5 and dateToCheck.day == 1 ) then
             returnValue = false
        -- Indatum är Julafton,Juldag, Annandag eller Nyårsafton
        elseif ( dateToCheck.month == 12 and (dateToCheck.day == 24 or dateToCheck.day == 25 or dateToCheck.day == 26 or dateToCheck.day == 31) ) then
           returnValue = false
      end

      -- Långfredag
        easterDay = Holidays_CalculateEaster(dateToCheck.year)
         if ( easterDay[1] == dateToCheck.year and easterDay[2] == dateToCheck.month and easterDay[3] == dateToCheck.day ) then
           returnValue = false
      end
      -- AnnandagPåsk
        easterDay2 = os.date("*t", os.time({year = easterDay[1], month = easterDay[2], day = easterDay[3]})+3*24*60*60)
         if ( easterDay2.year == dateToCheck.year and easterDay2.month == dateToCheck.month and easterDay2.day == dateToCheck.day ) then
           returnValue = false
      end
      -- Kristihimmelfärdsdag? +41 dagar från Långfredag?
        datum3 = os.date("*t", os.time({year = easterDay[1], month = easterDay[2], day = easterDay[3]})+41*24*60*60)
      if ( datum3.year == dateToCheck.year and datum3.month == dateToCheck.month and datum3.day == dateToCheck.day ) then
           returnValue = false
      end
        -- hitta midsommardagen för att kunna kontrollera midsommarafton
        -- midsommardagen = den lördag som infaller under tiden den 20-26 juni -> midsommarafton bör vara den fredag som inträffar under tiden 19-25 juni
        if ( dateToCheck.month == 6 and (dateToCheck.day >= 19 and dateToCheck.day <= 25) and dateToCheck.wday == 6 ) then
           returnValue = false
      end
       
        if ( Vacation_Days(dateToCheck) ) then
           returnValue = false
      end
  
        return returnValue
end

if WorkDay(os.date("*t")) then 
   fibaro:setGlobal("WorkToday","True");
else
   fibaro:setGlobal("WorkToday","False");
end

if WorkDay(os.date("*t", os.time()+24*60*60)) then 
   fibaro:setGlobal("WorkTomorrow","True");
else
   fibaro:setGlobal("WorkTomorrow","False");
end
och detta är min scen som heter kväll av

Code: Select all

--[[
%% autostart
%% properties
%% globals
--]]


function Vacation_Days(dateForCheck)

--    Ange vilka datum som skall anses som lediga datum
local LedigaDatum = { "2014-05-02" , "2014-05-30" }

local datum

for z,datum in pairs(LedigaDatum)
do
TestDatum = os.date("*t", os.time({year = tonumber(string.sub(datum,1,4)), month = tonumber(string.sub(datum,6,7)), day = tonumber(string.sub(datum,9))}))
if ( TestDatum.year == dateForCheck.year and TestDatum.month == dateForCheck.month and TestDatum.day == dateForCheck.day ) then
return true
end
end
return false
end

function Holidays_CalculateEaster(year)
golden = (year % 19) + 1
c = math.floor(year/400) + math.floor(8*(math.floor(year/100)+11)/25) - math.floor(year/100)
s = (11 * golden + c) % 30
if (s < 0) then
s = s + 30
end
pfm = os.time{year=year, month=4, day=19} - s * 24 * 60 * 60
if (pfm == os.time{year=year, month=4, day=19}) then
pfm = pfm - 24 * 60 * 60
elseif (pfm == os.time{year=year, month=4, day=18} and golden > 11) then
pfm = pfm - 24 * 60 * 60
end
sunday = pfm + (7 - tonumber(os.date("%w", pfm))) * 24 * 60 * 60
friday = sunday - 2 * 24 * 60 * 60

return {year, tonumber(os.date("%m", friday)), tonumber(os.date("%d", friday))}
end

function WorkDay(dateToCheck)

local easterDay
local returnValue

returnValue = true

-- Indatum är en lördag eller Söndag
if ( dateToCheck.wday == 1 or dateToCheck.wday == 7 ) then
returnValue = false
-- Indatum är nationaldag       
elseif ( dateToCheck.month == 6 and dateToCheck.day == 6 ) then
returnValue = false
-- Indatum är Nyårsdag eller trettondag
elseif ( dateToCheck.month == 1 and (dateToCheck.day == 1 or dateToCheck.day == 6 ) ) then
returnValue = false
-- Indatum är 1:a maj
elseif ( dateToCheck.month == 5 and dateToCheck.day == 1 ) then
 returnValue = false
-- Indatum är Julafton,Juldag, Annandag eller Nyårsafton
elseif ( dateToCheck.month == 12 and (dateToCheck.day == 24 or dateToCheck.day == 25 or dateToCheck.day == 26 or dateToCheck.day == 31) ) then
returnValue = false
end

-- Långfredag
easterDay = Holidays_CalculateEaster(dateToCheck.year)
if ( easterDay[1] == dateToCheck.year and easterDay[2] == dateToCheck.month and easterDay[3] == dateToCheck.day ) then
returnValue = false
end
-- AnnandagPåsk
easterDay2 = os.date("*t", os.time({year = easterDay[1], month = easterDay[2], day = easterDay[3]})+3*24*60*60)
if ( easterDay2.year == dateToCheck.year and easterDay2.month == dateToCheck.month and easterDay2.day == dateToCheck.day ) then
returnValue = false
end
-- Kristihimmelfärdsdag? +41 dagar från Långfredag?
datum3 = os.date("*t", os.time({year = easterDay[1], month = easterDay[2], day = easterDay[3]})+41*24*60*60)
if ( datum3.year == dateToCheck.year and datum3.month == dateToCheck.month and datum3.day == dateToCheck.day ) then
returnValue = false
end
-- hitta midsommardagen för att kunna kontrollera midsommarafton
-- midsommardagen = den lördag som infaller under tiden den 20-26 juni -> midsommarafton bör vara den fredag som inträffar under tiden 19-25 juni
if ( dateToCheck.month == 6 and (dateToCheck.day >= 19 and dateToCheck.day <= 25) and dateToCheck.wday == 6 ) then
returnValue = false
end

if ( Vacation_Days(dateToCheck) ) then
returnValue = false
end

return returnValue
end

-- Make sure the variables are correct at startup

if WorkDay(os.date("*t")) then
fibaro:setGlobal("WorkToday","True");
else
fibaro:setGlobal("WorkToday","False");
end

if WorkDay(os.date("*t", os.time()+24*60*60)) then
fibaro:setGlobal("WorkTomorrow","True");
else
fibaro:setGlobal("WorkTomorrow","False");
end


while true do

local currentDate = os.date("*t");

if (string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "00:01") then

-- Only update variables one time each day, 00:01

if WorkDay(os.date("*t")) then
fibaro:setGlobal("WorkToday","True");
else
fibaro:setGlobal("WorkToday","False");
end

if WorkDay(os.date("*t", os.time()+24*60*60)) then
fibaro:setGlobal("WorkTomorrow","True");
else
fibaro:setGlobal("WorkTomorrow","False");
end

end

-- Turn off lamps 22:05 day before workday, and 00:30 day before holiday (test is WorkToday since we change day)

if (
( tonumber(fibaro:getGlobalValue("WorkTomorrow")) == tonumber("True") )
and
( string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "22:05")
   )
then
   fibaro:call(48, "turnOff");
   fibaro:sleep(math.random(6000,9000)); 
   fibaro:call(7, "turnOff");
   fibaro:sleep(math.random(8000,12000)); 
   fibaro:call(8, "turnOff");
   fibaro:sleep(math.random(5000,12000)); 
   fibaro:call(10, "turnOff");
   fibaro:sleep(math.random(2000,5000)); 
   fibaro:call(9, "turnOff");
   fibaro:sleep(math.random(8000,12000)); 
   fibaro:call(5, "turnOff");
   fibaro:sleep(math.random(6000,9000)); 
   fibaro:call(4, "turnOff");
   fibaro:sleep(math.random(5000,8000)); 
   fibaro:call(6, "turnOff");
   fibaro:sleep(math.random(10000,30000)); 
   fibaro:call(11, "turnOff");
end

if (
( tonumber(fibaro:getGlobalValue("WorkToday")) == tonumber("False") )
and
( string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "00:30")
   )
then
   fibaro:call(48, "turnOff");
   fibaro:sleep(math.random(6000,9000)); 
   fibaro:call(7, "turnOff");
   fibaro:sleep(math.random(8000,12000)); 
   fibaro:call(8, "turnOff");
   fibaro:sleep(math.random(5000,12000)); 
   fibaro:call(10, "turnOff");
   fibaro:sleep(math.random(2000,5000)); 
   fibaro:call(9, "turnOff");
   fibaro:sleep(math.random(8000,12000)); 
   fibaro:call(5, "turnOff");
   fibaro:sleep(math.random(6000,9000)); 
   fibaro:call(4, "turnOff");
   fibaro:sleep(math.random(5000,8000)); 
   fibaro:call(6, "turnOff");
   fibaro:sleep(math.random(10000,30000)); 
   fibaro:call(11, "turnOff");
end

fibaro:sleep(60*1000);

end
jag har två variabler som heter WorkTomorrow och WorkToday o dom fungerar perfekt med True och False.
MVH Johan
_____________________________
Fibaro Home Center 2
User avatar
Bamsefar
Z-Wave Kung
Posts: 1268
Joined: 25 Nov 2013, 15:06
10
Location: Stockholm

Right - mera slarvfel från min sida - sorry for that - skall bättre mig ;-)

Johan71: Radera din första scen (kalender) och BYT den andra (kväll) till nedanstående kod:

Code: Select all

--[[
%% autostart
%% properties
%% globals
--]]

function Vacation_Days(dateForCheck)

-- Ange vilka datum som skall anses som lediga datum
   local LedigaDatum = { "2014-05-02" , "2014-05-30" }

   local datum

   for z,datum in pairs(LedigaDatum)
       do
          TestDatum = os.date("*t", os.time({year = tonumber(string.sub(datum,1,4)), month = tonumber(string.sub(datum,6,7)), day = tonumber(string.sub(datum,9))}))
          if ( TestDatum.year == dateForCheck.year and TestDatum.month == dateForCheck.month and TestDatum.day == dateForCheck.day ) then
             return true
          end
       end
   return false
end

function Holidays_CalculateEaster(year)
    golden = (year % 19) + 1
    c = math.floor(year/400) + math.floor(8*(math.floor(year/100)+11)/25) - math.floor(year/100)
    s = (11 * golden + c) % 30
    if (s < 0) then
       s = s + 30
    end
    pfm = os.time{year=year, month=4, day=19} - s * 24 * 60 * 60
    if (pfm == os.time{year=year, month=4, day=19}) then
       pfm = pfm - 24 * 60 * 60
    elseif (pfm == os.time{year=year, month=4, day=18} and golden > 11) then
       pfm = pfm - 24 * 60 * 60
    end
    sunday = pfm + (7 - tonumber(os.date("%w", pfm))) * 24 * 60 * 60
    friday = sunday - 2 * 24 * 60 * 60

    return {year, tonumber(os.date("%m", friday)), tonumber(os.date("%d", friday))}
end

function WorkDay(dateToCheck)

   local easterDay
   local returnValue

   returnValue = true

-- Indatum är en lördag eller Söndag
   if ( dateToCheck.wday == 1 or dateToCheck.wday == 7 ) then
      returnValue = false
-- Indatum är nationaldag       
   elseif ( dateToCheck.month == 6 and dateToCheck.day == 6 ) then
      returnValue = false
-- Indatum är Nyårsdag eller trettondag
   elseif ( dateToCheck.month == 1 and (dateToCheck.day == 1 or dateToCheck.day == 6 ) ) then
      returnValue = false
-- Indatum är 1:a maj
   elseif ( dateToCheck.month == 5 and dateToCheck.day == 1 ) then
       returnValue = false
-- Indatum är Julafton,Juldag, Annandag eller Nyårsafton
   elseif ( dateToCheck.month == 12 and (dateToCheck.day == 24 or dateToCheck.day == 25 or dateToCheck.day == 26 or dateToCheck.day == 31) ) then
      returnValue = false
   end

-- Långfredag
   easterDay = Holidays_CalculateEaster(dateToCheck.year)
   if ( easterDay[1] == dateToCheck.year and easterDay[2] == dateToCheck.month and easterDay[3] == dateToCheck.day ) then
      returnValue = false
   end
-- AnnandagPåsk
   easterDay2 = os.date("*t", os.time({year = easterDay[1], month = easterDay[2], day = easterDay[3]})+3*24*60*60)
   if ( easterDay2.year == dateToCheck.year and easterDay2.month == dateToCheck.month and easterDay2.day == dateToCheck.day ) then
      returnValue = false
   end
-- Kristihimmelfärdsdag? +41 dagar från Långfredag?
   datum3 = os.date("*t", os.time({year = easterDay[1], month = easterDay[2], day = easterDay[3]})+41*24*60*60)
   if ( datum3.year == dateToCheck.year and datum3.month == dateToCheck.month and datum3.day == dateToCheck.day ) then
      returnValue = false
   end
-- hitta midsommardagen för att kunna kontrollera midsommarafton
-- midsommardagen = den lördag som infaller under tiden den 20-26 juni -> midsommarafton bör vara den fredag som inträffar under tiden 19-25 juni
   if ( dateToCheck.month == 6 and (dateToCheck.day >= 19 and dateToCheck.day <= 25) and dateToCheck.wday == 6 ) then
      returnValue = false
   end

   if ( Vacation_Days(dateToCheck) ) then
      returnValue = false
   end

   return returnValue
end

-- Main Start
-- Make sure the variables are correct at startup
if WorkDay(os.date("*t")) then
   fibaro:setGlobal("WorkToday","True");
else
   fibaro:setGlobal("WorkToday","False");
end
if WorkDay(os.date("*t", os.time()+24*60*60)) then
   fibaro:setGlobal("WorkTomorrow","True");
else
   fibaro:setGlobal("WorkTomorrow","False");
end

-- Main Loop
while true do
   local currentDate = os.date("*t");

-- Only update variables one time each day, 00:01
   if (string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "00:01") then
      if WorkDay(os.date("*t")) then
         fibaro:setGlobal("WorkToday","True");
      else
         fibaro:setGlobal("WorkToday","False");
      end
      if WorkDay(os.date("*t", os.time()+24*60*60)) then
         fibaro:setGlobal("WorkTomorrow","True");
      else
         fibaro:setGlobal("WorkTomorrow","False");
      end
    end

-- Turn off lamps 22:05 day before workday, 
-- and 00:30 day before holiday (test is WorkToday since we are after midnight)
    if (
       (fibaro:getGlobalValue("WorkTomorrow") == "True")
    and
       ( string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "22:30")
       )
    then
       fibaro:call(48, "turnOff");
       fibaro:sleep(math.random(6000,9000));
       fibaro:call(7, "turnOff");
       fibaro:sleep(math.random(8000,12000));
       fibaro:call(8, "turnOff");
       fibaro:sleep(math.random(5000,12000));
       fibaro:call(10, "turnOff");
       fibaro:sleep(math.random(2000,5000));
       fibaro:call(9, "turnOff");
       fibaro:sleep(math.random(8000,12000));
       fibaro:call(5, "turnOff");
       fibaro:sleep(math.random(6000,9000));
       fibaro:call(4, "turnOff");
       fibaro:sleep(math.random(5000,8000));
       fibaro:call(6, "turnOff");
       fibaro:sleep(math.random(10000,30000));
       fibaro:call(11, "turnOff");
    end

    if (
       (fibaro:getGlobalValue("WorkToday") == "False")
    and
       ( string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "00:30")
       )
    then
       fibaro:call(48, "turnOff");
       fibaro:sleep(math.random(6000,9000));
       fibaro:call(7, "turnOff");
       fibaro:sleep(math.random(8000,12000));
       fibaro:call(8, "turnOff");
       fibaro:sleep(math.random(5000,12000));
       fibaro:call(10, "turnOff");
       fibaro:sleep(math.random(2000,5000));
       fibaro:call(9, "turnOff");
       fibaro:sleep(math.random(8000,12000));
       fibaro:call(5, "turnOff");
       fibaro:sleep(math.random(6000,9000));
       fibaro:call(4, "turnOff");
       fibaro:sleep(math.random(5000,8000));
       fibaro:call(6, "turnOff");
       fibaro:sleep(math.random(10000,30000));
       fibaro:call(11, "turnOff");
    end

fibaro:sleep(60*1000);

end
sonnyboy: Du får ta koden ovan och byta ut enheterna på slutet.

Fråga: Vill ni verkligen ha det exakt 22:05 resp 00:30 - eller önskar ni slumpvis släckning oxå? Alltså säg mellan 22:00 - 22:15 resp 00:25 - 00:40?
Kör Home Assistant efter totalt nederlag för HomeSeer :twisted: :twisted: :mrgreen:
Johan71
Medlem
Posts: 84
Joined: 24 Jan 2014, 11:46
10

Bamsefar wrote:Right - mera slarvfel från min sida - sorry for that - skall bättre mig ;-)

Johan71: Radera din första scen (kalender) och BYT den andra (kväll) till nedanstående kod:

Code: Select all

--[[
%% autostart
%% properties
%% globals
--]]

function Vacation_Days(dateForCheck)

-- Ange vilka datum som skall anses som lediga datum
   local LedigaDatum = { "2014-05-02" , "2014-05-30" }

   local datum

   for z,datum in pairs(LedigaDatum)
       do
          TestDatum = os.date("*t", os.time({year = tonumber(string.sub(datum,1,4)), month = tonumber(string.sub(datum,6,7)), day = tonumber(string.sub(datum,9))}))
          if ( TestDatum.year == dateForCheck.year and TestDatum.month == dateForCheck.month and TestDatum.day == dateForCheck.day ) then
             return true
          end
       end
   return false
end

function Holidays_CalculateEaster(year)
    golden = (year % 19) + 1
    c = math.floor(year/400) + math.floor(8*(math.floor(year/100)+11)/25) - math.floor(year/100)
    s = (11 * golden + c) % 30
    if (s < 0) then
       s = s + 30
    end
    pfm = os.time{year=year, month=4, day=19} - s * 24 * 60 * 60
    if (pfm == os.time{year=year, month=4, day=19}) then
       pfm = pfm - 24 * 60 * 60
    elseif (pfm == os.time{year=year, month=4, day=18} and golden > 11) then
       pfm = pfm - 24 * 60 * 60
    end
    sunday = pfm + (7 - tonumber(os.date("%w", pfm))) * 24 * 60 * 60
    friday = sunday - 2 * 24 * 60 * 60

    return {year, tonumber(os.date("%m", friday)), tonumber(os.date("%d", friday))}
end

function WorkDay(dateToCheck)

   local easterDay
   local returnValue

   returnValue = true

-- Indatum är en lördag eller Söndag
   if ( dateToCheck.wday == 1 or dateToCheck.wday == 7 ) then
      returnValue = false
-- Indatum är nationaldag       
   elseif ( dateToCheck.month == 6 and dateToCheck.day == 6 ) then
      returnValue = false
-- Indatum är Nyårsdag eller trettondag
   elseif ( dateToCheck.month == 1 and (dateToCheck.day == 1 or dateToCheck.day == 6 ) ) then
      returnValue = false
-- Indatum är 1:a maj
   elseif ( dateToCheck.month == 5 and dateToCheck.day == 1 ) then
       returnValue = false
-- Indatum är Julafton,Juldag, Annandag eller Nyårsafton
   elseif ( dateToCheck.month == 12 and (dateToCheck.day == 24 or dateToCheck.day == 25 or dateToCheck.day == 26 or dateToCheck.day == 31) ) then
      returnValue = false
   end

-- Långfredag
   easterDay = Holidays_CalculateEaster(dateToCheck.year)
   if ( easterDay[1] == dateToCheck.year and easterDay[2] == dateToCheck.month and easterDay[3] == dateToCheck.day ) then
      returnValue = false
   end
-- AnnandagPåsk
   easterDay2 = os.date("*t", os.time({year = easterDay[1], month = easterDay[2], day = easterDay[3]})+3*24*60*60)
   if ( easterDay2.year == dateToCheck.year and easterDay2.month == dateToCheck.month and easterDay2.day == dateToCheck.day ) then
      returnValue = false
   end
-- Kristihimmelfärdsdag? +41 dagar från Långfredag?
   datum3 = os.date("*t", os.time({year = easterDay[1], month = easterDay[2], day = easterDay[3]})+41*24*60*60)
   if ( datum3.year == dateToCheck.year and datum3.month == dateToCheck.month and datum3.day == dateToCheck.day ) then
      returnValue = false
   end
-- hitta midsommardagen för att kunna kontrollera midsommarafton
-- midsommardagen = den lördag som infaller under tiden den 20-26 juni -> midsommarafton bör vara den fredag som inträffar under tiden 19-25 juni
   if ( dateToCheck.month == 6 and (dateToCheck.day >= 19 and dateToCheck.day <= 25) and dateToCheck.wday == 6 ) then
      returnValue = false
   end

   if ( Vacation_Days(dateToCheck) ) then
      returnValue = false
   end

   return returnValue
end

-- Main Start
-- Make sure the variables are correct at startup
if WorkDay(os.date("*t")) then
   fibaro:setGlobal("WorkToday","True");
else
   fibaro:setGlobal("WorkToday","False");
end
if WorkDay(os.date("*t", os.time()+24*60*60)) then
   fibaro:setGlobal("WorkTomorrow","True");
else
   fibaro:setGlobal("WorkTomorrow","False");
end

-- Main Loop
while true do
   local currentDate = os.date("*t");

-- Only update variables one time each day, 00:01
   if (string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "00:01") then
      if WorkDay(os.date("*t")) then
         fibaro:setGlobal("WorkToday","True");
      else
         fibaro:setGlobal("WorkToday","False");
      end
      if WorkDay(os.date("*t", os.time()+24*60*60)) then
         fibaro:setGlobal("WorkTomorrow","True");
      else
         fibaro:setGlobal("WorkTomorrow","False");
      end
    end

-- Turn off lamps 22:05 day before workday, 
-- and 00:30 day before holiday (test is WorkToday since we are after midnight)
    if (
       (fibaro:getGlobalValue("WorkTomorrow") == "True")
    and
       ( string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "22:30")
       )
    then
       fibaro:call(48, "turnOff");
       fibaro:sleep(math.random(6000,9000));
       fibaro:call(7, "turnOff");
       fibaro:sleep(math.random(8000,12000));
       fibaro:call(8, "turnOff");
       fibaro:sleep(math.random(5000,12000));
       fibaro:call(10, "turnOff");
       fibaro:sleep(math.random(2000,5000));
       fibaro:call(9, "turnOff");
       fibaro:sleep(math.random(8000,12000));
       fibaro:call(5, "turnOff");
       fibaro:sleep(math.random(6000,9000));
       fibaro:call(4, "turnOff");
       fibaro:sleep(math.random(5000,8000));
       fibaro:call(6, "turnOff");
       fibaro:sleep(math.random(10000,30000));
       fibaro:call(11, "turnOff");
    end

    if (
       (fibaro:getGlobalValue("WorkToday") == "False")
    and
       ( string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "00:30")
       )
    then
       fibaro:call(48, "turnOff");
       fibaro:sleep(math.random(6000,9000));
       fibaro:call(7, "turnOff");
       fibaro:sleep(math.random(8000,12000));
       fibaro:call(8, "turnOff");
       fibaro:sleep(math.random(5000,12000));
       fibaro:call(10, "turnOff");
       fibaro:sleep(math.random(2000,5000));
       fibaro:call(9, "turnOff");
       fibaro:sleep(math.random(8000,12000));
       fibaro:call(5, "turnOff");
       fibaro:sleep(math.random(6000,9000));
       fibaro:call(4, "turnOff");
       fibaro:sleep(math.random(5000,8000));
       fibaro:call(6, "turnOff");
       fibaro:sleep(math.random(10000,30000));
       fibaro:call(11, "turnOff");
    end

fibaro:sleep(60*1000);

end
sonnyboy: Du får ta koden ovan och byta ut enheterna på slutet.

Fråga: Vill ni verkligen ha det exakt 22:05 resp 00:30 - eller önskar ni slumpvis släckning oxå? Alltså säg mellan 22:00 - 22:15 resp 00:25 - 00:40?

random vore lite fränt, men jag har väl möjlighet att editera det senare?
MVH Johan
_____________________________
Fibaro Home Center 2
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
11
Location: Västerås

Johan71 wrote:Fråga: Vill ni verkligen ha det exakt 22:05 resp 00:30 - eller önskar ni slumpvis släckning oxå? Alltså säg mellan 22:00 - 22:15 resp 00:25 - 00:40?
Det skulle ju vara riktigt fränt med slumpvis släckning :)
Har uppdaterat koden nu, så får vi se hur det går ikväll ;)
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
User avatar
Bamsefar
Z-Wave Kung
Posts: 1268
Joined: 25 Nov 2013, 15:06
10
Location: Stockholm

Ni kan ju titta på koden som finns i min tråd om min installation:
http://www.zwaveforum.se/viewtopic.php?f=30&t=4706

Där finns allt som behövs ;-)
Kör Home Assistant efter totalt nederlag för HomeSeer :twisted: :twisted: :mrgreen:
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
11
Location: Västerås

Den uppdaterade koden funkade som förväntat :) Bugar & bockar.
Ska kolla på slumpmässig släckning inom intervall så fort jag får tid.

Just nu försöker jag lösa en "Nexa pir", den startar en scen som tänder på toa, och släcker efter 5 minuter om ingen släckt när dom gått ut. Det funkar ganska bra.
Men om någon vart in på muggen och släckt manuellt, och någon går in efter 4 minuter, då tänds lampan som den ska, men släcks efter 1 minut :(
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
User avatar
Bamsefar
Z-Wave Kung
Posts: 1268
Joined: 25 Nov 2013, 15:06
10
Location: Stockholm

Kolla min tråd där jag beskriver mitt system, det finns en del tips i den för ditt badrum....
Kör Home Assistant efter totalt nederlag för HomeSeer :twisted: :twisted: :mrgreen:
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
11
Location: Västerås

@Bamsefar
Nu har jag prövat detta ett tag och det ser bra ut, men jag får inte till detta, jag skickar denna sträng till hc:2 http://192.168.88.148/api/callAction?de ... &arg2=3600
där arg2 är slidern, skickar jag 1 eller 3600 så börjar den räkna från 60 minuter........
Har du nå tips?
Edit: löste det själv, bara att ändra "defaultTime":
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
11
Location: Västerås

Hm workday false, då ska det slockna klockan 23, 30. Nu 23.51 stängde jag ner manuellt. Är det pga röda dagen i morgon som det blir nå knas? Funkar hur bra som helst på helgen.

Skickat från min SM-G900F via Tapatalk
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
User avatar
Bamsefar
Z-Wave Kung
Posts: 1268
Joined: 25 Nov 2013, 15:06
10
Location: Stockholm

Sonnyboy: Det är inte så att du missat att jag hade 05-02 och idag 05-05 som lediga dagar i början av scriptet? Jag har ju varit i Spanien och därför markerat dessa dagar som lediga... Det gör att om du inte ändrat så har fredagen den 2a maj och idag måndag den 5e maj klassats som lediga dagar?
Kör Home Assistant efter totalt nederlag för HomeSeer :twisted: :twisted: :mrgreen:
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
11
Location: Västerås

Jag hade ändrat på tiden och dagarna i koden. Men den släckte inte iaf. Men vi får se igen den 30 maj ;)

Nu har den fått en omstart också, hade gjort mycket förändringar.
Gillar din lua skarpt ☺

Skickat från min SM-G900F via Tapatalk
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
Johan71
Medlem
Posts: 84
Joined: 24 Jan 2014, 11:46
10

Här fungerar det klockrent nu


Skickas från min iPad via Tapatalk
MVH Johan
_____________________________
Fibaro Home Center 2
User avatar
Bamsefar
Z-Wave Kung
Posts: 1268
Joined: 25 Nov 2013, 15:06
10
Location: Stockholm

sonnyboy wrote:Hm workday false, då ska det slockna klockan 23, 30. Nu 23.51 stängde jag ner manuellt. Är det pga röda dagen i morgon som det blir nå knas? Funkar hur bra som helst på helgen.

Skickat från min SM-G900F via Tapatalk
Nu först ser jag två saker:
1. Du skriver 23.51 men inlägget är postat 22.53 - vart lever du eller är det forumets klocka som går galet?
2. Den 30e april är inte false, det var den inte hos mig för då var jag hemma - MEN hemma hos mig så skall lamporna slockna senare DAG FÖRE LEDIG DAG. Alltså workdaytomorrow är false. Således vad menar du - eller kan du posta koden så kan jag kolla om det finns något som påverkar?

Och sedan då:
3. Varför först den 30e Maj?
Kör Home Assistant efter totalt nederlag för HomeSeer :twisted: :twisted: :mrgreen:
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
11
Location: Västerås

Bamsefar wrote:1. Du skriver 23.51 men inlägget är postat 22.53 - vart lever du eller är det forumets klocka som går galet?
Något med forumklockan, jag bor I Västeras.
Bamsefar wrote:2. Den 30e april är inte false, det var den inte hos mig för då var jag hemma - MEN hemma hos mig så skall lamporna slockna senare DAG FÖRE LEDIG DAG. Alltså workdaytomorrow är false. Således vad menar du - eller kan du posta koden så kan jag kolla om det finns något som påverkar?
Skulle vara workday tomorrow false, och då ska det släckas 23:20 annars 22:22
Bamsefar wrote:Och sedan då:
3. Varför först den 30e Maj
Tankevurpa från mig, tänkte den 30 maj var röd dag men så är det ju inte, jag är bara ledig.

Del av min kod nedan, det är bara sista april som jag haft problem, annars så funkar det presis om jag tänkt.

Code: Select all

-- Ange vilka datum som skall anses som lediga datum
   local LedigaDatum = { "2014-05-02" , "2014-05-30" }


(fibaro:getGlobalValue("WorkTomorrow") == "True")
    and
       ( string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "22:22")
       )
    then
       	fibaro:call(38, "turnOff");--Köksfönstren
   		fibaro:sleep(math.random(8000,12000)); 
   		fibaro:call(4, "turnOff");--Bakom Soffan
   		fibaro:sleep(math.random(5000,8000));
   		fibaro:call(33, "turnOff");--Vitrinskåpet
   		fibaro:sleep(math.random(8000,12000));
   		fibaro:call(45, "turnOff");--Bakom Tvn
   		fibaro:sleep(math.random(8000,12000));
   		fibaro:call(36, "turnOff");--Fönsterlampa Alcia
  	 	fibaro:sleep(math.random(8000,12000));
   		fibaro:call(34, "turnOff");--Lampa Byrån
   		fibaro:sleep(math.random(8000,12000));

    end

(fibaro:getGlobalValue("WorkToday") == "False")
    and
       ( string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "23:20")
       )
    then
        fibaro:call(38, "turnOff");--Köksfönstren
        fibaro:sleep(math.random(8000,12000)); 
        fibaro:call(4, "turnOff");--Bakom Soffan
        fibaro:sleep(math.random(5000,8000));
        fibaro:call(33, "turnOff");--Vitrinskåpet
        fibaro:sleep(math.random(8000,12000));
   	fibaro:call(45, "turnOff");--Bakom Tvn
  	fibaro:sleep(math.random(8000,12000));
  	fibaro:call(36, "turnOff");--Fönsterlampa Alcia
  	fibaro:sleep(math.random(8000,12000));
   	fibaro:call(34, "turnOff");--Lampa Byrån
   	fibaro:sleep(math.random(8000,12000));
    end
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
User avatar
Bamsefar
Z-Wave Kung
Posts: 1268
Joined: 25 Nov 2013, 15:06
10
Location: Stockholm

Okej, då ser jag två saker:
1) Anledningen till testet "WorkToday=Flase" i ena läget är för att Johan71 ville testa EFTER dygnsskifte (00.30). Om du släcker innan dygnsskiftet så bör du såklart använda: "WorkTomorrow=False" om du vill försena släckningen dag FÖRE ledig dag. Annars kan det nog bi lite udda effekter.
2) Jag antar att anropen som sätter WorkToday resp WokrTomorrow ligger i koden ovan och att all kod ligger i samma scen?
Kör Home Assistant efter totalt nederlag för HomeSeer :twisted: :twisted: :mrgreen:
Post Reply