Softwarekonzept
Die Software für die Geräte der dezentralen Heimautomatisierung wird grundsätzlich in C/C++ geschrieben. Damit ist sie vom Ansatz her auf allen Geräten, für die entsprechende Compiler zur Verfügung gestellt werden, lauffähig. Wir haben als Grundlage für die Softwareentwicklung die Arduino Plattform gewählt. Das Konzept, sowohl die Software als auch die Hardware offen zu legen, ist natürlich eine ideale Basis für die Ausbildung angehender Ingenieure. Allerdings setzen wir für die Softwareentwicklung die Umgebung Eclipse ein, genauer ein Paket, das mit einem geeigneten Plug-in für die Arduino-Umgebung under dem Namen Sloeber als Freeware verfügbar ist. Weiteres dazu auf der Seite Firmware.
Inhaltsverzeichnis
Schichtenmodell
Bei unserem Projekt gehen wir noch einen Schritt weiter als bei Arduino, indem wir die Vernetzung beliebiger Geräte (neben den Mikrocontrollern auch Smartphones, Tablets und PCs) über das sogenannte Social Manufacturing Network vereinheitlichen. Die entsprechende Kommunikationssoftware ist daher auch eine der unteren Schichten in einem entsprechend organisierten Schichtenmodell für die Software. Für das Betriebssystem Android stehen entsprechende Klassen in Java zur Verfügung.
Schicht | Beschreibung | Dateien |
---|---|---|
(1) IDE und Zielsystem |
In dieser Schicht werden die Eigenschaften des Entwicklungssystems und des Zielsystems beschrieben. Das sind in erster Linie Schalter, die für eine bedingte Kompilation des Quellcode herangezogen werden und Parameter für die Umgebung, wie z.B. das Netzwerk. |
arduinoDefs.h environment.h socMananetUser.h |
(2) Steuerung des Zeitverhalten |
Für möglichst genau Zeitabläufe in der loop-Funktion, unabhängig von der eingesetzten Hardware, wurde eine Zeitsteuerung eingerichtet, die eine Software-Uhr und einen Betriebsstundenzähler mit einer Auflösung von einer Millisekunde enthält. Daneben steht eine einstellbare Anzahl von Software-Zeitgebern zur Verfügung und das Echtzeitverhalten wird überwacht. |
LoopCheck.h LoopCheck.cpp |
(3) Kommunikation |
Die Kommunikation erfolgt auf Basis von zyklischen Rundrufen, deren Inhalte vom Anwender asynchron eingestellt werden. Zur Zeit wird dafür das UDP-Protokoll bei den klassischen Internet-Schnittstellen Ethernet/LAN und WiFi/WLAN verwendet. Bei den typischen Arduino-Boards über das Ethernet- oder WiFi-Shield und bei den preiswerten WiFi-Modulen ESP8266 und ESP32 über die von Espressif für die Arduino-Umgebung zur Verfügung gestellten Bibliotheken. |
SocManNet.h SocManNet.cpp Twitter.h Twitter.cpp Follower.h Follower.cpp |
(4) Wartung |
Für die Wartung wird eine Schnittstelle für den Zugang durch den Gerätehersteller eingerichtet. Die kann ggf. auch proprietär ausgeführt sein. Allerdings geschieht der Zugriff auf das Gerät nach dem Pull-Prinzip (das Gerät initiiert die Kommunikation) und der Anwender wird eine angemessene Zeit vor dem Zugriff darüber informiert. |
in Entwicklung |
(5) Programmierung |
Mit Programmierung ist an dieser Stelle die Gestaltung von Auswertungen und Abläufen im Gerät durch den Anwender gemeint. Die Programmierschnittstelle für den Anwender ist einheitlich für alle Geräte und ermöglicht in erster Linie die Kombination einzelner vordefinierter Module. |
in Entwicklung |
(6) Zustandsmaschine |
Die funktionalen Abläufe erfolgen über eine Zustandsmaschine. Der aktuelle Zustand eines Gerätes ist Bestandteil der zyklischen Twitter-Botschaft. |
in Entwicklung |
(7) Profile |
In studentischen Projekten (auch Bachelor- und Masterarbeiten) werden Geräte für die Heimautomatisierung entwickelt und getestet. Hier ist eine enge Kooperation mit industriellen Geräteherstellern vorgesehen, soweit die hier vorgestellte dezentrale Heimautomatisierung in ihr Konzept passt. |
Intelligente Bewegungsmelder |
Die Tabelle zeigt das Schichtenmodell für die Organisation der Software. In der Regel bauen die Schichten mit den höheren Nummern auf die mit den niedrigeren Nummern auf. Die Software für die Schichten wird als Open Source (siehe folgenden Abschnitt) auf GitHub zur Verfügung gestellt.
Lizenzmodell
Für den Anwender ist es schwer, die vielfältigen Lizenzmodelle zu durchschauen. Da die hier beschriebene Software für die Ausbildung angehender Elektronik-Ingenieure (Schwerpunkt: Einsatz von Mikrocontrollern und Internet der Dinge (IoT) bzw. Cyber-physische Systeme (CPS)) eingesetzt wird und eine Basis für eigene Entwicklungen darstellt, liegt das Modell von Open Source nahe. Allerdings sollen die mit Einfluss dieser Software erstellten studentischen Projekte sowie Bachelor- und Masterarbeiten ebenfalls allen Interessierten zur Verfügung stehen. Darum wird hier auf die Creative Commons verwiesen, und zwar, wie bei Wikipedia, auf die Variante CC-BY-SA. Das heißt, mit der Verwendung dieser Software verpflichtet man sich, die Namen der ursprünglichen (bisherigen) Autoren zu nennen und sie nur unter diesen Bedingungen auch weiterzugeben. Auf diese Weise ist die Anwendung der Software nicht eingeschränkt und die Arbeit der Entwickler erfährt eine Anerkennung.
IDE und Zielsystem
Nach Meinung des Autors ist der bei den Programmiersprachen C bzw. C++ übliche Präprozessor eine der großen Stärken dieser Hochsprache. Er ist die Basis für die automatisierte Anpassung des Quellcodes an unterschiedliche Entwicklungsumgebungen und Zielsysteme. Wir machen bei der Gestaltung der Software für die dezentrale Heimautomatisierung davon regen Gebrauch, indem wir bedingt Kompilieren und die entsprechenden Schalter in Header-Dateien definieren. Diese sind im Bibliotheksordner environment abgelegt.
environment.h
Diese Datei enthält die Schalter, mit der die Entwicklungsumgebung und das Zielsystem kenntlich gemacht werden. Sie wird über eine von außen vorzunehmende Definition alternativ ausgewertet:
#ifdef smnDEFBYBUILD // Alternative Festlegungen durch Einstellungen in der Build // Umgebung der IDE // ...... #else // Direkte Festlegungen über #define, die allerdings in vielen // Fällen eine eigene environment.h (Kopie und Änderungen) für jede // Entwicklungsumgebung und/oder Zielsystem erforderlich machen. // ...... #endif
Die Definition smnDEFBYBUILD wird bei Bedarf in den Präprozessordefinitionen für den Compiler angegeben. In environment.h sind unter #ifdef smnDEFBYBUILD die weiteren Definitionen smnUBUNTU_ECLIPSE und smnWIN32_VS ausgewertet, die ebenfalls in der IDE gesetzt werden. Hier bei Eclipse auf Ubuntu und bei Visual Studio auf Windows. Die in der Datei environment.h unter diesen Abfragen gemachten Definitionen werden im Sourcecode der Programme ausgewertet und ermöglichen den Einsatz der Software unter Linux und Windows. Sehr interessant ist in dem Fall die Überwachung des Echtzeitverhaltens mit LoopCheck.
Wird die Software für weitere Entwicklungsumgebungen und Zielsysteme angepasst, so muss auch die Datei environment.h entsprechend ergänzt werden.
Hinweis zu Präprozessordefinitionen in Eclipse
Das Kontextmenü des Projektes (rechte Maustaste auf Projekt) enthält den Eintrag Eigenschaften (Properties). Im Menübaum findet man unter C/C++ Build -> Settings den Karteireiter (Tab) Tool Settings und darunter GCC C++ Compiler -> Preprocessor. Der Mausklick darauf liefert ein Editierfeld für Präprozessordefinition, die für das ausgewählte Projekt gelten. Dort ergänzt man z.B. einfach mit smnDEFBYBUILD.
Wenn man allerdings ein Projekt mit dem Arduino-Plugin (Sloeber) bearbeitet, dann wird der GCC nicht in der klassischen Form verwendet, sondern die jeweiliegen Compilervarianten für das eingesetzte Arduino-Board. Demzufolge gibt es auch nicht den oben beschriebenen Menüpunkt für die Präprozessordefinitionen. Stattdessen findet man im Menübaum der Eigenschaften (Properties) den Eintrag Arduino, der u.a. den Karteireiter Compile Options bietet. Darin befindet sich das Textfeld append to C and C++, in das man seine Präprozessordefinitionen, mit dem Schalter -D eingeleitet, einträgt. Also für die Auswertung von #ifdef smnDEFBYBUILD in einer Datei wird hier -DsmnDEFBYBUILD eingetragen.
arduinoDefs.h
Diese Datei ersetzt die Header-Datei Arduino.h für Zielsysteme, die nicht mit der Arduino-Umgebung betrieben werden und daher auch die Datei Arduino.h nicht inkludieren. Hier werden Datentypen definiert, die sonst in Arduino.h zu finden wären. Damit können Sketche (XYZ.ino), die auf typischen Arduino-Boards ablaufen, auch auf anderen Zielsystemen (bzw. auch unter Linux und Windows) übersetzt und bedingt ausgeführt werden.