Volkszähler mit Infrarot USB-Schreib-Lesekopf konfigurieren
Zu dem Thema Infrarot USB-Schreib-Lesekopf am Volkszähler gibt es natürlich schon Artikel und Dokumentationen, aber ich mag nun mal Kurzanleitungen und stabile Konfigurationen, deshalb widme ich mich ausgehend der USB-Konfiguration zu. Ich mag es nämlich nicht, mir merken zu müssen an welchem USB-Port welches Gerät gesteckt werden muss.
Hintergrund-Infos
Die Volkszähler-Doku zum IR-Schreib-Lesekopf:
- (https://wiki.volkszaehler.org/howto/wechselrichter_sma)
- (https://wiki.volkszaehler.org/hardware/controllers/ir-schreib-lesekopf)
- (https://wiki.volkszaehler.org/hardware/channels/meters/power/edl-ehz/ehz-iw8e2a5)
USB-Konfiguration mit UDEV-Rules:
- (https://wiki.debian.org/udev )
- (http://reactivated.net/writing_udev_rules.html)
- (https://wiki.volkszaehler.org/howto/debug)
- (Persistent names for USB-serial devices in Linux: https://medium.com/@inegm/persistent-names-for-usb-serial-devices-in-linux-dev-ttyusbx-dev-custom-name-fd49b5db9af1)
USB-Konfiguration, damit ein USB-Gerät immer den gleichen Namen bekommt, egal an welchem USB-Port er eingesteckt wird.
Kurz zusammengefasst was wir hier tun:
Beim Einstecken eines USB-Geräts übermittelt das Gerät ein Kennung bzw. Attribute und eine Seriennummer mit der es eindeutig identifiziert werden kann.
Diese Nummer werden wir mittels udev einem eindeutigen Namen zuordnen. Damit wir das Device immer mit zB /dev/lesekopf1 ansprechen können, egal wo es gesteckt ist.
USB ID ermitteln:
udevadm info --name=/dev/ttyUSB0 --attribute-walk
pi@volkszaehler:~ $ udevadm info --query=all --name=/dev/ttyUSB0 P: /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.3/1-1.3:1.0/ttyUSB0/tty/ttyUSB0 N: ttyUSB0 S: serial/by-id/usb-Silicon_Labs_CP2104_USB_to_UART_Bridge_Controller_01304EAC-if00-port0 S: serial/by-path/platform-3f980000.usb-usb-0:1.3:1.0-port0 E: DEVLINKS=/dev/serial/by-id/usb-Silicon_Labs_CP2104_USB_to_UART_Bridge_Controller_01304EAC-if00-port0 /dev/serial/by-path/platform-3f980000.usb-usb-0:1.3:1.0-port0 E: DEVNAME=/dev/ttyUSB0 E: DEVPATH=/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.3/1-1.3:1.0/ttyUSB0/tty/ttyUSB0 E: ID_BUS=usb E: ID_MODEL=CP2104_USB_to_UART_Bridge_Controller E: ID_MODEL_ENC=CP2104\x20USB\x20to\x20UART\x20Bridge\x20Controller E: ID_MODEL_FROM_DATABASE=CP210x UART Bridge / myAVR mySmartUSB light E: ID_MODEL_ID=ea60 E: ID_PATH=platform-3f980000.usb-usb-0:1.3:1.0 E: ID_PATH_TAG=platform-3f980000_usb-usb-0_1_3_1_0 E: ID_REVISION=0100 E: ID_SERIAL=Silicon_Labs_CP2104_USB_to_UART_Bridge_Controller_01304EAC E: ID_SERIAL_SHORT=01304EAC E: ID_TYPE=generic E: ID_USB_DRIVER=cp210x E: ID_USB_INTERFACES=:ff0000: E: ID_USB_INTERFACE_NUM=00 E: ID_VENDOR=Silicon_Labs E: ID_VENDOR_ENC=Silicon\x20Labs E: ID_VENDOR_FROM_DATABASE=Cygnal Integrated Products, Inc. E: ID_VENDOR_ID=10c4 E: MAJOR=188 E: MINOR=0 E: SUBSYSTEM=tty E: TAGS=:systemd: E: USEC_INITIALIZED=20562 pi@volkszaehler:~ $ udevadm info --query=all --name=/dev/ttyUSB0 | grep ID_SERIAL_SHORT E: ID_SERIAL_SHORT=01304EAC pi@volkszaehler:~ $ udevadm info --name=/dev/ttyUSB0 --attribute-walk | grep -i serial
Regel anlegen, damit der USB-Lesekopf immer den gleichen Namen bekommt egal an welchem USB-Port er eingesteckt wird.
sudo vi /etc/udev/rules.d/99_hg_persistent-usb.rules
Folgenden Text einfügen
SUBSYSTEMS=="usb-serial", ATTRS{product}=="CP2104 USB to UART Bridge Controller", ATTRS{serial}=="01304EAC", SYMLINK+="lesekopf0" # oder besser komplett mit IDs und abhängig von der abgeleiteten Geräteklasse: SUBSYSTEM=="usb", ATTRS{idVendor}=="10c4", ATTRS{serial}=="01304EAC", SYMLINK+="lesekopf0" SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{serial}=="01304EAC", SYMLINK+="lesekopf1"
Danach udev-Regeln neu laden oder besser reboot
sudo udevadm control --reload-rules; sudo udevadm trigger
Damit ist der USB-Setup erledigt und wir können uns der Konfiguration des Volkszählers widmen
Volkszähler Konfiguration: zvlogger
sudo cp /etc/vzlogger.conf /etc/vzlogger.conf_bkup
Die wichtigsten Parameter sind: 9600bd, 8N1 und die tragen wir jetzt in die Config ein:
{/** * vzlogger configuration * * Use properly encoded JSON with javascript comments * * Take a look at the wiki for detailed information: * http://wiki.volkszaehler.org/software/controller/vzlogger#configuration * * For an online configuration editor refer to: * http://volkszaehler.github.io/vzlogger/ */ { // General settings "daemon": true, // run periodically "verbosity": 5, // log verbosity (0=log_alert, 1=log_error, 3=log_warning, 5=log_info, 10=log_debug, 15=log_finest) "log": "/var/log/vzlogger.log", // log file, optional "retry": 30, // http retry delay in seconds // Build-in HTTP server "local": { "enabled": false, // enable local HTTPd for serving live readings "port": 8080, // TCP port for local HTTPd "index": true, // provide index listing of available channels if no UUID was requested "timeout": 30, // timeout for long polling comet requests in seconds (0 disables comet) "buffer": -1 // HTTPd buffer configuration for serving readings, default -1 // >0: number of seconds of readings to serve // <0: number of tuples to server per channel (e.g. -3 will serve 3 tuples) }, // realtime notification settings "push": [ { "url": "http://127.0.0.1:5582" // notification destination, e.g. frontend push-server } ], // Meter configuration "meters": [ { // My SML meter ehz-iw8e2a "enabled": true, // disabled meters will be ignored (default) "allowskip": false, // errors when opening meter may be ignored if enabled "protocol": "sml", // meter protocol, see 'vzlogger -h' for full list "device": "/dev/lesekopf1", // meter device "aggtime": -1, // aggregate meter readings and send middleware update after <aggtime> seconds "parity": "8N1", // Serial parity, 7E1 or 8N1 "baudrate": 9600, // Serial baud rate, typically 9600 or 300 "aggfixedinterval" : true, "channels": [{ "uuid": "3e5b6d00-6cf1-11ec-ac02-693808d187ce", "middleware": "http://localhost/middleware.php", "identifier": "1-0:1.8.0", // OBIS identifier "aggmode": "MAX" // aggregation mode: aggregate meter readings during <aggtime> interval // "SUM": add readings (use for s0 impulses) // "MAX": maximum value (use for meters sending absolute readings) // "AVG": average value (use for meters sending current usage) } ] } ] }
Wenn alles läuft wie gewünscht noch den service automatisch beim booten starten
sudo systemctl enable vzlogger.service #bzw sudo systemctl enable vzlogger # je nachdem wie ihr den service genannt habt
sudo systemctl restart vzlogger
Hallo Hagen,
bin ziemlich gefrustet, auf wiki Volkszaehler finde ich keine Antwort auf meine Fragen.
Habe einen IR-Kopf (von Volksz.-Udo) der per USB mit einem YPORT+ (auch von Udo) per WLAN die Zaehlerdaten an vzlogger senden soll. In Frontend sind die Kanäle eingerichtet und in vzlogger.conf implementiert, vzlogger startet ohne Probleme und zeigt in der Statusabfrage, daß dieser activ ist. Ich finde nirgends einen Hinweis gefunden, wo die YPORT+ IP und ein Port eingetragen werden muss. Es muss doch irgendwo eine Verbindung vom YPORT zum vzlogger hergestellt werden ???
Würde mich sehr über über Hilfe freuen.
Liebe Grüße aus dem Nordschwarzwald von Peter
Hallo Peter,
wer ist Udo?
Was ist ein YPORT?
Hallo,
habe meinen USB IR wie oben beschrieben auf lesekopf abgeändert. Leider bekomme ich keine Daten eingelesen. Habe auch mit minicom mich versucht 9600 8N1 aber ohne Erfolg. Hättest du noch eine Idee? Wie kann ich die serielle Daten am besten Testweise empfangen?