# OpenHAB

open Home Automation Bus (openHAB) is een in Java ontwikkelde softwareoplossing, die componenten voor gebouwautomatisering van verschillende aanbieders op protocol-neutrale wijze in één fabrikantonafhankelijk platform met elkaar verbindt. Via al dan niet draadloze protocollen (ZigBee, WiFi, Bluetooth, Z-Wave, GSM, KNX, ethernet) kunnen lampen, gordijnen, alarm, audio en video aangestuurd en gemonitord worden.
openHAB werd door Kai Kreuzer in 2010 opgezet en heeft vele mede-ontwikkelaars. Eind 2013 is besloten de openHAB-ontwikkeling deels als officieel Eclipse-project, onder de naam Eclipse SmartHome voort te zetten. openHAB en Eclipse SmartHome worden parallel ontwikkeld. Architectuur en functionaliteit worden overwegend in het Eclipse-SmartHome-Project ondergebracht, terwijl voor binding-ontwikkelaars de openHAB-website het eerst aangewezen adres is.
In openHAB 2 ligt de focus op gebruikerscomfort bij het inrichten en configureren. Daarvoor zijn talrijke verbeteringen ten opzichte van de eerste versie doorgevoerd.
openHAB is besturings-systeem onafhankelijk en is door het toevoegen van aanvullende bindingen met extra technologieën/protocollen uitbreidbaar. openHAB wordt onder de Eclipse Public License ontwikkeld en is open source. Als gebruikersinterfaces worden webbrowser, Android- en Apple iOS-systemen ondersteund.

## Ondersteuning en verspreiding

Belangrijke officiële ondersteuning is er bijvoorbeeld voor KNX, EnOcean, Insteon, Homematic en Hue. Op basis van Eclipse SmartHome zijn ook de eerste commerciële producten voor de massamarkt uitgekomen, zoals die van de Deutsche Telecom met QIVICON en Yetu, die beide Eclipse SmartHome als softwarebasis voor hun gateways gebruiken.

## Architectuur

Het openHAB-Project is opgedeeld in
* openhab-runtime: dit is het serverproces dat de acties uitvoert;
* openhab-designer: dit is een gebruiksvriendelijke configuratie-interface op basis van Eclipse.

### openHAB Runtime

De openHAB runtime is een pakket van OSGi bundels opgenomen in het OSGi Framework (Equinox). Het is een pure Java-oplossing waarvoor een JVM vereist is. Gebaseerd op het OSGi model, is in een zeer sterk modulaire architectuur voorzien, die het toevoegen of verwijderen van functionaliteit op de runtime mogelijk maakt zonder dat de service gestopt hoeft te worden.

### Communicatie

openHAB heeft twee interne communicatiekanalen:
* een asynchrone event-bus
* een item-repository (statusgeheugen)

#### Event-bus

De event-bus is de basisservice van openHAB. Alle niet status gerelateerde bundels informeren hierlangs andere bundels over de status van events.
Alle protocolbindings (die een fysieke link naar de echte hardware voorstellen) communiceren via deze event-bus.
Als technische basis dient de OSGi EventAdmin service.

#### Item-repository

Voor status gerelateerde functies biedt openHAB de item-repository, die met de event-bus verbonden is en de actuele status van de items bijhoudt. Hierdoor kan de item-repository gebruikt worden om de actuele status van een item op te vragen, bijvoorbeeld voor de weergave in een visualisatie, voor de verwerking in logica of voor de persistence (historie) service.
De item-repository voorkomt daarmee dat de verbonden functie zijn status zelf op moet slaan en stelt deze in een centrale service ter beschikking.

#### Sitemap

openHAB heeft een generieke configureerbare gebruikersinterface (UI), de zogenaamde sitemap. De sitemap is een boomstructuur van widgets, die de verschillende pagina's en de inhoud van de UI definiëren.
Widgets kunnen items zijn, die de actuele status weergeven maar ook schakelaars of grafieken. Er kunnen verschillende sitemaps gedefinieerd worden, bijvoorbeeld voor mobiele apparaten of andere weergave-opties.

#### Item aanbieders

Item-aanbieders bieden de mogelijkheid om de userinterface dynamisch te genereren. In de item- en groepsdefinities kunnen de afbeeldingen van de widgets geconfigureerd worden, zodat de sitemap van hieruit dynamisch samengesteld kan worden. Een toepassingsvoorbeeld is bijvoorbeeld om alle elementen uit een groep in één keer weer te geven door alleen de groep in de sitefile te declareren.

### openHAB designer

De openHAB designer is een Eclipse-RCP-toepassing voor het configureren van de openHAB-runtime. Het bevat een editor voor de benodigde configuratiegegevens en bevat syntaxis-controle, auto completion en context specifieke markeringen. Voor het maken van automatiseringslogica zijn functies gebruikt, waaraan de technologieën Xtext , Xbase, Quartz (tijdplansturing) en Joda Time (tijd- en datumberekeningen) ten grondslag liggen.

