Schlagwort-Archive: Volkszähler

BitNotice #134 – Volkszähler-Daten mit Grafana visualisieren

BitNotice #134 - Volkszähler-Daten mit Grafana visualisieren

(77 MB) 00:17:25

2018-09-12 17:30 🛈

Das Projekt Volkszähler hatte ich ja schon öfter gezeigt: Mit diesem lassen sich über längere Zeiträume Messwerte sammeln und darstellen. Auch wenn es prinzipiell funktioniert: Inzwischen gibt es Konkurrenzprojekte, welche interessante Funktionen haben. Eines davor ist Grafana – eine reine Messwertvisualisierung, welche durch einfache Bedienung und großen Funktionsumfang heraussticht. In der aktuellen Version können auch Daten auf MySQL-Tabellen angezeigt werden – also jene Datenbank, die auch der „VZ“ nutzt. Verheiraten wir das Ganze doch einfach und nutzen Grafana zum Anzeigen der VZ-Daten.

Code

Using Channel-IDs (that’s not UUID)

SELECT
  timestamp/1000 as time_sec, 
  data.value as value, 
  properties.value as metric
FROM data
  LEFT JOIN properties ON (properties.entity_id = data.channel_id)
  LEFT JOIN entities ON (entities.id = data.channel_id)
WHERE 
  (channel_id = 1 || channel_id = 2 || channel_id = 3)  AND 
  (timestamp/1000) >= $__unixEpochFrom() AND 
  (timestamp/1000) <= $__unixEpochTo() AND
  properties.pkey = 'title'
ORDER BY timestamp ASC

Using channel names

SELECT
  timestamp/1000 as time_sec, 
  data.value as value, 
  properties.value as metric
FROM data
  LEFT JOIN properties ON (properties.entity_id = data.channel_id)
  LEFT JOIN entities ON (entities.id = data.channel_id)
WHERE 
  (properties.value = "Flur" || properties.value = "Werkstatt" ) AND
  (timestamp/1000) >= $__unixEpochFrom() AND 
  (timestamp/1000) <= $__unixEpochTo() AND
  properties.pkey = 'title'
ORDER BY timestamp ASC

Using UUID

SELECT
  timestamp/1000 as time_sec, 
  data.value as value, 
  properties.value as metric
FROM data
  LEFT JOIN properties ON (properties.entity_id = data.channel_id)
  LEFT JOIN entities ON (entities.id = data.channel_id)
WHERE 
  (uuid = "12345678-1234-1234-1234-1234567890ab" || uuid = "12345678-1234-1234-1234-1234567890ac" ) AND
  (timestamp/1000) >= $__unixEpochFrom() AND 
  (timestamp/1000) <= $__unixEpochTo() AND
  properties.pkey = 'title'
ORDER BY timestamp ASC

BitBastelei #298 – BME280 am ESP8266: Temperatur, Luftfeuchte, Luftdruck per WLAN

BitBastelei #298 - BME280 am ESP8266: Temperatur, Luftfeuchte, Luftdruck per WLAN

(311 MB) 00:18:31

2018-09-02 10:00 🛈

Sensoren habe ich viele, der BME280 verspricht aber ein Alleskönner zu sein: Neben Temperatur und Luftfeuchte soll er auch den Luftdruck übermitteln können. Zusammen mit einem ESP8266 ist so schnell eine eigene „Wetterstation“ gebaut, welche die Messwerte auf einer Webseite anzeigt, per MQTT an Haussteuerungen wie HomeAssistant gibt oder mittels HTTP einen Volkszähler befüllt.

Code:
https://github.com/adlerweb/ESP8266-BME280-Multi
Video von Chris Figge
https://www.youtube.com/watch?v=KMwVNuzghsY

BitBastelei #190 – ESP8266 & AMS2302 WLAN-Temperatur- und Feuchtesensor

BitBastelei #190 - ESP8266 & AMS2302 WLAN-Temperatur- und Feuchtesensor

(113 MB) 00:31:40

2016-03-27 10:00 🛈

Vor etwa einem Jahr hatte ich als Beispiel schon mal einen DHT22/AMS2302 Temperatur- und Feuchtesensor mit dem ESP8266 verbunden. Seinerzeit recht ineffizient mit fertiger Firmware. Da ich für einen Serverraum kurzfristig ein Monitoring brauche legen wir das Ganze nochmal neu auf – diesmal mit eigener Firmware, welche die Daten direkt an Volkszähler oder einen anderen Dienst sendet und zwischen den Messungen stromsparend in den Schlafmodus geht. Leider ist bei dem hier verwendeten ESP-01 eine Hardwaremodifikation nötig um Deep-Sleep zu ermöglichen.

Zeitmarken

  • 00:00 Aufbauplanung
  • 04:54 Deep-Sleep-Modifikation
  • 06:22 Software
  • 19:01 Flashen & ESP01-Stromverbrauch
  • 23:53 Vom Breadboard zum Streifenraster / 3.3-Regler
  • 29:15 Fazit

Links zum Thema

