Earth Hour för flera år framöver

Hjälp varandra att vara kreativa för att göra hemmet mer bekvämt.
Post Reply
Robert
Medlem
Posts: 346
Joined: 17 Oct 2013, 22:40
10

Hej.

Fixade en scen som släckte ner för Earth Hour i lördags, vilket fungerade väldigt bra. Nu har jag ändrat datum så att den även ska köra nästa år. Så min frågar är hur jag lägger till flera olika datum så att scriptet fungerar låt säga 50 år framöver. Earth Hour utspelar sig på olika datum. http://www.timeanddate.com/holidays/world/earth-hour

Såhär ser min kod ut just nu. Kan det vara så enkelt att jag bara lägger till flera if-satser med alla datum? Typ IF och AND. Förklara gärna för mig så kanske jag lär mig något också :D

Kan tillägga att koden är konverterad från blocks från början.

Code: Select all

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

local sourceTrigger = fibaro:getSourceTrigger();
function tempFunc()
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
 ( string.format("%04d-%02d-%02d %02d:%02d", currentDate.year, currentDate.month, currentDate.day, currentDate.hour, currentDate.min) == "2016-03-26 20:30" )
)
then
	fibaro:startScene(248);
	fibaro:call(54, "sendDefinedPushNotification", "245");
	fibaro:call(83, "sendDefinedPushNotification", "245");
	setTimeout(function()
	fibaro:call(4, "turnOn");
	fibaro:call(5, "turnOn");
	fibaro:call(9, "turnOn");
	fibaro:call(104, "turnOn");
    fibaro:call(91, "turnOn");
    fibaro:call(26, "turnOn");
	end, 3600000)
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:startScene(248);
	fibaro:call(54, "sendDefinedPushNotification", "245");
	fibaro:call(83, "sendDefinedPushNotification", "245");
	setTimeout(function()
	fibaro:call(4, "turnOn");
	fibaro:call(5, "turnOn");
	fibaro:call(9, "turnOn");
	fibaro:call(104, "turnOn");
    fibaro:call(91, "turnOn");
    fibaro:call(26, "turnOn");
	end, 3600000)
end

end
User avatar
Bamsefar
Z-Wave Kung
Posts: 1230
Joined: 25 Nov 2013, 15:06
10
Location: Stockholm

Ehhmmmm... du har bara "turnOn" - inget som släcker vid 20.30? Och vad är scen 248?

För mera "datumliknande" tester kan du alltid titta på min VD som testar workday (dvs påsk), den har datumhantering i sig:

http://www.zwaveforum.se/viewtopic.php?f=21&t=4656
Testar Home Assistant på Raspberry Pi4B - nice :mrgreen:
Robert
Medlem
Posts: 346
Joined: 17 Oct 2013, 22:40
10

fibaro:startScene(248) Är för att släcka alla lampor :) Då jag använder scene 248 för flera olika saker så ändrar jag endast i den vid behov. Då slipper jag pilla i fler scener för att jag samma ändring.

Så enkelt svarat så släcker den scenen alla mina lampor jag har :) Jag tittar på din VD och försöker sno lite :) tack.
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

Blev också inspirerad att inte glömma earth hour i framtiden. Insåg sedan de absurda i att skriva ett skript som man tror ska vara kompatibelt med Fibaro om 5 år... ;)
Har man en scen för att släcka och en för att tända blir det enkelt, som i första exemplet - vill man göra en smartare 'restore' får man göra ngt i stil med andra exemplet. Kräver v4 med setTimeout.

Code: Select all

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

local earthHourDates = { -- Earth hour dates
os.time{year=2016, month=3, day=26, hour=20, min=30},
os.time{year=2017, month=3, day=25, hour=20, min=30},
os.time{year=2018, month=3, day=31, hour=20, min=30},
os.time{year=2019, month=3, day=30, hour=20, min=30},
os.time{year=2020, month=3, day=28, hour=20, min=30}}

