<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.netio-products.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Phrych</id>
	<title>wiki.netio-products.com - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.netio-products.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Phrych"/>
	<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Special:Contributions/Phrych"/>
	<updated>2026-04-21T14:36:59Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.32.0</generator>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=NETIO_Lua_Tips_%26_Philosophy&amp;diff=596</id>
		<title>NETIO Lua Tips &amp; Philosophy</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=NETIO_Lua_Tips_%26_Philosophy&amp;diff=596"/>
		<updated>2019-10-17T10:57:34Z</updated>

		<summary type="html">&lt;p&gt;Phrych: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Script starting ==&lt;br /&gt;
LUA Scripts in NETIO are event driven. That means if some [[NETIO Lua Reference| event]] is triggered the script run exactly once. One of &amp;quot;triggers&amp;quot; is for example [[System started up|System started up]]. You can find list of all events called &amp;quot;triggers&amp;quot; in [[NETIO Lua Reference|NETIO Lua Reference]].&lt;br /&gt;
&lt;br /&gt;
== Periodical scipts ==&lt;br /&gt;
In NETIO there is no way for triggering scripts periodically (e.g. every 10 seconds) usng standard triggers. For such scripts the trigger [[System started up|System started up]] and the function [[delay()|delay()]] must be used. This function calls itself and allows to run some procedures periodically. &lt;br /&gt;
*Example switching output 1 every 10 seconds:&lt;br /&gt;
&lt;br /&gt;
 local doPeriod = 10 -- repeat period in seconds&lt;br /&gt;
 -------------------------------------------------&lt;br /&gt;
 function doPeriodically()&lt;br /&gt;
      -- your periodical code&lt;br /&gt;
      -- your periodical code&lt;br /&gt;
      -- your periodical code&lt;br /&gt;
      -- your periodical code&lt;br /&gt;
      -- your periodical code&lt;br /&gt;
      -- your periodical code&lt;br /&gt;
   delay(doPeriod,function() doPeriodically() end)&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 doPeriodically()&lt;br /&gt;
&lt;br /&gt;
*This script can be launch using e.g. [[System started up|System started up]] trigger.&lt;br /&gt;
*Only way how to disable these scripts is restart of NETIO, or usage of global variables.&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
To debug your code, use [[Function log()|log()]] and [[Function logf()|logf()]] functions. See the output in system events log.&lt;br /&gt;
&lt;br /&gt;
== Global variables ==&lt;br /&gt;
For sharing variables between scripts, their initialization must be done without keyword '''local'''. Conventions in Lua specify that global variables should start with '''_G.''' (e.q. '''_G.globalVariable = true'''). After initialization global variable is available in all scripts. After restarting device, all global variables are deleted. It is recommended to use different names for local and global variables.&lt;br /&gt;
&lt;br /&gt;
== Deactivating scripts using global variables ==&lt;br /&gt;
Periodical scripts described above can be paused using global variables. The only necessary thing is adding '''if-else''' condition at the beginning of callback function. This condition is checking state of global variable and based on its state it may pause the script. Value of global variable may be changed in another script triggered for example by URL API request.&lt;br /&gt;
&lt;br /&gt;
Example of a periodical script which can be paused by second script. Second script should be triggered by URL API request. Main script is then paused by: ''http://&amp;lt;NETIO_IP&amp;gt;/event?globalVariable=0'' and resumed by ''http://&amp;lt;NETIO_IP&amp;gt;/event?globalVariable=1''.&lt;br /&gt;
&lt;br /&gt;
Main script:&lt;br /&gt;
&lt;br /&gt;
 local doPeriod = 10 -- repeat period in seconds&lt;br /&gt;
 globalVariable = true -- initialization of global variable&lt;br /&gt;
 -------------------------------------------------&lt;br /&gt;
 function doPeriodically()&lt;br /&gt;
      if globalVariable == true then&lt;br /&gt;
      -- your periodical code&lt;br /&gt;
      -- your periodical code&lt;br /&gt;
      -- your periodical code&lt;br /&gt;
      -- your periodical code&lt;br /&gt;
      -- your periodical code&lt;br /&gt;
      -- your periodical code&lt;br /&gt;
      end&lt;br /&gt;
   delay(doPeriod,function() doPeriodically() end)&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 doPeriodically()&lt;br /&gt;
&lt;br /&gt;
Controling script (trigger: Incoming URL API request):&lt;br /&gt;
&lt;br /&gt;
 if event.args.globalVariable == &amp;quot;0&amp;quot; then&lt;br /&gt;
   globalVariable = false&lt;br /&gt;
 elseif event.args.globalVariable == &amp;quot;1&amp;quot; then&lt;br /&gt;
   globalVariable = true&lt;br /&gt;
 end&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=NETIO_Lua_Tips_%26_Philosophy&amp;diff=595</id>
		<title>NETIO Lua Tips &amp; Philosophy</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=NETIO_Lua_Tips_%26_Philosophy&amp;diff=595"/>
		<updated>2019-10-17T09:13:43Z</updated>

		<summary type="html">&lt;p&gt;Phrych: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Script starting ==&lt;br /&gt;
LUA Scripts in NETIO are event driven. That means if some [[NETIO Lua Reference| event]] is triggered the script run exactly once. One of &amp;quot;triggers&amp;quot; is for example [[System started up|System started up]]. You can find list of all events called &amp;quot;triggers&amp;quot; in [[NETIO Lua Reference|NETIO Lua Reference]].&lt;br /&gt;
&lt;br /&gt;
== Periodical scipts ==&lt;br /&gt;
In NETIO there is no way for triggering scripts periodically (e.g. every 10 seconds) usng standard triggers. For such scripts the trigger [[System started up|System started up]] and the function [[delay()|delay()]] must be used. This function calls itself and allows to run some procedures periodically. &lt;br /&gt;
*Example switching output 1 every 10 seconds:&lt;br /&gt;
&lt;br /&gt;
 DoPeriod = 10 -- repeat period in seconds&lt;br /&gt;
 -------------------------------------------------&lt;br /&gt;
 function doPeriodically()&lt;br /&gt;
      -- your periodical code&lt;br /&gt;
      -- your periodical code&lt;br /&gt;
      -- your periodical code&lt;br /&gt;
      -- your periodical code&lt;br /&gt;
      -- your periodical code&lt;br /&gt;
      -- your periodical code&lt;br /&gt;
   delay(DoPeriod,function() doPeriodically() end)&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 doPeriodically()&lt;br /&gt;
&lt;br /&gt;
*This script can be launch using e.g. [[System started up|System started up]] trigger.&lt;br /&gt;
*Only way how to disable these scripts is restart of NETIO, or usage of global variables.&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
To debug your code, use [[Function log()|log()]] and [[Function logf()|logf()]] functions. See the output in system events log.&lt;br /&gt;
&lt;br /&gt;
== Global variables ==&lt;br /&gt;
For sharing variables between scripts, their initialization must be done without keyword '''local'''. Conventions in Lua specify that global variables should start with '''_G.''' (e.q. '''_G.globalVariable = true'''). After initialization global variable is available in all scripts. After restarting device, all global variables are deleted. It is recommended to use different names for local and global variables.&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=NETIO_Lua_Tips_%26_Philosophy&amp;diff=594</id>
		<title>NETIO Lua Tips &amp; Philosophy</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=NETIO_Lua_Tips_%26_Philosophy&amp;diff=594"/>
		<updated>2019-10-17T09:13:26Z</updated>

		<summary type="html">&lt;p&gt;Phrych: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Script starting ==&lt;br /&gt;
LUA Scripts in NETIO are event driven. That means if some [[NETIO Lua Reference| event]] is triggered the script run exactly once. One of &amp;quot;triggers&amp;quot; is for example [[System started up|System started up]]. You can find list of all events called &amp;quot;triggers&amp;quot; in [[NETIO Lua Reference|NETIO Lua Reference]].&lt;br /&gt;
&lt;br /&gt;
== Periodical scipts ==&lt;br /&gt;
In NETIO there is no way for triggering scripts periodically (e.g. every 10 seconds) usng standard triggers. For such scripts the trigger [[System started up|System started up]] and the function [[delay()|delay()]] must be used. This function calls itself and allows to run some procedures periodically. &lt;br /&gt;
*Example switching output 1 every 10 seconds:&lt;br /&gt;
&lt;br /&gt;
 DoPeriod = 10 -- repeat period in seconds&lt;br /&gt;
 -------------------------------------------------&lt;br /&gt;
 function doPeriodically()&lt;br /&gt;
      -- your periodical code&lt;br /&gt;
      -- your periodical code&lt;br /&gt;
      -- your periodical code&lt;br /&gt;
      -- your periodical code&lt;br /&gt;
      -- your periodical code&lt;br /&gt;
      -- your periodical code&lt;br /&gt;
   delay(DoPeriod,function() doPeriodically() end)&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 doPeriodically()&lt;br /&gt;
&lt;br /&gt;
*This script can be launch using e.g. [[System started up|System started up]] trigger.&lt;br /&gt;
*Only way how to disable these scripts is restart of NETIO, or usage of global variables.&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
To debug your code, use [[Function log()|log()]] and [[Function logf()|logf()]] functions. See the output in system events log.&lt;br /&gt;
&lt;br /&gt;
== Global variables ==&lt;br /&gt;
For sharing variables between scripts, their initialization must be done without keyword '''local'''. Conventions in Lua specify that global variables should start with '''_G.''' (e.q. _G.globalVariable = true). After initialization global variable is available in all scripts. After restarting device, all global variables are deleted. It is recommended to use different names for local and global variables.&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=NETIO_Lua_Manual&amp;diff=442</id>
		<title>NETIO Lua Manual</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=NETIO_Lua_Manual&amp;diff=442"/>
		<updated>2019-07-11T15:50:34Z</updated>

		<summary type="html">&lt;p&gt;Phrych: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Script triggering ==&lt;br /&gt;
Scripts in NETIO are launched with &amp;quot;triggers&amp;quot; such as [[System started up|System started up]]. List of all triggers is in [[NETIO Lua Reference|NETIO Lua Reference]].&lt;br /&gt;
&lt;br /&gt;
== Periodical scipts ==&lt;br /&gt;
In NETIO there is no way for triggering scripts periodically (e.g. every 10 seconds). For such scripts a function [[delay()|delay()]] must be used. This function allows to run some procedures periodically. &lt;br /&gt;
*Example switching output 1 every 10 seconds:&lt;br /&gt;
 function switch()&lt;br /&gt;
   if devices.system.output1_state == 'on' then  &lt;br /&gt;
     devices.system.SetOut{output=1,value=false}&lt;br /&gt;
   else&lt;br /&gt;
     devices.system.SetOut{output=1, value=true}&lt;br /&gt;
   end&lt;br /&gt;
   delay(10,function() switch() end)&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 switch()&lt;br /&gt;
&lt;br /&gt;
*This script can be launch using e.g. [[System started up|System started up]] trigger.&lt;br /&gt;
*Only way how to disable these scripts is restart of NETIO, or usage of global variables.&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
To debug your code, use [[Function log()|log()]] and [[Function logf()|logf()]] functions. See the output in system events log.&lt;br /&gt;
&lt;br /&gt;
== Data types and variables ==&lt;br /&gt;
Lua supports these data types:&lt;br /&gt;
* &amp;lt;i&amp;gt;nil&amp;lt;/i&amp;gt; (to assign &amp;lt;i&amp;gt;nil&amp;lt;/i&amp;gt; value effectively deletes the variable)&lt;br /&gt;
* &amp;lt;i&amp;gt;boolean&amp;lt;/i&amp;gt; (falsy values are &amp;lt;i&amp;gt;nil&amp;lt;/i&amp;gt; and &amp;lt;i&amp;gt;false&amp;lt;/i&amp;gt; only; &amp;quot;&amp;quot; and 0 evaluates as &amp;lt;i&amp;gt;true&amp;lt;/i&amp;gt;)&lt;br /&gt;
* &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; (decimals only in standard Lua, integers only in Netio Lua)&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; (same strings share same address, so equality operator measures both address and value)&lt;br /&gt;
* &amp;lt;i&amp;gt;tables&amp;lt;/i&amp;gt; are associative arrays. (Tables with numeric indices are, well, just arrays.)&lt;br /&gt;
&lt;br /&gt;
 local numbers = {2,3,7,5} -- array (first index = 1)&lt;br /&gt;
 local dictionary = {one=1, two=2, three=3} -- table&lt;br /&gt;
 local numbersZeroBased = {[0]=2,3,7,5} -- array (first index = 0)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;local&amp;lt;/i&amp;gt; keyword limits the variable scope to the block (ended by &amp;lt;i&amp;gt;end&amp;lt;/i&amp;gt;) where it is declared. To access an &amp;lt;i&amp;gt;upvalue&amp;lt;/i&amp;gt; (variable defined outside of the scope), just omit the &amp;lt;i&amp;gt;local&amp;lt;/i&amp;gt; keyword.&lt;br /&gt;
