AN16 Lua SNMP - čtení stavu baterie a vypínání elektrických zásuvek při UPS < 50% (Lua Active client) | Chytré zásuvky NETIO ovládané pomocí WiFi a LAN
Tagy: 
User library

V příkladu AN16 běží v NETIO zásuvkách Lua script, který aktivně čte SNMP hodnotu z vnějšího zařízení a reaguje na ni. Chytré zásuvky tak přes LAN síť čtou po SNMP protokolu stav jiného zařízení na síti (na jiné IP adrese). AN16 demonstruje detekci vybité baterie v UPS a prodloužení funkce datacentra. Při stavu baterie pod 50%, vypíná elektrická zásuvka část chlazení. Dotazem na jiné SNMP OID lze reagovat na jiné veličiny z UPS (např detekovat výpadek vstupního napětí). Chytrá NETIO zásuvka a UPS komunikují přímo, bez jakéhokoliv serveru nebo aplikace uprostřed.

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

 

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()

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

 

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()


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

 

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:

Smart power socket NETIO

 

NETIO 4

NETIO 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).

Více o NETIO 4

 

Smart power socket NETIO 4All

 

NETIO 4All

NETIO 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.

Více o NETIO 4All

 
NETIO PowerPDU 4C is small PDU with power measurement and IEC-320 outputs

 

NETIO PowerPDU 4C

NETIO 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í.

Více o NETIO PowerPDU 4C

 

Zeptejte se na cenu nebo technické parametry

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