strom
Elvis hasn't been seen lately. Aliens are hard to spot too. Conclusion: Elvis is an Alien
- jkh
25.11.2023
Shelly Plug S
Vor einiger Zeit brauchte ich mal eine schaltbare Steckdose, die ich per URL ein- bzw. ausschalten konnte, das Dingens hier war das preiswerteste zum testen. Nach einiger Zeit bekam ich mit, das es für diese Geräte eine Homekit kompatible Firmware gibt: was die macht und wie das geht steht hier Shelly-Geräte in HomeKit einbinden: So einfach gehts. Es geht wirklich einfach, völlig anspruchslos, das Zeugs.
Der Flukso - oder: wie messe ich den Energieverbrauch unseres Hauses ?
Eines Tages kam die Rechnung von unserem Stromversorger und sah nicht so richtig gut aus. Wir wollten unserem Stromverbrauch nach unten drücken, dazu sollte man aber wissen, wie hoch der Verbrauch ist - also musste ein Stromverbrauchsmessgerät her.
Vor einiger Zeit hatte ich schon vom Volkszähler Projekt gehört, aber ich hatte leider den Vortrag hier in Hamburg bei Lehmanns verpasst. Auf einem Seminar lernte ich ich dann einen freundlichen Menschen ( Danke, Herr Müller ! ) kennen, der mich auf das Flukso Projekt aufmerksam machte - ein guter Tip. Allerdings war der Flukso damals ausverkauft und ich musste ein gutes halbes Jahr aus die Lieferung (bestehend aus dem Flukso selbst und 3 Stromzangen 50A) warten.
Die Installation ist leicht, der Flukso kommt fertig gebaut und getestet und muß nur noch eingebaut und mit Strom und LAN/WLAN versorgt werden. Die Stromzangen zu installieren ist sicher nicht jedermanns Sache, im Zweifelsfall beauftragt man damit seinen freundlichen Elektriker und hat dann keinen Stress damit.
In unserer Installation sitzt der Flukso im Hauptsicherungskasten, da hab' ich noch zwei Steckdosen eingebaut und LAN hineingeführt (der Flukso hat auch eingebautes WLAN, da steh' ich aber nicht so drauf, Daten ohne IPSec VPN über WLAN zu transportieren ..) und die Stromzangenanschlüsse an die Klemmleiste angeschlossen:
Für die Installation der drei Stromzangen selbst hab' ich dann den Strom abgestellt und die Aufnehmer hinter der Hauptsicherung an den drei Phasen angebracht: das geht kontaktlos, die Aufnehmer werden "aufgemacht", um die Kabel gelegt und wieder "zugemacht" - fertig!
Der Flukso kann seine Daten über's Internet bei flukso.net einspeisen und visualisieren, das sieht dann so aus. Da ich es aber prinzipiell nicht mag, meine Daten woauchimmer hin mehr als unbedingt nötig herauszugeben, egal an wen, werte ich unseren Flukso selbst aus, und das sieht so aus:
Um das so hinzubekommen hab' ich erstmal rumgesucht und bei Folkert van Heusden etwas gefunden. Dann gibt's da noch die Flukso Seite, die beschreibt wie man per JSON API Daten aus dem Flukso holt. Ganz genau beschrieben wird das alles im Flukso Manual.
Dann flugs das Zeugs zusammengehackt und wie es so ist mit zusammengehacktem Zeug: es sieht scheußlich aus und läuft einfach und man fässt es nicht mehr an ...
Also - die rrd Datenbank wird so angelegt:
rrdtool create flukso_data-1.rrd --step 1 \
DS:watt:GAUGE:60:U:U \
RRA:AVERAGE:0.5:1:3600 \
RRA:AVERAGE:0.5:6:3600 \
RRA:AVERAGE:0.5:24:3600 \
RRA:AVERAGE:0.5:168:3600 \
RRA:AVERAGE:0.5:744:3600 \
RRA:AVERAGE:0.5:8928:3600 \
RRA:AVERAGE:0.5:44640:3600 \
RRA:AVERAGE:0.5:89280:3600 \
RRA:MIN:0.5:1:3600 \
RRA:MIN:0.5:6:3600 \
RRA:MIN:0.5:24:3600 \
RRA:MIN:0.5:168:3600 \
RRA:MIN:0.5:744:3600 \
RRA:MIN:0.5:8928:3600 \
RRA:MIN:0.5:44640:3600 \
RRA:MIN:0.5:89280:3600 \
RRA:MAX:0.5:1:3600 \
RRA:MAX:0.5:6:3600 \
RRA:MAX:0.5:24:3600 \
RRA:MAX:0.5:168:3600 \
RRA:MAX:0.5:744:3600 \
RRA:MAX:0.5:8928:3600 \
RRA:MAX:0.5:44640:3600 \
RRA:MAX:0.5:89280:3600
dann gibt es ein perl script, das die Daten aus dem Flukso rausholt:
#!/usr/bin/perl -w
#
use strict;
my $url = 'http://1.2.3.4:8080/sensor/';
my $fid = 'deadbeefundwassonstnochsodadrinist';
my $prm = '\?version=1.0\&interval=minute\&unit=watt\&jsonp_callback=realtime';
# print "executing: $url$fid$prm\n\n";
my $result = qx(/usr/local/bin/curl -s $url$fid$prm);
# print "\n\nRESULT = $result\n\n";
my @array = split(/[\[\]]/, $result);
my $last = 0;
foreach (@array)
{
if( $_ =~ /[0-9]+\,[0-9]+/ )
{
my @C = split(/,/);
my $DATETIME = $C[0];
my $VALUE = $C[1];
$last = $C[1];
print "rrdtool update /var/db/rrd/flukso/flukso_data.rrd $DATETIME:$VALUE\n";
system ("/usr/local/bin/rrdtool update /var/db/rrd/flukso/flukso_data.rrd $DATETIME:$VALUE");
}
}
# write watts for LCD
open OFILE, ">", "/var/tmp/watt.stat";
print OFILE $last;
close OFILE
Ganz unten wird der derzeitige Verbrauch in Watt in ein File geschrieben, wo sich ein daemon, der eine LCD Anzeige bedient, den Wert rausholt und dann darstellt, so das der aktuelle Verbrauch in der Küche immer im Blick ist ( - ohne einen Rechner anzuschalten).
Und dann gibt's ein shell script, das die Daten aus der rrd DB rausholt und die Webseite erstellt:
#!/bin/sh
WWW=/usr/local/www/apache22/data/watt
RRD=/var/db/rrd/flukso/flukso_data.rrd
WIDTH=680
HEIGHT=320
LABEL="Watt"
TITLE='Stromverbrauch-letzte-Stunde'
/usr/local/bin/rrdtool graph $WWW/flukso-hour.png -a PNG \
--width $WIDTH \
--height $HEIGHT \
--title $TITLE \
--vertical-label $LABEL \
--units-exponent 0 \
--start -1hour \
DEF:wattmax=$RRD:watt:MAX \
LINE1:wattmax#0000FF:"watt max" \
> /dev/null
TITLE='Stromverbrauch-letzte-6-Stunden'
/usr/local/bin/rrdtool graph $WWW/flukso-6hour.png -a PNG \
--width $WIDTH \
--height $HEIGHT \
--title $TITLE \
--vertical-label $LABEL \
--units-exponent 0 \
--start -6hours \
DEF:wattmax=$RRD:watt:MAX \
LINE1:wattmax#0000FF:"watt max" \
> /dev/null
TITLE='Stromverbrauch-letzter-Tag'
/usr/local/bin/rrdtool graph $WWW/flukso-day.png -a PNG \
--width $WIDTH \
--height $HEIGHT \
--title $TITLE \
--vertical-label $LABEL \
--units-exponent 0 \
--start -1day \
DEF:watt=$RRD:watt:AVERAGE \
DEF:wattmin=$RRD:watt:MIN \
DEF:wattmax=$RRD:watt:MAX \
LINE1:watt#FF0000:"watt" \
LINE1:wattmin#00FF00:"watt min" \
LINE1:wattmax#0000FF:"watt max" \
'GPRINT:watt:LAST:last\: %lf' \
'GPRINT:watt:MIN:min\: %lf' \
'GPRINT:watt:MAX:max\: %lf' \
> /dev/null
TITLE='Stromverbrauch-letzte-Woche'
/usr/local/bin/rrdtool graph $WWW/flukso-week.png -a PNG \
--width $WIDTH \
--height $HEIGHT \
--title $TITLE \
--vertical-label $LABEL \
--units-exponent 0 \
--start -1week \
DEF:watt=$RRD:watt:AVERAGE \
DEF:wattmin=$RRD:watt:MIN \
DEF:wattmax=$RRD:watt:MAX \
LINE1:watt#FF0000:"watt" \
LINE1:wattmin#00FF00:"watt min" \
LINE1:wattmax#0000FF:"watt max" \
'GPRINT:watt:LAST:last\: %lf' \
'GPRINT:watt:MIN:min\: %lf' \
'GPRINT:watt:MAX:max\: %lf' \
> /dev/null
TITLE='Stromverbrauch-letzter-Monat'
/usr/local/bin/rrdtool graph $WWW/flukso-month.png -a PNG \
--width $WIDTH \
--height $HEIGHT \
--title $TITLE \
--vertical-label $LABEL \
--units-exponent 0 \
--start -1month \
DEF:watt=$RRD:watt:AVERAGE \
DEF:wattmin=$RRD:watt:MIN \
DEF:wattmax=$RRD:watt:MAX \
LINE1:watt#FF0000:"watt" \
LINE1:wattmin#00FF00:"watt min" \
LINE1:wattmax#0000FF:"watt max" \
'GPRINT:watt:LAST:last\: %lf' \
'GPRINT:watt:MIN:min\: %lf' \
'GPRINT:watt:MAX:max\: %lf' \
> /dev/null
TITLE='Stromverbrauch-letztes-Jahr'
/usr/local/bin/rrdtool graph $WWW/flukso-year.png -a PNG \
--width $WIDTH \
--height $HEIGHT \
--title $TITLE \
--vertical-label $LABEL \
--units-exponent 0 \
--start -1year \
DEF:watt=$RRD:watt:AVERAGE \
DEF:wattmin=$RRD:watt:MIN \
DEF:wattmax=$RRD:watt:MAX \
LINE1:watt#FF0000:"watt" \
LINE1:wattmin#00FF00:"watt min" \
LINE1:wattmax#0000FF:"watt max" \
'GPRINT:watt:LAST:last\: %lf' \
'GPRINT:watt:MIN:min\: %lf' \
'GPRINT:watt:MAX:max\: %lf' \
> /dev/null
So weit so gut.