uni-PRO Gebäudeautomation

Script-Programmierung

Eigene Abläufe in Lua - wenn die fertigen Bausteine nicht reichen.
Weiter mit Pfeiltaste, Leertaste oder den Knöpfen unten  ·  F = Vollbild
Worum geht es?

Bausteine oder Script?

Fertige Bausteine

Für die allermeisten Aufgaben: Licht, Beschattung, Heizung, Zeitschaltuhren, Logik und Berechnungen. Grafisch verdrahtet, ohne Programmierkenntnisse.
Faustregel: Gibt es einen Baustein dafür, ist er die erste Wahl.

Und Ausschaltverzögerung

Script-Baustein

Für verschachtelte Bedingungen, Schleifen, Tabellen und eigene Zeitabläufe - und für Geräte ohne eigenen Baustein, die über serielle Schnittstelle, TCP oder HTTP sprechen. Programmiert wird in Lua, einer kleinen, leicht lesbaren Sprache.

for i = 1, 8 do if sys_get_value("2/1/"..i) == 1 then offen = offen + 1 end end
Der Baustein
Scriptprogrammierung

Bis zu 64 Ein- und Ausgänge

Der Baustein wird wie jeder andere auf einer Programmseite eingefügt und verdrahtet. Die Anzahl der Ein- und Ausgänge ist frei wählbar, 1 bis 64.

Im Script heißen sie E1, E2 … und A1, A2 … - oder bekommen mit sys_alias sprechende Namen wie „Feuchte“ oder „Luefter“.

Zum Bearbeiten genügt ein Rechtsklick auf den Baustein.

Scriptprogrammierung E1 E2 E3 A1 A2 FeuchteTemperatur LuefterMeldung 1 bis 64 Eingänge · 1 bis 64 Ausgänge
Wann läuft das Script?

Funktionen, die das System aufruft

Funktion im Scriptwird aufgerufen …
onCreate()einmal beim Start des Bausteins - für Voreinstellungen und Alias-Namen
onInputChanged()nach onCreate und wenn sich ein verknüpfter Eingang ändert
onEvent(Value, PhysAddress, GroupAddress, Command)bei jedem empfangenen Telegramm, z.B. KNX - auch wenn derselbe Wert erneut kommt
onTimerEvent100ms() … 1h()regelmäßig: alle 100 ms, 1 s, 10 s, 30 s, jede Minute, jede Stunde
onHttpResponse(…) · onMqtt(…)wenn eine Antwort oder Nachricht eingetroffen ist
Wichtig: Keine Funktion darf blockieren - eine Endlosschleife löst den Watchdog aus und die Runtime startet neu.
Ein erstes Beispiel

Lüfter nach Feuchte, mit Hysterese

-- Lüfter ein über 70 %, aus unter 60 % function onCreate() sys_alias("E1", "Feuchte") sys_alias("A1", "Luefter") end function onInputChanged() if Feuchte > 70 then Luefter = 1 elseif Feuchte < 60 then Luefter = 0 end end
  • onCreate vergibt einmal die Namen für Eingang 1 und Ausgang 1.
  • onInputChanged läuft, sobald sich die Feuchte ändert.
  • Was dem Ausgang zugewiesen wird, geht an die verknüpfte Adresse - z.B. den KNX-Schaltaktor.
  • Zwischen 60 und 70 % bleibt der Lüfter, wie er ist.
Der Editor

Schreiben, speichern, zuschauen

Scriptprogrammierung: Lüftung Bad Befehle/Funktion function onInputChanged() sys_debug_print("Feuchte=", Feuchte) sys_debug_watch("Luefter", Luefter) if Feuchte > 70 then Luefter = 1 end end -- Kommentare dunkelgrün Konsole ZeitstempelDaten 10:21:03Feuchte=72.4 10:21:33Feuchte=71.8 10:22:01LINE: 7, ERR: … Löschen Kopieren Variablen ZeitstempelVariableWert 10:21:33Luefter1 Löschen Kopieren 1 2 3 4 1 Speichern und ausführen überträgt das Script sofort in die Steuerung 2 Befehle/Funktion fügt weitere Aufruffunktionen und Systemaufrufe ein 3 Konsole sys_debug_print und Fehler mit Zeilennummer 4 Variablen sys_debug_watch als Tabelle, je Name eine Zeile Ausgaben nur bei gedrückter Play-Taste
Systemaufrufe

