AN02 Úvod do Lua skriptů, podmínky spouštění, Log file | NETIO products: Networked power sockets
Tagy: 
Lua tutorials

Aplikační poznámka NETIO AN02 je návod na vytvoření Lua skriptu, který vypíná a zapíná stav zásuvky jednou za sekundu, ale pouze v nastaveném čase (například pouze přes den). AN02 je vzorový příklad, vysvětluje různé možnosti spouštění Lua skriptů, popisuje jak k ladění skriptu používat Log soubor v chytrých zásuvkách NETIO 4x.

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

 

Podporovaná zařízení: 

NETIO 4All, NETIO 4C, NETIO 4

 

Kapitoly

  • Vytvoření pravidla (rule)
  • Vytvoření Lua skriptu
  • Využití Log file
  • Možnosti spuštění skriptu
  • Funkce Scheduler

 

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


  • Vytvoření Lua skriptu, který vypíná a zapíná stav zásuvky jednou za sekundu

 

2) Vyplňte následující parametry:

  • Enabled: zaškrtnuto
  • Name: Timed Blinker (uživatelsky definovatelné)
  • Description: Blinking with outlet 1 (uživatelsky definovatelné)
  • Trigger: System started up
  • Schedule: libovolný (v této konfiguraci nemá vliv na funkci)

3) Do pole pro skript v jazyce Lua zkopírujte následující kód:


------------Section 1------------
local output = 1 -- select output number (1 - 4)
local interval = 1 -- select the interval between switching (seconds)
local time1 = 23 -- start of inactivity xx:00 (0 - 24)
local time2 = 5 -- end of inactivity xx:00 (0 - 24)
---------End of Section 1---------

local state = 0

function switch()
  devices.system.SetOut{output=output, value=state}
  state = not state
  delay(interval,function() checkTime() end)
end

function checkTime()
  local currentTime = os.date("*t").hour
  if time1 <= time2 then
    if ((currentTime < time1) or (currentTime >= time2)) then
      switch()
    else
      delay(1,function() checkTime() end)
    end
  else
    if ((currentTime < time1) and (currentTime >= time2)) then
      switch()
    else
      delay(1,function() checkTime() end)
    end
  end
end

checkTime()

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

  •  Skript přepíná stav zásuvky, kontroluje čas a přepínání vypne ve zvoleném časovém intervalu

 

Vytvoření Lua skriptu

  • Skript přepíná stav zásuvky, kontroluje čas a přepínání vypne ve zvoleném časovém intervalu.
  • Pro vytvoření kódu bude potřeba proměnných, které budou nastavovat požadované parametry. Proměnné budou celkem 4 (číslo zásuvky, doba přepnutí, začátek a konec časového intervalu pro vypnutí).
  • Kód je rozdělen do dvou funkcí. Jedna kontroluje čas a určuje, jestli má dojít k přepnutí. Tato funkce se jmenuje checkTime. Druhá funkce se stará o přepnutí stavu zásuvek. Jmenuje se switch*.
  • Funkce je deklarována klíčovým slovem function, za nímž následuje jméno funkce. Funkce musí být ukončena klíčovým slovem end.

Proměnné

  • Proměnné se deklarují pomocí klíčového slova local a jejich jména jsou output, interval, time1, time2.
  • Proměnné označují následující:

 

  • output
    • Nastavuje první přepínanou zásuvku
    • Příklad pro nastavení zásuvky č.2: output=2

  • interval
    • Nastavuje dobu mezi přepnutím stavů (v sekundách)
    • Příklad pro dobu přepnutí 5 sekund: interval=5

  • time1
    • Nastavuje začátek neaktivity skriptu (v hodinách)
    • Příklad pro začátek v 22:00: time1=22

  • time2
    • Nastavuje konec neaktivity skriptu (v hodinách)
    • Příklad pro konec v 5:00: time2=5

  • Tyto proměnné lze měnit podle potřeby v záhlaví kódu (Section 1)
  • Dále skript obsahuje proměnnou, která si pamatuje, ve kterém stavu se zásuvka momentálně nachází a podle které se přepíná. Jmenuje se state. Její počáteční hodnota je nastavena na 0 (local state = 0).

Funkce switch


function switch()
  devices.system.SetOut{output=output, value=state}
  state = not state
  delay(interval,function() checkTime() end)
