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

  • Cannon
    antwortet
    Ich werde mich dem modbus-Thema noch mal annehmen, wenn ich das Update der SmartHomeNG auf 1.9.3 gemacht habe. Denn vom modbus gibt es auch eine aktualisierte Version. Dann teste ich das und kann noch mal die Abhängigkeiten korrigieren.

    Zitat von Tom Bombadil Beitrag anzeigen
    Hinweis zur Modbus-Umstellung (der Vollständigkeit halber): Raider heißt jetzt Twix, sonst ändert sich nix.
    Die Umstellung bezieht sich auf die modbus 3.x - Version? Wenn ja, wäre evtl. eine Abfrage sinnvoll?

    Die try/except Statemants (siehe oben) gefallen mir eigentlich nicht so recht. Kann man nicht direkt die Version prüfen? Modbus 3.0.1 setzt mindestens python 3.8 voraus. Und das hat ja auch nicht jeder. SmartHomeNG braucht ja Minimum nur 3.7.

    Einen Kommentar schreiben:


  • Tom Bombadil
    antwortet
    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.

    Einen Kommentar schreiben:


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

    /tom

    Einen Kommentar schreiben:


  • Cannon
    antwortet
    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.

    Einen Kommentar schreiben:


  • Tom Bombadil
    antwortet
    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

    Einen Kommentar schreiben:


  • Cannon
    antwortet
    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.

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    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

    Einen Kommentar schreiben:


  • bmx
    antwortet
    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.

    Einen Kommentar schreiben:


  • Tom Bombadil
    antwortet
    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.

    Einen Kommentar schreiben:


  • Cannon
    antwortet
    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.

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    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.

    Einen Kommentar schreiben:


  • Cannon
    antwortet
    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?

    Einen Kommentar schreiben:


  • Cannon
    antwortet
    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.

    Einen Kommentar schreiben:


  • Onkelandy
    antwortet
    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)

    Einen Kommentar schreiben:


  • Cannon
    antwortet
    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.

    Einen Kommentar schreiben:

Lädt...
X