&lt;br /&gt;
== Operators ==&lt;br /&gt;
Lua has its own manners:&lt;br /&gt;
* &amp;lt;code&amp;gt;~=&amp;lt;/code&amp;gt; is inequality operator&lt;br /&gt;
* &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; is string concatenation (don't use plus)&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;s&amp;gt;i++&amp;lt;/s&amp;gt;&amp;lt;/code&amp;gt; no increment/decrement operator &amp;lt;code&amp;gt;i = i + 1&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;s&amp;gt;max = a&amp;lt;b ? b : a&amp;lt;/s&amp;gt;&amp;lt;/code&amp;gt; no ternary operator. Use (and get used to) &amp;lt;i&amp;gt;and idiom&amp;lt;/i&amp;gt; instead: &amp;lt;code&amp;gt;max = (a&amp;lt;b) and b or a&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;i&amp;gt;or idiom&amp;lt;/i&amp;gt; works: &amp;lt;code&amp;gt;x = x or 42&amp;lt;/code&amp;gt; is equivalent to &amp;lt;code&amp;gt;if not x then x = 42 end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conditions ==&lt;br /&gt;
Lua conditions has casual syntax, see [https://www.lua.org/pil/4.3.1.html here]. Just keep in mind to merge &amp;lt;code&amp;gt;else&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;elseif&amp;lt;/code&amp;gt; or multiple &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt;s are required.&lt;br /&gt;
&lt;br /&gt;
Note that falsy values are &amp;lt;i&amp;gt;nil&amp;lt;/i&amp;gt; and &amp;lt;i&amp;gt;false&amp;lt;/i&amp;gt; only. Empty string and 0 evaluates as true. If you come from C, you might be surprised by following snippet:&lt;br /&gt;
&lt;br /&gt;
 if devices.system.output1_consumption then&lt;br /&gt;
   -- always happens, even if the consumption is 0&lt;br /&gt;
   log(&amp;quot;Outlet 1 supplies power&amp;quot;)&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
 if not devices.system.output1_consumption then&lt;br /&gt;
   -- never happens, even if the consumption is 0&lt;br /&gt;
   log(&amp;quot;Outlet 1 is idle&amp;quot;)&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
Lua has &amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt; statement, but no &amp;lt;code&amp;gt;continue&amp;lt;/code&amp;gt; (use condition inside loop instead). Additionally, Netio Lua implementation limits the loop iterations to 32k.&lt;br /&gt;
&lt;br /&gt;
=== While ===&lt;br /&gt;
While syntax is not different to other languages:&lt;br /&gt;
 local i = 0&lt;br /&gt;
 while i~=3 do&lt;br /&gt;
   i = i + 1&lt;br /&gt;
   logf(&amp;quot;%d&amp;quot;,i)&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
=== Repeat until ===&lt;br /&gt;
Repeat until syntax is the same as Pascal's, other languages have similar do-while loops:&lt;br /&gt;
 local i = 0&lt;br /&gt;
 repeat&lt;br /&gt;
   i = i + 1&lt;br /&gt;
   logf(&amp;quot;%d&amp;quot;,i)&lt;br /&gt;
 until i==3&lt;br /&gt;
&lt;br /&gt;
=== Numeric for ===&lt;br /&gt;
Arrays in Lua are one-based (in indices are not specified, the first one is 1, not 0).&lt;br /&gt;
 local arr = {2,3,7,5}&lt;br /&gt;
 for i=1,#arr do logf(&amp;quot;%d&amp;quot;,arr[i]) end&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;b&amp;gt;for&amp;lt;/b&amp;gt; initVar,limit,increment &amp;lt;b&amp;gt;do&amp;lt;/b&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;i&amp;gt;number assignment&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;initVar&amp;lt;/code&amp;gt; inits loop-local variable&lt;br /&gt;
* &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; loops until initVar reaches this value&lt;br /&gt;
* &amp;lt;i&amp;gt;optional number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;increment&amp;lt;/code&amp;gt; after each loop initVar increment by this value (default 1)&lt;br /&gt;
&lt;br /&gt;
=== Generic for ===&lt;br /&gt;
Is rather sophisticated. Most common example (the order of elements in &amp;lt;code&amp;gt;pairs()&amp;lt;/code&amp;gt; is not guaranteed):&lt;br /&gt;
 local tab = {one=1, two=2, three=3}&lt;br /&gt;
 for key,val in pairs(tab) do logf(&amp;quot;%s:%d&amp;quot;,key,val) end&lt;br /&gt;
Generic for syntax&lt;br /&gt;
 &amp;lt;b&amp;gt;for&amp;lt;/b&amp;gt; var_1, ..., var_n &amp;lt;b&amp;gt;in&amp;lt;/b&amp;gt; explist &amp;lt;b&amp;gt;do&amp;lt;/b&amp;gt; block end&lt;br /&gt;
is equivalent to (Full explanation [https://www.lua.org/pil/7.2.html here].)&lt;br /&gt;
 do&lt;br /&gt;
   local _f, _s, _var = explist&lt;br /&gt;
   while true do&lt;br /&gt;
     local var_1, ... , var_n = _f(_s, _var)&lt;br /&gt;
     _var = var_1&lt;br /&gt;
     if _var == nil then break end&lt;br /&gt;
     block&lt;br /&gt;
   end&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
Iterator closure that holds its state&lt;br /&gt;
 function iter(a)&lt;br /&gt;
   local i = 0&lt;br /&gt;
   return function()&lt;br /&gt;
     i = i+1&lt;br /&gt;
     return a[i]&lt;br /&gt;
   end&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 local arr = {2,3,7,5}&lt;br /&gt;
 for value in iter(arr) do&lt;br /&gt;
   logf(&amp;quot;%d&amp;quot;,value)&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
Stateless iterator (in this case returns variable list: key and value)&lt;br /&gt;
 function iter(a,i)&lt;br /&gt;
   i = i+1&lt;br /&gt;
   if a[i] then return i,a[i] end&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 local arr = {2,3,7,5}&lt;br /&gt;
 for k,v in iter,arr,0 do&lt;br /&gt;
   logf(&amp;quot;%d:%d&amp;quot;,k,v)&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
Same effect using &amp;lt;code&amp;gt;ipairs()&amp;lt;/code&amp;gt; Lua function (without initial state)&lt;br /&gt;
 for k,v in ipairs(arr) do&lt;br /&gt;
   logf(&amp;quot;%d:%d&amp;quot;,k,v)&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
Now return to the most common example above using &amp;lt;code&amp;gt;pairs()&amp;lt;/code&amp;gt; Lua function and read about &amp;lt;code&amp;gt;pairs()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ipairs()&amp;lt;/code&amp;gt; implementation [https://www.lua.org/pil/7.3.html here].&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
&lt;br /&gt;
Lua allows multiple results (comma separated):&lt;br /&gt;
&lt;br /&gt;
 function diskSpace()&lt;br /&gt;
   return devices.system.freeSpace, devices.system.totalSpace&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 logf(&amp;quot;Free space: %d MB&amp;quot;, diskSpace()) -- only first return value is used&lt;br /&gt;
 local free,total = diskSpace() -- values are stored into LHS var-list&lt;br /&gt;
 logf(&amp;quot;Free space: %d %%&amp;quot;, 100*free/total)&lt;br /&gt;
&lt;br /&gt;
Variable-length arguments are also available:&lt;br /&gt;
&lt;br /&gt;
 function sum(...)&lt;br /&gt;
   local result = 0&lt;br /&gt;
   for _,v in ipairs(arg) do&lt;br /&gt;
     result = result + v&lt;br /&gt;
   end&lt;br /&gt;
   return result&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 logf(&amp;quot;Sum: %d&amp;quot;, sum(2,3,5))&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=NETIO_Lua_Manual&amp;diff=441</id>
		<title>NETIO Lua Manual</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=NETIO_Lua_Manual&amp;diff=441"/>
		<updated>2019-07-11T15:49:13Z</updated>

		<summary type="html">&lt;p&gt;Phrych: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Script triggering ==&lt;br /&gt;
Scripts in NETIO are launched with &amp;quot;triggers&amp;quot; such as [[System started up|System started up]]. List of all triggers is in [[NETIO Lua Reference|NETIO Lua Reference]].&lt;br /&gt;
&lt;br /&gt;
== Periodical scipts ==&lt;br /&gt;
In NETIO there is no way for triggering scripts periodically (e.g. every 10 seconds). For such scripts a function [[delay()|delay()]] must be used. This function allows to run some procedures periodically. &lt;br /&gt;
*Example switching output 1 every 10 seconds:&lt;br /&gt;
 function switch()&lt;br /&gt;
   if devices.system.output1_state == 'on' then  &lt;br /&gt;
     devices.system.SetOut{output=1,value=false}&lt;br /&gt;
   else&lt;br /&gt;
     devices.system.SetOut{output=1, value=true}&lt;br /&gt;
   end&lt;br /&gt;
   delay(10,function() switch() end)&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 switch()&lt;br /&gt;
&lt;br /&gt;
*This script can be launch using e.g. [[System started up|System started up]] trigger.&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
To debug your code, use [[Function log()|log()]] and [[Function logf()|logf()]] functions. See the output in system events log.&lt;br /&gt;
&lt;br /&gt;
== Data types and variables ==&lt;br /&gt;
Lua supports these data types:&lt;br /&gt;
* &amp;lt;i&amp;gt;nil&amp;lt;/i&amp;gt; (to assign &amp;lt;i&amp;gt;nil&amp;lt;/i&amp;gt; value effectively deletes the variable)&lt;br /&gt;
* &amp;lt;i&amp;gt;boolean&amp;lt;/i&amp;gt; (falsy values are &amp;lt;i&amp;gt;nil&amp;lt;/i&amp;gt; and &amp;lt;i&amp;gt;false&amp;lt;/i&amp;gt; only; &amp;quot;&amp;quot; and 0 evaluates as &amp;lt;i&amp;gt;true&amp;lt;/i&amp;gt;)&lt;br /&gt;
* &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; (decimals only in standard Lua, integers only in Netio Lua)&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; (same strings share same address, so equality operator measures both address and value)&lt;br /&gt;
* &amp;lt;i&amp;gt;tables&amp;lt;/i&amp;gt; are associative arrays. (Tables with numeric indices are, well, just arrays.)&lt;br /&gt;
&lt;br /&gt;
 local numbers = {2,3,7,5} -- array (first index = 1)&lt;br /&gt;
 local dictionary = {one=1, two=2, three=3} -- table&lt;br /&gt;
 local numbersZeroBased = {[0]=2,3,7,5} -- array (first index = 0)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;local&amp;lt;/i&amp;gt; keyword limits the variable scope to the block (ended by &amp;lt;i&amp;gt;end&amp;lt;/i&amp;gt;) where it is declared. To access an &amp;lt;i&amp;gt;upvalue&amp;lt;/i&amp;gt; (variable defined outside of the scope), just omit the &amp;lt;i&amp;gt;local&amp;lt;/i&amp;gt; keyword.&lt;br /&gt;
&lt;br /&gt;
== Operators ==&lt;br /&gt;
Lua has its own manners:&lt;br /&gt;
* &amp;lt;code&amp;gt;~=&amp;lt;/code&amp;gt; is inequality operator&lt;br /&gt;
* &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; is string concatenation (don't use plus)&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;s&amp;gt;i++&amp;lt;/s&amp;gt;&amp;lt;/code&amp;gt; no increment/decrement operator &amp;lt;code&amp;gt;i = i + 1&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;s&amp;gt;max = a&amp;lt;b ? b : a&amp;lt;/s&amp;gt;&amp;lt;/code&amp;gt; no ternary operator. Use (and get used to) &amp;lt;i&amp;gt;and idiom&amp;lt;/i&amp;gt; instead: &amp;lt;code&amp;gt;max = (a&amp;lt;b) and b or a&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;i&amp;gt;or idiom&amp;lt;/i&amp;gt; works: &amp;lt;code&amp;gt;x = x or 42&amp;lt;/code&amp;gt; is equivalent to &amp;lt;code&amp;gt;if not x then x = 42 end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conditions ==&lt;br /&gt;
Lua conditions has casual syntax, see [https://www.lua.org/pil/4.3.1.html here]. Just keep in mind to merge &amp;lt;code&amp;gt;else&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;elseif&amp;lt;/code&amp;gt; or multiple &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt;s are required.&lt;br /&gt;
&lt;br /&gt;
Note that falsy values are &amp;lt;i&amp;gt;nil&amp;lt;/i&amp;gt; and &amp;lt;i&amp;gt;false&amp;lt;/i&amp;gt; only. Empty string and 0 evaluates as true. If you come from C, you might be surprised by following snippet:&lt;br /&gt;
&lt;br /&gt;
 if devices.system.output1_consumption then&lt;br /&gt;
   -- always happens, even if the consumption is 0&lt;br /&gt;
   log(&amp;quot;Outlet 1 supplies power&amp;quot;)&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
 if not devices.system.output1_consumption then&lt;br /&gt;
   -- never happens, even if the consumption is 0&lt;br /&gt;
   log(&amp;quot;Outlet 1 is idle&amp;quot;)&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
Lua has &amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt; statement, but no &amp;lt;code&amp;gt;continue&amp;lt;/code&amp;gt; (use condition inside loop instead). Additionally, Netio Lua implementation limits the loop iterations to 32k.&lt;br /&gt;
&lt;br /&gt;
=== While ===&lt;br /&gt;
While syntax is not different to other languages:&lt;br /&gt;
 local i = 0&lt;br /&gt;
 while i~=3 do&lt;br /&gt;
   i = i + 1&lt;br /&gt;
   logf(&amp;quot;%d&amp;quot;,i)&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
=== Repeat until ===&lt;br /&gt;
Repeat until syntax is the same as Pascal's, other languages have similar do-while loops:&lt;br /&gt;
 local i = 0&lt;br /&gt;
 repeat&lt;br /&gt;
   i = i + 1&lt;br /&gt;
   logf(&amp;quot;%d&amp;quot;,i)&lt;br /&gt;
 until i==3&lt;br /&gt;
&lt;br /&gt;
=== Numeric for ===&lt;br /&gt;
Arrays in Lua are one-based (in indices are not specified, the first one is 1, not 0).&lt;br /&gt;
 local arr = {2,3,7,5}&lt;br /&gt;
 for i=1,#arr do logf(&amp;quot;%d&amp;quot;,arr[i]) end&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;b&amp;gt;for&amp;lt;/b&amp;gt; initVar,limit,increment &amp;lt;b&amp;gt;do&amp;lt;/b&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;i&amp;gt;number assignment&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;initVar&amp;lt;/code&amp;gt; inits loop-local variable&lt;br /&gt;
* &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; loops until initVar reaches this value&lt;br /&gt;
* &amp;lt;i&amp;gt;optional number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;increment&amp;lt;/code&amp;gt; after each loop initVar increment by this value (default 1)&lt;br /&gt;
&lt;br /&gt;
=== Generic for ===&lt;br /&gt;
Is rather sophisticated. Most common example (the order of elements in &amp;lt;code&amp;gt;pairs()&amp;lt;/code&amp;gt; is not guaranteed):&lt;br /&gt;
 local tab = {one=1, two=2, three=3}&lt;br /&gt;
 for key,val in pairs(tab) do logf(&amp;quot;%s:%d&amp;quot;,key,val) end&lt;br /&gt;
Generic for syntax&lt;br /&gt;
 &amp;lt;b&amp;gt;for&amp;lt;/b&amp;gt; var_1, ..., var_n &amp;lt;b&amp;gt;in&amp;lt;/b&amp;gt; explist &amp;lt;b&amp;gt;do&amp;lt;/b&amp;gt; block end&lt;br /&gt;
is equivalent to (Full explanation [https://www.lua.org/pil/7.2.html here].)&lt;br /&gt;
 do&lt;br /&gt;
   local _f, _s, _var = explist&lt;br /&gt;
   while true do&lt;br /&gt;
     local var_1, ... , var_n = _f(_s, _var)&lt;br /&gt;
     _var = var_1&lt;br /&gt;
     if _var == nil then break end&lt;br /&gt;
     block&lt;br /&gt;
   end&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
Iterator closure that holds its state&lt;br /&gt;
 function iter(a)&lt;br /&gt;
   local i = 0&lt;br /&gt;
   return function()&lt;br /&gt;
     i = i+1&lt;br /&gt;
     return a[i]&lt;br /&gt;
   end&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 local arr = {2,3,7,5}&lt;br /&gt;
 for value in iter(arr) do&lt;br /&gt;
   logf(&amp;quot;%d&amp;quot;,value)&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
Stateless iterator (in this case returns variable list: key and value)&lt;br /&gt;
 function iter(a,i)&lt;br /&gt;
   i = i+1&lt;br /&gt;
   if a[i] then return i,a[i] end&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 local arr = {2,3,7,5}&lt;br /&gt;
 for k,v in iter,arr,0 do&lt;br /&gt;
   logf(&amp;quot;%d:%d&amp;quot;,k,v)&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
Same effect using &amp;lt;code&amp;gt;ipairs()&amp;lt;/code&amp;gt; Lua function (without initial state)&lt;br /&gt;
 for k,v in ipairs(arr) do&lt;br /&gt;
   logf(&amp;quot;%d:%d&amp;quot;,k,v)&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
Now return to the most common example above using &amp;lt;code&amp;gt;pairs()&amp;lt;/code&amp;gt; Lua function and read about &amp;lt;code&amp;gt;pairs()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ipairs()&amp;lt;/code&amp;gt; implementation [https://www.lua.org/pil/7.3.html here].&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
&lt;br /&gt;
Lua allows multiple results (comma separated):&lt;br /&gt;
&lt;br /&gt;
 function diskSpace()&lt;br /&gt;
   return devices.system.freeSpace, devices.system.totalSpace&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 logf(&amp;quot;Free space: %d MB&amp;quot;, diskSpace()) -- only first return value is used&lt;br /&gt;
 local free,total = diskSpace() -- values are stored into LHS var-list&lt;br /&gt;
 logf(&amp;quot;Free space: %d %%&amp;quot;, 100*free/total)&lt;br /&gt;
&lt;br /&gt;
Variable-length arguments are also available:&lt;br /&gt;
&lt;br /&gt;
 function sum(...)&lt;br /&gt;
   local result = 0&lt;br /&gt;
   for _,v in ipairs(arg) do&lt;br /&gt;
     result = result + v&lt;br /&gt;
   end&lt;br /&gt;
   return result&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 logf(&amp;quot;Sum: %d&amp;quot;, sum(2,3,5))&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=DO_state_changed&amp;diff=440</id>
		<title>DO state changed</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=DO_state_changed&amp;diff=440"/>
		<updated>2019-07-11T15:29:02Z</updated>

		<summary type="html">&lt;p&gt;Phrych: Created page with &amp;quot;{{DISPLAYTITLE:Script trigger DO state changed}} Triggered when output state is changed. Arguments are stored in table &amp;lt;code&amp;gt;event.args&amp;lt;/code&amp;gt;  === Arguments === * &amp;lt;code&amp;gt;outpu...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Script trigger DO state changed}}&lt;br /&gt;
Triggered when output state is changed. Arguments are stored in table &amp;lt;code&amp;gt;event.args&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
* &amp;lt;code&amp;gt;outputX_state&amp;lt;/code&amp;gt; current state of changed output (on/off)&lt;br /&gt;
&lt;br /&gt;
=== Print arguments ===&lt;br /&gt;
 -- print all arguments&lt;br /&gt;
 for i, v in pairs(event.args) do&lt;br /&gt;
   logf(&amp;quot;%s: %s&amp;quot;,tostring(i),tostring(v))&lt;br /&gt;
 end&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Mqtt_has_connected_to_the_broker&amp;diff=439</id>
		<title>Mqtt has connected to the broker</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Mqtt_has_connected_to_the_broker&amp;diff=439"/>
		<updated>2019-07-11T15:27:25Z</updated>

		<summary type="html">&lt;p&gt;Phrych: Created page with &amp;quot;{{DISPLAYTITLE:Script trigger Mqtt has connected to the broker}} Triggered when NETIO connects to the MQTT broker. Arguments are stored in table &amp;lt;code&amp;gt;event.args&amp;lt;/code&amp;gt;  === A...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Script trigger Mqtt has connected to the broker}}&lt;br /&gt;
Triggered when NETIO connects to the MQTT broker. Arguments are stored in table &amp;lt;code&amp;gt;event.args&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
* &amp;lt;code&amp;gt;mqttConnected&amp;lt;/code&amp;gt; always 1&lt;br /&gt;
&lt;br /&gt;
=== Print arguments ===&lt;br /&gt;
 -- print all arguments&lt;br /&gt;
 for i, v in pairs(event.args) do&lt;br /&gt;
   logf(&amp;quot;%s: %s&amp;quot;,tostring(i),tostring(v))&lt;br /&gt;
 end&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=System_variables_updated&amp;diff=438</id>
		<title>System variables updated</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=System_variables_updated&amp;diff=438"/>
		<updated>2019-07-11T15:25:08Z</updated>

		<summary type="html">&lt;p&gt;Phrych: Created page with &amp;quot;{{DISPLAYTITLE:Script trigger System variables updated}} Triggered when system variables are updated (approximately every 10 seconds). Arguments are stored in table &amp;lt;code&amp;gt;even...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Script trigger System variables updated}}&lt;br /&gt;
Triggered when system variables are updated (approximately every 10 seconds). Arguments are stored in table &amp;lt;code&amp;gt;event.args&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
* &amp;lt;code&amp;gt;freeSpace&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;swapTotal&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;outgoingTraffic&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;cpuLoad&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;incomingTraffic&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;cpuIoWait&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;totalSpace&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;averageLoad&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sessionCount&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Print arguments ===&lt;br /&gt;
 -- print all arguments&lt;br /&gt;
 for i, v in pairs(event.args) do&lt;br /&gt;
   logf(&amp;quot;%s: %s&amp;quot;,tostring(i),tostring(v))&lt;br /&gt;
 end&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Mqtt_received_message_on_subscribed_topic&amp;diff=437</id>
		<title>Mqtt received message on subscribed topic</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Mqtt_received_message_on_subscribed_topic&amp;diff=437"/>
		<updated>2019-07-11T15:22:40Z</updated>

		<summary type="html">&lt;p&gt;Phrych: Created page with &amp;quot;{{DISPLAYTITLE:Script trigger Mqtt received message on subscribed topic}} Triggered when message is published on subscribed topic. Arguments are stored in table &amp;lt;code&amp;gt;event.ar...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Script trigger Mqtt received message on subscribed topic}}&lt;br /&gt;
Triggered when message is published on subscribed topic. Arguments are stored in table &amp;lt;code&amp;gt;event.args&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
* &amp;lt;code&amp;gt;payload&amp;lt;/code&amp;gt; published message&lt;br /&gt;
* &amp;lt;code&amp;gt;topic&amp;lt;/code&amp;gt; topic name&lt;br /&gt;
&lt;br /&gt;
=== Print arguments ===&lt;br /&gt;
 -- print all arguments&lt;br /&gt;
 for i, v in pairs(event.args) do&lt;br /&gt;
   logf(&amp;quot;%s: %s&amp;quot;,tostring(i),tostring(v))&lt;br /&gt;
 end&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=System_started_up&amp;diff=436</id>
		<title>System started up</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=System_started_up&amp;diff=436"/>
		<updated>2019-07-11T15:21:01Z</updated>

		<summary type="html">&lt;p&gt;Phrych: Created page with &amp;quot;{{DISPLAYTITLE:Script trigger System started up}} Triggered when NETIO starts. This trigger has no arguments.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Script trigger System started up}}&lt;br /&gt;
Triggered when NETIO starts. This trigger has no arguments.&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Incoming_URL_API_request&amp;diff=435</id>
		<title>Incoming URL API request</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Incoming_URL_API_request&amp;diff=435"/>
		<updated>2019-07-11T15:19:01Z</updated>

		<summary type="html">&lt;p&gt;Phrych: Created page with &amp;quot;{{DISPLAYTITLE:Script trigger Incoming URL API request}} Trigged when NETIO recieves URL API request. Arguments are given in url. Arguments are stored in table &amp;lt;code&amp;gt;event.arg...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Script trigger Incoming URL API request}}&lt;br /&gt;
Trigged when NETIO recieves URL API request. Arguments are given in url. Arguments are stored in table &amp;lt;code&amp;gt;event.args&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
URL: http://192.168.101.139/event?arg1=25&amp;amp;arg2=hello&lt;br /&gt;
&lt;br /&gt;
Argument 1: &lt;br /&gt;
*key: arg1&lt;br /&gt;
*value: 25&lt;br /&gt;
&lt;br /&gt;
Argument 2:&lt;br /&gt;
*key: arg2&lt;br /&gt;
*value: hello&lt;br /&gt;
&lt;br /&gt;
=== Print arguments ===&lt;br /&gt;
 -- print all arguments&lt;br /&gt;
 for i, v in pairs(event.args) do&lt;br /&gt;
   logf(&amp;quot;%s: %s&amp;quot;,tostring(i),tostring(v))&lt;br /&gt;
 end&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Schedule_has_started_or_stopped&amp;diff=434</id>
		<title>Schedule has started or stopped</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Schedule_has_started_or_stopped&amp;diff=434"/>
		<updated>2019-07-11T15:12:39Z</updated>

		<summary type="html">&lt;p&gt;Phrych: Created page with &amp;quot;{{DISPLAYTITLE:Script trigger Schedule has started or stopped}} Triggered when selected schedule starts. Arguments are stored in table &amp;lt;code&amp;gt;event.args&amp;lt;/code&amp;gt;  === Arguments =...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Script trigger Schedule has started or stopped}}&lt;br /&gt;