Die sys_-Funktionen im Überblick

BereichFunktionen
Wertesys_get_value · sys_set_value · sys_force_update_output
Adressensys_alias · sys_get_addr_in/_out · sys_get_addr_info(_in/_out)
Testensys_debug_print · sys_debug_watch · sys_diag_message
Speichernsys_set/get_persistent_value · sys_set/get_global_value
Zeit, Reglersys_timer_create/start/stop/elapsed/finished · sys_get_tick_count · sys_pid_create/call
Schnittstellensys_comm_open/read/write/close · sys_net_create/write/close · sys_http_request
Nachrichtensys_send_mail · sys_send_pushover · sys_send_ntfy · sys_os_execute
sys_get_value und sys_set_value erreichen jede Adresse der Adressliste - auch ohne Verknüpfung am Baustein, z.B. sys_set_value("1/2/3", 1, 0).
Beispiel Zeitablauf

Ein Blinker mit eigenem Timer

local t = -1 function onCreate() t = sys_timer_create() sys_timer_start(t, 500) end function onTimerEvent100ms() if sys_timer_finished(t) == 1 then A1 = 1 - A1 sys_timer_start(t, 500) -- neu starten end end
  • sys_timer_create legt einen Timer an, sys_timer_start lässt ihn 500 ms laufen.
  • Die Timer sind Abfrage-Timer: Beim Ablauf wird keine Funktion aufgerufen. Ob die Zeit um ist, fragt das Script selbst mit sys_timer_finished ab.
  • Für feste Takte genügen die fertigen onTimerEvent-Funktionen - ganz ohne eigenen Timer.
Ergebnis: A1 wechselt alle 500 ms zwischen 0 und 1 - z.B. für eine Warnleuchte.
Webdienste abfragen

Der HTTP-Client im Script

  • sys_http_request sendet GET, POST, PUT oder DELETE an http:// oder https:// - mit Inhalt, Inhaltstyp und eigenen Kopfzeilen.
  • Der Aufruf blockiert nicht: Die Anfrage läuft im Hintergrund, die Antwort kommt in onHttpResponse.
  • Zurück kommt eine Anfrage-Nummer, nicht der HTTP-Status - der Status steht in der Antwort.
  • HTTPS gibt es auf Steuerungen mit SSL-Unterstützung.
function onCreate() sys_http_request("GET", "https://host/api/status","","",{}) end function onHttpResponse(Id, Status, Body, Headers) sys_debug_print("HTTP "..Status.." "..Body) end
Script Webdienst Anfrage - Script läuft weiter später: onHttpResponse
Benachrichtigen

Nachrichten direkt aus dem Script

sys_send_ntfy("","haus-alarm-3f7a2b","Alarm", "Zisterne leer",4,"warning,droplet")
sys_send_pushover("<Benutzer-Schlüssel>", "Alarm","Zisterne leer",1,"siren")
sys_send_mail("technik@example.com", "Zisterne","Füllstand unter 10 %","")
  • Push über NTFY oder Pushover und E-Mail - ohne eigenen Sende-Baustein.
  • Rückgabe 1: übernommen, 0: Höchstzahl je Stunde oder Tag erreicht, -1: Fehler im Aufruf.
  • Die Begrenzung gilt gemeinsam mit den Sende-Bausteinen des Projekts.
  • Ohne Zugriffstoken kann jeder mitlesen, der das NTFY-Thema kennt - daher ein schwer zu erratendes Thema wählen.
