Skip to content
Cedric Becker edited this page May 26, 2023 · 22 revisions

Advanced Software Engineering Smarthome Bridge

Authors

Maximilian Burr + Cedrick Becker

Einleitung

Eine Smarthome Bridge, ermöglicht es verschiedene Smarthome Systeme unterschiedlicher Hersteller durch Plugins anzubinden. Dies bedeutet, dass die Benutzer dieser Bridge die Freiheit haben Geräte unterschiedlicher Marken und Modelle miteinander zu verbinden. Dadurch kann ein nahtloses Smarthome-Erlebnis geschaffen werden und hilft den Dschungel an am Markt erhätlichen Systemem etwas zu lichten. Die Smarthome Bridge bietet durch die Plugin Funktionalität eigene Möglichkeiten ein Frontend anzubinden. Dazu bietet die Bridge ein Interface an, was von anderen Programmteilen implementiert werden kann, um an die Bridge anzukoppeln.

Software Design Core

Die Anwendung wird in mehrere unabhängig lauffähige Teile getrennt. Die unabhängigen Module werden mittels eines Buildsystems unabhängig voneinander verwaltet. Dazu verwenden wir das Buildsystem Maven für Java.

Kernteil

Der Kernteil übernimmt die Kommunikation und Verwaltung der einzelnen Systeme. Er verwaltet eine Konfiguration und kennt alle Geräte. Übernimmt die Kommunikation und die Transformation der Nachrichten für die einzelnen Smarthome Systeme die mit der SmartHome Bridge angesprochen werden.

Um die Funktionalität des Kerns unabhängiger von Drittbibliotheken zu gestalten, wurde mithilfe der Clean Architecture eine Plugin mit einheitlicher Schnittstelle geschaffen.

Neue Features für die Bridge können somit als Plugin angebunden werden.

classDiagram

Loader --> "1" Core : creates
Loader ..> ICore : communicates
Loader --> "1" Plugin1 : creates
Loader --> Plugin2 : creates
Core  --> "0..n" IPlugin : communicates
Core ..|> ICore : implements
Core ..|> IAppState: implements
Core ..> IAppState

EventPublisher ..> EventReceiver : sendsMessages
IAppState -- ApplicationState 
Plugin1 ..|> IPlugin : implements
Plugin1 --> Receiver
Plugin1 --> EventPublisher
Plugin2 ..|> IPlugin : implements
EventReceiver ..|> IReceiver
EventPublisher --|> IPublisher
Plugin2 --> IPublisher
Plugin2 --> IReceiver
EventPublisher ..|> IPublisher : implements
EventReceiver ..|> IReceiver : implements



class Core{
 
}

class ICore{
    <<interface>>
    +run()
    +getCore()
}

class IAppState{
    <<interface>>
    ApplicationState
    +setState(ApplicationState state)
    +getState() : ApplicationState
}

class ApplicationState{
    <<enumeration>>
    
}

class IPlugin {
    <<interface>>
    +load()
}

class Loader {
    +ICore core
}

class IPublisher {
+dummy()
}

class IReceiver {
  +dummy()
}
Loading

Minecraft-Plugin

Zunächst muss die folgende Aussage aus der Themenmitteilung berichtigt werden:

Für einen modifizierten Minecraft-Server (Spigot), der die Einbindung von Java-Plugins erlaubt, entwickeln wir ein Dummy-Plugin, das dessen API in eine REST-API übersetzt. Das Plugin, das an unser Kern-System angebunden ist, kommuniziert über diese REST-API mit dem Dummy-Plugin.

Minecraft ist kein Smarthome System. Unsere Smarthome Bridge allerdings auch nicht. Deshalb ist Code notwendig, der Minecraft zu einem Smarthome-System macht. Das erwähnte Dummy-Plugin wird damit ausgebaut zu diesem Smarthome-System. (Im Kapitel Clean Architecture wird beschrieben, wie das Smarthome-System wiederum ein Dummy-Plugin erhält, um die Abhängigkeit von Minecraft zu minimieren.)

Außerdem gibt es weiterhin das Plugin für unser Kern System, die Smarthome Bridge. Es soll über REST mit dem Minecraft-Smarthome-System kommunizieren.

Das Plugin für das Kernsystem und die Kommunikation über REST wurden in diesem Projekt nicht mehr umgesetzt. Das Minecraft-Smarthome jedoch wurde implementiert und befindet sich in einem nutzbaren Zustand (davon abgesehen, dass es nicht mit der Smarthome Bridge kommunizieren kann und deshalb noch nicht sooo viel praktischen Nutzen hat)

Clone this wiki locally