Logiken

Mit Hilfe von Logiken können einfache oder auch komplexe Funktionalitäten bereitgestellt werden: Beispielsweise kann erreicht werden, dass eine Leuchte nur unter bestimmten Bedinungen (Dunkelheit) eingeschaltet wird. Eine komplexere Logik könnte z.B. eine komplette "Alarmanlage" abbilden. Logiken werden mit Hilfe des Logikeditors***1 aus einzelnen Logikbausteinen***r-0 zusammengesetzt. Diese Logikbausteine können miteinander verbunden werden, so dass durch eine Verkettung von Bedinungen oder Berechnungen eine Gesamtfunktionalität entsteht.

Allgemeines

Logiken werden in EDOMI nicht(!) sequentiell (d.h. wie ein Computerprogramm) abgearbeitet, sondern arbeiten stets Ereignis-gesteuert. Dies bedeutet, dass jedes "Ereignis" (z.B. ein eintreffendes KNX-Telegramm oder das Ergebnis einer Berechnung eines Logikbausteins) ggf. einen oder mehrere Eingänge eines Logikbausteins "triggert" und somit eine entsprechende Reaktion bewirkt. Der Zustand (z.B. der Wert an einem Eingang eines Logikbausteins) bleibt dabei solange erhalten, bis ein weiteres Ereignis diesen Zustand neu definiert.

Logikbausteine

Logikbausteine stellen die kleinste funktionale Einheit einer Logik dar. Jeder Logikbaustein***r-0 verfügt i.d.R. mindestens über einen Eingang und einen Ausgang. Durch die Verbindung mehrerer Logikbausteine untereinander kann eine komplexe Gesamtfunktionalität bereitgestellt werden.

Eingänge

Über einen Eingang erhält der Logikbaustein einen Wert, der in der bereitgestellten Funktionalität des Logikbausteins wie eine Variable verarbeitet wird. Sobald ein beliebiger Eingang auf einen Wert gesetzt wird, beginnt der Logikbaustein zu arbeiten - er wird "getriggert". Jeder Eingang kann auf unterschiedliche Weise mit Werten belegt werden: Wichtig: Ein Eingang kann nur mit einem Kommunikationsobjekt oder(!) einer Verbindung belegt werden.

Verhalten der Eingängen beim Start

Beim Start oder Neustart von EDOMI werden während der Initialisierungsphase i.d.R. alle Logikbausteine in Abhängigkeit von der Belegung der Eingänge wie folgt initialisiert: Wichtig: Jeder Logikbaustein wird dabei nur einmalig getriggert: Sämtliche Werte an den Eingängen werden intern zusammengefasst und führen dann ggf. gemeinsam zu einem Triggern des Logikbausteins.

Logikbaustein: Eingangsbox

Eingangsboxen***lbs_12000001 können optional(!) verwendet werden, um die Eingänge eines Logikbausteins mit Kommunikationsobjekten zu belegen. Eingangsboxen sind im Grunde nicht erforderlich, da jeder Eingang auch direkt mit einem KO belegt werden kann. Jedoch kann die Verwendung einer Eingangsbox zu einer Steigerung der Übersichtlichkeit führen, zudem können Eingangsboxen die Umbelegung vieler gleichartiger Eingänge beim Bearbeiten einer Logik erleichtern. Hinweis: Eingangsboxen werden bei einer Projektaktivierung***103-13 intern entfernt, d.h. die Verwendung von Eingangsboxen beeinflusst nicht das Verhalten einer Logik im Vergleich zum direkten Belegen eines Eingangs mit einem KO.

Ausgänge

An den Ausgängen eines Logikbausteins liegen ggf. die Ergebnisse der bereitgestellten Funktionalität des Logikbausteins an. Sobald ein Ausgang auf einen Wert gesetzt wird, werden alle Eingänge anderer Logikbausteine, die mit diesem Ausgang verbunden sind auf diesen Wert gesetzt (und werden "getriggert").

Logikbaustein: Ausgangsbox

Ausgangsboxen***lbs_12000010 verfügen über keinerlei Ausgänge, sondern erfüllen eine besondere Funktion: Ausgangsboxen repräsentieren i.d.R. das Ende einer Verkettung von Logikbausteinen und ermöglichen das Ausführen von Befehlen***1007. Eine Ausgangsbox sorgt i.d.R. dafür, dass die Ergebnisse einer Logik zu einer entsprechenden Aktion führen (z.B. Schalten einer Leuchte, Abrufen einer Szene, uvm.).

Technische Informationen (Logik-Engine)

Die "Logik-Engine" bezeichnet einen EDOMI-Prozess, der u.a. für die Verarbeitung von Logiken zuständig ist. Die Logik-Engine bildet in Etwa das Verhalten einer SPS (Speicherprogrammierbare Steuerung) ab, d.h. Logikfunktionen werden in einzelne Einheiten zerlegt (Logikbausteine) und ggf. zyklisch aufgerufen. Im Detail werden einzelne Logikfunktionen demnach sequentiell verarbeitet, im Gesamtkontext arbeitet die Logik-Engine jedoch Ereignis-gesteuert. Hinweis: Aufgrund der Ereignis-gesteuerten Arbeitsweise existiert keine definierte Reihenfolge bezüglich der Abarbeitung einzelner Logikfunktionen.

Funktionsprinzip

Die Logik-Engine arbeitet grundsätzlich "getaktet", d.h. sämtliche Ein- und Ausgaben werden zyklisch überwacht bzw. erzeugt (etwa 100 mal pro Sekunde). Ein "Durchlauf" eines solchen Zyklus wird nachfolgend ansatzweise erläutert:

Logikbausteine

Der Code eines Logikbausteins***r-0 wird wie oben erläutert bei jedem Vorliegen eines neuen Wertes an einem seiner Eingänge ausgeführt, zudem wird der Code ggf. zyklisch ausgeführt (sofern dies im Code des Logikbausteins durch einen entsprechenden Funktionsaufruf***r-0-3 gefordert wurde). Werden verschiedene Eingänge ein und desselben Logikbausteins von unterschiedlichen(!) Ereignissen getriggert, wird der Logikbaustein u.U. mehrfach aufgerufen (abhängig von der zeitlichen Nähe der Ereignisse). Bei jeder Ausführung werden ggf. die Ausgänge des Logikbausteins auf einen Wert gesetzt, d.h. intern werden die Eingänge der mit dem entsprechenden Ausgang verbundenen Logikbausteine auf einen Wert gesetzt (Ausgänge existieren intern nicht). Die mit dem entsprechenden Ausgang verbundenen Logikbausteine werden zu diesem Zeitpunkt jedoch noch nicht(!) getriggert, vielmehr wird zunächst die Ausführung des gesamten Codes des Logikbausteins abgewartet. Erst nach vollständiger Ausführung des Codes werden die entsprechenden Eingänge der verbundenen Logikbausteine getriggert (dies erfolgt erst im nächsten Zyklus der Logik-Engine), ausserdem werden alle Eingänge des aktuell abgearbeiteten Logikbausteins hinsichtlich ihrer "refresh"-Eigenschaft zurückgesetzt. Hinweis: Der Code im EXEC-Abschnitt***r-0-2 eines Logikbausteins wird - einmal gestartet - vollkommen unabhängig von der Logik-Engine ausgeführt (EXEC-Scripte werden als eigentständiger PHP-Prozess ausgeführt). Das Setzen eines Ausgangs innerhalb dieses Codes wird demnach zu einem willkürlichen Zeitpunkt erfolgen und ist nicht vorhersehbar.