Kurs im Selbststudium

Embedded Smart Home

Angeboten von Jan Renz, Martin Malchow, Matthias Bauer

openHAB - Übersicht

Der Code befindet sich auch unter https://github.com/openHPI/openhab-demo
Einer unserer Raspberry Pis ist unter https://codeocean.openhpi.de/raspberry zu erreichen und gibt die folgenden Werte aus:

{
"temp": 28.5,
"humidity": 48.7,
"tempout": 18.8,
"door": 1
}

(Temperatur innen, Luftfeuchtigkeit, Temperatur aussen, Fensterstatus).

Schritte zur Inbetriebnahme von openHAB und Codesnippets

  • Download von Code und Addons

Anzeige von Daten des Raspberry via REST

Kopieren des HTTP Addons in den Addons Ordner

Hinzufügen des Items in /configurations/items/default_items

Number InnenTemperatur  "Temperatur Innen [%.1f] °C" <temperature> { http="<[http://LOKALEIP:10000:JS(getValue.js)]"  }

Achtung: Das HTTP Binding kann momentan nicht mit anderen Ports umgehen, wir empfehlen daher den JSON Feed auf dem Raspberry auf Port 80 zu betreiben. Hierfür ist es notwendig den Webserver mit Supernutzerrechten zu betreiben.

Hinzufügen des Items in die Benutzeroberfläche
in /configurations/sitemaps/default.sitemap

sitemap default label="openHPI"
Frame label="openHPI Demo" {
    Text label="Raum 1" icon="firstfloor" {
        Text item=InnenTemperatur
  }
}

Auslesen aus der JSON in /configurations/transform/getValue.js

JSON.parse(input).temp;

Berechnen von Min und Max-Werten

Erstellen der Persistierung: Kopieren des RRD4J Addons in den Addon Ordner

Erstellen einer Persistenz-Konfiguration:
in /configurations/persistence/rrd4j.persist

Strategies {
  everyHour : "0 0 * * * ?"
  everyDay  : "0 0 0 * * ?"
  default = everyChange
}

Items {
  * : strategy = everyChange, everyDay, restoreOnStartup
}

Hinzufügen der Items

String InnenTemperatur_Min_Formatted "Min. Temp [%s]" <temperature>
String InnenTemperatur_Max_Formatted "Max. Temp [%s]" <temperature>

und in die Benutzeroberfläche (sitemap):

Text item=InnenTemperatur_Min_Formatted
Text item=InnenTemperatur_Max_Formatted

Erstellen einer Regel die Werte berechnet:

rule "Update Temperature Min- and Max values"
when
  Item InnenTemperatur changed
then
  var Number Min
  var Number Max
  var String tmp
  var SimpleDateFormat df = new SimpleDateFormat( "HH:mm" )

  if (InnenTemperatur.state instanceof DecimalType) {
    df = new SimpleDateFormat( "HH:mm" )
    Min = InnenTemperatur.minimumSince(now.toDateMidnight, "rrd4j").state as DecimalType
    tmp = (Math::round(Min.floatValue*10.0)/10.0) + " °C (" + df.format(InnenTemperatur.minimumSince(now.toDateMidnight, "rrd4j").timestamp) + ")"
    postUpdate(InnenTemperatur_Min_Formatted, tmp)
    Max = InnenTemperatur.maximumSince(now.toDateMidnight, "rrd4j").state as DecimalType
    tmp = (Math::round(Max.floatValue*10.0)/10.0) + " °C (" + df.format(InnenTemperatur.maximumSince(now.toDateMidnight, "rrd4j").timestamp) + ")"
    postUpdate(InnenTemperatur_Max_Formatted, tmp)
  }
end

Einbinden von externen Diensten

Kopieren des Weather Addons in den Addon Ordner

Hinzufügen der Items:

Number Temperature   "Temperatur (Web) [%.2f °C]" <temperature>  {weather="locationId=home, type=temperature, property=current"}
Number Humidity      "Luftfeuchtigkeit (Web) [%d %%]" <water> {weather="locationId=home, type=atmosphere, property=humidity"}
Number Rain          "Regen (Web) [%.2f mm/h]" <rain>   {weather="locationId=home, type=precipitation, property=rain"}

und in die Benutzeroberfläche

Text item=Temperature
Text item=Humidity
Text item=Rain

dann in /configurations/openhab.cfg einstellen der Konfiguration:

weather:location.home.name=Potsdam
weather:location.home.woeid=29352281
weather:location.home.provider=Yahoo
weather:location.home.language=de
weather:location.home.updateInterval=10

Hinweis: Bei Yahoo muss die woeid aus der URL der Yahoo Wetterseite ausgelesen werden. Es können auch andere Dienste verwendet werden.

Visualiserung

In der Item-Konfiguration:

Chart item=Temperature period=h refresh=3600

Ein weiteren guten Einstieg bietet die openHAB Website unter https://github.com/openhab/openhab/wiki