LUA för nybörjare - Del 1

Post Reply
User avatar
Bamsefar
Z-Wave Kung
Posts: 1258
Joined: 25 Nov 2013, 15:06
10
Location: Stockholm

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:
Image
Döp om den och flytta den till något lämpligt rum (jag har ett som kallas Diverse där udda saker hamnar):
Image
Tryck SAVE!

Under fliken avancerat så finns ett val, här markerat i rött - byt till LUA baserad scenredigering - OK:
Image
Godkänn bytet även på nästa bild - OK:
Image
Och bara för att vara överjävligt säker, så godkänn igen - OK:
Image

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

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:
Image
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:
Image

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:
Image
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:
Image
Det jag ändrat är alltså:

Code: Select all

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:

Code: Select all

fibaro:debug("text att skriva ut i debug fönster")
Och applicerat på vår scen så blir resultatet:
Image

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:
Image
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:
Image
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:
Image
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:
Image

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

Code: Select all

--[[
%% 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 ;-)
Jämför Home Assistant med HomeSeer 4 på generation 800 controller - here we go! :mrgreen:
djesko
Medlem
Posts: 91
Joined: 10 Feb 2014, 22:50
10
Location: Trelleborg

tack , sjukt bra guide !
zorro
Medlem
Posts: 365
Joined: 22 Oct 2013, 16:16
11

Ja du är värd en riktigt stor "Bamse" kram :mrgreen: :mrgreen:
Fibaro fantastic
Aktuell HC2 Version: 4.520
diStefano
Medlem
Posts: 105
Joined: 31 Aug 2013, 21:39
11

Mycket bra! Nu börjar saker och ting klarna lite i alla fall....
tomalars
Ny medlem
Posts: 5
Joined: 04 Nov 2013, 10:59
10

Snyggt!

Mera mera :D :D :D
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
11
Location: Västerås

Underbar guide för oss som inte kan lua så bra.
Denna guide har varit till stor hjälp.
Nu väntar iaf jag på Del 2 :)
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
AndersPS
Ny medlem
Posts: 15
Joined: 11 Nov 2014, 20:32
9

Perfekt, ser fram emot del 2. Är LUA specifikt för HC eller använder flera controlers det?
jens
Medlem
Posts: 329
Joined: 22 Apr 2013, 17:09
11

Väntar oxå på nr:2 ;)


Sent from my iPhone 6 using Tapatalk
User avatar
Bamsefar
Z-Wave Kung
Posts: 1258
Joined: 25 Nov 2013, 15:06
10
Location: Stockholm

AndersPS wrote:Är LUA specifikt för HC eller använder flera controlers det?
LUA är ett generellt språk så det fungerar på flera plattformar, men här på detta forum är det mest för HC2, det finns rätt många funktioner som är exklusiva för just LUA på HC2...
Jämför Home Assistant med HomeSeer 4 på generation 800 controller - here we go! :mrgreen:
Post Reply