Tagy: 
User library

AN17 obsahuje Lua skript, pomocí kterého je možné ve stanovený den a hodinu nastavit výstupy NETIO zařízení do požadovaných stavů, nebo s nimi provést jiné akce (krátké zapnutí nebo vypnutí - restartování).

 

Můžeme Vám nějak pomoci?

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


4) Tvorbu pravidla ukončete stisknutím kliknutím na tlačítko Create Rule v dolní části obrazovky.

 

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

Zeptejte se na cenu nebo technické parametry

Pro otestování zařízení použijte jméno/heslo demo/demo