Fibaro LUA Grundlagen

Fibaro Funktionen

Das Home Center 2 stellt eine ganze Reihe von Funktionen für die Interaktion mit Z-Wave Modulen und virtuellen Geräten zur Verfügung.

Eine sehr gute Übersicht über diese Funktionen ist auf der Fibaro UK Seite zu finden.

Szenen starten

Das Home Center bietet unterschiedliche Möglichkeiten Szenen zu starten. Diese können manuell, automatisch und durch die Veränderung von Geräte-Eigenschaften und globalen Variablen gestartet werden.

Die Kopfzeile

Im oberen Teil einer jeden LUA Szene befindet sich der sogenannte Head. In diesem wird definiert zu welchen Gegebenheiten eine Szene gestartet werden soll. Dieser besteht aus einzelnen oder allen der folgenden Zeilen:

--[[
%% autostart
%% properties
%% events
%% globals
--]]

Manuelles Starten von Szenen

Fibaro LUA Szenen lassen sich im Webinterface, per LUA sowie aus den Apps für mobile Geräte manuell starten. Hierfür einfach den Play- bzw. Run-Button in den unterschiedlichen Interfaces bedienen.

Autostart Szenen

Um mit Hilfe von Szenen einmalige Schritte und/oder Konfigurationen – beispielsweise das Füllen einer globalen Home Center Variable – zeitgesteuert auszuführen sind diese mit der Autostart Funktion zu versehen:

--[[
%% autostart
--]]

Durch diesen Eintrag werden Szenen beim Speichern und Systemstart automatisch gestartet. Zeitgesteuerte Szenen sind so programmiert, dass sie in einer Dauerschleife laufen. Mit Hilfe einer If-Bedingung wird bei jedem Durchlauf die aktuelle Systemzeit mit der innerhalb der Szene definierten Startzeit verglichen. Ist die Uhrzeit erreicht wird die Aktion durchgeführt. Nach Durchführung der gewünschten Aktionen bleibt die Szene in der Dauerschleife und wartet erneut auf das Erreichen der Startzeit.

startTime = "10:35"

function timerFunction()
	local currentDate = os.date("*t");
	if (
	 ( (string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == startTime) )
	)
	then
		fibaro:debug("Startzeit erreicht. Es ist 10:35 Uhr" )
	end

	setTimeout(timerFunction, 60*1000)
end

timerFunction()

In diesem Beispiel wird Tag um 10:35 Uhr der Text „Startzeit erreicht. Es ist 10:35 Uhr“ im Debug-Fenster der Szene ausgegeben. Zur Erstellung einer solchen zeitgesteuerten Szene werden zwei Funktionen benötigt. Die Funktion timerFunction() überprüft das Erreichen der Startzeit. Diese und die daraus folgenden Aktionen können frei definiert werden. Die zweite zu verwendende Funktion setTimeout() wird vom HC2 zur Verfügung gestellt und sorgt dafür, dass die Funktion timerFunction() alle 60 Sekunden (Also 60 * 10000 Millisekunden) ausgerufen wird.

Start durch Geräte-Eigenschaften

Jeder Sensor und jeder Aktor im Fibaro Home Center hat eine ganze Reihe von Eigenschaften. Diese beinhalten neben den statischen Werten wie Hersteller, Version, ParentID, etc. auch Eigenschaften die den aktuellen Zustand wiedergeben. So verfügt ein Thermostat über die Eigenschaft Temperatur, ein Dimmer über ein Ein/Aus-Eigenschaft und ein Motion Sensor hat eine Eigenschaft in der die Erkennung von Bewegung signalisiert wird.

Die Änderung solcher Eigenschaften wird Auslöser sog. Trigger für Szenen verwendet. Dies sieht bei einem Motion Sensor (ID 59) in der Kopfzeile einer Szene folgendermaßen aus:

--[[
%% properties
59 value
--]]

Unter dem Punkt properties wird die Gerät-ID sowie die sich ändernde Eigenschaft angegeben. In diesem Fall wird also die Eigenschaft „value“ des Motion Sensors mit der ID 59 überwacht. Die Eigenschaft „value“ kennt die Werte 1 (Bewegung erkannt) sowie 0 (keine Bewegung erkannt).

Der Trigger in die Badezimmer-Szene integriert haben wir eine Lichtsteuerung welche das Licht bei Bewegung für 60 Sekunden einschaltet.

--[[
%% properties
59 value
--]]

luxID = 58
switchIDs = {96, 178}
luxValue = tonumber(fibaro:getValue(luxID, "value"))
laufzeit = 60 -- Sekunden

a = 1 -- Vergleichswert

function switchLights(IDs, turn)
	for i=1, #IDs do
		fibaro:call(IDs[i],turn)
		fibaro:debug('Lampe mit der ID '..IDs[i]..' geschaltet')
	end
end

if luxValue < 100 then
	switchLights(switchIDs, "turnOn")
	while a <= laufzeit do
		fibaro:debug('Timer läuft '..a..' Sekunden')
		a = a + 1
		fibaro:sleep(1000)
	end
	switchLights(switchIDs, "turnOff")
else
	fibaro:debug("Es ist hell genug")
end

