Podporovaná zařízení: NETIO 4All, NETIO PowerPDU 4C, NETIO 4
AN09 Ping na 1 ze 2 IP adres je Lua script, který slouží k detekci výpadku spojení na definované zařízení, nebo obecně do internetu (8.8.8.8 – volně dostupné DNS Google).
Typická použití NETIO AN09
- Detekce výpadku připojení lokální sítě do Internetu (pro restart routeru / modemu / spoje)
- Detekce vypnutí centrální IP tiskárny – vypnutí napájení některých stolů pro úspory energie.
- Detekce výpadku IP spojení, pro autonomní aktivaci záložního připojení do sítě.
- Restart zlobícího spojení aniž by si zákazník všimnul většího výpadku někdo musel jezdit na vzdálenou lokalitu.
Jak to funguje?
Lua script obsahuje v záhlaví definici primární a sekundární IP adresy, na kterou NETIO zařízení odesílá PING požadavky. Když obdrží odpověď od primární nebo od sekundární adresy, vše OK. Když pro zadaný počet pokusů (missingPingAnswers defaultně 10) nedostane odpověď, provede akci, která je typicky vypnutí definovaného výstupu na zadaný čas pro restart připojeného zařízení.
Pokud reboot spoje trvá delší dobu, nebo není problém v koncovém zařízení, zajistí parametr firstLivingPulse = 1, že nebudete spoj každých pár minut stále dokola restartovat.
Continuous mode: Pro detekci špatného spojení (například pro infra / laserový spoj v mlze) lze použít mód continuous = 1, kde se počet špatných spojení sčítá dlouhodobě například 24 hodin a po restart se provede auto-rekalibrace spoje.
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: Watchdog (uživatelsky definovatelné)
- Description: Watchdog for IP device (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 AN09------------ ------------Section 1------------ local primaryIP = "192.168.101.120" -- primary IP address for ping verification local secondaryIP = "192.168.101.185" -- secondary IP address for ping verification (for watching only one IP use "" or "0.0.0.0" local pingPeriod = 5 -- period between ping requests [s] local missingPingAnswers = 5 -- max missing pings (shortest reaction time: pingPeriod * missingPingAnswers = 5 * 10 = 50s local controlOutput = 1 -- select output (1 - 4) local action = 2 -- action type (0 - turn off, 1 - turn on, 2 - short Off, 3 - short On,4 - toggle, 5 - do nothing) local timeoutAfterWatchdogAction = 60 -- time to activate watchdog again after action [s], 0 = no waiting local firstLivingPulse = 1 -- 1 = Watchdog function is activated after recieved ping answer (0/1) local continuous = 0 -- absolute/continuous mode (0/1) (more in NETIO AN09) local shortTimeMs = 2000 -- time used in states 2 and 3 [ms] ---------End of Section 1--------- local counter = 0 local hasSecondary = true -- Setting "output" to state defined in variable "action" function setOutput_wds1(output,action) if action == 0 then -- turn off devices.system.SetOut{output = output, value = false} elseif action == 1 then -- turn on devices.system.SetOut{output = output, value = true} elseif action == 2 then -- short off devices.system.SetOut{output = output, value = false} milliDelay(shortTimeMs,function() short_wds1(output,true) end) elseif action == 3 then -- short on devices.system.SetOut{output = output, value = true} milliDelay(shortTimeMs,function() short_wds1(output,false) end) elseif action == 4 then -- toggle if devices.system["output" ..output.. "_state"] == 'on' then devices.system.SetOut{output=output,value=false} else devices.system.SetOut{output=output, value=true} end elseif action == 5 then -- do nothing end end function short_wds1(output,state) devices.system.SetOut{output=output,value=state} end -- Incrementing counter and if counter exceeds "missingPingAnswers", it is set to 0 and function doAction is called function incrementCounter_wds1() counter = counter + 1 logf("Both IP addresses do not respond. Incrementing counter. Missing ping %d/%d", counter,missingPingAnswers) if counter >= missingPingAnswers then counter = 0 doAction_wds1() else delay(pingPeriod,function() pingDevice_wds1() end) end end -- Executes action and after delay activates Watchdog again or calls function pingWait function doAction_wds1() logf("Executing action %d with output %d", action, controlOutput) setOutput_wds1(controlOutput,action) if (toboolean(firstLivingPulse) or (not toboolean(timeoutAfterWatchdogAction))) then delay(timeoutAfterWatchdogAction,function() pingWait_wds1() end) else delay(timeoutAfterWatchdogAction,function() pingDevice_wds1() end) delay(timeoutAfterWatchdogAction,function() log("Turning Watchdog on") end) end end -- Waits for positive ping answer and then activates Watchdog again function pingWait_wds1() ping{address=primaryIP, timeout=5, callback=function(o) if o.success then logf("Ping on IP %s OK. Turning watchdog on", primaryIP) pingDevice_wds1() else if hasSecondary then ping{address=secondaryIP, timeout=5, callback=function(p) if p.success then logf("Ping on IP %s OK. Turning watchdog on", secondaryIP) pingDevice_wds1() else delay(pingPeriod,function() pingWait_wds1() end) end end } else delay(pingPeriod,function() pingWait_wds1() end) end end end } end -- Check if primary IP is responding function checkPrimary_wds1(o) if o.success then if toboolean(continuous) then counter = 0 end delay(pingPeriod,function() pingDevice_wds1() end) else logf("Ping on IP %s failed", primaryIP) if hasSecondary then ping{address=secondaryIP, timeout=5, callback=checkSecondary_wds1} else incrementCounter_wds1() end end end -- Check if secondary IP is responding function checkSecondary_wds1(o) if o.success then if toboolean(continuous) then counter = 0 end delay(pingPeriod,function() pingDevice_wds1() end) else logf("Ping attempt on secondary IP %s failed", secondaryIP) incrementCounter_wds1() end end -- Ping on primary IP --> starts Watchdog function pingDevice_wds1() ping{address=primaryIP, timeout=5, callback=checkPrimary_wds1} end -- Detects whether secondary IP is used function validateSecondaryIP_wds1() if secondaryIP == "0.0.0.0" or not toboolean(secondaryIP) then hasSecondary = false end end ------------Section delta------------ --[[ local resetTime = 86400 -- counter restart period [s] function resetCounter_wds1() counter = 0 logf("Counter restarted after %d", resetTime) delay(resetTime,function() resetCounter_wds1() end) end resetCounter_wds1() ]]-- ---------End of Section delta--------- log("Watchdog script started") validateSecondaryIP_wds1() pingDevice_wds1()
Princip
Skript hlídá dostupnost zadané IP adresy (primaryIP) pomocí ping, popřípadě záložní IP adresy (secondaryIP) s nastavenou periodou (pingPeriod).
Pokud není dostupná primární IP adresa, zjišťuje se dostupnost sekundární (opět pomocí ping).
Při nedostupnosti ani jedné z IP adres skript zvýší hodnotu proměnné counter.
Pokud hodnota proměnné counter přesáhne zvolenou hranici (missingPingAnswers), provede se s vybraným výstupem (controlOutput) nastavená akce (action). Nejkratší reakční doba na výpadek je tedy missingPingAnswers * (pingPeriod + 5) sekund. (Výchozí hodnota pro timeout příkazu ping je 5 sekund).
Čísla akcí jsou shodná s čísly akcí pro M2M protokoly:
- 0 = Vypnutí výstupu (Off)
- 1 = Zapnutí výstupu (On)
- 2 = Vypnutí výstupu na krátkou dobu (short Off)
- 3 = Zapnutí výstupu na krátkou dobu (short On)
- 4 = Přepnutí výstupu z jednoho stavu do druhého (toggle)
Po vykonání akce skript čeká po určenou dobu (timeoutAfterWatchdogAction) a poté podle hodnoty proměnné firstLivingPulse se znovu aktivuje (firstLivingPulse = 0) nebo čeká, dokud se nepodaří získat ping alespoň z jedné z adres (firstLivingPulse = 1).
Pomocí proměnné continuous je možné nastavit, zdali Watchdog hlídá nepřetržitý výpadek (continuous = 1), při které se proměnná counter vynuluje vždy při získání pozitivní odpovědi z alespoň jedné adresy. Při nastavení (continuous = 0) se counter nenuluje a Watchdog tedy hlídá celkový počet výpadků obou IP adres (k akci může tedy dojít při stabilním spojení i za půl roku) .
Nastavení proměnných
-
primaryIP
- String, ve kterém je uložena primární IP adresa.
- Je nutné zadávat adresu ve formátu IPv4. Pro získání IP adresy z DNS je možné použít například https://www.whatismyip.com/dns-lookup/.
- Příklad pro IP 192.168.101.128: primaryIP="192.168.101.128"
-
secondaryIP
- String, ve kterém je uložena sekundární IP adresa.
- Tato proměnná není povinná, pro hlídání jen jedné IP adresy je potřeba do této proměnné uložit prázdný string nebo IP adresu 0.0.0.0.
- Příklad pro IP 192.168.101.192: secondaryIP="192.168.101.192"
- Příklad pro hlídání jen primární IP adresy: secondaryIP="" nebo secondaryIP="0.0.0.0"
-
pingPeriod
- Tato proměnná nastavuje s jakou periodou (v sekundách) se bude zjišťovat odezva.
- Doba se měří od doby získání odezvy, ne od času předchozí kontroly.
- Minimální hodnota je 1 sekunda.
- Příklad pro kontrolu každých 10 sekund: pingPeriod = 10
-
missingPingAnswers
- V této proměnné je uložen počet nepřijatých odpovědí, po kterých se vykoná příslušná akce.
- Minimální hodnota je 1.
- Příklad pro 5 nepřijatých odpovědí: missingPingAnswers = 5
-
controlOutput
- Nastavuje ovládanou zásuvku.
- Příklad pro ovládání zásuvky 1: controlOutput= 1
-
action
- Nastavuje akci, která se s daným výstupem vykoná.
-
Akce:
- 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
-
timeoutAfterWatchdogAction
- Proměnná nastavující dobu v sekundách, po kterou skript čeká po vykonání akce. Po jejím uplynutí je Watchdog opět aktivován nebo začne aktivně čekat na ping (viz proměnná firstLivingPulse)
- Příklad pro pauzu 30 sekund: timeoutAfterWatchdogAction = 30
-
firstLivingPulse
- Nastavuje, zdali se Watchdog po vykonání akce aktivuje okamžitě, nebo až poté, co z jedné z adres obdrží pozitivní odpověď.
- Pro čekání na pozitivní odpověď: firstLivingPulse = 1
- Pro okamžité zapnutí: firstLivingPulse = 0
-
continuous
- Nastavuje, zdali se hlídají výpadky v řadě (continuous režim), nebo absolutní počet (absolute režim).
- Pro continuous režim: continuous = 1
- Pro absolute režim: continuous = 0
-
shortTimeMs
- Nastavuje dobu v milisekundách, za kterou se výstup zapne/vypne v akci 2 respektive 3
- Minimální hodnota je 100ms.
- Příklad pro změnu stavu výstupu 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í a začne periodická kontrola dostupnosti IP adres(y) v síti.
FAQ:
1) Lze pomocí tohoto skriptu hlídat více než 2 adresy?
Ne, tento skript slouží k hlídání funkčnosti alespoň jedné z maximálně 2 IP adres. Lze ale využít například AN25, které slouží k detekci výpadku 1 z 10 IP adres.
2) Je možné v continuous módu například jednou za den vynulovat počítadlo nepřijatých pingů?
Ano, v kódu je úplně dole pro tento účel vytvořena “Section delta”. Tuto sekci stačí odkomentovat (smazat znaky “--“ a “--”). Do proměnné resetTime vložte periodu s jakou chcete počítadlo restartovat (v sekundách).
Například pro reset každých 24 hodin: local resetTime = 86400
Nyní po zapnutí skriptu (proběhne při restartování zařízení) se bude počítadlo periodicky nulovat.
Kód by měl vypadat takto:
3) Je možné detekovat jestli zařízení funguje správně (například že IP kamera snímá obraz)?
Ne, pomocí tohoto skriptu lze pouze ověřit dostupnost IP zařízení v síti. Funkčnost ověřit nelze. Pokud je zařízení schopné komunikovat například pomocí .xml, je možné s tímto .xml souborem v Lua skriptu pracovat (jako například v AN13).
4) Jak hlídat jen jednu IP adresu?
Nastavte proměnnou secondaryIP="0.0.0.0" nebo secondaryIP="".
5) Je možné skript pustit vícekrát na různé IP adresy?
Ano, nicméně je kvůli vlastnostem NETIO Lua udělat několik úprav v kódu. Všechny názvy funkcí jsou ukončeny _wds1. Pro vícenásobné spuštění skriptu je nutné tuto koncovku u všech funkcí změnit například na _wds2. Nejrychlejším způsobem je zkopírování kódu do textového prohlížeče a pomocí kláves CTRL+H nahradit všechny výskyty _wds1 na _wds2.
6) Lze při akci odeslat email?
Pro odesílání emailu ze zásuvky NETIO je nutné nejprve provést nastavení ve webové aplikaci (viz NETIO AN07). Na začátek funkce doAction_wds1() je pak nutné vložit příkaz mail("my.email@example.com","NETIO Watchdog","Device is not responding!").
Kód by měl nyní vypadat takto:
7) Lze při vykonání akce aktivovat beeper?
Funkce beeper není v současné době dostupné, připravuje se v některých z příštích verzí.
8) Za jak dlouho začne fungovat Watchdog při výpadku napájení a v jakém stavu bude zásuvka?
NETIO po obnovení napájení nastaví výstupy do stavů ve kterých byly před výpadkem a po zhruba 2 minutách obnoví funkci Watchdogu.
9) Lze kombinovat funkci Watchdog z webového rozhraní a zároveň Lua skript?
Tato kombinace je teoreticky možná, nicméně doporučujeme využití pouze Lua skriptu.
10) Je možné připojené zařízení restartovat mobilní aplikací nebo tlačítkem když běží Lua skript?
Ano, skript běží nezávisle na stavu výstupu.
11) Lze zadat IP adresu pomocí DNS (textovým názvem)?
Ano, nicméně není zaručena funkčnost při výpadku DNS serveru.
Podporované verze FW:
3.0.0 a vyšší (Archiv firmware)
Více o Lua:
https://wiki.netio-products.com
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í. |