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šší

 
           
 