Eigene App / Datenkrake zum SmartHome

Wir haben eine App für die Wärmepumpe. Hier kann ich die aktuelle Temperatur im Warmwasserspeicher ansehen und ein paar Dinge einstellen. Die Wärmepumpe Ein- und Ausschalten, etc.

Dann haben wir eine zweite App für die PV Anlage. Aktueller Ertrag, Stromverbrauch, Netzbezug und Einspeisung. Finde ich alles hier.

Eine weitere App für das SmartHome von myHomeControl. Hier kann ich alle Temperatur-/Co2-/Feuchtesensoren, etc. abrufen und diverse Dinge am Haus steuern. Hier kann ich auch den Stromzähler für die Wärmepumpe und z.B. den Außenstrom ablesen und noch viele andere Dinge tun.

Was mich massiv gestört hat ist, dass viele Daten die mich regelmässig interessieren aus zig verschiedenen Anwendungen abgeholt werden müssen und es fehlten ein paar übersichtliche Graphen/Visualisierungen, die mir bestimmte Daten zusammenfassen.

Weiterhin fehlten mir generell ein paar Daten, die mich interessieren. Z.B. Heizungsvor- und Rücklauf kann ich nur an der Heizung selber oder am Wärmemengenmesser ablesen. Dafür muss ich aber in den Keller…und dahin gehe ich eigentlich nur zum Lachen…ok oder Wäsche waschen…

Achtung…jetzt wird es etwas technisch und mir ist klar, dass viele hier nur noch Bahnhof verstehen. Die springen einfach zum Schluss des Beitrags und schauen sich das Ergebnis an.

Also musste etwas eigenes her. Für die fehlenden Temperaturdaten habe ich mir ein paar OneWire DS18b20 Sensoren gekauft und mir eine Mini Applikation in einem embedded Jetty (googlen, wen es interessiert) geschrieben, welche diese Daten als REST Schnittstelle bereit stellt. Sourcecode dazu hier: https://github.com/thomasbecker/tempsensorserver.

MyHomeControl bietet eine nicht mehr ganz so moderne soap Schnittstelle. Dafür habe ich mir einen Java Client generiert und darauf basierend eine Scala Library geschrieben, welche alle für mich interessanten Daten möglichst performant und parallel aus dieser Schnittstelle ausliest und in für mich brauchbarer Form zur Verfügung stellt.

Der Wechselrichter der Photovoltaik von Fronius bietet eine modernere REST Schnittstelle an. Auch hierfür habe ich mir einen Scala Client geschrieben der die Daten ausliest in meine Objekte marshalled und mir zur Verfügung stellt.

Das alles nutzt dann eine von mir geschriebene Applikation basierend auf dem https://www.lagomframework.com.

Diese liest alle für mich relevanten Daten alle 10 Sekunden aus und schreibt sie in eine Cassandra Datenbank. Weiterhin stellt die Applikation verschiedene REST Schnittstellen zum Abruf der Daten zur Verfügung.

Hier der Quellcode zu dieser App: https://github.com/thomasbecker/home-integrator-lagom

Jetzt habe ich also alle Daten in 10 Sekunden Intervallen zentral in einer Datenbank liegen. Das ganze läuft auf einem einzelnen MiniPC mit sehr geringem Energieverbrauch im Keller in Form von verschiedenen Microservices in Docker Containern.

Jetzt, wo ich alle Daten zentral habe und Abrufen kann fehlt noch ein Frontend darauf. Das ist eine Ionic 4 App. Ionic ist ein sehr nettes Framework basierend auf Angular/Typescript, welche sowohl als Webapplikation im Browser, als auch nativ auf iOS oder Android läuft.

Hier habe ich also verschiedenste Daten visualisiert. Oben sind immer die momentanen Daten zu sehen, welche einmal pro Sekunde aktualisiert werden (d.h. diese Graphen sind animiert). Darunter ist ein Graph mit den historischen Daten der letzten 4h. Die Historie kommt aus der Cassandra Datenbank. Wir erinnern uns, alle 10 Sekunden landet ein Datensatz in der Datenbank. Nachdem die Historie geladen wurde wird auch der Graph unabhängig von der Datenbank einmal pro Sekunde mit neuen Werten ergänzt. Über die Buttons zwischen den Graphen kann man den Zeitraum variieren. Von 2h bis zu einem Jahr aktuell. Mehr brauche ich momentan nicht. Da bereits ab wenigen Stunden die Datenmenge schon recht groß wird errechnet das Backend hier ein “moving average” und reduziert die Gesamtanzahl der Datensätze auf aktuell exakt 750. D.h. konkret: Für 8h sind 2.880 Datensätze in der Datenbank (6 * 60 * 8). Bei einem 8h Graph benötige ich eine solche Präzision jedoch nicht. Also mache ich daraus 750 Datensätze mit den Durchschnittswerten des jeweiligen Zeitraums. Das reicht völlig für den Graphen und das ist in ca. 150ms beim Client. Das gleiche auch für eine Woche, einen Monat oder ein Jahr, etc..

