Wenn APC „BYE“ sagt und MQTT „Hello“ – Wie ich meine USV smarter machte als nötig

Geöffnete USV mit visualisierter Verbindung von RS232 über einen Netzwerkadapter zu MQTT, inklusive stilisierter Codefragmente

Einleitung

Alte Technik muss nicht verstauben – vor allem nicht, wenn sie noch zuverlässig Strom puffert. In meinem Fall: eine APC Smart-UPS SC420 aus einem ausrangierten Wechselautomat – und die perfekte Gelegenheit, eine APC USV an MQTT anzubinden. Denn nur weil ein Gerät alt ist, heißt das nicht, dass es nicht noch etwas zu sagen hat. Und genau das macht es jetzt – über MQTT. – und die perfekte Gelegenheit, eine APC USV an MQTT anzubinden. Ziel: APC USV an MQTT anbinden, um Daten wie Batteriespannung, Ladezustand und Status in ioBroker nutzbar zu machen.

In diesem Artikel zeige ich dir Schritt für Schritt, wie ich die USV über RS232 und einen Netzwerk-Adapter von Waveshare mit einem Python-Skript auslese und an MQTT übergebe – inklusive Copy&Paste-Code, Nerd-Kommentaren und Stolperfallen.


APC USV an MQTT anbinden: Hardware-Setup

Benötigt:

RS232-Kabel selbst bauen

APC nutzt bei vielen seiner USVs eigene Signalbelegungen und akzeptiert keine Standard-RS232-Kabel. Das bedeutet: Wer einfach ein „normales“ serielles Kabel anschließt, bekommt entweder keine Verbindung – oder die USV schaltet sich sogar ab. Deshalb ist ein selbstgebautes Kabel notwendig.

Adapterkabel zum verbinden einer APC USV an einen RS232 Controller

Die richtige Zuordnung (9-polig):

  • USV TX (Pin 2) an PC RX (Pin 3)
  • USV RX (Pin 3) an PC TX (Pin 2)
  • GND (Pin 5) an GND (Pin 5)

Einrichtung des Netzwerkadapters zur MQTT-Anbindung

Nach dem Anschluss über PoE und dem Start hilft das Tool Vircom, um die IP-Adresse und DHCP einzurichten. Danach kannst du das Gerät bequem über das Webinterface konfigurieren:

  • Betriebsmodus: TCP Server
  • Port: z. B. 5000
  • Ziel-IP brauchst du nicht setzen

LXC-Container vorbereiten

Falls du ebenfalls mit Proxmox arbeitest und dein Setup zukunftssicher gestalten willst, schau dir unbedingt auch meinen Artikel über Proxmox auf IPv6 umstellen – wie, warum und die Probleme an.

Wenn du noch tiefer in das serielle APC-Protokoll einsteigen willst – inklusive aller möglichen Kommandos wie Q1, g oder R – findest du auf networkupstools.org eine exzellente Übersicht.

apt update
apt install python3 python3-pip python3.11-venv -y
python3 -m venv /opt/usv-env
source /opt/usv-env/bin/activate
pip install paho-mqtt


Python-Skript zum Auslesen der APC USV und MQTT-Anbindung

Pfad: /opt/usv_mqtt.py

import socket
import time
import paho.mqtt.client as mqtt

USV_IP = "192.168.0.21"
USV_PORT = 5000
MQTT_SERVER = "192.168.0.102"
MQTT_PORT = 1886
MQTT_USER = "ioBroker"
MQTT_PASSWORD = "digital"
INTERVAL = 60

def clean_value(raw, as_type=float):
    try:
        cleaned = raw.split(":")[0].strip()
        return as_type(cleaned)
    except:
        return None

def send_command(sock, cmd, pause=0.5):
    try:
        sock.sendall(cmd.encode())
        time.sleep(pause)
        data = sock.recv(1024).decode(errors="ignore").strip()
        return data
    except Exception as e:
        print(f"Fehler bei Befehl {cmd}: {e}")
        return "N/A"

