In diesem HowTo beschreibe ich wie man elektronische Haushaltszähler, welche über eine optische Schnittstelle verfügen, mittels eines Raspberry PI auslesen und die Daten per UDP an einen Miniserver versenden kann.
1. Hardware:
Ich nutze zum Auslesen eine ganz simple Schaltung, sie besteht lediglich aus einem Fototransistor und einem 1k Widerstand. Die Schaltung könnt ihr nach folgendem Plan aufbauen:
volkszaehler.org - wiki - Ein ganz simpler IR-Leser
Anders als dort beschrieben nutze ich allerdings einen SFH 309 FA, den gibt es z.B. bei Reichelt.
Es gibt Zähler welche die Daten über die optische Schnittstelle einfach Zyklisch, alle 1-4 Sekunden, senden und Zähler welche erst eine Aufforderung benötigen um die Daten zu senden. Ich habe einen Zähler der die Daten zyklisch sendet, daher muss ich auch nur empfangen. Wer einen Zähler hat der aufgefordert werden muss, müsste noch eine IR-Diode an den Raspberry PI anschließen und die entsprechende aufforderung senden. Dies beschreibe ich allerdings nicht und weiß auch nicht wie das genau geht.
Zunächst solltet ihr also prüfen ob euer Zähler die Daten zyklisch sendet. Hierfür benötigt ihr lediglich ein Smartphone oder eine Digitalkamera, diese schaltet ihr ein, bzw. in den Kameramodus und haltet es vor die beiden runden Löcher in der oberen rechten Ecke des Zählers, es sollte nun aus dem rechten Loch ein blinken auf dem Display zu erkennen sein. Dieses funktioniert allerdings nicht mit allen Handys und Digitalkameras, es kommt auf den eingebauten Filter an, da die Kommunikation ja Infrarot sendet.
So, wenn dies geklärt ist könnt ihr euch die Schaltung nachbauen. Ich habe den Fototransistor in ein LED-Gehäuse gesetzt und mit einem Winkel einfach an der passenden Stelle mit Tesafilm angeklebt. Durch das LED-Gehäuse scheint auch der Empfang besser zu funktionieren, es ist ja dann gut abgeschirmt und reflektiert zudem noch.
2. Software:
Standardmäßig ist auf dem Seriellen Port ein Terminal aktiviert. Sprich ihr könntet euch per Nullmodemkabel vom PC auf den Raspberry einwählen. Das müssen wir natürlich zunächst deaktivieren, wahrscheinlich am besten bevor ihr den Leser anschließt. Hierfür verbindet ihr euch per z.B. Putty mit eurem Raspberry und gebt folgenden Befehl ein:
sudo nano /etc/inittab
Damit öffnet ihr die Datei inittab im Editor Nano. Hier müsst ihr nun folgende Zeile auskommentieren (eine Raute # davor setzen):
T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
Die Zeile sollte also danach so aussehen:
# T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
Mit Strg + x beendet ihr den Editor, es wird gefragt ob und wohin ihr speichern wollt, dies bestätigt ihr und belasst den Speicherort so wie er ist.
Als Software zum Auslesen nutze ich das angehängts Python-Skript:
Das ehzh.zip müsst ihr entpacken und die ehzh.py müsst ihr nun also auf euren Raspberry PI kopieren.
Auf dem Raspberry PI sollte Python bereits installiert sein (z.B. bei Raspbian und RaspBMC), ihr müsst aber noch die Erweiterung Py-Serial installieren. Hierfür verbindet ihr euch wieder per z.B. Putty mit eurem Raspberry und gebt folgenden Befehl ein:
sudo apt-get install python-serial
So nun muss das Skript noch ein wenig angepasst werden. Am besten öffnet ihr das Skript im Nano Editor, dazu gebt ihr folgenden Befehl ein:
nano ehzh.py
Im oberen Bereich findet ihr folgenden Block:
# !!!! BEGIN CHANGE ME !!!! Miniserver_IP = "192.168.0.192" Miniserver_PORT = 8886 WirkArbeitLaenge = 5 WirkLeistungLaenge = 4 WirkArbeitPos = 142 WirkLeistungPos = 205 Ausleseintervall = 50 # !!!! END CHANGE ME !!!!
Nun könnt ihr den Editor wieder mit Strg + x verlassen.
Jetzt kann das Skript schon mal Testweise ausgeführt werden, hierzu gebt ihr folgendes ein:
Python ehzh.py
Nun solltet ihr zunächst ein Zahlen sehen welche alle 0,5 Sekunden untereinander geschrieben werden. Dies sind die Anzahl der Bytes welche im Seriellen Puffer gespeichert sind. Empfängt der Raspberry PI nun also Daten erhöht sich dieser Wert. Wenn alles korrekt funktioniert müssen hierbei Sprünge von mindestens 100 oder so vorhanden sein. Wenn sich der Wert immer nur um 10 oder ähnliches ändert ist wahrscheinlich der Fototransistor nicht richtig ausgerichtet. So bald im Puffer mehr als 800 Byte sind beginnt die Auswertung.
Als nächstes sollten min. 1600 Zeichen ausgegeben werden, dies ist dass was soeben eingelesen wurde in HEX.
Als nächstes wird ausgegeben an welcher Stelle der Datensatz anfängt, dies kann 0 sein, muss aber nicht.
Danach werden die Wirkleistung und die Wirkarbeit ausgegeben. Stimmen diese Werte bzw. die Wirkarbeit bereits mit eurem Zählerstand überein seid ihr mit der Bearbeitung des Skripts schon fertig. In diesem Fall könnt ihr den Rest überspringen und direkt zur Einrichtung des Automatischen Starts springen.
Sollten hier völlig falsche Werte kommen müsst ihr die Werte WirkArbeitLaenge etc. noch anpassen. Hierzu müsstet ihr die empfangenen HEX-Werte auswerten:
Nähere Informationen zu dem verwendeten Protokoll findet ihr unter:
volkszaehler.org - wiki - Smart Message Language
und einige Infos zum spezifischen Protokoll einiger Zählern unter:
volkszaehler.org - wiki - hardware:channels:metersower:edl-ehz
Bei mir ist ein EMH eHZ-H verbaut.
Auf der entsprechenden Seite steht bei Beispieldaten:
77 (3)
07 01 00 01 08 00 FF objName 1-0:1.8.0*255
Wirkarbeit Bezug total
63 01 82 status = unsigned 16
01 valTime
62 1E unit (unsigned8) 1E = Wh
52 FF scaler (int8) -1 = *10^-1 = /10
56 00 01 29 71 4F value 19493967/10 = 1949396,7 Wh = 1949,3967 kWh
01 valueSignature (leer)
Da ich in meinem Skript die Daten nicht richtig auswerte sondern nur die Daten an einer bestimmten Stelle auslese müsstet ihr nun in den Hex-Rohdaten nach folgender Zeichenfolge suchen: 07 01 00 01 08 00 FF
Wenn ihr diese Zeichenfolge gefunden habt wisst ihr das daraufhindie totale Wirkarbeit gesendet wurde. Die Daten fangen nach der 56 an, also mit 00. Ihr müsstet nun Zählen das wie vielte Zeichen die 56 vom Anfangszeichen an ist, das heißt von der Start-Zeichenfolge: 1B 1B 1B 1B 01 01 01 01 Wenn ihr einen Datensatz erwischt habt wo die Skript ausgabe für den Datensatzanfang 0 war ist dies am einfachsten zu Zählen.
Diesen Wert müsst ihr dann durch 2 Teilen (2Hex = 1 Byte) und entsprechend bei WirkArbeitPos eintragen.
Der Wert WirkArbeitLaenge ergibt sich, so weit ich das verstanden habe, aus der 56 vor den Daten, 56 bedeutet Länge 5 (6-1), eine 57 wäre entsprechend Länge 6. Warum das so ist weiß ich auch nicht genau, aber so scheint es zu passen.
Das gleiche müsst ihr dann noch für die Wirkleistung machen, also für den aktuellen Verbrauch.
Je nach Zähler ist es auch Möglich mehr Werte zu nutzen, z.B. Spannung oder Strom.
Wenn ihr das so weit angepasst habt könnt ihr nochmal das Skript starten und nun sollten die Werte passen.
3. Einrichten des Autostarts:
Ich lasse das Skript bei meinem RPi automatisch starten, hierzu nutze ich den Cron-Daemon. Gebt als Befehl folgendes ein:
Sudo crontab –e
Dies öffnet wieder den Editor Nano, jedoch mit der aktuellen Crontab für den Root User.
Hier trag ihr am Ende folgende Zeile ein:
@reboot python /home/pi/ehzh.py > /dev/null 2>&1
Und speichert das ganze wieder wie gehabt. Somit wird beim Neustart des entsprechende Skript gestartet und die Ausgaben werden verworfen. Gegebenenfalls müsst ihr natürlich noch den Pfad anpassen, je nachdem wo ihr das Skript gespeichert habt.
Was nun noch zu tun ist wäre die Rechte der Datei zu ändern. Der Root-User muss ja auch das Recht haben die Datei zu starten. Dies erreichen wir mit folgender eingabe:
Chmod 755 ezhz.py
Somit geben wir dem Root User und auch allen anderen Usern das Recht die Datei anzusehen und auszuführen. Nun könnt ihr den RPi mit folgendem Befehl neu starten:
Sudo reboot
Nach dem Neustart könnt ihr noch überprüfen ob das Skript wirklich ausgeführt wird. Hierfür gebt ihr folgenden Befehl ein:
ps -ef | grep python
Die dann folgende Ausgabe sieht bei mir so aus:
root 1909 1904 0 Sep18 ? 00:00:00 /bin/sh -c python /home/pi/ehzh.py >> ehzh_log.txt 2>&1
root 1912 1909 0 Sep18 ? 00:00:07 python /home/pi/ehzh.py
pi 2344 2311 0 14:32 pts/0 00:00:00 grep --color=auto python
In den ersten beiden Zeilen taucht unser Skript auf. Nun sollten ca. alle 60 Sekunden die beiden Daten am Miniserver per UDP eingehen. Hier müssen nun nur noch entsprechende UDP Eingänge definiert werden.
So dann wünsche ich euch mal viel Spaß damit.
Gruß
Iksi
Kommentar