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)
            }
            ]
        }
    ]
}

Dann El. Energie (Zählerstände) und nicht El. Energie (Leistungswerte) auswählen

Erstellen Klicken
UUID in Zwischenablage kopieren und in /etc/vzlogger.conf einfügen.
(Ich weiß, dass die UUIDs in den Screenshots sich ändern. Hatte den Kanal 2x angelegt. )

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

3 Kommentare
  1. Hans-Peter Abele
    Hans-Peter Abele sagte:

    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

    Antworten
  2. Ju
    Ju sagte:

    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?

    Antworten

Hinterlasse einen Kommentar

An der Diskussion beteiligen?
Hinterlasse uns deinen Kommentar!

Schreibe einen Kommentar zu Ju Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert