Seite 1 von 1
Daten einer Wechselrichter mit python auslesen
Verfasst: Mittwoch 14. Mai 2025, 10:53
von lmt
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()
Re: Daten einer Wechselrichter mit python auslesen
Verfasst: Mittwoch 14. Mai 2025, 13:05
von Sirius3
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()
Re: Daten einer Wechselrichter mit python auslesen
Verfasst: Mittwoch 14. Mai 2025, 13:27
von lmt
meine Wechselrichter liefert mir immer nicht . das ist was ich mit deinem Code bekommen
Antwort vom Wechselrichter:
b'(NAK'
Mein Wechselrichter kommt von Vevor.
Re: Daten einer Wechselrichter mit python auslesen
Verfasst: Mittwoch 14. Mai 2025, 14:02
von sparrow
Und die Dokumentation zu Protokoll und Verbindung finden wir wo?
Re: Daten einer Wechselrichter mit python auslesen
Verfasst: Mittwoch 14. Mai 2025, 14:31
von Sirius3
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.
Re: Daten einer Wechselrichter mit python auslesen
Verfasst: Mittwoch 14. Mai 2025, 14:51
von lmt
ja danke ich habe eine crc code geschrieben und das hat geklappt