Genug der Theorie. So sieht das ganze dann auf dem IPad aus:

Stromverbrauch des Hauses. Rot die Wärmepumpe. Schwarz Netzbezug bzw. wenn negativ: Netzeinspeisung. Grün Photovoltaik Ertrag.

Das ganze ist nicht nur interessant. Man kann damit tatsächlich auch was anfangen. So kann ich z.B. genau sehen, wieviel Temperatur das Haus über Nacht verliert, wenn ich nachts eine niedrigere Heizkurve fahre als tagsüber. Bzw. In der Übergangszeit schalte ich die Wärmepumpe nachts komplett aus. Um möglichst viel PV Strom für die Wärmepumpe zu nutzen.
Ebenso kann man sehr gut sehen, wie sich Wäsche aufhängen, Duschen, Baden, etc. auf die Luftfeuchtigkeit mit dem Entalpietauscher auswirkt. Und ich konnte die Nutzung der PV Anlage für die Wärmepumpe fast ohne Komfortverlust weiter optimieren. Komplett ausgeschaltet bei 5 Grad Außentemperatur verlieren wir nichtmal ein Grad, wenn ich die WP Abends um 20:30 Uhr komplett ausschalte und morgens um 10 Uhr wieder einschalte. Womit wir beim nächsten Thema wären. Ich wollte wissen, wieviel vom Wärmepumpenstrom wir über die PV abdecken. Fakt ist ja, dass wir im Winter am meisten Strom für die Wärmepumpe verbrauchen. Aber auch, dass im Winter bei kurzen Tagen und tiefstehender Sonne nur wenig PV Erträge vorhanden sind (wer hat sich das eigentlich so ausgedacht?). Trotzdem habe ich mal geschätzt, dass wir mit der 10 kWp PV auf dem Dach und meinen Optimierungen gut 30-40% abdecken können sollten.

Aber glauben ist nicht wissen und ein paar Bekannte haben das für viel zu optimistisch gehalten. Also mussten auch dafür Graphen her. Immer wenn ein Datensatz zum Stromverbrauch im Haus rein kommt, landet dieser in einer weiteren Tabelle in er Cassandra und zwar mit folgenden Daten: Stromverbrauch Wärmepumpe, Photovoltaik Ertrag und Abdeckung der Wärmepumpe durch PV Strom. Für diese Berechnung ignoriere ich stumpf alle anderen Stromverbrauche im Haus und tue so als gäbe es nur die Wärmepumpe. Der erste Versuch war die Daten in der Datenbank zu aggregieren. D.h. wenn ich die Daten für einen Monat abrufe dann sind das ein paar hundert Tausend Einträge auf die es ein paar Durchschnittswerte gruppiert nach Monat zu berechnen galt. Mir war klar, dass das nicht besonders performant und auch nicht die finale Lösung wird. Mich hat aber auch interessiert, was die Cassandra auf dem mäßig potenten MiniPC zu leisten vermag. Ich war erstaunt, dass die Daten dennoch in 2-5 Sekunden zur Verfügung standen. Aber spätestens bei der Übersicht für ein Jahr wurde es dann deutlich zu langsam. Also habe ich das aggregieren vom Lesen auf das Schreiben verlegt. Ich pflege jetzt mehrere Tabellen. Eine Stundenbasierte mit allen Daten. Die Daten in dieser Tabelle haben eine TimeToLive von 2h. D.h. nach 2h wird ein Datensatz wieder gelöscht. Eine weitere Tabelle mit den Durschnittswerten für jede Stunde des Tages. Eine weitere für jeden Tag des Monats. Eine weitere für jeden Monat des Jahres und eine letzte für die Jahre die da kommen.

Immer wenn ein neuer Datensatz rein kommt landet er in der Stundentabelle. Gleichzeitig hole ich mir alle Datensätze für die aktuelle Stunde (max. 360) und berechne den Durchschnitt der aktuellen Stunde neu. Diesen trage ich in die Tagestabelle als Durchschnitt für die aktuelle Stunde ein. Dann hole ich mir alle Durchschnittswerte für jede Stunde des aktuellen Tages (max. 24) und berechne den Tagesschnitt neu und trage das Ergebnis in die Monatstabelle ein, usw..
Das Schreiben dauert so etwas länger. Aber immer noch deutlich unter 50ms. Und mich interessiert auch nicht, wie lange das Schreiben dauert. Solange es schnell genug ist, dass alle Daten problemlos weg geschrieben werden können.

Für die Monatsansicht eines Jahres muss ich so also nur 12 Datensätze aus der richtigen Tabelle lesen. Anstatt mehrerer Millionen Datensätze zu aggregieren. Der gesamte Graph läd so im Client in 30-40ms. D.h. man klickt und ohne spürbare Verzögerung wird der Graph angezeigt.

Sabbel nich…wie sieht das Ergebnis aus? So:

Als erstes mal der Januar. Hier sieht man deutlich, dass relativ viel verbraucht wird und relativ wenig von der PV (grün) abgedeckt werden kann. Kalt, kurze Tage, tief stehende Sonne sind eine doofe Kombination.

