Energie-Funk-Mess-System EM 1000
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
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
- Haus-Stromzähler
- EDV-Schrank-Stromzähler
- 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.
Über den FHEM-Befehl shutdown können wir unseren ersten Test beenden.
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:
Ebenso werden in der Statusübersicht im Browserfenster die beiden definierten Meßpunkte angezeigt:
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
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
Die 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
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
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. ;)
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