Ankündigung

Einklappen

Sammelbestellung ETS6 Vollversionen aktiv!

Sammelbestellung für ETS6 Vollversionen (Prof., Home, Lite) mit 40% Rabatt aktiv! Infos im Forum!
Mehr anzeigen
Weniger anzeigen

Projektvorstellung: Autonomer KNX Telegramm-Logger auf Raspberry Pi

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Projektvorstellung: Autonomer KNX Telegramm-Logger auf Raspberry Pi

    Autonomer KNX Telegram Logger auf Raspberry Pi 4
    Beitrag 1 von 5 – Projektziel, Architektur, Hardware

    -------------------------------------------------------

    Hallo zusammen,
    ich lese hier schon seit Jahren mit und möchte heute mal etwas zurückgeben.

    Bei einem Kunden musste ich bestimmten Fehlern im KNX Bus auf die Spur kommen und brauchte eine Möglichkeit, die Busaktivitäten dauerhaft aufzuzeichnen. Daraus ist dieser Raspberry Pi basierte Datenlogger entstanden, gebaut aus dem, was meine Werkstatt gerade hergab.

    Ich bin mit dem Ergebnis sehr zufrieden. Der Logger tut, was er soll, und läuft stabil und zuverlässig. Bei den aktuellen Raspberry Pi Preisen ist das zwar kein Schnäppchen, aber wer noch ein paar dieser Platinen herumliegen hat, kann sie vielleicht sinnvoller einsetzen, als schon wieder eine Wetterstation zu bauen.

    Ein großer Linux Experte bin ich nicht. Mit Debian und Ubuntu habe ich aber schon einige Projekte umgesetzt. Aktiven Support kann ich für das Projekt leider nicht anbieten. Ich habe die Skripte und die Dokumentation testweise an Claude Sonnet 4.6 gegeben. Die KI kommt damit erstaunlich gut zurecht, sowohl bei der Fehlersuche als auch bei individuellen Anpassungen. Die Dokumentation hier ist übrigens ebenfalls mit KI Unterstützung entstanden.

    Bei mir läuft alles seit längerer Zeit zuverlässig. Vielleicht hilft das Projekt ja auch dem einen oder anderen weiter.

    Viel Spaß damit!
    Boris

    -------------------------------------------------------

    1. Projektziel und Architektur

    Dieses Projekt realisiert einen passiven KNX-Busmonitor auf Basis eines Raspberry Pi 4. Der Logger empfängt alle KNX-Telegramme auf dem TP-Bus, schreibt sie in tagesweise rotierende CSV-Dateien und stellt einen Live-Web-Monitor bereit.

    Designprinzipien:
    • Passiver Monitor – kein aktiver Eingriff in die KNX-Anlage, keine Änderung an Linienkopplern oder Filtertabellen
    • SD-Karte read-only per OverlayFS – keine Schreibvorgänge auf der SD, Daten nur auf USB-Stick
    • Stromausfallsicher: Nach jedem Neustart sofortiger Betrieb ohne manuelle Eingriffe
    • Hot-Swap USB-Stick: Beim Wechsel wird automatisch fsck.exfat durchgeführt und neu gemountet
    • Integrierter WLAN-Accesspoint für Smartphone-Zugriff auf den Live-Monitor ohne LAN-Infrastruktur
    • Optionale Dekodierung von Nutzdaten wenn eine ETS6-Gruppenadressliste (CSV) auf dem Stick abgelegt wird
    • Kein Datenbankserver: Aufzeichnung ausschließlich als CSV-Dateien auf dem USB-Stick. Keine Datenbank, die bei Stromausfall korrumpieren kann
    • Einfache Auswertung: CSV-Dateien sind direkt mit Excel oder LibreOffice Calc auswertbar, kein spezielles Tool-Wissen erforderlich



    Datenfluss

    Code:
    KNX TP-Bus
        │
        ▼  galvanische Trennung, NCN5130 TPUART2
    TUL V3.1  ──  USB-Kabel (USB-C auf USB-A)  ──  /dev/ttyACM0, 38400 Baud
        │
        ▼
    knxd 0.14.x  ──  KNXnet/IP Tunneling, localhost UDP 3671
        │
        ▼
    xknx 3.x  (Python, Virtualenv)
        │
        ├──▶  knx_logger.py    ──▶  /media/knxlog/knx_YYYY-MM-DD.csv
        └──▶  knx_webserver.py ──▶  HTTP Port 80 (FastAPI/uvicorn, SSE)

    -------------------------------------------------------




    2. Hardware-Einkaufsliste
    Komponente Empfehlung Hinweis
    Raspberry Pi 4 Model B 4 GB RAM 2 GB ausreichend für reine Logger-Funktion
    SD-Karte Samsung PRO Endurance 32 GB MLC NAND, für Dauerbetrieb ausgelegt
    KNX-Interface Busware TUL V3.1 ESP32-C3, NCN5130 TPUART2, galvanische Trennung, USB-Serial
    RTC-Modul Adafruit PCF8523 PiRTC (#3386) Für autonomen Betrieb ohne NTP, Batterie CR1220
    USB-Stick beliebig, min. 8 GB exFAT-formatiert, Volume-Label KNXLOG
    Netzteil Offizielles RPi 4 Netzteil 5V/3A Ausreichende Stromversorgung wichtig
    Wichtiger Hinweis zu USB-Ports: USB 3.0 (blaue Ports am RPi 4) erzeugt Interferenzen im 2,4-GHz-Band. TUL und USB-Stick immer an die schwarzen USB-2.0-Ports anschließen.


    -------------------------------------------------------



    #2
    Autonomer KNX Telegram Logger auf Raspberry Pi 4
    Beitrag 2 von 5 – OS-Setup, knxd, WLAN-AP, Python-Umgebung

    -------------------------------------------------------


    3. Betriebssystem und Grundkonfiguration


    OS installieren

    Raspberry Pi OS Lite (64-bit) mit dem Raspberry Pi Imager auf die SD-Karte schreiben.

    Im Imager unter OS Customisation vorab konfigurieren:
    • Hostname: knxlogger
    • Benutzer: knx (oder beliebig – alle folgenden Pfade entsprechend anpassen)
    • SSH aktivieren, Public-Key hinterlegen
    • WLAN für die erste Inbetriebnahme optional hinterlegen



    Erster SSH-Zugriff

    Code:
    ssh knx@knxlogger

    System aktualisieren

    Code:
    sudo apt update && sudo apt full-upgrade -y
    sudo apt autoremove -y && sudo apt clean

    Nicht benötigte Dienste deaktivieren

    Code:
    # cloud-init – nur für Cloud-VMs, hier überflüssig
    sudo systemctl mask cloud-init cloud-init-local cloud-config cloud-final
    
    # avahi-daemon – mDNS/Bonjour, nicht benötigt
    sudo systemctl mask avahi-daemon avahi-daemon.socket

    Benutzer zur dialout-Gruppe hinzufügen

    Erforderlich für Zugriff auf /dev/ttyACM0 ohne root:

    Code:
    sudo usermod -aG dialout knx

    -------------------------------------------------------




    4. Abhängigkeiten installieren

    Code:
    sudo apt install -y \
        knxd \
        python3-venv \
        python3-pip \
        exfatprogs \
        zerofree \
        ufw \
        network-manager \
        i2c-tools
    Pakete im Überblick:
    Paket Zweck
    knxd KNX-Daemon, TPUART-Backend, KNXnet/IP-Frontend
    python3-venv Isolierte Python-Umgebung für xknx
    exfatprogs exFAT-Dateisystemunterstützung inkl. fsck.exfat
    zerofree Freie Blöcke vor SD-Backup nullen (drastisch bessere Kompression)
    ufw Firewall
    network-manager WLAN-AP-Verwaltung (bringt internen DHCP mit, kein separates dnsmasq nötig)
    i2c-tools i2cdetect zur RTC-Prüfung
    -------------------------------------------------------




    5. knxd konfigurieren


    Startparameter

    In /etc/default/knxd die KNXD_OPTS-Zeile setzen:

    Code:
    sudo nano /etc/default/knxd
    Code:
    KNXD_OPTS="-e 15.15.254 -E 15.15.240:8 -D -T -S -b tpuarts:/dev/ttyACM0:38400"
    Parameter-Erklärung:
    Parameter Bedeutung
    -e 15.15.254 Physikalische KNX-Adresse des Monitors
    -E 15.15.240:8 Tunneling-Adressen, 8 Slots (15.15.240–15.15.247)
    -D KNXnet/IP aktivieren
    -T Tunneling-Modus
    -S Server-Modus
    -b tpuarts:/dev/ttyACM0:38400 Backend: USB-Serial TPUART2-Schnittstelle
    Die physikalische Adresse und der Tunneling-Bereich müssen projektspezifisch angepasst werden und dürfen nicht mit vorhandenen KNX-Teilnehmern kollidieren. 15.15.x ist ein gängiger Bereich für Service-Tools.


    knxd-Startdelay einrichten

    Der TUL V3.1 (ESP32-C3) benötigt nach der USB-Enumeration einige Sekunden zur Initialisierung. Ohne Verzögerung schlägt der knxd-Start fehl.

    Code:
    sudo mkdir -p /etc/systemd/system/knxd.service.d
    sudo nano /etc/systemd/system/knxd.service.d/override.conf
    Code:
    [Unit]
    After=dev-ttyACM0.device
    Requires=dev-ttyACM0.device
    
    [Service]
    ExecStartPre=/bin/sleep 8
    Code:
    sudo systemctl daemon-reload
    sudo systemctl enable knxd

    knxd testen

    Voraussetzung: TUL per USB-Kabel angeschlossen und KNX TP-Bus angeklemmt.

    Code:
    sudo systemctl start knxd
    systemctl status knxd
    journalctl -u knxd -n 20 --no-pager
    Wenn alles korrekt ist, erscheint in den Logs listening on oder connected. Telegramme lassen sich im Terminal mitlesen:

    Code:
    knxtool groupsocketlisten ip:localhost

    -------------------------------------------------------




    6. WLAN-Accesspoint einrichten

    Der RPi 4 fungiert als WLAN-AP, damit Smartphone und Laptop ohne vorhandene LAN-Infrastruktur auf den Web-Monitor zugreifen können.

    NetworkManager verwaltet den DHCP-Server für den AP intern – ein separater dnsmasq-Dienst ist nicht erforderlich und würde auf Port 53/67 kollidieren.

    Code:
    sudo nmcli connection add \
        type wifi \
        ifname wlan0 \
        con-name knxlogger-ap \
        ssid KNXLOGGER \
        mode ap \
        ipv4.method shared \
        ipv4.addresses 192.168.100.1/24 \
        wifi-sec.key-mgmt wpa-psk \
        wifi-sec.psk "IhrPasswort"
    
    sudo nmcli connection up knxlogger-ap
    sudo nmcli connection modify knxlogger-ap connection.autoconnect yes
    Nach dem Aktivieren ist der AP unter 192.168.100.1 erreichbar. Verbundene Geräte erhalten automatisch eine IP im Bereich 192.168.100.x.


    -------------------------------------------------------




    7. Python-Umgebung und Skripte


    Virtualenv anlegen

    Code:
    python3 -m venv /home/knx/knxenv
    source /home/knx/knxenv/bin/activate
    pip install xknx fastapi uvicorn
    deactivate


    Python-Skripte (als Anhang)

    Die drei Skripte stehen als Anhang zu diesem Beitrag zum Download bereit:
    Datei Ablageort auf dem Pi Beschreibung
    knx_logger.py /home/knx/knx_logger.py Haupt-Logger, CSV-Schreiben, LED-Watchdog
    knx_webserver.py /home/knx/knx_webserver.py Web-Monitor (FastAPI/uvicorn, SSE, Port 80)
    sync_journal.sh /home/knx/sync_journal.sh Cursor-basierter Journal-Export auf USB-Stick
    Code:
    # Dateiberechtigungen nach dem Kopieren setzen
    chmod +x /home/knx/sync_journal.sh

    Kommentar


      #3
      Autonomer KNX Telegram Logger auf Raspberry Pi 4
      Beitrag 3 von 5 – systemd-Units, USB-Stick, Hardware-Konfiguration

      -------------------------------------------------------


      8. systemd-Units anlegen

      Alle Dateien werden unter /etc/systemd/system/ abgelegt.


      knx-logger.service

      Code:
      [Unit]
      Description=KNX Telegram Logger
      After=network.target knxd.service media-knxlog.mount
      Requires=knxd.service media-knxlog.mount
      # Stoppt automatisch wenn USB-Mount wegfällt
      BindsTo=media-knxlog.mount
      # Kein Restart-Limit – Gerät muss ohne Aufsicht weiterlaufen
      StartLimitIntervalSec=0
      
      [Service]
      Type=simple
      User=knx
      Group=gpio
      WorkingDirectory=/home/knx
      ExecStart=/home/knx/knxenv/bin/python3 /home/knx/knx_logger.py
      Restart=always
      RestartSec=10
      StandardOutput=journal
      StandardError=journal
      
      [Install]
      WantedBy=multi-user.target

      knx-web.service

      Code:
      [Unit]
      Description=KNX Web Monitor
      After=network.target knx-logger.service
      Wants=knx-logger.service
      
      [Service]
      Type=simple
      User=knx
      WorkingDirectory=/home/knx
      ExecStart=/home/knx/knxenv/bin/uvicorn knx_webserver:app --host 0.0.0.0 --port 80
      Restart=on-failure
      RestartSec=5
      # Port 80 ohne root
      AmbientCapabilities=CAP_NET_BIND_SERVICE
      StandardOutput=journal
      StandardError=journal
      
      [Install]
      WantedBy=multi-user.target

      media-knxlog.mount

      Code:
      [Unit]
      Description=USB-Stick KNXLOG (/media/knxlog)
      Requires=knx-fsck-usb.service
      After=knx-fsck-usb.service
      
      [Mount]
      What=/dev/disk/by-label/KNXLOG
      Where=/media/knxlog
      Type=exfat
      Options=defaults,nofail,uid=1000,gid=1000,umask=022
      TimeoutSec=30
      
      [Install]
      WantedBy=multi-user.target

      media-knxlog.automount

      Code:
      [Unit]
      Description=Automount USB-Stick KNXLOG (Hot-Swap)
      After=local-fs.target
      
      [Automount]
      Where=/media/knxlog
      # Nie automatisch unmounten
      TimeoutIdleSec=0
      
      [Install]
      WantedBy=multi-user.target

      knx-fsck-usb.service

      Code:
      [Unit]
      Description=Dateisystemprüfung USB-Stick (exFAT) vor dem Mount
      DefaultDependencies=no
      Before=media-knxlog.mount
      PartOf=media-knxlog.mount
      ConditionPathExists=/dev/disk/by-label/KNXLOG
      
      [Service]
      Type=oneshot
      ExecStart=/usr/sbin/fsck.exfat -y /dev/disk/by-label/KNXLOG
      RemainAfterExit=yes
      StandardOutput=journal
      StandardError=journal
      
      [Install]
      RequiredBy=media-knxlog.mount

      knx-journal-sync.service

      Code:
      [Unit]
      Description=Journal-Snapshot auf USB-Stick exportieren
      After=media-knxlog.mount
      Wants=media-knxlog.mount
      
      [Service]
      Type=oneshot
      ExecStart=/bin/bash /home/knx/sync_journal.sh
      StandardOutput=journal
      StandardError=journal

      knx-journal-sync.timer

      Code:
      [Unit]
      Description=Journal alle 10 Minuten auf USB sichern
      
      [Timer]
      OnBootSec=2min
      OnUnitActiveSec=10min
      Unit=knx-journal-sync.service
      
      [Install]
      WantedBy=timers.target

      Mountpoint anlegen und Units aktivieren

      Code:
      sudo mkdir -p /media/knxlog
      
      sudo systemctl daemon-reload
      
      sudo systemctl enable knx-logger.service
      sudo systemctl enable knx-web.service
      sudo systemctl enable media-knxlog.automount
      sudo systemctl enable knx-fsck-usb.service
      sudo systemctl enable knx-journal-sync.timer
      
      # Automount sofort starten (Mount selbst erfolgt on-demand)
      sudo systemctl start media-knxlog.automount

      journald auf volatile Storage umstellen

      Da die SD-Karte im Betrieb read-only ist, muss das Journal im RAM gehalten werden.

      Code:
      sudo mkdir -p /etc/systemd/journald.conf.d
      sudo nano /etc/systemd/journald.conf.d/knx.conf
      Code:
      [Journal]
      Storage=volatile
      RuntimeMaxUse=64M
      Compress=yes
      Code:
      sudo systemctl restart systemd-journald

      -------------------------------------------------------




      9. USB-Stick vorbereiten und einbinden

      Der USB-Stick wird label-basiert eingebunden. Damit ist der Stick austauschbar – UUID-Änderungen beim Wechsel spielen keine Rolle. Entscheidend ist ausschließlich das Volume-Label KNXLOG.


      USB-Stick formatieren (Windows, CMD als Administrator)

      Code:
      format /FS:exFAT /V:KNXLOG /Q X:
      i[/i]


      Oder unter Linux

      Code:
      lsblk
      sudo mkfs.exfat -n KNXLOG /dev/sdX1

      USB-Stick testen

      Stick einstecken und prüfen:

      Code:
      ls /dev/disk/by-label/
      # KNXLOG muss erscheinen
      
      sudo systemctl start media-knxlog.mount
      mountpoint /media/knxlog
      ls /media/knxlog

      ETS6-Gruppenadressliste (optional)

      Wer GA-Bezeichnungen und DPT-Dekodierung im Web-Monitor und in der CSV haben möchte, exportiert aus ETS6 die Gruppenadressliste als CSV und legt sie als ga_export.csv im Wurzelverzeichnis des USB-Sticks ab.

      ETS6-Export: Gruppenübersicht → Exportieren → Gruppenadressliste (CSV).

      Unterstützte Encodings: UTF-8-BOM, UTF-16, CP1252. Trennzeichen Semikolon oder Komma werden automatisch erkannt. Der Logger lädt die Datei alle 5 Minuten neu – kein Neustart erforderlich.


      -------------------------------------------------------




      10. Hardware konfigurieren (config.txt)

      Alle Hardwareeinstellungen werden in einem Schritt vorgenommen, damit nur ein einziger Reboot erforderlich ist.

      Code:
      sudo nano /boot/firmware/config.txt
      Folgende Zeilen hinzufügen bzw. anpassen:

      Code:
      # GPU-Speicher minimieren (kein Desktop)
      gpu_mem=16
      
      # CPU-Frequenzlimit für Dauerbetrieb
      arm_freq=1000
      arm_freq_min=300
      
      # Bluetooth deaktivieren (nicht benötigt)
      dtoverlay=disable-bt
      
      # I2C für RTC (PCF8523)
      dtparam=i2c_arm=on
      
      # RTC-Treiber
      dtoverlay=i2c-rtc,pcf8523
      
      # ACT-LED durch Logger gesteuert (nicht durch SD-Aktivität)
      dtparam=act_led_trigger=none
      
      # HDMI deaktivieren (Headless-Betrieb)
      hdmi_ignore_hotplug=1
      Code:
      sudo reboot

      USB-Autosuspend deaktivieren

      USB-Autosuspend kann beim TUL zu Verbindungsabbrüchen führen. Die udev-Regel verhindert das Abschalten aller USB-Geräte:

      Code:
      sudo nano /etc/udev/rules.d/70-usb-autosuspend.rules
      Code:
      ACTION=="add", SUBSYSTEM=="usb", TEST=="power/control", ATTR{power/control}="on"
      Code:
      sudo udevadm control --reload-rules

      -------------------------------------------------------

      Kommentar


        #4
        Autonomer KNX Telegram Logger auf Raspberry Pi 4
        Beitrag 4 von 5 – RTC, Sicherheit, OverlayFS

        -------------------------------------------------------


        11. RTC testen und einstellen

        Nach dem Reboot aus Kapitel 10 ist der PCF8523-Treiber aktiv.

        Code:
        # Treiber aktiv prüfen: 0x68 muss "UU" zeigen (Treiber belegt die Adresse)
        i2cdetect -y 1
        
        # Systemzeit in RTC schreiben (einmalig, solange NTP-Synchronisation verfügbar)
        sudo hwclock -w
        
        # RTC-Zeit zurücklesen
        sudo hwclock -r
        
        # fake-hwclock deaktivieren (wird durch echte RTC ersetzt)
        sudo apt remove fake-hwclock -y
        Die CR1220-Batterie im PCF8523 sichert die Uhrzeit bei Stromausfall. Ohne Batterie geht die Zeit bei jedem Neustart verloren. Der Treiber liest die Zeit beim Boot automatisch aus der RTC – keine weitere Konfiguration erforderlich.


        -------------------------------------------------------




        12. Sicherheit und Firewall

        Wichtig: SSH-Härtung und Firewall müssen VOR der OverlayFS-Aktivierung (Kapitel 13) abgeschlossen werden, damit die Änderungen persistent auf der SD-Karte gespeichert werden.


        SSH härten

        Code:
        sudo nano /etc/ssh/sshd_config
        Folgende Parameter setzen:

        Code:
        PasswordAuthentication no
        KbdInteractiveAuthentication no
        PermitRootLogin no
        Code:
        sudo systemctl restart sshd
        Hinweis: Den SSH-Public-Key vor der Passwort-Deaktivierung einrichten und die Verbindung in einer zweiten SSH-Session testen.


        UFW-Firewall

        Code:
        sudo ufw default deny incoming
        sudo ufw default allow outgoing
        sudo ufw allow 22/tcp comment 'SSH'
        sudo ufw allow 80/tcp comment 'Web-Monitor'
        sudo ufw allow in on wlan0 to any port 67 proto udp comment 'DHCP AP'
        sudo ufw allow in on wlan0 to any port 53 comment 'DNS AP'
        sudo ufw enable
        Port 3671/udp (KNXnet/IP) ist absichtlich nicht extern freigegeben – knxd ist ausschließlich lokal erreichbar.


        -------------------------------------------------------




        13. SD-Karte absichern (OverlayFS)

        OverlayFS schaltet die SD-Karte read-only. Alle Schreibvorgänge landen im RAM (tmpfs) und sind nach dem Neustart nicht mehr vorhanden. Logdaten werden ausschließlich auf dem USB-Stick gespeichert. Das macht das System stromausfallsicher und schont die SD-Karte.

        Code:
        sudo raspi-config nonint do_overlayfs 0
        sudo reboot

        Status prüfen

        Code:
        findmnt / | grep overlay   # Ausgabe erscheint nur wenn OverlayFS aktiv
        sudo touch /etc/test && echo RW || echo RO
        RW bedeutet hier: Der Overlay erlaubt Schreibvorgänge ins RAM (tmpfs upperdir) – die SD-Karte selbst bleibt read-only.


        Persistente Änderungen vornehmen (OverlayFS-Zyklus)

        Nach Aktivierung von OverlayFS sind alle Systemänderungen nach dem nächsten Neustart verloren. Für persistente Änderungen (Paketinstallationen, Konfigurationen):

        Code:
        # 1. OverlayFS deaktivieren → RW-Modus
        sudo raspi-config nonint do_overlayfs 1 && sudo reboot
        
        # 2. Änderungen vornehmen
        sudo apt update && sudo apt full-upgrade -y
        
        # 3. History leeren
        history -c && cat /dev/null > ~/.bash_history
        sudo truncate -s 0 /root/.bash_history
        
        # 4. OverlayFS wieder aktivieren
        sudo raspi-config nonint do_overlayfs 0 && sudo reboot

        -------------------------------------------------------

        Kommentar


          #5
          Autonomer KNX Telegram Logger auf Raspberry Pi 4
          Beitrag 5 von 5 – Web-Monitor, Backup, Betrieb & xknx-Hinweise

          -------------------------------------------------------


          14. Web-Monitor verwenden

          Der Web-Monitor läuft auf Port 80 und ist im Browser erreichbar:
          • LAN: http://knxlogger oder http://[IP-des-Pi]
          • WLAN-AP: http://192.168.100.1


          Features:
          • Live-Anzeige aller KNX-Telegramme per SSE (kein Polling, kein manuelles Neuladen)
          • Statusleiste: Logger-Zustand, USB-Füllstand, Uptime, Busauslastung (letzte 60 s)
          • Top-3-Sender im aktuellen Puffer
          • Filterfeld (Adresse, Gruppenadressname, Wert)
          • Rohwert-Fallback wenn kein DPT bekannt
          • CSV-Download der aktuellen Tagesdatei
          • GA-Bezeichnungen und dekodierte Werte wenn ga_export.csv vorhanden



          TUL-Verbindung

          Der TUL V3.1 ist per USB-Kabel (USB-C auf USB-A) direkt mit dem Pi verbunden und wird als serielles TPUART2-Gerät unter /dev/ttyACM0 eingebunden. knxd kommuniziert ausschließlich über diese USB-Serial-Schnittstelle – es gibt keine Netzwerkverbindung zum TUL.

          Code:
          ls -la /dev/ttyACM0
          journalctl -u knxd -n 20 --no-pager
          Der TUL V3.1 ist alternativ auch mit WLAN-Bridge-Firmware erhältlich – diese Anleitung beschreibt ausschließlich die USB-TPUART2-Variante.


          LED-Verhalten (ACT-LED)
          Muster Bedeutung
          2x blinken alle 10 s Logger aktiv und aufzeichnend
          Dauerlicht Initialisierung, Verbindungsaufbau oder Fehler
          -------------------------------------------------------




          15. Backup und Wiederherstellung


          Voraussetzungen
          • OverlayFS muss aktiv sein (SD-Karte read-only → konsistenter Backup-Zustand)
          • Backup-Befehl in Windows CMD ausführen, nicht PowerShell – PowerShell korrumpiert Binärstreams durch UTF-16-Konvertierung beim >-Redirect



          Schritt 1: Freie Blöcke nullen

          Verbessert die Kompressionsrate erheblich (32-GB-Karte → ca. 1–3 GB komprimiert).

          Code:
          # Partition ist ro-gemountet (OverlayFS aktiv) → zerofree kann ohne Unmount laufen
          sudo zerofree /dev/mmcblk0p2
          # Dauer: 15–30 Minuten, keine Fortschrittsanzeige

          Schritt 2: Image erstellen (Windows CMD)

          Code:
          ssh knxlogger "sudo dd if=/dev/mmcblk0 bs=4M status=progress | gzip -1" > "C:\Backup\knxlogger.img.gz"
          • Dauer: ca. 15–20 Minuten bei ~30 MB/s über Gigabit-LAN
          • Größe nach zerofree: 1–3 GB



          Wiederherstellung

          Mit Raspberry Pi Imager (empfohlen): Use custom image.img.gz direkt auswählen, Imager dekomprimiert automatisch.

          Kommandozeile (Linux/WSL):

          Code:
          # Zielgerät vorher mit lsblk prüfen!
          gzip -dc knxlogger.img.gz | sudo dd of=/dev/sdX bs=4M status=progress

          -------------------------------------------------------




          16. Betrieb und Wartung


          Status prüfen

          Code:
          systemctl status knxd knx-logger knx-web --no-pager
          journalctl -u knx-logger -n 50 --no-pager

          USB-Stick wechseln
          1. Stick abziehen → knx-logger stoppt automatisch (BindsTo)
          2. Neuen Stick einstecken (exFAT, Volume-Label KNXLOG)
          3. fsck.exfat läuft automatisch, Mount erfolgt, Logger startet neu


          Kein manueller Eingriff erforderlich.


          Dateistruktur auf dem Pi

          Code:
          /home/knx/
          ├── knx_logger.py          # Haupt-Logger
          ├── knx_webserver.py       # Web-Monitor (FastAPI/uvicorn)
          ├── sync_journal.sh        # Journal-Export-Skript
          └── knxenv/                # Python-Virtualenv
          
          /etc/systemd/system/
          ├── knx-logger.service
          ├── knx-web.service
          ├── media-knxlog.mount
          ├── media-knxlog.automount
          ├── knx-fsck-usb.service
          ├── knx-journal-sync.service
          ├── knx-journal-sync.timer
          └── knxd.service.d/override.conf
          
          /etc/systemd/journald.conf.d/knx.conf
          /boot/firmware/config.txt
          /etc/udev/rules.d/70-usb-autosuspend.rules

          Dateistruktur auf dem USB-Stick

          Code:
          /media/knxlog/
          ├── knx_YYYY-MM-DD.csv         # Tages-Telegramm-Log (tägliche Rotation)
          ├── ga_export.csv              # ETS6 Gruppenadressliste (optional)
          └── journal/
              ├── system_YYYY-MM-DD.log  # Journal-Backup (alle 10 min)
              └── .journal_cursor        # Cursor für inkrementellen Export

          -------------------------------------------------------




          Hinweise zu xknx 3.x

          xknx hat mit Version 3.x das Payload-Format geändert:

          Code:
          # xknx >= 3.x (aktuell)
          DPTArray value="[0x8c]"    ← eckige Klammern, Hex
          
          # xknx < 3.x (veraltet)
          DPTArray value="(140,)"    ← runde Klammern, Dezimal
          Der Logger verarbeitet beide Formate. int(x, 0) im Python-Code erkennt sowohl "0x8c" als auch "140" korrekt.

          Angehängte Dateien
          Zuletzt geändert von bigvot; Gestern, 22:33.

          Kommentar


            #6
            Danke für das Teilen deines Projektes, aber wenn ich mir diesen Aufwand anschaue und auf dem gleichen Pi auch einfach HASS + Spectrum KNX installieren könnte.

            https://github.com/martinhoefling/SpectrumKNX
            Dieser Beitrag enthält keine Spuren von Sarkasmus... ich bin einfach so?!

            Kommentar


              #7


              Stimmt, Home Assistant + Spectrum wäre eine Option, aber das war hier nicht das Ziel. Die Idee war eine simple Blackbox: einmal installiert, läuft einfach. TP-Bus anschließen, Aufzeichnung startet automatisch. Keine Konfiguration, keine Datenbank, keine laufende Plattform, keine extra Software zum Auslesen. USB-Stick abziehen, neuen einstecken, fertig. Am PC dann mit Excel oder was auch immer auswerten, ganz nach Belieben. Wer vorher aus ETS die Gruppenadressliste exportiert und auf dem Stick hinterlegt, bekommt obendrauf automatisch Klarnamen in der CSV und im Live-Monitor.

              Das Projekt besteht außerdem komplett aus Open-Source-Bibliotheken und Tools. Eigener Code beschränkt sich auf ein Shell-Skript und drei Python-Dateien, alles andere erledigen Tools wie knxd und xknx.

              Die Dokumentation sieht nach mehr aus als der Aufwand tatsächlich ist. Ich habe es bewusst so detailliert geschrieben, damit beim Nachbau keine Zeit damit verloren geht herauszufinden wie alles zusammenpasst. Wer Lust hat, kann auch einfach eine KI bitten alles in ein Installationsskript zu packen, dann wäre es ein einziger Klick.

              Ich mache es persönlich lieber Schritt für Schritt, zum einen um zu lernen, zum anderen um zu verstehen was unter der Haube passiert. Ohne versteckte Geschichten die irgendwo nach Hause telefonieren.
              Aber wie gesagt, es ist nur eine Projektvorstellung. Jeder wie er mag. 😉

              Kommentar


                #8


                Vielleicht noch als Ergänzung: Ich nutze es zur Diagnose beim Kunden, nicht für den Betrieb daheim. Zuhause hätte ich vielleicht HA, ioBroker, Grafana und InfluxDB laufen und würde das auch pflegen. Das ist aber ein anderer Kontext. Daher auch die Absicherung und das Read-Only auf der SD-Karte. Für meine Zwecke ist es absolut ausreichend und macht mir das Leben einfacher.

                Wer eine fertige Profil-Lösung möchte, kann natürlich auch zum Babteck Logger, Timberwolf oder was auch immer greifen. Da hört bei mir persönlich der sportliche Spaß am Basteln auf. 😄

                Kommentar

                Lädt...
                X