Ankündigung

Einklappen
Keine Ankündigung bisher.

Kompatibilität Asterisk-Plugin

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

    Kompatibilität Asterisk-Plugin

    Moin,

    nachdem ich neulich meinem Linux-Server ein Update verpasst habe lief meine Smarthome-Installation von 2018 natürlich nicht mehr hoch. Dummerweise läuft da die Haustürklingel drüber. Mittlierweile der Fragen überdrüssig, wann man denn endlich mit einer Lösung des Problems rechnen könnte, musste ich jetzt doch mal Hand anlegen. Also schwups ein git pull und es geht immer noch nicht. Zig Kämpfe mit Python und SmartHomeNG läuft so halb unter Bookworm und venv. Nur das Asterisk-Plugin nicht:

    Code:
    Traceback (most recent call last):
      File "/usr/local/smarthome/lib/network.py", line 754, in _connect_thread_worker
        self._connected_callback(self)
    TypeError: Asterisk.handle_connect() takes 1 positional argument but 2 were given​
    Da scheint die Version des Plugins (v1.9.5) nicht mit der Version von SmartHomeNG (v1.9.5) kompatibel zu sein. Gibt es da eine Version, in der das Plugin funktioniert?

    Markus

    #2
    Kleiner Hack und es klingelt wieder:
    Code:
    diff --git a/asterisk/__init__.py b/asterisk/__init__.py
    index a7425724..5ea180d0 100755
    --- a/asterisk/__init__.py
    +++ b/asterisk/__init__.py
    @@ -150,7 +150,7 @@ class Asterisk(SmartPlugin):
                 if device == hang:
                     self._command({'Action': 'Hangup', 'Channel': channel}, reply=False)
     
    -    def found_terminator(self, data):
    +    def found_terminator(self, data, _):
             data = data.decode()
             event = {}
             for line in data.splitlines():
    @@ -309,7 +309,7 @@ class Asterisk(SmartPlugin):
             else:
                 self.logger.error(f'Connection to {self.host}:{self.port} not possible, plugin not starting')
     
    -    def handle_connect(self):
    +    def handle_connect(self, client):
             self._command(self._init_cmd, reply=False)
             for mb in self._mailboxes:
                 mbc = self.mailbox_count(mb)
    ​
    Das Plugin crasht trotzdem noch jetzt aber erst nachdem es die Klingel gerufen hat.

    Kommentar


      #3
      Moin,

      ich kenne das Asterix Plugin zwar nicht, aber die Callback Routine wird in anderen Plugins, die die lib.network nutzen mit einem Parameter **client** aufgerufen, der im asterix Plugin fehlt.

      Mal als Schuss ins Blaue:

      Ändere mal im Plugin Zeile 312 von
      Code:
          def handle_connect(self):
      in
      Code:
          def handle_connect(self, client):
      ​(auch wenn die Client Information in handle_connect() nicht benötigt wird.
      Viele Grüße
      Martin

      There is no cloud. It's only someone else's computer.

      Kommentar


        #4
        Ich vermute, Du bist der erste der das Plugin seit langem nutzt :-)

        Bei mir ist zwar Asterisk installiert aber ich nutze es nur um die Telefonanlage klingeln zu lassen wenn jemand auf die Türklingel drückt...

        Kommentar


          #5
          Zitat von bmx Beitrag anzeigen
          Ich vermute, Du bist der erste der das Plugin seit langem nutzt :-)
          Ich habe es schon befürchtet.

          Zitat von bmx Beitrag anzeigen
          Bei mir ist zwar Asterisk installiert aber ich nutze es nur um die Telefonanlage klingeln zu lassen wenn jemand auf die Türklingel drückt...
          Wie machst du das? Bei mir hängt der Klingeltaster an einem KNX-Binäreingang. Der Tastendruck löst eine Logik in SmartHomeNG aus, die dann den Asterisk anruft. Der wiederum meldet sich dann über SIP bei der DECT-Basistation. Und so weiter.

          Zitat von Msinn Beitrag anzeigen
          Moin,
          ich kenne das Asterix Plugin zwar nicht, aber die Callback Routine wird in anderen Plugins, die die lib.network nutzen mit einem Parameter **client** aufgerufen, der im asterix Plugin fehlt.

          Mal als Schuss ins Blaue:

          Ändere mal im Plugin Zeile 312 von


          Exakt dieses habe ich schon getan (siehe Beitrag weiter oben). Das Plugin ranzt allerdings weiterhin ab:
          Code:
          lib.network (TCP_Client_127.0.0.1:5038) receive in terminator mode calling
          data_received_callback <bound method Asterisk.found_terminator of <plugins.asterisk.Asterisk object at 0x7fa48c705110>> faile
          d: 'Tcp_client' object has no attribute 'decode' -- If stack trace is necessary, enable/check debug log​
          Tut bei meinem Use-Case nicht weiter weh, weil es trotzdem den Ruf aufbaut, schön ist es aber nicht. Vielleicht muss ich mich doch mal durch das Plugin wühlen.

          Kommentar


            #6
            Morg Du kennst die lib.network doch recht gut 😎
            Hast Du eine Idee, was dort im Plugin im Argen liegt?
            Viele Grüße
            Martin

            There is no cloud. It's only someone else's computer.

            Kommentar


              #7
              Schaue ich die Tage mal rein, war die Woche weg und bin am Wochenende noch ausgebucht. Sollte sich aber lösen lassen, denke ich.

              Erste Idee: decode konvertiert bytes nach string - Rückgabewert von TCP_client ist normalerweise bytes und muss decodiert werden. Hier wird aber nicht der Rückgabewert, sondern das client-Objekt referenziert. Entweder fehlt bei dem Callback ein "()" oder es wird das falsche Objekt referenziert (client statt result).

              Kommentar


                #8
                Nee, exakt dieses hast du nicht getan ;-)

                Tco_client ruft auf:

                Code:
                connect_callback(self, data)
                Du hast geschrieben:

                Code:
                def found_terminator(self, data, _):
                Damit wird dem Parameter data das Tcp_client-Objekt zugewiesen ("self") und die eigentlichen Daten versacken im "_".

                Ändere das mal in

                Code:
                def found_terminator(self, client, data):
                dann sollte es gehen.

                (Wobei ich gerade nicht genau sagen kann, wieso der Client sich selbst zurückgibt... muss mal sehen, ob ich dazu was finde. Das scheint mir - an der Stelle - nicht notwendig. Ggf. bei mehreren aktiven Clients?).

                Kommentar


                  #9
                  Ich habe da mal ein Update vom Asterisk Plugin in develop geschoben mit den Änderungen.

                  Kommentar

                  Lädt...
                  X