Ankündigung

Einklappen
Keine Ankündigung bisher.

Support Thread für das GPIO Plugin

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

    Support Thread für das GPIO Plugin

    Alle Fragen und Anregungen zum gpio Plugin bitte in diesen Thread.

    #2
    Hi Onkelandy,

    wir haben gerade bemerkt dass es wohl Probleme gibt, wenn das GPIO Plugin verwendet wird und zusätzlich noch ein weiteres Plugin welches die Lib RPI.GPIO benutzt.
    Vom Verhaltensieht es dananch aus wie:

    a) gpio plugin läuft und reserviert den Zugriff auf die GPIOs
    b) das nächste Plugin welches auch die GPIO Lib nutzt bekommt keinen Zugriff auf die GPIOs mehr.

    wurde so etwas schon mal beobachtet?

    Grüße
    Frank

    Kommentar


      #3
      Hi!

      Ich denke nicht, dass wir das Problem lösen können. Du meinst schon, dass der Zugriff auf die gleichen Pins nicht funzt, oder? Weil auf andere müsste man auf jeden Fall zugreifen können.
      Was man theoretisch machen könnte.. im Plugin optional ein GPIO-cleanup() einfügen und mal schauen, was dann los ist. Aber sobald der Status wieder abgefragt wird, wird dann wohl auch der Zugriff auf jenen Pin blockiert.
      Eventuell macht eine andere Library das anders? Dann müssten wir umstellen.

      Kommentar


        #4
        Hi,

        ne nicht auf die gleichen Pins, das wäre mir dann logisch das das nicht tut.

        Das Szenario wäre zum Beispiel:
        Gpio Plgn schaltet ein Relais auf GPIO 5
        Rcs1000 Plgn sendet Daten über GPIO 17

        Ich bitte mal den Kollegen dass er die logs postet.

        Kommentar


          #5
          Ja, das wäre interessant. Prinzipiell kann man's ja testen, indem man bei aktivem Plugin einfach noch eine python Konsole aufmacht und dort das Modul importiert und einen Pin, der nicht belegt ist, abcheckt. Das hätte bei mir soweit ohne Probleme geklappt.

          Kommentar


            #6
            Hallo,

            ich habe mir ein kleines Testsystem aufgebaut, auf dem außer dem GPIO plugin und dem rcs1000 Plugin nichts genutzt wird

            plugin.yaml
            Code:
            %YAML 1.1
            ---
            database:
                plugin_name: database
                driver: sqlite3
                connect:
                -   database:./var/db/smarthomeng.db
                -   check_same_thread:0
            GPIO:
                plugin_name: gpio
                plugin_enabled: true
            rcs1000:
               plugin_name: rcs1000n
               rcs1000n_gpio: '17'
               rcs1000n_sendDuration: '0.1'​
            items.yaml
            Code:
            Schaltsteckdose1:
                    schalten:
                        type: bool
                        rcs_SystemCode: 11010
                        rcs_ButtonCode: 'D'
            Relais1:
                    name: Relais1
                    schalten:
                        type: bool
                        gpio_out: 29
            Relais2:
                    name: Relais2
                    schalten:
                        type: bool
                        gpio_out: 31​
            Das System startet ohne Fehlermeldung im Log auf. Die Ausgänge (Relais) lassen sich problemlos schalten. Sobald aber ein rcs1000 Device geschalten werden soll, steht im log dieser Fehlereintrag:
            Code:
            ERROR    plugins.rcs1000n    Error: during instantiation of object or during send to device: local variable 'rfdevice' referenced before assignment
            Die Schaltsteckdose schaltet - ihr vermutet es bereits - nicht.

            Deaktiviert man im plugin.yaml das GPIO plugin, funktioniert das RC1000 fehlerfrei, d.h. kein Eintrag im Log und die Dose schaltet wie gewünscht.


            Ich habe mal ins rcs1000 Plugin geschaut. Dort gibt es im file cRcSocketSwitch.py den Befehl:
            Code:
                    try:
                        rfdevice = RFDevice(self.gpio)​
            ...
                    finally:
                        rfdevice.cleanup()​
            So wie es für mich aussieht, schlägt der Befehlt RFDevice(self.gpio)​ fehl, sobald das GPIO Plugin läuft - als ob das GPIO Plugin den Portzugriff irgendwie blockiert.

            Vielen Dank für allen Support im Voraus :-)

            Daniel​

            Kommentar


              #7
              Zitat von Onkelandy Beitrag anzeigen
              Ja, das wäre interessant. Prinzipiell kann man's ja testen, indem man bei aktivem Plugin einfach noch eine python Konsole aufmacht und dort das Modul importiert und einen Pin, der nicht belegt ist, abcheckt. Das hätte bei mir soweit ohne Probleme geklappt.
              Hi Onkelandy,

              meinst Du eine Standard Python console die erstmal nichts mit shng zu tun hat?

              Kommentar


                #8
                Kann es sein, dass das rcs1000 Plugin, das im Einsatz ist, sehr alt ist..? Es hat nun ein n hinten dran und der Code ist ziemlich anders. Ob die neue Version das Problem behebt, sei dahin gestellt, aber aktualisiere doch bitte mal, dafra

                Hasenradball ja genau

                Kommentar


                  #9
                  Onkelandy
                  Das rcs1000n gibt es erst seit v1.9.4, es gab zuvor kein derartig bezeichnetes plugin.
                  Daher ist es das aktuelle
                  😊

                  Ich habe mal folgendes getestet.
                  Man nehme zwei Scripte
                  gpio_test1.py
                  gpio_test2.py

                  Man lässt das erste laufen welches den GPIO X schaltet. Und macht kein Cleanup beim verlassen.
                  Danach ruft man das zweite Script auf.
                  Das zweite Script wirft nur eine warning wenn man den gleichen GPIO X schalten will, schaltet aber dennoch.
                  Wenn man aber einen anderen GPIO Y schaltet kommt keine warning.

                  Was ich noch nicht testen konnte wäre, wenn script1 noch activ ist und script2 activ wird.

                  Kommentar


                    #10
                    Hab die Details im oberen Beitrag übersehen Der Code im cRcSocketSwitch.py macht so jedenfalls keinen Sinn. Das Cleanup darf nur passieren, wenn RFDevice(self.gpio) erfolgreich war. Das müsstest bitte fixen.

                    Das mit den Testscripts.. hast du parallel auch das Plugin am Laufen, ja? Also auf gut Deutsch, da kommt sich nix in die Quere, oder?

                    Kommentar


                      #11
                      Zitat von Onkelandy Beitrag anzeigen
                      aber aktualisiere doch bitte mal, dafra

                      Ich nutze bereits die aktuellste, releaste Version aller Plungins.

                      Kommentar


                        #12
                        Zitat von Onkelandy Beitrag anzeigen
                        Hab die Details im oberen Beitrag übersehen Der Code im cRcSocketSwitch.py macht so jedenfalls keinen Sinn. Das Cleanup darf nur passieren, wenn RFDevice(self.gpio) erfolgreich war. Das müsstest bitte fixen.

                        Das mit den Testscripts.. hast du parallel auch das Plugin am Laufen, ja? Also auf gut Deutsch, da kommt sich nix in die Quere, oder?
                        Hi @Onkelandy,

                        ich gebe Dir recht in der
                        cRcSocketSwitch.py
                        sollte das
                        Code:
                        try:
                        ...
                        finally:
                        gefixed werden, das sollte so nicht sein.
                        Das gehe ich an...

                        Jedoch kommt der Fehler:
                        2023-04-08 19:12:58 ERROR plugins.rcs1000n Error: during instantiation of object or during send to device: local variable 'rfdevice' referenced before assignment
                        aus der
                        rcs1000n.__init.py__ => update_Item
                        Code:
                        # sending commands and avoid parallel access by threading.Lock()
                                    with self._lock:
                                        try:
                                            # create Brennenstuhl RCS1000N object
                                            obj = cRcSocketSwitch.RCS1000N(self._gpio)
                                            # prepare and send values
                                            obj.send(*values)
                                        except Exception as err:
                                            self.logger.error('Error: during instantiation of object or during send to device: {}'.format(err))
                                        else:
                                            self.logger.info('Info: setting Device {} with SystemCode {} to {}'.format(ButtonCode, SystemCode, value))
                                        finally:
                                            # give the transmitter time to complete sending of the command (but not more than 10s)
                                            time.sleep(min(self._send_duration, 10))​
                        aus dem try das hier gehandelt wird.
                        Die Instantiierung des Objectes schlägt fehl:
                        Code:
                        # create Brennenstuhl RCS1000N object
                                            obj = cRcSocketSwitch.RCS1000N(self._gpio)
                                            # prepare and send values
                                            obj.send(*values)
                                        except Exception as err:
                                            self.logger.error('Error: during instantiation of object or during send to device: {}'.format(err))
                                        ​
                        Fazit:

                        a) wenn das GPIO Plugin aktiv ist wird, ist eine weitere Insrtanz der RPI.GPIO lib nicht möglich und es kommt obiger Fehler.

                        b) ist das GPIO Plugin nicht aktiv, dann lässt sich hiermit eine Instanz der RPI.GPIO erzeugen und der Code funktioniert:
                        Code:
                        try:
                                            # create Brennenstuhl RCS1000N object
                                            obj = cRcSocketSwitch.RCS1000N(self._gpio)
                                            # prepare and send values
                                            obj.send(*values)​
                        Frage können wir es Irgendwie hinbekommen dass zwei Instanzen der RPI.GPIO lib laufen?
                        Bzw. braucht das GPIO Plugiin die ganze zeit die Instanz der RPI.GPIO?
                        Die rcs1000n erszeugt die Instanz nur kurz und gibt sie wieder frei, das müsste doch beim GPIO Plugin genauso gehen.
                        Immer nur wenn geschaltet werden soll => Instanz erzeugen => schalten => Instanz freigeben (jedoch ohne cleanup, sonst gehen die GPIOs wieder in Ursprungszustand).

                        Das rcs1000n braucht den Zugriff nur für wenige ms.

                        PS: Ich werde den Code überarbeiten, aber das wird das Problem erstmal nicht beheben, hab da gerade keine Idee.

                        Kommentar


                          #13
                          Wenn ich die Stellen wie folgt fixe:

                          cRcSocketSwitch.py
                          :

                          Code:
                                  try:
                                      rfdevice = RFDevice(self.gpio)
                                  except Exception as err:
                                      logging.error('Error: during instantiation of object: {}'.format(err))
                                  else:
                                      rfdevice.enable_tx()
                                      rfdevice.tx_repeat = 10
                                      values = self.prepareCodes(systemCode, btn_code, status)
                                      send_code = self.calc_DecimalCode_python_style(*values)
                                      self.config['code'] = send_code
                                      rfdevice.tx_code(**self.config)
                                      rfdevice.cleanup()
                                  finally:
                                      pass​

                          und in
                          rcs1000n.__init.py__ => update_Item
                          :

                          Code:
                          with self._lock:
                                          try:
                                              # create Brennenstuhl RCS1000N object
                                              obj = cRcSocketSwitch.RCS1000N(self._gpio)
                                          except Exception as err:
                                              self.logger.error('Error: during instantiation of object: {}'.format(err))
                                          else:
                                              # prepare and send values
                                              obj.send(*values)
                                              self.logger.info('Info: setting Device {} with SystemCode {} to {}'.format(ButtonCode, SystemCode, value))
                                          finally:
                                              # give the transmitter time to complete sending of the command (but not more than 10s)
                                              time.sleep(min(self._send_duration, 10))​
                          Kommt folgender Fehler in SHNG wenn das GPIO Plugin aktiv ist und rcs1000n senden will:

                          2023-04-08 19:55:15 ERROR root Error: during instantiation of object: A different mode has already been set!

                          Kommentar


                            #14
                            Onkelandy, dafra,

                            Problem gelöst bzw. verstanden was der Grund ist!

                            Wenn das gpio Plugin und rcs1000n Plugin verschiedene Modi nutzen funktioniert das nicht....

                            Also wenn beide Plugins zum Beispiel den mode
                            Code:
                            BCM
                            nutzen.
                            Dann tut es.

                            dafra
                            kannst Du das GPIO Plugin mal auf
                            BCM
                            stellen und testen?

                            Beim rcs1000n ist derzeit nicht vorgesehen den mode zu ändern.

                            Kommentar


                              #15
                              Onkelandy PR ist raus

                              PS: wenn der ware Fehler kommt, kommt man schnell dahinter...😉
                              Zuletzt geändert von Hasenradball; 08.04.2023, 19:48.

                              Kommentar

                              Lädt...
                              X