SlideShare ist ein Scribd-Unternehmen logo
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: @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
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
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.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.
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!
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
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 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
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>
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
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
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)
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
Ä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
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
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
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
https://github.com/phxql/building-iot
Code des Vortrags:

Weitere ähnliche Inhalte

PDF
A Hitchhiker’s Guide to the Cloud Native Stack. #ContainerConf
PDF
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer Infrastruktur
PDF
Making the internet faster HTTP/3 und QUIC
PDF
Kontinuierliches (Nicht)-Funktionales Testen von Microservices auf K8s
PDF
Kubernetes ist so viel mehr als ein Container Orchestrierer
PDF
Quarkus Quickstart
PDF
In-Memory Computing mit Apache Ignite und Kubernetes
PDF
Title is loading ... Cache is cold.
A Hitchhiker’s Guide to the Cloud Native Stack. #ContainerConf
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer Infrastruktur
Making the internet faster HTTP/3 und QUIC
Kontinuierliches (Nicht)-Funktionales Testen von Microservices auf K8s
Kubernetes ist so viel mehr als ein Container Orchestrierer
Quarkus Quickstart
In-Memory Computing mit Apache Ignite und Kubernetes
Title is loading ... Cache is cold.

Was ist angesagt? (20)

PDF
Der Status Quo des Chaos Engineerings
PDF
Leveraging the Power of Solr with Spark
PPTX
Nginx
PDF
Docker und Kubernetes Patterns & Anti-Patterns
PDF
Per Anhalter zu Cloud-nativen API Gateways
PDF
OpenShift-Build-Pipelines: Build ► Test ► Run!
PDF
Mit LoRaWAN und Serverless zur eigenen Smart-Office-Lösung
PDF
Cloud Native und Java EE: Freund oder Feind?
PPTX
HashiTalks: DACH - Die Verwendung von IaC im DevOps Prozess
PDF
Steinzeit war gestern! Wege der Cloud-nativen Evolution.
PDF
Dataservices - Data Processing mit Microservices
PPTX
Dockerize It - Mit apex in die amazon cloud
PDF
Automotive Information Research driven by Apache Solr
PDF
Was ist Docker ?
PDF
Helm – The Kubernetes Package Manager
PDF
Kaps - Es muss nicht immer Kubernetes sein
PDF
openstack Übersicht @GPN15
PDF
Mit OpenStack zur eigenen Cloud (OSDC 2012)
PDF
OWASP German Day 2016 - Sicher in die Cloud mit Angular 2 und Spring Boot
PPTX
Tipps und Tricks im Umgang mit Docker
Der Status Quo des Chaos Engineerings
Leveraging the Power of Solr with Spark
Nginx
Docker und Kubernetes Patterns & Anti-Patterns
Per Anhalter zu Cloud-nativen API Gateways
OpenShift-Build-Pipelines: Build ► Test ► Run!
Mit LoRaWAN und Serverless zur eigenen Smart-Office-Lösung
Cloud Native und Java EE: Freund oder Feind?
HashiTalks: DACH - Die Verwendung von IaC im DevOps Prozess
Steinzeit war gestern! Wege der Cloud-nativen Evolution.
Dataservices - Data Processing mit Microservices
Dockerize It - Mit apex in die amazon cloud
Automotive Information Research driven by Apache Solr
Was ist Docker ?
Helm – The Kubernetes Package Manager
Kaps - Es muss nicht immer Kubernetes sein
openstack Übersicht @GPN15
Mit OpenStack zur eigenen Cloud (OSDC 2012)
OWASP German Day 2016 - Sicher in die Cloud mit Angular 2 und Spring Boot
Tipps und Tricks im Umgang mit Docker
Anzeige

Andere mochten auch (20)

PDF
Hands-on K8s: Deployments, Pods and Fun
PDF
Kubernetes 101 and Fun
PDF
Microservices @ Work - A Practice Report of Developing Microservices
PDF
Lightweight developer provisioning with gradle and seu as-code
PDF
JEE on DC/OS - MesosCon Europe
PDF
Cloud Native Unleashed
PDF
Everything as-code. Polyglotte Entwicklung in der Praxis. #oop2017
PDF
Leveraging the Power of Solr with Spark
PDF
Secure Architecture and Programming 101
PDF
Der Cloud Native Stack in a Nutshell
PDF
Clickstream Analysis with Spark - Understanding Visitors in Real Time
PDF
Per Anhalter durch den Cloud Native Stack (extended edition)
PDF
Real World Analytics with Solr Cloud and Spark
PDF
From pets to cattle - powered by CoreOS, docker, Mesos & nginx
PDF
Automotive Information Research driven by Apache Solr
PDF
Vamp - The anti-fragilitiy platform for digital services
PDF
Azure Functions - Get rid of your servers, use functions!
PDF
MQTT Deep Dive Workshop [GERMAN]
PDF
A Hitchhiker's Guide to the Cloud Native Stack
PDF
Clickstream Analysis with Apache Spark
Hands-on K8s: Deployments, Pods and Fun
Kubernetes 101 and Fun
Microservices @ Work - A Practice Report of Developing Microservices
Lightweight developer provisioning with gradle and seu as-code
JEE on DC/OS - MesosCon Europe
Cloud Native Unleashed
Everything as-code. Polyglotte Entwicklung in der Praxis. #oop2017
Leveraging the Power of Solr with Spark
Secure Architecture and Programming 101
Der Cloud Native Stack in a Nutshell
Clickstream Analysis with Spark - Understanding Visitors in Real Time
Per Anhalter durch den Cloud Native Stack (extended edition)
Real World Analytics with Solr Cloud and Spark
From pets to cattle - powered by CoreOS, docker, Mesos & nginx
Automotive Information Research driven by Apache Solr
Vamp - The anti-fragilitiy platform for digital services
Azure Functions - Get rid of your servers, use functions!
MQTT Deep Dive Workshop [GERMAN]
A Hitchhiker's Guide to the Cloud Native Stack
Clickstream Analysis with Apache Spark
Anzeige