def decode_status_flags(hex_str):
    try:
        status = int(hex_str, 16)
        flags = []
        if status & (1 << 3): flags.append("On Line")
        if status & (1 << 4): flags.append("On Battery")
        if status & (1 << 5): flags.append("Overload")
        if status & (1 << 6): flags.append("Battery Low")
        if status & (1 << 7): flags.append("Replace Battery")
        return ", ".join(flags) if flags else "Unknown"
    except:
        return "Invalid"

client = mqtt.Client()
client.username_pw_set(MQTT_USER, MQTT_PASSWORD)
client.connect(MQTT_SERVER, MQTT_PORT, 60)
client.loop_start()

while True:
    try:
        with socket.create_connection((USV_IP, USV_PORT), timeout=5) as sock:
            handshake = send_command(sock, "Y", pause=0.8)
            if "SM" not in handshake:
                print(f"[WARNUNG] Kein Handshake: '{handshake}'")
                raise Exception("USV nicht bereit")

            print("[INFO] Abfrage beginnt")

            raw_status = send_command(sock, "Q1")
            values = {
                "battery_charge": clean_value(send_command(sock, "g")),
                "battery_voltage": clean_value(send_command(sock, "b")),
                "line_voltage": clean_value(send_command(sock, "L")),
                "runtime_left_min": clean_value(send_command(sock, "j"), int),
                "status_raw": raw_status,
                "status_human": decode_status_flags(raw_status),
            }

            for key, value in values.items():
                topic = f"usv/{key}"
                client.publish(topic, value if value is not None else "N/A")
                print(f"{topic}: {value}")

    except Exception as e:
        print(f"[Verbindungsfehler] {e}")

    time.sleep(INTERVAL)


Autostart per systemd

nano /etc/systemd/system/usv-mqtt.service

[Unit]
Description=APC USV → MQTT Bridge (zebra-node)
After=network.target

[Service]
ExecStart=/opt/usv-env/bin/python /opt/usv_mqtt.py
WorkingDirectory=/opt
Restart=on-failure
RestartSec=5
User=root

[Install]
WantedBy=multi-user.target

Dann:

systemctl daemon-reload
systemctl enable usv-mqtt
systemctl start usv-mqtt


Daten in ioBroker nutzen

Die Daten landen z. B. als:

  • usv/battery_charge
  • usv/runtime_left_min
  • usv/status_human

Du kannst nun Visualisierungen bauen, smarte Trigger einrichten oder dich bequem benachrichtigen lassen – beispielsweise per Telegram, Mail oder Sprachassistent.


Fazit: APC USV an MQTT angebunden – und zwar richtig

Die Überraschung: Das alte Gerät konnte mehr, als ich erwartet hatte. Statt „BYE“ sagt es jetzt jeden Tag brav „Hello MQTT“ – und zwar mit überraschend stabilen Werten. Das gibt nicht nur ein gutes Gefühl, sondern bringt auch Transparenz ins Strom-Backup, falls es mal ernst wird. – und warnt mich frühzeitig bei Stromausfällen oder Akkuproblemen.

So wird aus einem staubigen RS232-Port ein smarter Sensor, und der Traum, eine APC USV an MQTT anzubinden, wird Realität – ganz ohne Smart-Slot-Karte oder Spezialsoftware. Außerdem macht es einfach Spaß, Technik zu übertreiben, oder? – und aus einem Blogartikel vielleicht die Inspiration für deinen eigenen Umbau?

Fragen, Ideen oder deinen eigenen Umbau? Ab damit in die Kommentare!

Licht automatisch einschalten beim PC-Start – So geht’s mit ioBroker und Home Assistant

Technisch aufgeräumter Schreibtisch mit PowerShell-Code auf dem Bildschirm und eingeschalteter Schreibtischlampe – Symbolbild für Lichtautomatisierung beim PC-Start.

Licht automatisch einschalten beim PC-Start – genau das ist das Ziel dieses Beitrags. Wenn dein PC hochfährt, soll automatisch das Licht am Schreibtisch angehen? Klingt erstmal wie Magie – ist aber mit PowerShell, ioBroker oder Home Assistant in wenigen Minuten realisierbar. In diesem Beitrag zeige ich dir Schritt für Schritt, wie du genau das umsetzt. Alles lokal, ohne Cloud, dafür mit extra Nerd-Faktor und ein paar praktischen PowerShell-Tricks.


