Ankündigung

Einklappen
Keine Ankündigung bisher.

iTunes | Steuerung via Script über WebServer | Edomi

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    #61
    Warum nicht einfach "Klartext" senden (itunes/volume=50)
    Na ja, wenn ich mit der Mauseingabe 50 auswähle dann fülle ich eine GA mit dem Wert 50, diese GA hat eine KO-ID, diese ID ist meine Variable die ich per HTTP an MBP schicke, diesen HTTP nimmt der Apache am MBP entgegen und liest die 50 aus startet das richtige Apple-Skript mit der Option 50 … der Regler geht auf 50% der Lautstärke …
    Der Wert 50 ist halt dynamisch - kann zwischen 0 und 100 liegen … den kann ich nicht hardcodieren ...

    Hier der HTTP von EDOMI an MBP (Apache):
    Code:
    http://10.0.100.150/~dariusz/iControl.php?[B]c[/B]=[COLOR=#FF0000]apvolume[/COLOR]&[B]p1[/B]=Computer&[B]p2[/B]=30

    Und hier der PHP am MBP:
    Code:
    <head>
     </head>
     <body>
     <?
     $command = $_GET['[B]c[/B]'];
     $[COLOR=#0000FF]par1[/COLOR] = $_GET['[B]p1[/B]'];
     $[COLOR=#0000FF]par2[/COLOR] = $_GET['[B]p2[/B]'];
     
     switch ($command)
        {
            break;    
        case "play":
            exec("osascript /Applications/MiniMMC/HsRepeat/TriggeredScripts/iTunesPlay.scpt");
            echo "Playing";
            break;
        case "pause":
            exec("osascript /Applications/MiniMMC/HsRepeat/TriggeredScripts/iTunesPause.scpt");
            echo "Pausing";
            break;
        case "next":
            exec("osascript /Applications/MiniMMC/HsRepeat/TriggeredScripts/iTunesSkipForward.scpt");
            echo "Next Track";
            break;
        case "prev":
            exec("osascript /Applications/MiniMMC/HsRepeat/TriggeredScripts/iTunesSkipBack.scpt");
            echo "Previous Track";
            break;
        case "stop":
            exec("osascript /Applications/MiniMMC/HsRepeat/TriggeredScripts/iTunesStop.scpt");
            echo "iTunes Stop";
            break;
        case "playpause":
            exec("osascript /Applications/MiniMMC/HsRepeat/TriggeredScripts/iTunesPlayPause.scpt");
            echo "iTunes PlayPause";
            break;
           case "apdevice":
            exec("osascript /Applications/MiniMMC/HsRepeat/TriggeredScripts/ApSpeakerOnOff.scpt $par1");
            echo "Turning AP Speaker $par1 OnOff";
            break;  
           case "[COLOR=#FF0000]apvolume[/COLOR]":
            exec("osascript /Applications/MiniMMC/HsRepeat/TriggeredScripts/SetApDeviceVolumeEDOMI.scpt $[COLOR=#0000FF][B]par1[/B][/COLOR] $[COLOR=#0000FF][B]par2[/B][/COLOR]");
            echo "Set AP Speaker Volume $par1 to $par2";
            break;    
        case "equalizer":
            exec("osascript /Applications/MiniMMC/HsRepeat/TriggeredScripts/SetEQPreset.scpt $par1");
            echo "Select Equalizer $par1";
            break;
        case "playlist":
            exec("osascript /Applications/MiniMMC/HsRepeat/TriggeredScripts/SetPlayList.scpt '$par1'");
            echo "Play Playlist $par1";
            break;        
        case "mainvolume":
            exec("osascript /Applications/MiniMMC/HsRepeat/TriggeredScripts/SetMasterVolume.scpt '$par1'");
            echo "Set Main Volume to $par1";
            break;        
        case "mainlouder":
            exec("osascript /Applications/MiniMMC/HsRepeat/TriggeredScripts/SetMasterVolumePlus.scpt");
            echo "Turning Up Main Volume";
            break;
        case "mainquieter":
            exec("osascript /Applications/MiniMMC/HsRepeat/TriggeredScripts/SetMasterVolumeMinus.scpt");
            echo "Turning Down Main Volume";
            break;        
        case "aplouder":
            exec("osascript /Applications/MiniMMC/HsRepeat/TriggeredScripts/SetApDeviceVolumePlus.scpt '$par1'");
            echo "Turning Up AP Volume";
            break;
        case "apquieter":
            exec("osascript /Applications/MiniMMC/HsRepeat/TriggeredScripts/SetMasterVolumeMinus.scpt '$par1'");
            echo "Turning Down AP Volume";
            break;
        case "mute":
            exec("osascript /Applications/MiniMMC/HsRepeat/TriggeredScripts/ApSpeakerMute.scpt '$par1'");
            echo "Mute $par1";
            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;
        case "restart":
            exec("osascript -e 'tell app \"System Events\"' -e 'restart' -e 'end tell'");                            
            echo "Restarting...";
            break;    
        case "dencom":    
            exec("osascript /Applications/MiniMMC/HsRepeat/HsDenonSet.app $par1 '$par2'");
            echo "Denon AVR: $par1 $par2";
            break;
        case "onkcom":    
            exec("osascript /Applications/MiniMMC/HsRepeat/HsOnkyoSet.app $par1 '$par2'");
            echo "Onkyo AVR: $par1 $par2";
            break;
        }
     ?>
     </body>
    Zuletzt geändert von coliflower; 28.01.2016, 00:20.
    Danke und LG, Dariusz
    GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

    Kommentar


      #62
      Nee, ich meine die Kommunkation zw. Deinem Script und EDOMI Statt einzelne KOs per HTTP-Steuerung zu setzen, könnte man doch genau ein(!) KO für alles nehmen... Beispiel:

      Laustärke wurde geändert: http....{ID des SuperKOs}=get|volume|45
      Play-Status geändert: http....{ID des SuperKOs}=get|play|1
      usw.

      Und nun kommt ein entsprechender LBS ins Spiel, der dieses "SuperKO" dann auswertet:
      Aus dem String "get|volume|45" konstruiert der LBS dann die Belegung seiner Ausgänge, z.B. A1 wird immer auf die aktuelle Lautstärke (45) gesetzt, A2 = PlayStatus, usw.

      In "Senderichtung" (EDOMI -> Apple) könnte man es analog machen, d.h. 1 KO definiert den "Befehl" ("apvolume") und 1 KO den Wert - so hast Du es doch im Prinzip schon gelöst...

      Zuletzt geändert von gaert; 28.01.2016, 09:31.
      EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

      Kommentar


        #63
        Na ja, das Senden von Edomi and MBP ist ja grundsätzlich nicht das Problem ...

        Das Thema ist - wie kann ich sicherstellen, dass die ID die ich vom MBP an Edomi übergeben möchte immer gleich ist. Wenn ich z.B. für den Lautsprecher "Computer" die Lautstärke "50" übergeben möchte, damit in der VISU der aktuelle Wert auf 50 aktualisiert wird ?

        Bei mir stehen die 375 (3/1/2 DPT5) = für Computer/50 wenn ich den unteren HTTP an Edomi abschicke (bei anderen Usern ist die KO-ID vielleicht "100")

        Möglicherweise steht die Lösung bereits in den Antworten und ich sehen den Wald vor lauter Bäumen nicht mehr

        Irgendwie fehlt mir der Ansatz eine für "ALLE" universale Lösung zu finden, außer meine KO-IDs anzulegen und diese im Skript hardcodieren ... unsmart, deshalb habe ich nach Konstanten gefragt ...

        Sorry wenn ich das Thema zu viel strapaziere

        EDIT
        unsere Posts haben sich gerade überschnitten, sorry
        Danke und LG, Dariusz
        GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

        Kommentar


          #64
          Genau das versuche ich Dir ja zu vermitteln

          Statt VIELE KOs vom MBP zu EDOMI zu senden, würde ich mich auf EIN KO beschränken. Und der INHALT dieses KOs definiert dann, was passieren soll. Also NICHT KO(1..n)=Wert, sondern KO="Befehl+Wert"... Auf EDOMI-Seite muss dieser "Befehls-String" dann natürlich per speziellem LBS zerbröselt werden.
          EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

          Kommentar


            #65
            Hallo Christian,

            das hört sich gut an, funktioniert das auch wenn ich mehrere AirPlay Lautsprecher habe ?
            Muss ich dann für jeden Lautsprecher so eine Super-KO-ID + LBS erstellen ?
            Danke und LG, Dariusz
            GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

            Kommentar


              #66
              Das funktioniert noch gar nicht, weil kein LBS vorhanden ist - den musst Du erstmal basteln

              Die Anzahl der Lautsprecher etc. ist doch vollkommen Wurscht - der LBS muss diese ganz eigene "Syntax" parsen und entscheidet was passiert...
              EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

              Kommentar


                #67
                Auf EDOMI-Seite muss dieser "Befehls-String" dann natürlich per speziellem LBS zerbröselt werden.
                Also ist es doch via LBS den String aus Post #35 zu zerlegen - das wäre so ein SUPER-String

                ’ApLs011100ApLs020000ApLs030000ApLs040000ApLs05105 8ApLs060000ApLs070000ApLs080000ApLs090000ApLs10000 0MasVol100'
                Danke und LG, Dariusz
                GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                Kommentar


                  #68
                  Richtig - wie auch immer der String aufgebaut ist: Der LBS zerhackt den String und setzt seine Ausgänge entsprechend. Aber Achtung: Ein KO kann max. 200 Zeichen enthalten! Der String darf also nicht zu lang sein, sonst wird abgeschnitten...

                  Oder wie schon gesagt: Einen EXEC-LBS programmieren, der auf einem UDP-Socket auf Befehle lauscht... Dann bleibt quasi alles beim Alten mit Deinen Scripten.
                  EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

                  Kommentar


                    #69
                    Hallo Christian,

                    DANKE für deine Geduld

                    Aus deiner Praxi, um es im LBS gut zerhacken/zerlegen zu können - wie müsste so ein Sting von MBP an EDOMI aus deiner Sicht aussehen, muss auf etwas bedacht genommen werden um negative Einflüsse ausschließen zu können (außer die 200 Zeichen) ?

                    z.B.: ???
                    Das wären 10 Lautsprecher x 10 Zeichen = 100 + 34 für die Steuerung

                    MasVol100Ap1Ls01100 … Ap1Ls10100EA1P1U1S1T1A001I001L01E01
                    MasVol100 = Master Volume 100%
                    Ap1Ls01 = AirPlayLautsprecher 01 (von 10 Stück), AN = Ap1
                    100 = 100% Lautstärke LS1
                    EA1 = iTunes AN (AUS)
                    Play = P1 aktiv
                    Pause = U1 aktiv
                    Stop = S1 aktiv
                    Track = T1
                    Album = A001
                    Interpret = I001
                    Playlist = L01
                    Equalizer = E01

                    Code:
                    10x Airplay Lautsprecher, On/Off
                    10x Airplay Lautsprecher, Volume
                    1x   Master Volume
                    9x   iTunes (iTunes Off, Play, Pause, Stop, Track, Album, Interpret, Playlist, Equalizer)
                    DANKE !!
                    Danke und LG, Dariusz
                    GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                    Kommentar


                      #70
                      Was weiß ich - Hauptsache der LBS kann den String sinnvoll interpretieren. Ich würde es z.B. in dieser Art lösen:

                      MV=100,AP1=1,LS1=100,...

                      Sprich: Kurze "Namen" und z.B. per Komma separiert. Macht das Parsen leichter

                      Aber wie schon gesagt: Was spricht gegen einen UDP-Listener-LBS, der an seinen Ausgängen gleich die entsprechenden Werte liefert?! Abgesehen von der Programmierung - aber für diese String-Variante muss ja auch ein LBS erstellt werden...
                      EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

                      Kommentar


                        #71
                        Nochmals danke Christian !

                        Ich bin gerade an lesen deiner Dockubeispiele zum Thema Logikbausteine, als Newbie geht das ein bissi langsam, php.net unterstütz mich :-)

                        Falls du mal etwas Zeit für nicht so Wichtiges findest
                        Ich versuche es in PROSA ...

                        Wenn ich zu Anfang nur ein paar Funktionen realisieren möchte | PLAY, PAUSE, STOP | dann wären das meine drei AUSGÄNGE die ich in ###DEF### anlege und in ###LBS### die Bedingungen setze, wie WENN z.B. E1 ein durch ein UDP getriggert wird, DANN grundsätzlich zum Ausgang oder wie im Beispiel zum ###EXEX### Teil „leiten“ und erst dann zum Ausgang … ich hoffe ich habe das einigermaßen richtig verstanden ...

                        Brauche ich da nur den einen EINGANG an den ich ich „horche“ oder muss ich noch weitere Eingänge zur Steuerung des LBS für iTunes berücksichtigen ?

                        Ob ich den String zum Parsen am Eingang erhalte oder den LBS mit UDP-Listener anwende ….?

                        Beim UDP-Listener muss ich doch die Pakete folgendermaßen empfangen, richtig oder wie soll ich das machen ?
                        ich sende von Mac an Edomi
                        Code:
                        echo 'Play=1 | nc 10.0.100.8 12345’
                        iTunes = Play
                        Stauts = 1 (läuft)
                        via netcat
                        Port 12345

                        Ist der UDP-Listener außer den Code in EXEC-Teil unten noch ein weiterer Code den ich brauche ?

                        Die VERARBEITUNG der Information die ich dann erhalte z.B.: „Play=1“, die mache ich dann in den ###EXEC### Teil - Parsen - richtig ?

                        Wäre dass dann irgendwas in diesem Stil ?

                        Code:
                        if ($E=getLogicEingangDataAll($id))
                        
                        $itunes = $E[1]['value‘];
                        
                        $mystring = file_get_contents(„$itunes“);
                        $aktion = strstr($mystring, '=');
                        $wert = strstr($mystring, '=', true);
                        
                        setLogicLinkAusgang($id, 1, $wert);  // hier sollte der Wert 1 als Status am Ausgang 1 an den BUS geschickt werden 
                        
                        setLogicElementStatus($id, 0);
                        Danke und LG, Dariusz
                        GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                        Kommentar


                          #72
                          Oder doch eher anders:

                          Anstatt:
                          Code:
                          if ($E=getLogicEingangDataAll($id))
                          $itunes = $E[1]['value‘];
                          $mystring = file_get_contents(„$itunes“);
                          
                          $aktion = strstr($mystring, '=');
                          $wert = strstr($mystring, '=', true);
                          
                          setLogicLinkAusgang($id, 1, $wert); // hier sollte der Wert 1 als Status am Ausgang 1 an den BUS geschickt werden
                          
                          setLogicElementStatus($id, 0);

                          So:
                          z.B.: der String der an den LBS übergeben wird: Play=1&Pause=0&Stop=0
                          Code:
                          if ($E=getLogicEingangDataAll($id)) 
                          $itunes = $E[1]['value‘]; $mystring = file_get_contents(„$itunes“);
                          ​$mystring = file_get_contents(„$itunes“);
                          
                          $aktion = parse_str($mystring, $output);
                          
                          $play = $output['Play']
                          $pause = $output['Pause']
                          $stop = $output[’Stop']
                          
                          setLogicLinkAusgang($id,1, $play)
                          setLogicLinkAusgang($id,2, $pause)
                          setLogicLinkAusgang($id,3, $stop)
                          
                          setLogicElementStatus($id, 0);
                          Danke und LG, Dariusz
                          GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                          Kommentar


                            #73
                            Sorry, aber im Moment fehlt mir einfach die Zeit mich mit diesem recht speziellen "Problem" auseinanderzusetzen... Sei mir bitte nicht böse!

                            Ich würde Dir wie gesagt empfehlen, "einfach" einen UDP-Listener-LBS zu bauen und die UDP-Datagramme entsprechend den Vorgaben des vorhandenen Apple-Scripts auszuwerten. Dann müsste nämlich clientseitig quasi nichts geändert werden und EDOMI würde sich dann wie der HS verhalten.
                            EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

                            Kommentar


                              #74
                              Sei mir bitte nicht böse!
                              Warum sollte ich ? Absolut nicht, wenn du Zeit hast dann hast du Zeit, es gibt wirklich Wichtigeres ;-) !!

                              Der UDP-Listener wird es eh werden, der String muss trotzdem zerlegt werden, weil das die komplette Rückmeldung aller Zustände in iTunes ist - wird zyklisch versendet.

                              Schönen Abend noch !!
                              Danke und LG, Dariusz
                              GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                              Kommentar


                                #75
                                Hallo zusammen,

                                vielleicht kann mir hier jemand weiter helfen … oder zumindest einen Schubses in die richtige Richtung geben ?

                                Unten der Code mit einem - hoffe ich richtigen - „UDP-Listener“ ...

                                Es fehlt mir der Ansatz wie ich den String den ich vom MBP and EDOMI schicke, an EINGANG-1 übergebe :-(

                                Code:
                                MBP:~ dariusz$ echo 'Play=1&Pause=0&Stop=0&FF=0&FR=0&LS1=1&LSV=40&LS2=0&LSV2=0 | nc 10.0.100.8 12345'
                                Hier der Code:
                                PHP-Code:
                                ###[HELP]###
                                ###[/HELP]###


                                ###[DEF]###
                                [name = iTunes]

                                [e#1 = Trigger]
                                [e#2 = ]
                                [e#3 = ]
                                [e#4 = ]
                                [e#5 = ]
                                [e#6 = ]
                                [e#7 = ]
                                [e#8 = ]
                                [e#9 = ]

                                [a#1 = Play]
                                [a#2 = Pause]
                                [a#3 = Stop]
                                [a#4 = FF]
                                [a#5 = FR]
                                [a#6 = AirPlay1 E/A]
                                [a#7 = AirPlay2 E/A]
                                [a#8 = AirPlay1 VOL]
                                [a#9 = AirPlay2 VOL]
                                ###[/DEF]###


                                ###[LBS]###
                                <?
                                function LB_LBSID($id) {
                                    if ($E=getLogicEingangDataAll($id)) {
                                        if (getLogicElementStatus($id) == 0)  {
                                            if ($E[1]['value'] != 0 && $E[1]['refresh'] == 1)  {
                                            setLogicElementStatus($id,1);
                                            callLogicFunctionExec(LBSID,$id);
                                            }
                                        }
                                    }
                                }
                                ?>
                                ###[/LBS]###


                                ###[EXEC]###
                                <?
                                require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");
                                sql_connect();


                                $portno = 12345;

                                if (!($socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP))) {

                                    $errorcode = socket_last_error();
                                    $errormsg = socket_strerror($errorcode);
                                    
                                    die('Konnte kein Socken erzeugen: [$errorcode] $errormsg');
                                }

                                if (!(socket_bind($socket, localhost, $portno))) {
                                    
                                    $errorcode = socket_last_error();
                                    $errormsg = socket_strerror($errorcode);
                                    
                                    die('Unable to bind socket: [$errorcode] $errormsg');
                                }

                                while(true) {
                                    $data = @socket_read($socket, 200);
                                    $myString = ($data);

                                    // Play=1&Pause=0&Stop=0&FF=0&FR=0&LS1=1&LSV1=30&LS2=0&LSV2=0 ...
                                    $output = array();
                                    parse_str($myString, $output);

                                    setLogicLinkAusgang($id,1,$output['Play']);
                                    setLogicLinkAusgang($id,2,$output['Pause']);
                                    setLogicLinkAusgang($id,3,$output['Stop']);
                                    setLogicLinkAusgang($id,4,$output['FF']);
                                    setLogicLinkAusgang($id,5,$output['FR']);
                                    setLogicLinkAusgang($id,6,$output['LS1']);
                                    setLogicLinkAusgang($id,7,$output['LS2']);
                                    setLogicLinkAusgang($id,8,$output['LSV1']);
                                    setLogicLinkAusgang($id,9,$output['LSV2']);
                                    }

                                setLogicElementStatus($id,0);

                                sql_disconnect();
                                ?>
                                ###[/EXEC]###


                                Bildschirmfoto 2016-01-31 um 22.16.08.png
                                Danke und LG, Dariusz
                                GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                                Kommentar

                                Lädt...
                                X