Att koda LUA – hur svårt är det?

Ibland dyker det upp frågor om kodning som kanske inte alltid är så lätt i den grafiska versionen av scener, eller som någon av ren nyfikenhet helt enkelt vill lära sig LUA. Denna “guide” är på intet sätt fullständig – snarare tvärt om, det finns nog flera hål än tillgångar ;-) Men det är i alla fall början…

Börja med att skapa en scen:

Döp om den och flytta den till något lämpligt rum (jag har ett som kallas Diverse där udda saker hamnar):

Tryck SAVE!

Under fliken avancerat så finns ett val, här markerat i rött – byt till LUA baserad scenredigering – OK:

Godkänn bytet även på nästa bild – OK:

Och bara för att vara överjävligt säker, så godkänn igen – OK:

Du kommer nu till ett rått startläge:

Under de första raderna LUA kod så finns två (ibland 3, har med autostart att göra) “rubriker” där man definierar vilka “triggers” som skall användas:

En trigger är vad som startar en given scen. I mitt exempel nedan kommer vi nyttja en temperatursensor som är integrerad i en Aeon 4-in-1 sensor.

För att hitta vilken sensor som nyttjas i detta exempel så väljer man t.ex. att gå från listan till vänster “Enhetslistan”, väljer rum “Arbetsrum”, väljer den sensor jag döpt till “Temperatur” och då kommer dels ID värdet upp – det som brukar refereras till EnhetsID, alla “Egenskaper” och alla “Actions” denna enhet har:

Som ni ser har jag markerat (med muspekaren, som försvinner när man gör skärmdumpar…) ordet “value” – dvs värdet som temperatursensor har i detta fallet. Jag klickar på vänster musknapp och då kommer korrekt syntax för att läsa av denna “Egenskap” att skapas i LUA kodfönstret:

Men sådär kan inte koden se ut, vi fick dock reda på det viktigaste, det EnhetsID som skall trigga denna testscen: 52. Så vi ändrar lite i koden:

Det jag ändrat är alltså:

52 value

under %%properties, vilket talar om till HC2 interna programvara att NÄR värdet (value) ändras på enhet 52 (dvs temperatursensorn) så skall denna scen köras. Jag har också lagt till en lämplig kod för att läsa av just temperaturvärdet och lägga det i en local variabel (som alltså bara finns i denna scen, till skillnad från Globala Variabler, som är något lite annat).

Det kan ju vara kul att vet vilket värde som lästs in och då finns en funktion inbyggt i HC2 som kan vara lämplig:

fibaro:debug("text att skriva ut i debug fönster")

Och applicerat på vår scen så blir resultatet:

Nu kommer vi till vad vi nu skall göra med temperaturen, och i detta fallet, lätt inspirerat av sonnyboy’s pooltemp utmaning, så tänder eller släcker jag en lampa i arbetsrummet – en helt normal automatisering alltså *garv*.

Börja med att ta reda på all information om den lampan som är aktuell:

Som synes finns flera “Egenskaper” som vi kan läsa av, men på denna lampa har vi även två “Actions” – dvs tända och släcka lampan.

Vi kompletterar således vår scenkod med lite lämpliga variabler:

Och om man väljer enligt bilden ovan med Actions, att klicka på “turnOn” så kan man också få hela syntaxen för hur man i detta fallet slår på en lampa eller av då, och med en lämplig “if” struktur (dvs test “om” någon tillstånd är si eller så) så blir lite mera kod i denna form:

Jag la även till en fibaro:debug för att få med lite debugtext – ifall lampan nu var trasig… typ…

Men då vi skapat en local variabel som heter “Lampa” så byter vi ut 45 mot just “Lampa” i det anropet och får kanske en snyggare kod eller något…

Vi är nu nästan klara, och jag snabbkodar lite till:

Nu har vi alltså en komplett scen, med all kod:

--[[
%% properties
52 value
%% globals
--]]

local ArbetsrumTemp = tonumber(fibaro:getValue(52, "value"))

fibaro:debug("Arbetsrum Temperatur: " .. ArbetsrumTemp)

local Lampa = 45 -- EnhetsID för lampan som skall styras
local Varmt = 32 -- Gradtal som motsvarar värmenivån vi vill testa på

if ( ArbetsrumTemp > Varmt ) then
	fibaro:call(Lampa, "turnOn")
	fibaro:debug("Tänd Lampa, det är för varmt")
elseif ( ArbetsrumTemp <= Varmt ) then
	fibaro:call(Lampa, "turnOff")
	fibaro:debug("Släck Lampa, det är för kallt")
end

Just i detta fallet ett rätt rakt och enkelt exempel, man kan lätt göra det svårare men jag tänkte att detta kanske kan vara en början? Behövs någon fortsättning får ni gärna säga till ;-)