AN03 Vypnutí zásuvky při proudu nad limit a poslání emailu | NETIO products: Networked power sockets
Tagy: 
Lua tutorials

Aplikační poznámka obsahuje návod na vytvoření Lua skriptu, který hlídá proud protékající jednotlivými zásuvkami NETIO 4All. Když zásuvkou protéká proud nad nastavený limit, déle, než je nastavený čas, skript výstup vypne a pošle email.

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

 

Podporovaná zařízení: 

NETIO 4All, NETIO 4C, NETIO 4

 

Lua skript NETIO AN03 kontroluje hodnotu proudu protékající zvoleným výstupem (součtem proudů všemi výstupy). Pokud je protékající proud vyšší než nastavený limit, počítá skript čas. Při kontinuálním stavu proudu nad limitem po dobu delší než zvolená hodnota, Lua skript zásuvku vypne a zašle e-mail.

 

 

Skript může být například nastaven tak, aby pro průběh na obrázku: Při krátkém překročení limitu (situace A) nechal výstup zapnutý, ale pokud by se limit překračoval delší dobu (situace B), skript by výstup vypnul.


 

NETIO AN03 obsahuje na konci možnost rozšíření detekce nejen nadproudu, ale také proudu pod určitým limitem. Tak lze například detekovat, že klimatizace dlouhodobě spotřebovává elektřinu pouze pro větrání, ale ne pro chlazení a upozornit na to emailem.

 

Příklad demonstruje použití globálních proměnných a měření proudu.

 

Kapitoly

  • Vytvoření pravidla (rule)
  • Vytvoření Lua skriptu
  • Rozšíření o hlídání nízkého proudu
  • Nastavení e-mailu

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: Watcher (uživatelsky definovatelné)
  • Description: Current watcher (uživatelsky definovatelné)
  • Trigger: System variables updated
  • 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 -- choose number of outlet
local currentLimit = 100 -- choose ampere limit [mA]
local timeLimit = 1 -- choose time limit [seconds]
local recipient = "my.email@example.com"
local subject = "Output takes too much power"
local text = "Output " .. string.format(output) .. " on your NETIO exceeded limit " .. string.format(currentLimit) .. "mA!"
---------End of Section 1---------

-- Global variables: _G.timestamp

local current = 0

function shutDown()
  if output == 0 then
    for i=1,4,1 do
      devices.system.SetOut{output=i, value=false}
    end
  else
    devices.system.SetOut{output=output, value=false}
  end
end

function checkTime()
  local timeNow = os.time()
  if (_G.timestamp == 0 or _G.timestamp == nil) then
    _G.timestamp = timeNow
  end
  if (timeNow - _G.timestamp >= timeLimit) then
    return true
  end
  return false
end

function currentMeasurement()
  if output == 0 then
    for i=1,4,1 do	 
      current = current + devices.system["output" .. i .. "_current"]
    end
  else
    current = devices.system["output" .. output .. "_current"]
  end
  if current > currentLimit then
    if checkTime() then
      shutDown()
      mail(recipient, subject, text)
    end
  else
    _G.timestamp = 0
  end
end

currentMeasurement()

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

 

Vytvoření kódu

  • Skript se spustí vždy, když se změní nějaká systémová proměnná (například proud nebo napětí na jednom z výstupů). Ke spouštění skriptu dochází nejčastěji jednou za sekundu.
  • Pokud aktuální hodnota proudu zásuvkou přesahuje nastavenou hodnotu po zvolenou dobu bez přerušení, skript ji automaticky vypne a popřípadě zašle email.
  • Ve skriptu je navíc i možnost hlídání součtu proudů všech výstupů najednou při nastavení proměnné pro hlídanou zásuvku na 0.
  • Pro nastavení parametrů je potřeba 6 proměnných (číslo zásuvky, maximální hodnota proudu, časový limit, emailová adresa, předmět emailu, text emailu).
  • Ve skriptu je funkce, která načte hodnotu proudu a porovnává ji s nastaveným limitem a v případě překročení zásuvku vypne a zašle email. Je nazvána currentMeasurement. Funkce hlídající dobu přesáhnutí limitu je funkce checkTime. Pro reakci na přesáhnutí limitu slouží funkce shutDown.

