Die Leichtigkeit des Seins
Bindings für Eclipse SmartHome entwickeln
Köln, 12.05.2016
Moritz Kammerer
Über den Autor
2
■ Entwickelt seit 2014 Bindings für Eclipse SmartHome
■Arbeitet bei QAware GmbH, www.qaware.de
■ GitHub: ...
Was ist Eclipse SmartHome?
3
■ Ein Projekt der Eclipse Foundation
■ Open-Source
■ Framework, um Geräte herstellerübergreif...
Der Softwarestack
4
JVM
OSGi-Runtime (Equinox, Felix, …)
Eclipse SmartHome
Unser Binding
Bind
Building Blocks: Bindings, Bridges, Things und Channels
5
Bridge
Thing Thing Thing
Channel Channel Channel
Binding
Building Blocks: Bindings, Bridges, Things und Channels
6
■ Binding: Plugin, das Geräte in Eclipse SmartHome integriert. z...
Getting started
7
■ Eclipse SmartHome Dokumentation: https://eclipse.org/smarthome/documentation/index.html
■ IDE Setup: h...
Unser erstes Binding
8
■ Skelett des Bindings anlegen: extensions/binding/create_binding_skeleton.cmd [Name]
[Author]
■ ES...
9
Nest Webservice
in der Cloud
Thing:
Thermostat
Channel: Target
Temperature
Eclipse SmartHome
Kommunikation Nest Thermostat / Eclipse SmartHome
10
■ Thermostat kommuniziert mit dem Nest Cloudservice
■ Dieser bietet e...
Anlegen der Channels
11
■ In der Datei ESH-INF/thing/thing-types.xml beschreiben wir unseren Channel:
<channel-type id="ta...
Finden des Thermostats
12
■ Eclipse SmartHome verwendet Discovery Services, um Things zu finden
■ In unserem Fall muss der...
Nest Cloud Webservice anprogrammieren
13
■ Wir verwenden Firebase zur Kommunikation mit dem Cloud Webservice
■ Die Firebas...
Entdecke neue Things
14
■ An die URL /devices/thermostats kann nun im DiscoveryService ein Listener gehängt werden
■Dieser...
Inbox, Things und ThingHandler
15
■ Wenn ein DiscoveryResult in der Inbox vom Benutzer „approved“ wird, wird die Methode
s...
Ändern der Zieltemperatur: vom Binding zum Thermostat
16
■ handleCommand() erhält als Argument den Eingangschannel und des...
17
Reagieren auf Änderungen der Zieltemperatur: Vom Thermostat
zum Binding
18
■ Die Methode initialize() des ThingHandlers wi...
19
Ausführen des Bindings in Eclipse
20
■ Run / Run Configurations
■ SmartHome Runtime / Plugins
■ Binding „org.eclipse.smart...
Ausführen des Bindings in OpenHAB
21
■ OpenHAB ist eine Distribution von EclipseSmartHome (http://www.openhab.org/)
■Achtu...
22
https://github.com/phxql/building-iot
Code des Vortrags:
Nächste SlideShare
Wird geladen in …5
×

Die Leichtigkeit des Seins: Bindings für Eclipse SmartHome entwickeln

315 Aufrufe

Veröffentlicht am

Moritz Kammerer (@phxql) zeigt in diesem Workshop wie einfach es ist, ein Binding (Plug-in) zu entwickeln, mit dem ein Nest-Thermostat in Eclipse SmartHome (OSS Framework für SmartHome-Systeme) integriert werden kann. Das entwickelte Binding wird verwendet, um eine Phillips Hue mittels des Nest-Thermostats zu steuern.
Der Workshop fand statt am 12.05.2016, auf der buildingIoT Köln.

Veröffentlicht in: Technologie
0 Kommentare
0 Gefällt mir
Statistik
Notizen
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

Keine Downloads
Aufrufe
Aufrufe insgesamt
315
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
21
Aktionen
Geteilt
0
Downloads
1
Kommentare
0
Gefällt mir
0
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie

Die Leichtigkeit des Seins: Bindings für Eclipse SmartHome entwickeln

  1. 1. Die Leichtigkeit des Seins Bindings für Eclipse SmartHome entwickeln Köln, 12.05.2016 Moritz Kammerer
  2. 2. Über den Autor 2 ■ Entwickelt seit 2014 Bindings für Eclipse SmartHome ■Arbeitet bei QAware GmbH, www.qaware.de ■ GitHub: @phxql / Twitter: @phxql ■ Blog: https://www.mkammerer.de/blog ■ Anmerkung: Die nachfolgenden Slides dienen als Handout für die Besucher. Im Vortrag wird hands-on ein Binding in Eclipse entwickelt und die Konzepte daran erklärt. ■ Sourcecode des Vortrags: https://github.com/phxql/building-iot
  3. 3. Was ist Eclipse SmartHome? 3 ■ Ein Projekt der Eclipse Foundation ■ Open-Source ■ Framework, um Geräte herstellerübergreifend zu vernetzen (sogenannte Bindings) ■ Dient als Basis für diverse SmartHome-Systeme, z.B. OpenHAB oder QIVICON der Telekom
  4. 4. Der Softwarestack 4 JVM OSGi-Runtime (Equinox, Felix, …) Eclipse SmartHome Unser Binding
  5. 5. Bind Building Blocks: Bindings, Bridges, Things und Channels 5 Bridge Thing Thing Thing Channel Channel Channel Binding
  6. 6. Building Blocks: Bindings, Bridges, Things und Channels 6 ■ Binding: Plugin, das Geräte in Eclipse SmartHome integriert. z.B. Hue-Binding, das die Hue- Lampen von Phillips in Eclipse SmartHome integriert oder das Nest-Binding ■ Bridge: Netzwerkbrücken, ermöglichen Zugang zu weiteren Things. Beispiel: Bridge der Phillips Hue ■ Thing: Ein physikalisches Gerät. Kann zu einer Bridge gehören, muss aber nicht. Beispiel: Phillips Hue Lampe oder das Nest Thermostat ■ Channel: Ein- und Ausgabekanal eines Things. Kann les- und schreibbar oder nur lesbar sein. Beispiel: Zieltemperatur des Nest-Thermostats, Farbe der Hue-Lampe. Hat einen bestimmten Typen, z.B. Number oder Color.
  7. 7. Getting started 7 ■ Eclipse SmartHome Dokumentation: https://eclipse.org/smarthome/documentation/index.html ■ IDE Setup: https://eclipse.org/smarthome/documentation/development/ide.html ■Source von Eclipse SmartHome unter $INSTALL_DIR/smarthome-master/git ■Eclipse Workspace unter $INSTALL_DIR/ws ■ Projekt einmal mit „mvn clean install“ komplett durchbauen ■Nur dann funktioniert die UI!
  8. 8. Unser erstes Binding 8 ■ Skelett des Bindings anlegen: extensions/binding/create_binding_skeleton.cmd [Name] [Author] ■ ESH-INF – Metadaten für Eclipse SmartHome ■binding – Metadaten über das Binding ■i18n – Internationalisierung ■thing – Definition der Bridges, Things und Channels ■ META-INF – Manifest für OSGi, etc. ■ OSGI-INF – Registrierung von OSGi-Services, etc. ■ src – Quelltext ■ target – Kompilate von Maven
  9. 9. 9 Nest Webservice in der Cloud Thing: Thermostat Channel: Target Temperature Eclipse SmartHome
  10. 10. Kommunikation Nest Thermostat / Eclipse SmartHome 10 ■ Thermostat kommuniziert mit dem Nest Cloudservice ■ Dieser bietet eine Firebase-API an, um die Werte des Thermostats zu lesen und zu schreiben ■Firebase arbeitet push-basiert, d.h. wir werden bei Änderungen benachrichtigt ■ Damit wir den Nest Cloudservice verwenden können, benötigen wir ein OAuth2 Access Token ■ Dieses ist für einen Client ausgestellt, den wir auf https://developer.nest.com erstellen müssen ■ Mittels der Authorization URL bekommen wir einen Pincode, den wir mit der Access Token URL verwenden können, um an ein Access Token zu kommen ■Leider bietet Eclipse SmartHome noch keine eingebaute Unterstützung von OAuth2 ■ Dieses Access Token kodieren wir in der Klasse NestBindingConstants
  11. 11. Anlegen der Channels 11 ■ In der Datei ESH-INF/thing/thing-types.xml beschreiben wir unseren Channel: <channel-type id="target_temperature"> <item-type>Number</item-type> <label>Target temperature</label> <description>The target temperature.</description> <category>Temperature</category> <state readOnly="false" pattern="%.1f C" /> </channel-type>
  12. 12. Finden des Thermostats 12 ■ Eclipse SmartHome verwendet Discovery Services, um Things zu finden ■ In unserem Fall muss der Discovery Service den Nest Cloud Webservice kontaktieren, um die Thermostate aufzulisten ■ Dazu erstellen wir eine neue Klasse NestDiscoveryService und leiten diese von AbstractDiscoveryService ab ■Im Constructor wird angegeben, welche Things der DiscoveryService finden kann ■Die Methode startScan() wird aufgerufen, wenn der Benutzer nach neuen Things suchen möchte
  13. 13. Nest Cloud Webservice anprogrammieren 13 ■ Wir verwenden Firebase zur Kommunikation mit dem Cloud Webservice ■ Die Firebase-Clientbibliothek muss in den Ordner lib kopiert und im OSGi-Manifest inkludiert werden ■Wir verwenden ein Fat-JAR, das alle Abhängigkeiten von Firebase enthält ■Dieses JAR kann unter https://www.firebase.com/docs/android/quickstart.html heruntergeladen werden ■Direkt-Link: https://cdn.firebase.com/java/firebase-client-jvm-2.5.2.jar ■ Nun kann der Firebase-Client im NestDiscoveryService verwendet werden, um die verfügbaren Thermostate aufzulisten ■Im Code ist der Nest Webservice Client in der Klasse NestWebservice zu finden
  14. 14. Entdecke neue Things 14 ■ An die URL /devices/thermostats kann nun im DiscoveryService ein Listener gehängt werden ■Dieser wird aufgerufen, wenn ein Thermostat entdeckt wurde ■Firebase stellt sicher, dass der Listener auch schon für bereits vorhandene Thermostate aufgerufen wird ■ Der Listener wird mit Daten des Thermostats aufgerufen. Die Eigenschaft device_id enthält die ID des Thermostats ■ Über die geerbte Methode thingDiscovered() und der Klasse DiscoveryResult wird der neu gefundene Thermostat Eclipse SmartHome bekannt gemacht. Dieser landet in der Inbox. ■ Der Discovery Service muss noch durch eine XML-Datei im OSGi-Framework registriert werden. ■Diese Datei befindet sich im Ordner OSGI-INF (NestDiscovery.xml)
  15. 15. Inbox, Things und ThingHandler 15 ■ Wenn ein DiscoveryResult in der Inbox vom Benutzer „approved“ wird, wird die Methode supportsThingType der Klasse NestHandlerFactory aufgerufen ■ Liefert diese true, wird die Methode createHandler aufgerufen ■ Diese gibt den ThingHandler für ein bestimmtes Thing zurück ■Normalerweise gibt es für jeden ThingType (thermostat, …) einen eigenen Handler ■Der Handler für Thermostate befindet sich in der Klasse NestHandler ■ Eclipse SmartHome instanziiert nun diese Klasse und ruft die Methode initialize() auf ■ Ein ThingHandler erbt im Normalfall von BaseThingHandler ■Die Methode handleCommand() des Interfaces wird aufgerufen, wenn der Benutzer über die UI von Eclipse SmartHome Werte des Geräts ändern möchte
  16. 16. Ändern der Zieltemperatur: vom Binding zum Thermostat 16 ■ handleCommand() erhält als Argument den Eingangschannel und dessen neuen Wert ■ Diesen Wert können wir nun verwenden, um die Zieltemperatur des Thermostats einzustellen: ■Wir schreiben durch Firebase auf die URL /devices/thermostats/{id}/target_temperature_c mittels setValue() den Wert der neuen Zieltemperatur ■Die ID des Thermostats können wir über die Methode getThing().getProperties() auslesen. Diese Map enthält die Werte, die beim DiscoveryResult angegeben wurden ■ Der Nest Cloudwebservice kümmert sich nun darum, dass die Temperatur auf dem Thermostat eingestellt wird
  17. 17. 17
  18. 18. Reagieren auf Änderungen der Zieltemperatur: Vom Thermostat zum Binding 18 ■ Die Methode initialize() des ThingHandlers wird durch Eclipse SmartHome aufgerufen, wenn das DiscoveryResult „approved“ wurde ■ In dieser Methode verwenden wir Firebase und die URL /devices/thermostats/{id}/target_temperature_c, um sich über Änderungen der Zieltemperatur benachrichtigen zu lassen ■Die ID des Thermostats lesen wir, wie beim Ändern der Temperatur, aus den Properties des Things ■ Der Firebase-Listener wird aufgerufen, wenn sich die Zieltemperatur ändert ■Über die Methode getValue() kann die Zieltemperatur ausgelesen werden ■ Über die Methode updateState() kann ein Channel aktualisiert werden ■Der Temperaturwert muss von double noch in DecimalType umgewandelt werden
  19. 19. 19
  20. 20. Ausführen des Bindings in Eclipse 20 ■ Run / Run Configurations ■ SmartHome Runtime / Plugins ■ Binding „org.eclipse.smarthome.binding.nest“ suchen ■Start Level: 0, Auto-Start: True ■ Run ■ UI unter http://localhost:8080/ui/index.html erreichbar
  21. 21. Ausführen des Bindings in OpenHAB 21 ■ OpenHAB ist eine Distribution von EclipseSmartHome (http://www.openhab.org/) ■Achtung: Erst Version 2 basiert auf EclipseSmartHome ■ Bauen des Bindings mit „mvn clean install“ ■Im Ordner „target“ befindet sich nun org.eclipse.smarthome.binding.nest-0.8.0-SNAPSHOT.jar ■ OpenHAB 2 Offline Version herunterladen und entpacken: https://openhab.ci.cloudbees.com/job/openHAB-Distribution/ ■ JAR des Bindings in OpenHAB2/addons kopieren und OpenHAB starten ■ UI unter http://localhost:8080/ui/index.html erreichbar
  22. 22. 22 https://github.com/phxql/building-iot Code des Vortrags:

×