Elektronische HaushaltszÀhler auslesen mit RaspberryPi und PHP

06.03.
2015

Nachdem ich ja nun inzwischen den Loxone Miniserver benutze und mir mein RaspberryPi Dateisystem zerschossen wurde, als ich die USV getestet habe aber der RaspberryPi an der falschen Steckdose hing, habe ich mich entschieden volkszaehler.org nicht wieder einzusetzen.
Ich hatte mit dem Betrieb und der Einrichtung zu viele Probleme und mir was das auch alles viel zu viel des Guten.
Da ich einfach nur noch die Werte haben wollte, habe ich mir ein kleines PHP Script gebastelt, welche mit einer PHP-Klasse fĂŒr den seriellen Zugriff auf die USB-Leseköpfe die Daten ausliest.

Einen Projekt-Thread findet ihr hier: Loxone-Forum

Installation von Null angefangen:
1) Download Raspbian Image: http://www.raspberrypi.org/downloads/
2) Download Win32DiskImager Binary Version: http://sourceforge.net/projects/win32diskimager/files/Archive/
3) Beide Downloads entpacken.
4) Raspbian Image mit dem Win32DiskImager auf die SD/microSD Karte kopieren. (Der RaspberryPI 1B hat einen SD und der 1B+ einen microSD Slot!)

Man landet nach dem Start im Setup. (sudo raspi-config)
(Mehr Details auf Datenreise.de)
5) 1 Expand Filesystem
6) 2 Passwort anpassen
7) 3 Booten zur „Command line“
8) 4 Internationalisierung
I1 – Locale -> de_DE.UTF-8
I2 – Timezone -> Europe & Berlin
9) 8 Advanced Options
A2 – Hostname
A3 – GPU memory -> 16
A4 – SSH -> Enable
A0 – Update (oder: sudo apt-get update;sudo apt-get dist-upgrade)
10) Finish
11) sudo reboot

12) SSH auf Keys umstellen um vom Raspberry auf andere Maschinen und auf den Raspberry zu kommen ohne immer ein PW einzugeben
FĂŒr jeden User: ssh-keygen -b 4096 -t dsa
Dann immer den Inhalt der lokalen ~/.ssh/id_rsa.pub auf dem Zielsystem zum Inhalt der ~/.ssh/authorized_keys des entsprechenden Benutzers hinzufĂŒgen.
Gegebenenfalls ist die Datei authorized_keys im Heimatverzeichnisses des Benutzers anzulegen: touch ~/.ssh/authorized_keys

13) Webserver installieren: sudo apt-get install apache2 php5
14) Scripte installieren
sudo su
mkdir /var/www/sml
cd /var/www/sml
wget http://woerstenfeld.de/sml/SML_read_emh_ehz.zip -O ./SML_read_emh_ehz.zip
unzip SML_read_emh_ehz.zip
rm -f unzip SML_read_emh_ehz.zip
chown -R www-data:www-data /var/www/sml
chmod -R 644 /var/www/sml
chmod 755 /var/www/sml

15) Webserver konfigurieren
vi /etc/apache2/sites-enabled/000-default
Mit dem Cursor zur Zeile mit „CustomLog ${APACHE_LOG_DIR}/access.log combined“ gehen und i# eingeben.
Dann mit :wq den Editor beenden

16) Leseköpfe einrichten
Mit /sbin/udevadm info –query=all –name=/dev/ttyUSB0 |grep SERIAL_SHORT
und /sbin/udevadm info –query=all –name=/dev/ttyUSB1 |grep SERIAL_SHORT
habe ich meine zwei Seriennummern 0072D0B2 und 0072D0B0 der Köpfe ausgelesen
und in die Datei /etc/udev/rules.d/99-lesekopf.rules geschrieben:
SUBSYSTEM=="tty", ATTRS{product}=="CP2104 USB to UART Bridge Controller", ATTRS{serial}=="0072D0B0", SYMLINK+="lesekopf0"
SUBSYSTEM=="tty", ATTRS{product}=="CP2104 USB to UART Bridge Controller", ATTRS{serial}=="0072D0B2", SYMLINK+="lesekopf1"

