Podporovaná zařízení: NETIO 4All, NETIO 4, PowerPDU 4C
NETIO AN16 je příklad aktivní komunikace Lua skriptu, který běží v chytrých zásuvkách a umí reagovat na jakoukoliv SNMP hodnotu, kterou načte z jiného zařízení. Lua Active Client je unikátní vlastnost chytrých zásuvek NETIO 4x.
Lua Active Client dokáže:
- Načítat SNMP hodnoty z obecného SNMP zařízení (IP adresa, OID)
- Načítat z Modbus/TCP hodnoty z obecného zařízení (IP, port, Modbus/TCP adresa)
- Detekovat odpověď na PING (AN09, AN24, AN25)
- Nastavit výstupy na jiném NETIO zařízení (URL API) – AN
Aplikační poznámka AN16 obsahuje dva příklady Lua skriptů, liší se způsobem práce se získanou hodnotou. Vyberte si jeden z nich.
1) Lua skript SNMP - number - čtení hodnoty
Přečte po SNMP proměnnou na zadané OID adrese jako string. Převede získanou hodnotu ze stringu na číslo, které umí porovnávat (větší/menší) hodnota proti proměnné limitValue nastavené v záhlaví Lua skriptu. Pracuje pouze s celým číslem, bez desetinných míst. Ovládá zvolený výstup podle toho, je-li přečtená hodnota větší nebo menší než limitValue.
2) Lua skript SNMP - string - porovnávání řetězců
Přečte po SNMP proměnnou na zadané OID adrese jako string. V získaném řetězci (stringu) zkusí skript vyhledat řetězec definovaný v záhlaví Lua skriptu v proměnné requestedString. Ovládá zvolený výstup podle toho, je-li hledaný sub-řetězec v odpovědi nalezen nebo ne.
Lua skript pro čtení hodnoty (SNMP - number)
První varianta Lua skriptu, vyhledává v odpovědi na SNMP dotaz souvislý řetězec, ten převede na číslo a to porovnává s hodnotou v proměnné limitValue. Ovládá zvolený výstup elektrických zásuvek On/Off.
Vytvoření pravidla (rule)
Pro vytvoření a spuštění Lua skriptu je nutné následující:
1) Ve webové administraci NETIO 4x v sekci Actions, přidejte pravidlo pomocí tlačítka Create Rule
2) Vyplňte následující parametry:
- Enabled: zaškrtnuto
- Name: SNMP - number (uživatelsky definovatelné)
- Description: Read number over SNMP and set output (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 AN16 SNMP Value reading------------ ------------Section 1------------ local IP = "192.168.101.132" -- device IP local oid = ".1.3.6.1.2.1.33.1.3.3.1.3.1" -- oid local snmpVersion = "2c" -- 1 or 2c local positionInString = 16 local limitValue = 50 local output = 1 local stateHigh = 1 local stateLow = 0 local period = 1 ---------End of Section 1--------- local version = "" if snmpVersion == "1" then version = SNMP_VERSION.Snmp1 elseif snmpVersion == "2c" then version = SNMP_VERSION.Snmp2c else logf("Invalid SNMP version: %s, valid options: 1, 2c",snmpVersion) return end function snmpcallbackPower(data) if data.result == 0 then --FAQ01 (log results) --logf("Result: %d, oid: %s, value: %s", data.result, data.oid, data.value) local value = data.value:sub(positionInString) logf("not converted: %s",value) local numValue = convertNumber(value) logf("converted: %s",tostring(numValue)) if numValue ~= nil then if numValue >= limitValue then devices.system.SetOut{output=output,value=stateHigh} log("Value is higher then limit") else devices.system.SetOut{output=output,value=stateLow} log("Value is lower then limit") end else log("Wrong value format") end else log(string.format("snmpget failed with error %d: %s", data.result, data.errorInfo)) end end function convertNumber(num) local ret = "" for i=1,string.len(num) do if tonumber(num:sub(i,i)) ~= nil then ret = ret .. num:sub(i,i) elseif string.len(ret) ~= 0 then break end end return tonumber(ret) end function sendSNMP() snmpGet{host=IP, timeout=6, oid=oid, snmpVersion=version, community='public', callback=snmpcallbackPower} delay(period,function() sendSNMP() end) end sendSNMP()
Princip funkce Lua skriptu
- Lua skript periodicky (periodu je možné nastavit v proměnné period) vysílá SNMP get požadavek na zadnou IP adresu (proměnná IP) a zadané OID (proměnná oid).
- Přijatou odpověď přijme jako textové pole (string) ve kterém hledá na nastavené pozici číselnou hodnotu.
- Získanou hodnotu lze najít v LOGu, viz FAQ 01
- Pomocí proměnné positionInString je určeno místo v řetězci, kde začíná vlastní hodnota (například pokud by se před samotnou numerickou hodnotou nacházely jednotky – např “$25.0” místo “25 USD”). Od této pozice v řetězci je načteno první celé číslo, které se v řetězci nachází.
- Z takto omezeného řetězce se získá číslo, které může být ukončeno jakýmkoliv znakem od numericné číslice. To znamená že skript pracuje pouze s celými čísly, desetinná čísla ořezává.
- Získané číslo je porovnáno se zadaným limitem (proměnná limit) a vykoná se příslušna akce (proměnné stateHigh a stateLow) s nastaveným výstupem (proměnná output).
- Při neobdržení odpovědi (cílové zařízení je např. Vypnuté) se stav výstupu nemění a NETIO se dále bude pokoušet o získání odpovědi z cílového zařízení.
Nastavení proměnných
-
IP
- IP adresa SNMP zařízení ze kterého čte NETIO hodnoty
- Jedná se o řetězec (string) musí tedy být v uvozovkách
- Příklad pro IP adresu 192.168.2.50: local IP = "192.168.2.50"
-
oid
- SNMP oid je identifikátor proměné v SNMP stromu, jehož hodnota bude načítána. Lze to popsat jako “adresu” proměnné.
- Jedná se o řetězec (string) musí tedy být v uvozovkách
- Příklad pro oid .1.3.6.1.2.1.33.1.3.3.1.3.1 :
-
local oid = ".1.3.6.1.2.1.33.1.3.3.1.3.1"
-
snmpVersion
- Proměnná definující jaká verze protokolu SNMP bude použita. Je možné použít verze 1 a 2c.
- Příklad pro použití verze 2c: local snmpVersion = "2c"
-
snmpCommunityString
- Pomocí této proměnné je možné nastavit community string pro snmp. Výchozí hodnota pro většinu zařízení bývá public.
- Příklad pro nastavení community stringu na hodnotu public: local snmpCommunityString= "public"
-
positionInString
- V této proměnné je určena pozice, od které se bude načítat hodnota.
- Je nutné počítat všechny znaky včetně mezer.
- Například pokud je nutné z řetězce: "Temperature is 26°C" získat údaj o teplotě, bude tato proměná nastavena takto: local positionInString = "16"
-
limitValue
- Proměnná nastavující limitní hranici. Pokud je získaná hodnota vyšší nebo rovna limitu, nastaví se výstup do stavu stateHigh, pokud je nižší, nastaví so do stavu stateLow.
- Musí se jednat o celé číslo.
- Příklad pro limit 50: local limitValue = 50
-
output
- Proměnná nastavující, který výstup bude ovládán na základě dat získaných pomocí snmp.
- Přípustné hodnoty jsou 1,2,3,4.
- Příklad pro ovládání výstupu 2: local otuput = 2
-
stateHigh
- V této proměnné se nastavuje, v jakém stavu bude výstup, pokud bude získaná hodnota stejná nebo bude převyšovat limitní hodnotu.
- Přípustné hodnoty: 0 - vypnout výstup, 1 - zapnout výstup
- Příklad pro zapnutí výstupu: local stateHigh = 1
-
stateLow
- V této proměnné se nastavuje, v jakém stavu bude výstup, pokud bude získaná hodnota menší než limitní hodnota.
- Přípustné hodnoty: 0 - vypnout výstup, 1 - zapnout výstup
- Příklad pro vypnutí výstupu: local stateLow = 0
-
period
- Proměnná nastavující s jakou periodou bude načítána hodnota (v sekundách)
- Musí se jednat o celé číslo.
- Příklad pro načítání hodnoty každých 30sekund: local period = 30
Spuštění Lua 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í a kontrolní výstup se začne nastavovat podle hlídané IP adresy. Pokud se skript nespustí, zkontrolujte nastavení.
Lua skript pro čtení hodnoty (SNMP - string)
Druhá varianta Lua skriptu, vyhledává v odpovědi na SNMP dotaz řetězec nastavený v proměnné requestedString. Ovládá zvolený výstup elektrických zásuvek On/Off.
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: SNMP - string (uživatelsky definovatelné)
- Description: Read string over SNMP and set output (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 AN16 SNMP String reading------------ ------------Section 1------------ local IP = "192.168.101.132" -- device IP local oid = ".1.3.6.1.2.1.33.1.3.3.1.3.1" -- oid local smnpVersion = "2c" -- 1 or 2c local requestedString = "aa" local output = 1 local stringOK = 1 local stringNoOK = 0 local period = 1 ---------End of Section 1--------- local version = "" if smnpVersion == "1" then version = SNMP_VERSION.Snmp1 elseif smnpVersion == "2c" then version = SNMP_VERSION.Snmp2c else logf("Invalid SNMP version: %s, valid options: 1, 2c",smnpVersion) return end function snmpcallbackPower(data) if data.result == 0 then --FAQ01 (log results) --logf("Result: %d, oid: %s, value: %s", data.result, data.oid, data.value) if string.match(data.value,requestedString) then devices.system.SetOut{output=output,value=stringOK} log("Value contains string") else devices.system.SetOut{output=output,value=stringNoOK} log("Value does not contain string") end else log(string.format("snmpget failed with error %d: %s", data.result, data.errorInfo)) end end function convertNumber(num) local ret = "" for i=1,string.len(num) do if tonumber(num:sub(i,i)) ~= nil then ret = ret .. num:sub(i,i) elseif ret.len ~= 0 then break end end return tonumber(ret) end function sendSNMP() snmpGet{host=IP, timeout=6, oid=oid, snmpVersion=version, community='public', callback=snmpcallbackPower} delay(period,function() sendSNMP() end) end sendSNMP()
Princip
- Skript periodicky (periodu je možné nastavit v proměnné period) vysílá SNMP get požadavek na IP adresu (proměnná IP) a zadané OID (proměnná oid).
- Přijatou odpověď přijme jako textové pole (string).
- Získanou hodnotu lze najít v LOGu, viz FAQ 01
- Skript následně zjistí, jestli se v přijatém řetězec nachází zadaný řetězec (proměnná requestedString).
- Podle nalezení / nenalezení řetězce z proměnné - requestedString vykoná příslušnou akci (proměnné stringOK a stringNoOK) s nastaveným výstupem (proměnná output).
Nastavení proměnných
-
IP
- IP adresa zařízení
- Jedná se o řetězec (string) musí tedy být v uvozovkách
- Příklad pro IP adresu 192.168.2.50: local IP = "192.168.2.50"
-
oid
- oid (identifikátor), jehož hodnota bude načítána
- Jedná se o řetězec (string) musí tedy být v uvozovkách
-
Příklad pro oid .1.3.6.1.2.1.33.1.3.3.1.3.1 :
local oid = ".1.3.6.1.2.1.33.1.3.3.1.3.1"
-
snmpVersion
- Tato proměnná určuje, jaká verze protokolu snmp bude použita. Je možné použít verze 1 a 2c.
- Příklad pro použití verze 2c: local snmpVersion = "2c"
-
snmpCommunityString
- Pomocí této proměnné je možné nastavit community string pro snmp. Výchozí hodnota pro většinu zařízení bývá public.
- Příklad pro nastavení community stringu na hodnotu public: local snmpCommunityString= "public"
-
requestedString
- Tato proměnná obsahuje řetězec (string), který je vyhledáván v získané hodnotě.
- Nachází-li se tento řetězec v získané hodnotě, nastaví se výstup do stavu stringOK, v opačném případě se nastaví do stavu stringNoOK.
- Jedná se o řetězec (string) musí tedy být v uvozovkách.
- Příklad pro žádaný string - off: local requestedString = "off"
- Pokud bude v tomto případě přijatá zpráva "State: off", bude výstup nastaven do stavu stringOK.
-
output
- Proměnná nastavující, který výstup bude ovládán na základě dat získaných pomocí snmp.
- Přípustné hodnoty jsou 1,2,3,4.
- Příklad pro ovládání výstupu 2: local otuput = 2
-
stringOK
- V této proměnné se nastavuje stav, ve kterém bude výstup, pokud získaná hodnota obsahuje požadovaný řetězec.
- Přípustné hodnoty: 0 - vypnout výstup, 1 - zapnout výstup
- Příklad pro zapnutí výstupu: local stateOK = 1
-
stringNoOK
- V této proměnné se nastavuje stav, ve kterém bude výstup, pokud získaná hodnota neobsahuje požadovaný řetězec.
- Přípustné hodnoty: 0 - vypnout výstup, 1 - zapnout výstup
- Příklad pro vypnutí výstupu: local stateNoOK = 0
-
period
- Proměnná nastavující s jakou periodou bude načítána hodnota (v sekundách)
- Musí se jednat o celé číslo.
- Příklad pro načítání hodnoty každých 30sekund: local period = 30
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í a kontrolní výstup se začne nastavovat podle hlídané IP adresy. Pokud se skript nespustí, zkontrolujte nastavení.
FAQ:
1) Lze nějak ověřit odpověď na SNMP dotaz?
Ano, odmazáním komentáře před řádkou označenou jako FAQ1 aktivujete zápis každé přijaté proměnné do LOGu.
2) Lze signalizovat jiným výstupem nebo třeba pípákem v zařízení, odesláním emailu nebo přepnutím jiného výstupu, že cílové SNMP zařízení není dostupné?
Funkce pro aktivaci zvukového signálu v současné době není k dispozici, bude dostupná v pozdějších verzích firmware.
3) Lze použít i SNMP v3?
Ne, Lua skripty podporují pouze SNMP v1 a v2.
Podporované verze FW:
3.1.0 a vyšší (Archiv firmware)
Tato Aplikační poznámka může být použita v:
|
NETIO 4NETIO 4 je PDU modul čtyř zásuvek 230V/8A s připojením do počítačové sítě pomocí LAN a WiFi. Každou ze zásuvek lze individuláně vypnout/zapnout pomocí různých M2M API protokolů. NETIO 4 je unikátní produkt, který najde uplatnění v IT, průmyslu, chytrých domech, multimediálních instalacích atd. Všude, kde potřebujete zásuvky na 230V ovládané z mobilní aplikace, z nějakého programu (M2M API), z uživatelského skriptu (Lua), z funkcí časovač (Scheduler) a automatický restartér (IP WatchDog).
|
|
NETIO 4AllNETIO 4All je PDU modul čtyř elektrických zásuvek 230V/8A s měřením spotřeby na každé zásuvce, který lze připojit do počítačové sítě pomocí LAN a WiFi. Každou ze čtyř zásuvek lze individuálně vypnout/zapnout přes web nebo pomocí různých M2M API protokolů. Na každé zásuvce lze měřit její spotřebu elektřiny (A, W, kWh). Chytré zásuvky NETIO 4All jsou určeny pro aplikace vzdáleného měření a ovládání elektrických zásuvek. |
|
NETIO PowerPDU 4CNETIO PowerPDU 4C je malé PDU (Power Distribution Unit) na 110/230V. Každý ze čtyř výstupů IEC-320 C13 lze ovládat samostatně (On / Off / Reset / přepni). Na každém výstupu jsou měřeny elektrické veličiny (A, W, kWh, TPF, V, Hz) s vysokou přesností. Zařízení obsahuje dva LAN porty pro připojení do sítě (vestavěný Ethernet switch). Každý výstup napájení podporuje ZCS (Zero Current Switching), to znamená šetrné ovládání připojených zařízení. |