Triggered when selected schedule starts. Arguments are stored in table &amp;lt;code&amp;gt;event.args&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
* &amp;lt;code&amp;gt;scheduleActive&amp;lt;/code&amp;gt; true when schedule is active, false otherwise&lt;br /&gt;
* &amp;lt;code&amp;gt;scheduleId&amp;lt;/code&amp;gt; schedule ID&lt;br /&gt;
&lt;br /&gt;
=== Print arguments ===&lt;br /&gt;
 -- print all arguments&lt;br /&gt;
 for i, v in pairs(event.args) do&lt;br /&gt;
   logf(&amp;quot;%s: %s&amp;quot;,tostring(i),tostring(v))&lt;br /&gt;
 end&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Global_power_characteristics_changed&amp;diff=433</id>
		<title>Global power characteristics changed</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Global_power_characteristics_changed&amp;diff=433"/>
		<updated>2019-07-11T15:09:07Z</updated>

		<summary type="html">&lt;p&gt;Phrych: Created page with &amp;quot;{{DISPLAYTITLE:Script trigger Global power characteristics changed}} Triggered by change of global power characteristics (voltage, frequency). Arguments are stored in table &amp;lt;c...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Script trigger Global power characteristics changed}}&lt;br /&gt;
Triggered by change of global power characteristics (voltage, frequency). Arguments are stored in table &amp;lt;code&amp;gt;event.args&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
* &amp;lt;code&amp;gt;frequency&amp;lt;/code&amp;gt; NETIO frequency [Hz] * 1000&lt;br /&gt;
* &amp;lt;code&amp;gt;voltage&amp;lt;/code&amp;gt; NETIO voltage [V] * 1000&lt;br /&gt;
&lt;br /&gt;
=== Print arguments ===&lt;br /&gt;
 -- print all arguments&lt;br /&gt;
 for i, v in pairs(event.args) do&lt;br /&gt;
   logf(&amp;quot;%s: %s&amp;quot;,tostring(i),tostring(v))&lt;br /&gt;
 end&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Power_measurements_changed&amp;diff=432</id>
		<title>Power measurements changed</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Power_measurements_changed&amp;diff=432"/>
		<updated>2019-07-11T14:49:10Z</updated>

		<summary type="html">&lt;p&gt;Phrych: Created page with &amp;quot;{{DISPLAYTITLE:Script trigger Power measurements changed}} Triggered by any change of measured variable on any output. Values in arguments are only for changed output. Argumen...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Script trigger Power measurements changed}}&lt;br /&gt;
Triggered by any change of measured variable on any output. Values in arguments are only for changed output. Arguments are stored in table &amp;lt;code&amp;gt;event.args&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
* &amp;lt;code&amp;gt;outputX_powerFactor&amp;lt;/code&amp;gt; output power factor [-] * 100&lt;br /&gt;
* &amp;lt;code&amp;gt;totalLoad&amp;lt;/code&amp;gt; NETIO load [W]&lt;br /&gt;
* &amp;lt;code&amp;gt;outputX_cumulatedConsumption&amp;lt;/code&amp;gt; cumulated consumption of output [Wh]&lt;br /&gt;
* &amp;lt;code&amp;gt;outputX_consumption&amp;lt;/code&amp;gt; output load [W]&lt;br /&gt;
* &amp;lt;code&amp;gt;overallPowerFactor&amp;lt;/code&amp;gt; NETIO power factor [-] * 100&lt;br /&gt;
* &amp;lt;code&amp;gt;outputX_current&amp;lt;/code&amp;gt; current in output [mA]&lt;br /&gt;
* &amp;lt;code&amp;gt;totalEnergy&amp;lt;/code&amp;gt; total energy consumed by NETIO [Wh]&lt;br /&gt;
* &amp;lt;code&amp;gt;totalCurrent&amp;lt;/code&amp;gt; current in NETIO [mA]&lt;br /&gt;
&lt;br /&gt;
=== Print arguments ===&lt;br /&gt;
 -- print all arguments&lt;br /&gt;
 for i, v in pairs(event.args) do&lt;br /&gt;
   logf(&amp;quot;%s: %s&amp;quot;,tostring(i),tostring(v))&lt;br /&gt;
 end&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=NETIO_Lua_Reference&amp;diff=431</id>
		<title>NETIO Lua Reference</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=NETIO_Lua_Reference&amp;diff=431"/>
		<updated>2019-07-11T14:20:11Z</updated>

		<summary type="html">&lt;p&gt;Phrych: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Script triggers == &lt;br /&gt;
