Forum użytkowników automatyki budynkowej
Z-wave => Fibaro - sceny => Wątek zaczęty przez: admin w Marzec 24, 2015, 08:43:13 pm
-
Niemałym kłopotem w moim inteligentnym domu są dni wolne ustawowo od pracy które przypadają od poniedziałku do piątku. Wtedy niepotrzebnie rano otwierają się rolety (a mógłbym pospać dłużej), niepotrzebnie odzywa się budzik czy zmienia program ogrzewania. Postanowiłem coś z tym zrobić tak żeby mój dom wiedział o tym że jest dzień wolny. Opracowałem więc scenę która to w odpowiedni sposób wylicza.
Scena sprawdza, czy dzisiaj mamy dzień roboczy czy wolny i wstawia do zmiennej globalnej wartość 1 jeśli wolny lub 0 jeśli dzień pracujący.
Dzień wolny to : soboty, niedziele, dni ustawowo wolne w tym ruchome „lany poniedziałek” i „boże ciało”. Scena uruchamia się sama, codziennie o godzinie 00:01.
Można to wykorzystać później w scenach bloczkowych.
Przed uruchomieniem sceny należy założyć zmienną globalną o nazwie : „dzien_wolny”
--[[
%% autostart
%% properties
%% globals
--]]local sourceTrigger = fibaro:getSourceTrigger();
if (sourceTrigger["type"] == "autostart") then
while true do
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
( ((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "00:01") )
)
then
wolny=0
rok=os.date("%Y")
zm = (rok % 19) + 1
c = math.floor(rok/400) + math.floor(8*(math.floor(rok/100)+11)/25) - math.floor(rok/100)
s = (11 * zm + c) % 30
if (s < 0) then
s = s + 30
end
pfm = os.time{year=rok, month=4, day=19} - s * 24 * 60 * 60
if (pfm == os.time{year=rok, month=4, day=19}) then
pfm = pfm - 24 * 60 * 60
elseif (pfm == os.time{year=rok, month=4, day=18} and zm > 11) then
pfm = pfm - 24 * 60 * 60
end
niedz = pfm + (7 - tonumber(os.date("%w", pfm))) * 24 * 60 * 60
poniedz = niedz + 1 * 24 * 60 * 60
bozec = niedz + 60 * 24 * 60 * 60
wielkanoc = os.date("%m", niedz)..os.date("%d", niedz)
lanyponiedz= os.date("%m", poniedz)..os.date("%d", poniedz)
bozecialo= os.date("%m", bozec)..os.date("%d", bozec)
t= {"0101","0106","0501","0503","0815","1101","1111","1225","1226"}
table.insert(t,lanyponiedz)
table.insert(t,bozecialo)
data= tostring(os.date("%m%d"))
fibaro:debug(data)
for a, b in pairs(t) do
if data==b then
wolny = 1
end
end
local dzis = os.date("*t");
if (dzis.wday == 1 or dzis.wday == 7) or wolny == 1 then
fibaro:debug("Dzień wolny : TAK")
fibaro:setGlobal("dzien_wolny",1)
else
fibaro:debug("Dzień wolny : NIE")
fibaro:setGlobal("dzien_wolny",0)
end
end
fibaro:sleep(60*1000);
end
else
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
startSource["type"] == "other"
)
then
wolny=0
rok=os.date("%Y")
zm = (rok % 19) + 1
c = math.floor(rok/400) + math.floor(8*(math.floor(rok/100)+11)/25) - math.floor(rok/100)
s = (11 * zm + c) % 30
if (s < 0) then
s = s + 30
end
pfm = os.time{year=rok, month=4, day=19} - s * 24 * 60 * 60
if (pfm == os.time{year=rok, month=4, day=19}) then
pfm = pfm - 24 * 60 * 60
elseif (pfm == os.time{year=rok, month=4, day=18} and zm > 11) then
pfm = pfm - 24 * 60 * 60
end
niedz = pfm + (7 - tonumber(os.date("%w", pfm))) * 24 * 60 * 60
poniedz = niedz + 1 * 24 * 60 * 60
bozec = niedz + 60 * 24 * 60 * 60
wielkanoc = os.date("%m", niedz)..os.date("%d", niedz)
lanyponiedz= os.date("%m", poniedz)..os.date("%d", poniedz)
bozecialo= os.date("%m", bozec)..os.date("%d", bozec)
t= {"0101","0106","0501","0503","0815","1101","1111","1225","1226"}
table.insert(t,lanyponiedz)
table.insert(t,bozecialo)
data= tostring(os.date("%m%d"))
fibaro:debug(data)
for a, b in pairs(t) do
if data==b then
wolny = 1
end
end
local dzis = os.date("*t");
if (dzis.wday == 1 or dzis.wday == 7) or wolny == 1 then
fibaro:debug("Dzień wolny : TAK")
fibaro:setGlobal("dzien_wolny",1)
else
fibaro:debug("Dzień wolny : NIE")
fibaro:setGlobal("dzien_wolny",0)
end
end
end
-
To jest naprawdę niezły pomysł, muszę tylko przerobić ją w Pythonie, chyba ze znajdę gdzieś auto translator LUA-Python
Sent using Tapatalk
PS
Właśnie ktoś to za mnie zrobił w Pythonie :-)
http://forums.indigodomo.com/viewtopic.php?f=107&t=13772
-
A jak tą scenę zastosować żeby sterowała ogrzewaniem poprzez harmonogram.
-
witam,
Pomysł jest co najmniej bardzo dobry :).
Mam pytanie (bo dla mnie jest to na razie za trudne zadanie), czy może dałoby sie troszkę tą scene rozbudowac.
Ja bym widział to tak - scena wczytuje tabele z zewnętrznego źródła (plik w jakiejś lokalizacji), gdzie ma zapisane wszystkie święta oraz urlopy :) i na tej podstawie wyznacza czy jest to dzien wolny czy tez nie.
Można by zasadniczo dodać kilka zmiennych i tabel (dla sytuacji gdy chcemy aby budzeni byli tylko wybrani domownicy - bo dzieci szkolne mają inne dni wolne).
Pozdrawiam
Piotr
-
A nie łatwiej użyć Google Calendar API albo pobrać sobie ICS z kalendarza świąt i obrobić go przez dajmy na to http://lua-users.org/lists/lua-l/2011-06/msg00644.html#Q3RJEBwB2WMDeoCL46OUtw ?
-
Witam,
Zrobiłem scenę z dniami wolnymi wg powyższego przepisu. Działa bardzo fajnie. Po północy scena się sama uruchamia i daje zmienną globalną 1 lub 0.
Problem mam z wykorzystaniem tej zmiennej w scenach bloczkowych. Chciałbym zrobić prostą scenę polegającą na tym, że jeśli o godzinie 6.30 od poniedziałku do piątku zmienna globalna "dzien_wolny" ma wartość 0 (czyli jest dzień roboczy) to włącza się światło w pokoju.
Scenę zrobiłem jak w załączniku ale problem jest taki, że przy takiej konstrukcji po zmianie zmiennej globalnej o północy z 1 na 0 lub z 0 na 1 to światło od razu się włącza.
Proszę kogoś biegłego w temacie o pomoc bo nie mogę sobie z tym poradzić.
-
odznacz w innej scenie jako wyzwalacz zmiane zmiennej
-
Dziękuję. Faktycznie wystarczyło odznaczyć w scenie wyzwalacz w postaci zmiennej globalnej i wszystko działa jak należy.
-
Panowie a jak to zrobić żeby w HCL działało ?
-
Dziękuję. Faktycznie wystarczyło odznaczyć w scenie wyzwalacz w postaci zmiennej globalnej i wszystko działa jak należy.
Witam.
ponieważ zaczynam przygodę z Fibaro HC2 prosiłbym o pomoc kolegę jak to zrobić z wykorzystaniem skryptu odnośnie dni wolnych. Np nie chciałbym żeby załanczały mi się urządzenia w dni wolne od pracy i zgodnie ze wcześniejszymi postami ustawiłem w panelu zmiennych zmienną dni wolne tak jak w załączniku. Następnie utworzyłem scenę i przekopiowałem skrypt podany wcześniej w poście jednak po uruchomieniu pokazuje mi błąd.
-
Na poczatku w lini 6 skasuj na poczatku te 3 znaki "--]" bo nie bierze ich program pod uwage i zobaczysz co dalej
-
Dzięki za szybką odpowiedź. Skrypt działa i odpowiedział, że dziś nie jest dzień wolny :'( .
-
Próbuję się przenieść na nową centralkę HC3, brakuje mi kilka rozwiązań z HC2.
Może ktoś już ogarnął dni wolne na nowej centralce i może się podzielić swoim rozwiązaniem.
-
Da się taką scenę przystosować do pracy na HC3
Bardzo bym ją potrzebował.
Są rozwiązania kalendarza oparte na zewnętrznych danych
Niemałym kłopotem w moim inteligentnym domu są dni wolne ustawowo od pracy które przypadają od poniedziałku do piątku. Wtedy niepotrzebnie rano otwierają się rolety (a mógłbym pospać dłużej), niepotrzebnie odzywa się budzik czy zmienia program ogrzewania. Postanowiłem coś z tym zrobić tak żeby mój dom wiedział o tym że jest dzień wolny. Opracowałem więc scenę która to w odpowiedni sposób wylicza.
Scena sprawdza, czy dzisiaj mamy dzień roboczy czy wolny i wstawia do zmiennej globalnej wartość 1 jeśli wolny lub 0 jeśli dzień pracujący.
Dzień wolny to : soboty, niedziele, dni ustawowo wolne w tym ruchome „lany poniedziałek” i „boże ciało”. Scena uruchamia się sama, codziennie o godzinie 00:01.
Można to wykorzystać później w scenach bloczkowych.
Przed uruchomieniem sceny należy założyć zmienną globalną o nazwie : „dzien_wolny”
--[[
%% autostart
%% properties
%% globals
--]]local sourceTrigger = fibaro:getSourceTrigger();
if (sourceTrigger["type"] == "autostart") then
while true do
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
( ((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "00:01") )
)
then
wolny=0
rok=os.date("%Y")
zm = (rok % 19) + 1
c = math.floor(rok/400) + math.floor(8*(math.floor(rok/100)+11)/25) - math.floor(rok/100)
s = (11 * zm + c) % 30
if (s < 0) then
s = s + 30
end
pfm = os.time{year=rok, month=4, day=19} - s * 24 * 60 * 60
if (pfm == os.time{year=rok, month=4, day=19}) then
pfm = pfm - 24 * 60 * 60
elseif (pfm == os.time{year=rok, month=4, day=18} and zm > 11) then
pfm = pfm - 24 * 60 * 60
end
niedz = pfm + (7 - tonumber(os.date("%w", pfm))) * 24 * 60 * 60
poniedz = niedz + 1 * 24 * 60 * 60
bozec = niedz + 60 * 24 * 60 * 60
wielkanoc = os.date("%m", niedz)..os.date("%d", niedz)
lanyponiedz= os.date("%m", poniedz)..os.date("%d", poniedz)
bozecialo= os.date("%m", bozec)..os.date("%d", bozec)
t= {"0101","0106","0501","0503","0815","1101","1111","1225","1226"}
table.insert(t,lanyponiedz)
table.insert(t,bozecialo)
data= tostring(os.date("%m%d"))
fibaro:debug(data)
for a, b in pairs(t) do
if data==b then
wolny = 1
end
end
local dzis = os.date("*t");
if (dzis.wday == 1 or dzis.wday == 7) or wolny == 1 then
fibaro:debug("Dzień wolny : TAK")
fibaro:setGlobal("dzien_wolny",1)
else
fibaro:debug("Dzień wolny : NIE")
fibaro:setGlobal("dzien_wolny",0)
end
end
fibaro:sleep(60*1000);
end
else
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
startSource["type"] == "other"
)
then
wolny=0
rok=os.date("%Y")
zm = (rok % 19) + 1
c = math.floor(rok/400) + math.floor(8*(math.floor(rok/100)+11)/25) - math.floor(rok/100)
s = (11 * zm + c) % 30
if (s < 0) then
s = s + 30
end
pfm = os.time{year=rok, month=4, day=19} - s * 24 * 60 * 60
if (pfm == os.time{year=rok, month=4, day=19}) then
pfm = pfm - 24 * 60 * 60
elseif (pfm == os.time{year=rok, month=4, day=18} and zm > 11) then
pfm = pfm - 24 * 60 * 60
end
niedz = pfm + (7 - tonumber(os.date("%w", pfm))) * 24 * 60 * 60
poniedz = niedz + 1 * 24 * 60 * 60
bozec = niedz + 60 * 24 * 60 * 60
wielkanoc = os.date("%m", niedz)..os.date("%d", niedz)
lanyponiedz= os.date("%m", poniedz)..os.date("%d", poniedz)
bozecialo= os.date("%m", bozec)..os.date("%d", bozec)
t= {"0101","0106","0501","0503","0815","1101","1111","1225","1226"}
table.insert(t,lanyponiedz)
table.insert(t,bozecialo)
data= tostring(os.date("%m%d"))
fibaro:debug(data)
for a, b in pairs(t) do
if data==b then
wolny = 1
end
end
local dzis = os.date("*t");
if (dzis.wday == 1 or dzis.wday == 7) or wolny == 1 then
fibaro:debug("Dzień wolny : TAK")
fibaro:setGlobal("dzien_wolny",1)
else
fibaro:debug("Dzień wolny : NIE")
fibaro:setGlobal("dzien_wolny",0)
end
end
end
-
Czy udało Ci się rozwiązać problem z sceną Dni Wolne, działa Ci na HC3 ?
-
Niestety tak dobrego rozwiązania jak na HC2 było nie znalazłem
-
Tu jest gotowa scena na HC3:
Deklaracje:{
conditions = { {
isTrigger = true,
operator = "match",
property = "cron",
type = "date",
value = { "01", "00", "*", "*", "*", "*" }
} },
operator = "all"
}
Akcja:wolny=0
rok=os.date("%Y")
zm = (rok % 19) + 1
c = math.floor(rok/400) + math.floor(8*(math.floor(rok/100)+11)/25) - math.floor(rok/100)
s = (11 * zm + c) % 30
if (s < 0) then
s = s + 30
end
pfm = os.time{year=rok, month=4, day=19} - s * 24 * 60 * 60
if (pfm == os.time{year=rok, month=4, day=19}) then
pfm = pfm - 24 * 60 * 60
elseif (pfm == os.time{year=rok, month=4, day=18} and zm > 11) then
pfm = pfm - 24 * 60 * 60
end
niedz = pfm + (7 - tonumber(os.date("%w", pfm))) * 24 * 60 * 60
poniedz = niedz + 1 * 24 * 60 * 60
bozec = niedz + 60 * 24 * 60 * 60
wielkanoc = os.date("%m", niedz)..os.date("%d", niedz)
lanyponiedz= os.date("%m", poniedz)..os.date("%d", poniedz)
bozecialo= os.date("%m", bozec)..os.date("%d", bozec)
t= {"0101","0106","0501","0503","0815","1101","1111","1225","1226"}
table.insert(t,lanyponiedz)
table.insert(t,bozecialo)
data= tostring(os.date("%m%d"))
for a, b in pairs(t) do
if data==b then
wolny = 1
end
end
local dzis = os.date("*t");
if (dzis.wday == 1 or dzis.wday == 7) or wolny == 1 then
fibaro.debug("dzienWolny", "Dzien wolny : TAK")
fibaro.setGlobalVariable("dzienWolny", '1')
else
fibaro.debug("{dzienWolny}", "Dzien wolny : NIE")
fibaro.setGlobalVariable("dzienWolny", '0')
end
-
Dziękuję bardzo ;D