Mit openHAB Werte speichern und in Charts darstellen – am Beispiel der Zwischensteckdose mit Leistungsmessung

openHAB kann mehr als „nur“ Dinge wie Heizthermostate steuern oder Werte von Sensoren liefern! Gerade die Darstellung der gemessenen Werte wie die Außen-Temperatur oder den Stromverbrauch kannst du dir als schickes Diagramm darstellen lassen!

Am Beispiel der HomeMatic Funk-Schaltaktor 1fach mit Leistungsmessung (HM-ES-PMSw1-Pl) zeige ich dir die Funktionsweise des Persistence-Bindings „rrd4j“ von openHAB. Denn diese Zwischensteckdose bietet zusätzlich die Möglichkeit den Stromverbrauch des angeschlossenen Gerätes aufzuzeichnen.

Die Idee mit dieser Steckdose zu experimentieren habe ich übrigens von /sys/adm/ama. Sie kontrolliert mit dem Zwischenschalter ihre Waschmaschine und Trockner!

Pairing der Steckdose:Zwischensteckdose mit Leistungsmessung
Damit du die Funksteckdose von openHAB nutzen kannst, ist zuvor das Pairen mit homegear oder einer HomeMatic-Zentrale notwendig. Wie das geht, habe ich dir hier beschrieben.

Funktionsweise:

Die Vorgehensweise ist immer die selbe – egal ob du wie in der Demo von openHAB die Temperatur oder den Stromverbrauch speichern und darstellen willst:

1. Gruppe für die zu speichernden Items anlegen
2. Item anlegen und der Gruppe zuordnen
3. Gruppenname persistenten
4. Charts in Sitemap einbinden

Nun der Reihe nach…

Items anlegen:

Da dir die Steckdose eine Menge an Werten liefert, sind natürlich ein paar Items anzulegen. Wozu diese sind, steht per Kommentar über dem Item:


Vergiss nicht nach Anlage der Items die Datapoints für die HomeMatic-Geräte neu zu laden. Entweder per Neustart von openhab oder mittels eigenen Schalter:

Persistence aufsetzen:

Damit du überhaupt Charts verwenden kannst, müssen die gelieferten Werte natürlich irgendwo gespeichert werden. Wir verwenden hier die von openHAB mitgebrachte Lösung „rrd4j“. Alternativ kannst du auch eine MySQL-Datenbank benutzen.

Binding installieren:

Mit folgenden Befehl über die Komandozeile installierst du das notwendige Binding für openHAB:

Einstellungen brauchst du in der openhab.cfg keine vornehmen, da „rr4j“ als Standard hinterlegt ist.

Im Verzeichnis /etc/openhab/configurations/persistence legst du die Datei „rrd4j.persist“ mit folgenden Inhalt ab:

Diese Datei ist in zwei Bereiche unterteilt:
Im oberen Bereich legst du eine Strategie an, wie oft der Wert des Items gespeichert werden soll. Beim Stromverbrauch bietet sich meiner Meinung nach die minütliche Speicherung an.

Im unteren Bereich ordnest du dem Item die Strategie zu. In meinem Beispiel wird der Wert des Items „Strom_Leistung“ jede Minute abgelegt. Alternativ kannst du statt einer regelmäßigen Speicherung definieren, dass nur bei Änderung des Werts dieser gespeichert werden soll („everChange“). Mit „restoreOnStartup“ werden die Werte beim Start von openHAB zurückgespielt.

Hier kannst du auch festlegen, ob nur ein Item oder eine Gruppe von Items gespeichert wird. Willst du zwei oder mehrere Items in einem Diagramm anzeigen, wählst du die zuvor angelegte Gruppe (hier „Strom_Chart“ in der sich das Item „Strom_Gesamtverbrauch_KWH“ und „Strom_Leistung“ befinden). Eine Gruppe wird mit einem Sternchen von einem Item unterschieden.

Charts in Sitemap einbinden:

Die Einbindung des Charts in die Sitemap nimmst du mit diesen Zeilen vor:

Per „period“ gibst du an, welcher Zeitraum im Diagramm genutzt werden soll. Erlaubt sind:

„h“ – 1 Stunde,
„4h“ – 4 Stunden,
„12h“ – 12 Stunden,
„D“ – 1 Tag,
„3D“ – 3 Tage,
„W“ – 1 Woche,
„2W“ – 2 Wochen,
„M“ – 1 Monat,
„2M“ – 2 Monate,
„4M“ – 4 Monate und
„Y“ – 1 Jahr.

Mit „refresh“ definierst du das Aktualisierungsintervall, also wie oft das Diagramm (in Millisekunden) neu geladen wird.

Willst du mehrere Werte in einem Diagramm anzeigen lassen, so trägst du statt „item=Strom_Leistung“ die Gruppe „item=Strom_Chart“ ein. Achte darauf, dass du für diese Gruppe auch eine Strategie in der rrd4j.persist – Datei angelegt hast!

Sitemap:

Wenn du die Werte dynamisch z. B. nach Stunde, Tag und Woche darstellen willst, brauchst du den Schalter „Strom_Chart_Intervall“. Dieser zeigt dir drei Button mit „Stunde“, „Tag“ und „Woche“ an. Mit dieser Auswahl wird dann das jeweilige Chart mit dem Zeitintervall Stunde, Tag oder Woche angezeigt. Daher die drei fast identischen Chart-Definitionen – sie unterscheiden sich nur in der Angabe von „period=“.