---- Alternative 1, using scene for turning on/off lights
local IDSceneTurnOff = 45
local IDSceneTurnOn = 46

for _,t in pairs(earthHourDates) do
  if (t-os.time() > 0) then
    setTimeout(function () 
        -- Notify here that Earth hour started
        fibaro:startScene(IDSceneTurnOff); -- Turn off lights
        setTimeout(function() fibaro:startScene(IDSceneTurnOn) end, 60*60*1000) -- Turn back on in 60min
      end, 
    t-os.time())
  end
end

---- Alternative 2, with list of lights and restoring light states afterwards
local lights = {41,66,91,187,3,55,100} -- lights/plugs that should be turned off

function map(fun, list)
  local res = {}
  for i,v in pairs(list) do res[i] = fun(v) end
  return res;
end

map(function(t)
  if (t-os.time() < 0) then return end -- Event in the past
  setTimeout(function () -- save old states and turn off lights
    -- Notify here that Earth hour started
    local states = map(function(id) return {id, fibaro:getValue(id,'value'), fibaro:call(id,'turnOff')} end, lights) 
    setTimeout(function() -- restore lights after 60min
        -- Notify here that Earth hour ended
        map(function(v) fibaro:setValue(v[1],v[2]) end, states) end, 
        60*60*1000)
    end, 
    t-os.time())
  end, earthHourDates)
Robert
Medlem
Posts: 346
Joined: 17 Oct 2013, 22:40
10

Snyggt jobbat och tack! :)
ZeeSweden
Medlem
Posts: 28
Joined: 07 Dec 2013, 09:35
10
Location: Göteborg

Tack för scriptet. Här kommer en icon för Earth Hour.
Attachments
earthhour128px.png
earthhour128px.png (24.51 KiB) Viewed 71058 times
_________________________________________
Kör HC2 med diverse puckar :lol:
Tibber med Easee och Watty
https://invite.tibber.com/4a1de51e
Robert
Medlem
Posts: 346
Joined: 17 Oct 2013, 22:40
10

Min GEA kod för Earth Hour

Code: Select all

-- Earth Hour - Datum fram till 2020.
     -- Notis via push och Sonos om att Earth Hour börjar om 30 min.
     GEA.add (true, 30, "Earth Hour börjar om 30 minuter. Förbered levande ljus ifall ni vill se något i mörkret :)", {{"If", {{"Global", "Status", "Hemma"}}}, {"Dates", "25/03/2017", "25/03/2017"}, {"Dates", "31/03/2018", "31/03/2018"}, {"Dates", "30/03/2019", "30/03/2019"}, {"Dates", "28/03/2020", "28/03/2020"}, {"Time", "20:00", "20:01"}, {"VirtualDevice", VD["TTS"], "7"}})
    -- Sätter den globala variabeln till aktivt läge, 1.
    GEA.add (true, 30, "", {{"If", {{"Global", "Status", "Hemma"}}}, {"Dates", "25/03/2017", "25/03/2017"}, {"Dates", "31/03/2018", "31/03/2018"}, {"Dates", "30/03/2019", "30/03/2019"}, {"Dates", "28/03/2020", "28/03/2020"}, {"Time", "20:30", "20:31"}, {"Global", "EarthHour", "1"}})
     -- Påbörjar Earth Hour. Släcker alla lampor, pushar ut notis på mobiler och Sonos.
   GEA.add ({"Global", "EarthHour", "1"}, -1, "Earth Hour påbörjad. Avslutas 21:30.", {{"If", {{"Global", "Status", "Hemma"}}}, {"Dates", "25/03/2017", "25/03/2017"}, {"Dates", "31/03/2018", "31/03/2018"}, {"Dates", "30/03/2019", "30/03/2019"}, {"Dates", "28/03/2020", "28/03/2020"}, {"Time", "20:30", "20:31"}, {"VirtualDevice", VD["OnOff_Belysning"], "2"}, {"VirtualDevice", VD["TTS"], "8"}})
     -- Sätter den globala variabeln till inaktivt läge, 0.
     GEA.add (true, 30, "", {{"If", {{"Global", "Status", "Hemma"}}}, {"Dates", "25/03/2017", "25/03/2017"}, {"Dates", "31/03/2018", "31/03/2018"}, {"Dates", "30/03/2019", "30/03/2019"}, {"Dates", "28/03/2020", "28/03/2020"}, {"Time", "21:30", "21:31"}, {"Global", "EarthHour", "0"}})
     -- Avslutar Earth Hour. Tänder lamporna igen, pushar ut notis på mobiler och Sonos.
     GEA.add ({"Global", "EarthHour", "0"}, -1, "Earth Hour avslutad. Lamporna tänds.", {{"If", {{"Global", "Status", "Hemma"}}}, {"Dates", "25/03/2017", "25/03/2017"}, {"Dates", "31/03/2018", "31/03/2018"}, {"Dates", "30/03/2019", "30/03/2019"}, {"Dates", "28/03/2020", "28/03/2020"}, {"Time", "21:30", "21:31"}, {"VirtualDevice", VD["OnOff_Belysning"], "3"}, {"VirtualDevice", VD["TTS"], "9"}})