BitBastelei #190 – ESP8266 & AMS2302 WLAN-Temperatur- und Feuchtesensor weiterlesen

PEBCAK: Negative Temperaturen gibt’s ja auch…

In der BitNotice #44 hatte ich „mal schnell“ ein Script gebaut um die Werte eines DS18B20 Temperatursensors über einen Raspberry Pi in Volkszähler zu schaufeln. Was irgendwie nicht so ganz aufgefallen ist: Das Script konnte nur Plusgrade. Jetzt steht auf Github eine überarbeitete Version mit „-“ und etwas mehr Fehlerbehandlung. Danke an Peter, dessen Kühltruhe den Fehler aufgedeckt hat.

BitNotice #44 – DS18B20, RasPi & Volkszähler verbinden

BitNotice #44 - DS18B20, RasPi & Volkszähler verbinden

(22 MB) 00:25:21

2014-07-02 20:48 🛈

Nach den letzten Beispielen zu DS18B20 Temperatursensoren und Vorkszähler am Raspberry Pi hier eine Variante um alles zusammen zu führen. Ich habe hierzu nicht den offiziellen Weg gewählt, sondern selbst kein kleines Glue-Script in PHP gebaut.

Video ist sozusagen eine Live-Doku meiner Versuche, keine detaillierte Anleitung, dürfte jedoch einen kleinen Einblick in die VZ-Add-Operation und etwas PHP-Voodoo geben.

Code: https://gist.github.com/adlerweb/77ce74ff8c98ead2a231

BitBastelei #99 – Installation des Volkszählers

BitBastelei #99 - Installation des Volkszählers

(23 MB) 00:18:11

2014-06-08 10:00 🛈

(Manuelle) Installation des Volkszähler-Backends unter Debian Linux

Korrektur: Debian liefert zur Zeit PHP 5.4 aus, der Opcode-Cache ist erst ab PHP 5.5 verfügbar, APC wäre in diesem Setup also noch sinnvoll.

Passend dazu: BitBastelei #98 – Installation von Debian 7.5

IE11: Intranetseiten werden nicht korrekt dargestellt

Kurzer Hinweis an alle, die neuere Webapplikationen in einem Windows-Intranet nutzen wollen: Je nach Einstellung werden Webseiten mit internen IPs/Hostnames bei Nutzung des IE 11 automatisch in der „Kompatibilitätsansicht“ gerendert. Als Beispiel verschluckt sich daran die JS-Komponente des Vorlkszählers und zeigt folgende Meldung:

„Die Eigenschaft „forEach“ eines undefinierten oder Nullverweises kann
nicht abgerufen werden.“

Der Fehler scheint in diesem Fall nur mit dem IE11 im Kompatibilitätsmodus aufzutreten, der IE10 rendert trotz der Einstellung korrekt.

Mögliche Auswege:

a) Kompatibilitätsmodus abschalten

Unter Extras->Einstellungen der Kompatibilitätsansicht die Option
„Intranetsites in Kompatibilitätsansicht anzeichen“ abschalten

Bild: https://adlerweb.info/blog/wp-content/uploads/2014/05/intranet-241×300.png

Vorsicht: Dies kann ggf. andere intern verwendete Webapps unbrauchbar machen
– ask your Admin…

b) Auf der Webseite explizit IE11-Modus fordern

Hierzu folgendes im Header ergänzen:

Beim Volkszähler wäre der Code in /htdocs/frontend\index.html.

Alternativ gibt es auch passende Doctypes oder HTTP-Header um den IE zur Zusammenarbeit zu bewegen.

Alternative für vzcompress / Volkszähler

Seit einiger Zeit nutze ich – wie auch vorgestellt –  das Projekt Volkszähler um meine Messwerte zu erfassen. Der Grund für den Wechsel ist schnell erkennbar: Es ist dem angestaubten RRDTool designtechnisch um Generationen voraus, technisch hatte ich jedoch bereits damals bedenken angemeldet: Die Daten wandern einfach in eine MySQL-Datenbank – rrdtool verwendet hier ein System, welches die zeitliche Auflösung mit dem Alter der Daten senkt und so Speicher spart.

Das Ergebnis war zu erwarten: Über 10GB belegte meine Datenbank zuletzt, also muss Abhilfe geschafft werden. Genau für diesen Zweck findet ich im offiziellen Repo ein Tool namens „vzcompress„, welches unter Angabe der Kanäle und Zeiten per Argument alte Daten nach Zeiträumen zusammenfasst und somit nachträglich den Speicherverbrauch senken kann. Kann. Leider ist das Script nur für Pulssensoren (MeterInterpreter) geeignet, lässt man es auf einen Datenbestand mit absoluten Sensoren (SensorInterpreter) los wird der Datenbestand wegen der in dem Fall unpassenden Zusammenfassungsmethode quasi zerstört.

