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
Proměnnése dají zřetězit za dvou teček " .. ", ale musí se jednat o proměnnou stejného typu

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


andmusí platit sloučasně
ormusí platit alespoň jedna z podmínek
notnegace


-- 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í