NETIO Lua Manual
Contents
Debugging
To debug your code, use log() and logf() functions. See the output in system events log.
Conditions
Lua conditions has usual syntax, see here. Just keep in mind to merge else and if to elseif or multiple ends are required.
Note that falsy values are nil and false only. Empty string and 0 evaluates as true. If you come from C, you might be surprised by following snippet:
if devices.system.output1_consumption then
-- always happens, even if the consumption is 0
log("Outlet 1 is on")
end
if not devices.system.output1_consumption then
-- never happens, even if the consumption is 0
log("Outlet 1 is off")
end
Loops
Lua has break statement, but no continue (use condition inside loop instead).
While
While syntax is not different to other languages:
local i = 0
while i~=3 do
i = i + 1
logf("%d",i)
end
Repeat until
Repeat until syntax is the same as Pascal's, other languages have similar do-while loops:
local i = 0
repeat
i = i + 1
logf("%d",i)
until i==3
Numeric for
local arr = {2,3,7,5}
for i=1,#arr do logf("%d",arr[i]) end
for initVar,limit,increment do
- number assignment
initVarinits loop-local variable - number
limitloops until initVar reaches this value - optional number
incrementafter each loop initVar increment by this value (default 1)
Generic for
Is rather sophisticated. Most common example (the order of elements in pairs() is not guaranteed):
local tab = {one=1, two=2, three=3}
for key,val in pairs(tab) do logf("%s:%d",key,val) end
Generic for syntax
for var_1, ..., var_n in explist do block end
is equivalent to (Full explanation here.)
do
local _f, _s, _var = explist
while true do
local var_1, ... , var_n = _f(_s, _var)
_var = var_1
if _var == nil then break end
block
end
end
Iterator closure that holds its state
function iter(a)
local i = 0
return function()
i = i+1
return a[i]
end
end
local arr = {2,3,7,5}
for value in iter(arr) do
logf("%d",value)
end
Stateless iterator (in this case returns variable list: key and value)
function iter(a,i)
i = i+1
if a[i] then return i,a[i] end
end
local arr = {2,3,7,5}
for k,v in iter,arr,0 do
logf("%d:%d",k,v)
end
Same effect using ipairs() Lua function (without initial state)
for k,v in ipairs(arr) do
logf("%d:%d",k,v)
end
Now return to the most common example above using pairs() Lua function and read about pairs() and ipairs() implementation here.
Functions
Lua allows multiple results (comma separated):
function diskSpace()
return devices.system.freeSpace, devices.system.totalSpace
end
logf("Free space: %d MB", diskSpace())
local free,total = diskSpace()
logf("Free space: %d %%", 100*free/total)
Variable-length arguments are also available:
function sum(...)
local result = 0
for _,v in ipairs(arg) do
result = result + v
end
return result
end
logf("Sum: %d", sum(2,3,5))