Robert
Medlem
Posts: 346
Joined: 17 Oct 2013, 22:40
10

Uppdaterad kod för GEA 6+. Har även städat koden lite.

Code: Select all

-- Earth Hour - Datum fram till 2020.
  	-- Notis via push och via Sonos om att Earth Hour börjar om 30 min.
    GEA.add ({{"Dates", "24/03/2018"}, {"Dates", "30/03/2019"}, {"Dates", "28/03/2020"}, {"Time", "20:00"}, {"Global", "Status", "Hemma"}}, 30, "Earth Hour börjar om 30 minuter. Förbered levande ljus ifall ni vill se något i mörkret :)", {"VirtualDevice", VD["TTS"], "7"})
    -- Påbörjar Earth Hour. Släcker alla lampor, pushar ut notis på mobiler och Sonos.
    GEA.add ({{"Dates", "24/03/2018"}, {"Dates", "30/03/2019"}, {"Dates", "28/03/2020"}, {"Time", "20:30"}, {"Global", "Status", "Hemma"}}, 30, "Earth Hour påbörjad. Avslutas 21:30.", {{"VirtualDevice", VD["ONOFF_BELYSNING"], "2"}, {"VirtualDevice", VD["ONOFF_BELYSNING"], "1"}, {"VirtualDevice", VD["TTS"], "8"}})
    -- Avslutar Earth Hour. Tänder lamporna igen, pushar ut notis på mobiler och Sonos.
  	GEA.add ({{"Dates", "24/03/2018"}, {"Dates", "30/03/2019"}, {"Dates", "28/03/2020"}, {"Time", "21:30"}, {"Global", "Status", "Hemma"}}, 30, "Earth Hour avslutad. Lamporna tänds.", {{"VirtualDevice", VD["ONOFF_BELYSNING"], "3"}, {"VirtualDevice", VD["ONOFF_BELYSNING"], "9"}, {"VirtualDevice", VD["TTS"], "9"}})
User avatar
Texan
Medlem
Posts: 169
Joined: 25 Dec 2015, 15:07
8

Hej, prövade denna kod igår men fick den inte att fungera så jag skulle behöva hjälp med vad som är fel.
Tog bor raderna i koden där det stog alternativ 1 och körde med mina enheter listade i alternativ 2.
(Prövade igen idag med ett annat datum).
Men får följande fel.

[DEBUG] 19:28:54: 2019-03-31 19:28:54:009420 [ error] timer handler failed with error:
opt/fibaro/FibaroSceneAPI.lua:209: attempt to concatenate local 'sceneID' (a nil value)

Code: Select all

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

local earthHourDates = { -- Earth hour dates
os.time{year=2016, month=3, day=26, hour=20, min=30},
os.time{year=2017, month=3, day=25, hour=20, min=30},
os.time{year=2018, month=3, day=31, hour=20, min=30},
os.time{year=2019, month=3, day=30, hour=20, min=30},
os.time{year=2020, month=3, day=28, hour=20, min=30}}

