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: 329
Joined: 17 Oct 2013, 22:40

30 Mar 2015, 18:26

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
Bamsefar
Z-Wave Kung
Posts: 1061
Joined: 25 Nov 2013, 15:06
Location: Stockholm

30 Mar 2015, 19:46

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
Använder HomeSeer 3 på Linux - attans så här bra har det aldrig varit!

Lua för nybörjare
Robert
Medlem
Posts: 329
Joined: 17 Oct 2013, 22:40

30 Mar 2015, 20:09

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
Ny medlem
Posts: 5
Joined: 05 Jan 2014, 00:44

02 Apr 2015, 18:48

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: 329
Joined: 17 Oct 2013, 22:40

02 Apr 2015, 19:52

Snyggt jobbat och tack! :)
ZeeSweden
Ny medlem
Posts: 21
Joined: 07 Dec 2013, 09:35
Location: Göteborg

26 Apr 2015, 12:31

Tack för scriptet. Här kommer en icon för Earth Hour.
Attachments
earthhour128px.png
earthhour128px.png (24.51 KiB) Viewed 53173 times
_________________________________________
Kör HC2 med diverse puckar
Robert
Medlem
Posts: 329
Joined: 17 Oct 2013, 22:40

05 Jan 2017, 19:56

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: 329
Joined: 17 Oct 2013, 22:40

01 Apr 2018, 14:24

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"}})
Post Reply