Kodi mit Wake-on-LAN starten

Ein Raspberry Pi ist vielseitig einsetzbar! Zurzeit nutze ich einen Pi 3b als „microserver“ zur Dateisynchronisation, als VPN Server und als Mediacenter mit Kodi.

Aber: die Ressourcen sind limitiert, und wenn etwas nicht benötigt wird dann sollte es möglichst keinen Speicher und keine CPU-Zeit verwenden. Kodi ist da ein ganz guter Kandidat für Optimierung: im Leerlauf belegt die Anwendung gute 100 MB. Wie also Kodi möglichst bequem starten, damit es nur läuft wenn es benötigt wird?

Kore

Ich nutze bereits die App Kore um das Mediacenter fernzusteuern. Diese hat eine „Aufwecken“-Funktion integriert. Aber wie funktioniert die eigentlich? Die Anleitung liefert den passenden Hinweis: mittels Wake-on-LAN (WoL). Unterstützt die Netzwerkkarte diese Funktion, dann kann ein PC im lokalen Netzwerk aus dem Schlafzustand geholt werden. Dies geschieht mittels eines magischen Aufwackpakets. Drückt man in Kore auf den „Aufwecken“-Button wird genau dieses Paket abgesendet. Bleibt nur noch die Frage, wie man Kodi startet, wenn das WoL-Paket ankommt, denn aufgeweckt werden muss der Pi nicht: er läuft die ganze Zeit.

Kore UI mit Aufwecken-Knopf

Scripting

Nichts leichter als das: wir schreiben einen kleines Skript, das auf dem passenden Port nach WoL-Paketen horcht und dann entsprechend reagiert. Auf Wikipedia wird das Magic packet genauer beschrieben: es besteht der sechsmaligen Wiederholung des Bytes 0xFF und der 16-maligen Wiederholung der MAC-Adresse des Zielgeräts. Ferner wird es oft per UDP an Port 9 gesendet.

Binden wir also einen Python socket an die passende Adresse:

from socket import *

HOST = "0.0.0.0"
WAKE_ON_LAN_PORT = 9

s = socket(AF_INET, SOCK_DGRAM) # UDP
s.bind((HOST, WAKE_ON_LAN_PORT))

Dann warten wir in einer Endlosschleife auf neue Pakete und beenden das Skript, falls das passende Paket ankommt:

while True:
    data = s.recv(1024)

    if len(data) == 102 \
            and data[:6] == bytes([0xff]) * 6 \
            and data[6:] == MAC * 16:
        sys.exit(0)

sys.exit(-1)

Die vollständige Version findet sich auf Github, sie enthält auch Code zur dynamischen Bestimmung der MAC-Adresse sodass die Konstante MAC nicht manuell gesetzt werden muss.

Wenn wir nun python3 wolscript.py ausführen, wartet der Befehl bis ein WoL-Paket ankommt und gibt uns dann den Wert 0 zurück. Jetzt fehlt nur noch ein Bash-Skript dass Kodi startet wenn genau dies eintritt:

#!/bin/bash

while true; do

returnval=1
while [[ $returnval != 0 ]]; do
  python3 /home/pi/Scripts/wolscript.py
  returnval=$?
done
echo Received WOL, starting KODI

sudo -u kodi kodi
echo KODI terminated

done

Hier wird kodi von einem eigenen (gleichnamigen) Benutzer aufgerufen, was die Rechteverwaltung erleichtert aber eventuell für andere Systeme angepasst werden muss.

Zusammenfassung

Dieser kleine Hack tut was er soll: Kodi kann in Kore über „Aufwecken“ gestartet und über „Verlassen“ gestoppt werden und verbraucht nur dann Ressourcen, wenn ich das wirklich möchte. Der vollständige Code findet sich in einem Git-Repo.

Kommentare

Um einen Kommentar hinzuzufügen, schreibe eine E-Mail mittels dieses Links.