Podporovaná zařízení: NETIO 4All, NETIO PowerPDU 4C, NETIO 4
Lua skript AN17 provádí nastavené akce s výstupy NETIO zařízení v nastaveném čase. Lze tak provést zapnutí a vypnutí v konkrétním čase, bez opakování. V záhlaví Lua skriptu lze v proměnné specifikovat datum a čas při kterém dojde k provedení zvolené akce s jednotlivými výstupy zařízení. Skript umožňuje s vybranými výstupy provést 6 různých akcí
- 0 - vypnutí výstupu
- 1 - zapnutí výstupu
- 2 - krátké vypnutí výstupu (restart)
- 3 - krátké zapnutí výstupu
- 4 - přepnutí stavu výstupu
- 5 - ponechání výstupu v současném stavu
Formát kalendáře vyžaduje den a měsíc, opakování akce se tak děje každý rok.
Kalendář vyřaduje nastavený (a synchronizovaný) čas.
Vytvoření pravidla (rule)
Pro vytvoření a spuštění Lua skriptu je nutné následující:
1) Ve webové administraci NETIO 4 v sekci Actions, přidejte pravidlo pomocí tlačítka Create Rule
2) Vyplňte následující parametry:
- Enabled: zaškrtnuto
- Name: Calendar (uživatelsky definovatelné)
- Description: Setting outputs based on calendar (uživatelsky definovatelné)
- Trigger: System started up
- Schedule: Always
3) Do pole pro skript v jazyce Lua zkopírujte následující kód:
------------NETIO AN17------------ ------------Section 1------------ -- Format: dd/mm,hh:mm,aaaa local calendar = { "06/08,07:30,1111", "01/XX,13:35,2222", "31/12,23:59,0055"} local shortTimeMs = 2000 ------------End of Section 1------------ local activated = {} for i=1,#calendar do activated[i] = 0 end function checkFormat() for i=1,#calendar do local cal = calendar[i] local timeCal1 = tonumber(cal:sub(7,8)) local timeCal2 = tonumber(cal:sub(10,11)) local dayCal = tonumber(cal:sub(1,2)) local monthCal = cal:sub(4,5) local actionsCal = cal:sub(13,16) if (timeCal1==nil) or (timeCal1>23) or (timeCal1<0) then logf("Time in state %d is invalid",i) return false end if (timeCal2==nil) or (timeCal2>59) or (timeCal2<0) then logf("Time in state %d is invalid",i) return false end if (dayCal==nil) or (dayCal>31) or (dayCal<0) then logf("Day in state %d is invalid",i) return false end if (monthCal~="XX") and (monthCal~="xx") then monthCal = tonumber(monthCal) if (monthCal==nil) or (monthCal>12) or (monthCal<0) then logf("Month in state %d is invalid",i) return false end end for j=1,4 do action = tonumber(cal:sub(12+j,12+j)) if (action==nil) or (action>5) or (action<0) then logf("Action %d in state %d is invalid",j,i) return false end end end return true end function checkDate() local stringTime = os.date("%X") local time = (3600*tonumber(stringTime:sub(1,2)) + 60*tonumber(stringTime:sub(4,5)) + tonumber(stringTime:sub(7,8))) local date = os.date("%x") local day = date:sub(4,5) local month = date:sub(1,2) for i=1,#calendar do local cal = calendar[i] local timeCal = 3600*tonumber(cal:sub(7,8)) + 60*tonumber(cal:sub(10,11)) local dayCal = cal:sub(1,2) local monthCal = cal:sub(4,5) --Check month if (monthCal == month) or (monthCal == "XX") or (monthCal == "xx") then --Check day if (dayCal == day) then --Check time if (time >= timeCal) and (time < timeCal+60) then --Check if it was already activated if activated[i] == 0 then setOutputs(cal:sub(13,16)) activated[i] = 1 delay(120,function() activated[i] = 0 end) end end end end end delay(5,function() checkDate() end) end function setOutputs(state) for i=1,4 do value = tonumber(state:sub(i,i)) if value == 0 then -- turn off devices.system.SetOut{output = i, value = false} elseif value == 1 then -- turn on devices.system.SetOut{output = i, value = true} elseif value == 2 then -- short off devices.system.SetOut{output = i, value = false} milliDelay(shortTimeMs,function() devices.system.SetOut{output=i,value=true} end) elseif value == 3 then -- short on devices.system.SetOut{output = i, value = true} milliDelay(shortTimeMs,function() devices.system.SetOut{output=i,value=false} end) elseif value == 4 then -- toggle if devices.system["output" ..i.. "_state"] == 'on' then devices.system.SetOut{output=i,value=false} else devices.system.SetOut{output=i, value=true} end elseif value == 5 then -- do nothing end end end if checkFormat() then log("Format valid, starting the script") checkDate() else log("Format is not valid, shutting down the script") end
Princip
Skript periodicky kontroluje čas a datum na zařízení. Uživatel pomocí proměnné calendar nastaví den, čas a akce. Pokud se datum a čas na zařízení shoduje s některým ze zadaných, skript provede zadané akce se všemi výstupy.
Nastavení proměnných
calendar
- Pomocí této proměnné je možné nastavit datum, čas a akce, které budou s výstupy provedeny. Jedná se o tabulku tvořenou textovými řetězci. Pomocí řetězců je možné specifikovat datum, čas a akci. Jednotlivé řetězce je nutné uzavřít do uvozovek a oddělit čárkou.
-
Formát řetězců: "dd/mm,hh:mm,aaaa" - den/měsíc,hodiny:minuty,akce
-
den
- Musí se jednat o dvouciferné číslo (pro čísla 1-9 použijte 01-09) mezi 01 a 31.
-
měsíc
- Musí se jednat o dvouciferné číslo (pro čísla 1-9 použijte 01-09) mezi 01 a 12 nebo XX.
- Při zadání hodnoty XX dojde k nastavení výstupu nezávisle na měsíci (například každý první den v měsíci).
-
hodiny
- Musí se jednat o dvouciferné číslo (pro čísla 1-9 použijte 01-09) mezi 01 a 24.
- Hodiny je nutné zadávat ve 24 hodinovém formátu.
-
minuty
- Musí se jednat o dvouciferné číslo (pro čísla 1-9 použijte 01-09) mezi 01 a 59.
-
akce
- Nastavení čísla akce, které se provedou s jednotlivými výstupy
- 0 - vypnutí výstupu
- 1 - zapnutí výstupu
- 2 - “short off”, nastaví výstup do hodnoty 0, čeká čas v proměnné shortTimeMs a nastaví výstup do hodnoty 1
- 3 - “short on”, nastaví výstup do hodnoty 1, čeká čas v proměnné shortTimeMs a nastaví výstup do hodnoty 0
- 4 - “toggle”, přepne stav výstupu na opačnou hodnotu (pokud byl zapnutý, pak ho vypne a naopak)
- 5 - ponechání stavu beze změny
-
den
- Příklady:
- Zapnutí všech výstupů 25.8. v 18:00:
- "25/08,18:00,1111"
- Restartování výstupů 1 a 2, ponechání stavu výstupů 3 a 4, každý první den v měsíci v 5:00:
- "01/XX,05:00,2255"
shortTimeMs
- Nastavuje dobu v milisekundách, za kterou se výstup zapne/vypne ve stavech 2 respektive 3
- Minimální hodnota je 100ms.
- Příklad pro změnu za 2 sekundy: shortTimeMs = 2000
Spuštění skriptu
Po nastavení všech parametrů a uložení skriptu je potřeba restartovat chytré zásuvky NETIO. Po opětovném naběhnutí systému se skript spustí. Při správném nastavení proměnných je úspěšný start skriptu ohlášen vypsáním: “NETIO AN13: Format valid, starting the script”.
Při špatném nastavení je vypsáno: "NETIO AN17: Format is not valid, shutting down the script" a také řetězec, který je špatně naformátován. V takovém případě je nutné opravit chybu, uložit skript a následně zařízení opět restartovat.
FAQ
1) Mohu nějak zadat opakování každý měsíc v 15. dni měsíce?
Ano, stačí do příslušného řetězce v proměnné calendar vložit na místo pro měsíc "xx" a na místo pro den "15".
2) Mohu opakovat funkci každou neděli?
Ne, tento skript k tomu použít nelze, skript pro tuto funkci je v AN07 - Periodický kalendář pro řízení výstupů v textové podobě Lua skriptem.
Podporované verze FW:
3.3.1 a vyšší