Graphmodul li - LightPi: Unterschied zwischen den Versionen
| Zeile 30: | Zeile 30: | ||
Unter dem Schlüssel <code>uri</code> wird die IP-Adresse und der TCP-Port festgelegt auf dem der LightPi-Master auf einkommende Verbindungen lauscht. Unter dem Schlüssel <code>peers</code> werden die Unterverteilungen im Gebäude aufgezählt und die in ihnen installierten LightPis mit ihren IP-Adressen definiert. Die Unterverteilung <code>master</code> gibt einen zusätzlichen Endpunkt zum Einspeisen von Ereignissen. Die Unterverteilungen <code>NV01-01</code>, <code>NV01-02</code>, etc. stellen die Sensoren und Aktoren für die Statemachines zur Verfügung. Auf diese Art und Weise kann man einen LightPi an einer Unterverteilung tauschen ohne die Definition der Statemachines zu verändern. Die Namen für die Unterverteilungen können frei festgelegt werden. Unter dem Schlüssel <code>machines</code> werden die Statemachines definiert. Es können beliebig viele Statemachines angegeben werden. Ihre Namen können ebenfalls frei festgelegt werden. Im folgenden ein paar Beispiele: | Unter dem Schlüssel <code>uri</code> wird die IP-Adresse und der TCP-Port festgelegt auf dem der LightPi-Master auf einkommende Verbindungen lauscht. Unter dem Schlüssel <code>peers</code> werden die Unterverteilungen im Gebäude aufgezählt und die in ihnen installierten LightPis mit ihren IP-Adressen definiert. Die Unterverteilung <code>master</code> gibt einen zusätzlichen Endpunkt zum Einspeisen von Ereignissen. Die Unterverteilungen <code>NV01-01</code>, <code>NV01-02</code>, etc. stellen die Sensoren und Aktoren für die Statemachines zur Verfügung. Auf diese Art und Weise kann man einen LightPi an einer Unterverteilung tauschen ohne die Definition der Statemachines zu verändern. Die Namen für die Unterverteilungen können frei festgelegt werden. Unter dem Schlüssel <code>machines</code> werden die Statemachines definiert. Es können beliebig viele Statemachines angegeben werden. Ihre Namen können ebenfalls frei festgelegt werden. Im folgenden ein paar Beispiele: | ||
=== Statemachine NV01-01:A01 === | |||
"NV01-01:A01": { | "NV01-01:A01": { | ||
"off": { | "off": { | ||
| Zeile 43: | Zeile 44: | ||
} | } | ||
} | } | ||
Die Statemaschine <code>NV01-01:A01</code> hat zwei Zustände: <code>on</code> und <code>off</code>. Unter dem Schlüssel <code>transitions</code> sind die aus dem jeweiligen Zustand heraus erreichbaren Zustände notiert und eine Liste von Ereignissen, bei denen der Zustandswechsel durchgeführt wird. Aus dem Zustand <code>off</code> ist der Zustand <code>on</code> erreichbar. Ist die Statemachine aktuell im Zustand <code>off</code> und wird tritt das Ereignis <code>NV1-01:A01:toggle</code> auf, so wird in den Zustand <code>on</code> gewechselt. Tritt dann erneut das Ereignis <code>NV1-01:A01:toggle</code> auf, so wird zurück in den Zustand <code>off</code> gewechselt. | Die Statemaschine <code>NV01-01:A01</code> hat zwei Zustände: <code>on</code> und <code>off</code>. Unter dem Schlüssel <code>transitions</code> sind die aus dem jeweiligen Zustand heraus erreichbaren Zustände notiert und eine Liste von Ereignissen, bei denen der Zustandswechsel durchgeführt wird. Aus dem Zustand <code>off</code> ist der Zustand <code>on</code> erreichbar. Ist die Statemachine aktuell im Zustand <code>off</code> und wird tritt das Ereignis <code>NV1-01:A01:toggle</code> auf, so wird in den Zustand <code>on</code> gewechselt. Tritt dann erneut das Ereignis <code>NV1-01:A01:toggle</code> auf, so wird zurück in den Zustand <code>off</code> gewechselt. Die Namen der Zustände und Ereignisse können frei gewählt werden. Allerdings unterteilt sich die Menge der Ereignisse in die Symbolereignisse mit frei wählbarem Namen und die Sensorereignisse mit wohldefinierten Namen. Das Ereignis <code>NV1-01:A01:toggle</code> ist ein Symbolereignis. Symbolereignisse können vom LightPi-Master aus mit dem Programm <code>event.php <event></code> ausgelöst werden. Zu den Sensorereignissen gibt es im nächsten Beispiel weitere Erläuterungen. Unter dem Schlüssel <code>actors</code> im Zustand <code>on</code> sind die Ausgänge gelistet die in diesem Zustand geschaltet sein sollen. Der Aktor <code>NV1-01:A01</code> bezeichnet dabei den Ausgang <code>01</code> an der Unterverteilung <code>NV1-01</code>. Die Namen der Aktoren setzen sich dabei aus dem Namen der Unterverteilung, sowie der Aktornummer <code>01</code> bis <code>16</code> zusammen. Ein Ausgang kann durch mehrere Statemachines und Zustände geschaltet werden. Ist mindestens eine Statemachine in einem Zustand in dem ein Ausgang geschaltet sein soll, so wird dieser eingeschaltet. Ist keine Statemachine in einem solchen Zustand, so wird der Ausgang ausgeschaltet. | ||
=== Statemachine NV01-01:all === | |||
"NV1-01:all": { | |||
"off": { | |||
"transitions": { | |||
"on": [ "NV1-01:all:toggle", "NV1-01:S01:1" ] | |||
} | |||
}, | |||
"on": { | |||
"transitions": { | |||
"off": [ "NV1-01:all:toggle", "NV1-01:S01:1" ] | |||
}, | |||
"actors": [ | |||
"NV1-01:A01", "NV1-01:A02", "NV1-01:A03", "NV1-01:A04", | |||
"NV1-01:A05", "NV1-01:A06", "NV1-01:A07", "NV1-01:A08", | |||
"NV1-01:A09", "NV1-01:A10", "NV1-01:A11", "NV1-01:A12", | |||
"NV1-01:A13", "NV1-01:A14", "NV1-01:A15", "NV1-01:A16" | |||
] | |||
} | |||
} | |||
Die Statemaschine <code>NV01-01:all</code> hat wie die aus dem vorherige Beispiel die zwei Zustände <code>on</code> und <code>off</code>. Zwischen den beiden kann mit dem Symbolereignis <code>NV1-01:all:toggle</code> und dem Sensorereignis <code>NV1-01:S01:1</code> gewechselt werden. Wenn an einem Sensor an einem LightPi ein Zustandswechsel auftritt wird ein Sensorereignis ausgelöst. Der Name des Ereignises setzt sich dabei aus dem Namen der Unterverteilung, der Sensornummer <code>01</code> bis <code>16</code> und dem Sensorwert <code>0</code> oder <code>1</code> zusammen. Es wird auch immer noch ein zweites Sensorereignis ausgelöste, dessen Namen sich nur aus dem Namen der Unterverteilung und der Sensornummer zusammensetzt. Beispielweise <code>NV01-01:S01</code>. Im Zustand <code>on</code> werden durch diese Statemachine alle Ausgänge an der Unterverteilung geschaltet. | |||
=== Statemachine Alarm01 === | |||
"Alarm01": { | |||
"off": { | |||
"transitions": { | |||
"on": [ "Alarm01:toggle" ] | |||
} | |||
}, | |||
"on": { | |||
"transitions": { | |||
"off": [ "Alarm01:toggle" ], | |||
"move": [ "NV1-02:S01:1" ] | |||
} | |||
}, | |||
"move": { | |||
"transitions": { | |||
"off": [ "Alarm01:toggle" ], | |||
"timer": [ "NV1-02:S01:0" ] | |||
}, | |||
"actors": [ "NV1-02:A01", "NV1-02:A02" ], | |||
}, | |||
"timer": { | |||
"transitions": { | |||
"on": [ "Alarm01:timeout" ], | |||
"off": [ "Alarm01:toggle" ], | |||
"move": [ "NV1-02:S01:1" ] | |||
}, | |||
"actors": [ "NV1-02:A01", "NV1-02:A02" ], | |||
"enter": [ | |||
[ "timerStart", "Alarm01:timeout", 30 ] | |||
], | |||
"leave": [ | |||
[ "timerStop", "Alarm01:timeout" ] | |||
] | |||
} | |||
} | |||
Die Statemaschine <code>Alarm01</code> modelliert eine Alarmanlage. Im Zustand <code>off</code> ist die Alarmanlage ausgeschaltet und kann durch das Symbolereignis <code>Alarm01:toggle</code> scharf geschaltet werden. Sie ist dann im Zustand <code>on</code>. Tritt dann durch den Bewegungsmelder das Sensorereignis <code>NV1-02:S01:1</code> auf, so wird in den Zustand <code>move</code> gewechselt. Es wurde eine Bewegung entdeckt. Die Alarmsirene und der Alarmblitz an den Ausgängen <code>NV1-02:A01</code> und <code>NV1-02:A02</code> wird eingeschaltet. Wird keine Bewegung mehr entdeckt und das Sensorereignis <code>NV1-02:S01:0</code> ausgelöst so wird in den Zustand <code>timer</code> gewechselt. Bis hierhin wurden an den Zuständen Schlüssel verwendet, die aus den vorherigen Beispielen bereits bekannt waren. Im Zustand <code>timer</code> werden zwei neue Schlüssel verwendet: <code>enter</code> und <code>leave</code>. Hier werden Kommandos und ihre Argumente aufgelistet die beim Betreten und Verlassen des Zustandes ausgeführt werden sollen. Im Augenblick gibt es nur zwei Kommandos. Das Kommando <code>timerStart <name> <dauer></code> und das Kommando <code>timerStop <name></code>. Mit dem Kommando <code>timerStart</code> wird ein Timer mit einem bestimmten Namen und einer bestimmten Dauer in Sekunden gestartet. Läuft der Timer ab so wird ein Symbolereignis mit dem Namen des Timers ausgelöst. Das Kommando <code>timerStop</code> stop den Timer mit dem gegebenen Namen. | |||
== Das Graphmodul li - LightPi == | == Das Graphmodul li - LightPi == | ||