LUA-Kurzanleitung

Einführung LUA Programmierung
Unterschied
Homecenter 2
Homecenter Lite
Die Unterschiede zwischen dem Homecenter 2 und Homecenter Lite sind für den
Endverbraucher auf den ersten Blick nicht sichtbar. Die Oberfläche, die App und die
Bedienelemente sind bei beiden Gateways optisch gleich. Mit beiden Gateways lässt sich
zum Beispiel das Licht, die Heizung und Jalousien steuern. Beide Gateways sprechen den
Funkstandard Z-Wave und können mit den meisten europäischen Geräten dieses
Standards kommunizieren. Einige Ausnahmen wie das Türschloss sind vorhanden,
werden aber mit dem Release der Version 4.0 steuerbar sein.
Der größte Unterschied zwischen dem Homecenter 2 und Homecenter Lite besteht im
Bereich der Automatisierung und Szenensteuerung. Das Homecenter 2 bietet die
Möglichkeit Szenen über die offene Programierungsprache LUA durchzuführen. Während
im Homecenter Lite nur die grafisch basierte Szenenerstellung implementiert ist.
Abbildung 1: Grafische Szenenerstellung
Abbildung 2: Codebasierte Szenenerstellung
In den beiden Abbildungen ist eine Szene erstellt, die beim Öffnen des Dachfensters alle
Lichter im Raum „Büro“ ausschaltet und eine Nachricht als Mail schickt, die die Information
über ein offenes Fenster enthält.
In der Abbildung 1 ist die grafische Implementation dieser Anwendung abgebildet. Die
grafische Szenenerstellung baut sich in Blöcken auf, die einzeln NACHEINANDER
hinzugefügt werden können. Verschiedene Module haben verschiedene Funktionen. Jede
Funktion eines Modul ist in seinem Block im grünen Bereich auswählbar. Bei Aktoren ist
die Funktion, die auszuwählen ist „AUS schalten“ oder „EIN schalten“.
Über das „Plus“-Symbol können einzelne Module aus den Bereichen und Räumen
ausgewählt und hinzugefügt werden. Darüber werden auch die Konnektoren hinzugefügt.
Diese beschränken sich in der grafischen Erstellung auf „dann“, „oder“ und „und“.
Wie schon erwähnt erfolgt die Erstellung einer Szene im grafischen Modul Schritt für
Schritt. Das bedeutet, dass nachträgliche Änderungen in schon erstellten Blöcken nicht
möglich sind. Es lassen sich über das Hinzufügensymbol zwar weitere Module über
Konnektoren einfügen. Allerdings wird das Modul nur in der grafischen Oberfläche
hinzugefügt, erhält aber im Programmiercode keine Funktion.
In der Abbildung 2 ist dieselbe Szene, wie in der grafischen Szenenerstellung zu
erkennen. Allerdings wurde hier die Szene im LUA-Code visualisiert und erstellt.
Der LUA – Code baut auf einer Syntax von Befehlen an die Module und Operatoren auf.
Die Hauptoperatoren sind „if else“, „while“, „repeat“ und „for“.
Für die Anwendung der Operatoren wird eine gewisse Kenntnis über die Logik dieser
Operatoren vorausgesetzt.
Im Folgenden einige Codebeispiele zu den Operatoren:
- if a<0 then a = 0 end
- if (fibaro.getValue(111,
„value“) == 1) then
fibaro:call(111, „turnOFF“)
- local i = 1
while (i<250) do
fibaro:call(i,“turnOFF“)
i = i + 1
end
end
- repeat
line = os.read()
until line ~= ""
print(line)
- for var=exp1,exp2,exp3 do
something
end
Für weitere Codebeispiele und Tutorials zum LUA-Code:
http://www.lua.org/pil/contents.html
Das Nutzen dieser Operatoren ermöglicht es, komplexere auf einen ganz bestimmten
Anwendungsfall zugeschnittene Szenen zu programmieren. Die Möglichkeiten der
manuellen Programmierung über den LUA-Code übersteigt die Möglichkeiten der
grafischen Programmierung um ein Weites.
Ein kurzes Beispiel, soll die Funktionaliät und die Komplexität der LUA Programmierung
veranschaulichen.
Wir betrachten folgenden Anwendungsfall:
„Ein Endverbraucher installiert ein Z-Wave System in seinem Haus und hat das
Dachgeschoss komplett ausgestattet. In seinem Dachgeschoss befindet sich sein
Arbeitszimmer mit vielen technischen Komponenten. Über die Wetterdaten von Yahoo hält
er sich auf dem laufenden über die Wettervorhersagen. Bei angekündigtem Regen
überprüft er den Status seiner Dachfenster über eine App. Beim Verlassen des Hauses
vergisst er manchmal die Dachfenster zu schließen. Wenn Regenwetter bevorsteht,
besteht so die Gefahr auf einen enormen Schaden.“
Lösung:
Beim Verlassen des Hauses UND einer Wettervorhersage mit Regen überprüft das ZWave System den Status des Dachfensters und warnt den Verbraucher, falls ein
Dachfenster offen ist. Falls nur schlechtes Wetter vorhergesagt ist, weißt das Haus den
Nutzer per Push-Nachricht oder E-Mail daraufhin einen Schirm oder regengerechte
Kleidung zu tragen.
--[[
%% properties
122 value
%% globals
–]]
local FrontDoor = fibaro:getValue(122, "value")
local openWindows = 0;
-- wenn Haustüre sich öffnet
if (FrontDoor == "1") and
(fibaro:getValue(3, "WeatherConditionConverted") == "rain") then
-- wenn Wetter regnerisch ist
local Run = 1;
-- Schleife für max 259 Geräte
while (Run < 260) and (openWindows == 0) do
-- wenn Bereich ID des Gerätes Run Dachgeschoss ist
if (fibaro:getRoomID(Run) == 7) and
(fibaro:getType(Run) == "door_sensor") then
-- wenn Gerät Run Türsensor ist
local value = fibaro:getValue(Run, "value")
-- wenn Gerät Run offen ist
if( value == "1") then
openWindows = openWindows + 1;
-- welcher Text geschrieben wird
local text = "Achtung die Fenster im
Dachgeschoss sind nicht alle geschlossen";
fibaro:call(2, "sendEmail", "Fibaro
Meldung", text)
end
end
Run = Run + 1;
end
-- wenn keine Fenster offen sind
if(openWindows == 0)then
-- sende E-Mail aus E-Mailpanel
fibaro:call(2, "sendDefinedEmailNotification", "5");
end
end
Folgende Funktionen für bestimmte Modulgruppen sind für das erstellen von Szenen
wichtig. Über die Funktionen können entweder Statis von Geräten abgefragt werden oder
die Geräte zu einer ausführbaren Aktion bestimmt werden.
Für Aktoren gibt es folgende Aktionen:
An oder Ausschalten eines Aktors (z.B. Unterputzrelay)
fibaro:call (DeviceID, „TurnOFF/ON“)
Dimmen oder einstellen einer Jalousie auf gewisse Höhe
fibaro:call (DeviceID, „SetValue“, „Value
zwischen 1-100“)
Temperatur eines Thermostats einstellen
fibaro:call(DeviceID, "setTargetLevel",
„Gradzahl“)
Gerät aufwecken
fibaro:call(1, "wakeUpDeadDevice", Geräte-ID)
Für Z-Wave Geräte gibt es folgende Abfragen:
Aktorenstatus (An = 1, Aus = 0)
fibaro:getValue(DeviceID, "value")
Aktor aktiv im Netz = 0 oder inaktiv = 1
fibaro:getValue(DeviceID, "dead")
Parent des Aktors (Welches Gateway dem Aktor angehört)
fibaro:getValue(DeviceID, "parentID")
Auslesen der Raum-ID eines bestimmten Geräts
fibaro:getRoomID(DeviceID)
Auslesen des Gerätetyps (z.B. door_sensor, binary_switch)
fibaro:getType(DeviceID)
Auslesen des Hersteller eines Geräts (gibt vollständigen Herstellername zurück)
Fibaro:getValue(DeviceID, „zwaveCompany“)
Für Sensoren gibt es folgende weitere Abfragen:
Status ob Sensor scharf geschalten ist nicht scharf = 0, scharf = 1
fibaro:getValue(DeviceID, "armed")
Batteriestatus des Sensors in Prozent
fibaro:getValue(DeviceID, "batteryLevel")
Bei Multisensoren die Temperatur abfragen
fibaro:getValue(DeviceID, "valueSensor")
Einheit der Value (valueSensor)
fibaro:getValue(DeviceID, "unitSensor")
Aufwachzeit in Sekunden des batteriebetriebenen Geräts
fibaro:getValue(DeviceID, "wakeUpTime")
Beispielliste mit allen Werten, die aus einem Z-Wave Gerät ausgelesen werden
können
"UIMessageSendTime": "0",
"batteryLowNotification": "1",
"classConfigure": "0,0,2,0,0,2,0",
"classGeneric": "37",
"classSupport": "37,39,114,117,130,134,135",
"classVersion": "1,1,1,1,1,1,1",
"dead": "1",
"deviceControlType": "20",
"deviceIcon": "2",
"disabled": "0",
"emailNotificationID": "0",
"emailNotificationType": "0",
"endPoint": "0",
"isBatteryOperated": "0",
"isLight": "0",
"liliOffCommand": "",
"liliOnCommand": "",
"log": "",
"logTemp": "TxtBlue",
"needConfigure": "5",
"nodeID": "60",
"parametersTemplate": "0",
"parentID": "1",
"pollingRetryError": "0",
"pollingTime": "",
"pollingTimeNext": "",
"pollingTimeSec": "0",
"productInfo": "0,100,48,2,0,0,1,0",
"protectionLocal": "0",
"protectionLocalSupport": "0",
"protectionRF": "0",
"protectionRFSupport": "0",
"pushNotificationID": "0",
"pushNotificationType": "0",
"requestNodeNeighborState": "0",
"requestNodeNeighborStateTimeStemp": "0",
"saveLogs": "1",
"showChildren": "1",
"smsNotificationID": "0",
"smsNotificationType": "0",
"sortOrder": "999",
"unit": "",
"useTemplate": "1",
"userDescription": "",
"value": "0",
"zwaveCompany": "Duwi",
"zwaveInfo": "6,2,51",
"zwaveVersion": "1,0",
"parameters": [],
"associationView": [],
"associationSet": []
Um die Eigenschaften/Werte aus der obigen Liste von einem Gerät auslesen zu können
muss folgende bekannte Funktion in LUA verwendet werden:
fibaro:getValue(Device-ID, Eigenschaft aus obiger Liste )
BSP.: fibaro:getValue(154, "associationSet" )
Kontakt:
Z – Wave Europe GmbH
Denis Pätz
Goldbachstraße 13
09337 Hohenstein-Ernstthal