Zum Vergleich der März. Hier kann ich überwiegend mit PV Strom heizen und Warmwasser bereiten. Der Gesamtverbrauch sinkt. Die PV Abdeckung steigt bereits sehr stark. Das wird jetzt noch verstärkt, weil wir seit ein paar Tagen die Wärmepumpe nur noch für Warmwasser laufen haben und nicht mehr heizen müssen. Und jeder Tag wird länger und die PV Erträge werden bis in den Sommer noch sehr stark ansteigen.

Hier dann die Jahresansicht für 2019. Man sieht deutlich, wie schlecht die Abdeckung im Januar ist (ca. 20%) und im März sind wir bei 65%.

Hier die “All time” Ansicht. Ich habe Daten im aktuellen Format nur für 2019. Im Dezember sind es nur Daten von zwei, drei Tagen. Man sieht aber, dass wir in 2019 jetzt schon mit großen Schritten auf die 40% Abdeckung zugehen. Ab April bis September/Oktober werden wir wohl auf 80-90% Abdeckung kommen, da wir nur noch Warmwasser machen müssen und die PV Erträge deutlich höher und länger über den Tag verteilt sein werden.

Also wieviel Wärmepumpenstrom kann denn jetzt von der PV über das Jahr verteilt abgedeckt werden? Keine Ahnung…fragt mich am 31.12.2019 um 23:59 Uhr nochmal. Dann weiß ich mehr. Aber ich korrigiere mein vorherigen Schätzungen mal auf deutlich über 40%.

D.h. unsere sowieso schon niedrigen Heizkosten von ca. 400-500€ / Jahr werden zu mindestens 40% … vermutlich noch etwas mehr von der PV getragen. Ergo tatsächlich zahlen wir wohl unter 300€ für Heizung- und Warmwasser für ca. 250qm beheizte Wohnfläche. In der 74qm Wohnung lagen wir deutlich über 600€.

Man kann also sagen, dass unser Heizkonzept ganz gut aufgeht und sich die Investition in gute Dämmung und vor allem die PV sehr schnell bezahlt machen wird. Die Mehrkosten von KFW55 (Standard bei Weberhaus) zu KFW40 wurden bei uns vom Tilgungszuschuss der KFW Bank übertroffen und die PV hat sich in ca. 3-4 Jahren (dann ist sie 6 bzw. 7 Jahre alt) bereits selbst bezahlt, wenn es so weiter geht. Das einzige, was mich ärgert ist, dass ich das Dach nicht gleich mit PV voll gemacht habe. Dann wären nämlich 20-25 kWp aufs Dach gegangen. Der Preis pro kWp wäre gesunken, die Abdeckung des Wärmepumpenstrom bei schlechtem Wetter/Winter wäre deutlich höher und auch diese Mehrinvestition hätte sich innerhalb von 6-8 Jahren selbst bezahlt. Aber dazu vielleicht später mal mehr.

2 thoughts on “Eigene App / Datenkrake zum SmartHome

  1. Nino-Jerome Renaud

    Coole Idee aber wäre es nicht vielleicht einfacher gegangen wenn du alle Daten in Splunk importiert hättest? Die Graphen macht Splunk dann ja selber und auch die Speicherverwaltung.
    Aber ich denke mal du hast da schon die effizientere Lösung.

  2. Thomas Bauherr Beitragsautor

    Hi Nino-Jerome,

    ja, habe ich tatsächlich auch drüber nachgedacht. Splunk wäre eine Möglichkeit gewesen. Bei mir wäre es wohl eher ein elk-Stack (elastic/kibana) geworden. Dann hätte ich nur die Schnittstellen schreiben müssen und die Visualisierungen bauen.
    Aber ich wollte das ganze in einer nativen App (ionic ist nur so halb nativ) für Web und Android/ios haben. Und das ganze soll möglichst ohne Zeitverzögerung aufzurufen sein. Ein anderer Punkt der mich nervt. Bei Fronius dauert es 2-5 Sekunden bis er die aktuellen Daten im Webfrontend anzeigt. Warum ist mir unklar, denn die Restschnittstelle ist sehr schnell. Aber die Daten müssen zum Fronius Server in die Cloud und dort irgendwie verarbeitet werden. Und bei myHomeControl muss ich mich erst über Teamviewer einloggen, was auch dauert.
    Und letzten Endes darf das ganze auch nur wenig Ressourcen verbrauchen, damit es auf einem sehr Strom sparendem MiniPC läuft.

    Jetzt sind alle Graphen bei Klick quasi sofort verfügbar (meist < 100ms Antwortzeit). Eine Ausnahme sind die Trendgraphen, weil ihr aktuell 750 (konfigurierbar) Datensätze aus der DB ans Frontend übertragen werden müssen. Vermutlich wären die Graphen auch mit der Hälfte noch detailliert genug. Aber bei den Trend Graphen kann ich mit ca. 1s Wartezeit gut leben. Grüße, Thomas

Kommentar verfassen

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.