Den Chart kannst du auch direkt über den Browser aufrufen:

Rule zur Ermittlung der KWh:

Wie gesagt – nicht mein Werk sondern von Marianne Spiller – www.spiller.me:

 

Trouble-Shooting:

Die Datenbanken der Items werden im Verzeichnis /var/lib/openhab/persistence/rrd4j gespeichert. Hier kannst du als erstes nachsehen und schauen, ob alle Items richtig persistiert werden.

  • Sollte etwas mal nicht rund laufen, stoppe openHAB und lösche die Datenbanken in dem Verzeichnis!
  • Überprüfe die rrd4j.persist, ob alle Items bzw. Gruppen eine Strategie haben.
  • Schaue deine Items-Definitionen durch, ob diese der zu persistierende Gruppe zugeordnet sind
  • Ist die Gruppe zum Persistieren angelegt?

So und nun wünsche ich dir viel Erfolg beim Einrichten! Hinterlasse doch einen Kommentar mit deinen Erfahrungen? Welche Werte sind aus deiner Sicht sinnvollerweise in einem Chart darzustellen?

 

17 Gedanken zu „Mit openHAB Werte speichern und in Charts darstellen – am Beispiel der Zwischensteckdose mit Leistungsmessung“

  1. Hallo Marc
    Bin gerade über den Beitrag zur grafischen Darstellung vom Stromverbrauch gestolpert.
    Ich bin da kompletter Neuling und versuche gerade mit der Kombination Raspberry und openhab ein paar Kleinigkeiten zu probieren.
    In den diversen OPENHAB Foren hab ich teilweise vergeblich nach Lösungen gesucht.
    Sobald ich die Teile habe, werde ich das nach deiner Anleitung versuchen.
    Schaut ziemlich einfach aus.
    Danke vorest

    Stefan

  2. Kann jemand nachhelfen? Ich bin hier am verzweifeln. Einzelne Werte kriege ich im Diagramm dargestellt, allerdings bei einer Gruppe von Werten zeigt er ein leeres Diagramm an…

    Items:
    Group gNetatmoTemp
    Number Netatmo_Indoor_Temp „Innentemperatur [%.1f °C]“ (gNetatmoTemp) { channel = ……..

    Number Netatmo_Outdoor_Temp „Außentemperatur [%.1f °C]“ (gNetatmoTemp) { channel= ………..

    Persist:
    // persistence strategies have a name and a definition and are referred to in the „Items“ section

    Strategies {
    everyMinute : „0 * * * * ?“
    everyHour : „0 0 * * * ?“
    everyDay : „0 0 0 * * ?“
    }

    Items {
    //ein Item wird jede Minute persistiert:
    gNetatmoTemp* : strategy = everyMinute
    Netatmo_Indoor_Temp : strategy = everyMinute
    Netatmo_Outdoor_Temp : strategy = everyMinute
    }

    Sitemap:
    Frame label=“Temperaturverlauf“ {
    Chart item=gNetatmoTemp period=h refresh=10000

  3. So bei mir klappt jetzt alles. Ich habe meinen Temperaturverlauf ebenfalls über nen Button mit Stunde/Tage/Woche eingeteilt. Wenn ich jedoch einen Button betätige muss ich erst die ganze Seite neuladen damit das Diagramm erscheint. Geht das irgendwie anders, also dass das Diagramm erscheint sobald man einen der Buttons betätigt?

  4. Servus,

    ziemlich cool deine Anleitung, Danke !
    Habe allerdings ein Problem mit dem Switchen der Intervalle.
    Leider macht er keinen automatischen Refresh, und ich muss F5 drücken, damit das richtig angezeigt wird. Kennst Du das Problem ?

    Merci aber schonmal und Grüße,

    JP

  5. Hallo Marc,
    danke für den erhellenden Beitrag. Habe das auch soweit hinbekommen (mit mysql als DB).
    Aber: meine Charts haben eine Zeitverschiebung. Die Werte werden in die DB in UTC eingetragen (obwohl die Uhrzeit im System auf CET steht). Und genauso werden sie in der Grafik auch dargestellt. Sprich: die aktuelle Stunde ist leer (bzw. eine waagerechte Linie), die aktuellen Werte werden als „vor einer Stunde“ gezeigt. Hab mir schon einen Wolf gegooglet, finde aber nichts.
    Idee?
    Gruß
    Michael

    P.S.: openhab und mysql laufen bei mir unter Docker…

    1. Hallo Michael, wenn ich dich richtig verstanden habe, liegt es an der DB und nicht an openHAB. Was passiert in mysql, wenn du manuell z.B. einen Timestamp in die DB eintragen lässt. Wird dann auch UTC geschrieben?

      1. Hallo Marc,
        sham on me… Ich habe alles mögliche mit Zeitzonen etc. versucht und das Offensichtliche übersehen. In der default mysql.cfg gibt es einen Parameter „localtime“, habe ihn auf „true“ gesetzt und alles läuft wie es soll. Schlicht und einfach überlesen.
        Danke und Gruß
        Michael

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.