Proměnné

  • Proměnné pro nastavení parametrů jsou nazvané output, currentLimit, timeLimit, recipient, subject, text.
  • Proměnné jsou deklarované pomocí slova local (např. local output = 1)
  • Význam proměnných je následující:

  • output             
    • Nastavuje hlídanou zásuvku
    • Pro hlídání všech výstupů najednou slouží hodnota 0
    • Příklad pro hlídání zásuvky č.3: output = 3

 

  • currentLimit
    • Nastavuje maximální možnou hodnotu proudu (v miliampérech)
    • Maximální hodnota je 8A = 8000mA (currentLimit = 8000)
    • Hodnotu je nutné zadat v celých číslech (NETIO Lua nepodporuje desetinná čísla)
    • Příklad pro maximální hodnotu 200mA: currentLimit = 200

 

  • timeLimit
    • Nastavuje čas (v sekundách), po který musí být proud výstupem kontinuálně větší, aby došlo k vypnutí
    • Pokud chcete zásuvku vypnout okamžitě po překročení hranice, zvolte hodnotu 0
    • Příklad pro 5 sekund: timeLimit = 5

 

  • recipient
    • Nastavuje emailovou adresu na kterou bude zaslán email
    • Jelikož se jedná o string (řetězec znaků) je nutné text vložit do uvozovek
    • Příklad pro email john.smith@gmail.com: recipient = "john.smith@gmail.com"

  • subject
    • Nastavuje předmět zaslaného emailu
    • Opět se jedná o string, zpráva musí být vložena do uvovozek
    • Příklad: subject = "Output takes too much power"

  • text
    • Nastavuje text zaslaného emailu
    • Opět se jedná o string, zpráva musí být vložena do uvovozek
    • Příklad: text = "Output " .. string.format(output) .. " on your NETIO exceeded limit " .. string.format(currentLimit) .. "mA!"

  • Dále se ve skriptu nachází proměnná, ve které je uložena hodnota proudu. Je nazvána current a její počáteční hodnota je nastavena na 0 (local current = 0)

Funkce checkTime

function checkTime()
  local timeNow = os.time()
  if (_G.timestamp == 0 or _G.timestamp == nil) then
    _G.timestamp = timeNow
  end
  if (timeNow - _G.timestamp >= timeLimit) then
    return true
  end
  return false
end
  • Funkce obsahuje 2 proměnné. Lokální proměnnou timeNow, do které se ukládá aktuální čas a globální proměnnou _G.timestamp, ve které je uložen čas, při kterém došlo k prvnímu překročení limitu. Pokud k překročení hodnoty ještě nedošlo má hodnotu nil. Pokud se proud vrátil k povolené hodnotě, její hodnota se ve funkci currentMeasurement nastaví na 0.
  • Globální proměnná není inicializována pomocí klíčového slova local a je sdílená všemi skripty. Je tedy nutné dát si velký pozor a v jiných skriptech nepoužívat proměnou se stejným názvem. Oba skripty by v takovém případě pravděpodobně nepracovaly správně. Jedná-li se o globální proměnnou, je v Lua zvykem před její název vkládat předponu _G. kvůli přehlednosti.
  • Nejprve se do proměnné timeNow pomocí knihovní funkce os.time() uloží aktuální čas.
  • Poté se zkontroluje, zdali již k překročení limitu došlo poprvé (if (_G.timestamp == 0 or _G.timestamp == nil) then)*. Pokud ano, do proměnné _G.timestamp se uloží aktuální čas (_G.timestamp = timeNow).
  • Nakonec funkce zjistí, jestli již čas po který dochází k překračování limitu proudu je delší než nastavená doba (if (timeNow - _G.timestamp >= timeLimit) then). Pokud ano, funkce vrací hodnotu true (return true). V opačném případě vrací false (return false).

Funkce currentMeasurement

function currentMeasurement()
  if output == 0 then
    for i=1,4,1 do	 
      current = current + devices.system["output" .. i .. "_current"]
    end
  else
    current = devices.system["output" .. output .. "_current"]
  end
  if current > currentLimit then
    if checkTime() then
      shutDown()
      mail(recipient, subject, text)
    end
  else
    _G.timestamp = 0
  end