* [[Power measurements changed|Power measurements changed]]&lt;br /&gt;
* [[Global power characteristics changed|Global power characteristics changed]]&lt;br /&gt;
* [[Schedule has started or stopped|Schedule has started or stopped]]&lt;br /&gt;
* [[Incoming URL API request|Incoming URL API request]]&lt;br /&gt;
* [[System started up|System started up]]&lt;br /&gt;
* [[Mqtt was disconnected from the broker|Mqtt was disconnected from the broker]]&lt;br /&gt;
* [[Mqtt received message on subscribed topic|Mqtt received message on subscribed topic]]&lt;br /&gt;
* [[System variables updated|System variables updated]]&lt;br /&gt;
* [[Mqtt has connected to the broker|Mqtt has connected to the broker]]&lt;br /&gt;
* [[DO state changed|DO state changed]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Outlet Management ==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt; devices.system &amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
* function [[Function devices.system.SetOut()|.SetOut()]] - turns the outlet on or off&lt;br /&gt;
* function [[Function devices.system.ResetOut()|.ResetOut()]] - turns the outlet off and then resets its previous state&lt;br /&gt;
* string [[String devices.system.output1_state|.output1_state]] - outlet's state&lt;br /&gt;
* number [[Number devices.system.output1_consumption|.output1_consumption]] - outlet's consumption (in Watts)&lt;br /&gt;
* number [[Number devices.system.output1_cumulatedConsumption|.output1_cumulatedConsumption]] - outlet's consumed energy (in Watthours)&lt;br /&gt;
* function [[Function devices.system.resetCumulativeConsumption()|.resetCumulativeConsumption()]] - resets outlet's energy counter&lt;br /&gt;
* string [[String devices.system.output1_consumptionStart|.output1_consumptionStart]] - date and time since the last energy counter reset&lt;br /&gt;
&lt;br /&gt;
== Socket System Management ==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt; devices.system&amp;lt;/b&amp;gt; &amp;lt;/big&amp;gt;&lt;br /&gt;
* number [[number devices.system.averageLoad|.averageLoad]] - socket's CPU load&lt;br /&gt;
* function [[Function devices.system.Reboot()|.Reboot()]] - reboot socket's system&lt;br /&gt;
* number [[Number devices.system.sessionCount|.sessionCount]] - number of connected users&lt;br /&gt;
* number [[Number devices.system.freeSpace|.freeSpace]] - free disk space&lt;br /&gt;
* number [[Number devices.system.totalSpace|.totalSpace]] - total disk space&lt;br /&gt;
* string [[String devices.system.serialNumber|.serialNumber]] &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;3.3.1&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; - returns serial number of the device (Eth Interface MAC address)&lt;br /&gt;
* number [[Number devices.system.voltage|.voltage]] - socket's voltage&lt;br /&gt;
* number [[Number devices.system.overallPowerFactor|.overallPowerFactor]] - overall power factor&lt;br /&gt;
* number [[Number devices.system.frequency|.frequency]] - socket's frequency&lt;br /&gt;
* number [[Number devices.system.totalCurrent|.totalCurrent]] - total current through socket&lt;br /&gt;
* number [[Number devices.system.totalLoad|.totalLoad]] - total load on socket&lt;br /&gt;
* number [[Number devices.system.totalEnergy|.totalEnergy]] - total energy consumed by socket&lt;br /&gt;
* string [[Number devices.system.energyStart|.energyStart]] - time of last consumption reset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Socket Communication ==&lt;br /&gt;
* function [[Function ping()|ping()]] - tests socket's network responsivity&lt;br /&gt;
* function [[Function mail()|mail()]] - sends e-mail&lt;br /&gt;
* function [[Function devices.system.CustomCGI()|devices.system.CustomCGI()]] - send HTTP request&lt;br /&gt;
* function [[Function cgiGet()|cgiGet()]] &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;2.3.5&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; - send HTTP request and receive response&lt;br /&gt;
* table [[Table event.args|event.args]] - HTTP GET /event variables table&lt;br /&gt;
* function [[Function snmpGet()|snmpGet()]] &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;3.3.1&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; - send SNMP request&lt;br /&gt;
&lt;br /&gt;
== XML Processing &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;2.3.6&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; ==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;xml&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
* function [[Function xml.escape()|.escape()]] - escapes XML string to fit xml node contents&lt;br /&gt;
* function [[Function xml.check()|.check()]] - tests if string is well-formed XML&lt;br /&gt;
* function [[Function xml.parse()|.parse()]] - parses XML string into [[Function xml.parse()#XmlElement|XmlElement]] object&lt;br /&gt;
&lt;br /&gt;
== JSON Processing &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;3.3.1&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; ==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;json&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt; &lt;br /&gt;
* function [[Function json.decode()|.decode()]] - parse json string into obj table&lt;br /&gt;
* function [[Function json.encode()|.encode()]] - generate JSON string from table&lt;br /&gt;
&lt;br /&gt;
(based on [http://dkolf.de/src/dkjson-lua.fsl/home dkjson])&lt;br /&gt;
&lt;br /&gt;
== Modbus &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;3.3.1&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt;==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Read functions&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt; &lt;br /&gt;
* function [[Function modbusReadCoil()|modbusReadCoil()]] - read value from coil&lt;br /&gt;
* function [[Function modbusReadDiscreteInput()|modbusReadDiscreteInput()]] - read value from discrete input&lt;br /&gt;
* function [[Function modbusReadHoldingRegister()|modbusReadHoldingRegister()]] - read value from holding register&lt;br /&gt;
* function [[Function modbusReadInputRegister()|modbusReadInputRegister()]] - read value from input register&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Write functions&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt; &lt;br /&gt;
* function [[Function modbusWriteSingleCoil()|modbusWriteSingleCoil()]] - write value to single coil&lt;br /&gt;
* function [[Function modbusWriteSingleRegister()|modbusWriteSingleRegister()]] - write value to single register&lt;br /&gt;
&lt;br /&gt;
== MQTT &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;3.3.1&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt;==&lt;br /&gt;
* function [[Function devices.system.MqttLuaSubscribe()|.MqttLuaSubscribe()]] - subscribe to MQTT topic&lt;br /&gt;
* function [[Function devices.system.MqttPublish()|.MqttPublish()]] - send message to MQTT topic&lt;br /&gt;
&lt;br /&gt;
== Standard Lua Functions ==&lt;br /&gt;
* function [https://www.lua.org/pil/8.3.html assert(), error()] issues an error&lt;br /&gt;
* function [https://www.lua.org/pil/7.3.html ipairs(), pairs(), next()] traverse tables&lt;br /&gt;
* function [https://www.lua.org/pil/2.4.html tonumber(), tostring()] data type conversion&lt;br /&gt;
* function [https://www.lua.org/pil/8.4.html pcall()] protected call function (handles error inside the function)&lt;br /&gt;
* function [https://www.lua.org/pil/5.2.html select()] selects from multiple return value&lt;br /&gt;
* function [https://www.lua.org/pil/2.html unpack] converts table into multiple values&lt;br /&gt;
* function [https://www.lua.org/pil/2.html type()] returns variable type&lt;br /&gt;
* function [https://www.lua.org/pil/22.1.html os.date(), os.time()] system date and time&lt;br /&gt;
* function os.difftime() returns time span between two times&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous ==&lt;br /&gt;
* function [[Function log()|log()]] - insert a record to the socket's event log&lt;br /&gt;
* function [[Function logf()|logf()]] - insert a formated record (incl. numbers) to the socket's event log&lt;br /&gt;
* function [[Function delay()|delay()]] - execute function with delay (seconds)&lt;br /&gt;
* function [[Function milliDelay()|milliDelay()]] - execute function with delay (milliseconds)&lt;br /&gt;
* function [[Function toboolean()|toboolean()]] - converts any variable to boolean type&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Function_devices.system.MqttPublish()&amp;diff=430</id>
		<title>Function devices.system.MqttPublish()</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Function_devices.system.MqttPublish()&amp;diff=430"/>
		<updated>2019-07-11T12:50:37Z</updated>

		<summary type="html">&lt;p&gt;Phrych: Created page with &amp;quot;{{DISPLAYTITLE:function devices.system.MqttPublish()}} Publish a message to MQTT topic   &amp;lt;i&amp;gt;nil&amp;lt;/i&amp;gt; &amp;lt;b&amp;gt;devices.system.MqttPublish&amp;lt;/b&amp;gt;(&amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt;)  === Pa...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:function devices.system.MqttPublish()}}&lt;br /&gt;
Publish a message to MQTT topic&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;i&amp;gt;nil&amp;lt;/i&amp;gt; &amp;lt;b&amp;gt;devices.system.MqttPublish&amp;lt;/b&amp;gt;(&amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
 &amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; config{&amp;lt;code&amp;gt;topic&amp;lt;/code&amp;gt;}&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;topic&amp;lt;/code&amp;gt; name of topic&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;payload&amp;lt;/code&amp;gt; message to be sent&lt;br /&gt;
&lt;br /&gt;
=== Return value ===&lt;br /&gt;
 nil&lt;br /&gt;
&lt;br /&gt;
=== Usage ===&lt;br /&gt;
 -- send information about first output on topic luaHole&lt;br /&gt;
 local topic = &amp;quot;luaHole&amp;quot;&lt;br /&gt;
 local message = devices.system[&amp;quot;output&amp;quot; .. 1 .. &amp;quot;_state&amp;quot;]&lt;br /&gt;
 devices.system.MqttPublish{topic=topic,payload=string.format(message)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
Netio FirmWare 3.3.1+&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Function_devices.system.MqttLuaSubscribe()&amp;diff=429</id>
		<title>Function devices.system.MqttLuaSubscribe()</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Function_devices.system.MqttLuaSubscribe()&amp;diff=429"/>
		<updated>2019-07-11T12:45:24Z</updated>

		<summary type="html">&lt;p&gt;Phrych: Created page with &amp;quot;{{DISPLAYTITLE:function devices.system.MqttLuaSubscribe()}} Function for subscribing to certain MQTT topic.   &amp;lt;i&amp;gt;nil&amp;lt;/i&amp;gt; &amp;lt;b&amp;gt;devices.system.MqttLuaSubscribe&amp;lt;/b&amp;gt;(&amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; &amp;lt;c...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:function devices.system.MqttLuaSubscribe()}}&lt;br /&gt;
Function for subscribing to certain MQTT topic.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;i&amp;gt;nil&amp;lt;/i&amp;gt; &amp;lt;b&amp;gt;devices.system.MqttLuaSubscribe&amp;lt;/b&amp;gt;(&amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
 &amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; config{&amp;lt;code&amp;gt;topic&amp;lt;/code&amp;gt;}&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;topic&amp;lt;/code&amp;gt; name of subscribed topic&lt;br /&gt;
&lt;br /&gt;
=== Return value ===&lt;br /&gt;
 nil&lt;br /&gt;
&lt;br /&gt;
=== Usage ===&lt;br /&gt;
 -- Subscribe to topic luaHole&lt;br /&gt;
 devices.system.MqttLuaSubscribe{topic=&amp;quot;luaHole&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
Netio FirmWare 3.3.1+&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=NETIO_Lua_Reference&amp;diff=428</id>
		<title>NETIO Lua Reference</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=NETIO_Lua_Reference&amp;diff=428"/>
		<updated>2019-07-11T12:33:13Z</updated>

		<summary type="html">&lt;p&gt;Phrych: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Outlet Management ==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt; devices.system &amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
* function [[Function devices.system.SetOut()|.SetOut()]] - turns the outlet on or off&lt;br /&gt;
* function [[Function devices.system.ResetOut()|.ResetOut()]] - turns the outlet off and then resets its previous state&lt;br /&gt;
* string [[String devices.system.output1_state|.output1_state]] - outlet's state&lt;br /&gt;
* number [[Number devices.system.output1_consumption|.output1_consumption]] - outlet's consumption (in Watts)&lt;br /&gt;
* number [[Number devices.system.output1_cumulatedConsumption|.output1_cumulatedConsumption]] - outlet's consumed energy (in Watthours)&lt;br /&gt;
* function [[Function devices.system.resetCumulativeConsumption()|.resetCumulativeConsumption()]] - resets outlet's energy counter&lt;br /&gt;
* string [[String devices.system.output1_consumptionStart|.output1_consumptionStart]] - date and time since the last energy counter reset&lt;br /&gt;
&lt;br /&gt;
== Socket System Management ==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt; devices.system&amp;lt;/b&amp;gt; &amp;lt;/big&amp;gt;&lt;br /&gt;
* number [[number devices.system.averageLoad|.averageLoad]] - socket's CPU load&lt;br /&gt;
* function [[Function devices.system.Reboot()|.Reboot()]] - reboot socket's system&lt;br /&gt;
* number [[Number devices.system.sessionCount|.sessionCount]] - number of connected users&lt;br /&gt;
* number [[Number devices.system.freeSpace|.freeSpace]] - free disk space&lt;br /&gt;
* number [[Number devices.system.totalSpace|.totalSpace]] - total disk space&lt;br /&gt;
* string [[String devices.system.serialNumber|.serialNumber]] &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;3.3.1&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; - returns serial number of the device (Eth Interface MAC address)&lt;br /&gt;
* number [[Number devices.system.voltage|.voltage]] - socket's voltage&lt;br /&gt;
* number [[Number devices.system.overallPowerFactor|.overallPowerFactor]] - overall power factor&lt;br /&gt;
* number [[Number devices.system.frequency|.frequency]] - socket's frequency&lt;br /&gt;
* number [[Number devices.system.totalCurrent|.totalCurrent]] - total current through socket&lt;br /&gt;
* number [[Number devices.system.totalLoad|.totalLoad]] - total load on socket&lt;br /&gt;
* number [[Number devices.system.totalEnergy|.totalEnergy]] - total energy consumed by socket&lt;br /&gt;
* string [[Number devices.system.energyStart|.energyStart]] - time of last consumption reset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Socket Communication ==&lt;br /&gt;
* function [[Function ping()|ping()]] - tests socket's network responsivity&lt;br /&gt;
* function [[Function mail()|mail()]] - sends e-mail&lt;br /&gt;
* function [[Function devices.system.CustomCGI()|devices.system.CustomCGI()]] - send HTTP request&lt;br /&gt;
* function [[Function cgiGet()|cgiGet()]] &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;2.3.5&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; - send HTTP request and receive response&lt;br /&gt;
* table [[Table event.args|event.args]] - HTTP GET /event variables table&lt;br /&gt;
* function [[Function snmpGet()|snmpGet()]] &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;3.3.1&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; - send SNMP request&lt;br /&gt;
&lt;br /&gt;
== XML Processing &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;2.3.6&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; ==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;xml&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
* function [[Function xml.escape()|.escape()]] - escapes XML string to fit xml node contents&lt;br /&gt;
* function [[Function xml.check()|.check()]] - tests if string is well-formed XML&lt;br /&gt;
* function [[Function xml.parse()|.parse()]] - parses XML string into [[Function xml.parse()#XmlElement|XmlElement]] object&lt;br /&gt;
&lt;br /&gt;
== JSON Processing &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;3.3.1&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; ==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;json&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt; &lt;br /&gt;
* function [[Function json.decode()|.decode()]] - parse json string into obj table&lt;br /&gt;
* function [[Function json.encode()|.encode()]] - generate JSON string from table&lt;br /&gt;
&lt;br /&gt;
(based on [http://dkolf.de/src/dkjson-lua.fsl/home dkjson])&lt;br /&gt;
&lt;br /&gt;
== Modbus &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;3.3.1&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt;==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Read functions&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt; &lt;br /&gt;
* function [[Function modbusReadCoil()|modbusReadCoil()]] - read value from coil&lt;br /&gt;
* function [[Function modbusReadDiscreteInput()|modbusReadDiscreteInput()]] - read value from discrete input&lt;br /&gt;
* function [[Function modbusReadHoldingRegister()|modbusReadHoldingRegister()]] - read value from holding register&lt;br /&gt;
* function [[Function modbusReadInputRegister()|modbusReadInputRegister()]] - read value from input register&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Write functions&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt; &lt;br /&gt;
* function [[Function modbusWriteSingleCoil()|modbusWriteSingleCoil()]] - write value to single coil&lt;br /&gt;
* function [[Function modbusWriteSingleRegister()|modbusWriteSingleRegister()]] - write value to single register&lt;br /&gt;
&lt;br /&gt;
== MQTT &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;3.3.1&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt;==&lt;br /&gt;
* function [[Function devices.system.MqttLuaSubscribe()|.MqttLuaSubscribe()]] - subscribe to MQTT topic&lt;br /&gt;
* function [[Function devices.system.MqttPublish()|.MqttPublish()]] - send message to MQTT topic&lt;br /&gt;
&lt;br /&gt;
== Standard Lua Functions ==&lt;br /&gt;
* function [https://www.lua.org/pil/8.3.html assert(), error()] issues an error&lt;br /&gt;
* function [https://www.lua.org/pil/7.3.html ipairs(), pairs(), next()] traverse tables&lt;br /&gt;
* function [https://www.lua.org/pil/2.4.html tonumber(), tostring()] data type conversion&lt;br /&gt;
* function [https://www.lua.org/pil/8.4.html pcall()] protected call function (handles error inside the function)&lt;br /&gt;
* function [https://www.lua.org/pil/5.2.html select()] selects from multiple return value&lt;br /&gt;
* function [https://www.lua.org/pil/2.html unpack] converts table into multiple values&lt;br /&gt;
* function [https://www.lua.org/pil/2.html type()] returns variable type&lt;br /&gt;
* function [https://www.lua.org/pil/22.1.html os.date(), os.time()] system date and time&lt;br /&gt;
* function os.difftime() returns time span between two times&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous ==&lt;br /&gt;
* function [[Function log()|log()]] - insert a record to the socket's event log&lt;br /&gt;
* function [[Function logf()|logf()]] - insert a formated record (incl. numbers) to the socket's event log&lt;br /&gt;
* function [[Function delay()|delay()]] - execute function with delay (seconds)&lt;br /&gt;
* function [[Function milliDelay()|milliDelay()]] - execute function with delay (milliseconds)&lt;br /&gt;
* function [[Function toboolean()|toboolean()]] - converts any variable to boolean type&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=NETIO_Lua_Reference&amp;diff=427</id>
		<title>NETIO Lua Reference</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=NETIO_Lua_Reference&amp;diff=427"/>
		<updated>2019-07-11T12:31:32Z</updated>

		<summary type="html">&lt;p&gt;Phrych: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Outlet Management ==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt; devices.system &amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
* function [[Function devices.system.SetOut()|.SetOut()]] - turns the outlet on or off&lt;br /&gt;
* function [[Function devices.system.ResetOut()|.ResetOut()]] - turns the outlet off and then resets its previous state&lt;br /&gt;
* string [[String devices.system.output1_state|.output1_state]] - outlet's state&lt;br /&gt;
* number [[Number devices.system.output1_consumption|.output1_consumption]] - outlet's consumption (in Watts)&lt;br /&gt;
* number [[Number devices.system.output1_cumulatedConsumption|.output1_cumulatedConsumption]] - outlet's consumed energy (in Watthours)&lt;br /&gt;
* function [[Function devices.system.resetCumulativeConsumption()|.resetCumulativeConsumption()]] - resets outlet's energy counter&lt;br /&gt;
* string [[String devices.system.output1_consumptionStart|.output1_consumptionStart]] - date and time since the last energy counter reset&lt;br /&gt;
&lt;br /&gt;
== Socket System Management ==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt; devices.system&amp;lt;/b&amp;gt; &amp;lt;/big&amp;gt;&lt;br /&gt;
* number [[number devices.system.averageLoad|.averageLoad]] - socket's CPU load&lt;br /&gt;
* function [[Function devices.system.Reboot()|.Reboot()]] - reboot socket's system&lt;br /&gt;
* number [[Number devices.system.sessionCount|.sessionCount]] - number of connected users&lt;br /&gt;
* number [[Number devices.system.freeSpace|.freeSpace]] - free disk space&lt;br /&gt;
* number [[Number devices.system.totalSpace|.totalSpace]] - total disk space&lt;br /&gt;
* string [[String devices.system.serialNumber|.serialNumber]] &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;3.3.1&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; - returns serial number of the device (Eth Interface MAC address)&lt;br /&gt;
* number [[Number devices.system.voltage|.voltage]] - socket's voltage&lt;br /&gt;
* number [[Number devices.system.overallPowerFactor|.overallPowerFactor]] - overall power factor&lt;br /&gt;
* number [[Number devices.system.frequency|.frequency]] - socket's frequency&lt;br /&gt;
* number [[Number devices.system.totalCurrent|.totalCurrent]] - total current through socket&lt;br /&gt;
* number [[Number devices.system.totalLoad|.totalLoad]] - total load on socket&lt;br /&gt;
* number [[Number devices.system.totalEnergy|.totalEnergy]] - total energy consumed by socket&lt;br /&gt;
* string [[Number devices.system.energyStart|.energyStart]] - time of last consumption reset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Socket Communication ==&lt;br /&gt;
* function [[Function ping()|ping()]] - tests socket's network responsivity&lt;br /&gt;
* function [[Function mail()|mail()]] - sends e-mail&lt;br /&gt;
* function [[Function devices.system.CustomCGI()|devices.system.CustomCGI()]] - send HTTP request&lt;br /&gt;
* function [[Function cgiGet()|cgiGet()]] &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;2.3.5&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; - send HTTP request and receive response&lt;br /&gt;
* table [[Table event.args|event.args]] - HTTP GET /event variables table&lt;br /&gt;
* function [[Function snmpGet()|snmpGet()]] &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;3.3.1&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; - send SNMP request&lt;br /&gt;
&lt;br /&gt;
== XML Processing &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;2.3.6&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; ==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;xml&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
* function [[Function xml.escape()|.escape()]] - escapes XML string to fit xml node contents&lt;br /&gt;
* function [[Function xml.check()|.check()]] - tests if string is well-formed XML&lt;br /&gt;
* function [[Function xml.parse()|.parse()]] - parses XML string into [[Function xml.parse()#XmlElement|XmlElement]] object&lt;br /&gt;
&lt;br /&gt;
== JSON Processing &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;3.3.1&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; ==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;json&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt; &lt;br /&gt;
* function [[Function json.decode()|.decode()]] - parse json string into obj table&lt;br /&gt;
* function [[Function json.encode()|.encode()]] - generate JSON string from table&lt;br /&gt;
&lt;br /&gt;
(based on [http://dkolf.de/src/dkjson-lua.fsl/home dkjson])&lt;br /&gt;
&lt;br /&gt;
== Modbus &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;3.3.1&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt;==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Read functions&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt; &lt;br /&gt;
* function [[Function modbusReadCoil()|modbusReadCoil()]] - read value from coil&lt;br /&gt;
* function [[Function modbusReadDiscreteInput()|modbusReadDiscreteInput()]] - read value from discrete input&lt;br /&gt;
* function [[Function modbusReadHoldingRegister()|modbusReadHoldingRegister()]] - read value from holding register&lt;br /&gt;
* function [[Function modbusReadInputRegister()|modbusReadInputRegister()]] - read value from input register&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Write functions&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt; &lt;br /&gt;
* function [[Function devices.system.MqttLuaSubscribe()|.MqttLuaSubscribe()]] - subscribe to MQTT topic&lt;br /&gt;
* function [[Function devices.system.MqttPublish()|.MqttPublish()]] - send message to MQTT topic&lt;br /&gt;
&lt;br /&gt;
== MQTT &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;3.3.1&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt;==&lt;br /&gt;
* function [[Function devices.system.Reboot()|.Reboot()]] - reboot socket's system&lt;br /&gt;
* function [[Function devices.system.Reboot()|.Reboot()]] - reboot socket's system&lt;br /&gt;
&lt;br /&gt;
== Standard Lua Functions ==&lt;br /&gt;
* function [https://www.lua.org/pil/8.3.html assert(), error()] issues an error&lt;br /&gt;
* function [https://www.lua.org/pil/7.3.html ipairs(), pairs(), next()] traverse tables&lt;br /&gt;
* function [https://www.lua.org/pil/2.4.html tonumber(), tostring()] data type conversion&lt;br /&gt;
* function [https://www.lua.org/pil/8.4.html pcall()] protected call function (handles error inside the function)&lt;br /&gt;
* function [https://www.lua.org/pil/5.2.html select()] selects from multiple return value&lt;br /&gt;
* function [https://www.lua.org/pil/2.html unpack] converts table into multiple values&lt;br /&gt;
* function [https://www.lua.org/pil/2.html type()] returns variable type&lt;br /&gt;
* function [https://www.lua.org/pil/22.1.html os.date(), os.time()] system date and time&lt;br /&gt;
* function os.difftime() returns time span between two times&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous ==&lt;br /&gt;
* function [[Function log()|log()]] - insert a record to the socket's event log&lt;br /&gt;
* function [[Function logf()|logf()]] - insert a formated record (incl. numbers) to the socket's event log&lt;br /&gt;
* function [[Function delay()|delay()]] - execute function with delay (seconds)&lt;br /&gt;
* function [[Function milliDelay()|milliDelay()]] - execute function with delay (milliseconds)&lt;br /&gt;
* function [[Function toboolean()|toboolean()]] - converts any variable to boolean type&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Function_cgiGet()&amp;diff=426</id>
		<title>Function cgiGet()</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Function_cgiGet()&amp;diff=426"/>
		<updated>2019-07-11T11:54:28Z</updated>

		<summary type="html">&lt;p&gt;Phrych: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:function cgiGet()}}&lt;br /&gt;
Execute HTTP GET call to given url and read the response. The call is asynchronous: the code execution proceeds immediately and when the response arrives, callback function is called. To perform simple HTTP GET call without response handling, use simpler [[Devices.system.CustomCGI()|devices.system.CustomCGI()]]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;i&amp;gt;nil&amp;lt;/i&amp;gt; &amp;lt;b&amp;gt;cgiGet&amp;lt;/b&amp;gt;(&amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
 &amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; config{&amp;lt;code&amp;gt;url&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;callback&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;color: #777&amp;quot;&amp;gt;timeout&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;color: #777&amp;quot;&amp;gt;bufferSize&amp;lt;/code&amp;gt;}&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;url&amp;lt;/code&amp;gt; address to call&lt;br /&gt;
* &amp;lt;i&amp;gt;function{response}&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;callback&amp;lt;/code&amp;gt; this function is called when response arrives&lt;br /&gt;
* optional &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;timeout&amp;lt;/code&amp;gt; maximum seconds to wait for response (default 30)&lt;br /&gt;
* optional &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;bufferSize&amp;lt;/code&amp;gt; bytes of memory to allocate for response (min. 4k, max 1M)&lt;br /&gt;
&lt;br /&gt;
=== Callback Parameters ===&lt;br /&gt;
 &amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; response{&amp;lt;code&amp;gt;result&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;errInfo&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;received&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;buffer&amp;lt;/code&amp;gt;}&lt;br /&gt;
* &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;result&amp;lt;/code&amp;gt; error code of the response (see below)&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;errInfo&amp;lt;/code&amp;gt; error description (if result&amp;gt;0)&lt;br /&gt;
* &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;received&amp;lt;/code&amp;gt; response length&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;buffer&amp;lt;/code&amp;gt; response body&lt;br /&gt;
&lt;br /&gt;
=== Error Code of the response ===&lt;br /&gt;
* 0 success, response HTTP/GET 2xx&lt;br /&gt;
* 22 response HTTP/GET 4xx&lt;br /&gt;
* 27 buffer overflow&lt;br /&gt;
* 28 response is timed out&lt;br /&gt;
&lt;br /&gt;
=== Return value ===&lt;br /&gt;
 nil&lt;br /&gt;
&lt;br /&gt;
=== Usage ===&lt;br /&gt;
 function logOurIp(o)&lt;br /&gt;
   if o.result == 0 then&lt;br /&gt;
      log(string.format(&amp;quot;our ip is %s&amp;quot;, string.match(o.buffer,&amp;quot;(%d+.%d+.%d+.%d+)&amp;quot;)))&lt;br /&gt;
   else&lt;br /&gt;
      log(string.format(&amp;quot;cgi to get our ip failed with error %d: %s&amp;quot;, o.result, o.errorInfo))&lt;br /&gt;
   end&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 -- send HTTP request and handle response&lt;br /&gt;
 cgiGet{url=&amp;quot;http://httpbin.org/ip&amp;quot;, timeout=2, callback=logOurIp}&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
Netio FirmWare 2.3.5+&lt;br /&gt;
&lt;br /&gt;
=== See also ===&lt;br /&gt;
* [[Devices.system.CustomCGI()|devices.system.CustomCGI()]] to send HTTP request without response handling&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Function_modbusWriteSingleRegister()&amp;diff=401</id>
		<title>Function modbusWriteSingleRegister()</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Function_modbusWriteSingleRegister()&amp;diff=401"/>
		<updated>2019-06-20T13:08:05Z</updated>

		<summary type="html">&lt;p&gt;Phrych: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:function modbusWriteSingleRegister()}}&lt;br /&gt;
Write value to single register using modbus protocol. The call is asynchronous: the code execution proceeds immediately and when the response arrives, callback function is called.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;i&amp;gt;nil&amp;lt;/i&amp;gt; &amp;lt;b&amp;gt;modbusWriteSingleRegister&amp;lt;/b&amp;gt;(&amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
 &amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; config{&amp;lt;code&amp;gt;deviceAddress&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;callback&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;color: #777&amp;quot;&amp;gt;port&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;color: #777&amp;quot;&amp;gt;timeout&amp;lt;/code&amp;gt;}&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;deviceAddress&amp;lt;/code&amp;gt; IP address of device&lt;br /&gt;
* &amp;lt;i&amp;gt;function{response}&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;callback&amp;lt;/code&amp;gt; this function is called when response arrives&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt; number of the register&lt;br /&gt;
* &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; the value to be written&lt;br /&gt;
* optional &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;port&amp;lt;/code&amp;gt; numer of port (default 502)&lt;br /&gt;
* optional &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;timeout&amp;lt;/code&amp;gt; maximum seconds to wait for response (default 30)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Callback Parameters ===&lt;br /&gt;
 &amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; response{&amp;lt;code&amp;gt;result&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;errInfo&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt;}&lt;br /&gt;
* &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;result&amp;lt;/code&amp;gt; error code of the response (0 is success)&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;errInfo&amp;lt;/code&amp;gt; error description (if result&amp;gt;0)&lt;br /&gt;
* &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt; number of the input register&lt;br /&gt;
&lt;br /&gt;
=== Return value ===&lt;br /&gt;
 nil&lt;br /&gt;
&lt;br /&gt;
=== Usage ===&lt;br /&gt;
 -- Switch state of all outputs on NETIO with IP 10.0.0.105 and port 505&lt;br /&gt;
 local function modbusWriteCallback(data)&lt;br /&gt;
   log(string.format(&amp;quot;addr %d, result %d&amp;quot;, data.address, data.result))&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 for i = 101,104 do&lt;br /&gt;
   modbusWriteSingleRegister{deviceAddress='10.0.0.105', port=505, timeout=6, address=i, value=4, callback=modbusWriteCallback}&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
Netio FirmWare 3.3.0+&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Function_modbusWriteSingleCoil()&amp;diff=400</id>
		<title>Function modbusWriteSingleCoil()</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Function_modbusWriteSingleCoil()&amp;diff=400"/>
		<updated>2019-06-20T13:07:30Z</updated>

		<summary type="html">&lt;p&gt;Phrych: Created page with &amp;quot;{{DISPLAYTITLE:function modbusWriteSingleCoil()}} Write value to single coil using modbus protocol. The call is asynchronous: the code execution proceeds immediately and when...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:function modbusWriteSingleCoil()}}&lt;br /&gt;
Write value to single coil using modbus protocol. The call is asynchronous: the code execution proceeds immediately and when the response arrives, callback function is called.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;i&amp;gt;nil&amp;lt;/i&amp;gt; &amp;lt;b&amp;gt;modbusWriteSingleCoil&amp;lt;/b&amp;gt;(&amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
 &amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; config{&amp;lt;code&amp;gt;deviceAddress&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;callback&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;color: #777&amp;quot;&amp;gt;port&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;color: #777&amp;quot;&amp;gt;timeout&amp;lt;/code&amp;gt;}&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;deviceAddress&amp;lt;/code&amp;gt; IP address of device&lt;br /&gt;
* &amp;lt;i&amp;gt;function{response}&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;callback&amp;lt;/code&amp;gt; this function is called when response arrives&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt; number of the coil&lt;br /&gt;
* &amp;lt;i&amp;gt;boolean&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; the value to be written&lt;br /&gt;
* optional &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;port&amp;lt;/code&amp;gt; numer of port (default 502)&lt;br /&gt;
* optional &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;timeout&amp;lt;/code&amp;gt; maximum seconds to wait for response (default 30)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Callback Parameters ===&lt;br /&gt;
 &amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; response{&amp;lt;code&amp;gt;result&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;errInfo&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt;}&lt;br /&gt;
* &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;result&amp;lt;/code&amp;gt; error code of the response (0 is success)&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;errInfo&amp;lt;/code&amp;gt; error description (if result&amp;gt;0)&lt;br /&gt;
* &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt; number of the input register&lt;br /&gt;
&lt;br /&gt;
=== Return value ===&lt;br /&gt;
 nil&lt;br /&gt;
&lt;br /&gt;
=== Usage ===&lt;br /&gt;
 -- Turn on all outputs on NETIO with IP 10.0.0.105 and port 505&lt;br /&gt;
 local function modbusWriteCallback(data)&lt;br /&gt;
   log(string.format(&amp;quot;addr %d, result %d&amp;quot;, data.address, data.result))&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 for i = 101,104 do&lt;br /&gt;
   modbusWriteSingleCoil{deviceAddress='10.0.0.105', port=505, timeout=6, address=true, value=4, callback=modbusWriteCallback}&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
Netio FirmWare 3.3.0+&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Function_modbusWriteSingleRegister()&amp;diff=399</id>
		<title>Function modbusWriteSingleRegister()</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Function_modbusWriteSingleRegister()&amp;diff=399"/>
		<updated>2019-06-20T13:04:12Z</updated>

		<summary type="html">&lt;p&gt;Phrych: Created page with &amp;quot;{{DISPLAYTITLE:function modbusWriteSingleRegister()}} Write value from to single register using modbus protocol. The call is asynchronous: the code execution proceeds immediat...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:function modbusWriteSingleRegister()}}&lt;br /&gt;
Write value from to single register using modbus protocol. The call is asynchronous: the code execution proceeds immediately and when the response arrives, callback function is called.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;i&amp;gt;nil&amp;lt;/i&amp;gt; &amp;lt;b&amp;gt;modbusWriteSingleRegister&amp;lt;/b&amp;gt;(&amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
 &amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; config{&amp;lt;code&amp;gt;deviceAddress&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;callback&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;color: #777&amp;quot;&amp;gt;port&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;color: #777&amp;quot;&amp;gt;timeout&amp;lt;/code&amp;gt;}&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;deviceAddress&amp;lt;/code&amp;gt; IP address of device&lt;br /&gt;
* &amp;lt;i&amp;gt;function{response}&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;callback&amp;lt;/code&amp;gt; this function is called when response arrives&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt; number of the register&lt;br /&gt;
* &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; the value to be written&lt;br /&gt;
* optional &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;port&amp;lt;/code&amp;gt; numer of port (default 502)&lt;br /&gt;
* optional &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;timeout&amp;lt;/code&amp;gt; maximum seconds to wait for response (default 30)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Callback Parameters ===&lt;br /&gt;
 &amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; response{&amp;lt;code&amp;gt;result&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;errInfo&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;}&lt;br /&gt;
* &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;result&amp;lt;/code&amp;gt; error code of the response (0 is success)&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;errInfo&amp;lt;/code&amp;gt; error description (if result&amp;gt;0)&lt;br /&gt;
* &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt; number of the input register&lt;br /&gt;
&lt;br /&gt;
=== Return value ===&lt;br /&gt;
 nil&lt;br /&gt;
&lt;br /&gt;
=== Usage ===&lt;br /&gt;
 -- Switch state of all outputs on NETIO with IP 10.0.0.105 and port 505&lt;br /&gt;
 local function modbusWriteCallback(data)&lt;br /&gt;
   log(string.format(&amp;quot;addr %d, result %d&amp;quot;, data.address, data.result))&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 for i = 101,104 do&lt;br /&gt;
   modbusWriteSingleRegister{deviceAddress='10.0.0.105', port=505, timeout=6, address=i, value=4, callback=modbusWriteCallback}&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
Netio FirmWare 3.3.0+&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Function_modbusReadInputRegister()&amp;diff=398</id>
		<title>Function modbusReadInputRegister()</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Function_modbusReadInputRegister()&amp;diff=398"/>
		<updated>2019-06-20T12:57:21Z</updated>

		<summary type="html">&lt;p&gt;Phrych: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:function modbusReadInputRegister()}}&lt;br /&gt;
Read value from single input register using modbus protocol. The call is asynchronous: the code execution proceeds immediately and when the response arrives, callback function is called.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;i&amp;gt;nil&amp;lt;/i&amp;gt; &amp;lt;b&amp;gt;modbusReadInputRegister&amp;lt;/b&amp;gt;(&amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
 &amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; config{&amp;lt;code&amp;gt;deviceAddress&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;callback&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt;,&amp;lt;code style=&amp;quot;color: #777&amp;quot;&amp;gt;port&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;color: #777&amp;quot;&amp;gt;timeout&amp;lt;/code&amp;gt;}&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;deviceAddress&amp;lt;/code&amp;gt; IP address of device&lt;br /&gt;
* &amp;lt;i&amp;gt;function{response}&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;callback&amp;lt;/code&amp;gt; this function is called when response arrives&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt; number of the input register&lt;br /&gt;
* optional &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;port&amp;lt;/code&amp;gt; numer of port (default 502)&lt;br /&gt;
* optional &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;timeout&amp;lt;/code&amp;gt; maximum seconds to wait for response (default 30)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Callback Parameters ===&lt;br /&gt;
 &amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; response{&amp;lt;code&amp;gt;result&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;errInfo&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;}&lt;br /&gt;
* &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;result&amp;lt;/code&amp;gt; error code of the response (0 is success)&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;errInfo&amp;lt;/code&amp;gt; error description (if result&amp;gt;0)&lt;br /&gt;
* &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt; number of the input register&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; value of the input register&lt;br /&gt;
&lt;br /&gt;
=== Return value ===&lt;br /&gt;
 nil&lt;br /&gt;
&lt;br /&gt;
=== Usage ===&lt;br /&gt;
 -- Read value of voltage (*10) from NETIO with IP address 10.0.0.105 and port 505&lt;br /&gt;
 function modbusReadCallback(data)&lt;br /&gt;
   if data.result == 0 then&lt;br /&gt;
     log(string.format(&amp;quot;modbus addr %d, got %s&amp;quot;, data.address, tostring(data.value)))&lt;br /&gt;
   else&lt;br /&gt;
     log(string.format(&amp;quot;modbus coil addr %d failed with error %d: %s&amp;quot;, data.address, data.result, data.errorInfo))&lt;br /&gt;
   end&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 modbusReadInputRegister{deviceAddress='10.0.0.105', port=505, timeout=6, address=1, callback=modbusReadCallback}&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
Netio FirmWare 3.3.0+&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Function_modbusReadInputRegister()&amp;diff=397</id>
		<title>Function modbusReadInputRegister()</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Function_modbusReadInputRegister()&amp;diff=397"/>
		<updated>2019-06-20T12:56:54Z</updated>

		<summary type="html">&lt;p&gt;Phrych: Created page with &amp;quot;{{DISPLAYTITLE:function modbusReadInputRegister()}} Read value from single input register using modbus protocol. The call is asynchronous: the code execution proceeds immediat...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:function modbusReadInputRegister()}}&lt;br /&gt;
Read value from single input register using modbus protocol. The call is asynchronous: the code execution proceeds immediately and when the response arrives, callback function is called.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;i&amp;gt;nil&amp;lt;/i&amp;gt; &amp;lt;b&amp;gt;modbusReadInputRegister&amp;lt;/b&amp;gt;(&amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
 &amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; config{&amp;lt;code&amp;gt;deviceAddress&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;callback&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt;,&amp;lt;code style=&amp;quot;color: #777&amp;quot;&amp;gt;port&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;color: #777&amp;quot;&amp;gt;timeout&amp;lt;/code&amp;gt;}&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;deviceAddress&amp;lt;/code&amp;gt; IP address of device&lt;br /&gt;
* &amp;lt;i&amp;gt;function{response}&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;callback&amp;lt;/code&amp;gt; this function is called when response arrives&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt; number of the input register&lt;br /&gt;
* optional &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;port&amp;lt;/code&amp;gt; numer of port (default 502)&lt;br /&gt;
* optional &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;timeout&amp;lt;/code&amp;gt; maximum seconds to wait for response (default 30)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Callback Parameters ===&lt;br /&gt;
 &amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; response{&amp;lt;code&amp;gt;result&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;errInfo&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;}&lt;br /&gt;
* &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;result&amp;lt;/code&amp;gt; error code of the response (0 is success)&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;errInfo&amp;lt;/code&amp;gt; error description (if result&amp;gt;0)&lt;br /&gt;
* &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt; number of the input register&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; value of the input register&lt;br /&gt;
&lt;br /&gt;
=== Return value ===&lt;br /&gt;
 nil&lt;br /&gt;
&lt;br /&gt;
=== Usage ===&lt;br /&gt;
 -- Read value about voltage (*10) from NETIO with IP address 10.0.0.105 and port 505&lt;br /&gt;
 function modbusReadCallback(data)&lt;br /&gt;
   if data.result == 0 then&lt;br /&gt;
     log(string.format(&amp;quot;modbus addr %d, got %s&amp;quot;, data.address, tostring(data.value)))&lt;br /&gt;
   else&lt;br /&gt;
     log(string.format(&amp;quot;modbus coil addr %d failed with error %d: %s&amp;quot;, data.address, data.result, data.errorInfo))&lt;br /&gt;
   end&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 modbusReadInputRegister{deviceAddress='10.0.0.105', port=505, timeout=6, address=1, callback=modbusReadCallback}&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
Netio FirmWare 3.3.0+&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Function_modbusReadHoldingRegister()&amp;diff=396</id>
		<title>Function modbusReadHoldingRegister()</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Function_modbusReadHoldingRegister()&amp;diff=396"/>
		<updated>2019-06-20T12:49:57Z</updated>

		<summary type="html">&lt;p&gt;Phrych: Created page with &amp;quot;{{DISPLAYTITLE:function modbusReadHoldingRegister()}} Read value from single holding register using modbus protocol. The call is asynchronous: the code execution proceeds imme...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:function modbusReadHoldingRegister()}}&lt;br /&gt;
Read value from single holding register using modbus protocol. The call is asynchronous: the code execution proceeds immediately and when the response arrives, callback function is called.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;i&amp;gt;nil&amp;lt;/i&amp;gt; &amp;lt;b&amp;gt;modbusReadHoldingRegister&amp;lt;/b&amp;gt;(&amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
 &amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; config{&amp;lt;code&amp;gt;deviceAddress&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;callback&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt;,&amp;lt;code style=&amp;quot;color: #777&amp;quot;&amp;gt;port&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;color: #777&amp;quot;&amp;gt;timeout&amp;lt;/code&amp;gt;}&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;deviceAddress&amp;lt;/code&amp;gt; IP address of device&lt;br /&gt;
* &amp;lt;i&amp;gt;function{response}&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;callback&amp;lt;/code&amp;gt; this function is called when response arrives&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt; number of the holding register&lt;br /&gt;
* optional &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;port&amp;lt;/code&amp;gt; numer of port (default 502)&lt;br /&gt;
* optional &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;timeout&amp;lt;/code&amp;gt; maximum seconds to wait for response (default 30)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Callback Parameters ===&lt;br /&gt;
 &amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; response{&amp;lt;code&amp;gt;result&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;errInfo&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;}&lt;br /&gt;
* &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;result&amp;lt;/code&amp;gt; error code of the response (0 is success)&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;errInfo&amp;lt;/code&amp;gt; error description (if result&amp;gt;0)&lt;br /&gt;
* &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt; number of the holding register&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; value of the holding register&lt;br /&gt;
&lt;br /&gt;
=== Return value ===&lt;br /&gt;
 nil&lt;br /&gt;
&lt;br /&gt;
=== Usage ===&lt;br /&gt;
 -- Read value of all outputs from NETIO with IP 10.0.0.105 on port 505&lt;br /&gt;
 function modbusReadCallback(data)&lt;br /&gt;
   if data.result == 0 then&lt;br /&gt;
     log(string.format(&amp;quot;modbus addr %d, got %s&amp;quot;, data.address, tostring(data.value)))&lt;br /&gt;
   else&lt;br /&gt;
     log(string.format(&amp;quot;modbus coil addr %d failed with error %d: %s&amp;quot;, data.address, data.result, data.errorInfo))&lt;br /&gt;
   end&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 for i = 101,104 do&lt;br /&gt;
   modbusReadHoldingRegister{deviceAddress='10.0.0.105', port=505, timeout=6, address=i, callback=modbusReadCallback}&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
Netio FirmWare 3.3.0+&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Function_modbusReadCoil()&amp;diff=395</id>
		<title>Function modbusReadCoil()</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Function_modbusReadCoil()&amp;diff=395"/>
		<updated>2019-06-20T12:45:43Z</updated>

		<summary type="html">&lt;p&gt;Phrych: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:function modbusReadCoil()}}&lt;br /&gt;
Read value from single coil using modbus protocol. The call is asynchronous: the code execution proceeds immediately and when the response arrives, callback function is called.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;i&amp;gt;nil&amp;lt;/i&amp;gt; &amp;lt;b&amp;gt;modbusReadCoil&amp;lt;/b&amp;gt;(&amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
 &amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; config{&amp;lt;code&amp;gt;deviceAddress&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;callback&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt;,&amp;lt;code style=&amp;quot;color: #777&amp;quot;&amp;gt;port&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;color: #777&amp;quot;&amp;gt;timeout&amp;lt;/code&amp;gt;}&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;deviceAddress&amp;lt;/code&amp;gt; IP address of device&lt;br /&gt;
* &amp;lt;i&amp;gt;function{response}&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;callback&amp;lt;/code&amp;gt; this function is called when response arrives&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt; number of the coil&lt;br /&gt;
* optional &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;port&amp;lt;/code&amp;gt; numer of port (default 502)&lt;br /&gt;
* optional &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;timeout&amp;lt;/code&amp;gt; maximum seconds to wait for response (default 30)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Callback Parameters ===&lt;br /&gt;
 &amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; response{&amp;lt;code&amp;gt;result&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;errInfo&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;}&lt;br /&gt;
* &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;result&amp;lt;/code&amp;gt; error code of the response (0 is success)&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;errInfo&amp;lt;/code&amp;gt; error description (if result&amp;gt;0)&lt;br /&gt;
* &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt; number of the coil&lt;br /&gt;
* &amp;lt;i&amp;gt;boolean&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; value of the coil&lt;br /&gt;
&lt;br /&gt;
=== Return value ===&lt;br /&gt;
 nil&lt;br /&gt;
&lt;br /&gt;
=== Usage ===&lt;br /&gt;
 -- Read value of all outputs from NETIO with IP 10.0.0.105 on port 505&lt;br /&gt;
 function modbusReadCallback(data)&lt;br /&gt;
   if data.result == 0 then&lt;br /&gt;
     log(string.format(&amp;quot;modbus addr %d, got %s&amp;quot;, data.address, tostring(data.value)))&lt;br /&gt;
   else&lt;br /&gt;
     log(string.format(&amp;quot;modbus coil addr %d failed with error %d: %s&amp;quot;, data.address, data.result, data.errorInfo))&lt;br /&gt;
   end&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 for i = 101,104 do&lt;br /&gt;
   modbusReadCoil{deviceAddress='10.0.0.105', port=505, timeout=6, address=i, callback=modbusReadCallback}&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
Netio FirmWare 3.3.0+&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Function_modbusReadDiscreteInput()&amp;diff=394</id>
		<title>Function modbusReadDiscreteInput()</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Function_modbusReadDiscreteInput()&amp;diff=394"/>
		<updated>2019-06-20T12:45:18Z</updated>

		<summary type="html">&lt;p&gt;Phrych: Created page with &amp;quot;{{DISPLAYTITLE:function modbusReadDiscreteInput()}} Read value from discrete input using modbus protocol. The call is asynchronous: the code execution proceeds immediately and...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:function modbusReadDiscreteInput()}}&lt;br /&gt;
Read value from discrete input using modbus protocol. The call is asynchronous: the code execution proceeds immediately and when the response arrives, callback function is called.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;i&amp;gt;nil&amp;lt;/i&amp;gt; &amp;lt;b&amp;gt;modbusReadDiscreteInput&amp;lt;/b&amp;gt;(&amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
 &amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; config{&amp;lt;code&amp;gt;deviceAddress&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;callback&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt;,&amp;lt;code style=&amp;quot;color: #777&amp;quot;&amp;gt;port&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;color: #777&amp;quot;&amp;gt;timeout&amp;lt;/code&amp;gt;}&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;deviceAddress&amp;lt;/code&amp;gt; IP address of device&lt;br /&gt;
* &amp;lt;i&amp;gt;function{response}&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;callback&amp;lt;/code&amp;gt; this function is called when response arrives&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt; number of the coil&lt;br /&gt;
* optional &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;port&amp;lt;/code&amp;gt; numer of port (default 502)&lt;br /&gt;
* optional &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;timeout&amp;lt;/code&amp;gt; maximum seconds to wait for response (default 30)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Callback Parameters ===&lt;br /&gt;
 &amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; response{&amp;lt;code&amp;gt;result&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;errInfo&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;}&lt;br /&gt;
* &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;result&amp;lt;/code&amp;gt; error code of the response (0 is success)&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;errInfo&amp;lt;/code&amp;gt; error description (if result&amp;gt;0)&lt;br /&gt;
* &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt; number of the coil&lt;br /&gt;
* &amp;lt;i&amp;gt;boolean&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; value of the coil&lt;br /&gt;
&lt;br /&gt;
=== Return value ===&lt;br /&gt;
 nil&lt;br /&gt;
&lt;br /&gt;
=== Usage ===&lt;br /&gt;
 -- Read value of discrete input on IP address 10.0.0.105, on port 505 with address 102&lt;br /&gt;
 function modbusReadCallback(data)&lt;br /&gt;
   if data.result == 0 then&lt;br /&gt;
     log(string.format(&amp;quot;modbus addr %d, got %s&amp;quot;, data.address, tostring(data.value)))&lt;br /&gt;
   else&lt;br /&gt;
     log(string.format(&amp;quot;modbus addr %d failed with error %d: %s&amp;quot;, data.address, data.result, data.errorInfo))&lt;br /&gt;
   end&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 modbusReadCoil{deviceAddress='10.0.0.105', port=505, timeout=6, address=102, callback=modbusReadCallback}&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
Netio FirmWare 3.3.0+&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Function_modbusReadCoil()&amp;diff=393</id>
		<title>Function modbusReadCoil()</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Function_modbusReadCoil()&amp;diff=393"/>
		<updated>2019-06-20T12:36:40Z</updated>

		<summary type="html">&lt;p&gt;Phrych: Created page with &amp;quot;{{DISPLAYTITLE:function modbusReadCoil()}} Read value from single coil using modbus protocol. The call is asynchronous: the code execution proceeds immediately and when the re...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:function modbusReadCoil()}}&lt;br /&gt;
Read value from single coil using modbus protocol. The call is asynchronous: the code execution proceeds immediately and when the response arrives, callback function is called.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;i&amp;gt;nil&amp;lt;/i&amp;gt; &amp;lt;b&amp;gt;modbusReadCoil&amp;lt;/b&amp;gt;(&amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
 &amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; config{&amp;lt;code&amp;gt;deviceAddress&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;callback&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt;,&amp;lt;code style=&amp;quot;color: #777&amp;quot;&amp;gt;port&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;color: #777&amp;quot;&amp;gt;timeout&amp;lt;/code&amp;gt;}&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;deviceAddress&amp;lt;/code&amp;gt; IP address of device&lt;br /&gt;
* &amp;lt;i&amp;gt;function{response}&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;callback&amp;lt;/code&amp;gt; this function is called when response arrives&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt; number of the coil&lt;br /&gt;
* optional &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;port&amp;lt;/code&amp;gt; numer of port (default 502)&lt;br /&gt;
* optional &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;timeout&amp;lt;/code&amp;gt; maximum seconds to wait for response (default 30)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Callback Parameters ===&lt;br /&gt;
 &amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; response{&amp;lt;code&amp;gt;result&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;errInfo&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;}&lt;br /&gt;
* &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;result&amp;lt;/code&amp;gt; error code of the response (0 is success)&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;errInfo&amp;lt;/code&amp;gt; error description (if result&amp;gt;0)&lt;br /&gt;
* &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt; number of the coil&lt;br /&gt;
* &amp;lt;i&amp;gt;boolean&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; value of the coil&lt;br /&gt;
&lt;br /&gt;
=== Return value ===&lt;br /&gt;
 nil&lt;br /&gt;
&lt;br /&gt;
=== Usage ===&lt;br /&gt;
 -- Read value of all outputs from NETIO with IP 10.0.0.105 on port 505&lt;br /&gt;
 local function modbusReadCallback(data)&lt;br /&gt;
   if data.result == 0 then&lt;br /&gt;
     log(string.format(&amp;quot;modbus addr %d, got %s&amp;quot;, data.address, tostring(data.value)))&lt;br /&gt;
   else&lt;br /&gt;
     log(string.format(&amp;quot;modbus coil addr %d failed with error %d: %s&amp;quot;, data.address, data.result, data.errorInfo))&lt;br /&gt;
   end&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 for i = 101,104 do&lt;br /&gt;
   modbusReadCoil{deviceAddress='10.0.0.105', port=505, timeout=6, address=i, callback=modbusReadCallback}&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
Netio FirmWare 3.3.0+&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Function_snmpGet()&amp;diff=392</id>
		<title>Function snmpGet()</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Function_snmpGet()&amp;diff=392"/>
		<updated>2019-06-20T10:26:47Z</updated>

		<summary type="html">&lt;p&gt;Phrych: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:function snmpGet()}}&lt;br /&gt;
Execute SNMP GET call to given host and oid to read the response. The call is asynchronous: the code execution proceeds immediately and when the response arrives, callback function is called.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;i&amp;gt;nil&amp;lt;/i&amp;gt; &amp;lt;b&amp;gt;snmpGet&amp;lt;/b&amp;gt;(&amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
 &amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; config{&amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;oid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;callback&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;snmpVersion&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;community&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;color: #777&amp;quot;&amp;gt;timeout&amp;lt;/code&amp;gt;}&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; host IP adress, may contain transport protocol and port (for example tcp:myhost.com:162)&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;oid&amp;lt;/code&amp;gt; object identifier&lt;br /&gt;
* &amp;lt;i&amp;gt;function{response}&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;callback&amp;lt;/code&amp;gt; this function is called when response arrives&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;snmpVersion&amp;lt;/code&amp;gt; version of SNMP (SNMP_VERSION.Snmp1 or SNMP_VERSION.Snmp2c)&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;community&amp;lt;/code&amp;gt; SNMP community string&lt;br /&gt;
* optional &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;timeout&amp;lt;/code&amp;gt; maximum seconds to wait for response (default 30)&lt;br /&gt;
&lt;br /&gt;
=== Callback Parameters ===&lt;br /&gt;
 &amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; response{&amp;lt;code&amp;gt;result&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;errorInfo&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;oid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;}&lt;br /&gt;
* &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;result&amp;lt;/code&amp;gt; error code of the response (0 is success)&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;errorInfo&amp;lt;/code&amp;gt; error description (if result&amp;gt;0)&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;oid&amp;lt;/code&amp;gt; oid we got&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; value for the oid&lt;br /&gt;
&lt;br /&gt;
=== Return value ===&lt;br /&gt;
 nil&lt;br /&gt;
&lt;br /&gt;
=== Usage ===&lt;br /&gt;
 -- switch all outputs on NETIO with IP in 'host' parameter&lt;br /&gt;
 local function snmpcallback(data)&lt;br /&gt;
   if data.result == 0 then&lt;br /&gt;
     output=tonumber(string.sub(data.oid, -1))&lt;br /&gt;
     outputStatus=tonumber(data.value)&lt;br /&gt;
     devices.system.SetOut{output=output, value=(outputStatus == 0)}&lt;br /&gt;
   else&lt;br /&gt;
        log(string.format(&amp;quot;snmpget failed with error %d: %s&amp;quot;, data.result, data.errorInfo))&lt;br /&gt;
   end&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 for i = 1,4 do&lt;br /&gt;
   snmpGet{host='10.0.0.102', timeout=6, oid=string.format(&amp;quot;.1.3.6.1.4.1.47952.1.1.1.3.%d&amp;quot;, i), snmpVersion=SNMP_VERSION.Snmp1, community='public', callback=snmpcallback}&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
Netio FirmWare 3.3.0+&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=NETIO_Lua_Reference&amp;diff=391</id>
		<title>NETIO Lua Reference</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=NETIO_Lua_Reference&amp;diff=391"/>
		<updated>2019-06-20T10:19:28Z</updated>

		<summary type="html">&lt;p&gt;Phrych: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Outlet Management ==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt; devices.system &amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
* function [[Function devices.system.SetOut()|.SetOut()]] - turns the outlet on or off&lt;br /&gt;
* function [[Function devices.system.ResetOut()|.ResetOut()]] - turns the outlet off and then resets its previous state&lt;br /&gt;
* string [[String devices.system.output1_state|.output1_state]] - outlet's state&lt;br /&gt;
* number [[Number devices.system.output1_consumption|.output1_consumption]] - outlet's consumption (in Watts)&lt;br /&gt;
* number [[Number devices.system.output1_cumulatedConsumption|.output1_cumulatedConsumption]] - outlet's consumed energy (in Watthours)&lt;br /&gt;
* function [[Function devices.system.resetCumulativeConsumption()|.resetCumulativeConsumption()]] - resets outlet's energy counter&lt;br /&gt;
* string [[String devices.system.output1_consumptionStart|.output1_consumptionStart]] - date and time since the last energy counter reset&lt;br /&gt;
&lt;br /&gt;
== Socket System Management ==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt; devices.system&amp;lt;/b&amp;gt; &amp;lt;/big&amp;gt;&lt;br /&gt;
* number [[number devices.system.averageLoad|.averageLoad]] - socket's CPU load&lt;br /&gt;
* function [[Function devices.system.Reboot()|.Reboot()]] - reboot socket's system&lt;br /&gt;
* number [[Number devices.system.sessionCount|.sessionCount]] - number of connected users&lt;br /&gt;
* number [[Number devices.system.freeSpace|.freeSpace]] - free disk space&lt;br /&gt;
* number [[Number devices.system.totalSpace|.totalSpace]] - total disk space&lt;br /&gt;
* string [[String devices.system.serialNumber|.serialNumber]] &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;3.3.0&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; - returns serial number of the device (Eth Interface MAC address)&lt;br /&gt;
* number [[Number devices.system.voltage|.voltage]] - socket's voltage&lt;br /&gt;
* number [[Number devices.system.overallPowerFactor|.overallPowerFactor]] - overall power factor&lt;br /&gt;
* number [[Number devices.system.frequency|.frequency]] - socket's frequency&lt;br /&gt;
* number [[Number devices.system.totalCurrent|.totalCurrent]] - total current through socket&lt;br /&gt;
* number [[Number devices.system.totalLoad|.totalLoad]] - total load on socket&lt;br /&gt;
* number [[Number devices.system.totalEnergy|.totalEnergy]] - total energy consumed by socket&lt;br /&gt;
* string [[Number devices.system.energyStart|.energyStart]] - time of last consumption reset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Socket Communication ==&lt;br /&gt;
* function [[Function ping()|ping()]] - tests socket's network responsivity&lt;br /&gt;
* function [[Function mail()|mail()]] - sends e-mail&lt;br /&gt;
* function [[Function devices.system.CustomCGI()|devices.system.CustomCGI()]] - send HTTP request&lt;br /&gt;
* function [[Function cgiGet()|cgiGet()]] &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;2.3.5&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; - send HTTP request and receive response&lt;br /&gt;
* table [[Table event.args|event.args]] - HTTP GET /event variables table&lt;br /&gt;
* function [[Function snmpGet()|snmpGet()]] - send SNMP request&lt;br /&gt;
&lt;br /&gt;
== XML Processing &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;2.3.6&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; ==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;xml&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
* function [[Function xml.escape()|.escape()]] - escapes XML string to fit xml node contents&lt;br /&gt;
* function [[Function xml.check()|.check()]] - tests if string is well-formed XML&lt;br /&gt;
* function [[Function xml.parse()|.parse()]] - parses XML string into [[Function xml.parse()#XmlElement|XmlElement]] object&lt;br /&gt;
&lt;br /&gt;
== JSON Processing &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;3.3.0&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; ==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;json&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt; &lt;br /&gt;
* function [[Function json.decode()|.decode()]] - parse json string into obj table&lt;br /&gt;
* function [[Function json.encode()|.encode()]] - generate JSON string from table&lt;br /&gt;
&lt;br /&gt;
(based on [http://dkolf.de/src/dkjson-lua.fsl/home dkjson])&lt;br /&gt;
&lt;br /&gt;
== Modbus ==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Read functions&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt; &lt;br /&gt;
* function [[Function modbusReadCoil()|modbusReadCoil()]] - read value from coil&lt;br /&gt;
* function [[Function modbusReadDiscreteInput()|modbusReadDiscreteInput()]] - read value from discrete input&lt;br /&gt;
* function [[Function modbusReadHoldingRegister()|modbusReadHoldingRegister()]] - read value from holding register&lt;br /&gt;
* function [[Function modbusReadInputRegister()|modbusReadInputRegister()]] - read value from input register&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Write functions&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt; &lt;br /&gt;
* function [[Function modbusWriteSingleCoil()|modbusWriteSingleCoil()]] - write value to single coil&lt;br /&gt;
* function [[Function modbusWriteSingleRegister()|modbusWriteSingleRegister()]] - write value to single register&lt;br /&gt;
&lt;br /&gt;
== Standard Lua Functions ==&lt;br /&gt;
* function [https://www.lua.org/pil/8.3.html assert(), error()] issues an error&lt;br /&gt;
* function [https://www.lua.org/pil/7.3.html ipairs(), pairs(), next()] traverse tables&lt;br /&gt;
* function [https://www.lua.org/pil/2.4.html tonumber(), tostring()] data type conversion&lt;br /&gt;
* function [https://www.lua.org/pil/8.4.html pcall()] protected call function (handles error inside the function)&lt;br /&gt;
* function [https://www.lua.org/pil/5.2.html select()] selects from multiple return value&lt;br /&gt;
* function [https://www.lua.org/pil/2.html unpack] converts table into multiple values&lt;br /&gt;
* function [https://www.lua.org/pil/2.html type()] returns variable type&lt;br /&gt;
* function [https://www.lua.org/pil/22.1.html os.date(), os.time()] system date and time&lt;br /&gt;
* function os.difftime() returns time span between two times&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous ==&lt;br /&gt;
* function [[Function log()|log()]] - insert a record to the socket's event log&lt;br /&gt;
* function [[Function logf()|logf()]] - insert a formated record (incl. numbers) to the socket's event log&lt;br /&gt;
* function [[Function delay()|delay()]] - execute function with delay (seconds)&lt;br /&gt;
* function [[Function milliDelay()|milliDelay()]] - execute function with delay (milliseconds)&lt;br /&gt;
* function [[Function toboolean()|toboolean()]] - converts any variable to boolean type&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=String_devices.system.serialNumber&amp;diff=390</id>
		<title>String devices.system.serialNumber</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=String_devices.system.serialNumber&amp;diff=390"/>
		<updated>2019-06-19T15:41:30Z</updated>

		<summary type="html">&lt;p&gt;Phrych: /* Usage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:number devices.system.serialNumber}}&lt;br /&gt;
Returns the serial number of the socket. &amp;lt;b&amp;gt;The property is read only!&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;devices.system.serialNumber&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Value ===&lt;br /&gt;
&amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; serial number of socket&lt;br /&gt;
&lt;br /&gt;
=== Usage ===&lt;br /&gt;
 -- log serial number of the socket&lt;br /&gt;
 logf(&amp;quot;serial number: %s&amp;quot;, devices.system.serialNumber)&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=String_devices.system.serialNumber&amp;diff=389</id>
		<title>String devices.system.serialNumber</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=String_devices.system.serialNumber&amp;diff=389"/>
		<updated>2019-06-19T15:40:56Z</updated>

		<summary type="html">&lt;p&gt;Phrych: Created page with &amp;quot;{{DISPLAYTITLE:number devices.system.serialNumber}} Returns the serial number of the socket. &amp;lt;b&amp;gt;The property is read only!&amp;lt;/b&amp;gt;   &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;devices.system.serialNumbe...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:number devices.system.serialNumber}}&lt;br /&gt;
Returns the serial number of the socket. &amp;lt;b&amp;gt;The property is read only!&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;devices.system.serialNumber&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Value ===&lt;br /&gt;
&amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; serial number of socket&lt;br /&gt;
&lt;br /&gt;
=== Usage ===&lt;br /&gt;
 -- log serial number of the socket&lt;br /&gt;
 logf(&amp;quot;voltage: %s&amp;quot;, devices.system.serialNumber)&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Number_devices.system.energyStart&amp;diff=388</id>
		<title>Number devices.system.energyStart</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Number_devices.system.energyStart&amp;diff=388"/>
		<updated>2019-06-19T15:38:42Z</updated>

		<summary type="html">&lt;p&gt;Phrych: Created page with &amp;quot;{{DISPLAYTITLE:number devices.system.energyStart}} Date and time since the last reset of the consumption counter. See Function devices.system.resetCumulativeConsumption()|.r...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:number devices.system.energyStart}}&lt;br /&gt;
Date and time since the last reset of the consumption counter. See [[Function devices.system.resetCumulativeConsumption()|.resetCumulativeConsumption()]] &amp;lt;b&amp;gt;The property is read only!&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;devices.system.energyStart&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Value ===&lt;br /&gt;
The format is space separated date and time&lt;br /&gt;
 YYYY-MM-DD hh:mm:ss&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Usage ===&lt;br /&gt;
 -- log voltage of the socket&lt;br /&gt;
 logf(&amp;quot;Measurment start: %s&amp;quot;, devices.system.energyStart)&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Number_devices.system.totalEnergy&amp;diff=387</id>
		<title>Number devices.system.totalEnergy</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Number_devices.system.totalEnergy&amp;diff=387"/>
		<updated>2019-06-19T15:34:04Z</updated>

		<summary type="html">&lt;p&gt;Phrych: Created page with &amp;quot;{{DISPLAYTITLE:number devices.system.totalEnergy}} Returns the total energy (in Wh) consumed by socket from last consumption restart (Function devices.system.resetCumulative...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:number devices.system.totalEnergy}}&lt;br /&gt;
Returns the total energy (in Wh) consumed by socket from last consumption restart ([[Function devices.system.resetCumulativeConsumption()|.resetCumulativeConsumption()]]). &amp;lt;b&amp;gt;The property is read only!&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;devices.system.totalEnergy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Value ===&lt;br /&gt;
&amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; total energy consumed by socket (in Wh)&lt;br /&gt;
&lt;br /&gt;
=== Usage ===&lt;br /&gt;
 -- log energy consumed by the socket&lt;br /&gt;
 logf(&amp;quot;voltage: %d&amp;quot;, devices.system.totalEnergy)&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Number_devices.system.totalLoad&amp;diff=386</id>
		<title>Number devices.system.totalLoad</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Number_devices.system.totalLoad&amp;diff=386"/>
		<updated>2019-06-19T15:31:31Z</updated>

		<summary type="html">&lt;p&gt;Phrych: Created page with &amp;quot;{{DISPLAYTITLE:number devices.system.totalLoad}} Returns the total load (in watts) of the socket. &amp;lt;b&amp;gt;The property is read only!&amp;lt;/b&amp;gt;   &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;devices.system.totalL...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:number devices.system.totalLoad}}&lt;br /&gt;
Returns the total load (in watts) of the socket. &amp;lt;b&amp;gt;The property is read only!&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;devices.system.totalLoad&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Value ===&lt;br /&gt;
&amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; total load of socket (in watts)&lt;br /&gt;
&lt;br /&gt;
=== Usage ===&lt;br /&gt;
 -- log total load of the socket&lt;br /&gt;
 logf(&amp;quot;voltage: %d&amp;quot;, devices.system.totalLoad)&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Number_devices.system.totalCurrent&amp;diff=385</id>
		<title>Number devices.system.totalCurrent</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Number_devices.system.totalCurrent&amp;diff=385"/>
		<updated>2019-06-19T15:26:45Z</updated>

		<summary type="html">&lt;p&gt;Phrych: Created page with &amp;quot;{{DISPLAYTITLE:number devices.system.totalCurrent}} Returns the current (in milliamperes) on the socket. &amp;lt;b&amp;gt;The property is read only!&amp;lt;/b&amp;gt;   &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;devices.system...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:number devices.system.totalCurrent}}&lt;br /&gt;
Returns the current (in milliamperes) on the socket. &amp;lt;b&amp;gt;The property is read only!&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;devices.system.totalCurrent&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Value ===&lt;br /&gt;
&amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; total current on socket (in milliamperes)&lt;br /&gt;
&lt;br /&gt;
=== Usage ===&lt;br /&gt;
 -- log current of the socket&lt;br /&gt;
 logf(&amp;quot;total current: %d&amp;quot;, devices.system.totalCurrent)&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Number_devices.system.frequency&amp;diff=384</id>
		<title>Number devices.system.frequency</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Number_devices.system.frequency&amp;diff=384"/>
		<updated>2019-06-19T15:24:41Z</updated>

		<summary type="html">&lt;p&gt;Phrych: Created page with &amp;quot;{{DISPLAYTITLE:number devices.system.frequency}} Returns the frequency (in millihertz) on the socket. &amp;lt;b&amp;gt;The property is read only!&amp;lt;/b&amp;gt;   &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;devices.system.fr...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:number devices.system.frequency}}&lt;br /&gt;
Returns the frequency (in millihertz) on the socket. &amp;lt;b&amp;gt;The property is read only!&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;devices.system.frequency&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Value ===&lt;br /&gt;
&amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; frequency on socket (in millihertz)&lt;br /&gt;
&lt;br /&gt;
=== Usage ===&lt;br /&gt;
 -- log frequency of the socket&lt;br /&gt;
 logf(&amp;quot;frequency: %d&amp;quot;, devices.system.frequency)&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Number_devices.system.overallPowerFactor&amp;diff=383</id>
		<title>Number devices.system.overallPowerFactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Number_devices.system.overallPowerFactor&amp;diff=383"/>
		<updated>2019-06-19T15:20:19Z</updated>

		<summary type="html">&lt;p&gt;Phrych: Created page with &amp;quot;{{DISPLAYTITLE:number devices.system.overallPowerFactor}} Returns the power factor of socket times 1000. &amp;lt;b&amp;gt;The property is read only!&amp;lt;/b&amp;gt;   &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;devices.system...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:number devices.system.overallPowerFactor}}&lt;br /&gt;
Returns the power factor of socket times 1000. &amp;lt;b&amp;gt;The property is read only!&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;devices.system.overallPowerFactor&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Value ===&lt;br /&gt;
&amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; power factor of socket * 1000&lt;br /&gt;
&lt;br /&gt;
=== Usage ===&lt;br /&gt;
 -- log power factor of the socket&lt;br /&gt;
 logf(&amp;quot;power factor: %d&amp;quot;, devices.system.overallPowerFactor)&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Function_snmpGet()&amp;diff=382</id>
		<title>Function snmpGet()</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Function_snmpGet()&amp;diff=382"/>
		<updated>2019-06-19T14:25:52Z</updated>

		<summary type="html">&lt;p&gt;Phrych: Created page with &amp;quot;{{DISPLAYTITLE:function snmpGet()}} Execute SNMP GET call to given host and oid to read the response. The call is asynchronous: the code execution proceeds immediately and whe...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:function snmpGet()}}&lt;br /&gt;
Execute SNMP GET call to given host and oid to read the response. The call is asynchronous: the code execution proceeds immediately and when the response arrives, callback function is called.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;i&amp;gt;nil&amp;lt;/i&amp;gt; &amp;lt;b&amp;gt;devices.system.snmpGet&amp;lt;/b&amp;gt;(&amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
 &amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; config{&amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;oid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;callback&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;snmpVersion&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;community&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;color: #777&amp;quot;&amp;gt;timeout&amp;lt;/code&amp;gt;}&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; host IP adress, may contain transport protocol and port (for example tcp:myhost.com:162)&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;oid&amp;lt;/code&amp;gt; object identifier&lt;br /&gt;
* &amp;lt;i&amp;gt;function{response}&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;callback&amp;lt;/code&amp;gt; this function is called when response arrives&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;snmpVersion&amp;lt;/code&amp;gt; version of SNMP (SNMP_VERSION.Snmp1 or SNMP_VERSION.Snmp2c)&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;community&amp;lt;/code&amp;gt; SNMP community string&lt;br /&gt;
* optional &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;timeout&amp;lt;/code&amp;gt; maximum seconds to wait for response (default 30)&lt;br /&gt;
&lt;br /&gt;
=== Callback Parameters ===&lt;br /&gt;
 &amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; response{&amp;lt;code&amp;gt;result&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;errorInfo&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;oid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;}&lt;br /&gt;
* &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;result&amp;lt;/code&amp;gt; error code of the response (0 is success)&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;errorInfo&amp;lt;/code&amp;gt; error description (if result&amp;gt;0)&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;oid&amp;lt;/code&amp;gt; oid we got&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; value for the oid&lt;br /&gt;
&lt;br /&gt;
=== Return value ===&lt;br /&gt;
 nil&lt;br /&gt;
&lt;br /&gt;
=== Usage ===&lt;br /&gt;
 -- switch all outputs on NETIO with IP in 'host' parameter&lt;br /&gt;
 local function snmpcallback(data)&lt;br /&gt;
   if data.result == 0 then&lt;br /&gt;
     output=tonumber(string.sub(data.oid, -1))&lt;br /&gt;
     outputStatus=tonumber(data.value)&lt;br /&gt;
     devices.system.SetOut{output=output, value=(outputStatus == 0)}&lt;br /&gt;
   else&lt;br /&gt;
        log(string.format(&amp;quot;snmpget failed with error %d: %s&amp;quot;, data.result, data.errorInfo))&lt;br /&gt;
   end&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 for i = 1,4 do&lt;br /&gt;
   snmpGet{host='10.0.0.102', timeout=6, oid=string.format(&amp;quot;.1.3.6.1.4.1.47952.1.1.1.3.%d&amp;quot;, i), snmpVersion=SNMP_VERSION.Snmp1, community='public', callback=snmpcallback}&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
Netio FirmWare 3.3.0+&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=NETIO_Lua_Reference&amp;diff=381</id>
		<title>NETIO Lua Reference</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=NETIO_Lua_Reference&amp;diff=381"/>
		<updated>2019-06-19T13:54:23Z</updated>

		<summary type="html">&lt;p&gt;Phrych: /* Socket Communication */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Outlet Management ==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt; devices.system &amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
* function [[Function devices.system.SetOut()|.SetOut()]] - turns the outlet on or off&lt;br /&gt;
* function [[Function devices.system.ResetOut()|.ResetOut()]] - turns the outlet off and then resets its previous state&lt;br /&gt;
* string [[String devices.system.output1_state|.output1_state]] - outlet's state&lt;br /&gt;
* number [[Number devices.system.output1_consumption|.output1_consumption]] - outlet's consumption (in Watts)&lt;br /&gt;
* number [[Number devices.system.output1_cumulatedConsumption|.output1_cumulatedConsumption]] - outlet's consumed energy (in Watthours)&lt;br /&gt;
* function [[Function devices.system.resetCumulativeConsumption()|.resetCumulativeConsumption()]] - resets outlet's energy counter&lt;br /&gt;
* string [[String devices.system.output1_consumptionStart|.output1_consumptionStart]] - date and time since the last energy counter reset&lt;br /&gt;
&lt;br /&gt;
== Socket System Management ==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt; devices.system&amp;lt;/b&amp;gt; &amp;lt;/big&amp;gt;&lt;br /&gt;
* number [[number devices.system.averageLoad|.averageLoad]] - socket's CPU load&lt;br /&gt;
* function [[Function devices.system.Reboot()|.Reboot()]] - reboot socket's system&lt;br /&gt;
* number [[Number devices.system.sessionCount|.sessionCount]] - number of connected users&lt;br /&gt;
* number [[Number devices.system.freeSpace|.freeSpace]] - free disk space&lt;br /&gt;
* number [[Number devices.system.totalSpace|.totalSpace]] - total disk space&lt;br /&gt;
* string [[String devices.system.serialNumber|.serialNumber]] &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;3.3.0&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; - returns serial number of the device (Eth Interface MAC address)&lt;br /&gt;
* number [[Number devices.system.voltage|.voltage]] - socket's voltage&lt;br /&gt;
* number [[Number devices.system.overallPowerFactor|.overallPowerFactor]] - overall power factor&lt;br /&gt;
* number [[Number devices.system.frequency|.frequency]] - socket's frequency&lt;br /&gt;
* number [[Number devices.system.totalCurrent|.totalCurrent]] - total current through socket&lt;br /&gt;
* number [[Number devices.system.totalLoad|.totalLoad]] - total load on socket&lt;br /&gt;
* number [[Number devices.system.totalEnergy|.totalEnergy]] - total energy consumed by socket&lt;br /&gt;
* string [[Number devices.system.energyStart|.energyStart]] - time of last consumption reset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Socket Communication ==&lt;br /&gt;
* function [[Function ping()|ping()]] - tests socket's network responsivity&lt;br /&gt;
* function [[Function mail()|mail()]] - sends e-mail&lt;br /&gt;
* function [[Function devices.system.CustomCGI()|devices.system.CustomCGI()]] - send HTTP request&lt;br /&gt;
* function [[Function cgiGet()|cgiGet()]] &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;2.3.5&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; - send HTTP request and receive response&lt;br /&gt;
* table [[Table event.args|event.args]] - HTTP GET /event variables table&lt;br /&gt;
* function [[Function snmpGet()|snmpGet()]] - send SNMP request&lt;br /&gt;
&lt;br /&gt;
== XML Processing &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;2.3.6&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; ==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;xml&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
* function [[Function xml.escape()|.escape()]] - escapes XML string to fit xml node contents&lt;br /&gt;
* function [[Function xml.check()|.check()]] - tests if string is well-formed XML&lt;br /&gt;
* function [[Function xml.parse()|.parse()]] - parses XML string into [[Function xml.parse()#XmlElement|XmlElement]] object&lt;br /&gt;
&lt;br /&gt;
== JSON Processing &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;3.3.0&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; ==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;json&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt; &lt;br /&gt;
* function [[Function json.decode()|.decode()]] - parse json string into obj table&lt;br /&gt;
* function [[Function json.encode()|.encode()]] - generate JSON string from table&lt;br /&gt;
&lt;br /&gt;
(based on [http://dkolf.de/src/dkjson-lua.fsl/home dkjson])&lt;br /&gt;
&lt;br /&gt;
== Standard Lua Functions ==&lt;br /&gt;
* function [https://www.lua.org/pil/8.3.html assert(), error()] issues an error&lt;br /&gt;
* function [https://www.lua.org/pil/7.3.html ipairs(), pairs(), next()] traverse tables&lt;br /&gt;
* function [https://www.lua.org/pil/2.4.html tonumber(), tostring()] data type conversion&lt;br /&gt;
* function [https://www.lua.org/pil/8.4.html pcall()] protected call function (handles error inside the function)&lt;br /&gt;
* function [https://www.lua.org/pil/5.2.html select()] selects from multiple return value&lt;br /&gt;
* function [https://www.lua.org/pil/2.html unpack] converts table into multiple values&lt;br /&gt;
* function [https://www.lua.org/pil/2.html type()] returns variable type&lt;br /&gt;
* function [https://www.lua.org/pil/22.1.html os.date(), os.time()] system date and time&lt;br /&gt;
* function os.difftime() returns time span between two times&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous ==&lt;br /&gt;
* function [[Function log()|log()]] - insert a record to the socket's event log&lt;br /&gt;
* function [[Function logf()|logf()]] - insert a formated record (incl. numbers) to the socket's event log&lt;br /&gt;
* function [[Function delay()|delay()]] - execute function with delay (seconds)&lt;br /&gt;
* function [[Function milliDelay()|milliDelay()]] - execute function with delay (milliseconds)&lt;br /&gt;
* function [[Function toboolean()|toboolean()]] - converts any variable to boolean type&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=NETIO_Lua_Reference&amp;diff=380</id>
		<title>NETIO Lua Reference</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=NETIO_Lua_Reference&amp;diff=380"/>
		<updated>2019-06-19T13:53:45Z</updated>

		<summary type="html">&lt;p&gt;Phrych: /* Socket Communication */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Outlet Management ==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt; devices.system &amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
* function [[Function devices.system.SetOut()|.SetOut()]] - turns the outlet on or off&lt;br /&gt;
* function [[Function devices.system.ResetOut()|.ResetOut()]] - turns the outlet off and then resets its previous state&lt;br /&gt;
* string [[String devices.system.output1_state|.output1_state]] - outlet's state&lt;br /&gt;
* number [[Number devices.system.output1_consumption|.output1_consumption]] - outlet's consumption (in Watts)&lt;br /&gt;
* number [[Number devices.system.output1_cumulatedConsumption|.output1_cumulatedConsumption]] - outlet's consumed energy (in Watthours)&lt;br /&gt;
* function [[Function devices.system.resetCumulativeConsumption()|.resetCumulativeConsumption()]] - resets outlet's energy counter&lt;br /&gt;
* string [[String devices.system.output1_consumptionStart|.output1_consumptionStart]] - date and time since the last energy counter reset&lt;br /&gt;
&lt;br /&gt;
== Socket System Management ==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt; devices.system&amp;lt;/b&amp;gt; &amp;lt;/big&amp;gt;&lt;br /&gt;
* number [[number devices.system.averageLoad|.averageLoad]] - socket's CPU load&lt;br /&gt;
* function [[Function devices.system.Reboot()|.Reboot()]] - reboot socket's system&lt;br /&gt;
* number [[Number devices.system.sessionCount|.sessionCount]] - number of connected users&lt;br /&gt;
* number [[Number devices.system.freeSpace|.freeSpace]] - free disk space&lt;br /&gt;
* number [[Number devices.system.totalSpace|.totalSpace]] - total disk space&lt;br /&gt;
* string [[String devices.system.serialNumber|.serialNumber]] &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;3.3.0&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; - returns serial number of the device (Eth Interface MAC address)&lt;br /&gt;
* number [[Number devices.system.voltage|.voltage]] - socket's voltage&lt;br /&gt;
* number [[Number devices.system.overallPowerFactor|.overallPowerFactor]] - overall power factor&lt;br /&gt;
* number [[Number devices.system.frequency|.frequency]] - socket's frequency&lt;br /&gt;
* number [[Number devices.system.totalCurrent|.totalCurrent]] - total current through socket&lt;br /&gt;
* number [[Number devices.system.totalLoad|.totalLoad]] - total load on socket&lt;br /&gt;
* number [[Number devices.system.totalEnergy|.totalEnergy]] - total energy consumed by socket&lt;br /&gt;
* string [[Number devices.system.energyStart|.energyStart]] - time of last consumption reset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Socket Communication ==&lt;br /&gt;
* function [[Function ping()|ping()]] - tests socket's network responsivity&lt;br /&gt;
* function [[Function mail()|mail()]] - sends e-mail&lt;br /&gt;
* function [[Function devices.system.CustomCGI()|devices.system.CustomCGI()]] - send HTTP request&lt;br /&gt;
* function [[Function cgiGet()|cgiGet()]] &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;2.3.5&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; - send HTTP request and receive response&lt;br /&gt;
* table [[Table event.args|event.args]] - HTTP GET /event variables table&lt;br /&gt;
* function [[Function snmpGet()]] - send SNMP request&lt;br /&gt;
&lt;br /&gt;
== XML Processing &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;2.3.6&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; ==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;xml&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
* function [[Function xml.escape()|.escape()]] - escapes XML string to fit xml node contents&lt;br /&gt;
* function [[Function xml.check()|.check()]] - tests if string is well-formed XML&lt;br /&gt;
* function [[Function xml.parse()|.parse()]] - parses XML string into [[Function xml.parse()#XmlElement|XmlElement]] object&lt;br /&gt;
&lt;br /&gt;
== JSON Processing &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;3.3.0&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; ==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;json&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt; &lt;br /&gt;
* function [[Function json.decode()|.decode()]] - parse json string into obj table&lt;br /&gt;
* function [[Function json.encode()|.encode()]] - generate JSON string from table&lt;br /&gt;
&lt;br /&gt;
(based on [http://dkolf.de/src/dkjson-lua.fsl/home dkjson])&lt;br /&gt;
&lt;br /&gt;
== Standard Lua Functions ==&lt;br /&gt;
* function [https://www.lua.org/pil/8.3.html assert(), error()] issues an error&lt;br /&gt;
* function [https://www.lua.org/pil/7.3.html ipairs(), pairs(), next()] traverse tables&lt;br /&gt;
* function [https://www.lua.org/pil/2.4.html tonumber(), tostring()] data type conversion&lt;br /&gt;
* function [https://www.lua.org/pil/8.4.html pcall()] protected call function (handles error inside the function)&lt;br /&gt;
* function [https://www.lua.org/pil/5.2.html select()] selects from multiple return value&lt;br /&gt;
* function [https://www.lua.org/pil/2.html unpack] converts table into multiple values&lt;br /&gt;
* function [https://www.lua.org/pil/2.html type()] returns variable type&lt;br /&gt;
* function [https://www.lua.org/pil/22.1.html os.date(), os.time()] system date and time&lt;br /&gt;
* function os.difftime() returns time span between two times&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous ==&lt;br /&gt;
* function [[Function log()|log()]] - insert a record to the socket's event log&lt;br /&gt;
* function [[Function logf()|logf()]] - insert a formated record (incl. numbers) to the socket's event log&lt;br /&gt;
* function [[Function delay()|delay()]] - execute function with delay (seconds)&lt;br /&gt;
* function [[Function milliDelay()|milliDelay()]] - execute function with delay (milliseconds)&lt;br /&gt;
* function [[Function toboolean()|toboolean()]] - converts any variable to boolean type&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Number_devices.system.voltage&amp;diff=379</id>
		<title>Number devices.system.voltage</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Number_devices.system.voltage&amp;diff=379"/>
		<updated>2019-06-19T13:47:34Z</updated>

		<summary type="html">&lt;p&gt;Phrych: Created page with &amp;quot;{{DISPLAYTITLE:number devices.system.voltage}} Returns the voltage (in millivolts) on the socket. &amp;lt;b&amp;gt;The property is read only!&amp;lt;/b&amp;gt;   &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;devices.system.voltag...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:number devices.system.voltage}}&lt;br /&gt;
Returns the voltage (in millivolts) on the socket. &amp;lt;b&amp;gt;The property is read only!&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;devices.system.voltage&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Value ===&lt;br /&gt;
&amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; voltage on socket (in millivolts)&lt;br /&gt;
&lt;br /&gt;
=== Usage ===&lt;br /&gt;
 -- log voltage of the socket&lt;br /&gt;
 logf(&amp;quot;voltage: %d&amp;quot;, devices.system.voltage)&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=NETIO_Lua_Reference&amp;diff=378</id>
		<title>NETIO Lua Reference</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=NETIO_Lua_Reference&amp;diff=378"/>
		<updated>2019-06-19T13:38:23Z</updated>

		<summary type="html">&lt;p&gt;Phrych: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Outlet Management ==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt; devices.system &amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
* function [[Function devices.system.SetOut()|.SetOut()]] - turns the outlet on or off&lt;br /&gt;
* function [[Function devices.system.ResetOut()|.ResetOut()]] - turns the outlet off and then resets its previous state&lt;br /&gt;
* string [[String devices.system.output1_state|.output1_state]] - outlet's state&lt;br /&gt;
* number [[Number devices.system.output1_consumption|.output1_consumption]] - outlet's consumption (in Watts)&lt;br /&gt;
* number [[Number devices.system.output1_cumulatedConsumption|.output1_cumulatedConsumption]] - outlet's consumed energy (in Watthours)&lt;br /&gt;
* function [[Function devices.system.resetCumulativeConsumption()|.resetCumulativeConsumption()]] - resets outlet's energy counter&lt;br /&gt;
* string [[String devices.system.output1_consumptionStart|.output1_consumptionStart]] - date and time since the last energy counter reset&lt;br /&gt;
&lt;br /&gt;
== Socket System Management ==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt; devices.system&amp;lt;/b&amp;gt; &amp;lt;/big&amp;gt;&lt;br /&gt;
* number [[number devices.system.averageLoad|.averageLoad]] - socket's CPU load&lt;br /&gt;
* function [[Function devices.system.Reboot()|.Reboot()]] - reboot socket's system&lt;br /&gt;
* number [[Number devices.system.sessionCount|.sessionCount]] - number of connected users&lt;br /&gt;
* number [[Number devices.system.freeSpace|.freeSpace]] - free disk space&lt;br /&gt;
* number [[Number devices.system.totalSpace|.totalSpace]] - total disk space&lt;br /&gt;
* string [[String devices.system.serialNumber|.serialNumber]] &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;3.3.0&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; - returns serial number of the device (Eth Interface MAC address)&lt;br /&gt;
* number [[Number devices.system.voltage|.voltage]] - socket's voltage&lt;br /&gt;
* number [[Number devices.system.overallPowerFactor|.overallPowerFactor]] - overall power factor&lt;br /&gt;
* number [[Number devices.system.frequency|.frequency]] - socket's frequency&lt;br /&gt;
* number [[Number devices.system.totalCurrent|.totalCurrent]] - total current through socket&lt;br /&gt;
* number [[Number devices.system.totalLoad|.totalLoad]] - total load on socket&lt;br /&gt;
* number [[Number devices.system.totalEnergy|.totalEnergy]] - total energy consumed by socket&lt;br /&gt;
* string [[Number devices.system.energyStart|.energyStart]] - time of last consumption reset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Socket Communication ==&lt;br /&gt;
* function [[Function ping()|ping()]] - tests socket's network responsivity&lt;br /&gt;
* function [[Function mail()|mail()]] - sends e-mail&lt;br /&gt;
* function [[Function devices.system.CustomCGI()|devices.system.CustomCGI()]] - send HTTP request&lt;br /&gt;
* function [[Function cgiGet()|cgiGet()]] &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;2.3.5&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; - send HTTP request and receive response&lt;br /&gt;
* table [[Table event.args|event.args]] - HTTP GET /event variables table&lt;br /&gt;
&lt;br /&gt;
== XML Processing &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;2.3.6&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; ==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;xml&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
* function [[Function xml.escape()|.escape()]] - escapes XML string to fit xml node contents&lt;br /&gt;
* function [[Function xml.check()|.check()]] - tests if string is well-formed XML&lt;br /&gt;
* function [[Function xml.parse()|.parse()]] - parses XML string into [[Function xml.parse()#XmlElement|XmlElement]] object&lt;br /&gt;
&lt;br /&gt;
== JSON Processing &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;3.3.0&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; ==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;json&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt; &lt;br /&gt;
* function [[Function json.decode()|.decode()]] - parse json string into obj table&lt;br /&gt;
* function [[Function json.encode()|.encode()]] - generate JSON string from table&lt;br /&gt;
&lt;br /&gt;
(based on [http://dkolf.de/src/dkjson-lua.fsl/home dkjson])&lt;br /&gt;
&lt;br /&gt;
== Standard Lua Functions ==&lt;br /&gt;
* function [https://www.lua.org/pil/8.3.html assert(), error()] issues an error&lt;br /&gt;
* function [https://www.lua.org/pil/7.3.html ipairs(), pairs(), next()] traverse tables&lt;br /&gt;
* function [https://www.lua.org/pil/2.4.html tonumber(), tostring()] data type conversion&lt;br /&gt;
* function [https://www.lua.org/pil/8.4.html pcall()] protected call function (handles error inside the function)&lt;br /&gt;
* function [https://www.lua.org/pil/5.2.html select()] selects from multiple return value&lt;br /&gt;
* function [https://www.lua.org/pil/2.html unpack] converts table into multiple values&lt;br /&gt;
* function [https://www.lua.org/pil/2.html type()] returns variable type&lt;br /&gt;
* function [https://www.lua.org/pil/22.1.html os.date(), os.time()] system date and time&lt;br /&gt;
* function os.difftime() returns time span between two times&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous ==&lt;br /&gt;
* function [[Function log()|log()]] - insert a record to the socket's event log&lt;br /&gt;
* function [[Function logf()|logf()]] - insert a formated record (incl. numbers) to the socket's event log&lt;br /&gt;
* function [[Function delay()|delay()]] - execute function with delay (seconds)&lt;br /&gt;
* function [[Function milliDelay()|milliDelay()]] - execute function with delay (milliseconds)&lt;br /&gt;
* function [[Function toboolean()|toboolean()]] - converts any variable to boolean type&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=NETIO_Lua_Reference&amp;diff=377</id>
		<title>NETIO Lua Reference</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=NETIO_Lua_Reference&amp;diff=377"/>
		<updated>2019-06-19T13:35:38Z</updated>

		<summary type="html">&lt;p&gt;Phrych: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Outlet Management ==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt; devices.system &amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
* function [[Function devices.system.SetOut()|.SetOut()]] - turns the outlet on or off&lt;br /&gt;
* function [[Function devices.system.ResetOut()|.ResetOut()]] - turns the outlet off and then resets its previous state&lt;br /&gt;
* string [[String devices.system.output1_state|.output1_state]] - outlet's state&lt;br /&gt;
* number [[Number devices.system.output1_consumption|.output1_consumption]] - outlet's consumption (in Watts)&lt;br /&gt;
* number [[Number devices.system.output1_cumulatedConsumption|.output1_cumulatedConsumption]] - outlet's consumed energy (in Watthours)&lt;br /&gt;
* function [[Function devices.system.resetCumulativeConsumption()|.resetCumulativeConsumption()]] - resets outlet's energy counter&lt;br /&gt;
* string [[String devices.system.output1_consumptionStart|.output1_consumptionStart]] - date and time since the last energy counter reset&lt;br /&gt;
&lt;br /&gt;
== Socket System Management ==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt; devices.system&amp;lt;/b&amp;gt; &amp;lt;/big&amp;gt;&lt;br /&gt;
* number [[number devices.system.averageLoad|.averageLoad]] - socket's CPU load&lt;br /&gt;
* function [[Function devices.system.Reboot()|.Reboot()]] - reboot socket's system&lt;br /&gt;
* number [[Number devices.system.sessionCount|.sessionCount]] - number of connected users&lt;br /&gt;
* number [[Number devices.system.freeSpace|.freeSpace]] - free disk space&lt;br /&gt;
* number [[Number devices.system.totalSpace|.totalSpace]] - total disk space&lt;br /&gt;
* string [[String devices.system.serialNumber|.serialNumber]] &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;3.3.0&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; - returns serial number of the device (Eth Interface MAC address)&lt;br /&gt;
* number [[Number devices.system.voltage|.voltage]] - socket's voltage&lt;br /&gt;
* number [[Number devices.system.overallPowerFactor|.overallPowerFactor]] - overall power factor&lt;br /&gt;
* number [[Number devices.system.frequency|.frequency]] - socket's frequency&lt;br /&gt;
* number [[Number devices.system.totalCurrent|.totalCurrent]] - total current through socket&lt;br /&gt;
* number [[Number devices.system.totalLoad|.totalLoad]] - total load on socket&lt;br /&gt;
* number [[Number devices.system.totalEnergy|.totalEnergy]] - total energy consumed by socket&lt;br /&gt;
* number [[Number devices.system.energyStart|.energyStart]] - time of last consumption reset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Socket Communication ==&lt;br /&gt;
* function [[Function ping()|ping()]] - tests socket's network responsivity&lt;br /&gt;
* function [[Function mail()|mail()]] - sends e-mail&lt;br /&gt;
* function [[Function devices.system.CustomCGI()|devices.system.CustomCGI()]] - send HTTP request&lt;br /&gt;
* function [[Function cgiGet()|cgiGet()]] &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;2.3.5&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; - send HTTP request and receive response&lt;br /&gt;
* table [[Table event.args|event.args]] - HTTP GET /event variables table&lt;br /&gt;
&lt;br /&gt;
== XML Processing &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;2.3.6&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; ==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;xml&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
* function [[Function xml.escape()|.escape()]] - escapes XML string to fit xml node contents&lt;br /&gt;
* function [[Function xml.check()|.check()]] - tests if string is well-formed XML&lt;br /&gt;
* function [[Function xml.parse()|.parse()]] - parses XML string into [[Function xml.parse()#XmlElement|XmlElement]] object&lt;br /&gt;
&lt;br /&gt;
== JSON Processing &amp;lt;sup&amp;gt;&amp;lt;code&amp;gt;3.3.0&amp;lt;/code&amp;gt;&amp;lt;/sup&amp;gt; ==&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;json&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt; &lt;br /&gt;
* function [[Function json.decode()|.decode()]] - parse json string into obj table&lt;br /&gt;
* function [[Function json.encode()|.encode()]] - generate JSON string from table&lt;br /&gt;
&lt;br /&gt;
(based on [http://dkolf.de/src/dkjson-lua.fsl/home dkjson])&lt;br /&gt;
&lt;br /&gt;
== Standard Lua Functions ==&lt;br /&gt;
* function [https://www.lua.org/pil/8.3.html assert(), error()] issues an error&lt;br /&gt;
* function [https://www.lua.org/pil/7.3.html ipairs(), pairs(), next()] traverse tables&lt;br /&gt;
* function [https://www.lua.org/pil/2.4.html tonumber(), tostring()] data type conversion&lt;br /&gt;
* function [https://www.lua.org/pil/8.4.html pcall()] protected call function (handles error inside the function)&lt;br /&gt;
* function [https://www.lua.org/pil/5.2.html select()] selects from multiple return value&lt;br /&gt;
* function [https://www.lua.org/pil/2.html unpack] converts table into multiple values&lt;br /&gt;
* function [https://www.lua.org/pil/2.html type()] returns variable type&lt;br /&gt;
* function [https://www.lua.org/pil/22.1.html os.date(), os.time()] system date and time&lt;br /&gt;
* function os.difftime() returns time span between two times&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous ==&lt;br /&gt;
* function [[Function log()|log()]] - insert a record to the socket's event log&lt;br /&gt;
* function [[Function logf()|logf()]] - insert a formated record (incl. numbers) to the socket's event log&lt;br /&gt;
* function [[Function delay()|delay()]] - execute function with delay (seconds)&lt;br /&gt;
* function [[Function milliDelay()|milliDelay()]] - execute function with delay (milliseconds)&lt;br /&gt;
* function [[Function toboolean()|toboolean()]] - converts any variable to boolean type&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Function_cgiGet()&amp;diff=370</id>
		<title>Function cgiGet()</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Function_cgiGet()&amp;diff=370"/>
		<updated>2018-02-01T10:24:26Z</updated>

		<summary type="html">&lt;p&gt;Phrych: /* Usage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:function cgiGet()}}&lt;br /&gt;
Execute HTTP GET call to given url and read the response. The call is asynchronous: the code execution proceeds immediately and when the response arrives, callback function is called. To perform simple HTTP GET call without response handling, use simpler [[Devices.system.CustomCGI()|devices.system.CustomCGI()]]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;i&amp;gt;nil&amp;lt;/i&amp;gt; &amp;lt;b&amp;gt;devices.system.cgiGet&amp;lt;/b&amp;gt;(&amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
 &amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; config{&amp;lt;code&amp;gt;url&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;callback&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;color: #777&amp;quot;&amp;gt;timeout&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;color: #777&amp;quot;&amp;gt;bufferSize&amp;lt;/code&amp;gt;}&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;url&amp;lt;/code&amp;gt; address to call&lt;br /&gt;
* &amp;lt;i&amp;gt;function{response}&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;callback&amp;lt;/code&amp;gt; this function is called when response arrives&lt;br /&gt;
* optional &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;timeout&amp;lt;/code&amp;gt; maximum seconds to wait for response (default 30)&lt;br /&gt;
* optional &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;bufferSize&amp;lt;/code&amp;gt; bytes of memory to allocate for response (min. 4k, max 1M)&lt;br /&gt;
&lt;br /&gt;
=== Callback Parameters ===&lt;br /&gt;
 &amp;lt;i&amp;gt;table&amp;lt;/i&amp;gt; response{&amp;lt;code&amp;gt;result&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;errInfo&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;received&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;buffer&amp;lt;/code&amp;gt;}&lt;br /&gt;
* &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;result&amp;lt;/code&amp;gt; error code of the response (see below)&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;errInfo&amp;lt;/code&amp;gt; error description (if result&amp;gt;0)&lt;br /&gt;
* &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;received&amp;lt;/code&amp;gt; response length&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;buffer&amp;lt;/code&amp;gt; response body&lt;br /&gt;
&lt;br /&gt;
=== Error Code of the response ===&lt;br /&gt;
* 0 success, response HTTP/GET 2xx&lt;br /&gt;
* 22 response HTTP/GET 4xx&lt;br /&gt;
* 27 buffer overflow&lt;br /&gt;
* 28 response is timed out&lt;br /&gt;
&lt;br /&gt;
=== Return value ===&lt;br /&gt;
 nil&lt;br /&gt;
&lt;br /&gt;
=== Usage ===&lt;br /&gt;
 -- callback function to read the response&lt;br /&gt;
 local function getResponse(response)&lt;br /&gt;
   if response.result &amp;gt; 0 then&lt;br /&gt;
     logf(&amp;quot;response failed with error code %d.&amp;quot;, response.result)&lt;br /&gt;
   else&lt;br /&gt;
     logf(&amp;quot;current credit is %d&amp;quot;, tonumber(response.buffer))&lt;br /&gt;
   end&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 -- sends HTTP request and handles the response&lt;br /&gt;
 devices.system.CgiGet{url=&amp;quot;http://example.com/getcredit?id=42&amp;quot;, callback=getResponse}&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
Netio FirmWare 2.3.5+&lt;br /&gt;
&lt;br /&gt;
=== See also ===&lt;br /&gt;
* [[Devices.system.CustomCGI()|devices.system.CustomCGI()]] to send HTTP request without response handling&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Mail()&amp;diff=127</id>
		<title>Mail()</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Mail()&amp;diff=127"/>
		<updated>2016-11-21T09:43:02Z</updated>

		<summary type="html">&lt;p&gt;Phrych: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;Funkce sloužící k poslání emailu&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Kategorie:''' Systémová funkce&lt;br /&gt;
&lt;br /&gt;
'''Klíčová slova:''' email, mail, oznámení, zpráva&lt;br /&gt;
&lt;br /&gt;
'''Syntaxe:''' mail(&amp;quot;my.email@example.com&amp;quot;, &amp;quot;subject&amp;quot;, &amp;quot;message content&amp;quot;, limit)&lt;br /&gt;
&lt;br /&gt;
'''Parametry:''' &lt;br /&gt;
* emailová adresa příjemce&lt;br /&gt;
* předmět zprávy&lt;br /&gt;
* text zprávy&lt;br /&gt;
* čas(sekundy), za který bude možné odeslat další email (nepovinný)&lt;br /&gt;
&lt;br /&gt;
Poznámka: všechny parametry jsou string, musí tedy být v uvozovkách &lt;br /&gt;
&lt;br /&gt;
'''Example:'''&lt;br /&gt;
Odeslání emailu na adresu frantisek.dobrota@email.cz. Předmět zprávy: Netio. Text zprávy: Email z mojí zásuvky.&lt;br /&gt;
 mail(&amp;quot;frantisek.dobrota@email.cz&amp;quot;, &amp;quot;Netio&amp;quot;, &amp;quot;Email z mojí zásuvky.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
'''Podporovaná verze firmwaru:'''&lt;br /&gt;
2.3.2 a vyšší&lt;br /&gt;
&lt;br /&gt;
'''Použito v:'''&lt;br /&gt;
*AN02 - Hlídání spotřeby zásuvky&lt;br /&gt;
*AN03 - dalsi note&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Devices.system.outputN_state&amp;diff=126</id>
		<title>Devices.system.outputN state</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Devices.system.outputN_state&amp;diff=126"/>
		<updated>2016-10-24T11:47:39Z</updated>

		<summary type="html">&lt;p&gt;Phrych: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;Funkce sloužící k zjištění stavu zásuvky&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Kategorie:''' Systémová funkce&lt;br /&gt;
&lt;br /&gt;
'''Klíčová slova:''' stav zásuvky, stav, output&lt;br /&gt;
&lt;br /&gt;
'''Návratová hodnota:''' String on pokud je zásuvka zapnutá, v opačném případě funkce vrátí string off&lt;br /&gt;
&lt;br /&gt;
'''Syntaxe:''' devices.system.outputN_state&lt;br /&gt;
&lt;br /&gt;
'''Poznámka:''' &lt;br /&gt;
* místo &amp;quot;N&amp;quot; je nutné uvést číslo zásuvky&lt;br /&gt;
'''Example'''&lt;br /&gt;
&lt;br /&gt;
Zjištění stavu zásuvky 1&lt;br /&gt;
 devices.system.output1_state&lt;br /&gt;
Zjištění stavu zásuvky 2&lt;br /&gt;
 devices.system.output2_state&lt;br /&gt;
Zjištění stavu zásuvky 3&lt;br /&gt;
 devices.system.output3_state&lt;br /&gt;
Zjištění stavu zásuvky 4&lt;br /&gt;
 devices.system.output4_state&lt;br /&gt;
Použití funkce pro zjištění stavu zásuvky 1 a jeho změny&lt;br /&gt;
 if devices.system.output1_state == 'on' then  &lt;br /&gt;
   devices.system.SetOut{output=1,value=false}&lt;br /&gt;
 else&lt;br /&gt;
   devices.system.SetOut{output=1, value=true}&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
'''Podporovaná verze firmwaru:'''&lt;br /&gt;
2.3.2 a vyšší&lt;br /&gt;
&lt;br /&gt;
'''Použito v:'''&lt;br /&gt;
*AN01 - Ovládání NETIO4 zásuvek URL adresou&lt;br /&gt;
*AN02 - dalsi note&lt;br /&gt;
*AN03 - dalsi note&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Toboolean()&amp;diff=125</id>
		<title>Toboolean()</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Toboolean()&amp;diff=125"/>
		<updated>2016-10-17T15:53:29Z</updated>

		<summary type="html">&lt;p&gt;Phrych: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;Funkce sloužící k převedení proměnné na boolean/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Kategorie:''' Systémová funkce&lt;br /&gt;
&lt;br /&gt;
'''Klíčova slova:''' boolean, convert to boolean, převod na boolean&lt;br /&gt;
&lt;br /&gt;
'''Syntaxe:''' toboolean(promenna)&lt;br /&gt;
&lt;br /&gt;
'''Paramtery:''' &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Pro převod proměnných platí následující pravidla:&lt;br /&gt;
|-&lt;br /&gt;
! type !! conversion rule !! examples&lt;br /&gt;
|-&lt;br /&gt;
| číslo&lt;br /&gt;
| všechna nenulová čísla jsou true&lt;br /&gt;
| &amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
toboolean(1) --&amp;gt; true&lt;br /&gt;
toboolean(0) --&amp;gt; false&lt;br /&gt;
toboolean(-1) --&amp;gt; true (-1 je nenulové)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| boolean&lt;br /&gt;
| false je false, true je true&lt;br /&gt;
| &amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
toboolean(true) --&amp;gt; true&lt;br /&gt;
toboolean(false) --&amp;gt; false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| string&lt;br /&gt;
| všechny neprázné stringy jsou true&lt;br /&gt;
| &amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
toboolean('hello') --&amp;gt; true&lt;br /&gt;
toboolean('false') --&amp;gt; true (neprázdný string)&lt;br /&gt;
toboolean('') --&amp;gt; false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| tabulka&lt;br /&gt;
| neprázdné tabulky jsou true&lt;br /&gt;
| &amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
toboolean({1}) --&amp;gt; true (neprázdná tabulka)&lt;br /&gt;
toboolean({false}) --&amp;gt; true (neprázdná tabulka)&lt;br /&gt;
toboolean({}) --&amp;gt; false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| nil&lt;br /&gt;
| speciální hodnota nil je false&lt;br /&gt;
| &amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
toboolean(nil) --&amp;gt; false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ostatní&lt;br /&gt;
| všechny ostatní hodnoty jsou true&lt;br /&gt;
| &amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
toboolean(function() return false end) --&amp;gt; true&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Example'''&lt;br /&gt;
Následující kód převede proměnnou &amp;quot;number&amp;quot; na boolean &amp;quot;bool&amp;quot;&lt;br /&gt;
 local number = 5&lt;br /&gt;
 local bool = toboolean(number)&lt;br /&gt;
&lt;br /&gt;
'''Podporovaná verze firmwaru:'''&lt;br /&gt;
2.3.2 a vyšší&lt;br /&gt;
&lt;br /&gt;
'''Použito v:'''&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Devices.system.SetOut()&amp;diff=124</id>
		<title>Devices.system.SetOut()</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Devices.system.SetOut()&amp;diff=124"/>
		<updated>2016-10-17T13:34:31Z</updated>

		<summary type="html">&lt;p&gt;Phrych: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;Funkce sloužící k zapínání a vypínání zásuvky&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Kategorie:''' Systémová funkce&lt;br /&gt;
&lt;br /&gt;
'''Klíčova slova:''' zapnutí zásuvky, vypnutí zásuvky, zapnout, vypnout, system, out, output, value, on, off&lt;br /&gt;
&lt;br /&gt;
'''Syntaxe:''' devices.system.SetOut{output=1, value=true}&lt;br /&gt;
&lt;br /&gt;
'''Paramtery:''' &lt;br /&gt;
* output - 1,2,3,4&lt;br /&gt;
** číslo zásuvky&lt;br /&gt;
* value - true/false&lt;br /&gt;
** true pro zapnutí&lt;br /&gt;
** false pro vypnutí&lt;br /&gt;
'''Example'''&lt;br /&gt;
Následující kód zapíná zásuvku číslo 3&lt;br /&gt;
 devices.system.SetOut{output=3, value=true}&lt;br /&gt;
&lt;br /&gt;
'''Podporovaná verze firmwaru:'''&lt;br /&gt;
2.3.2 a vyšší&lt;br /&gt;
&lt;br /&gt;
'''Použito v:'''&lt;br /&gt;
*AN01 - Ovládání NETIO4 zásuvek URL adresou&lt;br /&gt;
*AN02 - dalsi note&lt;br /&gt;
*AN03 - dalsi note&lt;/div&gt;</summary>
		<author><name>Phrych</name></author>
		
	</entry>
</feed>