User Tools

Site Tools


mailwake

Rechner einschalten mit Geofences, Uberspace und Wake-On-LAN

Irgendwann kommt einem einmal der Gedanke “ich habe doch ein Smartphone mit GPS und Netz, kann ich damit nicht meinen Rechner schon einmal einschalten, bevor ich zu Hause bin?”. Das soll hier erklärt werden.

Mit ifttt kann man Ereignisse (“ist morgen das Wetter schlecht?”) mit Aktionen (“schicke mir eine Nachricht”) verknüpfen. Das kann man auch hernehmen, um per Geofence und Mail beliebige Befehle zu starten.

Das Prinzip ist wie folgt:

  1. Mit der ifttt-App wird auf einem Smartphone ein Geofence definiert, mit der Aktion “schicke mir eine Mail”.
  2. Der Maildrop auf dem Uberspace bekommt die Mail und schaut nach, ob es eine durch den Geofence ausgelöste Mail ist.
  3. Wenn ja, ruft er eine auf dem heimischen Router laufende Webseite auf, die ein Wake-On-LAN Paket an den eigenen Rechner sendet.

Der Vollständigkeit halber sei erwähnt, dass ich außer der “ifttt”-App auch noch “Geofency” und “Geofancy” ausprobiert habe, wobei erstere mir den Tag über den Akku geleert und letztere schlichtweg nicht funktioniert hat. Beide Apps könnten HTTP-Calls direkt absetzen, womit sich der Umweg per Mail ersparen ließe.

Die Situation bei mir:

  • OpenWRT mit uhttpd, etherwake und lua, der aus dem Internet erreichbar ist (dynamisches DNS mit FreeDNS)
  • Maildrop zur Mailverarbeitung auf dem Uberspace
  • iPhone-ifttt-App für den Geofence

Falls du eine Anleitung für eine andere Umgebung schreiben möchtest, kopiere gerne soviel du magst.

Anleitung

Wake-On-LAN

Zuerst gilt es, den eigenen Rechner per Wake-On-LAN von außen erreichbar zu machen. Hierzu sollte sichergestellt sein, dass Wake-On-LAN überhaupt vom Zielrechner verarbeitet wird; das ist meistens im BIOS zu erledigen. Zum “wie” empfehle ich eine Websuche nach so etwas wie “enable wake on lan <motherboardname>”.

Nun müssen wir mit Hilfe des Routers das WOL-Paket generieren, ab hier bewegen wir uns auf der OpenWRT-Shell.

Das Paket etherwake wird als Abhängigkeit von luci-app-wol installiert, ist also vielleicht schon vorhanden. Falls nicht:

opkg update
opkg install etherwake

Wenn bis hierhin alles geklappt hat, sollte ein

/usr/bin/etherwake -D -i br-lan 11:22:33:44:55:66

den Rechner starten. br-lan ist durch den Interfacenamen in Richtung Rechner und 11:22:33:44:55:66 durch die MAC-Addresse zu ersetzen.

Nun die Verbindung von außen: Dies wird durch ein Lua-Skript realisiert, welches vom uhttpd bereitgestellt wird. Hierzu müssen wir die Konfiguration des Webservers etwas erweitern. In der /etc/config/uhttpd ist folgender Block einzufügen:

config uhttpd 'luacgi'
        list listen_http '0.0.0.0:12345'
        option home '/www/my/luacgi'
        option cgi_prefix '/'

Hierbei ist 12345 der Port, durch den von außen das WOL-Skript erreichbar sein soll, /www/my/luacgi ein Ort für eigene Webseiten. Beide Beispielwerte sollten mit Eigenen ersetzt werden. Mit

/etc/init.d/uhttpd reload

wird die Änderung aktiv.

Nicht vergessen, /www/my in die /etc/sysupgrade.conf einzutragen, da das sonst nach einem OpenWRT-Update weg ist. Je nach Einstellung ist der eben vergebene Port auch noch in der Router-Firewall (luci → Network → Firewall → Traffic Rules → Open ports on router) freizuschalten.

Nach /www/my/luacgi/wake.lua kommt folgendes Skript:

#!/usr/bin/lua
print("Status: 200 OK")
print("Content-Type: text/html")
print("")
local p = io.popen("/usr/bin/etherwake -D -i br-lan 11:22:33:4:55:66 2>&1 | logger -t geofence-uhttpd-wake")
p:close()