Beim Betreten des Badezimmers und der damit verbundenen Auslösung des Motion Sensors wird die Szene gestartet und schaltet in Abhängigkeit von der Helligkeit im Raum das Licht ein und nach 60 Sekunden wieder aus.

Badezimmer Lichtszene komplett

Die entstandene Szene für das Badezimmer ist noch nicht wirklich smart. Das Licht schaltet sich unabhängig davon ob die Bewegung andauert oder nicht nach 60 Sekunden ab. Mit einer weiteren Prüfung des Bewegungsmelders wird dies verhindert. Dafür wird der 60 Sekunden Timer bei erneuter Bewegung zurückgesetzt.

--[[
%% properties
59 value
--]]

motionID = 59
luxID = 58
switchIDs = {96, 178}
luxValue = tonumber(fibaro:getValue(luxID, "value"))
laufzeit = 60 -- Sekunden

a = 1 -- Vergleichswert

function switchLights(IDs, turn)
	for i=1, #IDs do
		fibaro:call(IDs[i],turn)
		fibaro:debug('Lampe mit der ID '..IDs[i]..' geschaltet')
	end
end

if luxValue < 100 then
	switchLights(switchIDs, "turnOn")
	while a <= laufzeit do
		if tonumber(fibaro:getValue(motionID, "value")) == 1 then
			a = 1
			fibaro:debug('Weiterhin Bewegung setzte Timer zurück')
		else 
			a = a + 1
			fibaro:debug('Timer läuft '..a..' Sekunden')
		end
		fibaro:sleep(1000)
	end
	switchLights(switchIDs, "turnOff")
else
	fibaro:debug("Es ist hell genug")
end

Feedback und weitere Artikel

Das war es fürs Erste. Der Artikel ist doch länger etwas länger geworden und sicher sind nicht alle Aspekte der LUA Entwicklung eingeflossen. Gern ergänze ich den Artikel oder schreibe weitere, wenn noch etwas fehlt. Dafür und für jede Form der Kritik und Anregung bitte die Kommentarfunktion verwenden.

11 Comments
  1. Hallo Bastian, bin gerade im Urlaub und hab mir es gestern alles durchgelesen. Echt super geschrieben. Ich glaub das wird mir und Anderen helfen.

  2. Hallo Bastian,

    ein starker Artikel, aus dem ich direkt ein paar Zeilen Code entwenden kann:-)
    Jetzt habe ich das auch endlich mit dem fibaro:sleep verstanden.

    Danke für die Arbeit. Das hat bestimmt eine Weile gedauert.

    VG
    Mr.Coffee

  3. Hallo Bastian,
    vielen Dank für Deine Fleißarbeit! Ich habe sie zum Anlass genommen, einen zweiseitigen, kompakten Überblick zur LUA-Syntax und verschiedenen Fibaro-Befehlen zu erstellen:
    https://www.subreality.de/blog/wp-content/uploads/2017/02/lua_syntax_fibaro_befehle.pdf
    Das kann noch Flüchtigkeitsfehler enthalten und es ist sicherlich auch noch nicht „vollständig“, denn ich bin noch dabei, mich schrittweise einzuarbeiten. Aber zumindest mit leistet dieses Dokument, laminiert auf der Tischplatte, bisher gute Dienste. Ich werde es ggf. nach und nach erweitern.
    Beste Grüße, Rüdiger

    1. Hallo Rüdiger,

      vielen Dank für die netten Worte und Deine Mühe mit dem PDF! Den Link veröffentliche ich natürlich gern und bin mir sicher, dass er dem Ein oder Anderen User helfen wird.

      Gruß
      Bastian

  4. Hallo Bastian,
    ich kann mich auch nur Bedanken. Ich fange gerade an, mich mit Lua zu beschäftigen. Es ist toll, wenn man sich einmal komplett an einem Beispiel orientieren kann. Mir hat es sehr geholfen die krptischen Zeichen zu verstehen.
    An deiner Seite sollten sich mehr Foren orientieren. In den meisten Foren bekommt man immer nur Schnipsel und muss dann wieder nachfragen.

    großes DANKE an dich
    Gruß Manfred

    1. Hi Modell75,

      schau Dir mal das Kapitel „Variablen-Typen“ an. Mit der Funktion tonumber() kannst Du den Typ einer Variable von String zu Number ändern. Dies ist insbesondere wichtig, wenn Du mit Variablen Rechnen oder Vergleichen möchtest. Das geht nämlich mit Texten nicht 😉

      Gruß
      Bastian

  5. Danke Bastian für diese ausführliche und sehr gut verständliche Anleitung!!
    Ich nehme sie immer wieder gerne her, wenn ich mir neue LUA Skripte ausdenke!!

  6. Hallo Bastian
    ich bin auch neu in der LUA Programmierung, da wir gerade einen Neubau planen.
    Dank deinen super Beiträgen habe ich einen wesentlich leichteren Einstieg ins Thema und gute Beispiele zum nachlesen und üben.
    Danke vielmals für deinen Aufwand!

    Liebe Grüsse
    Clemens

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Ich akzeptiere

Fibaro LUA Grundlagen

von Bastian Lesezeit: 20 min