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

    #91
    Ich teste dein Skript mal eben bei mir, melde mich gleich...

    Kommentar


      #92
      Also bei mir werden auch keine Live-Werte angezeigt, aber wenn du eine GA verbindest, dann werden die Werte korrekt auf den Bus geschrieben. Das Problem ist jetzt noch, dass es sein kann, dass das EXEC-Skript weiterläuft und du bei einem Neustart von EDOMI keinen freien Port bekommst, in 1.14 wird es hierzu eine Abhilfe geben.

      PHP-Code:
      ###[HELP]###
      ###[/HELP]###


      ###[DEF]###
      [name = iTunes & AirPlay]

      [e#1 = Autostart #init=1]
      [e#2 = Port #init=12345]
      [e#3 = ]
      [e#4 = ]
      [e#5 = ]
      [e#6 = ]
      [e#7 = ]
      [e#8 = ]
      [e#9 = ]
      [e#10 = ]

      [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]

      [v#1 = 0] // Server-IP
      [v#2 = 0] // Port
      [v#3 = 0] // EXEC-Status
      ###[/DEF]###


      ###[LBS]###
      <?php
      function LB_LBSID($id) {
          if (
      $E getLogicEingangDataAll($id)) {
              if (! 
      is_null($E[1]['value']) && $E[1]['refresh']==1) {
                  
      setLogicElementVar($id,1,GLOBAL_SERVERIP); // Setze Server-IP
                  
      setLogicElementVar($id,2,$E[2]['value']); // Setze Port    
                  
      callLogicFunctionExec(LBSID,$id);    
              }
          }
      }
      ?>
      ###[/LBS]###


      ###[EXEC]###
      <?
      require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");
      sql_connect();
      if (getLogicElementVar($id,3) == 0 ) { // Prüfen ob Sḱript bereits ausgeführt wird
          setLogicElementVar($id,3,1);       // Status von EXEC-Skript auf aktiv setzen
          $ip = getLogicElementVar($id,1);
          $port = getLogicElementVar($id,2);

          if ($socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP)) {
              if (socket_bind($socket, $ip, $port)) {

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

                      $output = array();
                      parse_str($myString, $output);

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

                      usleep(1000*10);       //z.B. 10ms warten - wichtig, um die CPU-Last zu begrenzen!

                  }
              }
          }
      }
      sql_disconnect();
      ?>
      ###[/EXEC]###
      Du musst mal probieren, ob es mit der GLOBAL_SERVERIP Konstante so funktioniert, ich kann gerade nicht testen, weil EDOMI keinen freien Tunnel bekommt :-(
      Zuletzt geändert von panzaeron; 01.02.2016, 17:07.

      Kommentar


        #93
        So, jetzt hab' ich mal drübber geguckt...

        Also:
        • die EDOMI-IP ist für die Katz - die braucht man nicht beim Port-Bindung
        • der UDP-String war "dreckig", d.h. mit Zeilenumbrüchen versehen (vom echo):
          • es ist ohnehin zu empfehlen, alle Strings von "aussen" zu "reinigen" (siehe Quelltext)
          • echo 'xyz' | nc IP PORT hängt einen Zeilenumbruch an den String... mit echo -n 'xyz'... passiert das nicht. Ist aber auch Wurscht - wird ja jetzt gefiltert
          • die Live-Werte wurden nicht angezeigt, da der Zeilenumbruch das JS-Script irritiert hat - ein Bug... Wird behoben. Mit dem unten gezeigten LBS spielt das aber keine Rolle, da Zeilenumbrüche ja nun entfernt werden.
        ​Du schreibst in diverse Beiträgen:
        echo '... | nc ...'

        Das geht natürlich nicht Korrekt wäre eher:
        echo '...' | nc...


        Hier also der quasi fertige LBS:

        Natürlich muss am Ende noch "aufgeräumt" werden - also Socket schließen etc... Das habe ich mir jetzt mal geschenkt.

        PHP-Code:
        ###[HELP]###
        ###[/HELP]###


        ###[DEF]###
        [name = iTunes & AirPlay]

        [e#1 = Autostart #init=1]
        [e#2 = Port #init=12345]
        [e#3 = ]
        [e#4 = ]
        [e#5 = ]
        [e#6 = ]
        [e#7 = ]
        [e#8 = ]
        [e#9 = ]
        [e#10 = ]

        [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]

        [v#1 = 0]
        ###[/DEF]###


        ###[LBS]###
        <?php
        function LB_LBSID($id) {
            if (
        getLogicElementVar($id,1)!=1) {    //dieses Konstrukt stellt sicher, dass EXEC nur einmal gestartet wird
                
        setLogicElementVar($id,1,1);
                
        callLogicFunctionExec(LBSID,$id);
            }
        }
        ?>
        ###[/LBS]###


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

        set_time_limit(0);    //### Wichtig!

        sql_connect();

        if ($E=getLogicEingangDataAll($id)) {    //Eingänge einlesen!

            if ($socket=socket_create(AF_INET,SOCK_DGRAM,SOL_UDP)) {
                if (socket_bind($socket,'0.0.0.0',$E[2]['value'])) {

                    while(getSysInfo(1)>=1) {
                        $data=socket_read($socket,1024);
                        $data=preg_replace("/[^A-Za-z0-9&=]/",'',$data);    //unerwünschte Zeichen entfernen

                        parse_str($data,$output);

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

                        usleep(1000*10);

                    }
                }
            }
        }

        sql_disconnect();
        ?>
        ###[/EXEC]###
        Zuletzt geändert von gaert; 01.02.2016, 17:47.
        EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

        Kommentar


          #94
          DANKE !!

          Das Problem ist jetzt noch, dass es sein kann, dass das EXEC-Skript weiterläuft und du bei einem Neustart von EDOMI keinen freien Port bekommst
          Ich muss zugeben, ich habe nicht geschaut was am Bus ankommt, weil ich in der Logik nichts gesehen habe was darauf schließen ließe dass auf den Bus gesendet wird … meaculpa.

          Also bei mir werden auch keine Live-Werte angezeigt
          Dann werde ich das in der nächsten „Version“ verfolgen, sollte in der Zwischenzeit aus der Community kein Hinweis mehr kommen ...

          GLOBAL_SERVERIP
          Dass das gehen soll, das hat schon Christian geschrieben, leider war ich mir nicht sicher an welcher Stelle ich das einsetzen soll ...

          Den Rest mit den „v“ usw. im Code muss ich noch behirnen ;-)

          Nochmals danke !
          Danke und LG, Dariusz
          GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

          Kommentar


            #95
            GLOBAL_SERVERIP habe ich nicht geschrieben, sondern global_serverIP
            EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

            Kommentar


              #96
              …………..
              Danke und LG, Dariusz
              GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

              Kommentar


                #97
                DANKE !!

                Natürlich muss am Ende noch "aufgeräumt" werden - also Socket schließen etc... Das habe ich mir jetzt mal geschenkt.
                Mit socket_close() oder mit socket_shutdown() ?

                Mit socket_close() habe ich folgenden Hinweis gefunden:

                Summary: close() does not relinquish socket immediately.
                With the BSD socket implementation (which is the socket interface used by PHP), a socket_close() may close the socket, but there may yet be data to send. Until the data is sent, the port will not be available. Therefore, all further bindings attempted on that port will not be acceptable due to the 'port can not be reused' (the approximate message, anyway) error. Ordinarily, if the REUSABLE socket option is set, the only thing that will raise such an error is a binding to a specific IP/PORT combination that is already bound.
                Mit socket_shutdown() wird die Übertragung abgebrochen ...

                In www heißt es mann soll zuerst shutdown danach close ausführen ...

                Wie ist deine Meinung dazu, insbesondere in Bezug auf den LBS und EDOMI und an welcher Stelle :-) ??
                Danke und LG, Dariusz
                GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                Kommentar


                  #98
                  Man - Du bist wirklich ein Copy/Paste-"Programmierer" Spaß... Mit ernsthaften Anteilen...

                  socket_close(...) schließt einen Socket, fertig. Natürlich reagiert die Gegenstelle nicht immer sofort, aber das ist nicht Dein Problem (bzw. das Problem des LBS). Der LBS sendet ja nix, der empfängt nur...
                  EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

                  Kommentar


                    #99
                    Man - Du bist wirklich ein Copy/Paste-"Programmierer" Spaß... Mit ernsthaften Anteilen...
                    Stimmt, ich habe es nicht gelernt geschweige studiert ;-)
                    Bin interessiert und hinterfrage warum etwas ist wie es ist um es zu verstehen :-)
                    Danke und LG, Dariusz
                    GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                    Kommentar


                      Zitat von gaert Beitrag anzeigen
                      GLOBAL_SERVERIP habe ich nicht geschrieben, sondern global_serverIP
                      Stimmt, irgendwie hatte ich in Erinnerung dass die Konstanten in PHP immer groß geschrieben werden...
                      Zuletzt geändert von panzaeron; 01.02.2016, 19:21.

                      Kommentar


                        PHP unterscheidet nur bei Variablen, Konstanten und Eigenschaften von Klassen zwischen Groß-/Kleinschreibung. Bei Funktionen, Klassen und Methoden ist das nicht der Fall.
                        PS: Konstanten müssen ergo nicht immer groß, zumindest aber immer gleich geschrieben werden ;-)
                        Zuletzt geändert von Jever; 01.02.2016, 19:33.

                        Kommentar


                          Hmmmm,

                          ich habe für 7 (die letzten) von 9 Variablen ein ERROR-LOG ...

                          Code:
                          [SIZE=10px][FONT=courier new][COLOR=#FF0000]2016-02-01 19:24:58    707312    ?    1730    /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 8 / Zeile 2 / Undefined variable: otuput    ERROR
                          2016-02-01 19:24:58    707483    ?    1730    /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 2 / Zeile 2 / array_key_exists() expects parameter 2 to be array, null given    ERROR
                          2016-02-01 19:24:58    707539    ?    1730    /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 8 / Zeile 2 / Undefined variable: otuput    ERROR
                          2016-02-01 19:24:58    707588    ?    1730    /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 2 / Zeile 2 / array_key_exists() expects parameter 2 to be array, null given    ERROR
                          2016-02-01 19:24:58    707638    ?    1730    /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 8 / Zeile 2 / Undefined variable: otuput    ERROR
                          2016-02-01 19:24:58    707797    ?    1730    /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 2 / Zeile 2 / array_key_exists() expects parameter 2 to be array, null given    ERROR
                          2016-02-01 19:24:58    707858    ?    1730    /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 8 / Zeile 2 / Undefined variable: otuput    ERROR
                          2016-02-01 19:24:58    707909    ?    1730    /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 2 / Zeile 2 / array_key_exists() expects parameter 2 to be array, null given    ERROR
                          2016-02-01 19:24:58    707957    ?    1730    /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 8 / Zeile 2 / Undefined variable: otuput    ERROR
                          2016-02-01 19:24:58    708004    ?    1730    /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 2 / Zeile 2 / array_key_exists() expects parameter 2 to be array, null given    ERROR
                          2016-02-01 19:24:58    708051    ?    1730    /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 8 / Zeile 2 / Undefined variable: otuput    ERROR
                          2016-02-01 19:24:58    708098    ?    1730    /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 2 / Zeile 2 / array_key_exists() expects parameter 2 to be array, null given    ERROR
                          2016-02-01 19:24:58    708146    ?    1730    /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 8 / Zeile 2 / Undefined variable: otuput    ERROR
                          2016-02-01 19:24:58    708206    ?    1730    /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 2 / Zeile 2 / array_key_exists() expects parameter 2 to be array, null given    ERROR[/COLOR][/FONT][/SIZE]

                          Copy/Paste Fehler (meine Äuglein schon zu müde) ?

                          Bildschirmfoto 2016-02-01 um 19.37.15.png


                          PHP-Code:
                          ###[HELP]###
                          ###[/HELP]###


                          ###[DEF]###

                          [name = iTunes & AirPlay]

                          [e#1 = Autostart #init=1]
                          [e#2 = Port #init=12345]
                          [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]

                          [v#1 = 0]

                          ###[/DEF]###


                          ###[LBS]###
                          <?php
                          function LB_LBSID($id) {
                              if (
                          getLogicElementVar($id,1)!=1) {
                                  
                          setLogicElementVar($id,1,1);
                                  
                          callLogicFunctionExec(LBSID,$id);
                              }
                          }
                          ?>
                          ###[/LBS]###


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

                          if (
                          $E=getLogicEingangDataAll($id)) {

                              if (
                          $socket socket_create(AF_INETSOCK_DGRAMSOL_UDP)) {
                              if (
                          socket_bind($socket'0.0.0.0'$E[2]['value'])) {

                                  while(
                          getSysInfo(1)>=1) {
                                      
                          $data socket_read($socket1024);
                                      
                          $data preg_replace("/[^A-Za-z0-9&=]/",'',$data);

                                      
                          parse_str($data$output); //    $output = array();

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

                          usleep(1000*10); //z.B. 10ms warten - wichtig, um die CPU-Last zu begrenzen!

                          //socket_close($socket)
                                      
                          }
                                  }
                              }
                          }

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

                          Eine Idee, denn ich erkenne auf den x-ten Blick keinen Fehler
                          Danke und LG, Dariusz
                          GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                          Kommentar


                            Ich lese "otuput", das sollte wohl "output" werden

                            Kommentar


                              Quatsch... otuput und output wird von der PHP-internen Tippfehlerkorrektur automatisch angepaßt

                              Mein "Fehler" - ich hatte Dein Script ja als Grundlage kopiert... Hätte mir auffallen müssen
                              EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

                              Kommentar


                                Du sprichst mit einem Maschinenbauer in Rätseln

                                EDIT: OK, jetzt habe ich es auch gelesen otoput … die Äuglein sind schon wirklich müde ….
                                Zuletzt geändert von coliflower; 01.02.2016, 21:03.
                                Danke und LG, Dariusz
                                GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                                Kommentar

                                Lädt...
                                X