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> end
Pří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ínky
Operá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") end
Matematické 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říkazu
Nejuž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') end
fibaro.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') end
fibaro.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!') end
Další zdroje informací
- HC3 Lua scenes part 1: Conditions explained by Joep Verhaeg
- HC3 Lua scenes part 2: Variables explained by Joep Verhaeg