Voor het uitlezen van mijn Zeversolar zonnepanelen inverter heb ik al jaren een Python2.7 script draaien. Nu heb ik door een ondoordachte update mij in een dependency puinhoop gebracht. Om dit op te lossen wilde ik mijn script omzetten van Python2.7 naar Python3.
Alleen loop ik tegen het volgende probleem aan:
In python2.7
Dit geeft het volgende en krijgt gewoon antwoord van de inverter.
Nu weet ik dat tussen Python2.7 en Python3 iets anders zit met bytearray(), in python2.7 was het onderwater een string, maar in Python3 een array met bytes.
Nu bijna hetzelfde in Python3, maar ik krijg geen enkel antwoord van de inverter. Het lijkt er op dat er dus iets anders over de lijn wordt gestuurd.
Dit geeft het volgende en krijgt geen antwoord van de inverter. Maar de print lijkt hetzelfde.
Ik heb verschilldende pogingen gedaan, om het bijvoorbeeld naar string te converteren met .decode(), of bytes(data,'utf-8') maar eigen begrijp ik niet goed waarom het werkt in Python2.7 en niet in Python3.
Tot zo ver ik voorbeelden op internet vind over socket.sendall() wordt daar altijd al een string gebruikt als msg.
Wie kan mij weer een beetje op weg helpen?
Alleen loop ik tegen het volgende probleem aan:
In python2.7
Python:
1
2
3
4
5
6
7
| def send(self): #calculate and append checksum tmp_request = bytearray() tmp_request = self._request + struct.pack("<H", crc16(bytes(self._request))) print("send") print(":".join("{:02x}".format(c) for c in tmp_request)) self._socket.sendall(tmp_request) |
Dit geeft het volgende en krijgt gewoon antwoord van de inverter.
code:
1
2
| send 03:04:00:26:00:02:91:e2 |
Nu weet ik dat tussen Python2.7 en Python3 iets anders zit met bytearray(), in python2.7 was het onderwater een string, maar in Python3 een array met bytes.
Nu bijna hetzelfde in Python3, maar ik krijg geen enkel antwoord van de inverter. Het lijkt er op dat er dus iets anders over de lijn wordt gestuurd.
Python:
1
2
3
4
5
6
7
8
| #calculate and append checksum tmp_request = bytearray() #tmp_request = self._request + struct.pack("<H", crc16(bytes(self._request))) //crc16mod not available in Python3 tmp_request = self._request + crc16(self._request) //crc16 returns struck.pack('H',crc) print("send") print(":".join("{:02x}".format(c) for c in tmp_request)) print(tmp_request) self._socket.sendall(bytes(tmp_request)) //unknown try to make bytes from bytearray() |
Dit geeft het volgende en krijgt geen antwoord van de inverter. Maar de print lijkt hetzelfde.
code:
1
2
| send 03:04:00:26:00:02:91:e2 |
Ik heb verschilldende pogingen gedaan, om het bijvoorbeeld naar string te converteren met .decode(), of bytes(data,'utf-8') maar eigen begrijp ik niet goed waarom het werkt in Python2.7 en niet in Python3.
Tot zo ver ik voorbeelden op internet vind over socket.sendall() wordt daar altijd al een string gebruikt als msg.
Wie kan mij weer een beetje op weg helpen?