Energie-Funk-Mess-System EM 1000

Netzwerkschrank Zum Überwachen des Gas- und Stromverbrauchs nutze ich seit Januar '09 das ELV Energie-Funk-Mess-System EM 1000. Ferner soll auch der variable Verbrauch meiner IT-TK-Infrastruktur dokumentiert werden, da dieser zuweilen für wüste Spekulationen Grundlage war.

Hardware

ELV EM1010 Das Empfangs-/Anzeigegerät EM 1010 verfügt über einen USB-Port über welchen wir später die Messwerte auslesen und in unsere MySQL-Datenbank speichern wollen. Stecken wir die Station an, so wird uns dies im Syslog entsprechend dokumentiert:

 Jan  7 19:20:35 nss kernel: usb 3-2: new full speed USB device using ohci_hcd and address 8
 Jan  7 19:20:35 nss kernel: usb 3-2: configuration #1 chosen from 1 choic

Wie auch schon meine alte Wetterstation Wetterstation 500 von ELV wird dieses Gerät auch via dem FTDI-Kernelmodul angesprochen. Da das benötigte Kernel-Modul jedoch nicht von Haus aus geladen worden ist, müssen wir ein klein wenig nachhelfen.

Als erstes ermitteln wir die Product- und Vendor-ID unseres Gerätes:

 # lsusb 
 Bus 003 Device 008: ID 0403:e0ef Future Technology Devices International, Ltd

Alternativ können wir diese auch wie folgt ermitteln:

# cat /proc/bus/usb/devices

...
T:  Bus=03 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#=  8 Spd=12  MxCh= 0
D:  Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs=  1
P:  Vendor=0403 ProdID=e0ef Rev= 2.00
S:  Manufacturer=ELV AG
S:  Product=ELV EM 1010 PC
C:* #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr= 44mA
I:  If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=ftdi_sio
E:  Ad=81(I) Atr=02(Bulk) MxPS=  64 Ivl=0ms
E:  Ad=02(O) Atr=02(Bulk) MxPS=  64 Ivl=0ms

Diese beiden Werte Vendor=0403 und ProdID=e0ef benötigen wir nun für die weitere Konfiguration.

Einen ersten Start ermöglichen wir via:

 # modprobe ftdi_sio vendor=0x0403 product=0xe0ef

Im Syslog wird dies nun erfolgreich vermerkt:

Jan  7 20:43:17 nss kernel: drivers/usb/serial/usb-serial.c: USB Serial support registered for FTDI USB Serial Device
Jan  7 20:43:17 nss kernel: ftdi_sio 3-2:1.0: FTDI USB Serial Device converter detected
Jan  7 20:43:17 nss kernel: drivers/usb/serial/ftdi_sio.c: Detected FT8U232AM
Jan  7 20:43:17 nss kernel: usb 3-2: FTDI USB Serial Device converter now attached to ttyUSB2
Jan  7 20:43:17 nss kernel: usbcore: registered new driver ftdi_sio
Jan  7 20:43:17 nss kernel: drivers/usb/serial/ftdi_sio.c: v1.4.3:USB FTDI Serial Converters Driver

Damit nun beim Systemstart dieses Kernel-Modul automatisch geladen wird, legen wir uns eine individuelle udev-Regel an:

 # vim /etc/udev/rules.d/99-custom.rules
 SYSFS{idProduct}=="e0ef", SYSFS{idVendor}=="0403", RUN+="/sbin/modprobe -q ftdi_sio product=0xe0ef vendor=0x0403"

Software

perl-Device-SerialPort

Da wir zum Auslesen der Verbrauchswerte auf Perl zurückgreifen wollen, installieren wir uns als erstes das betreffende Programmpaket zum Ansprechen des seriellen Posts perl-Device-SerialPort.

 # yum install perl-Device-SerialPort

Was uns dieses perl-Device-SerialPort bietet, entnehmen wir am einfachsten dem rpm.