Ähnlich wie Die Leichtigkeit des Seins: Bindings für Eclipse SmartHome entwickeln (20)

PDF
DACHNUG50 CNX3 Monitoring.pdf
PDF
Entwicklungsumgebungen - Packer, Vagrant, Puppet
PDF
JAX 2023 - Cloud Provider APIs
PDF
PDF
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
ODP
Übersicht über die IoT Plattform im Freifunk SL-FL
PDF
Cloud Observability mit Loki, Prometheus, Tempo und Grafana
PDF
FMK2019 FileMaker Data API mit Node.js nutzen by Adam Augustin
PPT
Einführung in den EventBus
PPTX
German: Softwareprodukte aus einem Source Code mit Javascript
PDF
Kubernetes
PDF
Echtes Single Sign-On mit APEX realisieren
PPT
Einsteiger Workshop
PDF
OSMC 2016: Open Monitoring Distribution 2016+ by Gerhard Laußer
PDF
node.js - Eine kurze Einführung
PDF
DevDay 2016: Sascha Askani - Cloud-Umgebungen mit Terraform verwalten
PPTX
Vagrant, Puppet, Docker für Entwickler und Architekten
PDF
Grundlagen puppet
PDF
FLOW3-Workshop F3X12
PDF
OpenStack und Heat - Standardisierte Test- und Entwicklungsumgebungen
DACHNUG50 CNX3 Monitoring.pdf
Entwicklungsumgebungen - Packer, Vagrant, Puppet
JAX 2023 - Cloud Provider APIs
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Übersicht über die IoT Plattform im Freifunk SL-FL
Cloud Observability mit Loki, Prometheus, Tempo und Grafana
FMK2019 FileMaker Data API mit Node.js nutzen by Adam Augustin
Einführung in den EventBus
German: Softwareprodukte aus einem Source Code mit Javascript
Kubernetes
Echtes Single Sign-On mit APEX realisieren
Einsteiger Workshop
OSMC 2016: Open Monitoring Distribution 2016+ by Gerhard Laußer
node.js - Eine kurze Einführung
DevDay 2016: Sascha Askani - Cloud-Umgebungen mit Terraform verwalten
Vagrant, Puppet, Docker für Entwickler und Architekten
Grundlagen puppet
FLOW3-Workshop F3X12
OpenStack und Heat - Standardisierte Test- und Entwicklungsumgebungen

Mehr von QAware GmbH (20)

PDF
QAware_Mario-Leander_Reimer_Architecting and Building a K8s-based AI Platform...
PDF
Frontends mit Hilfe von KI entwickeln.pdf
PDF
Mit ChatGPT Dinosaurier besiegen - Möglichkeiten und Grenzen von LLM für die ...
PDF
50 Shades of K8s Autoscaling #JavaLand24.pdf
PDF
Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...
PPTX
Fully-managed Cloud-native Databases: The path to indefinite scale @ CNN Mainz
PDF
Down the Ivory Tower towards Agile Architecture
PDF
"Mixed" Scrum-Teams – Die richtige Mischung macht's!
PDF
Make Developers Fly: Principles for Platform Engineering
PDF
Der Tod der Testpyramide? – Frontend-Testing mit Playwright
PDF
Was kommt nach den SPAs
PDF
Cloud Migration mit KI: der Turbo
PDF
Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
PDF
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
PDF
Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.
PDF
Kubernetes with Cilium in AWS - Experience Report!
PDF
50 Shades of K8s Autoscaling
PDF
Kontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAP
PDF
Service Mesh Pain & Gain. Experiences from a client project.
PDF
50 Shades of K8s Autoscaling
QAware_Mario-Leander_Reimer_Architecting and Building a K8s-based AI Platform...
Frontends mit Hilfe von KI entwickeln.pdf
Mit ChatGPT Dinosaurier besiegen - Möglichkeiten und Grenzen von LLM für die ...
50 Shades of K8s Autoscaling #JavaLand24.pdf
Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...
Fully-managed Cloud-native Databases: The path to indefinite scale @ CNN Mainz
Down the Ivory Tower towards Agile Architecture
"Mixed" Scrum-Teams – Die richtige Mischung macht's!
Make Developers Fly: Principles for Platform Engineering
Der Tod der Testpyramide? – Frontend-Testing mit Playwright
Was kommt nach den SPAs
Cloud Migration mit KI: der Turbo
Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.
Kubernetes with Cilium in AWS - Experience Report!
50 Shades of K8s Autoscaling
Kontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAP
Service Mesh Pain & Gain. Experiences from a client project.
50 Shades of K8s Autoscaling

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

  • 1. Die Leichtigkeit des Seins Bindings für Eclipse SmartHome entwickeln Köln, 12.05.2016 Moritz Kammerer
  • 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. 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. Der Softwarestack 4 JVM OSGi-Runtime (Equinox, Felix, …) Eclipse SmartHome Unser Binding
  • 5. Bind Building Blocks: Bindings, Bridges, Things und Channels 5 Bridge Thing Thing Thing Channel Channel Channel Binding
  • 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. 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. 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 Nest Webservice in der Cloud Thing: Thermostat Channel: Target Temperature Eclipse SmartHome
  • 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. 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. 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. 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. 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. 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. Ä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
  • 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
  • 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. 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