Zur Abbildung unseres Vorhabens, ein Alarmsystem bestehend aus diversen Funk-Sensoren und -Aktoren mittels eines Raspberry Pi zu realisieren, war der Entwurf eines objektorientierten Datenmodells notwendig. Diese Architektur bildet den Grundstein für die Alarmsystem-Logik, also das Alarmsystem-Backend, auf dem Raspberry Pi. Die Wahl bezüglich der Programmiersprache für diesen Teil unserer Lösung ist auf Java gefallen.

Das grundlegende Element in unserem entworfenen Datenmodell bildet die abstrakte Klasse Component. Diese Klasse beerbt die Klasse Sensor und die Klasse Aktor. Ein Sensor stellt in unserem Datenmodell eine Komponente dar, welche Input für eine Alarmregel ist und deren Zustand beziehungsweise die logische Verknüpfung der Zustände mehrerer Sensoren einen Alarm auslösen kann. Die Klassen Motionsensor (Bewegungssensor) und Doorsensor (Türsensor bzw. Reed-Sensor) sind konkrete Implementierungen eines Sensors und erben hierfür von der Klasse Sensor.

Hierzu analog spiegelt sich diese Vererbungshierarchie bei den Aktoren hab. Aktoren sind aktive Komponenten unseres Alarmsystems, welche als Ergebnis eines Alarms aktiviert werden können. Hierbei stehen die konkreten Implementierungen für eine Sirene und eine Steckdose, an welche beispielsweise eine Lampe angeschlossen werden kann, zur Verfügung. Des Weiteren enthält das Modell bei den Aktoren auch eine Kamera, wobei diese sich von den anderen Komponenten bezüglich der Funk-Kommunikation wesentlich unterscheidet, da hier kein 868-Mhz-Funk eingesetzt wird, sondern jede IP-fähige Kamera unterstützt werden soll, welche eine URL zum Abfragen eines Livebildes beziehungsweise Videostreams bereitstellt.

Die Funktionalitäten der konkreten Sensor- und Aktortypen sind in die Superklassen Sensor, Aktor beziehungsweise bei den absoluten Grundfunktionalitäten in die Klasse Component ausgelagert. Die Kamera beispielsweise weicht von dem sonst verwendeten typischen Schema (da kein 868-Mhz-Funk) ab und überschreibt folglich die relevanten Methoden um die abweichende Funktionalität zu realisieren.

 

Zentraler Einstiegspunkt für unser Alarmsystem stellt die Klasse Alarmsystem dar. Bei der Implementierung wurde ein Singleton-Entwurfsmuster eingesetzt, sodass maximal eine Instanz für ein Alarmsystem zur Verfügung steht. Auf diese Instanz kann mit Alarmsystem.getInstance() zugegriffen werden. Dieses Alarmsystem stellt Methoden bereit, welche beim Eintreffen einer Registrierungsmessage eines Sensors oder Aktors aufgerufen werden, und dann die entsprechenden Datenobjekte erzeugen. Auch Datennachrichten, beispielweise das Öffnen einer Tür eines registrierten Türsensors, werden vom Alarmsystem-Singleton prozessiert.

Das Auslösen eines Alarms funktioniert über Datenobjekte der Klasse Rule (Regel). Eine Regel enthält mindestens einen Sensor als auslösenden Input und mindestens einen Aktor, welcher dann aktiviert wird, wenn die Sensoren den in der Regel definierten Input zum Auslösen der jeweiligen Alarmregel liefern.

Das Persistieren der Datenobjekte erfolgt über die Implementierung der Serializable-Schnittstelle. Sowohl Aktoren und Sensoren, als auch die Regeln implementieren diese Schnittstelle. So kann beim initialen Starten des Raspberry Pi der aktuelle Sensor-, Aktor- und Regelstand wiederhergestellt werden.

 

Objektorientierter Systementwurf (Datenmodell) für unser Alarmsystem