end

  • Tato funkce přepíná stav zásuvky, poté za dobu zvolenou v proměnné interval zavolá funkci checkTime, která zjistí, zda se má zásuvka opět přepnout.
  • Změnu stavu zásuvky se provádí pomocí vnitřní funkce**: devices.system.SetOut{output=output, value=state}
  • Funkce má 2 parametry. Prvním je vstup (output), kterým je proměnná output, nastavuje se output=output (první je název parametru, druhý pak proměnná). Druhý parametr je hodnota (value). Hodnota se nastavuje pomocí proměnné state (value=state).
  • Poté funkce zajistí, že při příštím průběhu funkce se stavy změní. Prohodí se hodnota proměnné state (z 0 na 1, nebo z 1 na 0).
  • K tomu slouží negace: state = not state
  • Nakonec se zavolá funkce checkTime s nastaveným zpožděním. K tomu se využívá vnitřní funkce delay. Prvním parametrem této funkce je zpoždění, tedy proměnná interval a druhým volaná funkce, tedy checkTime. Příkaz vypadá takto:
    delay(interval,function() checkTime() end)

Funkce checkTime


function checkTime()
  currentTime = os.date("*t").hour
  if time1 <= time2 then
    if ((currentTime < time1) or (currentTime >= time2)) then
      switch()
    else
      delay(1,function() checkTime() end)
    end
  else
    if ((currentTime < time1) and (currentTime >= time2)) then
      switch()
    else
      delay(1,function() checkTime() end)
    end
  end
end

  • Po zjištění aktuálního času se využívá knihovní funkce*** os.date(). Pro snadnější práci se zavádí proměnná nazvaná currentTime, v níž je uložen současný stav, respektive hodina (vždy se bude jednat o celou hodinu).
  • Vytvoření proměnné a uložení její hodnoty vypadá takto: local currentTime = os.date("*t").hour
  • Poté se rozlišují případy, kdy interval neaktivity nepřesahuje přes půlnoc, například od 2:00 do 5:00 (sekce po if) a kdy přesahuje přes půlnoc, například od 22:00 do 8:00 (sekce po else). K tomu slouží jednoduchá podmínka, ve které se porovnávají hodnoty proměnných time1 a time2. Stejně jako funkci, je nutné i podmínky ukončit slovem end. Podmínka vypadá následovně: 

function checkTime()
  currentTime = os.date("*t").hour
  if time1 <= time2 then
    ---- if section ----
  else
    ---- else section ----
  end
end

  • Nejprve případ nepřesáhnutí půlnoci (if section).
    • K přepnutí dochází v situaci, kdy čas je uvnitř zadaného intervalu. Tedy v situaci, kdy současný stav je buď menší než začátek intervalu (currentTime < time1) nebo (or) je větší nebo rovno konci intervalu (currentTime >= time2). Celá podmínka pak tedy vypadá takto: ((currentTime < time1) or (currentTime >= time2)).
    • Pokud je tedy tato podmínka splněná, volá se funkce switch.
    • Pokud se v intervalu nenachází, volá se opět funkce checkTime s malou prodlevou. Prodleva mezi jednotlivými voláními je nastavena na 1 sekundu. Opět se využívá funkce delay. Instrukce je následující:                   
      delay(1,function() checkTime() end)
       
  • Nyní situace, kdy interval překročí půlnoc (else section)
    • Podmínka, která musí být splněna pro spuštění funkce switch je velmi podobná té, kterou byla použita v minulé sekci, jen musí být obě části podmínky splněny naráz. Místo or je použito and. Výsledný tvar je tedy: ((currentTime < time1) and (currentTime >= time2))
    • Sekce else vypadá úplně stejně jako v předchozím případě, tedy: delay(1,function() checkTime() end)

Spuštění skriptu

  • Ke spuštění skriptu bude stačit zavolat funkci checkTime. Úplně na konci skriptu je volání: checkTime()
  • Skript je hotový, po uložení a restartu vašeho zařízení se spustí.

*Lua nerozdíl například od Java nemá funkci switch, nejedná se tedy o přetěžování

**Více o základních funkcích na wiki http://wiki.netio-products.com/

***Více informací o knihovních funkcích na http://lua-users.org/wiki/


 

Využití Log file

Kvůli kontrole kódu (debuggování) je možné využít Logfile, který můžete nalézt ve webové aplikaci. 

  • Kvůli kontrole kódu (debuggování) je možné využít Logfile, který můžete nalézt ve webové aplikaci.

 

  • Pro zápis do Log file slouží funkce log a logf.
  • Vhodným zápisem do Log file pro kód výše je například popis akce, která se se zásuvkou vykonává.
  • Do funkce switch tedy před funkci, která přepíná stav zásuvky vložte podmínku, která bude podle stavu proměnné state rozhodovat o zápisu.
  • Pokud chcete zapisovat i hodnoty proměnných (např. číslo zásuvky), je nutné použít funkci logf, na místo, kam chcete zapsat proměnnou, vložit příslušný symbol podle typu proměnné (%d pro číslo, %s pro řetězec, atd.).
  • Pokud bude state == 1, pak bude funkce pro zápis do Log file vypadat například takto logf("Switching output %d on", output). Pro state == 0 pak například takto logf("Switching output %d off", output).
  • Vaše upravená funkce switch pak bude vypadat takto

