AN09 PING Watchdog - detekce funkce 1 ze 2 IP adres (Lua skript)
Tagy: 
User library

AN09 obsahuje Lua skript, který detekuje výpadek připojení k internetu a automaticky restartuje například mikrovlné připojení. Skript periodicky odesílá PING (icmp) na 1 ze 2 nastavených IP adres. Když ani jedna z IP adres neodpoví například 60 sekund, vypne jednu z elektrických zásuvek 230V na 20 sekund (short off - restart).

 

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

Podporovaná zařízení: NETIO 4All, NETIO 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()

 

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

 

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)

 


 

 

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 zařízení 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 zařízení NETIO 4All

Smart power socket NETIO

 

NETIO 4C

NETIO 4C je malé PDU (Power Distribution Unit) na 110/230V se čtyřmi ovládanými výstupy na IEC-320 C13 max 8A. Obsahuje Ethernet switch a 2x LAN port na připojení do sítě. Každý ze čtyř výstupů napájení lze individuálně vypnout/zapnout přes web, z mobilní aplikace nebo pomocí různých M2M API (SNMP, MQTT, XML, Modbus/TCP, ..). V NETIO 4C lze spouštět přímo v zařízení běžící zákaznické Lua skripty. Specialitou NETIO 4C je sériový port RS-232 (3-pin), který lze ovládat z Lua scriptu, nebo jako vzdálený sériový port.

Více o zařízení NETIO 4C

 

Zeptejte se na cenu nebo technické parametry

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