Ik probeer om een Python script om te zetten voor gebruik in mijn Delphi 7 applicatie. (source: https://github.com/Woutrrr/Omnik-Data-Logger
Hiermee wil ik mijn inverter (Zonnepanelen) uitlezen via het netwerk.
De inverter is verbonden via Wifi op mijn thuisnetwerk. Het Python script werkt perfect en geeft de data weer.
Het lukt me ook om dit script vanuit Delphi aan te roepen en de output af te vangen, maar dit vind ik een minder nette manier.
Mijn applicatie vereist dan namelijk de Python installatie (28Mb) en dat wil ik liever niet.
Vandaar mijn poging om dit om te zetten naar Delphi aangezien het via sockets (TCPClient?) mogelijk zou moeten zijn.
Ik krijg het niet voor elkaar om een verbinding te maken met mijn inverter vanuit Delphi 7 (TCPClient gebruikt).
Het principe is als volgt:
-Ik maak een verbinding naar de inverter (in mijn geval 192.168.2.11) op poort 8899
-ik verstuur het serienummer van de inverter (dit werkt denk ik alszijnde wachtwoord) nl: 613758394
maar ik begrijp uit onderstaand stukje Python dat het serienummer omgezet moet worden:
-vervolgens zou ik een string terug moeten krijgen met alle data van de omvormer.
Wie kan mij helpen met een opzetje om een verbinding te maken, het serienummer berekenen en data te ontvangen?
Stukje Python dat zorgt voor de verbinding:
PS.
Ik ben op de hoogte van Python for Delphi, dit component krijg ik niet geïnstalleerd en lijkt me tevens overbodig voor het doel.
Ik heb geen kaas gegeten van verbinding maken d.m.v. sockets
Edit:
Ik kwam op het idee om de fuctie generate_string(serial_no) in de Python IDE uit te laten voeren en het resultaat gewoon te gebruiken.
Onderstaande code uitgevoerd:
Helaas is de definitieve berekening niet als string leesbaar:
613758394
h@0
249535ba249535ba
['\xba', '5', '\x95', '$', '\xba', '5', '\x95', '$']
963
h@0�5�$�5�$�
Hiermee wil ik mijn inverter (Zonnepanelen) uitlezen via het netwerk.
De inverter is verbonden via Wifi op mijn thuisnetwerk. Het Python script werkt perfect en geeft de data weer.
Het lukt me ook om dit script vanuit Delphi aan te roepen en de output af te vangen, maar dit vind ik een minder nette manier.
Mijn applicatie vereist dan namelijk de Python installatie (28Mb) en dat wil ik liever niet.
Vandaar mijn poging om dit om te zetten naar Delphi aangezien het via sockets (TCPClient?) mogelijk zou moeten zijn.
Ik krijg het niet voor elkaar om een verbinding te maken met mijn inverter vanuit Delphi 7 (TCPClient gebruikt).
Het principe is als volgt:
-Ik maak een verbinding naar de inverter (in mijn geval 192.168.2.11) op poort 8899
-ik verstuur het serienummer van de inverter (dit werkt denk ik alszijnde wachtwoord) nl: 613758394
maar ik begrijp uit onderstaand stukje Python dat het serienummer omgezet moet worden:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| @staticmethod def generate_string(serial_no): """Create request string for inverter. The request string is build from several parts. The first part is a fixed 4 char string; the second part is the reversed hex notation of the s/n twice; then again a fixed string of two chars; a checksum of the double s/n with an offset; and finally a fixed ending char. Args: serial_no (int): Serial number of the inverter Returns: str: Information request string for inverter """ response = '\x68\x02\x40\x30' double_hex = hex(serial_no)[2:] * 2 hex_list = [double_hex[i:i + 2].decode('hex') for i in reversed(range(0, len(double_hex), 2))] cs_count = 115 + sum([ord(c) for c in hex_list]) checksum = hex(cs_count)[-2:].decode('hex') response += ''.join(hex_list) + '\x01\x00' + checksum + '\x16' return response |
-vervolgens zou ik een string terug moeten krijgen met alle data van de omvormer.
Wie kan mij helpen met een opzetje om een verbinding te maken, het serienummer berekenen en data te ontvangen?
Stukje Python dat zorgt voor de verbinding:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| # Connect to inverter ip = self.config.get('inverter', 'ip') port = self.config.get('inverter', 'port') for res in socket.getaddrinfo(ip, port, socket.AF_INET, socket.SOCK_STREAM): family, socktype, proto, canonname, sockadress = res try: self.logger.info('connecting to {0} port {1}'.format(ip, port)) inverter_socket = socket.socket(family, socktype, proto) inverter_socket.settimeout(10) inverter_socket.connect(sockadress) except socket.error as msg: self.logger.error('Could not open socket') self.logger.error(msg) sys.exit(1) wifi_serial = self.config.getint('inverter', 'wifi_sn') inverter_socket.sendall(OmnikExport.generate_string(wifi_serial)) data = inverter_socket.recv(1024) inverter_socket.close() msg = InverterMsg.InverterMsg(data) self.logger.info("ID: {0}".format(msg.id)) |
PS.
Ik ben op de hoogte van Python for Delphi, dit component krijg ik niet geïnstalleerd en lijkt me tevens overbodig voor het doel.
Ik heb geen kaas gegeten van verbinding maken d.m.v. sockets
Edit:
Ik kwam op het idee om de fuctie generate_string(serial_no) in de Python IDE uit te laten voeren en het resultaat gewoon te gebruiken.
Onderstaande code uitgevoerd:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| serial_no = 613758394 print serial_no response = '\x68\x02\x40\x30' print response double_hex = hex(serial_no)[2:] * 2 print double_hex hex_list = [double_hex[i:i + 2].decode('hex') for i in reversed(range(0, len(double_hex), 2))] print hex_list cs_count = 115 + sum([ord(c) for c in hex_list]) print cs_count checksum = hex(cs_count)[-2:].decode('hex') print checksum response += ''.join(hex_list) + '\x01\x00' + checksum + '\x16' print response |
Helaas is de definitieve berekening niet als string leesbaar:
613758394
h@0
249535ba249535ba
['\xba', '5', '\x95', '$', '\xba', '5', '\x95', '$']
963
h@0�5�$�5�$