ITunes-Fernsteuerung aus FHEM (FHEM auf FritzBox, iTunes auf Mac)
Hier eine Lösung, um iTunes, das auf einem Mac läuft, aus FHEM heraus fernsteuern zu können.
Auf dem Mac wird dazu der Webserver aktiviert und auf diesem ein php-script realisiert, das seinerseits applescript-Befehle absetzt. FHEM setzt dann php-Befehle an den webserver des Mac ab.
Der Ansatz stammt von dieser Seite: Implementation-Guide und umfasst Schritte 1 und 2 dieser Anleitung.
Webserver auf dem Mac aktivieren
Habe ich nach dem o.g. Implementation Guide gemacht. Obwohl ich 'Respekt' vor diesem Schritt hatte, hat alles auf Anhieb funktioniert. In neueren OS X-releases gibt es evtl einige Parameter nicht mehr, dann einfach ignorieren. Wenn das nicht klappt: bitte googeln, welche Schritte zur Einrichtung des Servers erforderlich sind und dieses Wiki aktualisieren :)
- In Systemeinstellungen den Webserver aktiviert (Häkchen setzen :)
- Bearbeiten von /etc/apache2/httpd.conf in terminal mit
sudo pico /etc/apache2/httpd.conf
- uncommented LoadModule php5_module libexec/apache2/libphp5.so
- changed
** User _www ** Group _www
to
User Uli Group staff
- Extended
<IfModule dir_module>DirectoryIndex index.html</IfModule>
to
<IfModule dir_module>DirectoryIndex index.html index.php</IfModule>
- Speichern mit Control o
- Beenden mit Control X
- Schließlich Webserver neu starten mit folgendem Befehl (in einem Terminalfenster):
sudo apachectl graceful
php-Script auf dem Mac anlegen
Ebenfalls gemäß o.g. Implementation-Guide Datei angelegt: /Users/Uli/Sites/control.php
Als Vorlage dient dazu Script aus dem Implementation-Guide gedient. Da ich den Befehl mute nicht benötige, dafür aber shutdown, habe ich das script etwas angepasst. Dadurch fallen auch die Schritte weg, die sich auf volume.txt beziehen, denn das wird nur für mute benötigt. Hier also die angepasste Version des applescripts:
<head> </head> <body> <? $q = $_GET['q']; switch ($q) { case "": echo "You need to send me a command, then I shall execute it"; break; case "play": exec("osascript -e 'tell app \"iTunes\" to play'"); echo "Playing"; break; case "pause": exec("osascript -e 'tell app \"iTunes\" to pause'"); echo "Pausing"; break; case "playpause": exec("osascript -e 'tell app \"iTunes\" to playpause'"); echo "Toggling Play"; break; case "next": exec("osascript -e 'tell app \"iTunes\" to next track'"); echo "Next Track"; break; case "prev": exec("osascript -e 'tell app \"iTunes\" to previous track'"); echo "Previous Track"; break; case "louder": exec("osascript -e 'tell app \"iTunes\" to set sound volume to sound volume + 5'"); echo "Turning Up the Volume"; break; case "quieter": exec("osascript -e 'tell app \"iTunes\" to set sound volume to sound volume - 5'"); echo "Turning Down the Volume"; break; case "shutdown": exec("osascript -e 'tell app \"System Events\"' -e 'shut down' -e 'end tell'"); echo "Shutting down..."; break; case "sleep": exec("osascript -e 'tell app \"System Events\"' -e 'sleep' -e 'end tell'"); echo "Sending to sleep..."; break; } ?> </body>
Zum Testen, einfach von irgendeinem Rechner im Heimnetzwerk versuchen, das Script zu triggern. Dazu im Browser des Rechners (nicht des Mac) eine URL nach folgendem Schema eingeben:
[http://]<mac-ip>:<port>/~<mac-username>/control.php?q=<command>
also z.B.
http://192.168.0.20:80/~Uli/control.php?q=playpause
Wenn das problemlos funktioniert, kann nun das Absenden dieser URL aus FHEM heraus in Angriff genommen werden.
Routine in 99_myUtils anlegen
In die Datei 99_myUtils (angelegt nach Wiki 99_myUtils anlegen) habe ich folgende Routine eingefügt:
######## doiTunes ############### sub doiTunes($) { my $dev = shift; my $cmd = Value("$dev"); my $xml = GetHttpFile("macmini.fritz.box:80", "/~Uli/control.php?q=" . $cmd); fhem "setstate $dev >"; }
Adresse und Pfad (username) müssen natürlich angepasst werden.
Device(s) und Notify(s) in fhem.cfg anlegen
Das o.g. Script bietet 8 Befehle. Damit das auf dem fhem-screen später nicht allzu wild aussieht, habe ich die Befehle auf zwei virtuelle Geräte namens iTunes bzw. macmini mit jeweils vier Befehlen verteilt.
define iTunes dummy attr iTunes webCmd play:pause:next:prev define n_iTunes notify iTunes {doiTunes("@");;} define macmini dummy attr macmini webCmd louder:quieter:sleep:shutdown define n_macmini notify macmini {doiTunes("@");;}
Damit lassen sich iTunes und der Mac aus FHEM heraus fernsteuern. Es können auch Schaltvorgänge in Scripts eingebunden werden. In meinem 'ich-verlasse-die-Wohnung-Script steht z.B.
set macmini sleep
Viel Erfolg beim Einrichten!