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

    #76
    Konnte keinen Socken erzeugen?

    Ok, im Ernst...

    1. die "die"-Befehle kannst und MUSST Du Dir schenken - der Fehlertext wird im Orkus verschwinden, vor allem aber wird das Script dann "hart" beendet. Das heißt z.B., dass die mySQL-Connection nicht geschlossen wird und erst nach 8h "timeouted". Fehler müssen ABGEFANGEN werden und das natürlich nicht per die/exit...

    2. while(true) - aber danach noch den LBS-Status=0 setzen? Mh... Wird wohl niemals passieren Ich werde übrigens die "EXEC-Spezifikation" noch etwas erweitern, so dass man z.B. darauf reagieren kann, wenn EDOMI beendet/neugestartet wird. Aktuell hast Du keine andere Wahl, als while(true) - sofern der LBS quasi wie ein Dämon für immer laufen soll. Beim Beenden von EDOMI wird das Script zwar "abgeschossen", aber das ist natürlich Käse (meinerseits).

    Außerdem muss noch gleich am Anfang (nach(!) dem require) ein set_time_limit(0); ergänzt werden - sonst ist nach 30s Ende...

    3. den ganzen errcode-Kram kannst Du Dir schenken - wird ja eh nicht ausgewertet (Copy/Paste?!)

    4. wo ist die Funktion parse_str()?! Kommt vermutlich noch...?

    Zu Deiner Frage: Verstehe ich nicht... Du meinst quasi wie der String vom MBP "in" den LBS kommt? Naja... Per UDP....... Dafür machst Du doch den UDP-Server/Listener... Der LBS-Eingang wird doch garnicht benötigt - außer zum einmaligen Start des LSB selbst...

    ​Ansonsten: Das wird schon Nur Mut

    EDIT: Siehe hier - oder in der neuen Doku: https://knx-user-forum.de/forum/proj...skussion/page2
    Zuletzt geändert von gaert; 31.01.2016, 23:48.
    EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

    Kommentar


      #77
      DANKE DANKE DANKE !!!

      ad1) erledigt
      ad2) der LBS soll kontinuierlich auf den UDP lauschen, da er lt. Apple-Script alle 60 Sekunden einen Statusupdate erhalten soll (neuen String)
      ad3) error/echo war gut um die Code-Teile zu testen (Ergebnisse) .. ist nun weg (war vergessen) …
      ad4) der ist eh da - letzte Zeile :-)

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

      Der Code sieht nun so aus:


      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)  {
                  setLogicElementStatus($id,1);
                  callLogicFunctionExec(LBSID,$id);
              }
          }
      }
      ?>
      ###[/LBS]###


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

      $port = 12345;
      $ip['edomi'] = '10.0.100.8';

      $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
      socket_bind($socket, $ip['edomi'], $port);

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

      Im Logikeditor wenn ich auf Live-Werte-Aktualisieren drücke, dann blinkt ein roter Rahmen um den LBS (iTunes) … das bedeutet was :-) ?



      Bildschirmfoto 2016-01-31 um 23.25.27.png


      Wenn ich nun von den MBP über Terminal diesen Befehl absetze - dann tut sich gar nichts ….

      Code:
      MBP:~ dariusz$ echo 'Play=1&Pause=0&Stop=0&FF=0&FR=0&LS1=1&LSV1=40&LS2=0&LSV2=0 | nc 10.0.100.8 12345'
      Sollte ich an den Ausgangsboxen nicht die Teilwerte sehen, oder sehe ich die erst, wenn den Ausgangsboxen eine KO zugeordnet wird ?

      Oder ist hier noch irgendwo ein „Hund“ …
      Wie kriege ich nun die Kuh vom Eis ...

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

      Kommentar


        #78
        Der rote Rahmen bedeutet, dass der LBS "läuft".

        Wichtig ist noch, dass in der while-Schleife eine Pause eingefügt wird - sonst schnappt sich das Script quasi die gesamte CPU-Power... z.B. usleep(10000);

        So im Groben müsste es eigentlich funktionieren (die Socket-Geschichte habe ich jetzt nicht so genau im Kopf, aber vom Prinzip sieht's ok aus). Funktioniert das Script denn "standalone" - also ohne den EDOMI-Kram drumherum?! Sprich: Kommen die UDP-Pakete an und werden korrekt geparsed?

        Für die Zukunft (1.14) siehe hier (letzter Beitrag von mir): https://knx-user-forum.de/forum/proje...skussion/page2
        EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

        Kommentar


          #79
          PS: Jetzt prüfst Du ja garnicht mehr, ob der Socket funzt...

          Im Prinzip wenigstens so:

          PHP-Code:
          if ($socket socket_create(AF_INETSOCK_DGRAMSOL_UDP)) {

          if (
          socket_bind($socket$ip['edomi'], $port)) {

          while(
          true) {
              
          $data = @socket_read($socket200); //### darf ruhig >200 sein...
              
          $myString $data//### die () sind überflüssig...

              
          $output = array(); // ### überflüssig...
              
          parse_str($myString$output);
          }
          //bind
          //create 
          Und:
          - die EDOMI-IP steht in der Konstante global_serverIP (ohne $) - braucht also nicht extra angegeben zu werden
          - nc 10.0.100.8 ? Was ist das für eine IP?!
          Zuletzt geändert von gaert; 01.02.2016, 00:13.
          EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

          Kommentar


            #80
            Schön, die erste Hürde habe ich überwunden der LBS läuft :-)
            Gott sein Dank, dass ich damit mein Unterhalt nicht verdienen muss, sonst wäre ich schon seeeeehr arm (diese vielen Stunden) ;-)

            der sleep(10000); ist eingefügt:

            PHP-Code:
            while(true) {
                
            $data = @socket_read($socket200);
                
            $myString = ($data);

                
            // Play=1&Pause=0&Stop=0&FF=0&FR=0&LS1=1&LSV1=40&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']);

            usleep(10000);

            Funktioniert das Script denn "standalone" - also ohne den EDOMI-Kram drumherum?! Sprich: Kommen die UDP-Pakete an und werden korrekt geparsed?
            Grundsätzlich ja … vielleicht habe ich bei copy/paste was falsch gemacht … werde es mir nochmals in ruhe und ausgeschlafen anschauen … sollten mich die Kids schlafen lassen ;-)

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

            Kommentar


              #81
              - nc 10.0.100.8 ? Was ist das für eine IP?!
              Die 10.0.100.8 ist die EDOMI IP-Adresse … die nc (netcat) nutze ich am Terminal wenn ich den String and Edomi schick ...

              if (socket_bind($socket, $ip['edomi'], $port)) {
              Du meinst so ? if (socket_bind($socket, global_ServerIP, $port)) {
              Danke und LG, Dariusz
              GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

              Kommentar


                #82
                Zwischenstand :-(

                Wenn ich folgenden Befehl via Terminal vom MBP verschicke, dann merk ich nichts, außer dass der rote Rahmen um den LBS nicht mehr blinkt.

                Code:
                MBP:~ dariusz$ echo 'Play=1&Pause=1&Stop=1&FF=0&FR=0&LS1=1&LS2=1&LSV1=0&LSV2=0' | nc -u -w 1 10.0.100.8 12345
                Wenn ich nur einen inkompletten String abschicke:

                Code:
                MBP:~ dariusz$ echo 'Play=1&Pause=1' | nc -u -w 1 10.0.100.8 12345
                dann, auch hier blinkt der rote Rahmen um den LBS nicht JEDOCH bekomme ich einen Fehlerlog.

                Code:
                [COLOR=#FF0000]2016-02-01 13:24:45    777189    ?    1552    /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 8 / Zeile 1 / Undefined index: Stop    ERROR
                2016-02-01 13:24:45    777865    ?    1552    /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 8 / Zeile 1 / Undefined index: FF    ERROR
                2016-02-01 13:24:45    778004    ?    1552    /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 8 / Zeile 1 / Undefined index: FR    ERROR
                2016-02-01 13:24:45    778283    ?    1552    /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 8 / Zeile 1 / Undefined index: LS1    ERROR
                2016-02-01 13:24:45    778477    ?    1552    /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 8 / Zeile 1 / Undefined index: LS2    ERROR
                2016-02-01 13:24:45    778664    ?    1552    /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 8 / Zeile 1 / Undefined index: LSV1    ERROR
                2016-02-01 13:24:45    778930    ?    1552    /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 8 / Zeile 1 / Undefined index: LSV2[/COLOR]
                Ich gehe davon aus dass das mit den fehlenden Informationen aus den String zusammenhängt - die restlichen 7 Werte werden erwartet, kommen aber nicht an ...

                Diese - denke ich - zeigt mir aber auch, dass der String am UDP-Listener irgendwie gesehen wird, sonst hätte ich den Fehlerlog nicht (Umkehrschluss) ...

                Da die Teilwerte des Strings anscheinend nicht an die Ausgänge übergeben werden (an E2 der Ausgangsbox sehe ich keine Werte) und der rote Rahmen um den LBS nicht blinkt (nachdem der ECHO-Befehl abgeschickt wurde) - VERMUTE ich, dass hier etwas nicht stimmt - entweder das Parsen, die Übergabe an den Ausgang oder die „Steuerung“ des LBS ist noch immer nicht „komplett“ ...

                Hier noch der derzeitige Code:

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


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

                [e#1 = Autostart #init=1]
                [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]###
                <?php
                function LB_LBSID($id) {
                    if (
                $E=getLogicEingangDataAll($id)) {
                        if (
                getLogicElementStatus($id) == 0)  {
                            
                setLogicElementStatus($id,1);
                            
                callLogicFunctionExec(LBSID,$id);
                        }
                    }
                }
                ?>
                ###[/LBS]###


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


                $port = 12345;
                $ip = '10.0.100.8';

                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);

                    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']);

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

                }
                }
                }

                sql_disconnect();
                ?>
                ###[/EXEC]###
                Da Christian ja ziemlich unter Wasser ist, vielleicht kann mir wer anderer helfen die Ursache zu finden ?
                Danke und LG, Dariusz
                GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                Kommentar


                  #83
                  Hallo Dariusz,

                  der Fehler im Log liegt nicht am Ausgang sondern an dem Array was nicht voll gefüllt ist, sprich der Parser hat keine Werte ab "Stop".
                  Wenn das vorkommt das diese Werte nicht übertragen werden, dann musst du vorher Prüfen ob der Schlüssel existiert (solltest du besser immer einbauen:
                  PHP-Code:
                  if (array_key_exists('Play'$output)) { setLogicLinkAusgang($id1$output['Play']); }
                  if (
                  array_key_exists('Stop'$output)) { setLogicLinkAusgang($id2$output['Stop']); }
                  usw
                  Wenn Du sicher bist das alle Werte ankommen, dann gib mal am ersten Ausgang $myString aus, um zu schauen ob die Werte auch ankommen.

                  Kommentar


                    #84
                    Hallo Axel,

                    danke für deine Rückmeldung !!!

                    Die Fehlerlog kommt, weil ich zum Testen nicht den kompletten String übertragen habe - damit wollte ich prüfen ob der UDP-Listener im LBS den String überhaupt sieht oder nicht.
                    Der Fehlerlog hat es „bestätigt“ dass der String gesehen wird - sonst hätte ich keine Fehlermeldung.

                    Was mich jetzt beschäftigt ist, das ich die Werte aus den Variablen an den Ausgängen des LBS nicht sehe ...

                    der „output“ >> setLogicLinkAusgang($id, 1, $output['Play']); sollte doch für „Play“ die „1“ and den Ausgang 1 liefern oder habe ich das falsch verstanden und es kommt „Play=1“ zum Ausgang 1 ?
                    Danke und LG, Dariusz
                    GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                    Kommentar


                      #85
                      Stimmt, habe ich auch gerade gesehen, das du absichtlich nicht ganzen String geschickt hast.
                      Ja, in der Ausgangsbox sollte der Wert zu sehen sein und so wie ich das sehe, müsste das auch funktionieren. Der Ausgang des LBS selbst, zeigt keine Werte an.

                      Kommentar


                        #86
                        Yep, das macht mir gerade seit Tagen Kopfzerbrechen :-(
                        Hier noch der Logikeditor ...

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

                        Kommentar


                          #87
                          Das ist so richtig, was wird am Ausgang angezeigt wenn du feste Werte ausgibst?

                          Kommentar


                            #88
                            Was genau meinst du mit „das ist so richtig“ :-) ?

                            OK der LBS zeigt am Ausgang keine Werte … sollte aber die verknüpfte Ausgangsbox nicht den Wert z.B. E2=1 zeigen ? Diese wird nach drücken des Buttons „Live-Werte aktualisieren“ nicht angezeigt ...
                            Danke und LG, Dariusz
                            GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                            Kommentar


                              #89
                              Das ist so richtig, meinte ich das die Ausgangsboxen richtig verbunden sind (an NULL). Die Wetrte sollten natürlich da stehen, daher die Frage was bei festen Werten angezeigt wird?

                              Kommentar


                                #90
                                Ich hoffe ich missverstehe dich nicht - das ist der String 'Play=1&Pause=0&Stop=1&FF=0&FR=0&LS1=1&LS2=1&LSV1= 51&LSV2=42‘ mit den Werten für jede „Variable“ die den jeweiligen Ausgang zugewiesen wird. Und genau diese Werte sind in der jeweiligen Ausgangsbox nicht sichtbar - siehe vorheriges Bild.

                                Oder meinst du mit „festen Werten“ etwas anderes ? Bitte milde walten

                                PS: derzeit ist die IP und der Port hard codiert …
                                Gibt es nicht eine Möglichkeit diese zwei Parameter an die Eingänge des LBS zu knüpfen ?
                                Wenn ja, wie könnte so ein Code aussehen ?

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

                                Kommentar

                                Lädt...
                                X