for _,t in pairs(earthHourDates) do
  if (t-os.time() > 0) then
    setTimeout(function () 
        -- Notify here that Earth hour started
        fibaro:startScene(IDSceneTurnOff); -- Turn off lights
        setTimeout(function() fibaro:startScene(IDSceneTurnOn) end, 60*60*1000) -- Turn back on in 60min
      end, 
    t-os.time())
  end
end

---- Alternative 2, with list of lights and restoring light states afterwards
local lights = {41,66,91,187,3,55,100} -- lights/plugs that should be turned off

function map(fun, list)
  local res = {}
  for i,v in pairs(list) do res[i] = fun(v) end
  return res;
end

map(function(t)
  if (t-os.time() < 0) then return end -- Event in the past
  setTimeout(function () -- save old states and turn off lights
    -- Notify here that Earth hour started
    local states = map(function(id) return {id, fibaro:getValue(id,'value'), fibaro:call(id,'turnOff')} end, lights) 
    setTimeout(function() -- restore lights after 60min
        -- Notify here that Earth hour ended
        map(function(v) fibaro:setValue(v[1],v[2]) end, states) end, 
        60*60*1000)
    end, 
    t-os.time())
  end, earthHourDates)
  /code]
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

Texan wrote: 31 Mar 2019, 21:44 Hej, prövade denna kod igår men fick den inte att fungera så jag skulle behöva hjälp med vad som är fel.
Tog bor raderna i koden där det stog alternativ 1 och körde med mina enheter listade i alternativ 2.
(Prövade igen idag med ett annat datum).
Men får följande fel.

[DEBUG] 19:28:54: 2019-03-31 19:28:54:009420 [ error] timer handler failed with error:
opt/fibaro/FibaroSceneAPI.lua:209: attempt to concatenate local 'sceneID' (a nil value)
En ny version här har en variabel 'ALT1' som om den är sann kör det första alternativet annars det andra. Som det är uppsatt nu kör den det andra.
Vad som kan ha gått fel var ett felaktigt anrop till fibaro:setValue, ska vara fibaro:call(id,"setValue",..). Fixat och lagt till en debug rad för datum. Verkade också vara fel på setTimeout (glömt att multiplicera med 1000 för att få millisekunder). Nu borde det funka.

Code: Select all

--[[
%% properties
%% globals
%% autostart
--]]
if dofile and not _EMULATED then _EMBEDDED={name="EarthHour", id=101} dofile("HC2.lua") end

local earthHourDates = { -- Earth hour dates
  os.time{year=2016, month=3, day=26, hour=20, min=30},
  os.time{year=2017, month=3, day=25, hour=20, min=30},
  os.time{year=2018, month=3, day=31, hour=20, min=30},
  os.time{year=2019, month=3, day=30, hour=20, min=30},
  os.time{year=2020, month=3, day=28, hour=20, min=30}}

if ALT1 then
  for _,t in pairs(earthHourDates) do
    if (t-os.time() > 0) then
     fibaro:debug("Förbereder Earth hour för "..os.date("%c",t))
      setTimeout(function () 
          -- Notify here that Earth hour started
          fibaro:startScene(IDSceneTurnOff); -- Turn off lights
          setTimeout(function() fibaro:startScene(IDSceneTurnOn) end, 60*60*1000) -- Turn back on in 60min
        end, 
        1000*(t-os.time()))
    end
  end

