Wake On LAN mit MQTT auslösen

Broadcast

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!

Broadcast

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…