Seite 1 von 2

Plötzlich läuft mein Script nicht mehr. Venv-Umgebeung

Verfasst: Donnerstag 12. September 2024, 11:04
von kiaralle
Hallo,

ich greife mit pymodbus auf meine Wechselrichter zu.
Seit der Umstellung auf venv-Umgebung funktionieren nicht einmal die kleinsten Scripte

Code: Alles auswählen

parser = argparse.ArgumentParser()
parser.add_argument("adresse", type=int, help="Inverter Adresse")
parser.add_argument("register", type=int, help="Input-Register")
args = parser.parse_args()

inverter_adresse = args.adresse
modbus_register = args.register


client = ModbusSerialClient(
    port="/dev/ttyUSB0",
    startbit = 1,
    databits=8,
    parity="N",
    stopbits=2,
    errorcheck="crc",
    baudrate=9600,
    method="RTU",
    timeout=1
)

client.connect()

result = client.read_input_registers(modbus_register, 1, inverter_adresse)
print(result.registers)

client.close()

Fehlermeldung:
Traceback (most recent call last):
File "/var/www/html/solarsteuerung-3phasig/Tool/readinputregister.py", line 21, in <module>
client = ModbusSerialClient(
^^^^^^^^^^^^^^^^^^^
TypeError: ModbusSerialClient.__init__() got an unexpected keyword argument 'startbit'
Jetzt hänge ich etwas in den Seilen.

Ich rufe über venv auf:
/home/pi/solar/bin/python3 /var/www/html/solarsteuerung-3phasig/Tool/readinputregister.py 1 18
Ohne venv (älteres Rasperry-Pi-OS) funktioniert das.
Das neuere Betriebssystem verlangt venv, was ja auch besser und sicherer ist.

Gruß Ralf

Re: Plötzlich läuft mein Script nicht mehr. Venv-Umgebeung

Verfasst: Donnerstag 12. September 2024, 16:49
von Sirius3
Du hast wahrscheinlich das falsche Paket für ModbusSerialClient installiert. pymodbus kennt und kannte noch nie ein startbit-Argument.

Re: Plötzlich läuft mein Script nicht mehr. Venv-Umgebeung

Verfasst: Donnerstag 12. September 2024, 17:17
von kiaralle
Jetzt mach mich nicht fertig, Echt?

Im Code steht

Code: Alles auswählen

from pymodbus.client import ModbusSerialClient
also machte ich >>>> pip3 install pymodbus

Code: Alles auswählen

docutils   0.21.2  /home/pi/solar/lib/python3.11/site-packages pip
pip        24.2    /home/pi/solar/lib/python3.11/site-packages pip
pymodbus   3.7.2   /home/pi/solar/lib/python3.11/site-packages pip
pyserial   3.5     /home/pi/solar/lib/python3.11/site-packages pip
RPi.GPIO   0.7.1   /home/pi/solar/lib/python3.11/site-packages pip
setuptools 66.1.1  /home/pi/solar/lib/python3.11/site-packages pip
statistics 1.0.3.5 /home/pi/solar/lib/python3.11/site-packages pip
https://pymodbus.readthedocs.io/en/latest/index.html sollte doch mein Ziel sein.

Re: Plötzlich läuft mein Script nicht mehr. Venv-Umgebeung

Verfasst: Donnerstag 12. September 2024, 17:46
von Sirius3
Aber was hattest Du auf Deinem alten System, wo es noch funktioniert hatte, installiert?

Re: Plötzlich läuft mein Script nicht mehr. Venv-Umgebeung

Verfasst: Donnerstag 12. September 2024, 18:37
von kiaralle
Hab das alte System noch mal gestartet.
pymodbus 3.5.0 /home/pi/.local/lib/python3.9/site-packages pip
Die Version ist älter. Aber sonnst?

Ich habe gerade in /home/pi/.local/lib/python3.9/site-packages/pymodbus/serial.py angeschaut.
startbit gab und gibt es nicht.
Warum funktioniert es dann hier?

Gruß Ralf

Edit: das löschen vom startbit=1 im Code bringt hier keine Fehler. Hmm

Re: Plötzlich läuft mein Script nicht mehr. Venv-Umgebeung

Verfasst: Donnerstag 12. September 2024, 22:29
von __blackjack__
@kiaralle: Wenn ich mal raten müsste heisst das Argument `startbits` und nicht `startbit`, denn es heisst ja auch `stopbits` und nicht `stopbit`.

Re: Plötzlich läuft mein Script nicht mehr. Venv-Umgebeung

Verfasst: Donnerstag 12. September 2024, 22:57
von pillmuncher
@kiaralle:

Seit dem Commit f0d6842 funktioniert startbit nicht mehr, weil das davor von **kwargs aufgefangen wurde, das mit dem genannten Commit entfernt wurde. Du hättest vorher auch foobar oder Schornsteinfeger schreiben können, ohne dass es einen Fehler gegeben hätte.

Hier der Code der __init__() Methode:

Code: Alles auswählen

def __init__(
        self,
        port: str,
        framer: FramerType = FramerType.RTU,
        baudrate: int = 19200,
        bytesize: int = 8,
        parity: str = "N",
        stopbits: int = 1,
        **kwargs: Any,
    ) -> None:
Beachte den letzten Parameter.

Re: Plötzlich läuft mein Script nicht mehr. Venv-Umgebeung

Verfasst: Freitag 13. September 2024, 12:41
von kiaralle
Danke für eure Tipps. Fehler habe ich Korrigiert.

Jetzt muss ich noch finden was ich noch nicht installiert haben könnte.
Mein Script mag nicht auf den USB-RS485 zugreifen.

Re: Plötzlich läuft mein Script nicht mehr. Venv-Umgebeung

Verfasst: Freitag 13. September 2024, 13:08
von kiaralle
Frage in die Runde,

könnte es sein, das venv eventuell rechte nicht erteilt werden?

Im alten System, läuft die Software ja mit dem System-Pyton und dessen Module.

Re: Plötzlich läuft mein Script nicht mehr. Venv-Umgebeung

Verfasst: Freitag 13. September 2024, 13:50
von noisefloor
Hallo,

nein. Dein Python Skript läuft mit den Rechen, mit denen du es startest. Ob die Module systemweit oder lokal oder im venv installiert sind spielt keine Rolle. Eine Datei hat ja per se auch keine Systemrechte, im Sinne von, dass sie etwas darf.

Du müsstest mal die Rechte des Benutzers prüfen, unter dem das Skript läuft. Unter Linux muss man AFAIK Mitglied der Gruppe "dialout" sein, um aus die seriellen Schnittstellen zugreifen zu können.

Gruß, noisefloor

Re: Plötzlich läuft mein Script nicht mehr. Venv-Umgebeung

Verfasst: Freitag 13. September 2024, 14:07
von kiaralle
Gruppe "dialout" ... ist der user pi drinnen.
Prüfe ich aber nocheinmal.

Bin mal etwas Frech aus venv raus und habe mit dem Befehl

pip3 install --break-system-packages ....

Pakete installiert.
Kein Zugriff auf USB.

Ich checke die Gruppe noch mal. Kann ja nicht sein. :(

Passt:

id pi
uid=1000(pi) gid=1000(pi) groups=1000(pi),4(adm),20(dialout),24(cdrom),27(sudo),29(audio),44(video),46(plugdev),60(games),100(users),102(input),105(render),106(netdev),995(spi),994(i2c),993(gpio),115(lpadmin)

Re: Plötzlich läuft mein Script nicht mehr. Venv-Umgebeung

Verfasst: Freitag 13. September 2024, 14:24
von noisefloor
Hallo,

passt mal bitte die _komplette_ Fehlermeldung = den Stack Trace, den du bekommst.

Gruß, noisefloor

Re: Plötzlich läuft mein Script nicht mehr. Venv-Umgebeung

Verfasst: Freitag 13. September 2024, 14:51
von kiaralle

Code: Alles auswählen

try:
    client = ModbusSerialClient(
        port="/dev/ttyUSB0",
        databits=8,
        parity="N",
        stopbits=2,
        baudrate=9600,
        method="RTU"
        )
except:
    print("Keine Verbindung zum USB-RS485-Umsetzer")
    sys.exit(1)
Ich bekomme ja keinen, da ja meine Exception mangelhaft ist und ich nicht weiß wie ich dies lösen könnte.

Re: Plötzlich läuft mein Script nicht mehr. Venv-Umgebeung

Verfasst: Freitag 13. September 2024, 15:05
von kiaralle
Hab am Script geschraubt.

wenn ich

Code: Alles auswählen

client = ModbusSerialClient(
        port="/dev/ttyUSB0",
        databits=8,
        parity="N",
        stopbits=2,
        baudrate=9600,
        method="RTU"
        )
frei in den Code stelle, bekomme ich
Traceback (most recent call last):
File "/home/pi/./steuerung.py", line 51, in <module>
client = ModbusSerialClient(
^^^^^^^^^^^^^^^^^^^
TypeError: ModbusSerialClient.__init__() got an unexpected keyword argument 'databits'
Ich denke da stimmt einiges nicht, nicht mehr zur letzten Version von pymodbus

Re: Plötzlich läuft mein Script nicht mehr. Venv-Umgebeung

Verfasst: Freitag 13. September 2024, 16:10
von grubenfox

Re: Plötzlich läuft mein Script nicht mehr. Venv-Umgebeung

Verfasst: Freitag 13. September 2024, 16:46
von noisefloor
Hallo,
Ich bekomme ja keinen, da ja meine Exception mangelhaft ist
Schönes Beispiel, warum nackte try..except keine gute Idee sind - weil eben alle Fehler inkl. Programmierfehlern einfach weggebügelt werden. Im gegebenen Fall weißt du also gar nicht, ob du keine Verbindung bekommst, weil das Programm vorher schon abbricht.

Da musst du halt mal die Doku von pymodbus lesen und deinen Code auf den Stand der Dinge anpassen.

Gruß, noisefloor

Re: Plötzlich läuft mein Script nicht mehr. Venv-Umgebeung

Verfasst: Freitag 13. September 2024, 17:02
von kiaralle
Ich bin gerade dabei.
Da wird wieder Arbeit :D

Re: Plötzlich läuft mein Script nicht mehr. Venv-Umgebeung

Verfasst: Freitag 13. September 2024, 17:31
von kiaralle
So, mal ganz anderen Weg.

Neues Skript und baugleichen USB-to-RS458 von Wireshark am Laptop, Linux Mint.

Code: Alles auswählen

from pymodbus.client import ModbusSerialClient

client = ModbusSerialClient(port="/dev/ttyUSB0", baudrate=9600, stopbits=2, bytesize=8, timeout=1, parity="N")

if client.connect():
    print("Verbindung ok")
else:
    print("keine Verbindung")

abfrage_wr1 = client.read_input_registers(0, 1, 1)
if not abfrage_wr1.isError():
    print("Gerät erreichbar")
else:

    print("Gerät nicht erreichbar")


Am Laptop alles ok.

Am Raspberry bekomme ich eine Fehlermeldung
pi@steuerung:~ $ python3 ./verbindung.py
module 'serial' has no attribute 'serial_for_url'
keine Verbindung
module 'serial' has no attribute 'serial_for_url'
Traceback (most recent call last):
File "/home/pi/./verbindung.py", line 17, in <module>
abfrage_wr1 = client.read_input_registers(0, 1, 1)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/pymodbus/client/mixin.py", line 102, in read_input_registers
return self.execute(pdu_reg_read.ReadInputRegistersRequest(address, count, slave=slave))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/pymodbus/client/base.py", line 236, in execute
raise ConnectionException(f"Failed to connect[{self!s}]")
pymodbus.exceptions.ConnectionException: Modbus Error: [Connection] Failed to connect[ModbusSerialClient /dev/ttyUSB0:0]


Re: Plötzlich läuft mein Script nicht mehr. Venv-Umgebeung

Verfasst: Samstag 14. September 2024, 00:27
von grubenfox
Naja, wenn `client.connect()` kein `True` zurückliefert, dann macht es auch keinen Sinn aus dem toten `client` noch irgendwelche Input-register lesen zu wollen.
Also den unteren Teil vom Codel am besten unter das "Verbindung OK"... Dann entfallen wenigsten die überflüssigen Folgefehler falls `client.connect()` nur ein False liefert.

Code: Alles auswählen

from pymodbus.client import ModbusSerialClient

client = ModbusSerialClient(port="/dev/ttyUSB0", baudrate=9600, stopbits=2, bytesize=8, timeout=1, parity="N")

if client.connect():
    print("Verbindung ok")
    abfrage_wr1 = client.read_input_registers(0, 1, 1)
    if not abfrage_wr1.isError():
        print("Gerät erreichbar")
    else:
        print("Gerät nicht erreichbar")
else:
    print("keine Verbindung")
Kann man dem client-Objekt im Fehlerfall noch irgendwelche hilfreichen Informationen entlocken? Einfach nur ein "keine Verbindung" ist ja etwas sehr mager an Information...
Ansonsten noch eine Frage: ist das groß geschriebene "USB0" beim Port korrekt? Ich habe hier unter "/dev/*" nur alle möglichen Kleinbuchstaben usw.. kein Device mit Großbuchstaben im Namen. Aber es mangelt hier auch am USB-RS485-Konverter. Kann ich also nichts testen...

Re: Plötzlich läuft mein Script nicht mehr. Venv-Umgebeung

Verfasst: Samstag 14. September 2024, 08:35
von kiaralle
Naja, wenn `client.connect()` kein `True` zurückliefert,
Das ist schon klar. Ich wollte nur wissen wo der Fehler aufläuft. Ist nur ein Testscript.
Und wenn "Gerät erreichbar" kommt, sollte auch der Modbus kommen.
Das tut er im Fehlerfall "Gerät nicht erreichbar" auf dem Raspberry auch nicht.
Soweit passt das ja zum testen.

Ich erstelle jetzt zum testen eine venv mit all den Modulen welche ich im alten, laufenden System habe.
Gleichzeitig schau ich mal ob ich 32 oder 64 bit auf beiden gleich installiert habe. Also das Raspberry OS
Aber es macht wenig Sinn mit alten Modulen zu arbeiten. Das holt einen immer wieder ein.
Besser Fehler suchen.