Automatische Rolladensteuerung mit Java und Loxone
Motivation
Loxone ist ein bekannter Anbieter für Smarthome Rolläden. Während sich über die mitgelieferte Oberfläche allerlei Funktionen konfigurieren lassen, ist es nur mit Zusatzkosten möglich, die Wetterdaten miteinzubeziehen. Diese Wetterdaten werden allerdings benötigt, um die Rolladen gemäß der aktuellen Sonneneinstrahlung, Wärme und Weiteres automatisch zu steuern. Im Netz sind die Wetterdaten allerdings öffentlich und kostenlos verfügbar. Glücklicherweise liefert Loxone eine Auswahl an Schnittstellen – unter anderem Http- mit. Und genau mit dieser Http-Schnittstelle lassen sich Rolläden, Steckdosen und Sensoren ansteuern. Dieser Blogeintrag zeigt wie das geht.
Benötigte Komponenten
- Installierte Loxone Komponenten wie z.b. Rolläden
- Loxon Adminbenutzerdaten
- Java 8
einbinden
Die Hauptkommunikation findet über die org.Apache.Http Bibliothek statt. Über Maven lassen sich bequem die benötigten Komponenten hierzu einbinden.
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20200518</version>
</dependency>
<dependency>
<groupId>javax.json</groupId>
<artifactId>javax.json-api</artifactId>
<version>1.1.4</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.json</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.8</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.8.0</version>
</dependency>
Loxone Befehlssyntax
Zum Aufbau der Kommunikation werden sowohl Benutzername, Passwort als auch die IP des Miniservers benötigt. Diese Daten werden dann zusammengefügt und ergeben die Basis. Anschließend folgt der gewünschte Loxone Befehl.
Beispiel:
"http://" + user + ":" + password + "@" + server+"/" + Befehl
http://user:Test123@192.168.170.99/dev/sps/io/Steckdose1/Ein
In diesem Beispiel wird die Steckdose mit dem Namen "Steckdose1" eingeschaltet.
Aufbau der Kommunikation zum Miniserver
Zunächst wird ein HttpClient Objekt geschaffen und daran die Url übergeben. Über einen Postrequest erfolgt eine Übertragung.
Da sich in dieser Url sowohl Benutzerdaten als auch gewünschter Befehl befinden, erfolgt direkt auch der Versand an den Loxone Miniserver. Dieser liefert uns auch direkt eine Anwort in Form eines JsonObjects.
private JsonObject setState(URL url) throws IOException, ProtocolException, LoxoneException, URISyntaxException {
final HttpClient client = HttpClients.createDefault();
final URIBuilder builder = new URIBuilder(url.toString());
final String listStubsUri = builder.build().toString();
HttpPost setStubMethod = new HttpPost(listStubsUri);
HttpResponse stubResponse = client.execute(setStubMethod);
return executeCommand(stubResponse);
}
private JsonObject executeCommand(HttpResponse stubResponse) throws LoxoneException, IOException {
int getStubStatusCode = stubResponse.getStatusLine().getStatusCode();
handleStatusException(getStubStatusCode);
HttpEntity entity = stubResponse.getEntity();
String responseBody = EntityUtils.toString(entity);
JsonReader jsonReader = Json.createReader(new StringReader(responseBody));
return jsonReader.readObject();
}
Antwort des Loxonservers
<LL control="dev/sps/io/Steckdose1/" value="1" Code="200"/>
Rolladensteuerung
Um nunmehr den Rolladen anzusteuern gibt es unterschiedliche Befehle. Eine kurze Aufstellung ohne jeglichen Anspruch auf Vollständigkeit:
//Liefert eine Liste mit allen verfügbaren Geräten
http://Benutzer:Kennwort@IP/dev/sps/enumin
//Liefert den aktuellen Status eines Gerätes
http://Benutzer:Kennwort@IP/data/status
//Den Rolladen komplett schließen
http://Benutzer:Kennwort@IP/jdev/sps/io/RolladenName/FullDown
//Den Rolladen komplett öffnen
http://Benutzer:Kennwort@IP/jdev/sps/io/RolladenName/FullUp
//Den Rolladen zu x% schließen/öffnen
http://Benutzer:Kennwort@IP/jdev/sps/io/RolladenName/ManualPosition/x
Fazit
Die API von Loxone ist sehr übersichtlich und leicht zu bedienen. In der Dokumentation gibt es auch einige Hinweise über weitere Einsatzgebiete. Mit den Befehlen und Beispielen in diesem Blogpost lässt sich eine eigene Rolladensteuerung bauen, die individuelle Wünsche berücksichtigt. Für meine Rolladensteuerung habe ich die Berechnung der Sonnenposition, Lichtstärke, Wetterbedingungen und natürlich Sonnenaufgang, sowie Sonnenuntergang berücksichtigt.Außerdem kann über dieses Vorgehen auch selbstverständlich ein Sprachassistent angebunden werden. Die Möglichkeiten sind also längst nicht ausgeschöpft.