ITunes-Fernsteuerung aus FHEM (FHEM auf FritzBox, iTunes auf Mac)

Aus FHEMWiki
Info green.pngSeit Mitte 2013 gibt es das Modul 33_iTunes.pm, das anstelle der unten gezeigten Lösung verwendet werden kann und mit dem sich eine iTunes-Steuerung aus fhem heraus realisieren lässt (incl. Cover-Anzeige und Airplay-Speaker-Steuerung). Dabei ist es egal, auf welchem Rechner fhem und auf welchem iTunes läuft. Das Modul erlaubt es iTunes und AppleTV Geräte Gen.1 und Gen.2 von FHEM aus zu steuern.

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!