Daten einer Wechselrichter mit python auslesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
lmt
User
Beiträge: 3
Registriert: Mittwoch 14. Mai 2025, 10:49

ich möchte Daten von einer Wechselrichter im Python mit Visual Studio Code lesen . Der folgende Code läuft bei mir nicht ich weiß nicht warum . ich bekomme nichts von der Wechselrichter .

import serial
import time

ser = serial.Serial(
port='COM1',
baudrate=2400,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
timeout=1
)

def send_command(command):
full_command = command + '\r' # Oder '\r\n' je nach Gerät
ser.write(full_command.encode())
time.sleep(1)
response = ser.read_all().decode(errors='ignore')
return response

response = send_command("QPIGS")
print("Antwort vom Wechselrichter:")
print(response)

ser.close()
Sirius3
User
Beiträge: 18245
Registriert: Sonntag 21. Oktober 2012, 17:20

Man benutzt keine kryptischen Abkürzungen. Was ist ein `ser`? Globale Variablen darf es nicht geben, alles was eine Funktion braucht, muß sie über ihre Argumente bekommen.
Aller restliche Code steht in einer Funktion mit den Namen `main`. Das verhindert auch effektiv, dass man aus Versehen globale Variablen definiert oder dass Funktionsdefinitionen mitten im Code auftauchen. read_all liest alles, was gerade im Puffer ist, wenn es etwas länger dauert, dann reicht vielleicht eine Sekunde warten nicht, oder eine Sekunde ist viel zu lang. Deshalb benutzt man read_until. Da wir Deinen Wechselrichter nicht kennen, kann man nichts dazu sagen, ob Du das richtige Protokoll benutzt. Kannst Du prüfen, ob die Verbindung überhaupt funktioniert?

Wenn ich das richtig lese, ist die Antwort in Wirklichkeit ein Binärformat, das je nach Command eine fixe Anzahl an Bytes zurückliefert. Also auf ein QPIGS wird irgendwas mit 100+x Bytes gesendet.

Code: Alles auswählen

import serial

def send_command(connection, command, size):
    full_command = command + '\r'
    connection.write(full_command.encode())
    result = connection.read(size)
    if result[-1] != 13:
        raise ValueError(f"corrupt data {data}")
    # TODO check crc
    return result[:-3]


def main():
    with serial.Serial(
        port='COM1',
        baudrate=2400,
        bytesize=serial.EIGHTBITS,
        parity=serial.PARITY_NONE,
        stopbits=serial.STOPBITS_ONE,
        timeout=1
    ) as connection:
        response = send_command(connection, "QPIGS", size=110) # Anzahl Bytes, die Deine Version des Wechelrichters sendet
        print("Antwort vom Wechselrichter:")
        print(response)

if __name__ == "__main__":
    main()
lmt
User
Beiträge: 3
Registriert: Mittwoch 14. Mai 2025, 10:49

meine Wechselrichter liefert mir immer nicht . das ist was ich mit deinem Code bekommen
Antwort vom Wechselrichter:
b'(NAK'
Mein Wechselrichter kommt von Vevor.
Benutzeravatar
sparrow
User
Beiträge: 4522
Registriert: Freitag 17. April 2009, 10:28

Und die Dokumentation zu Protokoll und Verbindung finden wir wo?
Sirius3
User
Beiträge: 18245
Registriert: Sonntag 21. Oktober 2012, 17:20

Du bekommst also eine Rückmeldung, wenn auch einen Fehler. NAK bedeutet Not-Acknowledged und legt nahe, dass der Befehl QPIGS nicht richtig ist, oder bestimmte Vorraussetzungen nicht gegeben sind. Du mußt also die Dokumentation zum Protokoll lesen, um herauszufinden, welche Befehle in welcher Reihenfolge abzusetzen sind, um das gewünschte Ergebnis zu bekommen.
lmt
User
Beiträge: 3
Registriert: Mittwoch 14. Mai 2025, 10:49

ja danke ich habe eine crc code geschrieben und das hat geklappt
Antworten