TABLE OF CONTENTS
Úvod
Původně byla Lua vyvinuta za účelem zlepšení funkcionality stávajících aplikací, časem se z ní stal samostatný programovací jazyk, který je v mnohém podobný legendárnímu Pascalu.
Vytvořena byla v roce 1993 v Tecgrafu, tehdy známém jako počítačová grafická technologická skupina PUC-Rio, jako odpověď na zvýšenou poptávku po větším uzpůsobení programů. Naprogramována je na ANSI C a má vcelku jednoduché C API, to znamená značnou kompatibilitu napříč platformami. Lua je vyvíjena, implementována, udržována týmem v PUC-Rio (Katolická Univerzita v Rio de Janeiru).
Lua znamená v portugalštině měsíc. Nicméně název není zkratka a jediný správný způsob zápisu je „Lua“.
Hlavními výhodami jsou: jednoduchost, efektivita, a přenosnost kódu. Kompletní dokumentaci k LUA naleznete na oficiálních stránkách: http://www.lua.org/manual/5.1/. V tomto článku se dočtete základní tipy a logické postupy při programování v jazyce lua.
Struktura kódu
Stejně jako v ostatních jazycích se i v Lua píše kód řádků jeden pod druhý. Není zapotřebí ukončovacích znaků na konci každé řádky (nicméně Lua ignoruje ; na koncích řádku, takže se nebudete muset odnaučit zvyky z jiných jazyků kde je ukončování řádků nutné).
Scény vs Rychlé aplikace
Scény se od rychlých aplikací liší v deklaraci proměnných a některých funkcích. O rychlých aplikací vznikne samostatný článek.
Stanovení lokálních proměnných
Proměnné jsou nutné z důvodu, že se do nich ukládají hodnoty, například ze zařízení pro další zpracování.
Pro stanovení lokální proměnné stačí napsat:
local <nazev_promenne>
případně rovnou stanovit proměnnou s její hodnotu:
local <nazev_promenne> = <hodnota>
příklad:
local promenna local textovaPromenna = "Ahoj světe!" local ciselnaPromenna = 123
příklad:
-- deklarace proměnných
-- pokud proměnné následně mají tvořit věty, tak doporučujeme mezeru zařadit již do proměnné, pokud je to možné
local text1 = "I "
local text2 = "love "
local text3 = "Home Center 3!"
local text4 = "Hello my name is "
local result1 = text1 .. text2 .. text3 -- spojení třech proměnných do jedné.
-- pokud by mezery nebyli v proměnné zahrnuty, tak by proměnná result vypadala následovně:
-- local result = text1 .. " " .. text2 .. " " .. text3
local result2 = text4 .. "Lili" -- přidání textu k roměnné
-- Zobrazí: "I love Home Center 2!"
fibaro.debug("luaEntryScene", result1)
-- Zobrazí: "Hello my name is Lili"
fibaro.debug("luaEntryScene", result2)Podmíněné příkazy
Pokud chcete, aby se něco stalo pouze za určitých podmínek, tak je nutné je nadefinovat:
if <podminka> then
<prikaz 1>
elseif <podminka> then
<prikaz 2>
elseif <podminka> then
<prikaz 3>
else
<prikaz 4>
endPříklad:
if a == 1 then -- pokud je proměnná a rovna 1 tak ...
b = 2 -- do proměnné b ulož hodnotu 2 ...
c = 3 -- do proměnné c ulož hodnotu 3 ...
elseif a == 2 then -- ... nebo pokud je proměnná a rovna 2 tak ...
b = 3 -- do proměnné b ulož hodnotu 3 ...
c = 4 -- do proměnné c ulož hodnotu 4 ...
else -- jinak vykonej následující příkazy (pokud proměnná a nemá hodnotu 1 ani 2)
b = 4 -- do proměnné b ulož hodnotu 4 ...
c = 5 -- do proměnné c ulož hodnotu 5
end -- konec podmínkyOperátory
Základní operátory
| == | rovnost |
| ~= | nerovnost |
| > | větší |
| < | menší |
| >= | vetší či rovno |
| <= | menší či rovno |
local a = 2
local b = 3
local c = 5
-- Zobrazí textový řetězec "a je rovno nebo menší než b"
if (a > b) then
fibaro.debug("luaEntryScene", "a je větší než b")
else
fibaro.debug("luaEntryScene", "a je rovno nebo menší než b")
end
-- Zobrazí textový řetězec "c se rovná 5"
if (c ~= 5)
fibaro.debug("luaEntryScene", "c se nerovná 5")
else
fibaro.debug("luaEntryScene", "c se rovná 5")
endMatematické operátory
| + | součet |
| - | odečet |
| * | násobení |
| / | dělení |
| % | zbytek jedné proměnné po dělení jinou |
-- deklarace proměnných
local a = 2
local b = 3
local c = 5
-- matemarické výpočty
local result1 = a + b + c -- sčítání
local result2 = b / a -- dělení
local result3 = b * c -- násobení
local result4 = c % a -- zbytek po dělení
-- Zobraz: "a + b + c = 10"
fibaro.debug("luaEntryScene", 'a + b + c = ' .. result1)
-- Zobraz: "b / a = 1,5"
fibaro.debug("luaEntryScene", 'b / a = ' .. result2)
-- Zobraz: "b * c = 15"
fibaro.debug("luaEntryScene", 'b * c= ' .. result3)
-- Zobraz: "c % a = 3"
fibaro.debug("luaEntryScene", 'c % a = ' .. result4)Logické operátory
| and | musí platit sloučasně |
| or | musí platit alespoň jedna z podmínek |
| not | negace |
-- deklarace proměnných
local a = 2
local b = 3
local c = 5
-- Zobraz "true"
if (a == 2 and b == 3) then -- Pokud je a rovno 2 a současně b rovno 3, tak ....
fibaro.debug("luaEntryScene", 'true') -- ... zobraz true ...
else -- ... jinak ...
fibaro.debug("luaEntryScene", 'false') -- ... zobraz false.
end -- konec podmíněného příkazu
-- Zobraz "true" (protože c je rovno 5)
if (a ==5 or b == 5 or c == 5) then -- Pokud je a rovno 5 nebo b rovno 5 nebo c rovno 5, tak ....
fibaro.debug("luaEntryScene", 'true') -- ... zobraz true ...
else -- ... jinak ...
fibaro.debug("luaEntryScene", 'false') -- ... zobraz false.
end -- konec podmíněného příkazu
-- Zobrazí "false" protože c je rovno 5 a v tomto případě zjišťujeme zda není rovno 5.
if ( not (a ==5 or b == 5 or c == 5))then -- Pokud není a rovno 5 nebo b rovno 5 nebo c rovno 5, tak ....
fibaro.debug("luaEntryScene", 'true') -- ... zobraz true ...
else -- ... jinak ...
fibaro.debug("luaEntryScene", 'false') -- ... zobraz false.
end -- konec podmíněného příkazuNejužitečnější příkazy
Příkazy do verze 5.100 používají globální funkce fibaro.<prikaz/metoda>(), například fibaro.call(). od verze 5.101 lze používat funkci hub.<příkaz/metoda>, například hub.call().
fibaro.debug() / hub.debug()
- výstup je řetězec do debug konsole jenž je s příkazem asociována
- fibaro:debu(tag, text)
- tag: Slouží k filtrování v konzoli
- text: to co se má zobrazit v konzoli (hodnota proměnné, číslo, řetězec, ...)
- příklad:
-- Zobrazí se 'Hello world!' v konzoli
fibaro.debug("Entry Scene", 'Hello world!')fibaro.call() / hub.call()
- pošle požadavek zařízení aby provedlo žádanou akci
- fibaro.call(deviceID, actionName, ...)
- deviceID: jde o ID zařízení
- actionName: řetězec obsahující název akce jenž se má stát
- v některých případech bude akce vyžadovat více argumentů aby se mohla správně udát. Maximální počet argumentů je 7 na jedno deviceID a ActionName
- příklad:
fibaro.call(12, 'turnOff') -- Vypni zařízení s id 12 fibaro.call(12, 'setValue', 23) -- Nastavit na zařízení hodnotu 23 -> používá se u stmívačů, žaluzií, ...
- automatický převod, je nutné poznamenat že jsou všechny argumenty převáděny do řetězců. Nicméně není nutné tyto argumenty převádět do číselných typů, vzhledem k automatickým opravám se to provede sama řídící jednotka.
local a = 50 fibaro.call(12, 'setValue', a) -- Nastav na zařízení hodnotu uloženou v proměnné a
fibaro.get() / hub.get()
- zjistí stav a vlastnosti zařízení. Konkrétně hodnotu a poslední změnu
- je součástí skupiny příkazů (fibaro.get + Value / ModificationTime)
- Fibaro.get(DeviceID, PeopertyName)
- DeviceID: ID zařízení
- PropertyName: vlastnost jejíž hednotu zjišťujeme (například jas dle příkladu níže)
- tato funkce může vracet dvě hodnoty:
- řetězec obsahjící současnou hodnotu objěktu
- údaj o tom kdy se objekt naposledy změnil
- příklad:
-- Získání hodnoty a posladního času modifikace hodnoty jasu (brightness) ze zařízení 11
local value, modificationTime = fibaro.get(11, 'brightness)
-- v lue může být vynechána druhá návratová hodnota
-- v tomto případě také funguje
local value2 = fibaro.get(11, 'brightness')
-- Získané hodnoty mohou být použity pro různé věci ve scénách
-- Například vypni zařízení, pokud je jas nad 50
if (tonumber(value) > 50) then
fibaro.call(142, 'turnOff')
endfibaro.getValue() / hub.getValue()
- zjistí stav vlastnosi zařízení. konkrétně hodnotu
- je součástí skupiny příkazů (fibaro.get + Value / ModificationTime)
- fibaro.getValue (deviceID, propertyName)
- DeviceID: bude zjištěna identifikace zařízení
- PropertyName: jméno objěktu bude zjištěno
- řetězec obsahující současnou hodnotu objektu
Upozornění: tyto hodnoty jsou druhu řetězcovitého, pokud jej budete chtít porovnat s typem číselným budete muset nejdříve použít příkaz "tonumber" k jejich převedení na číselný
- příklad
-- Získání hodnoty parametru jas (brightness) ze zařízení 11
local value = fibaro.getValue(11, 'brightness')
-- Získaná hodnota může být použita dalším účelům
-- Například k vypnutí zařízení, pokud je jas nad 50%
if (tonumber(value) > 50) then
fibaro.call(142, 'turnOff')
endfibaro.getGlobalVariable() / hub.getGlobalVariable()
- zjisí hodnotu globální proměnné registrované v panelu proměnných
- vrací: řetězec obsahující současný stav proměnné
- Upozornění: tyto hodnoty jsou druhu řetězcovitého, pokud jej budete chtít porovnat s typem číselným budete muset nejdříve použít příkaz "tonumber" k jejich převedení na číselný
- příklad:
-- Získání pouze hodnoty isNight
local value = fibaro.getGlobalVariable('isNight')
-- hodnota předdefinované globální proměnné je vždy řetězcem-- na základě hodnoty lze vytvořit příkazy, které se mají stát, pokud je daná hodnota aktivní.
if (value == '1') then
fibaro.debug("entryScene", 'Je noc!')
endDalší zdroje informací
- HC3 Lua scenes part 1: Conditions explained by Joep Verhaeg
- HC3 Lua scenes part 2: Variables explained by Joep Verhaeg