function switch()
  if state==1 then
    logf("Switching output %d on", output)
  else
    logf("Switching output %d off", output)
  end
  devices.system.SetOut{output=output, value=state}
  state = not state
  delay(interval,function() checkTime() end)
end


 

Možnosti spuštění skriptu

  • NETIO nabízí několik způsobů, kterými lze spustit skript
  • Incoming CGI request a další možnosti spouštění skriptu

 

System started up

  • Skript s tímto nastavením se spustí vždy po zapnutí NETIO (naběhnutí systému trvá zhruba minutu).
  • Nastavení „System started up“ je vhodné pro skripty, které běží nepřetržitě.
  • Skript s nekonečnou smyčkou se zapíná hned po nastartování NETIO zásuvek a nelze jej vypnout jinak, než odškrtnutím políčka Enabled u nastavení spouštění skriptu a restartem zásuvek NETIO.

DO state changed

  • Skript se spustí vždy když dojde ke změně stavu jakékoli zásuvky (zapnutí nebo vypnutí).
  • Skript se spustí při změně stavu výstupu a není důležité co přepnutí výstupu vyvolalo (tlačítko na zařízení, přepnutí z web rozhraní, přepnutí výstupu z mobilní aplikace, jiný Lua skript, apod.)

Schedule has started or stopped

  • K aktivaci skriptu dochází při začátku a konci rozvrhu.
  • V tomto nastavení je nutné vybrat rozvrh (Schedule), který chcete používat.

System variables updated

  • Skript je aktivován změnou jakékoli ze systémových proměnných (napětí, proud, účinník, spotřeba, atd…).
  • Vhodné pro skripty hlídající spotřebu nebo proud protékající zásuvkou.

Incoming CGI request

  • Skript se spustí vždy po zaslání CGI requestu na NETIO.
  • CGI request má tvar: “NETIO_IP/event?
  • Například: “192.168.0.26/event?
  • Za otazníkem mohou následovat argumenty, se kterými lze dále pracovat
  • Po odeslání CGI requestu se zobrazí stránka s textem: OK (viz obrázek níže)
     
  • Více o této možnosti spouštění najdete v NETIO AN04
  • Skript se spustí vždy po zaslání CGI requestu na NETIO

 

Funkce Scheduler

Funkci Scheduler najdete ve všech produktech NETIO 4x. Scheduler zapíná/vypíná jednotlivé zásuvky (na obrázku zásuvka 1) podle času.

  • Každé zásuvce lze přiřadit jiný rozvrh spínání.
  • V editoru lze přes web rozhraní vytvořit váš vlastní časový rozvrh spínání.
  • Funkce Scheduler zareaguje zapnutím nebo vypnutím zásuvky jen při změně času (konec nebo začátek zelené plochy). Zásuvku lze v čase mezi tím ovládat z jiného zdroje (tlačítka na panelu / web / mobilní rozhraní). 
  • Funkci Scheduler najdete ve všech produktech NETIO 4x.

 

Jak je vidět na obrázku, rozvrh slouží k nastavení sepnutí zásuvky na delší intervaly (například celý víkend na obrázku). Pro rychlejší spínání lze použít Lua skript.


Podporované verze FW:

3.0.0 a novější


Klíčová slova:

Lua, Lua skript, blikač, spuštění skriptu, zápis do logu, os funkce, tutoriál, Lua manuál, Scheduler

 

FAQ

Expand all

Lze zásuvku přepínat častěji než za 1 sekundu?

Ano, ve funkci switch použijte místo funkce delay funkci milliDelay, jejímž prvním parametrem je čas v milisekundách. Nejnižší možná hodnota je 100 ms. Výrobce to však nedoporučuje, kvůli možnosti poškození zařízení, protože počet sepnutí pod zátěží není nekonečný.

Které knihovní Lua funkce NETIO podporuje?

Vše o dostupných knihovnách najdete na NETIO wiki (https://wiki.netio-products.com/). Funkce, které tyto knihovny implementují, jsou pak na Lua wiki (http://lua-users.org/wiki/)

Je možné interval neaktivity nastavit nejen na rozmezí celých hodin?

Ano, ale vyžaduje to větší zásah do kódu. Aktuální čas lze vyčítat pomocí funkcí os.date() nebo os.time. Je nutné také upravit podmínky.

Jaký je rozdíl mezi funkcemi log a logf?

Hlavní rozdíl je v tom, že funkcí log lze zapsat pouze string (řetězec znaků), zatímco pomocí funkce logf je možné zapisovat i hodnoty proměnných pomocí zástupných symbolů (%d, %s apod.).

Zeptejte se na cenu nebo technické parametry

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