ITunes-Fernsteuerung aus FHEM (FHEM auf FritzBox, iTunes auf Mac): Unterschied zwischen den Versionen

Aus FHEMWiki
(Die Seite wurde neu angelegt: „Hier eine Lösung, um iTunes, das auf einem Mac läuft, aus fhem fernsteuern zu können. Auf dem mac wird dazu der webserver aktiviert und auf diesem ein php-…“)
 
Zeile 139: Zeile 139:
  <nowiki>set macmini sleep</nowiki>
  <nowiki>set macmini sleep</nowiki>
Viel Erfolg beim Einrichten!
Viel Erfolg beim Einrichten!
[[Kategorie:Code Snippets]]

Version vom 12. Mai 2013, 00:28 Uhr

Hier eine Lösung, um iTunes, das auf einem Mac läuft, aus fhem 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 ifgnorieren. Wenn das nicht klappt: Bitte googeln, welche Schritte zur Einrichtung des Servers erforderlich sind und dieses Wiki aktualisieren :)

1. In Systemeinstellungen den Webserver aktiviert (Häkchen setzen :)


2. 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

    3. Schliesslich webserver neu starten, dazu in terminal absetzen: sudo apachectl graceful

    php-Script auf dem Mac anlegen

    Ebenfalls gemäß o.g. Implementation-Guide Datei angelegt: /Users/Uli/Sites/control.php

    Als Vorlage hat mir das script im o.g. Implementation-Guide gedient. Da ich den Befehl mute nicht benötige, dafür aber shutdown, habe ich das script etwas angepasst. Dadurch fallen auch im o.g. Implementation-Guide 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:// http://]<mac-ip>:<port>/~<mac-username>/control.php?q=<command>


    also zB

    http://192.168.0.20:80/~Uli/control.php?q=playpause
    

    Wenn das problemlos funktioniert, kann nun das Abesenden dieser URL aus fhem heraus in Angriff genommen werden.

    Routine in 99_myUtils anlegen

    In die o.g. Datei (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) muss natürlich angepasst werden.


    devices und notifies in fhem.cfg anlegen

    Das o.g. Script bietet 8 Befehle. Damit das auf dem fhem-screen später nicht allzu wild aussieht, hab 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 fernsteuern. Auch können Schaltvorgänge in scripts eingebunden werden. In meinem ich-verlasse-die-Wohnung-Script steht zB

    set macmini sleep
    

    Viel Erfolg beim Einrichten!