Also auf in den Kampf: Da sich mein Perl in Grenzen hält habe ich die Funktion in PHP neu implementiert und passend zu meinen Anforderungen erweitert. Das Script liest nun die verfügbaren Kanäle direkt auf den Konfigurationsdateien bzw. der Datenbank aus und unterstützt ein oder mehrere Kompresssionsschemata um ein abgestuftes Komprimieren zu ermöglichen, also z.B.

Newer than 7 Days      Keep Original
Older than 7 Days      Datapoint per 1 Minute
Older than 30 Days     Datapoint per 5 Minutes
Older than 6 Month     Datapoint per 15 Minutes
Older than 1 Year      Datapoint per 30 Minutes

Die bisher bei Volkszähler implementierten Sensoren wählen automatisch eine passende Methode:

	SensorInterpreter = Mittelwert
	MeterInterpreter = Summe
	CounterInterpreter = Maximalwert

Als Zeitstempel wird immer das Ende der zusammengefassten Zeitperiode verwendet. Auf der Konsole können Live-Statusmeldungen ausgegeben werden um den Fortschritt zu verfolgen. Getestet (im Sinne von es sind noch Daten da die stimmen könnten) ist das Ganze gegen MySQL und SensorInterpreter, andere Sensoren sollten funktionieren, bei anderen Datenbanken könnte es Probleme geben, da die SQL-Queries hardcoded sind.

Das Script selbst findet sich auf Github – für den Betrieb muss ggf. noch eine JSON-Datei gepatched werden.
Dank der Mailingsliste konnten bereits ein paar Schnitzer erkannt und zum Teil auch schon behoben werden. Auch einige interessante Verbesserundvorschläge versprechen noch bessere Ergebnisse.

Eigenbau vs. Volkszähler

Derzeit baue ich wieder an meinen Erfassungssystemen – neben dem Temperaturmonitoring ist nun auch der in BB5 vorgestellte Stromzähler in etwas größerer Ausführung im Dauerbetrieb. Die Systeme selbst laufen zufriedenstellend, aber mir fehlte im Eigenbaufrontend etwas Eyecandy.

Erst mal zu meinem Eigenbau: Die Sensoren liefern ihre Daten über verschiedene Wege an meinen Homeserver – dort schreiben entsprechende Daemons die Daten in eine RRD-Datenbank weg. Bei Aufruf der GUI werden aus den Datenbanken entsprechende Diagramme erstellt bzw. Statistiken errechnet. Vorteil ist die effiziente und ausgereifte Speicherung der Daten: das verwendete RRDTool ist „gut abgehangen“ und speichert lediglich Differenzwerte, was eine Menge Platz spart. Die Erstellung der Grafiken nimmt ggf. etwas Zeit in Anspruch, mit entsprechendem Caching lässt sich das aber verschmerzen. Fertige Systeme für Interaktion mit den Programmen sind derzeit nicht eingebaut.

Bild: https://www.adlerweb.info/blog/wp-content/uploads/2012/04/p1-150×150.pngBild: https://www.adlerweb.info/blog/wp-content/uploads/2012/04/p2-150×150.png

Auf einem der letzten Chaos Communication Congress’e war mir ein Projekt ins Auge gefallen, welches sich Volkszähler nennt – deren Ziele entsprechen ungefähr auch meinem System und da als Scriptsprache PHP zum Einsatz kommt würde das Ganze eine gute Basis für mich darstellen. Gesagt getan – dank der einfachen HTTP-API kann mein Sensor-Daemon die Daten – neben der weiterhin laufenden RRD – auch bei der Volkszähler-Middleware abliefern. Nach etwas Codestudium sogar mit Timestamp, welches einen Import meiner Daten möglich machen würde. Ein valider Aufruf sieht z.B. so aus: middleware.php/data/aaa-bbb-ccc-sen-sor-id.json?operation=add&value=123&ts=1334416684000.

Die GUI zeigt sich – abgesehen einiger Differenzen wegen meiner PHP-Konfiguration ganz kooperativ und stellt die Diagramme in perfekt angepasster Größe dar. Per Maus kann man einzelne Zeitbereiche nach Bedarf vergrößern, die Daten in anderen Formaten exportieren oder die angezeigten Sensoren dynamisch ändern.

Bild: https://www.adlerweb.info/blog/wp-content/uploads/2012/04/p3-150×150.png

Sorgen mache ich mir jedoch bei einem Blick unter die Haube: Alle Messwerte werden in eine – in diesem Fall MySQL – Datenbank geschrieben, bei den hier werdendeten Sensoren kommen so pro Monat hochgerechnet über 700MB an Datenvolumen zusammen. Meine RRD-Datenbank hat für eine Speicherdauer von mehreren Jahren gerade mal 4 MB. Etwas optimieren könnte man noch, so kann man wie auch bei RRD die Auflösung älterer Daten verringern, also z.B. nur einen Messpunkt alle 5 Minuten beibehalten, jedoch sind diese Funktionen nur von Haus aus dabei und müssten separat erstellt werden.

Da mein Server einiges an Speicher zu bieten hat werde ich mich an letzteres eventuell mal ransetzen, vorerst bleibt jedoch die gute, alte RRD in Betrieb.