Was du brauchst, um beim PC-Start das Licht automatisch einzuschalten

  • Einen Windows-PC mit PowerShell (ab Windows 10)
  • Eine smarte Lampe oder Steckdose (z. B. Tapo Nano Smart WLAN Steckdose* (bezahlter Link) oder Philips Hue* (bezahlter Link))
  • Eine laufende ioBroker- oder Home Assistant-Installation
  • Einen gemeinsamen Netzwerkzugang
Aufgeräumter Technik-Arbeitsplatz mit drei Monitoren, PowerShell-Code und Smart-Home-Zubehör – der PC wird gestartet und das Licht geht automatisch an.
Beim Start des PCs aktiviert ein PowerShell-Skript automatisch das Licht – so einfach kann Smart Home mit ioBroker oder Home Assistant sein.

Variante 1: Beim PC-Start das Licht automatisch einschalten mit ioBroker

ioBroker vorbereiten

  1. Stelle sicher, dass der web-Adapter in ioBroker läuft.
  2. Aktiviere die Simple-API (Standardport ist meist 8087).
  3. Lege einen Datenpunkt für dein Licht an, z. B. licht.schreibtisch.on (Typ: Boolean).

PowerShell-Skript auf dem Windows-PC

Erstelle z. B. in C:\Scripts\light-on.ps1 folgendes Skript – kommentiert, damit du weißt, was was macht:

# URL zur ioBroker-Simple-API, um das Licht einzuschalten
$ioBrokerUrl = "http://192.168.0.100:8087/set/licht.schreibtisch.on?value=true"

try {
    # HTTP-Request an ioBroker senden
    Invoke-WebRequest -Uri $ioBrokerUrl -UseBasicParsing
    Write-Output "Lichtsignal an ioBroker gesendet."
} catch {
    # Falls etwas schiefgeht, gib den Fehler aus
    Write-Error "Fehler beim Senden des Signals: $_"
}

Hinweis: Wenn du Authentifizierung in ioBroker aktiviert hast, brauchst du einen Auth-Header (Basic Auth oder Token).

Autostart einrichten (mit ExecutionPolicy!)

Windows blockiert standardmäßig das Ausführen von PowerShell-Skripten – außer du erlaubst es explizit. Dazu nutzt du ExecutionPolicy Bypass, und zwar so:

So geht’s mit Verknüpfung im Autostart-Ordner:

  1. Erstelle eine Verknüpfung zu powershell.exe.
  2. Gib bei Ziel folgendes ein:
powershell.exe -ExecutionPolicy Bypass -File "C:\Scripts\light-on.ps1"

  1. Schieb die Verknüpfung in den Autostart-Ordner:

Pfad: C:\Users\<DEINNAME>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

Oder über die Aufgabenplanung:

  • Öffne „Aufgabenplanung“ (taskschd.msc)
  • Neue Aufgabe → Trigger: „Beim Start“ oder „Bei Anmeldung“
  • Aktion: powershell.exe
  • Argumente: -ExecutionPolicy Bypass -File "C:\Scripts\light-on.ps1"

So umgehst du elegant die Blockade, ohne dein System unsicher zu machen.


Variante 2: Home Assistant – Licht automatisch einschalten beim PC-Start per REST API

Vorbereitung

  1. Erstelle ein Long-Lived Access Token in deinem Home Assistant-Profil.
  2. Finde die entity_id deiner Lampe (z. B. light.schreibtisch).

PowerShell-Skript

# Dein Home Assistant Token – sicher aufbewahren!
$token = "DEIN_LONG_TOKEN"

# URL zum REST-API-Endpunkt zum Einschalten von Licht
$uri = "http://192.168.0.101:8123/api/services/light/turn_on"

# Header mit Authentifizierung
$headers = @{ Authorization = "Bearer $token" }

# JSON-Daten: Welche Lampe soll eingeschaltet werden?
$body = @{ entity_id = "light.schreibtisch" } | ConvertTo-Json

# Anfrage senden
Invoke-RestMethod -Uri $uri -Headers $headers -Method Post -Body $body -ContentType 'application/json'