# yum info perl-Device-SerialPort

Installed Packages
Name   : perl-Device-SerialPort
...
Summary: Linux/POSIX emulation of Win32::SerialPort functions
Description:
This is a POSIX-based version of the Win32::Serialport module ported by
Joe Doss for the MisterHouse Home Automation Package from Version 0.08
of the Win32 module. He replaced calls to the Win32 API with similar
functions implemented using POSIX calls. While most of the testing has
occurred on linux, the package should work on other POSIX-compliant
Operating Systems.

Stationswerte abfragen

Für die ersten Schritte scheint das Paket FEHM recht geeignet. Zumindestens können wir schon mal damit die ersten (Meß-)Werte auslesen.

Wir laden uns also das betreffende Paket von der Projektseite herunter.

# cd /usr/local/sbin/
# wget http://www.koeniglich.de/fhem/fhem-4.5.tar.gz
# tar zxvf fhem-4.5.tar.gz
# ln -s fhem-4.5 fhem
# cd fhem

Einen ersten Testabruf der Stationsdaten erfolgt mittels em1010.pl; dieses befindet sich unter /usr/local/src/fhem/contrib/em1010.pl.

 # /usr/local/src/fhem/contrib/em1010.pl
 Usage: perl em1010.pl serial-device command args

Unseren ersten Stromzähler - der mit der ID 1 - fragen wir also wie folgt ab:

# /usr/local/src/fhem/contrib/em1010.pl /dev/ttyUSB2 getDevStatus 1
     Readings       (off  2): 199
     Nr devs        (off  6): 1
     puls/5min      (off 13): 13
     puls.max/5min  (off 15): 228
     cur.energy(off   ): 0.087 kWh
     cur.power      (      ): 1.040 kW
     cur.power max  (      ): 0.000 kW
     energy h       (off 33): 1.080 kWh (h)
     energy d       (off 37): 7.953 kWh (d)
     energy w       (off 41): 7.953 kWh (w)
     total energy   (off  7): 7.953 kWh (total)
     Alarm PA       (off 45): 23000 W
     Price CF       (off 47): 0.15 EUR/kWh
     R/kW  EC       (off 49): 150
RAW    0300 c700 0000 01a9 0400 00a9 040d 00e4 
RAW    0080 0c07 0ebb 0d00 0000 0005 0e96 0d96 
RAW    0da2 0000 00a9 0400 00a9 0400 00d8 59dc 
RAW    05dc 05

FHEM - GPL'd server for house automation

Im weiteren Verlauf betrachten wie nun das Softwareprojekt FHEM etwas genauer. Schließlich wollen wir ja unsere Meßpunkte

  1. Haus-Stromzähler
  2. EDV-Schrank-Stromzähler
  3. Gaszähler

laufend abfragen und die Meßwerte in unsere vorhandene MySQL-Datenbank ablegen und später graphisch aufbereiten.

Installation

Im vorgenannten Kapitel Stationswerte abfragen haben wir die Grundsoftware bereits installiert.

Wir beschließen nunmehr die Installation mit:

# cd /usr/local/src/fhem

