Forum użytkowników automatyki budynkowej

Z-wave => Fibaro - sceny => Wątek zaczęty przez: admin w Marzec 24, 2015, 08:43:13 pm

Tytuł: Dni wolne od pracy w Inteligentnym domu
Wiadomość wysłana 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
Tytuł: Odp: Dni wolne od pracy w Inteligentnym domu
Wiadomość wysłana przez: richo w Marzec 29, 2015, 01:19:38 am
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
Tytuł: Odp: Dni wolne od pracy w Inteligentnym domu
Wiadomość wysłana przez: wiesiekr w Styczeń 03, 2016, 10:17:42 am
A jak tą scenę zastosować żeby sterowała ogrzewaniem poprzez harmonogram.
Tytuł: Odp: Dni wolne od pracy w Inteligentnym domu
Wiadomość wysłana przez: Piotr B w Styczeń 03, 2016, 10:48:36 am
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
Tytuł: Odp: Dni wolne od pracy w Inteligentnym domu
Wiadomość wysłana przez: zen w Styczeń 10, 2016, 09:51:07 pm
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 ?
Tytuł: Odp: Dni wolne od pracy w Inteligentnym domu - prośba o pomoc
Wiadomość wysłana przez: pd77 w Styczeń 03, 2017, 12:40:29 pm
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ć.

Tytuł: Odp: Dni wolne od pracy w Inteligentnym domu
Wiadomość wysłana przez: viperlodz w Styczeń 03, 2017, 03:03:38 pm
odznacz w innej scenie jako wyzwalacz zmiane zmiennej
Tytuł: Odp: Dni wolne od pracy w Inteligentnym domu
Wiadomość wysłana przez: pd77 w Styczeń 19, 2017, 10:15:39 pm
Dziękuję. Faktycznie wystarczyło odznaczyć w scenie wyzwalacz w postaci zmiennej globalnej i wszystko działa jak należy.
Tytuł: Odp: Dni wolne od pracy w Inteligentnym domu
Wiadomość wysłana przez: wiesiekr w Styczeń 20, 2017, 12:36:14 am
Panowie a jak to zrobić żeby w HCL działało ?
Tytuł: Odp: Dni wolne od pracy w Inteligentnym domu
Wiadomość wysłana przez: Pokemon w Styczeń 31, 2017, 11:55:38 pm
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.
Tytuł: Odp: Dni wolne od pracy w Inteligentnym domu
Wiadomość wysłana przez: confesor w Luty 01, 2017, 12:04:46 am
Na poczatku w lini 6 skasuj na poczatku te 3 znaki "--]" bo nie bierze ich program pod uwage i zobaczysz co dalej
Tytuł: Odp: Dni wolne od pracy w Inteligentnym domu
Wiadomość wysłana przez: Pokemon w Luty 01, 2017, 06:43:03 pm
Dzięki za szybką odpowiedź. Skrypt działa i odpowiedział, że dziś nie jest dzień wolny  :'( .
Tytuł: Odp: Dni wolne od pracy w Inteligentnym domu
Wiadomość wysłana przez: rafal_ll w Kwiecień 09, 2020, 08:43:03 am

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.



Tytuł: Odp: Dni wolne od pracy w Inteligentnym domu
Wiadomość wysłana przez: rafal_ll w Styczeń 17, 2021, 09:19:34 pm
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
Tytuł: Odp: Dni wolne od pracy w Inteligentnym domu
Wiadomość wysłana przez: wiesiekr w Luty 15, 2021, 11:44:33 am
Czy udało Ci się rozwiązać problem z sceną Dni Wolne, działa Ci na HC3 ?
Tytuł: Odp: Dni wolne od pracy w Inteligentnym domu
Wiadomość wysłana przez: rafal_ll w Luty 15, 2021, 11:48:18 am
Niestety tak dobrego rozwiązania jak na HC2 było nie znalazłem
Tytuł: Odp: Dni wolne od pracy w Inteligentnym domu
Wiadomość wysłana przez: wiesiekr w Czerwiec 06, 2021, 09:50:36 pm
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
Tytuł: Odp: Dni wolne od pracy w Inteligentnym domu
Wiadomość wysłana przez: rafal_ll w Czerwiec 07, 2021, 06:09:52 am
Dziękuję bardzo  ;D