end
  • Funkce nejprve podle proměnné output uloží hodnotu proudu jednoho z výstupů (popřípadě součet všech) do proměnné current. Tuto hodnotu pak porovná s proměnnou currentLimit.
  • K načítání hodnoty proudu je využita funkce devices.system.outputN_current, kde místo N je nutné vložit číslo měřeného výstupu.
  • Syntaxe pro vkládání proměnné (zde output) do tohoto příkazu je následující: devices.system["output" .. output .. "_current"]
  • Funkce dále obsahuje podmínku, která zjistí, jestli se měří všechny zásuvky (if output = 0 then), nebo jen o jednu zásuvku (else).
function currentMeasurement()
  if output == 0 then
    ---- if section ----
  else
    ---- else section ----
  end
end
  • Pokud se jedná o všechny zásuvky (if section), posčítají se proudy všemi zásuvkami.
    • Využívá se cyklu for, který postupně do proměnné current přičítá proudy jednotlivými zásuvkami.
    • Cyklus for se skládá z incializátoru (název proměnné a hodnota od které smyčka začíná), podmínky (hodnota na které se smyčka zastaví) a inkrementu** (hodnota o kterou se zvyšuje proměnná).
    • Zde je inicializátor: i=1, podmínka: 4, inkrement: 1
    • Po této trojici následuje klíčové slovo do a smyčka je ukončena slovem end
    • Uvnitř cyklu for se postupně do proměnné current přičítají hodnoty proudu jednotlivých zásuvek pomocí příkazu:
      current = current + devices.system["output" .. i .. "_current"]
    • Celá smyčka vypadá takto:
for i=1,4,1 do	 
  current = current + devices.system["output" .. i .. "_current"]
end
  • Pokud je hlídána jen jedna zásuvka (else section), načtení hodnoty proudu se provede přímo pomocí příkazu: current = devices.system["output" .. output .. "_current"]
  • Porovnání hodnoty proudu s nastaveným limitem.
    • K tomu slouží jednoduchá podmínka if current > currentLimit
    • Pokud je tato podmínka splněna, proud je tedy vyšší než je limit, zkontroluje se, jestli již byl překročen časový limit pomocí funkce checkTime (if checkTime() then). Pokud ano, dojde k zavolání funkce shutDown(), která zásuvku, popřípadě zásuvky, vypne a k odeslání e-mailu.
    • Pro odeslání emailu slouží funkce mail. Její parametry jsou následující: příjemce, předmět emailu, text emailu. V tomto případě tedy proměnné recipient, subject, text.
    • Příkaz vypadá takto: mail(recipient, subject, text)
    • Limit pro zasílání emailu je 5 minut. Tento limit se dá změnit přidáním 4.parametru do funkce mail. Parametrem je číslo v sekundách. Příkaz pro možnost odeslání emailu každých 30 sekund pak bude vypadat takto: mail(recipient, subject, text,30)
    • Pokud nedošlo k překročení limitu, je nutné nastavit globální proměnnou _G.timestamp na nulu (_G.timestamp = 0).

Funkce shutDown

function shutDown()
  if output == 0 then
    for i=1,4,1 do
      devices.system.SetOut{output=i, value=false}
    end
  else
    devices.system.SetOut{output=output, value=false}
  end
end
  • Funkce vypne zadaný výstup, popřípadě všechny výstupy.
  • Pro vypnutí všech zásuvek (output = 0) je zde použita stejná podmínka jako ve funkci currentMeasurement.
    • Tvar podmínky i for cyklu je stejný jako ve funkci currentMeasurement, jen uvnitř for cyklu není sčítání proudů, ale vypnutí příslušné zásuvky. K tomu je využit příkaz: devices.system.SetOut{output=i, value=false}
  • Pokud se hlídá jen jedna zásuvka, příkaz na vypnutí je následující: devices.system.SetOut{output=output, value=false}

Spuštění skriptu

  • Skript se spouští zavoláním funkce currentMeasurement. Na konci skriptu je příkaz: currentMeasurement().
  • Po zaškrtnutí pole Enabled a uložení se skript aktivuje.