Testen und Fehlersuche
Diagnose

Was wann angezeigt wird

  • sys_debug_print und sys_debug_watch sendet die Steuerung nur, solange der Editor geöffnet ist.
  • Laufzeitfehler meldet die Steuerung immer - mit Zeilennummer.
  • sys_diag_message schreibt in die Diagnose des Studios (Meldungen bzw. Fehler) - auch bei geschlossenem Editor, praktisch beim Test über die Visualisierung.
  • Voraussetzung für Ausgaben: die Play-Taste ist gedrückt.
Script in der Steuerung Konsole · Variablen nur bei offenem Editor Laufzeitfehler immer, mit Zeile Diagnose im Studio sys_diag_message, immer
Schützen und Speichern
Passwort

Das Script bleibt Ihres

Auf Wunsch bekommt der Baustein ein Passwort. Das Script lässt sich dann nur noch mit gültigem Passwort öffnen und bearbeiten - ausgeführt wird es wie gewohnt.

Achtung: Ein vergessenes Passwort lässt sich nicht zurücksetzen.

Werte, die einen Neustart überdauern sollen, speichert sys_set_persistent_value - sparsam einsetzen, jeder Schreibvorgang kostet Lebensdauer des Speichers.

Quelltext geschützt, Ablauf unverändert
Mit KI-Unterstützung
MCP-Server

Die KI schreibt das Script

Das Studio enthält eine Schnittstelle für KI-Assistenten (MCP-Server). Der Assistent holt sich die vollständige Lua-Referenz mit allen Aufruffunktionen und sys_-Funktionen.

Mit dem Werkzeug set_lua_script schreibt er den fertigen Code direkt in den Baustein - samt Anzahl der Ein- und Ausgänge. Prüfen und freigeben bleibt beim Menschen.

„Schreibe ein Script: Lüfter ein über 70 % Feuchte, aus unter 60 %.“ KI-Assistent liest die Lua-Referenz set_lua_script ▸ Scriptprogrammierung function onInputChanged() ifFeuchte > 70 im geöffneten Projekt im Studio
Praxisbeispiel

Zisterne überwachen

local gemeldet = 0 function onCreate() sys_alias("E1", "Fuellstand") sys_alias("A1", "Pumpe") end function onInputChanged() if Fuellstand < 10 then Pumpe = 0 -- Pumpe sperren if gemeldet == 0 then sys_send_ntfy("", "haus-alarm-3f7a2b", "Alarm", "Zisterne leer", 4, "warning,droplet") gemeldet = 1 end elseif Fuellstand > 20 then Pumpe = 1 -- wieder freigeben gemeldet = 0 end end
Aufgabe: Der Füllstand der Zisterne kommt in Prozent auf Eingang 1. Fällt er unter 10 %, wird die Pumpe gesperrt und genau einmal eine Push-Nachricht gesendet. Über 20 % gibt das Script die Pumpe wieder frei.
  • Die Variable gemeldet verhindert eine Nachricht bei jeder Messwertänderung.
  • Der Abstand zwischen 10 und 20 % verhindert ständiges Ein und Aus.
Mehr in der Hilfe

Die Einzelheiten zum Nachlesen

Die Sprache selbst ist unter www.lua.org beschrieben - die Hilfe geht nur auf die Erweiterungen von uni-PRO ein.
Zusammenfassung

Script-Programmierung auf einen Blick

Ergänzt die Bausteine

Für komplexe Abläufe und Geräte ohne eigenen Baustein.

Bis zu 64 E/A

Verdrahtet wie jeder Baustein, mit sprechenden Namen.

Klare Aufrufpunkte

Start, Eingangsänderung, Telegramm, Zeittakt, Antwort.

Alles erreichbar

Adressen, seriell, TCP, HTTP, Mail und Push.

Live testen

Konsole und Variablen im Editor, Fehler mit Zeile.

Geschützt und KI-fähig

Passwortschutz; KI schreibt Code direkt in den Baustein.