Temperatur als Diagramm

Vor fünf Tagen hatte ich meine ersten Ansätze der Ergebnisdarstellung mittels web2py beschrieben. Die Ausgabe war jedoch eine reine Textausgabe, was auf Dauer nicht befriedigend sein konnte. Daher habe ich mich auf die Suche nach einer Möglichkeit gemacht ansprechend aussehende Diagramme zu erzeugen. Dabei konnten mich die Lösungen mit gnuplot und ähnlichem nicht begeistern. Was mir prinzipiell fehlte waren:

  • ansprechendes Aussehen
  • Möglichkeit in die Daten zu zoomen

Nach einiger Zeit des Suches bin ich auf FLOT gestoßen. Bei FLOT handelt es sich um eine Javascript Bibliothek für jQuery die meines Wissens aber auch die Mootools unterstützt. raspi_multiline Bereits in den Standardeinstellungen sehen die Diagramme sehr gut aus, vieles lässt sich noch einstellen. Wie das Bild zeigt unterstützt FLOT auch gekoppelte Diagramme. Während das untere Diagramm den gesamten Zeitraum anzeigt, wird im oberen ein Ausschnitt angezeigt. Der anzuzeigende Zeitraum kann mit der Maus ausgewählt werden. Also ist alles da was es braucht. Los gehts. Die Installation ist einfach getan, es braucht nur das Archiv heruntergeladen und entpackt werden. Ich habe die JS-Dateien in /static/js/ kopiert, sodass sie innerhalb des Projektes überall erreichbar sind. Mehr ist für FLOT nicht zu tun. Aufbauend auf dem bereits bestehenden web2py Projekt sind nun der Controller und die Views entsprechend anzupassen.

Der Controller

Der Controller definiert die folgenden für das Projekt relevanten Actions:

  • index() => Anzeige der Sensorauswahl
  • show_sensor_data() => Anzeigen der Daten des ausgewählten Sensors als Diagramm
  • show_all_data() => Anzeige der Daten aller Snesoren in ein Diagramm

Die Action index() sieht derzeit wie folgt aus:

Es wird an dieser Stelle nur das Mapping von Namen zu Sensoren ausgelesen und selbige an die View übergeben. Um die Reihenfolge der Sensoren bestimmen zu können muss an dieser Stelle aber ein OrderedDict benutzt werden, da ein normales Dictionary die Reihenfolge des Einfügens von Elementen nicht beachtet. Daran schließt sich die Action zum Anzeigen der Daten eines einzelnen Sensors an.

In diese Action hat sich nicht viel geändert. Die zur Erstellung der Diagramme eingesetzte FLOT Bibliothek möchte für Achsenbeschriftungen mit Datumswerten diese Werte als Timestamps und nicht als Datetime Objekte haben. Daher muss der aus den Messdaten eingelesene String in ein Datetime und dieses dann mit mktime() in einen Timestamp gewandelt werden. Anschliessend werden die Daten an die View gesendet. Die letzte Action show_all_data() soll die Daten aller Sensoren in einem Diagramm anzeigen. Während bisher immer nur eine Datendatei ausgelesen und an die View gesendet wurde werden nun alle Daten zusammen verarbeitet. Im Prinzip findet hier nur ein mehrfacher Aufruf des bereits aus show_sensor_data() bekannten Codes statt. Mit leichten Änderungen könnten beide Funktionen auch zu einer einzigen zusammengelegt werden, was ich aber zur Übersichtlichkeit nicht getan habe.

An dieser Stelle sind alle Details der Actions beschrieben, sodass der eigentliche neue Teil in Angriff genommen werden kann, die Anzeige der Daten in Diagrammen.

Die Views

Im ersten Schritt ist es wichtig die für FLOT wichtigen JavaScript Dateien einzubinden. Prinzipiell kann dieses Einbinden auch einmalig in einer zentralen Datei wie layout.html stattfinden. Da meine Entwicklung allerdings noch im Entwicklungsstadium ist, habe ich die Skripte in den finalen Views, also konkret

  • show_sensor_data.html und
  • show_all_data.html

eingebunden. Jeder Datei hat also am Anfang die folgenden Zeilen:

Zu beachten ist hier, dass die Pfade entsprechend dem wirklichen Speicherungsort angepasst werden müssen. Da die Dateien zum großen Teil aus JavaScript Code bestehen die nahezu 1:1 den Beipielen auf der FLOT-Seite entnommen sind möchte ich sie jetzt nicht zeilenweise auflisten, sondern habe sie als Zip-Archive angehängt.

Wird nun die index-Action aufgerufen, so wird die Liste der Sensoren angezeigt. Wird der letzte Eintrag „Alle Sensoren“ ausgewählt wird ein Diagramm mit allen Daten angezeigt. Wieviele Sensoren sinnvoll in einem Diagramm angezeigt werden können hängt sicher auch von der Veränderlichkeit der Daten ab. Im Beispielbild unten geht die Übersicht bereits ein wenig verloren.

Das besonders angenehme in dem ausgewählten Diagrammtyp (siehe Beispiel bei FLOT) ist die Trennung in ein Übersichts- und ein Detaildiagramm. In beiden Diagrammen können Bereiche mit der Maus markiert werden, sodass dann nur noch der gewählte Bereich angezeigt wird.

web2py Projekt zum Download: 2014-01-04 web2py.app.raspi

Wie gehts weiter?

Die Erfassung der Daten ist soweit fertig gestellt, ebenso die Darstellung in Diagrammen. Damit können schon mal Zusammenhänge zwischen den eizelnen Meßpunkten erfasst und dargestellt werden. Soweit so schön, aber doch ein bischen zu wenig wie ich finde. Ich werde die Schaltung nun erst einmal eine Weile beobachten und die Sensoren endgültig befestigen und den Raspberry ordentlich unterbringen.

Im Weiteren ist es dann aber schon geplant mit den Erkenntnissen aktiv in die Heizungsregelung einzugreifen und die Heizung zu steuern. Daher muss ich also in der nächsten Zeit die Schaltung um Relaiskontakte erweitern und eine Steuerlogik entwickeln. Als besonderes Gimmick folgt aber wahrscheinlich vor einer Regelungslogik die Möglichkeit der Steuerung über einen Google-Kalender.

Genauer gesagt soll es möglich werden in einen Google-Kalender einen Termin mit Steuerinformationen (an/aus und Temperatur) einzustellen und diese Information dann direkt vom Raspberry auswerten zu lassen. Die Termine werden dann die grundsätzliche Zeitsteuerung der Heizungsregelung überschreiben. Soll die Heizung daheim also zu einem Zeitpunkt bereits früher eingeschaltet werden, so soll das Einstellen eines Termins mit Steuerinformationen dazu führen, dass die Heizung zum entsprechenden Zeitpunkt angeht. Somit wäre eine Steuerung nach beliebigen Zeitplänen möglich, so gewollt auch bereits auf einen langen Zeitraum hinaus.

Sowas haben nicht mal wirklich teure Heizungssteuerungen! 😉

Ersten Kommentar schreiben

Antworten

Deine E-Mail-Adresse wird nicht veröffentlicht.


*


fünf + vier =