else
---- Alternative 2, with list of lights and restoring light states afterwards
  local lights = {41,66,91,187,3,55,100} -- lights/plugs that should be turned off

  function map(fun, list)
    local res = {}
    for i,v in pairs(list) do res[i] = fun(v) end
    return res;
  end

  map(function(t)
      if (t-os.time() < 0) then return end -- Event in the past
      fibaro:debug("Förbereder Earth hour för "..os.date("%c",t))
      setTimeout(function () -- save old states and turn off lights
          -- Notify here that Earth hour started
          local states = map(function(id) return {id, fibaro:getValue(id,'value'), fibaro:call(id,'turnOff')} end, lights) 
          setTimeout(function() -- restore lights after 60min
              -- Notify here that Earth hour ended
              map(function(v) fibaro:call(v[1],"setValue",v[2]) end, states) end, 
              60*60*1000)
          end, 
          1000*(t-os.time()))
      end, earthHourDates)
  end
  
User avatar
Texan
Medlem
Posts: 169
Joined: 25 Dec 2015, 15:07
8

Hej igen,
Prövade den nya koden, alla lysena släcktes men inte alla enheter tändes igen efter 1 timme, några av enheterna förblev släckta.
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

Texan wrote: 01 Apr 2019, 21:35 Hej igen,
Prövade den nya koden, alla lysena släcktes men inte alla enheter tändes igen efter 1 timme, några av enheterna förblev släckta.
Vad är det för typ av lampor?
Antagandet är att x=fibaro:getValue(id,'value') ska returnera ett värde som fibaro:call(id."setValue",x) återställer.
Det funkar för wall-plugs, och vanliga switchar inkl. dimmers.
Har du RGB devices?
Oh, det funkar inte med fibaros bristfälliga implementationer av Hue lampor.
User avatar
Texan
Medlem
Posts: 169
Joined: 25 Dec 2015, 15:07
8

Jag har lagt till Fibaro enheter så som wall-plugs, switchar, dimmers och dimmers från Qubino. De som inte tändes var vissa Fibaro enheter både plugs, dimmers och switchar. Har inte prövat alls med några RGB enheter.

Vilken styr 60min, vill ändra så jag kan pröva utan att vänta så länge?
60*60*1000
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

Texan wrote: 01 Apr 2019, 22:43 Jag har lagt till Fibaro enheter så som wall-plugs, switchar, dimmers och dimmers från Qubino. De som inte tändes var vissa Fibaro enheter både plugs, dimmers och switchar. Har inte prövat alls med några RGB enheter.

Vilken styr 60min, vill ändra så jag kan pröva utan att vänta så länge?
60*60*1000
Ja det är 60*60*1000. Tiden ska anges i millisekunder 10s test blir 10*1000.
Lägg in os.time()+2 sist i earthHourDates tabellen så schedulerar den en släckning till 2s efter scenen startat.

Det har inte drabbat mig, men vissa har ”överbelastade” nät som inte tål så många kommandon så snabbt (men den släckte alla ljus?)
Kan prova isåfall att stoppa in en liten fördröjning

Code: Select all

map(function(v) fibaro:call(v[1],"setValue",v[2]) fibaro:wait(500) end, states) end,
500 är ms här också
User avatar
Texan
Medlem
Posts: 169
Joined: 25 Dec 2015, 15:07
8

Får det inte att fungera, vet inte riktigt vart jag ska ändra i koden :oops:
Vore tacksam vart i koden som jag ska pröva, för jag får inte lamporna att tändas.

Code: Select all

--[[
%% properties
%% globals
%% autostart
--]]
if dofile and not _EMULATED then _EMBEDDED={name="EarthHour", id=101} dofile("HC2.lua") end

local earthHourDates = { -- Earth hour dates
  os.time{year=2016, month=3, day=26, hour=20, min=30},
  os.time{year=2017, month=3, day=25, hour=20, min=30},
  os.time{year=2018, month=3, day=31, hour=20, min=30},
  os.time{year=2019, month=4, day=2, hour=23, min=14},
  os.time{year=2020, month=3, day=28, hour=20, min=30}}
  