Auch dieses Skript kannst du wie oben beschrieben beim Systemstart ausführen lassen.


Bonus: Weitere Ideen zum Licht beim PC-Start

  • Sanftes Aufdimmen: In ioBroker per Script oder in HA per transition-Attribut
  • Präsenz-Erkennung: Kombiniere das mit Bewegungssensor oder Smartphone-Präsenz
  • Mehrere PCs: Unterschiedliche Trigger-Datenpunkte für unterschiedliche Nutzer

Fehlerquellen und Tipps für die Licht-Automatisierung

  • Firewall: Stelle sicher, dass dein ioBroker vom PC aus erreichbar ist
  • ExecutionPolicy: Immer mit -ExecutionPolicy Bypass starten, wenn du Skripte automatisierst
  • Netzwerk: Beide Geräte müssen sich im gleichen Netz befinden (keine VLANs o. ä. dazwischen)
  • API-Schutz: Wenn du von außen zugreifst, nutze Tokens und sichere Ports

Fazit: Licht automatisch einschalten beim PC-Start lohnt sich

„Licht automatisch einschalten beim PC-Start“ ist keine Hexerei, sondern mit ein paar Zeilen PowerShell und etwas Smart-Home-Magie schnell gemacht. Egal ob du ioBroker oder Home Assistant nutzt – dein PC wird zum echten Smart-Home-Mitbewohner.

Genau solche Automatismen machen ein echtes Smart Home aus: Du musst nichts mehr selbst schalten oder daran denken – dein System erledigt es einfach für dich. Wenn dich das Thema interessiert, schau unbedingt in meinen Beitrag Echtes Smart Home: Automatisierung statt Fernbedienung.

Proxmox auf IPv6 umstellen – wie, warum und die Probleme

In diesem Beitrag beschreibe ich meine Erfahrungen bei der Umstellung meines Proxmox-Systems auf IPv6. Dabei gab es einige Herausforderungen, insbesondere im Zusammenhang mit LXC-Containern (CTs), virtuellen Maschinen (VMs) und den Netzwerkeinstellungen meiner Fritzbox* (bezahlter Link). Am Ende konnte ich aber fast mein gesamtes Smart Home auf IPv6 umstellen und alle Probleme lösen. Hier sind die wichtigsten Erkenntnisse!


1️⃣ Warum IPv6 für mein Smart Home?

Die Umstellung auf IPv6 bringt viele Vorteile:

  • Keine NAT-Probleme mehr: Geräte sind direkt erreichbar.
  • Zukunftssicherheit: IPv4-Adressen werden immer knapper.
  • Bessere Adressierung: Kein Ärger mehr mit internen Subnetzen.
  • Matter: Matter benötigt zwingen IPv6

Da mein Smart-Home-System stark auf Proxmox, Home Assistant, ioBroker und Zigbee2MQTT setzt, wollte ich sicherstellen, dass alles reibungslos mit IPv6 funktioniert.


2️⃣ Erste Schritte: IPv6 in der Fritzbox aktivieren

Die Fritzbox war bereits auf Dual Stack konfiguriert, aber um sicherzustellen, dass Proxmox und meine VMs wirklich IPv6 nutzen, habe ich folgendes überprüft:

  • DHCPv6-Server aktiviert → IPv6-Adressen werden zugewiesen
  • DNSv6-Server bekannt gegeben → Damit meine Geräte IPv6 bevorzugen
  • Statische IPv6 für wichtige Geräte (z. B. Proxmox-Host)

Ein schneller Test mit https://www.wieistmeineip.de/ipv6-test/ zeigte, dass ich bereits Dual Stack (IPv4 + IPv6) nutzte.


3️⃣ Proxmox auf IPv6 umstellen

3.1 IPv6 für das Hauptnetzwerk aktivieren

Auf dem Proxmox-Host habe ich geprüft, ob eine IPv6-Adresse vorhanden ist:

ip -6 addr show

Die Fritzbox* (bezahlter Link) hatte eine globale IPv6-Adresse zugewiesen. Falls das nicht der Fall gewesen wäre, hätte ich stattdessen eine statische IPv6-Adresse konfiguriert.

