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!

Teamspeak Server unter Proxmox installieren – Schritt-für-Schritt-Anleitung

Warum einen eigenen Teamspeak Server auf Proxmox hosten?

Ein eigener Teamspeak Server unter Proxmox bietet volle Kontrolle, Datenschutz und eine zuverlässige Sprachkommunikation ohne Abhängigkeit von externen Hostern. Deshalb ist es eine großartige Lösung für Nutzer, die Wert auf Unabhängigkeit legen. In dieser Anleitung zeigen wir dir, wie du eine Debian-VM unter Proxmox installierst und darauf einen Teamspeak 3 Server mit Firewall-Schutz (UFW) einrichtest. So kannst du deinen eigenen Server optimal betreiben und sicher nutzen.


1. Teamspeak Server unter Proxmox installieren: Debian-VM vorbereiten

1.1 Erstellen der virtuellen Maschine

  1. Melde dich bei Proxmox an.
  2. Erstelle eine neue VM mit folgenden Einstellungen:
    • Betriebssystem: Debian 12 (Netinst-ISO von debian.org)
    • CPU: 2 vCPUs
    • RAM: 2 GB (oder mehr für größere Teams)
    • Festplatte: 10 GB (je nach Bedarf)
    • Netzwerk: Virtuelles Netzwerkgerät (Bridged für externe Erreichbarkeit)
  3. Starte die VM und installiere Debian mit den Standardoptionen, damit dein Server schnell einsatzbereit ist.

1.2 Nach der Installation: Einrichten von sudo und Updates

Sobald das System hochgefahren ist, melde dich als root an und installiere sudo:

apt update &amp;&amp; apt install sudo -y

Danach kannst du einen neuen Benutzer anlegen. Falls du möchtest, kannst du ihn ts nennen, aber du kannst natürlich auch einen anderen Namen wählen:

adduser ts

Damit dieser Benutzer administrative Rechte erhält, fügst du ihn zur sudo-Gruppe hinzu:

usermod -aG sudo ts

Nun kannst du dich als dieser Benutzer anmelden und alle weiteren Schritte ausführen:

su - ts

1.3 System vorbereiten

Um dein System sicher und aktuell zu halten, solltest du regelmäßig Updates durchführen. Dies ist besonders wichtig, wenn dein Server öffentlich erreichbar ist. Aktualisiere dein System mit folgendem Befehl:

sudo apt update &amp;&amp; sudo apt upgrade -y

So stellst du sicher, dass dein Server auf dem neuesten Stand bleibt.


2. Installation und Einrichtung des Teamspeak Servers unter Proxmox

2.1 Teamspeak herunterladen und installieren

Damit dein Server läuft, benötigst du die aktuellste Teamspeak 3 Server-Version. Diese kannst du direkt aus dem Internet herunterladen:

cd ~
wget https://files.teamspeak-services.com/releases/server/3.13.7/teamspeak3-server_linux_amd64-3.13.7.tar.bz2

Nach dem Download entpackst du die Datei und verschiebst sie an den passenden Speicherort:

tar -xjf teamspeak3-server_linux_amd64-3.13.7.tar.bz2
sudo mv teamspeak3-server_linux_amd64 /opt/teamspeak

Nun müssen noch die richtigen Berechtigungen gesetzt werden, damit der Benutzer ts Zugriff auf den Server hat:

sudo chown -R ts:ts /opt/teamspeak

Bevor du fortfährst, akzeptiere die Lizenzbedingungen, um den Betrieb zu ermöglichen:

echo "license_accepted=1" > /opt/teamspeak/.ts3server_license_accepted

2.2 Erster Start des Teamspeak Servers

Jetzt kannst du den Server starten, indem du folgende Befehle ausführst:

cd /opt/teamspeak
./ts3server_startscript.sh start

Beim ersten Start wird ein Admin-Token generiert. Bewahre diesen gut auf, denn du benötigst ihn für die Verwaltung deines Servers.

Teamspeak Server Admin-Token

Falls der Server erfolgreich gestartet wurde, kannst du ihn testweise stoppen:

./ts3server_startscript.sh stop

2.3 Automatischer Start mit systemd

Damit dein TeamSpeak-Server bei jedem Neustart automatisch startet, richtest du einen systemd-Service ein:

sudo nano /etc/systemd/system/teamspeak.service

Füge diesen Inhalt ein:

[Unit]
Description=TeamSpeak 3 Server
After=network.target

[Service]
WorkingDirectory=/opt/teamspeak
User=ts
Group=ts
ExecStart=/opt/teamspeak/ts3server
ExecStop=/bin/kill -TERM $MAINPID
Restart=always
PIDFile=/opt/teamspeak/ts3server.pid

[Install]
WantedBy=multi-user.target

Speichere die Datei mit CTRL+X, dann Y und drücke Enter. Anschließend lädst du systemd neu und aktivierst den Service mit:

sudo systemctl daemon-reload
sudo systemctl enable --now teamspeak

Überprüfe nun den Status des Services, um sicherzustellen, dass alles funktioniert:

sudo systemctl status teamspeak

3. Teamspeak Server unter Proxmox absichern mit UFW

Eine Firewall ist essenziell, um deinen Server vor Angriffen zu schützen. Dafür eignet sich UFW (Uncomplicated Firewall) besonders gut.

3.1 UFW installieren

Falls UFW noch nicht installiert ist, kannst du dies mit folgendem Befehl nachholen:

sudo apt install ufw -y

3.2 Wichtige Ports freigeben

Damit dein Teamspeak-Server korrekt funktioniert, musst du die benötigten Ports freigeben. Das kannst du mit den folgenden Befehlen tun:

sudo ufw allow 9987/udp   # Sprach-Chat
sudo ufw allow 30033/tcp  # Dateiübertragung
sudo ufw allow 10011/tcp  # ServerQuery Interface

Falls du per SSH auf den Server zugreifst, stelle sicher, dass Port 22 weiterhin offen bleibt, damit du nicht ausgesperrt wirst:

sudo ufw allow 22/tcp

3.3 Firewall aktivieren & Status prüfen

Nachdem du alle benötigten Ports freigegeben hast, kannst du UFW aktivieren:

sudo ufw enable

Prüfe den aktuellen Status der Firewall, um sicherzugehen, dass alles richtig konfiguriert ist:

sudo ufw status verbose

Falls du später Regeln ändern oder entfernen möchtest, kannst du dies mit:

sudo ufw delete allow &lt;port/protokoll>

Fazit: Teamspeak Server unter Proxmox erfolgreich eingerichtet

Debian VM erfolgreich installiert und vorbereitetTeamspeak 3 Server unter Proxmox eingerichtet und als Dienst konfiguriertFirewall (UFW) aktiviert und abgesichert

🔗 Jetzt kannst du dich mit deinem Teamspeak-Client verbinden! Falls dein Server aus dem Internet erreichbar sein soll, stelle sicher, dass die Portweiterleitung in deinem Router korrekt eingerichtet ist.

🚀 Viel Spaß mit deinem eigenen Teamspeak Server unter Proxmox! 🎧

Weitere Ressourcen

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.