*Hodnotu nil má každá proměnná, pokud nebyla inicializována

**Základní hodnota inkrementu je 1, v tomto případě ho tedy není nutné zadávat


 

Rozšíření o hlídání nízkého proudu

Pokud chcete hlídat, zdali proud procházející zásuvkou se nachází v bezpečném rozsahu (SafeRange), postupujte následovně.
 

1) Do záhlaví kódu (Section 1) přidejte novou proměnnou, nazvěte ji currentLowerLimit a její hodntou nastavte na hodnotu, pod kterou se proud procházející výstupem nesmí dostat. Příklad pro 100mA: local currentLowerLimit = 100

2) Funkci currentMeasurement nahraďte touto

function currentMeasurement()
  if output == 0 then
    for i=1,4,1 do         
      current = current + devices.system["output" .. i .. "_current"]
    end
  else
    current = devices.system["output" .. output .. "_current"]
  end
  if (current > currentLimit or current < currentLowerLimit) then
    if checkTime() then
      shutDown()
      mail(recipient, subject, text)
    end
  else
    _G.timestamp = 0
  end
end

Nyní pokud bude skript hlídat nízký i vysoký proud výstupem. Pro oba limity platí, že se výstup vypne poté, co hodnota proudu není v požadovaném intervalu po dobu nastavenou v proměnné timeLimit.

 

Nastavení e-mailu

  • Pro možnosti odesílání e-mailů z NETIO je nutné provést jeho nastavení ve webové aplikaci v sekci Settings - E-mail.
  • Podrobnější návod naleznete v NETIO AN07.

 

function shutDown()
  if output == 0 then
    for i=1,4,1 do
      devices.system.ResetOut{output=i}
    end
  else
    devices.system.ResetOut{output=output}
  end
  mail(recipient, subject, text)
end


 


Podporované verze FW:

3.0.0 a vyšší


Klíčová slova:

Hlídání proudu, měření proudu, proud, kontrola přetížení, Lua, e-mail, SMTP, ampér, email při překročení spotřeby, Lua tutoriál, kontrola spotřeby klimatizace, rozsah proudu

 

FAQ

Expand all

1) Je možnost takto hlídat více výstupů (například 1 a 2) v rámci jednoho zařízení NETIO?

Ano, vytvořte nové pravidlo, pojmenujte ho například Watcher2, změňte hodnotu proměnné output na 2 a nastavte vámi požadovaný limit. Nezapomeňte v celém skriptu změnit jméno proměnné _G.timestamp například na _G.timestamp2. Pravidla pak budou spuštěna souběžně.

Co mám udělat, abych nedostával email?

Ve funkci currentMeasurement pouze smažte (nebo zakomentujte) řádek s příkazem mail.

Chtěl bych po překročení spotřeby výstup/výstupy jen restartovat, je to možné?

Jistě, stačí ve funkci shutDown nahradit příkazy pro vypnutí příkazem pro restartování. Funkce pak bude vypadat takto:


function shutDown()
  if output == 0 then
    for i=1,4,1 do
      devices.system.ResetOut{output=i}
    end
  else
    devices.system.ResetOut{output=output}
  end
end

Pokud chcete po restartu zásuvku zapnout za určitou dobu, do příkazu pro restart vložte ještě parametr delay, ve kterém nastavíte dobu, za kterou se zásuvka znovu zapne. Příkaz vypadá takto: devices.system.ResetOut{output=i, delay=12} respektive devices.system.ResetOut{output=output, delay=12} (místo 12 nastavte váš čas).

Je možné po překročení limitu na hlídaném výstupu zapnout jiný výstup?

Jistě, do funkce shutDown vložte nad poslední příkaz end tento řádek: devices.system.SetOut{output=X, value=true}. Místo X vložte číslo zásuvky, kterou chcete zapnout.

Je možné jen poslat email a zásuvku nevypnout?

Ano, ve funkci currentMeasurement smažte volání funkce shutDown().

Lze tento skript kombinovat i s jinými?

Ano, ale při překročení limitu se zásuvka vypne a může narušit běh dalších akcí. Pozor také na globální proměnnou _G.timestamp.

Zeptejte se na cenu nebo technické parametry

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