Ankündigung

Einklappen
Keine Ankündigung bisher.

FritzBox Plugin 2.0

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

    Hallo zusammen,

    klasse Plugin. Mir fehlte die Funktion zum Telefonbuch-lookup, die ich dann so realisiert habe:


    Code:
        def phonebook_lookup(self, callerId):
            content = self.fetch_url("https://{}:49443/phonebook.lua?sid={}&pbid={}".format(self._fritzbox, self._get_sid(),0))
            if content:
                entries = []
                tree = xml.etree.cElementTree.fromstring(content.decode())
                lookupXpath = ".//*[number='{}']/../person/realName".format(callerId)
                foundElement = tree.find(lookupXpath)
                logger.debug("phonebook_lookup, found: {}".format(foundElement))
                if foundElement is None:
                    logger.info("phonebook_lookup, {} not found".format(callerId))
                    return callerId
                else:
                    return foundElement.text
            else:
                logger.warning("no phonebook found with id 0")
                return
    Die get_sid Methode muss eine ablaufende SID haben, damit nicht immer eine veraltete Sid zurückkommt. Die SID ist 10min gültig, danach muss man eine neue bekommen.
    Code:
        def _get_sid(self):
            if self._sid_time:
                if self._sid_time < (datetime.datetime.now() - datetime.timedelta(seconds = 550)):
                    self._sid = False
            else:
                self._sid = False
            if self._sid:
                return self._sid
            content = self.fetch_url("http://{}/login_sid.lua".format(self._fritzbox))
            if content:
                tree = xml.etree.cElementTree.fromstring(content.decode())
                challenge = tree.find('.//Challenge').text
                response = hashlib.md5("{}-{}".format(challenge, self._password).encode('utf-16le')).hexdigest()
                url = "http://{}/login_sid.lua?username={}&response={}-{}".format(self._fritzbox, self._username, challenge, response)
                content = self.fetch_url(url)
                tree = xml.etree.cElementTree.fromstring(content.decode())
                sid = tree.find('.//SID').text
                if sid != '0000000000000000':
                    self._sid = sid
                    self._sid_time = datetime.datetime.now()
                    return sid
    Wenn nun jemand anruft, wird die Anrufernummer oder der Name auf den Displays im Haus angezeigt...

    Code:
    #callmonitor.py
    logger.info("CallMonitor: '{0}' = by '{1}' source: '{2}'  value: '{3}'"\
          .format(logic.name, trigger['by'], trigger['source'],trigger['value']))
    if trigger['by'] == 'FritzBox':
        if trigger['value'][1] == 'RING':
            sh.return_item("meinhaus.fritzbox.call_incoming")(1, logic.name)
            msg = trigger['source']
            sh.return_item("meinhaus.fritzbox.last_caller")(msg, logic.name)
            pbLookupTime = sh.now() + datetime.timedelta(milliseconds=50)
            sh.trigger('pblookup', dt=pbLookupTime)
        else:
            sh.return_item("meinhaus.fritzbox.call_incoming")(0, logic.name)
    
    callComing = sh.return_item("meinhaus.fritzbox.call_incoming")
    if callComing:
        callerId = sh.return_item("meinhaus.fritzbox.last_caller")()
        for item in sh.match_items('*.meldung'):
            sh.return_item(item.id())(callerId, logic.name)
        nextTime = sh.now() + datetime.timedelta(seconds=1)
        sh.trigger(logic.name, dt=nextTime)
    Code:
    #pblookup.py
    logger.info("pblookup: '{0}' = by '{1}' source: '{2}'  value: '{3}'"\
          .format(logic.name, trigger['by'], trigger['source'],trigger['value']))
    callerId = sh.return_item("meinhaus.fritzbox.last_caller")()
    callerName = sh.fritzbox.phonebook_lookup(callerId)
    logger.info("pblookup: '{0}' => '{1}'"\
          .format(callerId, callerName))
    
    if callerName:
        sh.return_item("meinhaus.fritzbox.last_caller")("T:{}".format(callerName), logic.name)
    Code:
    #items.conf
    [meinhaus]
        [[fritzbox]]
            [[[call_incoming]]]
                type = bool
                name = Incoming Call
                sv_widget = "{{ basic.value('item'~'value', 'item') }}"
            [[[last_caller]]]
                type = str
                name = last caller
                sv_widget = "{{ basic.value('item'~'value', 'item') }}"
    Zuletzt geändert von jentz1986; 01.07.2015, 11:25. Grund: SID braucht Ablaufdatum

    Kommentar


      Hallo Zusammen,

      nachdem ich alle Einträge hier durchgelesen habe, konnte ich mein Problem nicht lösen.
      Hier die Fehlermeldung:
      ... (Anmerkung: bis hier keine Fehlermeldungen)
      2015-06-19 19:49:37 INFO Main Init Plugins
      2015-06-19 19:49:39 ERROR Main Plugin fritzbox exception: __init__() takes at least 4 arguments (4 given)
      Traceback (most recent call last):
      File "/usr/smarthome/lib/plugin.py", line 53, in __init__
      plugin_thread = Plugin(smarthome, plugin, classname, classpath, args)
      File "/usr/smarthome/lib/plugin.py", line 82, in __init__
      exec("self.plugin = {0}.{1}(smarthome{2})".format(classpath, classname, args))
      File "<string>", line 1, in <module>
      TypeError: __init__() takes at least 4 arguments (4 given)
      Der Abschnitt in Plugin.conf:
      [fritzbox]
      class_name = FritzBox
      class_path = plugins.fritzbox
      host = fritz.box
      password = XY1234abcde
      Hat jemand eine Vermutung? Sonderzeichen sind keine drin.

      Gruß
      Uwe

      16.07.2015 - Ergänzung:

      Habe gestern Abend nach der Anweisung aus dem Forum mit Raspberry Pi B-Installation auf Raspberry Pi 2 umgestellt und smarthome.py mit dem Flag -v (Erweitertes Logging) gestartet. Resultat: Fehlermeldung von Fritzbox-Plugin ist weg...
      Werde heute Abend das Ganze ohne "-v" testen.

      10.03.2016 - Fehlerbehebung

      Der Abschnitt in Plugin.conf war fehlerhaft:

      [fritzbox]
      class_name = FritzBox
      class_path = plugins.fritzbox
      host = fritz.box
      password = XY1234abcde
      Richtiger Abschnitt:

      [fritzbox]
      class_name = FritzBox
      class_path = plugins.fritzbox
      username=
      password = XY1234abcde
      host = fritz.box
      def __init__(self, smarthome, username, password,... erwartet 4 Argumente, 2 kommen aus Smarthome selber (self und smarthome), die beiden anderen aus der Plugin.conf. In der Plugin.conf war nur "password" definiert, es fehlte das Argument "username".
      Zuletzt geändert von UBeiMa; 10.03.2016, 14:01. Grund: Fehler gefunden und behoben

      Kommentar


        Hallo,

        ich vermute ein Copy & Paste Fehler. Hast Du die Datei per Hand kopiert?
        Wobei ich sagen muß die Python Fehlermeldung sieht echt komisch aus.

        Bis bald

        Marcus

        Kommentar


          Hallo,

          Ich habe unlängst ein paar neue Dinge installiert/ausprobiert und so wie es aussieht wurde bei apt-get update bzw. upgrade auch eine neue Version von openssl eingespielt. Seither erhalte ich folgende Fehler im Log:

          Code:
          2015-07-01 21:18:31 WARNING  fb-cycle     Problem fetching https://fritz.box:49443/upnp/control/wlanconfig1: [Errno 1] _ssl.c:392: error:14082174:SSL routines:SSL3_CHECK_CERT_AND_ALGORITHM:dh key too small
          2015-07-01 21:18:32 WARNING  fb-cycle     Problem fetching https://fritz.box:49443/upnp/control/wancommonifconfig1: [Errno 1] _ssl.c:392: error:14082174:SSL routines:SSL3_CHECK_CERT_AND_ALGORITHM:dh key too small
          2015-07-01 21:23:29 WARNING  fb-cycle     Problem fetching https://fritz.box:49443/upnp/control/wanipconn1: [Errno 1] _ssl.c:392: error:14082174:SSL routines:SSL3_CHECK_CERT_AND_ALGORITHM:dh key too small
          Was ich bislang rausgefunden habe, ist dass openssl eine Sicherheitslücke geschlossen hat und ich einen neuen key mit einer höheren Verschlüsselung generieren muss. Anschließend muss ich diesen key - ja, wem denn eigentlich? smarthome.py, der Fritzbox, dem plugin..? mitteilen.

          Hat jemand eine Idee?

          Danke,
          Ben

          Kommentar


            als feature würde ich mir wünschen:
            Rufe Telefonnummer xyz an.

            würde ich ins Alarmanlageskript einbauen. Stand heute kann mein Skript nur e-mails verschicken...Anrufe von der Fritzbox wären alarmierender :-)

            als weniger wichtiges feature:
            schreibe alle MAC Adressen mit, die an der Fritzbox sichtbar waren (und nicht notwendigerweise eine IP bekommen haben). Dann hätte ich wenigstens eine erste Spur für die Polizei, wenn der Einbrecher ein Smartphone dabei hatte...und gleichzeitig würde ich alle Spaziergänger ins falsche Licht rücken :-(

            Kommentar


              Hallo Stefan,

              Feature 1 geht doch.
              Feature 2 wird nichts bringen. (Für den angegebenen Zweck)

              Bis bald

              Marcus

              Kommentar


                Hi, danke für den Tip, ich hatte nur die features im 1. thread durchgelesen, nicht das plugin readme selbst.

                Bei der Installation habe ich folgendes Problem:
                Code:
                2015-07-10 22:15:31,558 WARNING  fritzbox     Problem fetching http://192.168.178.1/webservices/homeautoswitch.lua?switchcmd=getswitchlist&sid=None: 403 Forbidden -- www.py:fetch_url:109
                Auf der Fritzbox Seite sehe ich:
                Code:
                [URL="http://192.168.178.1/help/help.lua?sid=e78cc64f9ae0c0ac&helppage=hilfe_syslog_501.html"]Anmeldung an der FRITZ!Box Benutzeroberfläche von IP-Adresse 192.168.178.32 gescheitert (falsches Kennwort).[/URL]
                ich habs mehrfach überprüft. Das Kennwort in der Pluginconf (hier ein Beispiel) ist gleich wie das Kennwort für diesen Benutzer auf der Fritzbox:
                Code:
                [fritzbox]
                    class_name = FritzBox
                    class_path = plugins.fritzbox
                    username = bp1
                    password = 123
                    host = 192.168.178.1
                muss ich irgendwo was in Anführungszeichen setzen?

                PS: ich nutze parallel das "Fritzbox via TR-064" plugin. Vertragen sich die 2 plugins nicht? Sollte doch eigentlich gehen, TR-064 hab ich im webfrontend konfiguriert, fritzbox20 hab ich in der plugin.conf konfiguriert
                Zuletzt geändert von Stefan BaWue; 10.07.2015, 21:52. Grund: PS hinzugefügt

                Kommentar


                  Hallo,

                  die Warning hängt damit zusammen, dass Du anscheinend keine Funkaktoren hast und trotzdem konfiguriert.
                  Das benötigst Du aber nicht für Feature 1.

                  Was meinst mit zwei FB-Plugin parallel? Das Plugin 2.0 benutzt TR-064.

                  Bis bald

                  Marcus

                  Kommentar


                    @mknx:
                    -ja, habe keine Funkaktoren, allerdings kommt diese Fehlermeldung immer zeitgleich mit meinem "rufe xyz an"-skriptaufruf. Wo würde ich Funkaktoren deaktivieren?

                    -bzgl Deiner Frage, ich benutze dieses plugin zusätzlich: https://knx-user-forum.de/forum/supp...ste-via-tr-064
                    das fritzbox Kennwort für dieses plugin habe ich in der smartvisu-config-webseite hinterlegt.
                    das fritzbox Kennwort für Dein plugin2.0 habe ich in plugin.conf stehen

                    Kommentar


                      habe mich jetzt noch mal ein paar Stunden dahinter geklemmt, das smartvisu-fritzbox-plugin abgeschalten und bin jetzt soweit, dass auf der fritzbox-seite nichts mehr bzgl Kennwort angemeckert wird.
                      Im sh log steht jetzt, wenn ich mit
                      Code:
                      sh.fritzbox.call('**2', '**017...3')
                      versuche anzurufen:
                      Code:
                      2015-07-24 17:41:31,599 WARNING  alarmanlage  Problem fetching https://192.168.178.1:49443/upnp/control/x_voip: 500 Internal Server Error -- www.py:fetch_url:109
                      x_voip irritiert mich etwas. Wir nutzen analoge DECT Telefone

                      Kommentar


                        Anscheinend hat sonst keiner das von mir beschriebene Problem

                        Zitat von bkr Beitrag anzeigen

                        Code:
                        2015-07-01 21:18:31 WARNING fb-cycle Problem fetching https://fritz.box:49443/upnp/control/wlanconfig1: [Errno 1] _ssl.c:392: error:14082174:SSL routines:SSL3_CHECK_CERT_AND_ALGORITHM:dh key too small
                        2015-07-01 21:18:32 WARNING fb-cycle Problem fetching https://fritz.box:49443/upnp/control/wancommonifconfig1: [Errno 1] _ssl.c:392: error:14082174:SSL routines:SSL3_CHECK_CERT_AND_ALGORITHM:dh key too small
                        2015-07-01 21:23:29 WARNING fb-cycle Problem fetching https://fritz.box:49443/upnp/control/wanipconn1: [Errno 1] _ssl.c:392: error:14082174:SSL routines:SSL3_CHECK_CERT_AND_ALGORITHM:dh key too small
                        Für den Fall, dass doch noch jemand auf dieses Problem treffen sollte: Der workaround, den ich jetzt gewählt habe, ist bei der Abfrage komplett auf SSL zu verzichten.
                        Im plugin fritzbox muss man dazu in der __init.py__ alle "https" Anfragen durch "http" ersetzen und den Port von 49443 auf 49000 setzen. Ist nicht richtig schön, aber das Einzige, was bei mir geholfen hat.
                        (Fritzbox 7270 v3 mit FritzOS 6.05)

                        Sollte jemand noch eine bessere Lösung einfallen, bin ich immer noch an Vorschlägen interessiert ;-)

                        Ben

                        Kommentar


                          Zitat von Stefan BaWue Beitrag anzeigen
                          Auf der Fritzbox Seite sehe ich:
                          Code:
                          [URL="http://192.168.178.1/help/help.lua?sid=e78cc64f9ae0c0ac&helppage=hilfe_syslog_501.html"]Anmeldung an der FRITZ!Box Benutzeroberfläche von IP-Adresse 192.168.178.32 gescheitert (falsches Kennwort).[/URL]
                          ich habs mehrfach überprüft. Das Kennwort in der Pluginconf (hier ein Beispiel) ist gleich wie das Kennwort für diesen Benutzer auf der Fritzbox:
                          [CODE][fritzbox]
                          Das Problem habe ich auch, sobald sich jemand mit einem anderen Namen an der Box angemeldet hat, über Browser oder Handy.
                          Melde Dich mal am Browser mit den Zugangsdaten für Smarthome an und versuche es noch mal mit SH.

                          Das Plugin scheint bei der 7270 den Usernamen nicht zu übermitteln.

                          Gruß Rudi

                          Gruß
                          ElektroRudi

                          ............kann,.muß aber net....

                          Kommentar


                            Hallo zusammen,
                            irgendwie mag ich bzgl. der nicht funktionierenden Host-Online Abfrage bei meiner 7390 nicht aufgeben , daher habe ich heute nochmal recherchiert und im Symcon-Forum den Hinweis gelesen, dass das "Problem mit den nicht funktionierenden Hostabfragen" wohl bei der 7390 nur bei einer Hostanzahl > 16 auftritt.

                            Mal an die Mitstreiter bei denen die Hostabfragen klappen: Hat jemand mehr als 16 Hosteinträge und trotzdem klappt die Abfrage der Hosts?

                            Habe nun parallel mal den AVM-Support angeschrieben und gefragt ob das so ist, denn angeblich gibt es wohl einen Bugfix für die 7490, nicht aber für die 7390.

                            Cheers,
                            Oliver

                            Kommentar


                              Naja, anscheinend mochte hier keiner antworten... .
                              Anyway, AVM hat sowohl die aktuelle Limitierung auf 16 Hosts bestätigt als auch den Fix in der neuesten Beta für die 7490. Für die 7390 ist hier keine Betainkludierung geplant, wohl aber eine Aufnahme in ein Final Release. ABER: unsicherer Zeitpunkt: Dezember 2015+x...
                              Cheers,
                              Oliver

                              Kommentar


                                Mal was positives für die 7390 Besitzer mit mehr als 16 Hosts. Eben die neueste Laborversion runtergeladen und geflasht..... Nun klappt es mit den Hosts, bei mir aktuell > 50 und es läuft! Nun muß es die Labor nur noch in das Final-Release schaffen...

                                Kommentar

                                Lädt...
                                X