Wake On LAN mit MQTT auslösen
Diese Anleitung setzt einen funktionierenden MQTT Service (z.B. Mosquitto) voraus!
Vorwort / Idee
Wake On LAN ist eine gängige Praxis um Geräte über das Netzwerk einzuschalten. In den meisten Fällen funktioniert dies allerdings nur in der selben Layer2-Domäne. Ist der auslösende Server / Dienst isoliert, kann dieser Geräte aus anderen Netzwerken nicht aktivieren.
Ein konkretes Szenario könnte sein:
- LG TV (wird mit WOL angeschaltet)
- HomeAssistant ist in einem isolierten Docker-Netzwerk, somit einer eigenen Layer2-Domäne
Anstatt HomeAssistant in das interne Netz (per Host-Network oder entsprechendem Interface) zu packen, kann das Senden von WOL-Paketen auch über ein Python-Script erfolgen.
Dieses hat ein Bein im benötigen Netzwerk und kann WOL Pakete hinein senden.
Grundsätzlich ist dieses Konstrukt nicht auf HomeAssistant beschränkt und kann auch zum steuern mehrerer Netzwerke angewendet werden, die man zentral steuern möchte…
Funktionsweise
graph LR; A[HomeAssistant] --> |sendet MAC-Adresse an Topic wol-proxy/command| B(MQTT Service 192.168.1.55) D(MQTT Service TOPIC: wol-proxy/command) --> |liest MAC-Adresse aus Topic wol-proxy/command| C[Python Daemon] C[Python Daemon] --> |WOL Magic Paket via Broadcast| E(LG TV) C[Python Daemon] --> |Status schicken in Topic wol-proxy/status| D(MQTT Service)
Docker Image bauen
Ich möchte kein öffentliches Image anbieten, weil der bau einfach ist und fix lokal erfolgen kann.
Es wird LinuxServer.IO als Basis verwendet, Python installiert und die nötigen Python-Pakete installiert.
git clone https://github.com/dr3st/WOL-proxy
cd WOL-proxy
docker build -t wol-proxy:latest
Konfiguration
Ich verwende docker-compose um den Dienst zu starten. Die IP-Adressen und Logindaten müssen auf die lokalen Gegebenheiten angepasst werden!
WOL_BROADCAST_ADDR muss die Broadcast-Adresse (letzte IP-Adresse des Netzwerks) sein, keine Geräte-IP!
version: "3"
services:
wol-proxy:
image: wol-proxy:latest
container_name: wol-proxy
network_mode: host
environment:
MQTT_BROKER_HOST: "192.168.1.55"
WOL_BROADCAST_ADDR: "10.44.33.255"
MQTT_USERNAME: "wol"
MQTT_PASSWORD: "REPLACE_PASSWORD"
MQTT_TOPIC_PREFIX: "wol-proxy"
MQTT_CLIENT_ID: "wol"
restart: unless-stopped
Start
docker-compose up -d
Erzeugung eines WOL Pakets
Zum Erzeugen eines WOL-Pakets muss die MAC-Adresse als Message in das Topic wol-proxy/command
geschrieben werden.
HomeAssistant kann dies übernehmen, weil es eine MQTT Integration hat.
Nutzt man beispielsweise bereits Z2M (Zigbee2MQTT), ist die Integration schon gegeben, ansonsten nachlesen wie es einzurichten ist.
Die MAC-Adresse des einzuschaltenden Geräts kann folgenden Format haben:
- aa:bb:cc:dd:ee:ff
- aa-bb-cc-dd-ee-ff
- aa.bb.cc.dd.ee.ff
Anmerkung
Möchte man mehrere Layer2 Netze mit diesem System steuern, kann in jedes Netz ein Python Daemon (Docker Container) eingebunden werden.
Jeder Daemon sollte dann einen eigenen MQTT Topic Prefix erhalten, damit dieser nur Nachrichten die für sein Netz vorgesehen sind verbeitet.
So kann aus einer zentralen MQTT Stelle jedes Netz mit WOL Nachrichten versehen werden und man spart sich Konfigurationen wie L2 Proxies oder Re-Transmissions die einige Router / Firewalls anbieten…
Links
-
Fork mit Docker
https://github.com/dr3st/WOL-proxy -
original Projekt
https://github.com/seanauff/WOL-proxy