fun:energie-funk-mess-system_em_1000

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
Nächste ÜberarbeitungBeide Seiten der Revision
fun:energie-funk-mess-system_em_1000 [27.08.2012 20:03. ] – [Stationswerte abfragen] djangofun:energie-funk-mess-system_em_1000 [20.04.2018 09:06. ] – Externe Bearbeitung 127.0.0.1
Zeile 1: Zeile 1:
 +====== Energie-Funk-Mess-System EM 1000 ======
 +{{ :fun:serverschrank.png?101|Netzwerkschrank}}
 +Zum Überwachen des Gas- und Stromverbrauchs nutze ich seit Januar 2009 das [[http://www.elv.de/Empfangs-Anzeigegerät-EM-1010/x.aspx/cid_74/detail_10/detail2_15910|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 =====
 +{{:fun:em1010pc.png?100 |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. 
 +
 +==== CentOS 5.x ====
 +Stecken wir die Station an einen CentOS 5.x Rechner 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 [[wetter:ws500:start]] 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:
 +<code># 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</code>
 +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:
 +<code>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</code>
 +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"
 +
 +==== CentOS 6.x ====
 +Verbinden wir die Station mit einem Rechner, auf dem CentOS 6.x installiert ist, wird im syslog wesentlich mehr als bei CentOS 5.x ausgegeben:
 +<code>Jul 26 16:49:45 vml000020 kernel: usb 1-2: new full speed USB device number 3 using uhci_hcd
 +Jul 26 16:49:45 vml000020 kernel: usb 1-2: New USB device found, idVendor=0000, idProduct=0000
 +Jul 26 16:49:45 vml000020 kernel: usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
 +Jul 26 16:49:45 vml000020 kernel: usb 1-2: Product: QEMU USB Hub
 +Jul 26 16:49:45 vml000020 kernel: usb 1-2: Manufacturer: QEMU 0.12.1
 +Jul 26 16:49:45 vml000020 kernel: usb 1-2: SerialNumber: 314159
 +Jul 26 16:49:45 vml000020 kernel: usb 1-2: configuration #1 chosen from 1 choice
 +Jul 26 16:49:45 vml000020 kernel: hub 1-2:1.0: USB hub found
 +Jul 26 16:49:45 vml000020 kernel: hub 1-2:1.0: 8 ports detected
 +Jul 26 16:49:46 vml000020 kernel: usb 1-2.1: new full speed USB device number 4 using uhci_hcd
 +Jul 26 16:49:47 vml000020 kernel: usb 1-2.1: New USB device found, idVendor=0403, idProduct=e0ef
 +Jul 26 16:49:47 vml000020 kernel: usb 1-2.1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
 +Jul 26 16:49:47 vml000020 kernel: usb 1-2.1: Product: ELV EM 1010 PC
 +Jul 26 16:49:47 vml000020 kernel: usb 1-2.1: Manufacturer: ELV AG
 +Jul 26 16:49:47 vml000020 kernel: usb 1-2.1: configuration #1 chosen from 1 choice
 +Jul 26 16:49:47 vml000020 kernel: usbcore: registered new interface driver usbserial
 +Jul 26 16:49:47 vml000020 kernel: USB Serial support registered for generic
 +Jul 26 16:49:47 vml000020 kernel: usbcore: registered new interface driver usbserial_generic
 +Jul 26 16:49:47 vml000020 kernel: usbserial: USB Serial Driver core
 +Jul 26 16:49:47 vml000020 kernel: USB Serial support registered for FTDI USB Serial Device
 +Jul 26 16:49:47 vml000020 kernel: ftdi_sio 1-2.1:1.0: FTDI USB Serial Device converter detected
 +Jul 26 16:49:47 vml000020 kernel: usb 1-2.1: Detected FT8U232AM
 +Jul 26 16:49:47 vml000020 kernel: usb 1-2.1: Number of endpoints 2
 +Jul 26 16:49:47 vml000020 kernel: usb 1-2.1: Endpoint 1 MaxPacketSize 64
 +Jul 26 16:49:47 vml000020 kernel: usb 1-2.1: Endpoint 2 MaxPacketSize 64
 +Jul 26 16:49:47 vml000020 kernel: usb 1-2.1: Setting MaxPacketSize 64
 +Jul 26 16:49:47 vml000020 kernel: usb 1-2.1: FTDI USB Serial Device converter now attached to ttyUSB0
 +Jul 26 16:49:47 vml000020 kernel: usbcore: registered new interface driver ftdi_sio
 +Jul 26 16:49:47 vml000020 kernel: ftdi_sio: v1.5.0:USB FTDI Serial Converters Driver
 +</code>
 +Da hier bereits der notwendige //FTDI Serial Converters Driver// automatisch geladen wurde, brauchen wir hier nichts weiter mehr händisch konfigurieren.
 +Wir können direkt die Station über die automatisch angelegten Gerätetreiberdatei //**/dev/ttyUSB0**// wie nachfolgend gezeigt ansprechen.
 +===== Software =====
 +==== Perl Bibliotheken ====
 +=== 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.
 +
 +   # rpm -qil perl-Device-SerialPort
 +<code>Name        : perl-Device-SerialPort       Relocations: (not relocatable)
 +Version     : 1.04                              Vendor: Dag Apt Repository, http://dag.wieers.com/apt/
 +Release     : 1.el6.rf                      Build Date: Thu 11 Nov 2010 05:44:11 AM CET
 +Install Date: Thu 26 Jul 2012 04:51:09 PM CEST      Build Host: lisse.hasselt.wieers.com
 +Group       : Applications/CPAN             Source RPM: perl-Device-SerialPort-1.04-1.el6.rf.src.rpm
 +Size        : 245573                           License: Artistic/GPL
 +Signature   : DSA/SHA1, Thu 11 Nov 2010 07:30:56 AM CET, Key ID a20e52146b8d79e6
 +Packager    : Dries Verachtert <dries@ulyssis.org>
 +URL         : http://search.cpan.org/dist/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.
 +/usr/bin/modemtest
 +/usr/lib64/perl5/vendor_perl/Device
 +/usr/lib64/perl5/vendor_perl/Device/SerialPort.pm
 +/usr/lib64/perl5/vendor_perl/auto/Device
 +/usr/lib64/perl5/vendor_perl/auto/Device/SerialPort
 +/usr/lib64/perl5/vendor_perl/auto/Device/SerialPort/SerialPort.bs
 +/usr/lib64/perl5/vendor_perl/auto/Device/SerialPort/SerialPort.so
 +/usr/share/doc/perl-Device-SerialPort-1.04
 +/usr/share/doc/perl-Device-SerialPort-1.04/Changes
 +/usr/share/doc/perl-Device-SerialPort-1.04/MANIFEST
 +/usr/share/doc/perl-Device-SerialPort-1.04/META.yml
 +/usr/share/doc/perl-Device-SerialPort-1.04/README
 +/usr/share/doc/perl-Device-SerialPort-1.04/TODO
 +/usr/share/doc/perl-Device-SerialPort-1.04/eg
 +/usr/share/doc/perl-Device-SerialPort-1.04/eg/any_os.plx
 +/usr/share/doc/perl-Device-SerialPort-1.04/eg/demo1.plx
 +/usr/share/doc/perl-Device-SerialPort-1.04/eg/demo2.plx
 +/usr/share/doc/perl-Device-SerialPort-1.04/eg/demo3.plx
 +/usr/share/doc/perl-Device-SerialPort-1.04/eg/demo4.plx
 +/usr/share/doc/perl-Device-SerialPort-1.04/eg/demo5.plx
 +/usr/share/doc/perl-Device-SerialPort-1.04/eg/demo6.plx
 +/usr/share/doc/perl-Device-SerialPort-1.04/eg/demo7.plx
 +/usr/share/doc/perl-Device-SerialPort-1.04/eg/demo8.plx
 +/usr/share/doc/perl-Device-SerialPort-1.04/eg/example1.txt
 +/usr/share/doc/perl-Device-SerialPort-1.04/eg/example2.txt
 +/usr/share/doc/perl-Device-SerialPort-1.04/eg/example3.txt
 +/usr/share/doc/perl-Device-SerialPort-1.04/eg/example4.txt
 +/usr/share/doc/perl-Device-SerialPort-1.04/eg/example5.txt
 +/usr/share/doc/perl-Device-SerialPort-1.04/eg/example6.txt
 +/usr/share/doc/perl-Device-SerialPort-1.04/eg/example7.txt
 +/usr/share/doc/perl-Device-SerialPort-1.04/eg/example8.txt
 +/usr/share/doc/perl-Device-SerialPort-1.04/eg/options.plx
 +/usr/share/man/man1/modemtest.1.gz
 +/usr/share/man/man3/Device::SerialPort.3pm.gz
 +</code>
 +
 +=== perl-Time-HiRes ===
 +Weiter wird noch das Paket **perl-Time-HiRes** von dem Projekt **FHEM** benötigt, welches wir noch installieren.
 +   # yum install perl-Time-HiRes
 +
 +Was uns dieses **perl-Time-HiRes** bietet, entnehmen wir am einfachsten dem rpm.
 +   # rpm -qil perl-Time-HiRes
 +<code>Name        : perl-Time-HiRes              Relocations: (not relocatable)
 +Version     : 1.9721                            Vendor: CentOS
 +Release     : 127.el6                       Build Date: Fri 22 Jun 2012 03:38:59 PM CEST
 +Install Date: Thu 26 Jul 2012 10:58:43 PM CEST      Build Host: c6b7.bsys.dev.centos.org
 +Group       : Development/Libraries         Source RPM: perl-5.10.1-127.el6.src.rpm
 +Size        : 57406                            License: GPL+ or Artistic
 +Signature   : RSA/SHA1, Mon 25 Jun 2012 12:16:43 AM CEST, Key ID 0946fca2c105b9de
 +Packager    : CentOS BuildSystem <http://bugs.centos.org>
 +URL         : http://www.perl.org/
 +Summary     : High resolution alarm, sleep, gettimeofday, interval timers
 +Description :
 +The Time::HiRes module implements a Perl interface to the usleep, nanosleep,
 +ualarm, gettimeofday, and setitimer/getitimer system calls, in other words,
 +high resolution time and timers. See the "EXAMPLES" section below and the test
 +scripts for usage; see your system documentation for the description of the
 +underlying nanosleep or usleep, ualarm, gettimeofday, and setitimer/getitimer
 +calls.
 +/usr/lib64/perl5/Time/HiRes.pm
 +/usr/lib64/perl5/auto/Time/HiRes/HiRes.so
 +/usr/share/man/man3/Time::HiRes.3pm.gz
 +</code>
 +
 +=== perl-Compress-Zlib ===
 +Schließlich wird noch das Paket **perl-Compress-Zlib** von dem Projekt **FHEM** benötigt, welches wir noch installieren.
 +   # yum install perl-Compress-Zlib -y
 +
 +Was uns dieses **perl-Compress-Zlib** bietet, entnehmen wir am einfachsten dem rpm.
 +   # rpm -qil perl-Compress-Zlib
 +<code>Name        : perl-Compress-Zlib           Relocations: (not relocatable)
 +Version     : 2.020                             Vendor: CentOS
 +Release     : 127.el6                       Build Date: Fri 22 Jun 2012 03:38:59 PM CEST
 +Install Date: Fri 27 Jul 2012 02:46:02 PM CEST      Build Host: c6b7.bsys.dev.centos.org
 +Group       : Development/Libraries         Source RPM: perl-5.10.1-127.el6.src.rpm
 +Size        : 52167                            License: GPL+ or Artistic
 +Signature   : RSA/SHA1, Mon 25 Jun 2012 12:17:14 AM CEST, Key ID 0946fca2c105b9de
 +Packager    : CentOS BuildSystem <http://bugs.centos.org>
 +URL         : http://www.perl.org/
 +Summary     : A module providing Perl interfaces to the zlib compression library
 +Description :
 +The Compress::Zlib module provides a Perl interface to the zlib
 +compression library. Most of the functionality provided by zlib is
 +available in Compress::Zlib.
 +
 +The module can be split into two general areas of functionality,
 +namely in-memory compression/decompression and read/write access to
 +gzip files.
 +/usr/lib64/perl5/Compress/Zlib.pm
 +/usr/lib64/perl5/auto/Compress/Zlib
 +/usr/lib64/perl5/auto/Compress/Zlib/autosplit.ix
 +/usr/share/man/man3/Compress::Zlib.3pm.gz
 +</code>
 +
 +=== perl-DBI ===
 +Abschließend wird noch das Paket **perl-DBI** und **perl-DBD-MySQL** von dem Projekt **FHEM** benötigt, welches wir noch installieren.
 +   # yum install perl-DBI perl-DBD-MySQL -y
 +
 +Was uns dieses **perl-DBI** bietet, entnehmen wir am einfachsten dem rpm.
 +   # rpm -qil perl-DBI
 +<code>Name        : perl-DBI                     Relocations: (not relocatable)
 +Version     : 1.609                             Vendor: CentOS
 +Release     : 4.el6                         Build Date: Fri 20 Aug 2010 02:34:23 AM CEST
 +Install Date: Fri 27 Jul 2012 07:16:50 PM CEST      Build Host: c6b1.bsys.dev.centos.org
 +Group       : Development/Libraries         Source RPM: perl-DBI-1.609-4.el6.src.rpm
 +Size        : 1733598                          License: GPL+ or Artistic
 +Signature   : RSA/8, Sun 03 Jul 2011 06:55:01 AM CEST, Key ID 0946fca2c105b9de
 +Packager    : CentOS BuildSystem <http://bugs.centos.org>
 +URL         : http://dbi.perl.org/
 +Summary     : A database access API for perl
 +Description :
 +DBI is a database access Application Programming Interface (API) for
 +the Perl Language. The DBI API Specification defines a set of
 +functions, variables and conventions that provide a consistent
 +database interface independent of the actual database being used.
 +/usr/bin/dbilogstrip
 +/usr/bin/dbiprof
 +/usr/bin/dbiproxy
 +/usr/lib64/perl5/Bundle
 +/usr/lib64/perl5/Bundle/DBI.pm
 +/usr/lib64/perl5/DBD
 +/usr/lib64/perl5/DBD/DBM.pm
 +/usr/lib64/perl5/DBD/ExampleP.pm
 +/usr/lib64/perl5/DBD/File.pm
 +/usr/lib64/perl5/DBD/Gofer
 +/usr/lib64/perl5/DBD/Gofer.pm
 +/usr/lib64/perl5/DBD/Gofer/Policy
 +/usr/lib64/perl5/DBD/Gofer/Policy/Base.pm
 +/usr/lib64/perl5/DBD/Gofer/Policy/classic.pm
 +/usr/lib64/perl5/DBD/Gofer/Policy/pedantic.pm
 +/usr/lib64/perl5/DBD/Gofer/Policy/rush.pm
 +/usr/lib64/perl5/DBD/Gofer/Transport
 +/usr/lib64/perl5/DBD/Gofer/Transport/Base.pm
 +/usr/lib64/perl5/DBD/Gofer/Transport/null.pm
 +/usr/lib64/perl5/DBD/Gofer/Transport/pipeone.pm
 +/usr/lib64/perl5/DBD/Gofer/Transport/stream.pm
 +/usr/lib64/perl5/DBD/NullP.pm
 +/usr/lib64/perl5/DBD/Proxy.pm
 +/usr/lib64/perl5/DBD/Sponge.pm
 +/usr/lib64/perl5/DBI
 +/usr/lib64/perl5/DBI.pm
 +/usr/lib64/perl5/DBI/Changes.pm
 +/usr/lib64/perl5/DBI/Const
 +/usr/lib64/perl5/DBI/Const/GetInfo
 +/usr/lib64/perl5/DBI/Const/GetInfo/ANSI.pm
 +/usr/lib64/perl5/DBI/Const/GetInfo/ODBC.pm
 +/usr/lib64/perl5/DBI/Const/GetInfoReturn.pm
 +/usr/lib64/perl5/DBI/Const/GetInfoType.pm
 +/usr/lib64/perl5/DBI/DBD
 +/usr/lib64/perl5/DBI/DBD.pm
 +/usr/lib64/perl5/DBI/DBD/Metadata.pm
 +/usr/lib64/perl5/DBI/FAQ.pm
 +/usr/lib64/perl5/DBI/Gofer
 +/usr/lib64/perl5/DBI/Gofer/Execute.pm
 +/usr/lib64/perl5/DBI/Gofer/Request.pm
 +/usr/lib64/perl5/DBI/Gofer/Response.pm
 +/usr/lib64/perl5/DBI/Gofer/Serializer
 +/usr/lib64/perl5/DBI/Gofer/Serializer/Base.pm
 +/usr/lib64/perl5/DBI/Gofer/Serializer/DataDumper.pm
 +/usr/lib64/perl5/DBI/Gofer/Serializer/Storable.pm
 +/usr/lib64/perl5/DBI/Gofer/Transport
 +/usr/lib64/perl5/DBI/Gofer/Transport/Base.pm
 +/usr/lib64/perl5/DBI/Gofer/Transport/pipeone.pm
 +/usr/lib64/perl5/DBI/Gofer/Transport/stream.pm
 +/usr/lib64/perl5/DBI/Profile.pm
 +/usr/lib64/perl5/DBI/ProfileData.pm
 +/usr/lib64/perl5/DBI/ProfileDumper
 +/usr/lib64/perl5/DBI/ProfileDumper.pm
 +/usr/lib64/perl5/DBI/ProfileDumper/Apache.pm
 +/usr/lib64/perl5/DBI/ProfileSubs.pm
 +/usr/lib64/perl5/DBI/ProxyServer.pm
 +/usr/lib64/perl5/DBI/PurePerl.pm
 +/usr/lib64/perl5/DBI/Roadmap.pm
 +/usr/lib64/perl5/DBI/SQL
 +/usr/lib64/perl5/DBI/SQL/Nano.pm
 +/usr/lib64/perl5/DBI/Util
 +/usr/lib64/perl5/DBI/Util/CacheMemory.pm
 +/usr/lib64/perl5/DBI/Util/_accessor.pm
 +/usr/lib64/perl5/Roadmap.pod
 +/usr/lib64/perl5/TASKS.pod
 +/usr/lib64/perl5/auto/DBI
 +/usr/lib64/perl5/auto/DBI/DBI.so
 +/usr/lib64/perl5/auto/DBI/DBIXS.h
 +/usr/lib64/perl5/auto/DBI/Driver.xst
 +/usr/lib64/perl5/auto/DBI/Driver_xst.h
 +/usr/lib64/perl5/auto/DBI/dbd_xsh.h
 +/usr/lib64/perl5/auto/DBI/dbi_sql.h
 +/usr/lib64/perl5/auto/DBI/dbipport.h
 +/usr/lib64/perl5/auto/DBI/dbivport.h
 +/usr/lib64/perl5/auto/DBI/dbixs_rev.h
 +/usr/lib64/perl5/dbixs_rev.pl
 +/usr/share/doc/perl-DBI-1.609
 +/usr/share/doc/perl-DBI-1.609/README
 +/usr/share/doc/perl-DBI-1.609/ex
 +/usr/share/doc/perl-DBI-1.609/ex/perl_dbi_nulls_test.pl
 +/usr/share/doc/perl-DBI-1.609/ex/profile.pl
 +/usr/share/man/man1/dbilogstrip.1.gz
 +/usr/share/man/man1/dbiprof.1.gz
 +/usr/share/man/man1/dbiproxy.1.gz
 +/usr/share/man/man3/Bundle::DBI.3pm.gz
 +/usr/share/man/man3/DBD::DBM.3pm.gz
 +/usr/share/man/man3/DBD::File.3pm.gz
 +/usr/share/man/man3/DBD::Gofer.3pm.gz
 +/usr/share/man/man3/DBD::Gofer::Policy::Base.3pm.gz
 +/usr/share/man/man3/DBD::Gofer::Policy::classic.3pm.gz
 +/usr/share/man/man3/DBD::Gofer::Policy::pedantic.3pm.gz
 +/usr/share/man/man3/DBD::Gofer::Policy::rush.3pm.gz
 +/usr/share/man/man3/DBD::Gofer::Transport::Base.3pm.gz
 +/usr/share/man/man3/DBD::Gofer::Transport::null.3pm.gz
 +/usr/share/man/man3/DBD::Gofer::Transport::pipeone.3pm.gz
 +/usr/share/man/man3/DBD::Gofer::Transport::stream.3pm.gz
 +/usr/share/man/man3/DBD::Proxy.3pm.gz
 +/usr/share/man/man3/DBD::Sponge.3pm.gz
 +/usr/share/man/man3/DBI.3pm.gz
 +/usr/share/man/man3/DBI::Const::GetInfo::ANSI.3pm.gz
 +/usr/share/man/man3/DBI::Const::GetInfo::ODBC.3pm.gz
 +/usr/share/man/man3/DBI::Const::GetInfoReturn.3pm.gz
 +/usr/share/man/man3/DBI::Const::GetInfoType.3pm.gz
 +/usr/share/man/man3/DBI::DBD.3pm.gz
 +/usr/share/man/man3/DBI::DBD::Metadata.3pm.gz
 +/usr/share/man/man3/DBI::FAQ.3pm.gz
 +/usr/share/man/man3/DBI::Gofer::Execute.3pm.gz
 +/usr/share/man/man3/DBI::Gofer::Request.3pm.gz
 +/usr/share/man/man3/DBI::Gofer::Response.3pm.gz
 +/usr/share/man/man3/DBI::Gofer::Serializer::Base.3pm.gz
 +/usr/share/man/man3/DBI::Gofer::Serializer::DataDumper.3pm.gz
 +/usr/share/man/man3/DBI::Gofer::Serializer::Storable.3pm.gz
 +/usr/share/man/man3/DBI::Gofer::Transport::Base.3pm.gz
 +/usr/share/man/man3/DBI::Gofer::Transport::pipeone.3pm.gz
 +/usr/share/man/man3/DBI::Gofer::Transport::stream.3pm.gz
 +/usr/share/man/man3/DBI::Profile.3pm.gz
 +/usr/share/man/man3/DBI::ProfileData.3pm.gz
 +/usr/share/man/man3/DBI::ProfileDumper.3pm.gz
 +/usr/share/man/man3/DBI::ProfileDumper::Apache.3pm.gz
 +/usr/share/man/man3/DBI::ProfileSubs.3pm.gz
 +/usr/share/man/man3/DBI::ProxyServer.3pm.gz
 +/usr/share/man/man3/DBI::PurePerl.3pm.gz
 +/usr/share/man/man3/DBI::SQL::Nano.3pm.gz
 +/usr/share/man/man3/DBI::Util::CacheMemory.3pm.gz
 +/usr/share/man/man3/Roadmap.3pm.gz
 +/usr/share/man/man3/TASKS.3pm.gz
 +</code>
 +Was uns das Paket **perl-DBD-MySQL** bietet, entnehmen wir am einfachsten dem rpm.
 +   # rpm -qil perl-DBD-MySQL
 +
 +<code>Name        : perl-DBD-MySQL               Relocations: (not relocatable)
 +Version     : 4.013                             Vendor: CentOS
 +Release     : 3.el6                         Build Date: Fri 20 Aug 2010 02:31:30 AM CEST
 +Install Date: Fri 27 Jul 2012 08:31:39 PM CEST      Build Host: c6b3.bsys.dev.centos.org
 +Group       : Development/Libraries         Source RPM: perl-DBD-MySQL-4.013-3.el6.src.rpm
 +Size        : 345831                           License: GPL+ or Artistic
 +Signature   : RSA/8, Sun 03 Jul 2011 06:55:00 AM CEST, Key ID 0946fca2c105b9de
 +Packager    : CentOS BuildSystem <http://bugs.centos.org>
 +URL         : http://search.cpan.org/dist/DBD-mysql/
 +Summary     : A MySQL interface for perl
 +Description :
 +An implementation of DBI for MySQL for Perl.
 +/usr/lib64/perl5/Bundle
 +/usr/lib64/perl5/Bundle/DBD
 +/usr/lib64/perl5/Bundle/DBD/mysql.pm
 +/usr/lib64/perl5/DBD
 +/usr/lib64/perl5/DBD/mysql
 +/usr/lib64/perl5/DBD/mysql.pm
 +/usr/lib64/perl5/DBD/mysql/GetInfo.pm
 +/usr/lib64/perl5/DBD/mysql/INSTALL.pod
 +/usr/lib64/perl5/auto/DBD
 +/usr/lib64/perl5/auto/DBD/mysql
 +/usr/lib64/perl5/auto/DBD/mysql/mysql.so
 +/usr/share/doc/perl-DBD-MySQL-4.013
 +/usr/share/doc/perl-DBD-MySQL-4.013/ChangeLog
 +/usr/share/doc/perl-DBD-MySQL-4.013/INSTALL.html
 +/usr/share/doc/perl-DBD-MySQL-4.013/README
 +/usr/share/doc/perl-DBD-MySQL-4.013/TODO
 +/usr/share/man/man3/Bundle::DBD::mysql.3pm.gz
 +/usr/share/man/man3/DBD::mysql.3pm.gz
 +/usr/share/man/man3/DBD::mysql::INSTALL.3pm.gz
 +</code>
 +
 +==== FHEM ====
 +=== Download ===
 +Als erstes laden wir uns das aktuelle [[http://fhem.de/fhem-5.2.tar.gz|Programmarchiv]] von der [[http://fhem.de/fhem.html|FHEM Projektseite]] auf unseren Rechner.
 +
 +Hierzu legen wir uns erst noch den entsprechenden Zielordner an, falls noch nicht erfolgt.
 +   # mkdir /usr/local/src/packages
 +
 +Dann wechseln wir in das Verzeichnis.
 +   # cd /usr/local/src/packages
 +
 +Im nächsten Schritt holen wir uns nun mit Hilfe von **wget** das entsprechende Programmarchiv.
 +   # wget http://fhem.de/fhem-5.2.tar.gz
 +
 +Zu gute Letzt entpacken wir das Archiv, verschieben den Ordner an Ort und Stelle und verlinken diesen entsprechend noch.
 +   # tar zxvf fhem-5.2.tar.gz
 +
 +   # mv /usr/local/src/packages/fhem-5.2/ /usr/local/src/
 +
 +   # ln -s /usr/local/src/fhem-5.2 /usr/local/src/fhem
 +
 +=== Installation ===
 +Die Installation beschließen wir nun nur noch mit folgendem Aufruf:
 +   # make install-pgm2
 +<code>After installation start fhem with
 +perl /usr/bin/fhem.pl /etc/fhem.cfg
 +
 +
 +mkdir -p /usr/bin /usr/share/fhem /var/log/fhem
 +mkdir -p /usr/share/doc/fhem /etc /usr/share/man/man1
 +cp fhem.pl /usr/bin
 +cp -r FHEM /usr/share/fhem
 +rm -rf examples_changed
 +cp -r examples examples_changed
 +perl -pi -e 's,modpath \.,modpath /usr/share/fhem,' examples_changed/[a-z]*
 +perl -pi -e 's,([^h]) /tmp,$1 /var/log/fhem,' examples_changed/[a-z]*
 +mv /etc/fhem.cfg /etc/fhem.cfg.`date "+%Y-%m-%d_%H:%M:%S"`
 +mv: cannot stat `/etc/fhem.cfg': No such file or directory
 +make: [install-base] Error 1 (ignored)
 +cp examples_changed/sample_fhem /etc/fhem.cfg
 +cp -rp contrib /usr/share/fhem
 +cp -rp docs/* /usr/share/doc/fhem
 +cp docs/fhem.man /usr/share/man/man1/fhem.pl.1
 +gzip -f -9 /usr/share/man/man1/fhem.pl.1
 +cp -r webfrontend/pgm2/* /usr/share/fhem/FHEM
 +cp docs/commandref.html docs/faq.html docs/HOWTO.html /usr/share/fhem/FHEM
 +cp docs/*.png docs/*.jpg /usr/share/fhem/FHEM
 +cd examples_changed; for i in *; do cp -r $i /usr/share/fhem/FHEM/example.$i; done
 +cp examples_changed/sample_pgm2 /etc/fhem.cfg
 +</code>
 +=== Stationswerte abfragen ===
 +Für die ersten Schritte scheint das Paket [[http://www.koeniglich.de/fhem/fhem.html|FEHM]] recht geeignet. Zumindest können wir schon mal damit die ersten (Meß-)Werte auslesen.
 +
 +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/ttyUSB1 getDevStatus 1
 +<code>Readings       (off  2): 62071
 +     Nr devs        (off  6): 1
 +     puls/5min      (off 13): 6
 +     puls.max/5min  (off 15): 443
 +     cur.energy(off   ): 0.040 kWh
 +     cur.power      (      ): 0.480 kW
 +     cur.power max  (      ): 0.000 kW
 +     energy h       (off 33): 0.380 kWh (h)
 +     energy d       (off 37): 13.900 kWh (d)
 +     energy w       (off 41): 91.907 kWh (w)
 +     total energy   (off  7): 10356.553 kWh (total)
 +     Alarm PA       (off 45): 0 W
 +     Price CF       (off 47): 0.15 EUR/kWh
 +     R/kW  EC       (off 49): 150
 +RAW    0300 77f2 8900 014b b417 00f3 0406 00bb 
 +RAW    0180 f3b7 26ab 2697 1f17 eab6 2680 268d 
 +RAW    1c39 0000 0025 0800 00da 3500 0000 00dc 
 +RAW    05dc 05</code>
 +
 +====== FHEM - GPL'd server for house automation ======
 +Im weiteren Verlauf betrachten wie nun das Softwareprojekt [[http://www.koeniglich.de/fhem/fhem.html|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.
 +
 +===== Konfiguration =====
 +==== erste Konfiguration ====
 +Als erstes passen wir die mitgelieferte Konfigurationsdatei unseren individuellen Gegebenheiten an:
 +   # vim /etc/fhem.cfg 
 +
 +<file bash /etc/fhem.cfg>#
 +# pgm2 / autocreate configfile. Take a look at the other examples for more.
 +#
 +attr global logfile /var/log/fhem/fhem-%Y-%m.log
 +attr global modpath /usr/share/fhem                  # where our FHEM directory is
 +attr global port 7072 global            # our TCP/IP port
 +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)
 +
 +define WEB FHEMWEB 8083 global
 +
 +define WEBphone FHEMWEB 8084 global
 +attr WEBphone smallscreen
 +
 +define WEBtablet FHEMWEB 8085 global
 +attr WEBtablet touchpad
 +
 +# Fake FileLog entry, to access the fhem log from FHEMWEB 
 +define Logfile FileLog /var/log/fhem/fhem-%Y-%m.log fakelog
 +
 +define autocreate autocreate
 +attr autocreate autosave
 +attr autocreate device_room %TYPE
 +attr autocreate filelog /var/log/fhem/%NAME-%Y.log
 +attr autocreate weblink
 +attr autocreate weblink_room Plots
 +# Disable this to avoid looking for new USB devices on startup
 +# Django : 2012-07-27
 +# initialUsbCheck disabled
 +# define initialUsbCheck notify global:INITIALIZED usb create 
 +
 +
 +# If the above notify did not helped, then you probably have to enable some of
 +# the following lines.  Verify first that /dev/xxx ist correct.
 +
 +#define FHZ FHZ /dev/USB0
 +#define CUL CUL /dev/ttyACM0@9600 1234
 +#attr CUL rfmode HomeMatic
 +
 +#define EUL TCM 310 /dev/ttyACM0@57600
 +#define BscBor TCM 120 /dev/ttyUSB0@9600
 +#define BscSmartConnect TCM 310 /dev/ttyUSB0@57600
 +
 +# Django : 2012-07-27
 +define EM EM /dev/ttyUSB0 # the serial port of an FHZ 1000 PC
 +define Hauptzaehler EMWZ 1
 +define Gaszaehler EMGZ 9
 +define EDV_Schrank EMEM 5
 +</file>
 +
 +==== Paketfilter iptables ====
 +Damit Wir mit unserem bevorzugten Webbrowser auf die Webseiten von FHEM zugreifen können, erweitern wir noch bei Bedarf unseren Paketfilter.
 +   # vim /etc/sysconfig/iptables
 +<code>...
 +
 +# Django : 2012-07-27 Port 8083 für FHEM freigeschaltet
 +-A INPUT -m state --state NEW -m tcp -p tcp --dport 8083 -j ACCEPT
 +-A INPUT -m state --state NEW -m tcp -p tcp --dport 8084 -j ACCEPT
 +-A INPUT -m state --state NEW -m tcp -p tcp --dport 8085 -j ACCEPT
 +#
 +
 +...
 +</code>
 +Zum Aktivieren der neuenRegeln führn wir nun noch einen Restart des Daemons durch.
 +   # service iptables restart
 +
 +===== Programmstart =====
 +Wir starten nunmehr zum ersten mal **FHEM**.
 +   # fhem.pl /etc/fhem.cfg
 +
 +Im Logfile **/var/log/fhem/fhem-2009-01.log** wird uns der Start entsprechend quittiert:
 +<file bash /var/log/fhem/fhem-2009-01.log>
 +2012.07.27 14:20:26 2: Telnet port 7072 opened
 +2012.07.27 14:20:26 2: FHEMWEB port 8083 opened
 +2012.07.27 14:20:26 2: FHEMWEB port 8084 opened
 +2012.07.27 14:20:26 2: FHEMWEB port 8085 opened
 +2012.07.27 14:20:26 3: EM opening device /dev/ttyUSB0
 +2012.07.27 14:20:26 3: EM opened device /dev/ttyUSB0
 +</file>
 +
 +In der Prozessliste finden wir das laufende Programm ebenso:
 +   # ps aux | grep fhem
 +
 +   root      4463  0.0  1.1 150568 11716 pts/1    S    14:20   0:00 /usr/bin/perl /usr/bin/fhem.pl /etc/fhem.cfg
 +
 +Mit dem Befehl **netstat -tulpen** können wir auch noch überprüfen, ob die Ports 8083, 8084 und 8085 auch geöffnet wurden.
 +   # netstat -tulpen | grep 808
 +
 +   tcp        0      0 0.0.0.0:8083                0.0.0.0:                  LISTEN      0          410542     4463/perl           
 +   tcp        0      0 0.0.0.0:8084                0.0.0.0:                  LISTEN      0          410543     4463/perl           
 +   tcp        0      0 0.0.0.0:8085                0.0.0.0:                  LISTEN      0          410544     4463/perl
 +
 +Nun rufen wir die Statusseite von **//FHEM//** in unserem bevorzugten Browser auf.
 +   $ firefox http://10.0.0.20:8083/fhem
 +
 +{{ :fun:fhem-1.png?direct&500 |FHEM Statusanzeige}}
 +
 +Über den Menüpunkt [**Everything**] können wir uns die Detail zu unserem Gerät anzeigen lassen.
 +
 +{{ :fun:fhem-2.png?direct&500 |FHEM Detailanzeige}}
 +
 +Über den FHEM-Befehl **shutdown** können wir unseren ersten Test beenden.
 +
 +{{ :fun:fhem-3.png?direct&500 |FHEM Befehlseingabe "shutdown"}}
 +
 +Im Logfile wird uns dies entsprechend quittiert:
 +   2012.07.27 14:31:44 0: Server shutdown
 +
 +Der status unseres FHEM-Gerätes wurde in der Logdatei //**/var/log/fhem/fhem.save**// gesichert.
 +   # cat /var/log/fhem/fhem.save
 +
 +<file bash /var/log/fhem/fhem.save>#Fri Jul 27 14:31:44 2012
 +setstate EDV_Schrank 0.37 kW
 +setstate EDV_Schrank 2012-07-27 14:26:44 5min_pulses 37
 +setstate EDV_Schrank 2012-07-27 14:26:44 5min_pulses_max 43
 +setstate EDV_Schrank 2012-07-27 14:26:44 alarm_PA_W 0
 +setstate EDV_Schrank 2012-07-27 14:26:44 energy_kWh 154.483
 +setstate EDV_Schrank 2012-07-27 14:26:44 energy_kWh_d 9.055
 +setstate EDV_Schrank 2012-07-27 14:26:44 energy_kWh_h 0.376
 +setstate EDV_Schrank 2012-07-27 14:26:44 energy_kWh_w 64.873
 +setstate EDV_Schrank 2012-07-27 14:26:44 power_kW 0.370
 +setstate EDV_Schrank 2012-07-27 14:26:44 power_kW_max 0.430
 +setstate EDV_Schrank 2012-07-27 14:26:44 price_CF 0.150
 +setstate Gaszaehler 0.12 m3ph
 +setstate Gaszaehler 2012-07-27 14:26:44 5min_pulses 1
 +setstate Gaszaehler 2012-07-27 14:26:44 Rperm3_EC 100
 +setstate Gaszaehler 2012-07-27 14:26:44 act_flow_m3 0.010
 +setstate Gaszaehler 2012-07-27 14:26:44 alarm_PA 0 Watt
 +setstate Gaszaehler 2012-07-27 14:26:44 cum_m3 0.010
 +setstate Gaszaehler 2012-07-27 14:26:44 m3ph 0.120
 +setstate Gaszaehler 2012-07-27 14:26:44 price_CF 0.630
 +setstate Hauptzaehler 0.48 kW
 +setstate Hauptzaehler 2012-07-27 14:31:44 5min_pulses 6
 +setstate Hauptzaehler 2012-07-27 14:31:44 RperKW_EC 150
 +setstate Hauptzaehler 2012-07-27 14:31:44 alarm_PA 0 Watt
 +setstate Hauptzaehler 2012-07-27 14:31:44 cum_kWh 0.206
 +setstate Hauptzaehler 2012-07-27 14:31:44 energy 0.040
 +setstate Hauptzaehler 2012-07-27 14:31:44 power 0.480
 +setstate Hauptzaehler 2012-07-27 14:31:44 price_CF 0.150
 +setstate Hauptzaehler 2012-07-27 14:31:44 summary Pulses: 6 Energy: 0.040 Power: 0.480 Cum: 0.206
 +setstate Logfile active
 +setstate autocreate active
 +setstate global <no definition>
 +</file>
 +===== erweiterte Konfiguration =====
 +==== Startscript ====
 +Damit unser FHEM-Daemon automatisch beim Hochfahren des Rechners gestartet werden kann, legen wir uns noch ein entsprechendes Startscript an.
 +   # vim /etc/init.d/fhem
 +
 +<file bash /etc/init.d/fhem>#!/bin/sh
 +
 +# $Id: fhem 19 2012-07-27 21:33:44Z dws $
 +# example init script for fhem
 +#
 +# chkconfig: 2345 82 28
 +# description: FHEM Home automation.
 +#
 +# processname: fhem.pl
 +#
 +# Written by Django
 +
 +DAEMON=/usr/bin/fhem.pl
 +PIDFILE=/var/run/fhem.pid
 +OPTION="/etc/fhem.conf"
 +PROG="FHEM"
 +test -x $DAEMON || exit 0
 +
 +. /lib/lsb/init-functions
 +
 +case "$1" in
 +  start)
 +    echo -n $"Starting $PROG: "
 +    $DAEMON $OPTION
 +    echo "                                            [  OK  ]"
 +    ;;
 +  stop)
 +    pid=`ps -ef | grep "fhem.pl" | grep -v grep | awk '{ print $2}'`
 +    echo -n $"Stopping $PROG: "
 +    kill $pid
 +    echo "                                            [  OK  ]"
 +    ;;
 +  status)
 +    cnt=`ps -ef | grep "fhem.pl" | grep -v grep | wc -l`
 +    if [ "$cnt" -eq "0" ] ; then
 +      echo "$0 is not running"
 +    else
 +      echo "$0 is running"
 +    fi
 +    ;;
 +  *)
 +    echo "Usage: $0 {start|stop|status}"
 +  exit 1
 +esac
 +
 +exit 0
 +</file>
 +
 +Nun können wir bequem den **FHEM-Daemon** starten und Stoppen.
 +   # service fhem start
 +
 +   Starting FHEM:                                              OK  ]
 +
 +Oder eben stoppen:
 +   # service fhem stop
 +
 +   Stopping FHEM:                                              OK  ]
 +
 +Damit nun der Daemon beim Starten des Systems automatisch gestartet werden kann, legen wir die notwendigen Symlinks automatisch an.
 +   # chkconfig fhem on
 +
 +Wenn wir uns unsicher sind, ob der Daemon beim Systemstart in den entsprechenden Runleveln auch gestartet wird, vergewissern wir uns mit folgendem Aufruf.
 +   # chkconfig --list | grep fhem
 +
 +   fhem            0:off 1:off 2:on 3:on 4:on 5:on 6:off
 +==== Apache V-Host mit Authentifizierung ====
 +In der Regel wollen wir ja nicht, dass jedermann, also quasi //Hinz & Kunz// auf unsere FHEM-Web-Seite zugreifen kann. FHEM selbst stellt uns hierzu keine Einstellungsoptionen zur Verfügung. Wir greifen daher auf die Dienste unseres Apache-Webservers zurück.
 +
 +Neben der Benutzerauthentifizierung gegen unseren zentralen [[centos:ldap:start|LDAP-Server]] sichern wir noch die Übertragung mit Hilfe eines SSL-Zertifikats ab.
 +
 +In die Konfigurationsdatei fü unsere vHosts //**/etc/httpd/conf.d/vhosts.conf**// tragen wir hierzu ein.
 +   # vim /etc/httpd/conf.d/vhosts.conf
 +
 +<file apache /etc/httpd/conf.d/vhosts.conf>#
 +# FHEM : fhem.nausch.org
 +#
 +<VirtualHost *:80>
 +        ServerAdmin webmaster@nausch.org
 +        ServerName fhem.nausch.org
 +        ServerAlias www.fhem.nausch.org
 +        ServerPath /
 +
 +        <Location />
 +                Options -Indexes FollowSymLinks
 +                Order deny,allow
 +                Deny from all
 +                Allow from 127.0.0.1
 +                Allow from 10.0.0.20/32
 +                Allow from 10.0.10.0/26
 +        </Location>
 +
 +        Redirect / https://fhem.nausch.org/
 +
 +        ErrorLog logs/fhem_error.log
 +        CustomLog logs/fhem_access.log combined
 +</VirtualHost>
 +<VirtualHost *:443>
 +        ServerAdmin webmaster@nausch.org
 +        ServerName fhem.nausch.org
 +        ServerAlias www.fhem.nausch.org
 +        ServerPath /
 +
 +        <Location />
 +                Options -Indexes FollowSymLinks
 +                AuthType Basic
 +                AuthName "FHEM Home Automation on vml000090 - nausch.org"
 +                AuthBasicProvider ldap
 +                AuthzLDAPAuthoritative On
 +                AuthLDAPURL "ldap://ldap.dmz.nausch.org:389/ou=People,dc=nausch,dc=org?uid"
 +                AuthLDAPBindDN "cn=TechnischerUser,dc=nausch,dc=org"
 +                AuthLDAPBindPassword "Das_streng_geheime_Passwort_das_keiner_kennt"
 +                Require ldap-user django michael
 +                Order deny,allow
 +                Deny from all
 +                Allow from 127.0.0.1
 +                Allow from 10.0.0.20/32
 +                Allow from 10.0.10.0/26
 +        </Location>
 +
 +        ProxyRequests Off
 +        ProxyPreserveHost On
 +        ProxyPass /fhem http://10.0.0.20:8083/fhem
 +        ProxyPassReverse /fhem http://10.0.0.20:8083/fhem
 +
 +        ErrorLog logs/fhem_error.log
 +        CustomLog logs/fhem_access.log combined
 +</VirtualHost>
 +</file>
 +Bevor wir den Apache-Webserver durchstarten überprüfen wir noch die Konfigurationsdatei auf schreib und Tipp-Fehler.
 +   # service httpd configtest
 +
 +   Syntax OK
 +
 +Da kein Fehler enthalten ist, starten wir nun zur Aktivierung den Webserver einmal durch.
 +   # service httpd condrestart
 +
 +   Stopping httpd:                                            [  OK  ]
 +   Starting httpd:                                            [  OK  ]
 +
 +Wir erreichen nun unseren vHost für FHEM ganz einfach via www.fhem.nausch.org. Geben wir beim Verbindungsprotokoll "nur" **http** statt **https** ein, werden wir direkt zur verschlüsselten Seite weitergeleitet.
 +   $ firefox http://fhem.nausch.org
 +
 +{{ :fun:fhem-4.png?direct&500 |FHEM Bildschirmhardcopy des abgesicherten vHOSTs}}
 +
 +==== erweiterte iptables Paketfilterregel ====
 +Wir haben zwar im vorgenannten Beispiel bereits über die Apache-eigenen Regeln den Zugriff auf bestimmte Hosts beschränkt. Zur Sicherheit werden wir aber nun die Paketfilterregeln noch etwas strenger auslegen.
 +   # vim /etc/sysconfig/iptables
 +<code>...
 +
 +# Django : 2012-07-27 Port 8083 von IP-Adresse 10.0.0.90 für FHEM freigeschaltet
 +-A INPUT -s 10.0.0.90 -i eth1 -m tcp -p tcp --dport 8083 -j ACCEPT
 +#
 +
 +...
 +</code>
 +Zum Aktivieren der neuenRegeln führn wir nun noch einen Restart des Daemons durch.
 +   # service iptables restart
 +
 +==== Datenbank-Konfiguration ====
 +Im Verzeichnis **/usr/local/src/fhem/contrib/dblog/** werden uns Vorlagen für unsere Datenbankeinstellung mitgeliefert, die wir nun nachfolgend zu Rate ziehen werden.
 +==== Datenbankdefinition ====
 +Die Konfiguration der nötigen Tabellen nehmen wir mit Hilfe der von FHEM mitgelieferten Schematas vor. Dazu nutzen wir entweder direkt den Konsolenzugang, oder wir verwenden [[centos:phpmyadmin_c6|phpMyAdmin]].
 +
 +  - **Datenbank anlegen** \\ Als erstes legen wir die Datenbank an. MySQL frägt uns bei den nachfolgenden Definitionen nach dem Passwort unseres mysql-Superusers **root**. <code> # mysql -h 127.0.0.1 -u root -p</code> <code>Enter password: 
 +Welcome to the MySQL monitor.  Commands end with ; or \g.
 +Your MySQL connection id is 37
 +Server version: 5.1.61 Source distribution
 +
 +Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
 +
 +Oracle is a registered trademark of Oracle Corporation and/or its
 +affiliates. Other names may be trademarks of their respective
 +owners.
 +
 +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 +
 +mysql> create database fhem;
 +Query OK, 1 row affected (0.11 sec)
 +</code>
 +  - **neuen Benutzer anlegen** \\ Mit folgendem Befehl legen wir uns einen neuen Nutzer an:<code>mysql> CREATE USER 'fhemdatabaseuser'@'vml000020.dmz.nausch.org' IDENTIFIED BY 'databasepassword';
 +Query OK, 0 rows affected (0.00 sec)
 +
 +mysql>  </code> sowie <code>mysql> CREATE USER 'fhemdatabaseuser'@'10.0.0.20' IDENTIFIED BY 'databasepassword';
 +Query OK, 0 rows affected (0.00 sec)
 +
 +mysql> </code>
 +  - **Benutzerprivilegien setzen und zuweisen** \\ Anschließend setzen wir die Benutzerrechte unseres gerade angelegten Datenbanknutzers. <code>mysql> GRANT ALL PRIVILEGES ON fhem.* TO 'fhemdatabaseuser'@'vml000020.dmz.nausch.org' IDENTIFIED BY 'databasepassword' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;
 +Query OK, 0 rows affected (0.01 sec)
 +
 +mysql></code> und <code>mysql> GRANT ALL PRIVILEGES ON fhem.* TO 'fhemdatabaseuser'@'10.0.0.20' IDENTIFIED BY 'databasepassword' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;
 +Query OK, 0 rows affected (0.01 sec)
 +
 +mysql></code>
 +  - **Rechte des Nutzers in der Datenbank neu laden** \\ Im letzten Schritt laden wir nun die Rechte unseres neuen Datenbankusers.<code>mysql> FLUSH PRIVILEGES;
 +Query OK, 0 rows affected (0.00 sec)
 +
 +mysql></code>
 +  - **mySQL-Datenbanktabellen anlegen** \\ Aus der Vorlagedatei //**/usr/local/src/fhem/contrib/dblog/fhemdb_create.sql**// übernehmen wir nun die Tabellendefinition und legen diese an. Zuvor benutzen wir noch die richtige Datenbank **fhem**, wie wir zuvor angelegt haben.<code>mysql> use fhem;
 +Database changed</code> Anschließend legen wir die beiden Tabellen an. <code>mysql> CREATE TABLE history (TIMESTAMP TIMESTAMP, DEVICE varchar(32), TYPE varchar(32), EVENT varchar(64), READING varchar(32), VALUE varchar(32), UNIT varchar(32));
 +Query OK, 0 rows affected (0.08 sec)</code> und <code>mysql> CREATE TABLE current (TIMESTAMP TIMESTAMP, DEVICE varchar(32), TYPE varchar(32), EVENT varchar(64), READING varchar(32), VALUE varchar(32), UNIT varchar(32));
 +Query OK, 0 rows affected (0.13 sec)</code>
 +  - **mySQL-Datenbankverbindung beenden** \\ Unsere Konfiguration unseres neuen Datenbanknutzers ist hiermit beendet und wir können die Verbindung zur Datenbank wieder schließen.<code>mysql> exit
 +Bye
 +</code>
 +
 +
 +==== Zugangstest ====
 +Als nächstes überprüfen wir, ob der zuvor angelegt User/Zugang auch funktioniert.
 +   # mysql -D fhem -u fhemuser -h mysql-host -p
 +<code>Enter password: 
 +Reading table information for completion of table and column names
 +You can turn off this feature to get a quicker startup with -A
 +
 +Welcome to the MySQL monitor.  Commands end with ; or \g.
 +Your MySQL connection id is 2034
 +Server version: 5.1.61 Source distribution
 +
 +Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
 +
 +Oracle is a registered trademark of Oracle Corporation and/or its
 +affiliates. Other names may be trademarks of their respective
 +owners.
 +
 +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 +
 +mysql> show tables;
 ++----------------+
 +| Tables_in_fhem |
 ++----------------+
 +| current        |
 +| history        |
 ++----------------+
 +2 rows in set (0.00 sec)
 +
 +mysql> quit
 +Bye
 +</code>
 +
 +==== erweiterte Konfiguration ====
 +In der **README** unter **/usr/local/src/fhem-4.5/contrib/dblog** finden wir weitere Angaben zur Konfiguration:
 +   # less /usr/local/src/fhem/contrib/dblog/README
 +
 +<file bash /usr/local/src/fhem-4.5/contrib/dblog/README>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
 +</file>
 +  - Wir kopieren also die Datei **93_DbLog.pm** in unseren **modpath**. <code> # cp /usr/local/src/fhem/contrib/dblog/93_DbLog.pm /usr/share/fhem/FHEM/<code>
 +  - Anschließend kopieren wir die Datenbank-Konfigurationsdatei nach //**/etc/**//. <code> # cp /usr/local/src/fhem/contrib/dblog/db.conf /etc/fhem_db.conf</code>
 +  - Dann bearbeiten wir die gerade kopierte Konfigurationsdatei und tragen dort unsere benutzerspezifischen Änderungen ein.<code> # vim /etc/fhem_db.conf</code> <file bash /etc/fhem_db.conf>#
 +# database configuration file
 +
 +#
 +#
 +%dbconfig= (
 +        connection => "mysql:database=fhem;host=databasehost;port=3306",
 +        user => "fhemdatabaseuser",
 +        password => "databasepassword",
 +);
 +
 +</file>
 +  - Abschließend erweitern wir nun noch unsere Hauptkonfigurationsdatei von FHEM //**/etc/fhem.cfg**// um nachfolgende Definitionen.<code> # vim /etc/fhem.cfg</code>
 +
 +
 +Unser Hauptkonfigurationsdatei **/usr/local/etc&fhem/fhem.cfg** erweitern wir um folgende Definitionen:
 +<code>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 .*:.* </code>
 +
 +Nach dem Start unseres Serverdienstes **//fhem.pl//** erhalten wir eine entsprechende positive Meldung im Logfile.
 +   # fhem.pl /etc/fhem.conf
 +
 +<code>2012.07.27 20:35:39 2: Telnet port 7072 opened
 +2012.07.27 20:35:39 2: FHEMWEB port 8083 opened
 +2012.07.27 20:35:39 2: FHEMWEB port 8084 opened
 +2012.07.27 20:35:39 2: FHEMWEB port 8085 opened
 +2012.07.27 20:35:39 3: EM opening device /dev/ttyUSB0
 +2012.07.27 20:35:39 3: EM opened device /dev/ttyUSB0
 +2012.07.27 20:36:46 3: Connecting to database mysql:database=fhem;host=10.0.0.30;port=3306 with user fhemdatenbankuser
 +2012.07.27 20:36:46 3: Connection to db mysql:database=fhem;host=datenbankhost.dmz.nausch.org;port=3306 established
 +2012.07.27 20:36:46 0: Server started (version 5.2 from 2011-12-31 ($Id: fhem.pl 1159 2011-12-31 13:31:58Z rudolfkoenig $), pid 1955)
 +</code>
 +In unserer MySQL-Datenbanktabelle tauchen die entsprechenden Werte auf:
 +
 +{{ :fun:fhem_phpmyadmin.png?direct&500 |PHPmyAdmin-Fenster mit Datenbankansicht}}
 +
 +Ebenso werden in der Statusübersicht im Browserfenster die beiden definierten Meßpunkte angezeigt:
 +
 +{{ :fun:fhem-2.png?direct&500 |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 passen wir noch die Datenbankdefinitionen in dem Script unseren lokalen Bedürfnissen nach an.
 +   # vim /usr/local/bin/fhemdb_get.pl
 +   
 +<file perl /usr/local/bin/fhemdb_get.pl>#!/usr/bin/perl
 +#
 +################################################################
 +#
 +#  Copyright notice
 +#
 +#  (c) 2007 Copyright: Dr. Boris Neubert (omega at online dot de)
 +#  All rights reserved
 +#
 +#  This script free software; you can redistribute it and/or modify
 +#  it under the terms of the GNU General Public License as published by
 +#  the Free Software Foundation; either version 2 of the License, or
 +#  (at your option) any later version.
 +#
 +#  The GNU General Public License can be found at
 +#  http://www.gnu.org/copyleft/gpl.html.
 +#  A copy is found in the textfile GPL.txt and important notices to the license
 +#  from the author is found in LICENSE.txt distributed with these scripts.
 +#
 +#  This script is distributed in the hope that it will be useful,
 +#  but WITHOUT ANY WARRANTY; without even the implied warranty of
 +#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 +#  GNU General Public License for more details.
 +#
 +#  This copyright notice MUST APPEAR in all copies of the script!
 +#
 +################################################################
 +
 +
 +
 +# this script returns the current reading for a device stored in
 +# the fhem logging database
 +#
 +
 +# Usage: 
 +#   fhemdb_get.pl <device> <reading> [<reading> ...]
 +# Example:
 +#   fhemdb_get.pl ext.ks300 temperature humidity
 +#
 +#
 +
 +#
 +# global configuration
 +#
 +my $dbconn      = "mysql:database=fhem;host=datenbankhost.dmz.nausch.org;port=3306";
 +my $dbuser      = "fhemdatenbankuser";
 +my $dbpassword  = "fhemdatenbankpassword";
 +
 +#
 +# nothing to change below this line
 +#
 +
 +use strict;
 +use warnings;
 +use DBI;
 +
 +(@ARGV>=2) || die "Usage: fhemdb_get.pl <device> <reading> [<reading> ... ]";
 +
 +my $device= $ARGV[0];
 +my @readings=@ARGV; shift @readings;
 +my $set= join(",", map({"\'" . $_ . "\'"} @readings));
 +
 +my $dbh= DBI->connect_cached("dbi:$dbconn", $dbuser, $dbpassword) || 
 + die "Cannot connect to $dbconn: $DBI::errstr";
 +my $stm= "SELECT READING, VALUE FROM current WHERE
 + (DEVICE='$device') AND
 + (READING IN ($set))"; 
 +my $sth= $dbh->prepare($stm) || 
 + die "Cannot prepare statement $stm: $DBI::errstr";
 +my $rc= $sth->execute() ||
 + die "Cannot execute statement $stm: $DBI::errstr";
 +
 +my %rs;
 +my $reading;
 +my $value;
 +while( ($reading,$value)= $sth->fetchrow_array) {
 + $rs{$reading}= $value;
 +}
 +foreach $reading (@readings) {
 + $value= $rs{$reading};
 + $value= "NULL" if(!defined($value));
 + print "$reading:$value ";
 +}
 +print "\n";
 +die $sth->errstr if $sth->err;
 +$dbh->disconnect();
 +
 +
 +</file>
 +
 +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 geben also über eine passende REXEXP an, welche Werte wir zukünftig nur noch in der MySQL-Tabelle archivieren wollen.
 +
 +Unser Konfigurationsdatei **/etc/fhem.conf** erweitern wir daher um folgende Definitionen:
 +   # vim /etc/fhem.conf
 +
 +<file bash /etc/fhem.conf>#
 +# pgm2 / autocreate configfile. Take a look at the other examples for more.
 +#
 +attr global logfile /var/log/fhem/fhem-%Y-%m.log
 +attr global modpath /usr/share/fhem                  # where our FHEM directory is
 +attr global port 7072 global            # our TCP/IP port
 +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)
 +
 +define WEB FHEMWEB 8083 global
 +
 +define WEBphone FHEMWEB 8084 global
 +attr WEBphone smallscreen
 +
 +define WEBtablet FHEMWEB 8085 global
 +attr WEBtablet touchpad
 +
 +# Fake FileLog entry, to access the fhem log from FHEMWEB 
 +define Logfile FileLog /var/log/fhem/fhem-%Y-%m.log fakelog
 +
 +define autocreate autocreate
 +attr autocreate autosave
 +attr autocreate device_room %TYPE
 +attr autocreate filelog /var/log/fhem/%NAME-%Y.log
 +attr autocreate weblink
 +attr autocreate weblink_room Plots
 +# Disable this to avoid looking for new USB devices on startup
 +# Django : 2012-07-27
 +# initialUsbCheck disabled
 +# define initialUsbCheck notify global:INITIALIZED usb create 
 +
 +
 +# If the above notify did not helped, then you probably have to enable some of
 +# the following lines.  Verify first that /dev/xxx ist correct.
 +
 +#define FHZ FHZ /dev/USB0
 +#define CUL CUL /dev/ttyACM0@9600 1234
 +#attr CUL rfmode HomeMatic
 +
 +#define EUL TCM 310 /dev/ttyACM0@57600
 +#define BscBor TCM 120 /dev/ttyUSB0@9600
 +#define BscSmartConnect TCM 310 /dev/ttyUSB0@57600
 +
 +# Django : 2012-07-27
 +define EM EM /dev/ttyUSB0 # the serial port of an FHZ 1000 PC
 +define Hauptzaehler EMWZ 1
 +define Gaszaehler EMGZ 9
 +define EDV_Schrank EMEM 5
 +
 +# Django : 2012-07-27
 +# Erst einmal alle Meldungen in die Datenbank schreiben
 +#define logdb DbLog /etc/fhem_db.conf .*:.*
 +
 +# Django : 2012-07-27
 +# Nur noch die aktuellen verbrauchswerte in die MySQL schreiben
 +define logdb DbLog /etc/fhem_db.conf Hauptzaehler:power.*|EDV_Schrank:power_kW\b.*|Gaszaehler:act_flow_m3.* 
 +</file>
 +
 +Mit einem **rereadcfg** veranlassen wir nun, dass die neue Konfigurationseinstellung(en) aktiv werden. 
 +====== Graphische Datenaufbereitung mit cacti ======
 +{{:fun:strom_gesamt.png?125 |Cacti-Graphik deds Stromverbrauches}} Die optische Aufbereitung der hinterlegten Verbrauchswerte in der MySQL-Datenbank nehmen wir mit Hilfe von [[http://www.cacti.net/|Cacti]] vor. Die hierzu notwendige Installation von **Cacti** ist im Dokuwiki unter [[centos:cacti_c6:start|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 [[https://cacti.nausch.org|Cacti-Server]] auf und ist im Kapitel [[centos:energieverbrauch|Energieverbrauch]] bei den [[centos:cacti_c6:start#konfigurationsbeispiele|Cacti Beispielskonfigurationen]] beschrieben .
 +===== Gaszähler =====
 +{{:fun:emgz.png?150 |Gaszählerbild}}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 [[http://www.heitland-gmbh.de|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 [[http://www.elv.de/output/controller.aspx?cid=74&detail=10&detail2=12614|Funk-Sensor Gaszähler EM 1000-GZ und EM 1000-GZS ohne Netzteil]]. Das Gerät ist auch als [[http://www.elv.de/Funk-Sensor-Gaszähler-EM-1000-GZ-und-EM-1000-GZS,-Komplettbausatz-ohne-Netzteil/x.aspx/cid_74/detail_10/detail2_11221|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 [[http://www.elv-downloads.de/service/manuals/EM1000GZGZS/62575_EM1000GZ_GZS_km.pdf|Anschlussklemmen der Sensoreinheit EM 1000-GZS]]. Bild 5 auf Seite 5 des vorgenannten PDFs illustriert die Klemmpunkte.
 +
 +Die Definition des Ausgabegraphen ist hier dokumentiert:
 +
 +{{ :fun:gas_graph.png?600 }}
 +===== (Haupt)-Stromzähler  =====
 +{{:fun:stromzaehler.png?100 }} 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:
 +
 +{{ :fun:strom_ges.png?600 }}
 +===== (EDV)-Stromzähler  =====
 +{{:fun:em1000-hsm.png?100 }} 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:
 +
 +{{ :fun:strom_it.png?600 }}
 +===== Stromzähler  =====
 +Den Stromverbrauch, also EDV-Schrank und Gesamthaus ist in nachfolgendem Graphen überlagert dargestellt.
 +
 +{{ :fun:ges_strom.png?600 }}
 +
  
  • fun/energie-funk-mess-system_em_1000.txt
  • Zuletzt geändert: 08.10.2020 07:14.
  • von django