Dann prüfte ich die IPv6-Route:

ip -6 route show default

Falls keine IPv6-Standardroute vorhanden gewesen wäre, hätte ich sie manuell hinzugefügt:

ip -6 route add default via fe80::1 dev vmbr0

3.2 Netzwerkbrücke vmbr0 anpassen

Die interfaces-Datei wurde so angepasst, dass IPv6-Adressen über SLAAC oder DHCPv6 bezogen werden:

auto vmbr0
iface vmbr0 inet static
    address 192.168.0.19/24 # IP des Proxmox Servers
    gateway 192.168.0.1
    bridge-ports eno1
    bridge-stp off
    bridge-fd 0

iface vmbr0 inet6 auto

Dann wurde das Netzwerk neugestartet:

systemctl restart networking

4️⃣ LXC-Container für IPv6 fit machen

Einige meiner LXC-Container bekamen keine IPv6-Adresse. Das lag daran, dass accept_ra deaktiviert war. Die Lösung:

sysctl -w net.ipv6.conf.all.accept_ra=2
sysctl -w net.ipv6.conf.vmbr0.accept_ra=2

Diese Änderungen wurden dauerhaft gemacht:

echo "net.ipv6.conf.all.accept_ra=2" >> /etc/sysctl.conf
sysctl -p

Falls ein LXC-Container eine statische IPv6-Adresse bekommen sollte, wurde dies in der config-Datei des Containers (/etc/network/interfaces) angepasst.

Beispiel für eine statische IPv6-Adresse:

iface eth0 inet6 static
    address 2003:abcd:1234::100
    netmask 64
    gateway fe80::1

5️⃣ VMs und Smart-Home-Systeme auf IPv6 umstellen

5.1 Home Assistant & ioBroker IPv6-fähig machen

Nach der Proxmox-Umstellung mussten Home Assistant und ioBroker IPv6 nutzen. Ich habe die jeweiligen Netzwerkkonfigurationen geprüft und sichergestellt, dass die Dienste auf IPv6 lauschen.

Ein schneller Test:

ping6 google.com

Falls keine Verbindung bestand, wurde geprüft:

ip -6 route show default

Falls nötig, wurde die IPv6-Route manuell hinzugefügt.


5.2 Zigbee2MQTT und MQTT mit IPv6 nutzen

Da mein MQTT-Server (Mosquitto) jetzt auch IPv6 unterstützt, mussten die Verbindungen angepasst werden. Im Container oder in der VM:

cat /etc/mosquitto/mosquitto.conf

Falls Mosquitto nur auf IPv4 lauschte, wurde das geändert zu:

listener 1883 ::

Dann den Dienst neustarten:

systemctl restart mosquitto

6️⃣ ESP8266-Probleme mit IPv6 & Umstieg auf ESP32

Mein Smart-Home nutzt ESP8266* (bezahlter Link)– und ESP32-Boards* (bezahlter Link) für verschiedene Sensoren. Dabei stellte sich heraus, dass ESP8266* (bezahlter Link) kein natives IPv6 unterstützt!

Lösung: Umstieg auf ESP32* (bezahlter Link), der vollständige IPv6-Unterstützung bietet. Dafür musste der Code angepasst werden:

WiFi.enableIPv6();
Serial.println(WiFi.localIPv6());

➡ Danach konnte der ESP32 direkt mit IPv6 arbeiten! 🎉


7️⃣ Fazit: Lohnt sich IPv6 für das Smart Home?

Nach der Umstellung kann ich sagen: Ja!

Mein gesamtes Proxmox-System läuft jetzt mit IPv6Alle LXC-Container & VMs haben funktionierendes IPv6Home Assistant, ioBroker & MQTT arbeiten mit IPv6ESP8266 bleibt problematisch – ESP32 ist die Lösung und danke Matter ist die Umstellung auf IPv& sowieso unumgänglich.

Die Umstellung war nicht ganz trivial, aber hat sich gelohnt! Falls du Fragen hast oder selbst dein Smart Home auf IPv6 umstellen willst, schreib mir gerne einen Kommentar.