(Ein Teil des Codes stammt aus dem luci-Projekt, zu finden unter /usr/lib/lua/luci/model/cbi/wol.lua.) Zum Schluss muss das Skript mit

chmod +x /www/my/luacgi/wake.lua

noch ausführbar gemacht werden.

Nun sollte ein Browseraufruf wie http://meinname.meindyndnsservice.tld:12345/wake.lua den Rechner einschalten und in logread eine Ausgabe ähnlich

Thu Nov 20 13:02:31 2014 user.notice geofence-uhttpd-wake: The target station address is 11:22:33:44:55:66.
Thu Nov 20 13:02:31 2014 user.notice geofence-uhttpd-wake: Packet is  11 22 33 44 55 66 11 22 33 44 55 66 08 42 ff ff ff ff ff ff 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66.
Thu Nov 20 13:02:31 2014 user.notice geofence-uhttpd-wake: Sendto worked ! 116.

erzeugen.

Maildrop-Filter

Auf dem Uberspace müssen wir nun einen Filter auf eine einkommende Mail einstellen, der dann eben erstelltes lua-Skript aufruft. Hierbei gehe ich davon aus, dass ein Maildrop-Filter bereits erstellt ist; wenn nicht, hier die Anleitung.

Hierzu begeben wir uns auf die Shell des eigenen Uberspace und bearbeiten den Filter. Folgender Block ist einzufügen:

if ( (/^To:.*ifttt@meinedomain.tld/:h) && (/^Subject:.*geofence1-abc123/:h) && (/^.*def456.*$/:b) )
{
  `curl -s 'http://meinname.meindyndnsservice.tld:12345/wake.lua'`
  exit
}

Hierbei ist ifttt@meinedomain.tld die Ziel-Mailaddresse, geofence1-abc123 der Identifier für geofence #1 mit ID abc123, wobei im Body der Mail die Zeichenkette def456 auftauchen muss. Das dient alles dazu, dass wir die später von IFTTT kommende Mail eindeutig identifizieren können. abc123 bzw. def456 sollten durch eigene, zufällig gewählte Zeichenketten ersetzt werden. Der HTTP-Aufruf des Skriptes steht in den Backticks, mit exit wird die Verarbeitung abgebrochen. Effektiv wird damit das Skript aufgerufen und anschließend die Mail weggeworfen.

In Gänze schaut der Filter bei dann z.B. so aus, in der ~/.filter-default:

MAILDIR = "/home/meinuberspace/Maildir"
DEFAULT = "$MAILDIR/.catchall"
MAXSPAMSCORE= "3" 

logfile "/home/meinuberspace/.mailfilter-catchall.log"
xfilter "/usr/bin/spamc"

if ( /^X-Spam-Level: \*{$MAXSPAMSCORE,}$/)
{ 
  MAILDIR="$MAILDIR/.Junk"
  cc "$MAILDIR";
  `for x in ls -- "${MAILDIR}/new/"* ; do mv -- "$x" "${MAILDIR}/cur/${x##*/}:2,S"; done`
  exit
}

if ( (/^To:.*ifttt@meinedomain.tld/:h) && (/^Subject:.*geofence1-abc123/:h) && (/^.*def456.*$/:b) )
{
  `curl -s 'http://meinname.meindyndnsservice.tld:12345/wake.lua'`
  exit
}

to "$DEFAULT"

IFTTT-Verbindung

Zum Ende muss noch die IFTTT-Verbindung erstellt werden. Hierzu legen wir in der App ein neues Recipe an, mit Trigger iOS LocationYou enter an area und suchen einen Bereich für den Geofence aus. Als Action EmailSend me an email, und dann erst einmal mit Finish bestätigen. In den Einstellungen des Recipes ist noch der Text der Mail anzupassen, das schaut dann z.B. so aus:

Das sollte es dann auch schon gewesen sein. Viel Spaß damit!

Geofency-Nachtrag

Der erhöhte Akkuverbrauch war auf andere Apps zurückzuführen.

Hier also die Alternative, die besonders im Szenario “Handy in Hosentasche im Schlafmodus” zuverlässiger ist:

  1. Wake-On-LAN wie oben beschrieben einrichten
  2. Statt Maildrop und IFTTT aber dann in die Geofency-App:

Mit + neuen Geofence anlegen und dann bei Zahnrad → Webhook → Event/URL Settings → Entry Event → URL http://meinname.meindyndnsservice.tld:12345/wake.lua eintragen:

Das war es dann auch schon.

mailwake.txt · Last modified: 24.11.2014 16:02 by root