<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.graph-it.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Swassen</id>
	<title>Graph-IT Wiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.graph-it.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Swassen"/>
	<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/Spezial:Beitr%C3%A4ge/Swassen"/>
	<updated>2026-06-02T05:49:21Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki.graph-it.com/index.php?title=Graphmodul_li_-_LightPi&amp;diff=37</id>
		<title>Graphmodul li - LightPi</title>
		<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/index.php?title=Graphmodul_li_-_LightPi&amp;diff=37"/>
		<updated>2019-03-18T14:41:51Z</updated>

		<summary type="html">&lt;p&gt;Swassen: /* Der LightPi-Master */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das Graphmodul li - LightPi bildet alles rund um den LightPi im Graphen ab. Mit dem LightPi können Gebäudeautomatisierungen durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
== Der LightPi ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Der LightPi-Slave ==&lt;br /&gt;
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!&lt;br /&gt;
&lt;br /&gt;
== Der LightPi-Master ==&lt;br /&gt;
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 &amp;lt;code&amp;gt;etc/master.json&amp;lt;/code&amp;gt; konfiguriert:&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;uri&amp;quot;: &amp;quot;tcp://192.168.1.20:47974&amp;quot;,&lt;br /&gt;
   &amp;quot;peers&amp;quot;: {&lt;br /&gt;
     &amp;quot;master&amp;quot;: {&lt;br /&gt;
       &amp;quot;ip&amp;quot;: &amp;quot;192.168.1.20&amp;quot;, &amp;quot;lightpi&amp;quot;: &amp;quot;master&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;NV1-01&amp;quot;: {&lt;br /&gt;
       &amp;quot;ip&amp;quot;: &amp;quot;192.168.64.1&amp;quot;, &amp;quot;lightpi&amp;quot;: &amp;quot;lightpi01&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;NV1-02&amp;quot;: {&lt;br /&gt;
       &amp;quot;ip&amp;quot;: &amp;quot;192.168.64.3&amp;quot;, &amp;quot;lightpi&amp;quot;: &amp;quot;lightpi03&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;machines&amp;quot;: {&lt;br /&gt;
     &amp;quot;NV01-01:A01&amp;quot;: { ... },&lt;br /&gt;
     &amp;quot;NV01-01:all&amp;quot;: { ... },&lt;br /&gt;
     &amp;quot;Alarm01&amp;quot;: { ... }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
Unter dem Schlüssel &amp;lt;code&amp;gt;uri&amp;lt;/code&amp;gt; wird die IP-Adresse und der TCP-Port festgelegt auf dem der LightPi-Master auf einkommende Verbindungen lauscht. Unter dem Schlüssel &amp;lt;code&amp;gt;peers&amp;lt;/code&amp;gt; werden die Unterverteilungen im Gebäude aufgezählt und die in ihnen installierten LightPis mit ihren IP-Adressen definiert. Die Unterverteilung &amp;lt;code&amp;gt;master&amp;lt;/code&amp;gt; gibt einen zusätzlichen Endpunkt zum Einspeisen von Ereignissen. Die Unterverteilungen &amp;lt;code&amp;gt;NV01-01&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NV01-02&amp;lt;/code&amp;gt;, 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 &amp;lt;code&amp;gt;machines&amp;lt;/code&amp;gt; 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:&lt;br /&gt;
&lt;br /&gt;
=== Statemachine NV01-01:A01 ===&lt;br /&gt;
 &amp;quot;NV01-01:A01&amp;quot;: {&lt;br /&gt;
   &amp;quot;off&amp;quot;: {&lt;br /&gt;
     &amp;quot;transitions&amp;quot;: {&lt;br /&gt;
       &amp;quot;on&amp;quot;: [ &amp;quot;NV1-01:A01:toggle&amp;quot; ]&lt;br /&gt;
     }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;on&amp;quot;: {&lt;br /&gt;
     &amp;quot;transitions&amp;quot;: {&lt;br /&gt;
       &amp;quot;off&amp;quot;: [ &amp;quot;NV1-01:A01:toggle&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;actors&amp;quot;: [ &amp;quot;NV1-01:A01&amp;quot; ]&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
Die Statemaschine &amp;lt;code&amp;gt;NV01-01:A01&amp;lt;/code&amp;gt; hat zwei Zustände: &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;. Unter dem Schlüssel &amp;lt;code&amp;gt;transitions&amp;lt;/code&amp;gt; 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 &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; ist der Zustand &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; erreichbar. Ist die Statemachine aktuell im Zustand &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; und wird tritt das Ereignis &amp;lt;code&amp;gt;NV1-01:A01:toggle&amp;lt;/code&amp;gt; auf, so wird in den Zustand &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; gewechselt. Tritt dann erneut das Ereignis &amp;lt;code&amp;gt;NV1-01:A01:toggle&amp;lt;/code&amp;gt; auf, so wird zurück in den Zustand &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; 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 &amp;lt;code&amp;gt;NV1-01:A01:toggle&amp;lt;/code&amp;gt; ist ein Symbolereignis. Symbolereignisse können vom LightPi-Master aus mit dem Programm &amp;lt;code&amp;gt;event.php &amp;lt;event&amp;gt;&amp;lt;/code&amp;gt; ausgelöst werden. Zu den Sensorereignissen gibt es im nächsten Beispiel weitere Erläuterungen. Unter dem Schlüssel &amp;lt;code&amp;gt;actors&amp;lt;/code&amp;gt; im Zustand &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; sind die Ausgänge gelistet die in diesem Zustand geschaltet sein sollen. Der Aktor &amp;lt;code&amp;gt;NV1-01:A01&amp;lt;/code&amp;gt; bezeichnet dabei den Ausgang &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; an der Unterverteilung &amp;lt;code&amp;gt;NV1-01&amp;lt;/code&amp;gt;. Die Namen der Aktoren setzen sich dabei aus dem Namen der Unterverteilung, sowie der Aktornummer &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; bis &amp;lt;code&amp;gt;16&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
=== Statemachine NV01-01:all ===&lt;br /&gt;
 &amp;quot;NV1-01:all&amp;quot;: {&lt;br /&gt;
   &amp;quot;off&amp;quot;: {&lt;br /&gt;
     &amp;quot;transitions&amp;quot;: {&lt;br /&gt;
       &amp;quot;on&amp;quot;: [ &amp;quot;NV1-01:all:toggle&amp;quot;, &amp;quot;NV1-01:S01:1&amp;quot; ]&lt;br /&gt;
     }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;on&amp;quot;: {&lt;br /&gt;
     &amp;quot;transitions&amp;quot;: {&lt;br /&gt;
       &amp;quot;off&amp;quot;: [ &amp;quot;NV1-01:all:toggle&amp;quot;, &amp;quot;NV1-01:S01:1&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;actors&amp;quot;: [&lt;br /&gt;
       &amp;quot;NV1-01:A01&amp;quot;, &amp;quot;NV1-01:A02&amp;quot;, &amp;quot;NV1-01:A03&amp;quot;, &amp;quot;NV1-01:A04&amp;quot;,&lt;br /&gt;
       &amp;quot;NV1-01:A05&amp;quot;, &amp;quot;NV1-01:A06&amp;quot;, &amp;quot;NV1-01:A07&amp;quot;, &amp;quot;NV1-01:A08&amp;quot;,&lt;br /&gt;
       &amp;quot;NV1-01:A09&amp;quot;, &amp;quot;NV1-01:A10&amp;quot;, &amp;quot;NV1-01:A11&amp;quot;, &amp;quot;NV1-01:A12&amp;quot;,&lt;br /&gt;
       &amp;quot;NV1-01:A13&amp;quot;, &amp;quot;NV1-01:A14&amp;quot;, &amp;quot;NV1-01:A15&amp;quot;, &amp;quot;NV1-01:A16&amp;quot;&lt;br /&gt;
     ]&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
Die Statemaschine &amp;lt;code&amp;gt;NV01-01:all&amp;lt;/code&amp;gt; hat wie die aus dem vorherige Beispiel die zwei Zustände &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;. Zwischen den beiden kann mit dem Symbolereignis &amp;lt;code&amp;gt;NV1-01:all:toggle&amp;lt;/code&amp;gt; und dem Sensorereignis &amp;lt;code&amp;gt;NV1-01:S01:1&amp;lt;/code&amp;gt; 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 &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; bis &amp;lt;code&amp;gt;16&amp;lt;/code&amp;gt; und dem Sensorwert &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; 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 &amp;lt;code&amp;gt;NV01-01:S01&amp;lt;/code&amp;gt;. Im Zustand &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; werden durch diese Statemachine alle Ausgänge an der Unterverteilung geschaltet.&lt;br /&gt;
&lt;br /&gt;
=== Statemachine Alarm01 ===&lt;br /&gt;
 &amp;quot;Alarm01&amp;quot;: {&lt;br /&gt;
   &amp;quot;off&amp;quot;: {&lt;br /&gt;
     &amp;quot;transitions&amp;quot;: {&lt;br /&gt;
       &amp;quot;on&amp;quot;: [ &amp;quot;Alarm01:toggle&amp;quot; ]&lt;br /&gt;
     }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;on&amp;quot;: {&lt;br /&gt;
     &amp;quot;transitions&amp;quot;: {&lt;br /&gt;
       &amp;quot;off&amp;quot;: [ &amp;quot;Alarm01:toggle&amp;quot; ],&lt;br /&gt;
       &amp;quot;move&amp;quot;: [ &amp;quot;NV1-02:S01:1&amp;quot; ]&lt;br /&gt;
     }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;move&amp;quot;: {&lt;br /&gt;
     &amp;quot;transitions&amp;quot;: {&lt;br /&gt;
       &amp;quot;off&amp;quot;: [ &amp;quot;Alarm01:toggle&amp;quot; ],  &lt;br /&gt;
       &amp;quot;timer&amp;quot;: [ &amp;quot;NV1-02:S01:0&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;actors&amp;quot;: [ &amp;quot;NV1-02:A01&amp;quot;, &amp;quot;NV1-02:A02&amp;quot; ],  &lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;timer&amp;quot;: {&lt;br /&gt;
     &amp;quot;transitions&amp;quot;: {&lt;br /&gt;
       &amp;quot;on&amp;quot;: [ &amp;quot;Alarm01:timeout&amp;quot; ],&lt;br /&gt;
       &amp;quot;off&amp;quot;: [ &amp;quot;Alarm01:toggle&amp;quot; ],&lt;br /&gt;
       &amp;quot;move&amp;quot;: [ &amp;quot;NV1-02:S01:1&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;actors&amp;quot;: [ &amp;quot;NV1-02:A01&amp;quot;, &amp;quot;NV1-02:A02&amp;quot; ],&lt;br /&gt;
     &amp;quot;enter&amp;quot;: [&lt;br /&gt;
       [ &amp;quot;timerStart&amp;quot;, &amp;quot;Alarm01:timeout&amp;quot;, 30 ]&lt;br /&gt;
     ],&lt;br /&gt;
     &amp;quot;leave&amp;quot;: [&lt;br /&gt;
       [ &amp;quot;timerStop&amp;quot;, &amp;quot;Alarm01:timeout&amp;quot; ]&lt;br /&gt;
     ]&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
Die Statemaschine &amp;lt;code&amp;gt;Alarm01&amp;lt;/code&amp;gt; modelliert eine Alarmanlage. Im Zustand &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; ist die Alarmanlage ausgeschaltet und kann durch das Symbolereignis &amp;lt;code&amp;gt;Alarm01:toggle&amp;lt;/code&amp;gt; scharf geschaltet werden. Sie ist dann im Zustand &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;. Tritt dann durch den Bewegungsmelder das Sensorereignis &amp;lt;code&amp;gt;NV1-02:S01:1&amp;lt;/code&amp;gt; auf, so wird in den Zustand &amp;lt;code&amp;gt;move&amp;lt;/code&amp;gt; gewechselt. Es wurde eine Bewegung entdeckt. Die Alarmsirene und der Alarmblitz an den Ausgängen &amp;lt;code&amp;gt;NV1-02:A01&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;NV1-02:A02&amp;lt;/code&amp;gt; wird eingeschaltet. Wird keine Bewegung mehr entdeckt und das Sensorereignis &amp;lt;code&amp;gt;NV1-02:S01:0&amp;lt;/code&amp;gt; ausgelöst so wird in den Zustand &amp;lt;code&amp;gt;timer&amp;lt;/code&amp;gt; gewechselt. Bis hierhin wurden an den Zuständen Schlüssel verwendet, die aus den vorherigen Beispielen bereits bekannt waren. Im Zustand &amp;lt;code&amp;gt;timer&amp;lt;/code&amp;gt; werden zwei neue Schlüssel verwendet: &amp;lt;code&amp;gt;enter&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;leave&amp;lt;/code&amp;gt;. 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 &amp;lt;code&amp;gt;timerStart &amp;lt;name&amp;gt; &amp;lt;dauer&amp;gt;&amp;lt;/code&amp;gt; und das Kommando &amp;lt;code&amp;gt;timerStop &amp;lt;name&amp;gt;&amp;lt;/code&amp;gt;. Mit dem Kommando &amp;lt;code&amp;gt;timerStart&amp;lt;/code&amp;gt; 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 &amp;lt;code&amp;gt;timerStop&amp;lt;/code&amp;gt; stop den Timer mit dem gegebenen Namen.&lt;br /&gt;
&lt;br /&gt;
== Das Graphmodul li - LightPi ==&lt;/div&gt;</summary>
		<author><name>Swassen</name></author>
	</entry>
	<entry>
		<id>https://wiki.graph-it.com/index.php?title=Graphmodul_li_-_LightPi&amp;diff=36</id>
		<title>Graphmodul li - LightPi</title>
		<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/index.php?title=Graphmodul_li_-_LightPi&amp;diff=36"/>
		<updated>2019-03-18T11:53:17Z</updated>

		<summary type="html">&lt;p&gt;Swassen: /* Der LightPi-Master */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das Graphmodul li - LightPi bildet alles rund um den LightPi im Graphen ab. Mit dem LightPi können Gebäudeautomatisierungen durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
== Der LightPi ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Der LightPi-Slave ==&lt;br /&gt;
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!&lt;br /&gt;
&lt;br /&gt;
== Der LightPi-Master ==&lt;br /&gt;
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 &amp;lt;code&amp;gt;etc/master.json&amp;lt;/code&amp;gt; konfiguriert:&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;uri&amp;quot;: &amp;quot;tcp://192.168.1.20:47974&amp;quot;,&lt;br /&gt;
   &amp;quot;peers&amp;quot;: {&lt;br /&gt;
     &amp;quot;master&amp;quot;: {&lt;br /&gt;
       &amp;quot;ip&amp;quot;: &amp;quot;192.168.1.20&amp;quot;, &amp;quot;lightpi&amp;quot;: &amp;quot;master&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;NV1-01&amp;quot;: {&lt;br /&gt;
       &amp;quot;ip&amp;quot;: &amp;quot;192.168.64.1&amp;quot;, &amp;quot;lightpi&amp;quot;: &amp;quot;lightpi01&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;NV1-02&amp;quot;: {&lt;br /&gt;
       &amp;quot;ip&amp;quot;: &amp;quot;192.168.64.3&amp;quot;, &amp;quot;lightpi&amp;quot;: &amp;quot;lightpi03&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;machines&amp;quot;: {&lt;br /&gt;
     &amp;quot;NV01-01:A01&amp;quot;: { ... },&lt;br /&gt;
     &amp;quot;NV01-01:all&amp;quot;: { ... },&lt;br /&gt;
     &amp;quot;Alarm01&amp;quot;: { ... }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
Unter dem Schlüssel &amp;lt;code&amp;gt;uri&amp;lt;/code&amp;gt; wird die IP-Adresse und der TCP-Port festgelegt auf dem der LightPi-Master auf einkommende Verbindungen lauscht. Unter dem Schlüssel &amp;lt;code&amp;gt;peers&amp;lt;/code&amp;gt; werden die Unterverteilungen im Gebäude aufgezählt und die in ihnen installierten LightPis mit ihren IP-Adressen definiert. Die Unterverteilung &amp;lt;code&amp;gt;master&amp;lt;/code&amp;gt; gibt einen zusätzlichen Endpunkt zum Einspeisen von Ereignissen. Die Unterverteilungen &amp;lt;code&amp;gt;NV01-01&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NV01-02&amp;lt;/code&amp;gt;, 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 &amp;lt;code&amp;gt;machines&amp;lt;/code&amp;gt; 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:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;NV01-01:A01&amp;quot;: {&lt;br /&gt;
   &amp;quot;off&amp;quot;: {&lt;br /&gt;
     &amp;quot;transitions&amp;quot;: {&lt;br /&gt;
       &amp;quot;on&amp;quot;: [ &amp;quot;NV1-01:A01:toggle&amp;quot; ]&lt;br /&gt;
     }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;on&amp;quot;: {&lt;br /&gt;
     &amp;quot;transitions&amp;quot;: {&lt;br /&gt;
       &amp;quot;off&amp;quot;: [ &amp;quot;NV1-01:A01:toggle&amp;quot; ]&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;actors&amp;quot;: [ &amp;quot;NV1-01:A01&amp;quot; ]&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
Die Statemaschine &amp;lt;code&amp;gt;NV01-01:A01&amp;lt;/code&amp;gt; hat zwei Zustände: &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;. Unter dem Schlüssel &amp;lt;code&amp;gt;transitions&amp;lt;/code&amp;gt; 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 &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; ist der Zustand &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; erreichbar. Ist die Statemachine aktuell im Zustand &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; und wird tritt das Ereignis &amp;lt;code&amp;gt;NV1-01:A01:toggle&amp;lt;/code&amp;gt; auf, so wird in den Zustand &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; gewechselt. Tritt dann erneut das Ereignis &amp;lt;code&amp;gt;NV1-01:A01:toggle&amp;lt;/code&amp;gt; auf, so wird zurück in den Zustand &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; gewechselt.&lt;br /&gt;
&lt;br /&gt;
== Das Graphmodul li - LightPi ==&lt;/div&gt;</summary>
		<author><name>Swassen</name></author>
	</entry>
	<entry>
		<id>https://wiki.graph-it.com/index.php?title=Graphmodul_li_-_LightPi&amp;diff=35</id>
		<title>Graphmodul li - LightPi</title>
		<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/index.php?title=Graphmodul_li_-_LightPi&amp;diff=35"/>
		<updated>2019-03-18T10:45:43Z</updated>

		<summary type="html">&lt;p&gt;Swassen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das Graphmodul li - LightPi bildet alles rund um den LightPi im Graphen ab. Mit dem LightPi können Gebäudeautomatisierungen durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
== Der LightPi ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Der LightPi-Slave ==&lt;br /&gt;
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!&lt;br /&gt;
&lt;br /&gt;
== Der LightPi-Master ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Das Graphmodul li - LightPi ==&lt;/div&gt;</summary>
		<author><name>Swassen</name></author>
	</entry>
	<entry>
		<id>https://wiki.graph-it.com/index.php?title=Lxdhost-Server&amp;diff=31</id>
		<title>Lxdhost-Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/index.php?title=Lxdhost-Server&amp;diff=31"/>
		<updated>2019-03-14T13:26:26Z</updated>

		<summary type="html">&lt;p&gt;Swassen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ziel dieser Anleitung ist eines ausfallsicheren LXDHost. Die Anleitung basiert auf der Anleitung [[Server-Basissystem]]. Das System hat zwei zusätzliche Festplatten auf denen die LXD-Container abgelegt werden. Die Festplatten sind mit LVM zu einer Volume-Group zusammengefasst. In dieser wird ein Logical-Volume vom Typ &amp;lt;code&amp;gt;raid1&amp;lt;/code&amp;gt; angelegt. Als Dateisystem wird wieder BTRFS eingesetzt. Das Netzwerk wird so konfiguriert, das die LXD-Container direkten Zugriff auf das Netz haben und von dort per DHCP mit IP-Adressen versorgt werden können. Dazu wird das in der vorhergehenden Anleitung konfigurierte Interface &amp;lt;code&amp;gt;eno1&amp;lt;/code&amp;gt; durch die Bridge &amp;lt;code&amp;gt;lxdbr0&amp;lt;/code&amp;gt; ersetzt.&lt;br /&gt;
&lt;br /&gt;
==Voraussetzungen==&lt;br /&gt;
Funktionsfähiges Server Basissystem&lt;br /&gt;
&lt;br /&gt;
Die Dateien lxdh-setup und lxdh-config-example aus den git-Repository [[https://github.com/heiko-schlabach/Server-Basissystem]]&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
Der Server wird gebootet und der Benutzer &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; meldet sich am System an. Nun werden die Skripte aus dem Git-Repository abgerufen.&lt;br /&gt;
 apt install git &lt;br /&gt;
 git clone https://github.com/heiko-schlabach/Server-Basissystem&lt;br /&gt;
 cd Server-Basissystem&lt;br /&gt;
&lt;br /&gt;
Zunächst muss eine Konfigurationsdatei für das Skript &amp;lt;code&amp;gt;lxdh-setup&amp;lt;/code&amp;gt; angelegt werden:&lt;br /&gt;
&lt;br /&gt;
 cp lxdh-config-example lxdh-config&lt;br /&gt;
 nano lxdh-config&lt;br /&gt;
&lt;br /&gt;
Nun kann das Skript lxdh-setup aufgerufen werden:&lt;br /&gt;
&lt;br /&gt;
  ./lxdh-setup lxdh-config&lt;br /&gt;
&lt;br /&gt;
Während der Abarbeitung wird der Benutzer nach dem Passwort für den LXD-Deamon gefragt. Anschliessend kann das System neu gestartet werden.&lt;/div&gt;</summary>
		<author><name>Swassen</name></author>
	</entry>
	<entry>
		<id>https://wiki.graph-it.com/index.php?title=Server-Basissystem&amp;diff=30</id>
		<title>Server-Basissystem</title>
		<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/index.php?title=Server-Basissystem&amp;diff=30"/>
		<updated>2019-03-14T11:52:31Z</updated>

		<summary type="html">&lt;p&gt;Swassen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Allgemein==&lt;br /&gt;
Das Ziel dieser Anleitung ist ein Ubuntu-Minimal-System mit folgenden Eigenschaften: Das System hat zwei System-Festplatten. Fällt eine der beiden Festplatten aus, so funktioniert das System trotzdem ohne Beeinträchtigung weiter. Dies umfasst auch den Neustart. Ein Hot-Swap der Festplatten ist ebenfalls möglich.&lt;br /&gt;
&lt;br /&gt;
Es wurde keine Möglichkeit gefunden unter Ubuntu zwei EFI-Partionen synchron zu halten. Aus diesem Grund muss das System mit BIOS oder UEFI-Legacy gebootet werden.&lt;br /&gt;
&lt;br /&gt;
Als Partitionstabelle wurde GPT gewählt. Für die zweite Stufe von GRUB braucht man dann eine zusätzliche kleine Partition vom Typ &amp;quot;BIOS boot&amp;quot;. Diese muss auf beiden Festplatten angelegt werden. Es wird eine Größe von 1MB empfohlen. Ein Dateisystem darf in dieser Partition nicht angelegt werden. Die Partion wird unter Ubuntu bei Installation und Update des Bootloaders automatisch aktualisiert und synchron gehalten.&lt;br /&gt;
&lt;br /&gt;
Die zweite Partition umfasst jeweils den Rest der Festplatte. Sie sollte den Typ &amp;quot;Linux LVM&amp;quot; haben. Die beiden großen Partition werden in einer LVM-Volume-Group zusammengefasst. In der Volume-Group wird dann ein Logical-Volume vom Typ raid1 angelegt. Das Logical-Volume muss nicht sehr groß sein, da nur ein Minimal-System installiert werden soll. Sollte der Platz knapp werden, so kann man das Logical-Volume und das enthaltene Dateisystem bis zu der Größe der kleineren Festplatte erweitern.&lt;br /&gt;
&lt;br /&gt;
Als Dateisystem für das Logical-Volume wird BTRFS verwendet. Dies gestattet es, vor umfangreicheren Änderungen am Betriebsystem, einen Snapshot anzulegen. In den Dateisystem werden die drei Subvolumes &amp;lt;code&amp;gt;@&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;@home&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;@snapshot&amp;lt;/code&amp;gt; angelegt, welche an &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/home&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;/snapshot&amp;lt;/code&amp;gt; eingehängt werden.&lt;br /&gt;
&lt;br /&gt;
Zum Überwachen der Festplatten wird das Paket &amp;lt;code&amp;gt;smartmontools&amp;lt;/code&amp;gt; installiert und eingerichtet. Zum Versenden von Systemmails wird das Paket &amp;lt;code&amp;gt;msmtp-mta&amp;lt;/code&amp;gt; verwendet.&lt;br /&gt;
&lt;br /&gt;
Das System wird nicht von einem Installationsmedium sondern mit &amp;lt;code&amp;gt;debootstrap&amp;lt;/code&amp;gt; installiert. Deshalb kann zur Installation irgendein System verwendet werden, das mit den notwendigen Tools ausgestattet ist. Am einfachsten ist es den Server mit dem Live-System von einem &amp;quot;Ubuntu Desktop 18.04&amp;quot;-Stick zu booten. So kann man einerseits beim Systemstart das Tastaturlayout wählen und andererseits diese Anleitung in einem Browser öffnen. &lt;br /&gt;
&lt;br /&gt;
==Voraussetzungen==&lt;br /&gt;
&lt;br /&gt;
[[Server]] mit 2 Systemfestplatten SSD im Wechselrahmen&lt;br /&gt;
&lt;br /&gt;
USB Stick mit Ubuntu 18.04 Desktop zum Installieren&lt;br /&gt;
&lt;br /&gt;
Netzwerk mit DHCP und Internetverbindung&lt;br /&gt;
&lt;br /&gt;
Die Dateien basy-bootstrap, basy-setup und basy-config-example aus dem GitHub Repository [[https://github.com/heiko-schlabach/Server-Basissystem]]&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&lt;br /&gt;
Der Server wird von einem &amp;quot;Ubuntu Desktop 18.04&amp;quot;-Stick gebootet. Dabei ist bei einem UEFI-System darauf zu achten, das der Server im Legacy-Modus gestartet wird. Man wählt die Sprache und das man Ubuntu zunächst ausprobieren möchte. Nach dem der Ubuntu-Desktop fertig gestartet ist öffnet man ein Shell und holt sich mit &amp;lt;code&amp;gt;sudo bash&amp;lt;/code&amp;gt; Superuser-Rechte. Nun können die Skripte aus dem Git-Repository abgerufen werden.&lt;br /&gt;
 apt install git &lt;br /&gt;
 git clone https://github.com/heiko-schlabach/Server-Basissystem&lt;br /&gt;
 cd Server-Basissystem&lt;br /&gt;
&lt;br /&gt;
Zunächst muss eine Konfigurationsdatei für das Skript &amp;lt;code&amp;gt;basy-bootstrap&amp;lt;/code&amp;gt; angelegt werden:&lt;br /&gt;
 cp basy-config-example basy-config&lt;br /&gt;
 nano basy-config&lt;br /&gt;
&lt;br /&gt;
Nun kann das Skript &amp;lt;code&amp;gt;basy-bootstrap&amp;lt;/code&amp;gt; aufgerufen werden:&lt;br /&gt;
 ./basy-bootstrap basy-config&lt;br /&gt;
&lt;br /&gt;
Während der Abarbeitung wird der Benutzer nach dem &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;-Passwort für das System gefragt. Anschliessend kann das System neu gestartet werden.&lt;/div&gt;</summary>
		<author><name>Swassen</name></author>
	</entry>
</feed>