# make install-pgm2
cp fhem.pl /usr/local/bin
cp -r FHEM /usr/local/lib
mkdir -p /var/log/fhem
perl -pi -e 's,modpath \.,modpath /usr/local/lib,' examples/*
perl -pi -e 's,/tmp,/var/log/fhem,' examples/*
cp webfrontend/pgm2/* /usr/local/lib/FHEM
cp docs/commandref.html docs/faq.html docs/HOWTO.html /usr/local/lib/FHEM
cp examples/sample_pgm2 /var/log/fhem/fhem.cfg
cd examples; for i in *; do cp $i /usr/local/lib/FHEM/example.$i; done


Edit /var/log/fhem/fhem.cfg then start perl /usr/local/bin/fhem.pl /var/log/fhem/fhem.cfg

erste Konfiguration

Als erstes kopieren wir unsere Konfigurationsdatei an die richtige stelle im System - /var/log/ erscheint uns doch für ein Konfigurationsfile nicht die optimale Stelle.

# mkdir /usr/local/etc/fhem
# mv /var/log/fhem/fhem.cfg /usr/local/etc/fhem/

Als nächstes passen wir dieses Konfigfile unseren Gegebenheiten an:

#vim fhem.cfg
#
# Minimalistic fhem.pl & pgm2 configfile. Take a look at the other examples for
# more.
#
attr global logfile /var/log/fhem/fhem-%Y-%m.log
attr global statefile /var/log/fhem/fhem.save           # where to save the state of the devices
attr global verbose 3                                   # "normal" verbosity (min 1, max 5)
attr global port 7072                                   # our TCP/IP port (localhost only)
attr global modpath /usr/local/lib                      # where our FHEM directory is

define WEB FHEMWEB 8083
attr WEB plotmode SVG

define FHZ1 FHZ /dev/ttyUSB1 # the serial port of an FHZ 1000 PC

# Fake logfile, to access the global log
# define Logfile FileLog /var/log/fhem/fhem/fhem-%Y-%m.log fakelog

Wir starten nunmehr zum ersten mal FHEM.

 # /usr/local/bin/fhem.pl /usr/local/etc/fhem/fhem.cfg

Im Logfile /var/log/fhem/fhem-2009-01.log wird uns der Start entsprechend quittiert:

2009.01.08 23:26:11 2: FHEMWEB port 8083 opened
2009.01.08 23:26:11 3: FHZ opening FHZ device /dev/ttyUSB1
2009.01.08 23:26:11 3: FHZ opened FHZ device /dev/ttyUSB1
2009.01.08 23:26:13 0: Server started (version 4.5 from 2008-12-23 ($Id: fhem.pl,v 1.59 2008/12/09 14:12:40 rudolfkoenig Exp $), pid 16889)

In der Prozessliste finden wir das laufende Programm ebenso:

 # ps aux | grep fhem
 root     11972  0.0  0.0   3728   496 pts/5    S+   23:20   0:00 tail -f /var/log/fhem/fhem-2009-01.log
 root     16889  0.0  0.1  10988  5820 pts/3    S    23:26   0:00 /usr/bin/perl /usr/local/bin/fhem.pl /usr/local/etc/fhem/fhem.cfg

Rufen wir nun http://localhost:8083/fhem in unserem bevorzugten Browser auf, so sehen wir die Statusanzeige.

FHEM Statusanzeige

Über den FHEM-Befehl shutdown können wir unseren ersten Test beenden.

FHEM Befehlseingabe "shutdown"

Im Logfile wird uns dies entsprechend quittiert:

 2009.01.08 23:37:02 0: Server shutdown

Datenbank-Konfiguration

Im Verzeichnis /usr/local/src/fhem-4.5/contrib/dblog werden uns Vorlagen für unsere datenbankeinstellung mitgeliefert.

Datenbankdefinition

Für den Betrieb von FHEM legen wir uns nun einen User und eine Tabelle an. Dazu nutzen wir entweder direkt den Konsolenzugang, oder wir verwenden phpmyadmin.

CREATE DATABASE `fhem` ;
CREATE USER 'fhemuser'@'localhost' IDENTIFIED BY 'Rudolf-Koenig_is-a-geek';
GRANT ALL ON fhem . * TO 'fhemuser'@'localhost';
FLUSH PRIVILEGES ;

CREATE TABLE history (TIMESTAMP TIMESTAMP, DEVICE varchar(32), TYPE varchar(32), EVENT varchar(64), READING varchar(32), VALUE varchar(32), UNIT varchar(32));
CREATE TABLE current (TIMESTAMP TIMESTAMP, DEVICE varchar(32), TYPE varchar(32), EVENT varchar(64), READING varchar(32), VALUE varchar(32), UNIT varchar(32));

Zugangstest

Als nächstes überprüfen wir, ob der zuvor angelegt User/Zugang auch funktioniert.

# mysql -D fhem -u fhemuser -h mysql-host -p
Enter password: ***Rudolf-Koenig_is-a-geek***
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 313
Server version: 5.0.45 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> status;
--------------
mysql  Ver 14.12 Distrib 5.0.45, for redhat-linux-gnu (i686) using readline 5.0

Connection id:          313
Current database:       fhem
Current user:           fhemuser@mx1.nausch.org
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         0.0.0 Source distribution
Protocol version:       00
Connection:             mysqluser via TCP/IP
Server characterset:    latin1
Db     characterset:    utf8
Client characterset:    latin1
Conn.  characterset:    latin1
TCP port:               3306
Uptime:                 4 hours 21 min 22 sec

Threads: 4  Questions: 184425  Slow queries: 0  Opens: 48  Flush tables: 1  Open tables: 40  Queries per second avg: 11.760
--------------

mysql> use fhem;
Database changed
mysql> show tables;
+----------------+
| Tables_in_fhem |
+----------------+
| current        | 
| history        | 
+----------------+
2 rows in set (0.00 sec)

mysql> quit
Bye

erweiterte Konfiguration

In der README unter /usr/local/src/fhem-4.5/contrib/dblog finden wir weitere Angaben zur Konfiguration:

For usage instruction see commandref.html, section define
2007-12-30bn

- 93_DbLog.pm
  copy this file into <modpath>/FHEM
- db.conf
  sample database configuration file
- fhemdb_create.sql
  sample sql command to create a mysql database for logging purposes
- fhemdb_get.pl
  sample perl script for retrieving the current (latest) data from
  the logging database

Wir kopieren also die Datei 93_DbLog.pm in unseren modpath.

 # cp 93_DbLog.pm /usr/local/lib/FHEM/

Das Datenbank-Configfile kopieren wir in unser locales ../etc-Verzeichnis

 # cp db.conf /usr/local/etc/fhem/

Anschließend editieren wir diese Datei

# vim /usr/local/etc/fhem/db.conf

#
# database configuration file
# 
#
#
%dbconfig= (
        connection => "mysql:database=fhem;host=mysql;port=3306",
        user => "fhemuser",
        password => "Rudolf-Koenig_is-a-geek",
);

Unser Hauptkonfigurationsdatei /usr/local/etc&fhem/fhem.cfg erweitern wir um folgende Definitionen:

Definition der beiden Strommessstellen
define Hauptzaehler EMWZ 1
define EDV_Schrank EMEM 5

# Erst einmal alle Meldungen in die Datenbank schreiben
define logdb DbLog /usr/local/etc/fhem/db.conf .*:.* 

Nach dem Start unseres Serverdienstes fhem.pl erhalten wir eine entsprechende positive Meldung im Logfile:

2009.01.09 15:22:07 2: FHEMWEB port 8083 opened
2009.01.09 15:22:07 3: EM opening device /dev/ttyUSB1
2009.01.09 15:22:07 3: EM opened device /dev/ttyUSB1
2009.01.09 15:22:07 4: EM: Sending 02001002007a00aae103
2009.01.09 15:22:36 4: EMWZ Hauptzaehler: 0.72 kW / 0.060
2009.01.09 15:22:36 4: EM: Sending 02001002007a04b16103
2009.01.09 15:22:36 4: EMEM EDV_Schrank: 0.32 kW / 5.659 kWh
2009.01.09 15:22:36 3: Connecting to database mysql:database=fhem;host=localhost;port=3306 with user fhemuser
2009.01.09 15:22:36 3: Connection to db mysql:database=fhem;host=localhost;port=3306 established
2009.01.09 15:22:36 0: Server started (version 4.5 from 2008-12-23 ($Id: fhem.pl,v 1.59 2008/12/09 14:12:40 rudolfkoenig Exp $), pid 16375)
2009.01.09 15:27:07 4: EM: Sending 02001002007a00aae103
2009.01.09 15:27:36 4: EMWZ Hauptzaehler: 1.52 kW / 0.127
2009.01.09 15:27:36 4: EM: Sending 02001002007a04b16103
2009.01.09 15:27:36 4: EMEM EDV_Schrank: 0.32 kW / 5.686 kWh

In unserer MySQL-Datenbanktabelle tauchen die entsprechenden Werte auf:

PHPmyAdmin-Fenster mit Datenbankansicht

Ebenso werden in der Statusübersicht im Browserfenster die beiden definierten Meßpunkte angezeigt:

FHEM Anzeige mit Verbrauchsübersicht

Zum Abfragen der MySQL-Datenbank kann das mitgelieferte Programm fhemdb_get.pl benutzt werden. Dieses kopieren wir als erstes nach /usr/local/bin

 # cp /usr/local/src/fhem/contrib/dblog/fhemdb_get.pl /usr/local/bin/

Anschließend korrigieren wir in dem Script noch die Datenbankdefinitionen

# vim /usr/local/bin/fhemdb_get.pl

#
# global configuration
#
my $dbconn      = "mysql:database=fhem;host=mysql;port=3306";
my $dbuser      = "fhemuser";
my $dbpassword  = "Rudolf-Koenig_is-a-geek";

Zum Abfragen des aktuellen Zählerverbrauchswert unseres Hauptzählers verwenden wir folgende Syntax: fhemdb_get.pl <device> <reading> [<reading> …], also zum Beispiel:

 # fhemdb_get.pl Hauptzaehler cum_kWh power
 cum_kWh:5.656 power:0.720

Datenbank-Loglevel anpassen

Für die ersten Test ist die Angaben von .*:.* in der Konfigurationsdatei sicher hilfreich, jedoch für den laufenden Betrieb kontraproduktiv. Wir reben also über eine passende REXEXP an, welche Werte wir zukünftig nur noch in der MySQL-Tabelle archivieren wollen.

Unser Konfigurationsdatei /usr/local/etc&fhem/fhem.cfg erweitern wir um folgende Definitionen:

Definition der beiden Strommessstellen
define Hauptzaehler EMWZ 1
define EDV_Schrank EMEM 5

# Erst einmal alle Meldungen in die Datenbank schreiben
# define logdb DbLog /usr/local/etc/fhem/db.conf .*:.* 

# Nur noch die aktuellen verbrauchswerte in die MySQL schreiben
define logdb DbLog /usr/local/etc/fhem/db.conf Hauptzaehler:power.*|EDV_Schrank:power_kW\b.*|Gaszaehler:act_flow_m3.*

Mit einem rereadcfg veranlassen wir nun, dass die neue Konfigurationseinstellung(en) aktiv werden.

Graphische Datenaufbereitung mit cacti

Cacti-Graphik deds Stromverbrauches Die optische Aufbereitung der hinterlegten Verbrauchswerte in der MySQL-Datenbank nehmen wir mit Hilfe von Cacti vor. Die hierzu notwendige Installation von Cacti ist im Dokuwiki unter Serverüberwachung mittels SNMP, RRD-Tool und Cacti ausführlich beschrieben.

Die Konfiguration(en) zum Darstellen unserer Energieverbrauchswerte (Gas und Strom) setzt auf einen funktionstüchtigen Cacti-Server auf und ist im Kapitel Energieverbrauch bei den Cacti Beispielskonfigurationen beschrieben .

Gaszähler

GaszählerbildDie optische Erkennung der Walzendrehungen haben mit dem von ELV mitgelieferten „optischen Auge“ nie so recht funktioniert - da die Erkennung wohl nur in einer sehr eingegrenzten Drehgeschwindigkeit zuverlässig funktioniert. Ich habe mir daher bei der Firma Ernst Heitland für meinen Gaszähler einen passenden Reedkontakt (ACTARIS 951-858-06 08 30/1004) besorgt.

Der Anschluß des Reedkontaktes erfolgt an den Funk-Sensor Gaszähler EM 1000-GZ und EM 1000-GZS ohne Netzteil. Das Gerät ist auch als Bausatz: Funk-Sensor Gaszähler EM 1000-GZ und EM 1000-GZS erhältlich. Den Schließkontakt des Heitland-Reed-Kontaktes habe ich dabei einfach zwischen ST6 und ST3, und den Öffner zwischen ST5 und ST4 geklemmt und die originale Sensoreinheit entsorgt. Die Klemmen bezeichnen dabei die Anschlussklemmen der Sensoreinheit EM 1000-GZS. Bild 5 auf Seite 5 des vorgenannten PDFs illustriert die Klemmpunkte.

Die Definition des Ausgabegraphen ist hier dokumentiert:

(Haupt)-Stromzähler

Zum Erfassen des Stromverbrauches nutze ich den EM 1000-WZ, der an Hand der roten Markierung der Drehscheibe am Zähler den Verbrauch erfassen kann.

Die Definition des Ausgabegraphen ist hier dokumentiert:

(EDV)-Stromzähler

Zum Erfassen des Stromverbrauches nutze ich den EM 1000-HSM, der direkt im Stromkreis der Zuleitung zum EDV-Schrank hängt, den Verbrauch misst und weiter gibt.

Die Definition des Ausgabegraphen ist hier dokumentiert:

Stromzähler

Den Stromverbrauch, also EDV-Schrank und Gesamthaus ist in nachfolgendem Graphen überlagert dargestellt.

Diskussion

Markus, 2012/03/16 07:46

Vielen Dank für die super Doku!

Ich hab das bereits entsprechend nachgebaut und es funktioniert auch sehr gut - bei einem Punkt bin ich mir noch unsicher: Die Grafiken im Cacti zeigen ja immer nur die aktuellen Werte bzw. min/mid/max Werte - keine Summe od. ä. - hast du evtl. eine Möglichkeit gefunden z.b. in der Grafik entsprechend des Zeitraums eine Summe zu bilden? (einfacher gesagt: ich hätte gerne eine Grafik die mir den Stromverbrauch im letzten Monat od. Jahr anzeigt - geht das?) Danke und lg, Markus

django, 2012/03/16 08:43

Summenbildung sollte schon möglich sein, so wie hier dargestellt. Ich werd' mir das mal heute ansehen, beim Graphen für den Stromverbrauch einbauen und hier im Wiki dokumentiern. Für die arstellung der Wochen- Monats und Jahresaufstellung klick einfach mal auf den (Stromverbrauchs-)Graphen in deinem cacti. ;)

Markus, 2012/03/16 16:17

ah - danke für den Hinweis - scheint ein´s der unendlich vielen Optionen im Cacti zu sein :-) - ich begebe mich auch mal auf die Suche. Einen möglicherweise nützlichen Hinweis hab ich noch für andere Leser deines Wiki´s: Ich habe das alles in einer virtuellen Maschine unter ESX5.0i (am Host steckt der EM1010 via USB) konfiguriert, den USB vom Host an die VM durchgereicht - funktioniert jetzt super - in der Erstversion hatte ich CactiEZ von hier http://cactiez.cactiusers.org/. Die Version ist super aber mit der funktioniert das USB leider nicht, da es scheinbar ein Problem mit den VMWareTools und den im CactiEZ vorhandenen USB Treibern gibt (ein „cat /proc/bus/usb/devices“ bringt dort nur …Driver=none…). Mit einer „standard“ CentOS NetInstall in der VM - den VMTools nachinstalliert, und deiner Beschreibung oben → kein Problem. lg, Markus

Geben Sie Ihren Kommentar ein. Wiki-Syntax ist zugelassen:
Wenn Sie die Buchstaben auf dem Bild nicht lesen können, laden Sie diese .wav Datei herunter, um sie vorgelesen zu bekommen.