Ankündigung

Einklappen
Keine Ankündigung bisher.

vbusmonitor auf fritzbox hängt

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

    KNX/EIB vbusmonitor auf fritzbox hängt

    Hallo Zusammen,

    habe auf einer fritzbox 7270 (avm firmware) seit ca. 1 Jahr erfolgreich den eibd am Laufen. Vor ein paar Wochen habe ich auch den Apache webserver inkl. php auf der fritzbox (USB) installiert. Habe ein paar kleine php programme geschrieben. Läuft auch alles ohne Problem.
    Seit ein paar Tagen habe ich den vbusmonitor1 am Laufen mit einem simplen php Programm. Lese damit events am Bus und löse dann irgendwelche Aktionen aus (z.B. bei öffnen eines reedkontakts).
    Das Programm funktioniert, aber nach weniger als 24 Stunden, "hängt" das Programm, d.h. bei Events auf dem Bus reagiert das Programm nicht mehr. Man sieht mit mit dem "ps" Befehl, dass die Programme noch laufen. Andere php Programme und Appache funktioniert noch.
    Habe den Verdacht, das Programm vbusmonitor1 hängt irgendwie.
    Hat jemand von Euch den vbusmonitor1 auf eine fritzbox am Laufen? Habt ihr eine Idee, wo das Problem liegen könnte?
    Den eibd und vbusmonitor habe ich fertig compiliert für die fritzbox hier im Forum von einem User runtergeladen.

    Danke,
    Thomas

    #2
    Ich kann Dir nur soviel sagen, irgendwas stimmt mit dem eibd auf der Fritzbox nicht..
    Bei ein bisschen Buslast war da schnell Ende-Gelände, hatte da vor Monaten mal ein bisschen getestet (mit einem selbstkompiliertenaus dem git) und das fühlte sich alles in allem garnicht schön an;
    woran das nun letztlich liegt kann ich bei weitem nicht beurteilen denn eigentlich sollte die Fritz das schon packen.

    Schritt 1 wäre wohl eibd mit "-t1023" starten und aufzeichnen und das an die bcusdk-Liste zu schicken.
    Schritt 2 zu sehen ob der vbusmonitor weiterläuft aber ich glaube es liegt an 1);
    der vbusmonitor ist so simpel, da kann sich defacto nichts aufhängen ausser dass der Socket zum eibd beendet wird.
    Es gibt übrigens fürn eibd auch ne PHP-Api, dann kann man sich das aufrufen des vbusmonitor sparen.

    Makki
    EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
    -> Bitte KEINE PNs!

    Kommentar


      #3
      Hallo Makki,

      danke für deine Hinweise. Ich werde wie vorgeschlagen den Trace einschalten. Was ist die bcusdk-Liste?
      Ich kann mir allerdings nicht vorstellen, dass der eibd nicht mehr läuft. Die cron Steuerung der RTR per eibd funktioniert ohne Probleme weiter und trotzdem empfängt der vbusmonitor keine Events mehr. Nach Neustart des vbusmonitor funktionert wieder alles - kein Neustart des eibd!
      Das mit den Socket ist noch ein guter Tipp. Werde ich mal ansehen. Frage ist nur, warum der Socket beendet wird.
      Das php-Interface zum eibd ohne vbusmonitor interessiert mich. Hast Du dazu einen Link? Habe nur php Programme gefunden, die den vbusmonitor voraussetzen.
      Funktioniert das dann über grousread?

      Thomas

      Kommentar


        #4
        Vermutlich war's von mir heruntergeladen. Wenn dem der Fall ist, dann gibt's inzwischen neuere Versionen vom eibd, wo wohl einige Fehler behoben wurden...

        Wie dem auch sei: bei den verfügbaren Ressourcen (v.a. RAM) meiner 7170 hätte ich kein gutes Gefühl einen Apachen laufen zu lassen und auf dessen Stabilität zu vertrauen. (Die 7270 ist da besser ausgestattet, oder?).
        Dein genaues Setup kenne ich nicht, ich weis nur, dass normalerweise die Laufzeit von PHP Skripten beschränkt ist und diese nach einiger Zeit abgeschossen werden (im normalen Web-Server-Umfeld macht eine lang dauernde Anfrage/Antwort keinen Sinn...) Nicht dass Du einfach nur darüber stolperst...
        TS2, B.IQ, DALI, WireGate für 1wire so wie Server für Logik und als KNX Visu die CometVisu auf HomeCockpit Minor. - Bitte keine PNs, Fragen gehören in das Forum, damit jeder was von den Antworten hat!

        Kommentar


          #5
          Hi Thomas,

          im bcusdk Paket ist eine Datei eibclient.php dabei. Diese liegt in /bcusdk-0.0.4/eibd/client/php/eibclient.php und realisiert die Schnittstelle zum eibd. Du musst jetzt nur noch die dort bereitgestellten Funktionen nutzen.

          So kann man z.B. damit alle Telegramme mitlesen:

          PHP-Code:
          #!/usr/bin/php
          <?php
          include_once 'eibclient.php';
          include_once 
          'eibclient.inc.php';

          define "READ_VALUE_REQ");
          define "READ_VALUE_RES");
          define "WRITE_VALUE_REQ");

          //
          // signal handler
          //
          function exit_listener($sig_no) {
              global 
          $eib_msg_queue,$con;
              
              
          // close EIBD connection
              
          $con->EIBClose(); 
              
              
          // exit eib_listener process
              
          exit ();
          }

          //
          // configure signal handler
          //
          declare ( ticks );
          pcntl_signal SIGTERM"exit_listener" );
          pcntl_signal SIGINT,  "exit_listener" );
          pcntl_signal SIGHUP,  "exit_listener" ); 
          pcntl_signal SIGQUIT,  "exit_listener" ); 

          //
          // set unlimited execution time of eib_listener process
          //
          set_time_limit (0);

          //
          // initialise EIBD connection and data structures
          //
          $con = new EIBConnection("localhost:6720");
          $con->EIBOpen_GroupSocket(0);
          $data = new EIBBuffer();
          $src = new EIBAddr();
          $dest = new EIBAddr();

          //
          // MAIN loop to receive all EIB telegrams
          //
          while (1)
          {
              
          //
              // read next telegram
              //
              
          $len $con->EIBGetGroup_Src($data,$src,$dest);
              
              
          //
              // copy telegram data to buffer
              //
              
          $buf unpack("C*"$data->buffer);

              
          //
              // check and set APDU type
              //
              
          if ($buf[1] & 0x3 || ($buf[2] & 0xC0) == 0xC0)
                  {
          printf ("Error: Unknown APDU: %02X%02X\n"$buf[1], $buf[2]);unset($APCI);}
              else if ((
          $buf[2] & 0xC0) == 0x00
                  {
          $APCI=READ_VALUE_REQ$telegram "READ_VALUE_REQ";}
              else if ((
          $buf[2] & 0xC0) == 0x40
                  {
          $APCI=READ_VALUE_RES$telegram "READ_VALUE_RES";}
              else if ((
          $buf[2] & 0xC0) == 0x80
                  {
          $APCI=WRITE_VALUE_REQ$telegram "WRITE_VALUE_REQ";}
              else 
                  {
          printf ("Error: Unknown APDU: %02X%02X\n"$buf[1], $buf[2]);unset($APCI);}
               
              
          //
              // build telgram string "APDU-TYPE SOURCE DESTINATION VALUE"
              //
              
          if (isset($APCI))
              {  
                  
          $telegram .= " ".formatiaddr($src->addr)." ".formatgaddr($dest->addr);    
                  if (
          $APCI<>READ_VALUE_REQ)
                  {
                         if (
          $len == 2
                             
          $telegram .= sprintf(" %02X"$buf[2] & 0x3F);
                      else {
                             for (
          $i=3$i<=$len$i++)
                             
          $telegram .= sprintf(" %02X"$buf[$i]);
                      }
                  }
                  echo 
          $telegram."\n";
              }
                
          }
          ?>
          Die eibclient.inc.php in meinem Skript heißt im bcusdk package eigentlich help.php und liegt in bcusdk-0.0.4/contrib/eibdvis/help.php. Darin sind auch Funktionen groupswrite() und groupwrite() enthalten.

          groupread ist nicht in help.php enthalten, würde aber analog so aussehen:

          PHP-Code:
          function groupread ($con$addr)
          {
              
          $addr gaddrparse ($addr);
              
          $header 0x0000;
              
          $r $con->EIBOpenT_Group ($addr1);
              if (
          $r == -1) return -1;
              
          $data pack ("n"$header);
              
          $r $con->EIBSendAPDU ($data);
              if (
          $r == -1) return -1;
              return 
          $con->EIBReset ();

          Kommentar


            #6
            Zitat von jonofe Beitrag anzeigen
            Hgroupread ist nicht in help.php enthalten, würde aber analog so aussehen:

            PHP-Code:
            function groupread ($con$addr)
            {
                
            $addr gaddrparse ($addr);
                
            $header 0x0000;
                
            $r $con->EIBOpenT_Group ($addr1);
                if (
            $r == -1) return -1;
                
            $data pack ("n"$header);
                
            $r $con->EIBSendAPDU ($data);
                if (
            $r == -1) return -1;
                return 
            $con->EIBReset ();

            Statt groupread + suchen des Ergebnisstelegrams kann man gleich groupcacheread_sync [vgl. cacheread in help.php] verwenden. Man kann damit auch Buslast sparen, indem man per $age den Zugriff auf X Sekunden alten "gecachten" Zustand erlaubt. Weiters liest der EIBD mit und aktulisiert den Zustand.

            Kommentar


              #7
              Hallo Zusammen,

              vielen Dank für die hilfreichen Tipps. Da ist einiges dabei, was mir helfen könnte. Das php client Programm für den eibd sieht sehr interessant aus. Werde ich testen. Werde auch prüfen, ob es eventuell an einer apache / php Einstellung liegen könnte.
              Von der CPU Last und vom RAM her glaube ich immer noch nicht, dass die fritzbox 7270 das nicht schafft. Mit den AVM tools sehe ich da keine Überlastung. Auch sonst läuft die friitzbox trotz apache und eibd sehr stabil (telefon, internet).
              Einzig das monitoren der events mit dem vbusmonitor mit php macht Probleme.
              Ich finde die Lösung mit der fritzbox nachwievor super. Nachdem die box sowieso immer läuft, brauche ich keinen extra Server.

              @ Chris: ja ich glaube, ich habe deine compilierte eibd Version runtergeladen vor ca. einem Jahr. Könntest Du die neue eibd Version (inkl. tools) für die fritzbox compilieren? Habe einen Mac. Der Umweg über Windows / crosscompiler hat mir vor einem Jahr viele Probleme bereitet und ohne Deine Hilfe hätte ich heute keinen eidb auf der fritzbox am Laufen.

              Ich werde jetzt erstmal etwas Zeit brauchen, um eurer Tipps zu testen.

              Thomas

              Kommentar


                #8
                ich schon wieder ...

                Habe gerade versucht mit dem php porgramm von janofe zu arbeiten. bin da wieder auf ein problem gestossen:

                PHP Fatal error: Call to undefined function pcntl_signal() in /var/media/ftp/Verbatim-STORENGO-21/knxtools/knx_mon.php on line 27
                X-Powered-By: PHP/5.2.2

                Habe gegoogelt und gefunden, dass php mit der option "--enable-pcntl" kompiliert werden muss. Habe meine apache und php Version von hier:

                XOBZTIRF - Die FritzBox Seite für Anleitungen, Modifikationen, Tipps und Tricks

                scheinbar wurde diese Version ohne Prozesskontrolle kompiliert. Kennt jemand eine php/apache Version für die fritzbox, die Prozesskontrolle unterstützt?

                Thomas

                Kommentar


                  #9
                  Du kannst einfach folgenden Abschnitt löschen...

                  PHP-Code:
                  //
                  // signal handler
                  //
                  function exit_listener($sig_no) {
                      global 
                  $eib_msg_queue,$con;
                      
                      
                  // close EIBD connection
                      
                  $con->EIBClose(); 
                      
                      
                  // exit eib_listener process
                      
                  exit ();
                  }

                  //
                  // configure signal handler
                  //
                  declare ( ticks );
                  pcntl_signal SIGTERM"exit_listener" );
                  pcntl_signal SIGINT,  "exit_listener" );
                  pcntl_signal SIGHUP,  "exit_listener" ); 
                  pcntl_signal SIGQUIT,  "exit_listener" ); 
                  Dann funktionierts auch ohne pcntl.

                  Kommentar


                    #10
                    Zitat von mkoegler Beitrag anzeigen
                    Statt groupread + suchen des Ergebnisstelegrams kann man gleich groupcacheread_sync [vgl. cacheread in help.php] verwenden. Man kann damit auch Buslast sparen, indem man per $age den Zugriff auf X Sekunden alten "gecachten" Zustand erlaubt. Weiters liest der EIBD mit und aktulisiert den Zustand.
                    sowas Ähnliches hatte ich mir schon gedacht, allerdings habs ich's bei mir nicht hinbekommen. Hier der Versuch:

                    PHP-Code:
                    <?php
                    include_once 'eibclient.php';
                    include_once 
                    'help.php';
                    $con = new EIBConnection("localhost");
                    $result=cacheread($con,"1/1/31");
                    print_r($result);
                    $con->EIBClose();
                    ?>
                    Das Ergebnis ist immer:

                    Code:
                    Array
                    (
                        [0] => 1/1/31
                        [1] => -1
                    )
                    Vielleicht hab ich das mit dem "age" noch nicht richtig verstanden, aber der Default ist ja 0 und ich hatte interpretiert, wenn age=0, dann wird auf jeden Fall ein Read_REQ auf den Bus geschickt und auf das Ergebnis gewartet, welches cacheread dann zurückliefert. Richtig?
                    Bei age=0 sehe ich zumindest im Log des eibd kein Telgramm.
                    Was mache ich falsch?

                    Kommentar


                      #11
                      Zitat von jonofe Beitrag anzeigen
                      Du kannst einfach folgenden Abschnitt löschen...

                      PHP-Code:
                      //
                      // signal handler
                      //
                      function exit_listener($sig_no) {
                          global 
                      $eib_msg_queue,$con;
                          
                          
                      // close EIBD connection
                          
                      $con->EIBClose(); 
                          
                          
                      // exit eib_listener process
                          
                      exit ();
                      }

                      //
                      // configure signal handler
                      //
                      declare ( ticks );
                      pcntl_signal SIGTERM"exit_listener" );
                      pcntl_signal SIGINT,  "exit_listener" );
                      pcntl_signal SIGHUP,  "exit_listener" ); 
                      pcntl_signal SIGQUIT,  "exit_listener" ); 
                      Dann funktionierts auch ohne pcntl.
                      Super! Das Programm läuft! Habe es am mein Setup angepasst. Das Programm mit dem php Klassen ist wesentlich eleganter als meine Version.

                      Der Tipp von Chris wegen der php Laufzeit war auch gut. Habe in meine Script (wie bei Andre) den Aurufe set_time_limit (0); eingebaut.

                      Wer jetzt meine Version und das Programm von Andre mal die nächsten Tage testen, ob alles durchläuft.

                      VIELEN Dank für Eure Hilfe!

                      Thomas

                      Kommentar


                        #12
                        Zitat von jonofe Beitrag anzeigen
                        sowas Ähnliches hatte ich mir schon gedacht, allerdings habs ich's bei mir nicht hinbekommen. Hier der Versuch:

                        PHP-Code:
                        <?php
                        include_once 'eibclient.php';
                        include_once 
                        'help.php';
                        $con = new EIBConnection("localhost");
                        $result=cacheread($con,"1/1/31");
                        print_r($result);
                        $con->EIBClose();
                        ?>
                        Das Ergebnis ist immer:

                        Code:
                        Array
                        (
                            [0] => 1/1/31
                            [1] => -1
                        )
                        Vielleicht hab ich das mit dem "age" noch nicht richtig verstanden, aber der Default ist ja 0 und ich hatte interpretiert, wenn age=0, dann wird auf jeden Fall ein Read_REQ auf den Bus geschickt und auf das Ergebnis gewartet, welches cacheread dann zurückliefert. Richtig?
                        Bei age=0 sehe ich zumindest im Log des eibd kein Telgramm.
                        Was mache ich falsch?
                        Ich hätte auch auf fetchstats hinweisen sollen:

                        Auszug aus layout.php:
                        Code:
                        function fetchstats($con, $addr, $age)
                        {
                          $res=cacheread($con, $addr, $age);
                          if($res[1]==-1)
                            {
                              printf("EIBD not usable");
                              return false;
                            }
                          if($res[1]==-2)
                            {
                              printf("not readable");
                              return false;
                            }
                          if($res[1]==-3)
                            {
                              printf("unknown status");
                              return false;
                            }
                          return array_slice($res, 2);
                        }
                        Negative Werte im Element 1 von cacheread bezeichen einen "Fehler":
                        • -1 Fehlercode vom EIBD gekommen
                        • -2 Kein Zustand verfügbar (keine Antwort auf Read)
                        • -3 (Antwort-)Telegram wäre kein GroupValue_Response/Write

                        Bei -1 ist die wahrscheinlichste Ursache, das der GroupCache nicht aufgedreht ist [Per EIBD Parameter bzw. groupcacheenable bzw. API Funktion]. Der GroupCache kann im Betrieb auf/abgedreht werden, da er nicht gleichzeitig mit einen echten Busmonitor aktiv sein kann und etwas mehr Resourcen braucht.

                        Mein Beispiel aktiviert den Cache bei jeden Aufruf, obwohl das nur einmal nötig ist.

                        Auszug aus common.php:
                        Code:
                            function connect()
                              {
                                if ($this->connection !== -1)
                                  return $this->connection;
                        
                                $this->connection = new EIBConnection($this->hostname);
                                $this->connection->EIB_Cache_Enable ();
                                return $this->connection;
                              }
                        Mit $age kann man nichts falsch machen. Wenn die GA auf GroupValue_Read antwortet, bekommt man immer einen Zustand zurück.

                        Das Prinzip vom GroupCache ist:
                        * Wenn der EIBD nichts über eine GA weiss, fragt er immer (egal welches Age) per GroupValue_Read die Addresse ab und liefert das Ergebnis bzw. das nichts gekommen ist.
                        * Parallel beobachtet der EIBD auch die Telegramme am Bus und aktualisiert den Zustand von GAs.
                        * Wenn mit $age=0 abgefragt wird, kommt der letzte Zustand
                        * Wenn mit $age>0 abgefragt wird und der letzte Zustand jünger als $age Sekunden ist, kommt der letzte Zustand, sonst fragt er per GroupValue_Read ab.


                        • $age=0 ist für GAs gedacht, die nicht auf auf GroupValue_Read reagieren bzw. derren Zustandänderungen man über den Bus mitverfolgen kann.
                        • Ein sehr großes $age ist für GAs gedacht, die auf GroupValue_Read reagieren und die man über den Bus mitverfolgen kann. aber doch hin und wieder aus Sicherheitsgründen abfragen kann.
                        • Ein kleines $age ist für GAs, deren Zustand man regelmäßig per GroupValue_Read vom Bus abfragen möchte. Über $age kann man den Kompromiss zwishen Aktualität und Buslast wählen.

                        Eine GA kann für unterschiedliche Zwecke mit verschiedenen $age Werten parallel abfragt werden.

                        Kommentar


                          #13
                          Danke für die ausführliche Erklärung.
                          Kaum macht man's richtig schon funktionierts ...

                          Code:
                          Array
                          (
                              [0] => 1/1/31
                              [1] => 0.1.11
                              [2] => 1
                          )

                          Kommentar

                          Lädt...
                          X