Graphmodul li - LightPi: Unterschied zwischen den Versionen
Die Seite wurde neu angelegt: „Das Graphmodul li - LightPi bildet alles rund um den LightPi im Graphen ab. Mit dem LightPi können Gebäudeautomatisierungen durchgeführt werden.“ |
|||
| (2 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
Das Graphmodul li - LightPi bildet alles rund um den LightPi im Graphen ab. Mit dem LightPi können Gebäudeautomatisierungen durchgeführt werden. | Das Graphmodul li - LightPi bildet alles rund um den LightPi im Graphen ab. Mit dem LightPi können Gebäudeautomatisierungen durchgeführt werden. | ||
== Der LightPi == | |||
Der LightPi ist eine Appliance mit 16 12V Gleichstrom Eingängen und 16 230V Wechselstrom Ausgängen die über einen verbauten Raspberry Pi ausgelesen bzw. geschaltet werden können. Der LightPi kann so zur Gebäudeautomatisierungen eingesetzt werden. Dieser Artikel beschreibt die Software, welche auf dem Raspberry Pi und im Graphen läuft um den LightPi an den Graphen anzuschließen. | |||
== Der LightPi-Slave == | |||
Der LightPi-Slave ist die Software-Komponente die auf dem im LightPi verbauten Raspberry Pi ausgeführt wird. Sie verbindet sich mit dem LightPi-Master und teilt diesem in regelmässigen Abständen den Schaltzustand der Ausgänge mit. Wird eine Änderung eines Schaltzustandes an einem Eingang entdeckt, so wird dieses Ereignis ebenfalls dem LightPi-Master mitgeteilt. Des weiteren reagiert der LightPi-Slave auf Befehle des LightPi-Masters und schaltet daraufhin die Ausgänge. Der LightPi-Slave schaltet die Ausgänge nur auf Befehl des LightPi-Masters! Der LightPi-Slave ist in Python3 geschrieben und verwendet die Bibliothek [http://abyz.me.uk/rpi/pigpio/python.html pigpio] zum Auslesen und Schalten der Ein- und Ausgänge. Er verbindet sich automatisch mit dem konfigurierten LightPi-Master. Reisst die Verbindung ab, so wird automatisch versucht, diese wiederherzustellen. Die Datenpakete zwischen LightPi-Slave und LightPi-Master sind mit [https://msgpack.org/ msgpack] kodiert. Die Kommunikation erfolgt nicht verschlüsselt und auch nicht authentifiziert über TCP/IP. Eine sichere Netzwerkinfrastruktur ist also notwendig! | |||
== Der LightPi-Master == | |||
Der LightPi-Master ist die Software-Komponente die auf dem Gebäudeserver läuft. Er öffnet einen TCP-Port und wartet auf eingehende Verbindungen von LightPi-Slaves. Er verarbeitet die Zustands- und Ereignis-Nachrichten der LightPi-Slaves und reagiert auf diese mit Befehlen an die LightPi-Slaves. Er verwaltet ein Menge von Statemachines die den gewünschten Schaltzustand der Ausgänge definieren. Der LightPi-Master ist in PHP geschrieben und wird über die Datei <code>etc/master.json</code> konfiguriert: | |||
{ | |||
"uri": "tcp://192.168.1.20:47974", | |||
"peers": { | |||
"master": { | |||
"ip": "192.168.1.20", "lightpi": "master" | |||
}, | |||
"NV1-01": { | |||
"ip": "192.168.64.1", "lightpi": "lightpi01" | |||
}, | |||
"NV1-02": { | |||
"ip": "192.168.64.3", "lightpi": "lightpi03" | |||
} | |||
}, | |||
"machines": { | |||
"NV01-01:A01": { ... }, | |||
"NV01-01:all": { ... }, | |||
"Alarm01": { ... } | |||
} | |||
} | |||
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": { | |||
"off": { | |||
"transitions": { | |||
"on": [ "NV1-01:A01:toggle" ] | |||
} | |||
}, | |||
"on": { | |||
"transitions": { | |||
"off": [ "NV1-01:A01:toggle" ] | |||
}, | |||
"actors": [ "NV1-01:A01" ] | |||
} | |||
} | |||
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 == | |||
Aktuelle Version vom 18. März 2019, 14:41 Uhr
Das Graphmodul li - LightPi bildet alles rund um den LightPi im Graphen ab. Mit dem LightPi können Gebäudeautomatisierungen durchgeführt werden.
Der LightPi
Der LightPi ist eine Appliance mit 16 12V Gleichstrom Eingängen und 16 230V Wechselstrom Ausgängen die über einen verbauten Raspberry Pi ausgelesen bzw. geschaltet werden können. Der LightPi kann so zur Gebäudeautomatisierungen eingesetzt werden. Dieser Artikel beschreibt die Software, welche auf dem Raspberry Pi und im Graphen läuft um den LightPi an den Graphen anzuschließen.
Der LightPi-Slave
Der LightPi-Slave ist die Software-Komponente die auf dem im LightPi verbauten Raspberry Pi ausgeführt wird. Sie verbindet sich mit dem LightPi-Master und teilt diesem in regelmässigen Abständen den Schaltzustand der Ausgänge mit. Wird eine Änderung eines Schaltzustandes an einem Eingang entdeckt, so wird dieses Ereignis ebenfalls dem LightPi-Master mitgeteilt. Des weiteren reagiert der LightPi-Slave auf Befehle des LightPi-Masters und schaltet daraufhin die Ausgänge. Der LightPi-Slave schaltet die Ausgänge nur auf Befehl des LightPi-Masters! Der LightPi-Slave ist in Python3 geschrieben und verwendet die Bibliothek pigpio zum Auslesen und Schalten der Ein- und Ausgänge. Er verbindet sich automatisch mit dem konfigurierten LightPi-Master. Reisst die Verbindung ab, so wird automatisch versucht, diese wiederherzustellen. Die Datenpakete zwischen LightPi-Slave und LightPi-Master sind mit msgpack kodiert. Die Kommunikation erfolgt nicht verschlüsselt und auch nicht authentifiziert über TCP/IP. Eine sichere Netzwerkinfrastruktur ist also notwendig!
Der LightPi-Master
Der LightPi-Master ist die Software-Komponente die auf dem Gebäudeserver läuft. Er öffnet einen TCP-Port und wartet auf eingehende Verbindungen von LightPi-Slaves. Er verarbeitet die Zustands- und Ereignis-Nachrichten der LightPi-Slaves und reagiert auf diese mit Befehlen an die LightPi-Slaves. Er verwaltet ein Menge von Statemachines die den gewünschten Schaltzustand der Ausgänge definieren. Der LightPi-Master ist in PHP geschrieben und wird über die Datei etc/master.json konfiguriert:
{
"uri": "tcp://192.168.1.20:47974",
"peers": {
"master": {
"ip": "192.168.1.20", "lightpi": "master"
},
"NV1-01": {
"ip": "192.168.64.1", "lightpi": "lightpi01"
},
"NV1-02": {
"ip": "192.168.64.3", "lightpi": "lightpi03"
}
},
"machines": {
"NV01-01:A01": { ... },
"NV01-01:all": { ... },
"Alarm01": { ... }
}
}
Unter dem Schlüssel uri wird die IP-Adresse und der TCP-Port festgelegt auf dem der LightPi-Master auf einkommende Verbindungen lauscht. Unter dem Schlüssel peers werden die Unterverteilungen im Gebäude aufgezählt und die in ihnen installierten LightPis mit ihren IP-Adressen definiert. Die Unterverteilung master gibt einen zusätzlichen Endpunkt zum Einspeisen von Ereignissen. Die Unterverteilungen NV01-01, NV01-02, 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 machines 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": {
"off": {
"transitions": {
"on": [ "NV1-01:A01:toggle" ]
}
},
"on": {
"transitions": {
"off": [ "NV1-01:A01:toggle" ]
},
"actors": [ "NV1-01:A01" ]
}
}
Die Statemaschine NV01-01:A01 hat zwei Zustände: on und off. Unter dem Schlüssel transitions 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 off ist der Zustand on erreichbar. Ist die Statemachine aktuell im Zustand off und wird tritt das Ereignis NV1-01:A01:toggle auf, so wird in den Zustand on gewechselt. Tritt dann erneut das Ereignis NV1-01:A01:toggle auf, so wird zurück in den Zustand off 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 NV1-01:A01:toggle ist ein Symbolereignis. Symbolereignisse können vom LightPi-Master aus mit dem Programm event.php <event> ausgelöst werden. Zu den Sensorereignissen gibt es im nächsten Beispiel weitere Erläuterungen. Unter dem Schlüssel actors im Zustand on sind die Ausgänge gelistet die in diesem Zustand geschaltet sein sollen. Der Aktor NV1-01:A01 bezeichnet dabei den Ausgang 01 an der Unterverteilung NV1-01. Die Namen der Aktoren setzen sich dabei aus dem Namen der Unterverteilung, sowie der Aktornummer 01 bis 16 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 NV01-01:all hat wie die aus dem vorherige Beispiel die zwei Zustände on und off. Zwischen den beiden kann mit dem Symbolereignis NV1-01:all:toggle und dem Sensorereignis NV1-01:S01:1 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 01 bis 16 und dem Sensorwert 0 oder 1 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 NV01-01:S01. Im Zustand on 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 Alarm01 modelliert eine Alarmanlage. Im Zustand off ist die Alarmanlage ausgeschaltet und kann durch das Symbolereignis Alarm01:toggle scharf geschaltet werden. Sie ist dann im Zustand on. Tritt dann durch den Bewegungsmelder das Sensorereignis NV1-02:S01:1 auf, so wird in den Zustand move gewechselt. Es wurde eine Bewegung entdeckt. Die Alarmsirene und der Alarmblitz an den Ausgängen NV1-02:A01 und NV1-02:A02 wird eingeschaltet. Wird keine Bewegung mehr entdeckt und das Sensorereignis NV1-02:S01:0 ausgelöst so wird in den Zustand timer gewechselt. Bis hierhin wurden an den Zuständen Schlüssel verwendet, die aus den vorherigen Beispielen bereits bekannt waren. Im Zustand timer werden zwei neue Schlüssel verwendet: enter und leave. 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 timerStart <name> <dauer> und das Kommando timerStop <name>. Mit dem Kommando timerStart 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 timerStop stop den Timer mit dem gegebenen Namen.