Blog

  • Homematic CCU3 wird träge? Ursache: eine Request-Flut und ein volllaufendes Log

    Die CCU3 reagiert plötzlich zäh, die WebUI braucht ewig, Programme laufen verzögert. Hardware-Defekt? Zu wenig Leistung? In meinem Fall war es weder noch: Ein externer Client hat die Logik-Engine der CCU mit Anfragen geflutet, und das Webserver-Log hat dabei den Arbeitsspeicher aufgefüllt. In diesem Beitrag zeige ich die Symptome, wie ich die Ursache eingekreist habe und wie man das Problem dauerhaft behebt.

    Die Symptome

    • WebUI und Dashboards laden sehr langsam oder laufen in Timeouts.
    • Schaltbefehle und Programme werden verzögert ausgeführt.
    • Die CPU-Last ist trotzdem unauffällig (Load Average unter 1,5), der Prozessor ist überwiegend im Leerlauf.
    • Der freie Arbeitsspeicher ist fast aufgebraucht, ohne dass ein einzelner Prozess auffällt.
    • Im Kernel-Prozess ksoftirqd sammelt sich auffällig viel CPU-Zeit an. Das deutet auf sehr viele Netzwerkverbindungen hin.

    Diagnose Schritt für Schritt

    Voraussetzung ist ein SSH-Zugang zur CCU. In der WebUI unter Einstellungen → Systemsteuerung → Sicherheit aktivieren Sie SSH und vergeben ein Root-Passwort.

    1. Speicher und Dateisysteme prüfen

    uptime
    free -m
    df -h

    Die Auffälligkeit bei mir: /var war zu 100 % voll. /var ist auf der CCU ein tmpfs, liegt also im RAM. Ist es voll, fehlt dem System der Arbeitsspeicher, und Prozesse, die dorthin schreiben, hängen oder scheitern.

    2. Den größten Verbraucher finden

    du -x -k -d 3 /var | sort -rn | head -15
    ls -laS /var/log

    Die Ursache war eine einzelne Datei: /var/log/lighttpd-access.log mit rund 500 MB. Eine so große Zugriffsliste entsteht nur, wenn jemand die CCU mit Requests überhäuft.

    3. Wer sendet die Requests?

    tail -n 20 /var/log/lighttpd-access.log
    netstat -tn | awk '{print $6}' | sort | uniq -c

    Im Log sah ich Hunderte POST /rega.exe-Zeilen pro Sekunde, immer von derselben IP. Die Datei rega.exe ist die Schnittstelle zur Logik-Engine (ReGa), über die Skripte, Systemvariablen und Programme angesprochen werden. netstat zeigte zusätzlich über 2.500 Verbindungen im Zustand TIME_WAIT. Das ist das typische Bild eines Clients, der in enger Schleife immer neue Verbindungen öffnet.

    Bei mir stammte die IP von einem Docker-Host mit mehreren Containern. Auf dem Host lässt sich die Quelle weiter eingrenzen:

    # Verbindungen pro Container zur CCU zählen
    for c in $(docker ps --format '{{.Names}}'); do
      PID=$(docker inspect -f '{{.State.Pid}}' $c)
      n=$(sudo nsenter -t $PID -n ss -tn | grep -c '<CCU-IP>:')
      echo "$n $c"
    done | sort -rn | head

    4. Rate und Muster messen

    Nachdem der Container feststand, habe ich mit tcpdump neue Verbindungen pro Sekunde gezählt. Das funktioniert auch bei verschlüsselter Verbindung (TLS), denn man braucht nur die Verbindungsaufbauten (SYN-Pakete):

    sudo nsenter -t $PID -n timeout 10 \
      tcpdump -n -l -tt 'dst host <CCU-IP> and tcp dst port 48181 and tcp[tcpflags] & tcp-syn != 0'

    Ergebnis: rund 27 neue Verbindungen pro Sekunde, in regelmäßigen Dreiergruppen etwa alle 110 ms. Ein so gleichmäßiger Takt deutet nicht auf Nutzerinteraktion hin, sondern auf einen automatisch getakteten Auslöser.

    5. Den Auslöser finden

    Die CCU-Nodes von Node-RED nutzen rega.exe, um Systemvariablen zu schreiben. Jeder ccu-sysvar-Node, der eine Nachricht erhält, löst damit eine Anfrage aus. Ich habe im Flow zurückverfolgt, welche Quellen Systemvariablen speisen. Der Schuldige war ein modbus-read-Node, der einen Batteriespeicher alle 100 ms abfragte. Das Ergebnis lief ohne Filter in eine Systemvariable. Da sich die Leistung bei jeder Messung leicht ändert, wurde bei jedem Zyklus geschrieben.

    Die Behebung

    Ursache beseitigen (am Client)

    1. Poll-Intervall erhöhen. Für eine Systemvariable genügen meist 5–10 Sekunden statt 100 ms.
    2. Filtern, bevor geschrieben wird. In Node-RED hilft ein rbe-Node (Report by Exception) im Modus Deadband, z. B. nur bei Änderungen von mehr als 50 W. Alternativ begrenzt ein delay-Node im Modus Rate Limit die Nachrichten pro Zeit.
    3. Flows mit hochfrequenten Quellen grundsätzlich prüfen: Sensoren, MQTT-Topics und Modbus-Reads dürfen schnell sein, aber nicht ungefiltert in Systemvariablen oder Programme der CCU laufen.

    Danach sank die Zahl der Verbindungen von etwa 27 auf etwa 1 pro Sekunde, und die CCU war wieder responsiv.

    Das Log dauerhaft begrenzen (auf der CCU)

    Die CCU rotiert ihre Logs per logrotate nur einmal täglich um 04:00 Uhr. Die Größenbegrenzung size 2M aus /etc/logrotate.d/lighttpd.conf greift deshalb erst zu diesem Zeitpunkt. Bei einer Flut ist der RAM-Speicher schon Stunden vorher voll. Die Lösung: Die Rotation häufiger ausführen.

    Die Root-Partition der CCU ist schreibgeschützt, Änderungen in /etc gehen bei Neustarts verloren. Dauerhaft ist nur die Partition /usr/local. Skripte in /usr/local/etc/config/rc.d/ werden beim Booten automatisch gestartet (so arbeiten auch Addons). Ich habe dort ein kleines Skript angelegt:

    #!/bin/sh
    # /usr/local/etc/config/rc.d/logguard
    # Rotiert die lighttpd-Logs minütlich nach der Regel in
    # /etc/logrotate.d/lighttpd.conf (size 2M), damit /var (tmpfs)
    # nicht vollläuft.
    PIDFILE=/var/run/logguard.pid
    case "$1" in
      ""|start)
        [ -f $PIDFILE ] && kill -0 $(cat $PIDFILE) 2>/dev/null && exit 0
        ( while true; do
            sleep 60
            /usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
            # Syslog-Datei hart begrenzen (10 MB)
            [ "$(stat -c %s /var/log/messages 2>/dev/null || echo 0)" -gt 10485760 ] && : > /var/log/messages
          done ) >/dev/null 2>&1 &
        echo $! > $PIDFILE
        ;;
      stop)
        [ -f $PIDFILE ] && kill $(cat $PIDFILE) 2>/dev/null; rm -f $PIDFILE
        ;;
    esac
    exit 0

    Installation:

    chmod 755 /usr/local/etc/config/rc.d/logguard
    /usr/local/etc/config/rc.d/logguard start

    Damit sichert die CCU ihren Speicher selbst ab: Das Access-Log bleibt bei etwa 2 MB, ältere Daten liegen höchstens einmal komprimiert vor. Ich habe den Mechanismus getestet, indem ich das Log künstlich über 2 MB aufgefüllt habe. Innerhalb von einer Minute wurde es rotiert.

    Überlebt das ein Firmware-Update?

    Ja. Ein Update tauscht nur die Root-Partition, /usr/local bleibt erhalten. Das Skript lief nach dem Upgrade auf Firmware 3.89.11 sofort wieder, die Rotationsregel der Firmware war unverändert. Wichtig ist trotzdem, nach einem Update kurz zu prüfen, ob /etc/logrotate.d/lighttpd.conf noch vorhanden ist. Ändert eine künftige Firmware die Datei oder das Binary, würde das Skript wirkungslos laufen, und die Ausgaben sind auf /dev/null umgeleitet.

    Checkliste für den Ernstfall

    1. df -h: Ist /var voll?
    2. ls -laS /var/log: Welche Datei ist am größten?
    3. tail /var/log/lighttpd-access.log: Welche IP und welche URL kommen ständig vor?
    4. netstat -tn: Wie viele TIME_WAIT-Verbindungen gibt es?
    5. Auf dem Client: Welcher Prozess oder Flow ruft die CCU in enger Schleife auf?
    6. Intervall erhöhen, Werte filtern, Log-Rotation häufiger ausführen.

    Fazit

    Eine träge CCU ist nicht automatisch ein Leistungs- oder Hardwareproblem. Eine ungebremste Automatisierung kann die Logik-Engine mit tausenden Anfragen pro Minute überlasten und ganz nebenbei den Arbeitsspeicher füllen. Das Problem lässt sich mit einfachen Bordmitteln diagnostizieren: df, du, netstat und ein Blick ins Access-Log. Die Behebung hat zwei Teile: die Ursache im Client abstellen und die CCU gegen volllaufende Logs absichern.

  • Samsung CLP-315 unter Ubuntu 24.04: Treiber einrichten

    Samsung CLP-315 unter Ubuntu 24.04: Treiber einrichten

    Der Samsung CLP-315 ist ein Farblaserdrucker. Wer ihn unter modernen Linux-Distributionen wie Ubuntu 24.04 (Noble Numbat) betreiben möchte, stößt ggf. auf Probleme:

    • Leere Blätter (SpliX-Treiber): Der Drucker zieht Papier ein, gibt es aber unbedruckt wieder aus. Ursache ist ein bekannter 64-Bit-Bug bei der JBIG-
      Bildkompression im Open-Source-Treiber. Das Gerät verwirft die fehlerhaften Bilddaten sicherheitshalber.
    • Schwarze/Graue Streifen (foo2qpdl): Dieser alternative Treiber verarbeitet die Farbdaten oftmals fehlerhaft, was zu massiver Streifenbildung führt.
    • Bunte geometrische Streifen (Alter Proprietär-Treiber): Der veraltete UnifiedLinuxDriver von Samsung erwartet das ältere „CUPS Raster V2“-Format. Das neue
      Ghostscript 10 unter Ubuntu 24.04 sendet jedoch V3-Daten, was der alte Samsung-Filter (rastertospl) als Bild-Koordinaten fehlinterpretiert – das Resultat ist bunter
      Datenmüll.

    Meine Lösung: Ein gepatchter Proprietär-Treiber aus dem Suldr (Bchemnet) Repository. Dieses Community-Projekt passt die originalen Treiber seit Jahren für moderne Linux-Systeme an. So gehst du vor:

    (mehr …)
  • Automatische Lüftungsempfehlung mit HomeMatic IP auf der CCU3 mit Wetterstation und Thermostat

    Automatische Lüftungsempfehlung mit HomeMatic IP auf der CCU3 mit Wetterstation und Thermostat

    Wer kennt es nicht: beschlagene Spiegel und hohe Luftfeuchte nach dem Duschen. Doch wann lohnt es sich tatsächlich, das Bad zu lüften? Mit Homematic IP, einer CCU3, der Wetterstation, einem Thermostat im Bad und etwas Mathematik lässt sich diese Entscheidung automatisieren. In diesem Beitrag erfährst du, wie man ein Homematic Script erstellt, das anhand von Temperatur- und Feuchtigkeitswerten automatisch entscheidet, ob Lüften sinnvoll ist – und wie die Physik dahinter funktioniert.

    Warum absolute Feuchte zählt

    Die relative Luftfeuchtigkeit (z. B. 60 %) hängt stark von der Temperatur ab, was sie als Steuergröße ungeeignet macht. Kältere Luft kann weniger Wasser aufnehmen, weshalb winterliche Außenluft zwar eine hohe relative, aber sehr niedrige absolute Feuchte hat. Erst durch Erwärmen wird sie drinnen spürbar „trockener“. Deshalb vergleicht unser Script die absolute Luftfeuchtigkeit innen und außen.
    (mehr …)

  • Lichtsteuerung mit Homematic IP (CCU3) und deCONZ REST-API

    Lichtsteuerung mit Homematic IP (CCU3) und deCONZ REST-API

    In diesem Szenario werden eine dimmbare Zigbee Lampe mit deCONZ Steuerung, ein Zigbee Bewegungsmelder und ein Homematic IP Schalter zur Lichtsteuerung kombiniert.

    Das nachfolgende Skript gewährleistet, dass ein einfacher Toggle-Befehl des Schalters stets zur vollen Helligkeit führt – unabhängig von zuvor gespeicherten Dimmwerten der Lampe.

    Szenario und Herausforderung

    1. Ein Bewegungsmelder aktiviert die Zigbee-Lampe bei Bewegung zeitweise mit 100% Helligkeit.
    2. Nach Inaktivität wird die Lampe auf 1% gedimmt, um Orientierung zu ermöglichen und schaltet diese schließlich ganz aus.
    3. Dieser Dimmzustand bleibt in der Lampe auch nach dem abschalten gespeichert.
    4. Der Homematic IP-Lichtschalter sendet beim Drücken einen Toggle-Befehl („an“/„aus“) und kennt nicht den aktuellen Dimmzustand der Lampe.
    5. Beim erneuten Einschalten leuchtet die Lampe daher oft nur in der zuvor gespeicherten, niedrigen Helligkeit.

    Zur Lösung wird nach dem Toggle der Gruppenstatus über die deCONZ REST-API für Gruppen abgefragt. Bei eingeschaltetem Zustand wird die Helligkeit unverzüglich auf 100% (Wert 255) gesetzt.

    Funktionsweise des Skripts

    1. Toggle der Gruppe
      Ein einfacher HTTP-PUT-Aufruf über CUxD schaltet alle Lampen in der definierten Gruppe um.
    2. Statusabfrage
      Ein HTTP-GET-Aufruf liest das JSON-Objekt der Gruppe aus. Der Parameter state.any_on zeigt, ob mindestens eine Lampe eingeschaltet ist.
    3. Prüfung auf any_on:true
      Eine einfache String-Suche ("any_on":true) bestimmt den Schaltzustand ohne aufwendiges JSON-Parsing.
    4. Helligkeitsanpassung
      Bei eingeschaltetem Zustand wird über einen weiteren HTTP-PUT-Aufruf die Helligkeit auf 255 gesetzt.

    Zu setzende Variablen

    • deconz_ip: IP-Adresse der deCONZ-Bridge (z. B. "192.168.123.123")
    • deconz_port: Port der REST-API (Standard: "80")
    • api_key: Persönlicher API-Schlüssel aus der deCONZ-Weboberfläche
    • group_id: ID der Lampengruppe in deCONZ (z. B. "666")

    Vollständiges Skript

    
    
    
    
    
    ! deCONZ REST-API Toggle & Helligkeit Script für CCU3
    ! Gruppe 666 – Beispiel „Wohnzimmer“
    
    ! Variablen
    string deconz_ip     = "192.168.123.123";
    string deconz_port   = "80";
    string api_key       = "APIKEY";
    string group_id      = "666";
    
    string response;
    boolean any_on_status = false;
    
    ! Schritt 1: Toggle ausführen
    WriteLine("Starte Toggle...");
    dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State(
      "curl -s -X PUT -d '{\"toggle\":true}' " +
      "\"http://" + deconz_ip + ":" + deconz_port +
      "/api/" + api_key + "/groups/" + group_id + "/action\""
    );
    dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
    dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
    
    ! Schritt 2: Status abfragen
    WriteLine("Status abfragen...");
    dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State(
      "curl -s \"http://" + deconz_ip + ":" + deconz_port +
      "/api/" + api_key + "/groups/" + group_id + "\""
    );
    dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
    response = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
    WriteLine("API Response: " + response);
    
    ! Prüfen, ob "any_on":true im JSON steht
    if (response.Find("\"any_on\":true") >= 0) {
      any_on_status = true;
      WriteLine("Status: any_on = true");
    } else {
      any_on_status = false;
      WriteLine("Status: any_on = false");
    }
    
    ! Schritt 3: Helligkeit setzen
    if (any_on_status) {
      WriteLine("Setze Helligkeit auf 255...");
      dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State(
        "curl -s -X PUT -d '{\"bri\":255}' " +
        "\"http://" + deconz_ip + ":" + deconz_port +
        "/api/" + api_key + "/groups/" + group_id + "/action\""
      );
      dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
      response = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
      WriteLine("Helligkeits-Response: " + response);
    } else {
      WriteLine("Keine Helligkeitsanpassung erforderlich");
    }
    
    WriteLine("Script beendet");
    

    Dieses Skript sorgt dafür, dass nach jedem Schaltvorgang über den Homematic IP-Lichtschalter die Lampe immer mit voller Helligkeit startet – ein konsistentes Nutzererlebnis in Verbindung mit Bewegungsmelder-Automatik.

  • Waschmaschinen-Status in Node-RED visualisieren

    Waschmaschinen-Status in Node-RED visualisieren

    So baust du eine intelligente Statusanzeige mit Homematic, Node-RED und Dashboard

    In diesem Beitrag zeige ich dir, wie du mit Node-RED und einer Homematic-Messsteckdose den Status deiner Waschmaschine automatisch ausliest, zuverlässig zwischen „Aus“,„Pause“ und „Fertig“ unterscheidest und den aktuellen Zustand übersichtlich im Dashboard anzeigst. Das Projekt ist ideal, wenn du wissen möchtest, wann deine Wäsche wirklich fertig ist – und nicht nur, ob die Maschine gerade Strom verbraucht.

    (mehr …)
  • Der Nah.SH Irrsinn: Umweg kostet nur die Hälfte

    Der Nah.SH Irrsinn: Umweg kostet nur die Hälfte

    Wer wie ich mit Bus und Bahn von Stockelsdorf nach Reinfeld fährt zahlt beim Nah.sh mächtig drauf:
    nah.sh Preise via Lübeck
    Die Fahrt von Stockelsdorf nach Reinfeld über Lübeck zahlt man 6€ pro Fahrt oder 126€ im Monat.
    (mehr …)

  • Wiedereinführung der Wehrpflicht? Nein, Danke!

    Wiedereinführung der Wehrpflicht? Nein, Danke!

    Liebe CDU, liebe JU,

    ihr habt doch nicht mehr alle Tassen im Schrank, wenn ihr euch für die Wiedereinführung der Wehrpflicht einsetzt. Ich halte nicht viel von Karl-Theodor zu Guttenberg, aber die Abschaffung der Wehrpflicht war ein Geniestreich. Ich finde es verachtenswert, wenn Politiker – die nicht Gefahr laufen selbst eingezogen zu werden – auf der einen Seite über Krieg und Frieden entscheiden und auf der anderen Seite junge Männer zwangsweise zu Mörder machen und in den Tod schicken. Denn nichts anderes ist die Wehrpflicht.
    (mehr …)

  • Microsoft Visio 2016 mit WINE installieren

    Wie man Microsoft Visio 2016 unter Linux mit Wine installiert.

    Wine etc. installieren.

    # sudo apt install wine-stable winbind winetricks

    Wine Umgebung im Verzeichnis „~/.wine-visio“ erstellen.
    (mehr …)

  • Stadtverkehr Lübeck verhindert umstieg vom Regionalexpress aus Hamburg in den Bus

    Stadtverkehr Lübeck verhindert umstieg vom Regionalexpress aus Hamburg in den Bus

    Autofahren ist umweltschädlich, öffentlicher Personennahverkehr ist umweltfreundlich. Das ist in unserer Gesellschaft Konsens.

    Ein Fallbeispiel, wie es nicht klappt:
    Ich wohne in Stockelsdorf, Haltestelle Bäckergang und pendele berufsbedingt täglich nach Hamburg. Die Bus-Taktung der Linie 9 von Stockelsdorf zum Lübecker Hauptbahnhof mit Umstieg in die Regionalbahn nach Hamburg ist mit 5 bis 7 Minuten prima.
    (mehr …)

  • Veracrypt, UEFI, Windows 10 und der Bootloop

    Veracrypt, UEFI, Windows 10 und der Bootloop

    Veracrypt ist ein Programm zum Verschlüsseln von Festplatten. Es legt bei der Installation einen Booteintrag „VeraCrypt BootLoader (DcsBoot)“ im UEFI (früher BIOS) an. Dieser muss als Standard-Booteintrag markiert werden, damit Veracrypt die Festplatte für den Bootvorgang entschlüsseln kann.
    (mehr …)