Ankündigung

Einklappen
Keine Ankündigung bisher.

Anwesenheitserk. mit Fritzbox TR64 LBS 19000611 - schaltet nach Abfrage kurz auf 0

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

    #16
    Hi Tino,

    auf ein neues - hat mich jetzt doch interessiert, die Exception zu umgehen - geht tatsächlich wie in php - wer hätte es gedacht ?!?
    Ist aber natürlich nicht die Perfekte Lösung - gaert möge mir verzeihen. Ich kann die UPNP Exception reproduzieren (dann aber immer), wenn ich die SOAP URI manipuliere. Dass dieser Fehler 1x pro Stunde durch Edomi produziert wird scheint mir sehr unwahrscheinlich. Den wirklichen Fehler zu finden wird also vermutlich sehr aufwendig. (und für mich mangels "Testsystem" leider nicht möglich).

    Du könntest den php code leicht abgewandelt in eine .php Datei schreiben und diese mal sekündlich auf die Fritzbox loslassen....

    Im den Fehler auszublenden funktioniert bei mir folgendes:

    PHP-Code:
    try {
    $NumberOfHosts $client->GetHostNumberOfEntries();


    // Abfrage welches Device online ist:
    .....
    .....
    logic_setOutput($id,1,$all);                     //Ausgang 1 auf Anwesenheitsstatus setzen

    }
    catch (
    Exception $e
    {
    //    echo 'Exception abgefangen: ',  $e->getMessage(), "\n";
    //    auskommentiert - wir wollen ja nichts davon wissen....

    Viel Erfolg beim testen

    Gruss

    Marc

    Kommentar


      #17
      Hallo Marc, kannst Du mir bitte mal den kpl Code schicken. Ich bekomm beim einfügen der Zeile "catch (Exception $e)" immer einen PHP Fehler. Sorry das ich so nervig bin. VG Tino.

      Kommentar


        #18
        Hast vermutlich ne Klammer vergessen:

        PHP-Code:
        ###[DEF]###
        [name        =    Anwesenheitsstatus]

        [e#1        =     Trigger]
        [e#2        =     Device1]
        [e#3        =     Device2]
        [e#4        =     Device3]
        [e#5        =     Device4]

        [a#1        =    Anwesenheitsstatus All]
        [a#2        =    Anwesenheit Device1]
        [a#3        =    Anwesenheit Device2]
        [a#4        =    Anwesenheit Device3]
        [a#5        =    Anwesenheit Device4]
        ###[/DEF]###


        ###[HELP]###
        Anwesenheitserkennung via TR64 an der Fritzbox.
        Idee: https://www.schlaue-huette.de  Code und Edomi Modifikation: MSW
        Getestet mit FritzOS 6.80, FRITZ!Box 7490
        Funktioniert auch mit IOS Geräten, welche im Standby Ihren WLAN Empfang deaktivieren.
        Sobald das Gerät in WLAN Reichweite kommt bucht es sich kurz im WLAN ein. Dies registriert die Fritzbox


        ###[/HELP]###

        ###[LBS]###
        <?
        function LB_LBSID($id) {

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

                if ($E[1]['refresh']==1) {
                    logic_callExec(LBSID,$id);                    //EXEC-Script starten
                }

            }

        }
        ?>
        ###[/LBS]###

        ###[EXEC]###


        require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");
        set_time_limit(10);
        sql_connect();

        //-------------------------------------------------------------------------------------


        if ($E=getLogicEingangDataAll($id)) {
            //Dies muss der exakte Hostname sein, der in der FritzBox aufgeführt wird. Alternativ kann man auch IP oder MAC Adresse nutzen. Dazu muss jedoch die SOAP Abfrage geändert werden.
            //Hier können weitere Geräte angefügt werden. Diese dann mit e#4, e#5,... belegen
            $device = array($E[2]['value']=>'0',$E[3]['value']=>'0',$E[4]['value']=>'0',$E[5]['value']=>'0');
        }
         
        $fritzbox_ip = "fritz.box";
        $tr64_port = "49000";

        // SOAP Abfrage:
        $client = new SoapClient(null,array(    'location'        => "http://" . $fritzbox_ip . ":" . $tr64_port . "/upnp/control/hosts",
                                                'uri'            => "urn:dslforum-or:service:Hosts:1",
                                                'soapaction'    => "urn:dslforum-org:service:Hosts:1#GetSpecificHostEntry",
                                                'noroot'        => False
            ));


        try {
        $NumberOfHosts = $client->GetHostNumberOfEntries();


        // Abfrage welches Device online ist:
        if (!(is_soap_fault($NumberOfHosts))) {
          for ($i=0;$i<$NumberOfHosts;$i++) {
            $Host = $client->GetGenericHostEntry(new SoapParam($i,'NewIndex'));
            
            //List all Fritzbox Devices
            //echo 'Device: ' . $Host['NewHostName'] . 'Status: ' . $Host['NewActive'] . '<br>';    
            if (array_key_exists($Host['NewHostName'],$device)) {
                $device[$Host['NewHostName']] = $Host['NewActive'];
            }      
          }
        }

        $all = 0;
        $i = 2; //Ausgänge

        foreach($device as $x => $x_value) {
            //echo "Key=" . $x . ", Value=" . $x_value;
            $all = $all + $x_value;
            logic_setOutput($id,$i,$x_value); 
            $i++;
        }



        logic_setOutput($id,1,$all);                     //Ausgang 1 auf Anwesenheitsstatus setzen

        }
        catch (Exception $e) 
        {
        //    echo 'Exception abgefangen: ',  $e->getMessage(), "\n";
        //    auskommentiert - wir wollen ja nichts davon wissen....
        }



        //-------------------------------------------------------------------------------------

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

        Kommentar


          #19
          Hallo Marc, vielen Dank. Ja war echt die doofe Klammer. Ahhhh peinlich! Ich werd mal testen. VG Tino

          Kommentar


            #20
            Hallo Marc, so hab das mal ein paar Stunden beobachten können. Die Einträge sind weg aber in der Kombi macht der Baustein jetzt auch nichts mehr. Kein muh und kein mäh. die alte Variante funktioniert einwandfrei aber eben mit den Meldungen. Egal ich galub ich lass es jetzt mal so laufen. Funktioniert ja alles oder hab ich auf Grund der Meldung einen Hacken ? VG Tino.

            Kommentar


              #21
              Hi Tino,
              auf der Zielgeraden wird nicht aufgegeben.....

              Der komplettcode war auch ungetestet bzw. schnell zusammenkopiert. Dabei muss mir ein Befehl verloren gegangen sein.

              Unter ###[EXEC]### fehlte das <?


              Und hier der komplette:

              PHP-Code:
              ###[DEF]###
              [name        =    Anwesenheitsstatus]

              [e#1        =     Trigger]
              [e#2        =     Device1]
              [e#3        =     Device2]
              [e#4        =     Device3]
              [e#5        =     Device4]

              [a#1        =    Anwesenheitsstatus All]
              [a#2        =    Anwesenheit Device1]
              [a#3        =    Anwesenheit Device2]
              [a#4        =    Anwesenheit Device3]
              [a#5        =    Anwesenheit Device4]
              ###[/DEF]###


              ###[HELP]###
              Anwesenheitserkennung via TR64 an der Fritzbox.
              Idee: https://www.schlaue-huette.de  Code und Edomi Modifikation: MSW
              Getestet mit FritzOS 6.80, FRITZ!Box 7490
              Funktioniert auch mit IOS Geräten, welche im Standby Ihren WLAN Empfang deaktivieren.
              Sobald das Gerät in WLAN Reichweite kommt bucht es sich kurz im WLAN ein. Dies registriert die Fritzbox


              ###[/HELP]###

              ###[LBS]###
              <?
              function LB_LBSID($id) {

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

                      if ($E[1]['refresh']==1) {
                          logic_callExec(LBSID,$id);                    //EXEC-Script starten
                      }

                  }

              }
              ?>
              ###[/LBS]###

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

              //-------------------------------------------------------------------------------------


              if ($E=getLogicEingangDataAll($id)) {
                  //Dies muss der exakte Hostname sein, der in der FritzBox aufgeführt wird. Alternativ kann man auch IP oder MAC Adresse nutzen. Dazu muss jedoch die SOAP Abfrage geändert werden.
                  //Hier können weitere Geräte angefügt werden. Diese dann mit e#4, e#5,... belegen
                  $device = array($E[2]['value']=>'0',$E[3]['value']=>'0',$E[4]['value']=>'0',$E[5]['value']=>'0');
              }
               
              $fritzbox_ip = "fritz.box";
              $tr64_port = "49000";

              // SOAP Abfrage:
              $client = new SoapClient(null,array(    'location'        => "http://" . $fritzbox_ip . ":" . $tr64_port . "/upnp/control/hosts",
                                                      'uri'            => "urn:dslforum-org:service:Hosts:1",
                                                      'soapaction'    => "urn:dslforum-org:service:Hosts:1#GetSpecificHostEntry",
                                                      'noroot'        => False
                  ));

              try {
              $NumberOfHosts = $client->GetHostNumberOfEntries();


              // Abfrage welches Device online ist:
              if (!(is_soap_fault($NumberOfHosts))) {
                for ($i=0;$i<$NumberOfHosts;$i++) {
                  $Host = $client->GetGenericHostEntry(new SoapParam($i,'NewIndex'));
                  
                  //List all Fritzbox Devices
                  //echo 'Device: ' . $Host['NewHostName'] . 'Status: ' . $Host['NewActive'] . '<br>';    
                  if (array_key_exists($Host['NewHostName'],$device)) {
                      $device[$Host['NewHostName']] = $Host['NewActive'];
                  }      
                }
              }

              $all = 0;
              $i = 2; //Ausgänge

              foreach($device as $x => $x_value) {
                  //echo "Key=" . $x . ", Value=" . $x_value;
                  $all = $all + $x_value;
                  logic_setOutput($id,$i,$x_value); 
                  $i++;
              }


              logic_setOutput($id,1,$all);                     //Ausgang 1 auf Anwesenheitsstatus setzen

              }
              catch (Exception $e) 
              {
              //    echo 'Exception abgefangen: ',  $e->getMessage(), "\n";
              //    auskommentiert - wir wollen ja nichts davon wissen....
              }

              //-------------------------------------------------------------------------------------

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

              Kommentar


                #22
                Hallo Marc, stimmt die Zielgerade war praktisch schon zu sehen :-) Kurze Rückmeldung für Dich. Funktioniert einwandfrei !!! Vielen Dank nochmals. Gruß Tino.

                Kommentar

                Lädt...
                X