Ankündigung

Einklappen
Keine Ankündigung bisher.

Python 3.8 bzw. 3.9.: SmartHomeNG startet nicht

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

    #16
    Zitat von Onkelandy Beitrag anzeigen
    Am besten wäre vermutlich pyserial in die core reqs zu nehmen, sobald alles ausgiebig genug getestet ist.
    Das halte ich für keine gute Idee. Die Requirements sollten schon da angegeben werden, wo sie benutzt werden, also bei dem jeweiligen Plugin.
    Viele Grüße
    Martin

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

    Kommentar


      #17
      So Problem ist gelöst. Ich habe mir mal die requirements des pymodbus angeschaut und auch noch mal in den Quellcode reingeschaut. Die Installation von pymodbus muss entweder so erfolgen:

      Code:
      pip install pymodbus[serial]
      oder pyserial und pyserial-async müssen manuell nachinstalliert werden.

      Danach muss doch das pluggitplugin angepasst werden. In der ini muss bei:

      Code:
      from pymodbus.client.sync import ModbusTcpClient
      das ".sync" entfernt werden. Inwiefern das dann noch mit einer alten Version von pymodbus läuft, weiß ich allerdings nicht.

      Kommentar


        #18
        Dann müssten also pymodbus, pyserial und pyserial-async ins requirements.txt File rein?

        Was passiert denn beim import von pymodbus.client.sync - gibt es da einen Fehler? Dann könnte man das ja in einem try except abfangen und die Kompatibilität zu älteren Versionen wäre immer noch gewährleistet oder?
        Ich hab das zB im xiamo_vac Plugin so gelöst:
        Code:
        ​                    try:
                                self.vakuum = Vacuum(self._ip, self._token, 0, 0)
                            except Exception:
                                self.vakuum = RoborockVacuum(self._ip, self._token, 0, 0)

        Kommentar


          #19
          Zitat von Onkelandy Beitrag anzeigen
          Dann müssten also pymodbus, pyserial und pyserial-async ins requirements.txt File rein?
          Ich bin mir nicht sicher. Zum einen brauche ich eigentlich im pluggit die serial-Sachen nicht. Ich muss noch mal schauen, dass ich morgen mal den import ändere, dann klärt sich das vielleicht anders.

          Das mit dem try ist eine gute Idee, werde ich auch so umsetzen. Morgen gibt es dann mehr Infos.

          Kommentar


            #20
            So für die Pluggit gibt es jetzt ein Update. Es ist sowohl mit Python 3.7.9 und pymodbus 2.4.0 als auch mit Python 3.9.15 und pymodbus 3.0.0 getestet. Ich habs jetzt hier aktualisiert.

            Msinn: Ich stelle mich mit Github noch etwas doof an. Landet es bei dir irgendwie im Develop von SmartHomeNG? Sprich, habe ich das richtig "verlinkt".

            Dann noch ein paar Anmerkungen zu den requirements. Sowohl pyserial, als auch pyserial-asyncio sind erforderlich, dass das pluggit-Plugin läuft, obwohl beides nicht benötigt wird. Das lässt sich aber nicht vermeiden und hängt vermutlich mit irgendwelchen Querverweisen im Code des pymodbus zusammen. Dennoch würde ich mich schwertun, das in die requirements mit rein zu tun, weil hoffentlich mit einem späteren Release von pymodbus diese "Probleme" behoben werden. Ich bin da aber offen und passe mich an. Wie sehen die "Chefentwickler" das?

            Kommentar


              #21
              Zitat von Cannon Beitrag anzeigen
              Landet es bei dir irgendwie im Develop von SmartHomeNG? Sprich, habe ich das richtig "verlinkt".
              Normalerweise landen Plugins im zentralen Repo, wenn jemand einen Pull Request gegen den develop Branch dieses Repos stellt. Falls DU Dich mit PRs schwer tust, sag bescheid, dann kann ich es aufnehmen.

              Ist das Plugin ein 1-zu-1 Ersatz für das bestehende Plugin (selbe Parameter und Attribute) oder ist es ein "breaking Change" zu dem bisherigen Plugin? In diesem Fall sollte Dein Plugin den Namen pluggit2 tragen. (Es sei denn, das bisherige Plugin ist nicht mehr nutzbar und kann/sollte entsorgt werden)


              Zitat von Cannon Beitrag anzeigen
              Das lässt sich aber nicht vermeiden und hängt vermutlich mit irgendwelchen Querverweisen im Code des pymodbus zusammen. Dennoch würde ich mich schwertun, das in die requirements mit rein zu tun, weil hoffentlich mit einem späteren Release von pymodbus diese "Probleme" behoben werden.
              Da sind wohl die Requirements innerhalb des pymodbus Packages nicht vollständig.
              Ich wäre dafür die Requirements beim PlugIt Plugin erstmal mit aufzunehmen und in der requirements.txt einen Kommentar einzufügen, dass dieses Requirement nur da ist, weil pymodbus Version x.y.z dieses Package braucht, es selber aber nicht in seinen Requirements hat.
              Viele Grüße
              Martin

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

              Kommentar


                #22
                Zitat von Msinn Beitrag anzeigen
                Normalerweise landen Plugins im zentralen Repo, wenn jemand einen Pull Request gegen den develop Branch dieses Repos stellt. Falls DU Dich mit PRs schwer tust, sag bescheid, dann kann ich es aufnehmen.
                Könntest du das prüfen, ob ich das richtig gemacht habe?

                Zitat von Msinn Beitrag anzeigen
                Ist das Plugin ein 1-zu-1 Ersatz für das bestehende Plugin (selbe Parameter und Attribute) oder ist es ein "breaking Change" zu dem bisherigen Plugin? In diesem Fall sollte Dein Plugin den Namen pluggit2 tragen. (Es sei denn, das bisherige Plugin ist nicht mehr nutzbar und kann/sollte entsorgt werden)
                Wenn du so fragst, ist das schon sehr geändert. Die ganzen Attribute und Items passen ja gar nicht mehr. Dann muss ich das noch mal ändern ... auf pluggit2 .... blöd nur, dass ich das ja Jahre schon so nutze.

                Zitat von Msinn Beitrag anzeigen
                Da sind wohl die Requirements innerhalb des pymodbus Packages nicht vollständig.
                Ich wäre dafür die Requirements beim PlugIt Plugin erstmal mit aufzunehmen und in der requirements.txt einen Kommentar einzufügen, dass dieses Requirement nur da ist, weil pymodbus Version x.y.z dieses Package braucht, es selber aber nicht in seinen Requirements hat.
                Es ist schon in den requirements "optional" mit drin. Aber ohne beide optionalen Pakete funktioniert das nicht. Der Fehler ist irgendwo im Code von modbus selbst. Hier mal ein Auszug der requirements.

                Code:
                # -------------------------------------------------------------------
                # Python packages used by pymodbus.
                # -------------------------------------------------------------------
                # This file installs all requirements used by pymodbus, and are
                # intended for developers who have cloned the repository.
                #
                # pymodbus is only being tested on python version 3.8, 3.9 and 3.10
                # depending on the usage profile it might work on other versions.
                python_version>="3.8"
                
                # -------------------------------------------------------------------
                # Required packages.
                # -------------------------------------------------------------------
                # install:required
                
                
                # -------------------------------------------------------------------
                # optional packages.
                # -------------------------------------------------------------------
                # These packages are optional for the runtime, but demanded for
                # document generation, development and test.
                #
                # these packages can be installed like:
                #    pip install pymodbus[serial]
                
                # install:repl
                aiohttp>=3.8.1
                typer[all]>=0.6.1
                prompt-toolkit==3.0.8
                
                # install:serial
                pyserial>=3.5
                pyserial-asyncio==0.6
                
                # install:datastore
                redis>=2.10.6
                sqlalchemy>=1.1.15​
                Das Problem die entsprechenden requirements dann in das plugin einzupacken: Ich weiß nicht mal welche Version. Klar weiß ich das bei der 3.0.0. Aber jede Version bis runter zu 1.4.0 abzuprüfen. wäre ja echt müssig. Zumal das dann auch nicht getestet werden kann. Darüber hinaus hat jede pymodbus-Version in den requirements eine bestimmte pyserial-Version.

                Kommentar


                  #23
                  Ich hatte neulich schon irgendwo anders gelesen (wo, weiss ich nicht mehr), dass an pymodbus in der aktuellen Version strukturelle Änderungen vorgenommen wurden.

                  Im Trovis-Plugin verwende ich sowohl pymodbus als auch serial:
                  Code:
                  import serial
                  [...]
                  from pymodbus.client.sync import ModbusSerialClient as ModbusClient
                  Im Helios-Plugin wird von den beiden nur serial genutzt.

                  Nach Deinen jetzt gemachten Erfahrungen - muss ich da beigehen, oder sollte das 'as is' laufen? Danke im Voraus für die Rückmeldung!


                  Edit: Hab's gefunden, hier im Gitter war's.

                  /tom
                  Zuletzt geändert von Tom Bombadil; 26.10.2022, 12:34.

                  Kommentar


                    #24
                    Idealerweise sollten alle Plugins die pymodbus nutzen gleichzeitig umgestellt werden. Sonst ist das Chaos beim nächsten Update perfekt wenn jemand ein angepasstes und ein älteres Plugin mit pymodbus nutzt.

                    In Frage kämen da z.B.
                    Code:
                    Search "pymodbus"
                    .\plugins\sma_mb\__init__.py (3 hits)
                    .\plugins\trovis557x\tools\coil_sniffer.py (1 hit)
                    .\plugins\trovis557x\tools\register_sniffer.py (1 hit)
                    .\plugins\trovis557x\__init__.py (1 hit)
                    .\plugins\helios_tcp\__init__.py (1 hit)
                    .\plugins\modbus_tcp\__init__.py (4 hits)
                    .\plugins\kostalmodbus\inverter.py (4 hits)
                    .\plugins\pluggit\__init__.py (6 hits)
                    .\plugins\ksemmodbus\ksem.py (4 hits)
                    ​
                    wobei ich jetzt noch nicht geschaut habe ob es dort Plugins mit deprecated gibt.

                    Kommentar


                      #25
                      Zitat von Cannon Beitrag anzeigen
                      Könntest du das prüfen, ob ich das richtig gemacht habe?
                      Augenscheinlich nicht. Im SmarthomeNG/plugins Repo gibt es zu dem Plugin keinen PR:

                      Capto_Capture 2022-10-26_01-56-14_PM.jpg
                      Viele Grüße
                      Martin

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

                      Kommentar


                        #26
                        Zitat von Tom Bombadil Beitrag anzeigen
                        Nach Deinen jetzt gemachten Erfahrungen - muss ich da beigehen, oder sollte das 'as is' laufen? Danke im Voraus für die Rückmeldung!
                        pymodbus.client.sync gibt es bei der neuen Version nicht mehr. Standardmäßig ist aber die 3.0.0 automatisch installiert, wenn man den Raspberry PI auf Bullseye bringt. Ich habs so gelöst, wie von OnkelAndy empfohlen:

                        Code:
                        try:
                            # for newer versions of pymodbus
                            from pymodbus.client.tcp import ModbusTcpClient
                        except:
                            # for older versions of pymodbus
                            from pymodbus.client.sync import ModbusTcpClient​
                        In deinem Fall sollte das für die neue Version in from pymodbus.client.serial umgebaut werden, damit das mit modbus 3.0.0 lauffähig ist. Zumindest bis hierher, was es noch an Änderungen gibt, sehe ich erst einmal nicht.

                        Was die requirements betrifft, soll das Problem mit pymodbus 3.0.1 (in ca. 1-2 Wochen) behoben werden. Damit wird sich die gesamte Problematik damit auch auflösen, denke ich. Mehr infos hier: https://github.com/riptideio/pymodbus/issues/1144

                        Zitat von bmx Beitrag anzeigen
                        Idealerweise sollten alle Plugins die pymodbus nutzen gleichzeitig umgestellt werden. Sonst ist das Chaos beim nächsten Update perfekt wenn jemand ein angepasstes und ein älteres Plugin mit pymodbus nutzt.
                        Es ist schwierig abzuschätzen, welche Änderungen sich weiter auf die anderen Plugins auswirken. Zumindest schaue ich mir die Tage mal alles an, was das "pymodbus.client.sync" betrifft. Das lässt sich ja leicht heraus finden und dann ggf. fixen. Generell halte ich es für sinnvoll die plugins alle kompatibel zu machen, statt einfach das requirement hochzusetzen. Bei der Neuaufsetzung von SmartHomNG trifft das eigentlich alle, die modbus nutzen. Denn nach einer Neuinstallation ist erst einmal das neueste drauf und man müsste dann downgraden, was ich persönlich nicht ganz optimal finde. Aber ich schaue mir das die Tage noch mal an.

                        Zitat von Msinn Beitrag anzeigen
                        Augenscheinlich nicht. Im SmarthomeNG/plugins Repo gibt es zu dem Plugin keinen PR:
                        Dann habe ich das falsch gemacht. Auch hier schaue ich mal, und passe das pluggit-Plugin dann entsprechend so an, dass es dann pluggit2 heißt.

                        Kommentar


                          #27
                          Danke - ich werde aber aus dem verlinkten git issue nicht schlau.

                          Für mich liest sich das so: Es wird bestätigt, dass 'from pymodbus.client.tcp import ModbusTcpClient' aufgrund eines Bugs Fehler produziert und diese in 1-2 Wochen behoben sein werden. Konkret kommen Fehlermeldungen, die Module serial und serial_asyncio wären nicht bekannt.

                          Aber: Wird der genannte Bugfix auch die hier besprochenen Probleme beheben (=kein Handlungsbedarf), oder alles 'works as intended' und die hier genannten Änderungen sind trotzdem erforderlich, weil sie mit dem Issue nichts zu tun haben?

                          /tom

                          Kommentar


                            #28
                            Zitat von Tom Bombadil Beitrag anzeigen
                            mich liest sich das so: Es wird bestätigt, dass 'from pymodbus.client.tcp import ModbusTcpClient' aufgrund eines Bugs Fehler produziert und diese in 1-2 Wochen behoben sein werden. Konkret kommen Fehlermeldungen, die Module serial und serial_asyncio wären nicht bekannt.
                            Das Problem ist, dass für pymodbus.client.tcp ​weder serial noch serial_asyncio​ benötigt werden sollten, diese aber dennoch in der init importiert werden. Sprich man muss diese unter 3.0.0 installieren, damit client.tcp funktioniert. Das sollte bei dir keine Rolle spielen. Das wird dann gefixt werden bzw. ist es schon im dev-branch.

                            Zitat von Tom Bombadil Beitrag anzeigen
                            Aber: Wird der genannte Bugfix auch die hier besprochenen Probleme beheben (=kein Handlungsbedarf), oder alles 'works as intended' und die hier genannten Änderungen sind trotzdem erforderlich, weil sie mit dem Issue nichts zu tun haben?
                            Die Änderungen des import werden dennoch nötig sein, weil pymodbus.client.sync nicht mehr existiert.

                            Kommentar


                              #29
                              Zitat von Cannon Beitrag anzeigen
                              weil pymodbus.client.sync nicht mehr existiert.
                              Danke, alles klar - Frage beantwortet. Das war das hüpfende Komma ...

                              /tom

                              Kommentar


                                #30
                                Hinweis zur Modbus-Umstellung (der Vollständigkeit halber): Raider heißt jetzt Twix, sonst ändert sich nix.
                                Und unit heißt jetzt slave. Funktionieren tut die alte Variante zwar noch, erzeugt aber Fehler im Log. Deshalb:

                                Code:
                                werte = self._modbus.read_holding_registers(_bereich[0], _bereich[1]-_bereich[0]+1, unit = self._modbus_trovis_address)
                                werte = self._modbus.read_coils(_bereich[0], _bereich[1]-_bereich[0]+1, unit = self._modbus_trovis_address)
                                ändern zu:
                                Code:
                                werte = self._modbus.read_holding_registers(_bereich[0], _bereich[1]-_bereich[0]+1, slave = self._modbus_trovis_address)
                                werte = self._modbus.read_coils(_bereich[0], _bereich[1]-_bereich[0]+1, slave = self._modbus_trovis_address)

                                Vielleicht kann es ja noch jemand brauchen ...

                                /tom
                                Zuletzt geändert von Tom Bombadil; 13.11.2022, 14:06.

                                Kommentar

                                Lädt...
                                X