## Ondersteunde technologieën
### Bindingen

Het OSGi-platform staat vanwege de modulaire architectuur, flexibele extensietechnologieën toe. Daardoor kan de functionaliteit door het toevoegen van bindingen eenvoudig aangepast worden. De volgende bindingen zijn inmiddels beschikbaar en het aantal wordt voortdurend uitgebreid:
Asterisk, Astro (Zonnestandberekeningen), Bluetooth, Comfo Air, CUPS, digitalSTROM, Daikin, DMX512, EnOcean, eKey, Epson Projector, Exec (Execute Command), Fritz!Box, Fritz AHA, GPIO, HDAnywhere, Heatmiser, HomeMatic, HTTP, IHC / ELKO, INSTEON Hub, IRTrans, KNX, Koubachi, MAX!Cube, MiLight, LCN Gebäudeleittechnik, Leviton/HAI Omnilink, Modbus TCP und RTU, MPD, MQTT, Netatmo, Network Health, Nibe Heatpump, Nikobus, Novelan/Luxtronic Heatpump, NTP, One-Wire, Onkyo AV Receiver, Open energy monitor, OpenPaths, OpenSprinkler, OSGi Configuration Admin, Philips Hue, Piface, Pioneer AV receiver, Plex, Plugwise, PLCBus, PulseAudio, Pushover, Prowl, PulseAudio Server, RFXCOM, Samsung TV, Serial, SNMP, Squeezebox, System Info, Somfy URTSI II, Sonos, Souliss, TCP/UDP, Tellstick, Swegon ventilation, TinkerForge, Tivo, VDR, Twitter, Wake-on-LAN, XBMC, Xively, xPL, Z-Wave
Er zijn ook uitbreidingen die niet als binding geconfigureerd worden, maar als programmadeel geïntegreerd kunnen worden:
* Dropbox Support
* Google Calendar en CalDAV-ondersteuning
* Text to speech-Implementatie (TTS)
* HABDroid kan via Spraaksturing Acties uitvoeren
Communities uit de IoT-wereld stellen op Arduino-gebaseerde platformen ter beschikking, die via seriële-, MQTT- of Souliss-bindingen op openHAB aangesloten kunnen worden.

### Persistence

De persistence service regelt de opslag van statusveranderingen van de verschillende items. Hiermee kan het verloop van een waarde worden gevisualiseerd, historische gegevens worden opgevraagd of bij een herstart van het systeem de oorspronkelijke stand weer worden ingenomen.
De volgende services zijn momenteel beschikbaar:
* db4o – een Java-Object-Database
* rrd4j – een Java-Versie van de round-robin-Database RRDtool.
* MySQL – een interface naar een MySQL-database.
* Open.Sen.Se – een Internet-of-Things-platform
* logging using Logback – schrijft itemstatus naar een logfile met flexibele syntaxdefinitie

## Interfaces
### User Interfaces

* Classic UI – klassieke webinterface
* Apple iOS client
* Android Client – HABDroid is een open source Android user interface voor openHAB
* Windows 10 client
* CometVisu

### NFC (Near Field Communicatie)

De Android-client HABDroid is in staat NFC-tags te beschrijven en te lezen. Hierdoor kan door het scannen van een specifieke NFC-tags een bijbehorende actie uitgevoerd worden.

### OSGi Console

openHAB kan via de OSGi-console bediend worden.
Daarmee kunnen commando's over de eventbus verzonden worden, om bijvoorbeeld Items in- of uit te schakelen of de status op te vragen.

### Spraaksturing

Door middel van de mobiele applicatie HABDroid is spraakbesturing beschikbaar, hiervoor wordt gebruikgemaakt van de Google Speech Engine. Ook kan de Amazon spraakdienst (Alexa) met Amazon Echo of Amazon Dot op openHAB aangesloten worden. Dit wordt via HUE-emulatie uitgevoerd, maar zal in de toekomst ook via Alexa Skill aangeboden worden.

### XMPP Instant Messaging Console

openHAB ondersteunt toegang op afstand via XMPP (Jabber). Daarmee kan via een persoonlijk Jabber-account met de huisautomatisering „gechat“ worden. Commando's zijn vergelijkbaar met die van de OSGi-console.

### Google Calender Console

Andere mogelijkheden, openHAB-commando's te geven, kan tijdgestuurd via een bijbehorende instructie in Google Calendar of via CalDav-kalender (bijv. ownCloud).

### REST-API

De RESTful Interface voorziet in een open interface om openHAB te laten communiceren met andere systemen.

### my.openHAB

De clouddienst my.openHAB maakt het mogelijk om met de Android app (HABDroid) zonder poort ontsluiting of DynDNS toegang op afstand en directe push-notificaties te verwezenlijken. De service IFTTT is geïntegreerd in my.openHAB.

### MQTT

Door middel van de MQTT-binding kunnen item-statussen tussen de MQTT-broker en openHAB uitgewisseld worden.