if ALT1 then
  for _,t in pairs(earthHourDates) do
    if (t-os.time() > 0) then
     fibaro:debug("Förbereder Earth hour för "..os.date("%c",t))
      setTimeout(function () 
          -- Notify here that Earth hour started
          fibaro:startScene(IDSceneTurnOff); -- Turn off lights
          setTimeout(function() fibaro:startScene(IDSceneTurnOn) end, 60*60*1000) -- Turn back on in 60min
        end, 
        1000*(t-os.time()))
    end
  end

else
---- Alternative 2, with list of lights and restoring light states afterwards
  local lights = {40,159,75,28,287,103,33,68,237,87,254,274,206,30,78,138} -- lights/plugs that should be turned off

  function map(fun, list)
    local res = {}
    for i,v in pairs(list) do res[i] = fun(v) end
    return res;
  end

  map(function(t)
      if (t-os.time() < 0) then return end -- Event in the past
      fibaro:debug("Förbereder Earth hour för "..os.date("%c",t))
      setTimeout(function () -- save old states and turn off lights
          -- Notify here that Earth hour started
          local states = map(function(id) return {id, fibaro:getValue(id,'value'), fibaro:call(id,'turnOff')} end, lights) 
          setTimeout(function() -- restore lights after 60min
              -- Notify here that Earth hour ended
              map(function(v) fibaro:call(v[1],"setValue",v[2]) fibaro:sleep(500) end, states) end, 
              60*60*1000)
          end, 
          1000*(t-os.time()))
      end, earthHourDates)
  end
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

Hmm, jag borde skämmas. Någon av de senaste releaserna av HC2 har ändrat beteendet på on/off switchar. Man brukade kunna slå av/på dem genom setValue med 0 eller 1... Nu tar de bara turnOn/turnOff. Jag tycker det helt klart är en designmiss av Fibaro att bryta getValue/setValue symmetrin... men vi kan inte gråta över de vägar Fibaro tar...
Jag hoppas det funkar nu.

Code: Select all

--[[
%% properties
%% globals
%% autostart
--]]
if dofile and not _EMULATED then _EMBEDDED={name="EarthHour", id=101} dofile("HC2new.lua") end

local earthHourDates = { -- Earth hour dates
  os.time{year=2016, month=3, day=26, hour=20, min=30},
  os.time{year=2017, month=3, day=25, hour=20, min=30},
  os.time{year=2018, month=3, day=31, hour=20, min=30},
  os.time{year=2020, month=3, day=28, hour=20, min=30},}

EARTHTIME=60*60 -- Turn off lamps for 1 hour 

-- TEST TEST TEST TEST, run earthHour at startup+2s, turning off lamps, and turn back on 10s later
earthHourDates[#earthHourDates+1]=os.time()+2
EARTHTIME=10

---- Alternative 2, with list of lights and restoring light states afterwards
local lights = {40,159,75,28,287,103,33,68,237,87,254,274,206,30,78,138} -- lights/plugs that should be turned off

function map(fun, list)
  local res = {}
  for i,v in pairs(list) do res[i] = fun(v) end
  return res;
end

map(function(t)
    if (t-os.time() < 0) then return end -- Event in the past
    fibaro:debug("Förbereder Earth hour för "..os.date("%c",t))
    setTimeout(function () -- save old states and turn off lights
        -- Notify here that Earth hour started
        local states = map(function(id) return {id, fibaro:getValue(id,'value'), fibaro:call(id,'turnOff')} end, lights) 
        setTimeout(function() -- restore lights after 60min
            -- Notify here that Earth hour ended
            map(function(v) if v[2]=='1' then fibaro:call(v[1],"turnOn") else fibaro:call(v[1],"setValue",v[2]) end end, states) end, 
            EARTHTIME*1000)
        end, 
        1000*(t-os.time()))
    end, earthHourDates)
    
User avatar
Texan
Medlem
Posts: 169
Joined: 25 Dec 2015, 15:07
8

:D
Perfekt, nu fungerar det - tack så mycket för koden och all hjälp.
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

Texan wrote: 03 Apr 2019, 20:14 :D
Perfekt, nu fungerar det - tack så mycket för koden och all hjälp.
Äntligen :D
Post Reply