Falls sich der Product Code geĂ€ndert hat, mit folgendem Kommando prĂŒfen:
udevadm info --name=/dev/ttyUSB0 --attribute-walk |grep product

Neustarten der Device-Rules:
udevadm trigger

Jetzt sollte es die GerÀte /dev/lesekopf0 und ggf. /dev/lesekopf1 geben.

Rechte anpassen:
chmod 777 /dev/lesekopf*
chown www-data:www-data /dev/lesekopf*

Serielle Einstellungen festlegen (9600 8N1):
stty -F /dev/lesekopf0 1:0:8bd:0:3:1c:7f:15:4:5:1:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0
stty -F /dev/lesekopf1 1:0:8bd:0:3:1c:7f:15:4:5:1:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0

Daten anfordern:
echo $'\x2f\x3f\x21\x0d\x0a' >/dev/lesekopf0
echo $'\x2f\x3f\x21\x0d\x0a' >/dev/lesekopf1

Und schon sprudelt es:
root@pi:/home/pi# cat /dev/lesekopf0|hd
00000000 2b c8 1b 1b 1b 1b 01 01 01 01 76 07 00 07 00 0a |+.........v.....|
00000010 01 01 63 9a 05 00 76 07 00 07 00 0a 07 01 00 62 |..c...v........b|
00000020 0a ff 01 01 01 01 b7 59 be 01 77 07 01 00 01 08 |.......Y..w.....|
00000030 02 ff 01 01 62 1e 52 ff 56 00 00 00 00 00 01 77 |....b.R.V......w|
00000040 07 01 00 10 07 00 ff 01 01 62 1b 52 ff 55 00 00 |.........b.R.U..|
00000050 02 28 01 77 07 81 81 c7 82 05 ff 01 72 62 01 65 |.(.w........rb.e|
00000060 02 c8 0c db 01 01 83 02 92 be 25 0b ed 52 38 a9 |..........%..R8.|
00000070 ff 7a f6 f3 20 0c 50 08 3e 6c eb a5 e8 6f e1 2e |.z.. .P.>l...o..|
00000080 0f 06 6d f0 80 4a 9e 6f 3e 49 b4 c2 68 72 c4 81 |..m..J.o>I..hr..|
00000090 c7 5e 0a 6c 34 e7 77 01 01 01 63 44 21 00 76 07 |.^.l4.w...cD!.v.|

Jetzt kann man die Daten mit http://name-oder-ipadresse-des-raspberry.pi/sml/SML_read_emh_ehz.php?device=lesekopf0 abfragen.
NatĂŒrlich kann man die SML_read_emh_ehz.php nach index.php umbenennen und dann statt /sml/SML_read_emh_ehz.php?device=lesekopf0 nur /sml/?device=lesekopf0 schreiben.

Viel Spaß!

Tags: ,

Ein Kommentar zu “Elektronische HaushaltszĂ€hler auslesen mit RaspberryPi und PHP”

  1. Wörsty sagt:

    #/etc/init.d/lesekopf
    #Da das auch nach einem Reboot gehen soll, habe ich noch dieses Startscript gebaut
    #und mit ln -s ../init.d/lesekopf /etc/rc2.d/S99lesekopf verlinkt.
    chmod 777 /dev/lesekopf*
    chown www-data:www-data /dev/lesekopf*
    stty -F /dev/lesekopf0 1:0:8bd:0:3:1c:7f:15:4:5:1:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0
    stty -F /dev/lesekopf1 1:0:8bd:0:3:1c:7f:15:4:5:1:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0
    sleep 1
    echo $’\x2f\x3f\x21\x0d\x0a‘ >/dev/lesekopf0
    echo $’\x2f\x3f\x21\x0d\x0a‘ >/dev/lesekopf
    /etc/init.d/apache2 restart

Dein Kommentar