En zonder ECU-R werken de omvormers gewoon (de opbrengst wordt alleen niet vastgelegd).
Dus je hoeft niet heel erg te stressen
Dus je hoeft niet heel erg te stressen
nu helemaal mooi:dooiedodo schreef op zaterdag 24 april 2021 @ 16:55:
[...]
stomme is dus, als dat ding op hakkelende manier toch data naar de cloud weet te krijgen, is het lastige discussie dat ie niet meer funcitoneert. Wat wij doen is niet echt beschreven in handleiding als ondersteunde feature :-)
vandaag loop ie weer als zonnetje, zal misschien extra storing dag zijn geweest op 2.4 ghz band ofzo..
[ Voor 4% gewijzigd door WackoH op 26-04-2021 11:40 ]
Ik heb het Python script wat hier is gemaakt bewerkt voor Domoticz. Een en ander begint duidelijk te worden hoe het werkt. Mede dankzij het script wat @Kochmeister al had gemaakt is het mij gelukt. Hieronder het resultaat. Het is wel vereist om met Python 3.x te werken, anders werkt het niet (urenlang op zitten broeden waarom het wel onder mijn Windows omgeving werkte, maar niet op de Raspberry PiProton_ schreef op zaterdag 24 april 2021 @ 12:59:
@BjorntobeWild Zoek maar op Wireshark of Ethereal, dat zijn tools die op een pc daarvoor gebruikt kunnen worden
Op Android bijvoorbeeld de Packet Capture app.
Ook sommige routers kunnen verkeer onderscheppen en in een bestand opslaan.
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
| #!/usr/bin/env python3 from APSystemsECUR import APSystemsECUR import time import asyncio import urllib.request import urllib.parse import urllib from pprint import pprint ecu_ip = "192.168.xxx.xx" sleep = 60 url = 'http://192.168.xxx.xx:8080/json.htm?' puntcomma = '\u003B' loop = asyncio.get_event_loop() ecu = APSystemsECUR(ecu_ip) while True: try: data = loop.run_until_complete(ecu.async_query_ecu()) #pprint(data) today_energy_kwh = str(data.get('today_energy')*1000) print('Today energy [kWh]: ' + today_energy_kwh) getVars = {'type' : 'command', 'param' : 'udevice', 'nvalue' : 0, 'idx': 212, 'svalue': (today_energy_kwh)} webUrl = urllib.request.urlopen(url + urllib.parse.urlencode(getVars)) #print(url + urllib.parse.urlencode(getVars) + (puntcomma) + '0') getVars = {'type' : 'command', 'param' : 'udevice', 'nvalue' : 0, 'idx': 213, 'svalue': data.get('current_power')} webUrl = urllib.request.urlopen(url + urllib.parse.urlencode(getVars) + (puntcomma) + '0') #print(url + urllib.parse.urlencode(getVars) + (puntcomma) + '0') getVars = {'type' : 'command', 'param' : 'udevice', 'nvalue' : 0, 'idx': 195, 'svalue': data.get('timestamp')} webUrl = urllib.request.urlopen(url + urllib.parse.urlencode(getVars)) #print(url + urllib.parse.urlencode(getVars)) #inverter values inverters = data.get('inverters') #count number of inverters Inverter_qty = len(data.get('inverters')) print('Inverter_cnt: ' + str(Inverter_qty)) # loop trough all inverters and get the data for i in range(Inverter_qty): Inverter = list(inverters.keys())[i] print('InverterId: ' + Inverter) InverterOnline = data['inverters'][Inverter]['online'] print('Online: ' + str(InverterOnline)) InverterTemperature = data['inverters'][Inverter]['temperature'] print('Temperature: ' + str(InverterTemperature)) nPower = len(data['inverters'][Inverter]['power']) for x in range(nPower): power = data['inverters'][Inverter]['power'][x] print('Power inverter ' + str(i + 1) + ' panel ' + str(x + 1) + ': ' + str(power) + ' W') #upload values to Domoticz voor inverter 1 if (i == 0) : getVars = {'type' : 'command', 'param' : 'udevice', 'nvalue' : 0, 'idx': 173, 'svalue': InverterTemperature} webUrl = urllib.request.urlopen(url + urllib.parse.urlencode(getVars)) if InverterOnline == True : getVars = {'type' : 'command', 'param' : 'switchlight', 'idx': 174, 'switchcmd': 'On', 'level': 0, 'passcode': '' } else : getVars = {'type' : 'command', 'param' : 'switchlight', 'idx': 174, 'switchcmd': 'Off', 'level': 0, 'passcode': '' } webUrl = urllib.request.urlopen(url + urllib.parse.urlencode(getVars)) #upload values to Domoticz voor inverter 2 if (i == 1) : getVars = {'type' : 'command', 'param' : 'udevice', 'nvalue' : 0, 'idx': 179, 'svalue': InverterTemperature} webUrl = urllib.request.urlopen(url + urllib.parse.urlencode(getVars)) if InverterOnline == True : getVars = {'type' : 'command', 'param' : 'switchlight', 'idx': 180, 'switchcmd': 'On', 'level': 0, 'passcode': '' } else : getVars = {'type' : 'command', 'param' : 'switchlight', 'idx': 180, 'switchcmd': 'Off', 'level': 0, 'passcode': '' } webUrl = urllib.request.urlopen(url + urllib.parse.urlencode(getVars)) #upload values to Domoticz voor inverter 3 if (i == 2) : getVars = {'type' : 'command', 'param' : 'udevice', 'nvalue' : 0, 'idx': 185, 'svalue': InverterTemperature} webUrl = urllib.request.urlopen(url + urllib.parse.urlencode(getVars)) if InverterOnline == True : getVars = {'type' : 'command', 'param' : 'switchlight', 'idx': 186, 'switchcmd': 'On', 'level': 0, 'passcode': '' } else : getVars = {'type' : 'command', 'param' : 'switchlight', 'idx': 186, 'switchcmd': 'Off', 'level': 0, 'passcode': '' } webUrl = urllib.request.urlopen(url + urllib.parse.urlencode(getVars)) #upload values to Domoticz voor inverter 4 if (i == 3) : getVars = {'type' : 'command', 'param' : 'udevice', 'nvalue' : 0, 'idx': 191, 'svalue': InverterTemperature} webUrl = urllib.request.urlopen(url + urllib.parse.urlencode(getVars)) if InverterOnline == True : getVars = {'type' : 'command', 'param' : 'switchlight', 'idx': 192, 'switchcmd': 'On', 'level': 0, 'passcode': '' } else : getVars = {'type' : 'command', 'param' : 'switchlight', 'idx': 192, 'switchcmd': 'Off', 'level': 0, 'passcode': '' } webUrl = urllib.request.urlopen(url + urllib.parse.urlencode(getVars)) #upload power values to Domoticz voor inverter 1 if (i == 0) and (x == 0) : getVars = {'type' : 'command', 'param' : 'udevice', 'nvalue' : 0, 'idx': 196, 'svalue': (power)} webUrl = urllib.request.urlopen(url + urllib.parse.urlencode(getVars) + (puntcomma) + '0') elif (i == 0) and (x == 1) : getVars = {'type' : 'command', 'param' : 'udevice', 'nvalue' : 0, 'idx': 197, 'svalue': (power)} webUrl = urllib.request.urlopen(url + urllib.parse.urlencode(getVars) + (puntcomma) + '0') elif (i == 0) and (x == 2) : getVars = {'type' : 'command', 'param' : 'udevice', 'nvalue' : 0, 'idx': 198, 'svalue': (power)} webUrl = urllib.request.urlopen(url + urllib.parse.urlencode(getVars) + (puntcomma) + '0') elif (i == 0) and (x == 3) : getVars = {'type' : 'command', 'param' : 'udevice', 'nvalue' : 0, 'idx': 199, 'svalue': (power)} webUrl = urllib.request.urlopen(url + urllib.parse.urlencode(getVars) + (puntcomma) + '0') #upload power values to Domoticz voor inverter 2 if (i == 1) and (x == 0) : getVars = {'type' : 'command', 'param' : 'udevice', 'nvalue' : 0, 'idx': 200, 'svalue': (power)} webUrl = urllib.request.urlopen(url + urllib.parse.urlencode(getVars) + (puntcomma) + '0') elif (i == 1) and (x == 1) : getVars = {'type' : 'command', 'param' : 'udevice', 'nvalue' : 0, 'idx': 201, 'svalue': (power)} webUrl = urllib.request.urlopen(url + urllib.parse.urlencode(getVars) + (puntcomma) + '0') elif (i == 1) and (x == 2) : getVars = {'type' : 'command', 'param' : 'udevice', 'nvalue' : 0, 'idx': 202, 'svalue': (power)} webUrl = urllib.request.urlopen(url + urllib.parse.urlencode(getVars) + (puntcomma) + '0') elif (i == 1) and (x == 3) : getVars = {'type' : 'command', 'param' : 'udevice', 'nvalue' : 0, 'idx': 203, 'svalue': (power)} webUrl = urllib.request.urlopen(url + urllib.parse.urlencode(getVars) + (puntcomma) + '0') #upload power values to Domoticz voor inverter 3 if (i == 2) and (x == 0) : getVars = {'type' : 'command', 'param' : 'udevice', 'nvalue' : 0, 'idx': 204, 'svalue': (power)} webUrl = urllib.request.urlopen(url + urllib.parse.urlencode(getVars) + (puntcomma) + '0') elif (i == 2) and (x == 1) : getVars = {'type' : 'command', 'param' : 'udevice', 'nvalue' : 0, 'idx': 205, 'svalue': (power)} webUrl = urllib.request.urlopen(url + urllib.parse.urlencode(getVars) + (puntcomma) + '0') elif (i == 2) and (x == 2) : getVars = {'type' : 'command', 'param' : 'udevice', 'nvalue' : 0, 'idx': 206, 'svalue': (power)} webUrl = urllib.request.urlopen(url + urllib.parse.urlencode(getVars) + (puntcomma) + '0') elif (i == 2) and (x == 3) : getVars = {'type' : 'command', 'param' : 'udevice', 'nvalue' : 0, 'idx': 207, 'svalue': (power)} webUrl = urllib.request.urlopen(url + urllib.parse.urlencode(getVars) + (puntcomma) + '0') #upload power values to Domoticz voor inverter 4 if (i == 3) and (x == 0) : getVars = {'type' : 'command', 'param' : 'udevice', 'nvalue' : 0, 'idx': 208, 'svalue': (power)} webUrl = urllib.request.urlopen(url + urllib.parse.urlencode(getVars) + (puntcomma) + '0') elif (i == 3) and (x == 1) : getVars = {'type' : 'command', 'param' : 'udevice', 'nvalue' : 0, 'idx': 209, 'svalue': (power)} webUrl = urllib.request.urlopen(url + urllib.parse.urlencode(getVars) + (puntcomma) + '0') elif (i == 3) and (x == 2) : getVars = {'type' : 'command', 'param' : 'udevice', 'nvalue' : 0, 'idx': 210, 'svalue': (power)} webUrl = urllib.request.urlopen(url + urllib.parse.urlencode(getVars) + (puntcomma) + '0') elif (i == 3) and (x == 3) : getVars = {'type' : 'command', 'param' : 'udevice', 'nvalue' : 0, 'idx': 211, 'svalue': (power)} webUrl = urllib.request.urlopen(url + urllib.parse.urlencode(getVars) + (puntcomma) + '0') except Exception as err: print(f"[ERROR]", {err}) #print(f"Sleeping for {sleep} sec") time.sleep(sleep) |
[ Voor 23% gewijzigd door Dapdodo op 27-04-2021 11:55 ]
[ Voor 16% gewijzigd door Nibblebit op 28-04-2021 17:32 ]
Dit is domoticz? Geen idee hoe die dag/maand tellers beheerd. Zou idd net iets anders moeten zijn dan P1 poort data.BjorntobeWild schreef op donderdag 29 april 2021 @ 06:10:
Ik heb gisteren een aantal wijzigingen doorgevoerd in mijn script omdat ik wat bijzondere waarden zag om 02:00 's nachts. Het lijkt erop dat de tellerstand voor de geleverde energie van die dag genuld worden. Dit wordt dus geregistreerd als verbruik in plaats van teruglevering. Zijn er meerdere die dit zien?
[Afbeelding]
kastje niet open gehad.. alleen 1 antenne er afgehaald en hele week niet de minste onderbreking...echt vaag dat juist de antenne zelf problematisch is.WackoH schreef op maandag 26 april 2021 @ 11:28:
Misschien een losse soldering op het printplaatje?
Al lijkt de verbinding met de antenne via een draadje te gaan, op basis van de onderstaande foto van een ECU-R (maar kan inmiddels andere revisie zijn natuurlijk.
[Afbeelding]
Deze foto komt van een forum waar me ook bezig is om het APS Zigbee protocol to sniffen en ontrafelen. Misschien staat er nog wat nuttigs in.
[ Voor 12% gewijzigd door Nibblebit op 11-05-2021 21:56 . Reden: Hyperlink toegevoegd ]
Link? Kan het niet terugvinden.Nibblebit schreef op dinsdag 11 mei 2021 @ 15:07:
Ik heb een Python 3 scriptje gemaakt die op dit moment prima op PyCharm Community Edition 2021.1.1 draait zonder dat de ECU er mee stopt. Bedoeling is om deze op een Raspberry Pi te draaien en wellicht te integreren voor Home Assistant. Bijdragen zijn welkom: APSystems-ECU proxy for cloudless operation
Mijn nieuwe portfolio (Under Construction) | Benieuwd wat Solar Team Twente gaat doen?
Gezien de monteurs ook altijd alles eerst fotograferen met mobieltje als het uit de doos komt voordat ze uberhaupt maar de bouw inlopen met die spullen, verwacht ik van niet. Ook niet als je de manier van werken van de app of website ziet, kan dat niet.m_rick schreef op zondag 13 juni 2021 @ 07:55:
Ik heb een vraag waar jullie misschien mee kunnen helpen. Gisteren heb ik een aantal panelen met YC600 omvormers geplaatst. De serienummers van de omvormers heb ik netjes genoteerd, op één na. Is er een manier om te scannen en zo het ontbrekende serienummer te achterhalen?
Idd, zigbee werkt alleen als je de id weet om te pairen met controller. Heel misschien als je aparte zigbee stick heb dat je traffic kan bekijken en iets kan herleiden. Redelijk wat werk vergeleken met ff op apparaatje kijken wat er op sticker staat , zelfs al ligt dat op het dak. Hoop niet dat paneel gelicht moet worden om omvormer zichtbaar te krijgenDapdodo schreef op zondag 13 juni 2021 @ 08:16:
[...]
Gezien de monteurs ook altijd alles eerst fotograferen met mobieltje als het uit de doos komt voordat ze uberhaupt maar de bouw inlopen met die spullen, verwacht ik van niet. Ook niet als je de manier van werken van de app of website ziet, kan dat niet.
Zie, ff dak op stickertje zoeken makkelijker 😀tryingtohack schreef op zondag 13 juni 2021 @ 11:43:
Met de TI sniffer en een CC2531 zou je de zigbee link state berichten van je inverters kunnen opvangen. Het serienummer vind je terug in het NWK IEEE address van het desbetreffende link state bericht (little endian: dus wel in reversed order).
Het paneel ligt onder een dakkapel. Dus spanbandje er door en vanuit het raam het paneel tegen houden, dan kan ik er zo met een ladder naartoe en het paneel even los schroevendooiedodo schreef op zondag 13 juni 2021 @ 19:04:
[...]
Zie, ff dak op stickertje zoeken makkelijker 😀
OC / CM - Begint eer ge Bezint
Hopelijk kan je engels:Scatman_II schreef op zondag 27 juni 2021 @ 12:03:
Mooi project! En nu ik zelf 3 weken geleden panelen op het dak heb gelegd met een YC600 en QS1 (ook mooi project) wil ik ze graag in HA gaan uitlezen.
Een Arduino aan de slimme meter geeft me al de gewenste negatieve getallen bij terugleveren, maar ik zou ook graag de interter temperaturen in de gaten kunnen houden..
Met mijn gebrekkige HA kennis geprobeerd de sensors toe te voegen en de ECU in HA uit te lezen, maar helaas nog geen succes.
- ECU-R (productiejaar 2020-09-19) met Wifi aan thuisnetwerk, check
- De juiste Espressif gevonden, check (dwz stekker eruit = IP niet meer vindbaar)
- Custom components toegevoegd van github https://github.com/ksheum..._ecur/blob/main/README.md , check
- IP adres in configuration.yaml toegevoegd, check
De sensors zijn toegevoegd aan HA, maar tonen 'Unavailable'. De inverter sensors verschijnen niet; ik ga er dus van uit dat het uitlezen van de ECU dus al niet werkt.
Ik las her en der dat die ECU-R's inmiddels meer dichtgetimmerd zijn, doe ik iets fout of ligt het aan mijn nieuwe ECU-R?
[ Voor 9% gewijzigd door Dapdodo op 27-06-2021 12:15 ]
Hey, dank voor je feedback. Geen idee of ik de laatste (versie v1.0.1, bedoel je?) gebruik; ik gebruik de files van github onder het linkje in mijn vorige post.Dapdodo schreef op zondag 27 juni 2021 @ 12:10:
[...]
Hopelijk kan je engels:
https://community.home-as...nverters-data-pull/260835
Want volgens mij heb je niet de laatste.
En probeer anders de python versie van een eindje terug hier. Thonny op je PC installeren en eerst kijken of het daarmee lukt. Want uiteindelijk gebruik je het signaal van de app van ema.
De mijne is van februari 2020 en gaat via de wifi nog wel.
1
2
3
4
| logger: default: warning logs: custom_components.apsystems_ecur: debug |
1
2
3
4
5
6
7
| 2021-06-27 13:02:29 INFO (MainThread) [custom_components.apsystems_ecur.APSystemsECUR] Connected to 192.168.2.7 8899 2021-06-27 13:02:37 WARNING (MainThread) [homeassistant.setup] Setup of apsystems_ecur is taking over 10 seconds. 2021-06-27 13:02:39 DEBUG (MainThread) [custom_components.apsystems_ecur] Got data from ECU 2021-06-27 13:02:39 DEBUG (MainThread) [custom_components.apsystems_ecur] Returning {'timestamp': '2021-06-27 12:59:28', 'inverter_qty': 2, 'inverters': {'408000166664': {'uid': '408000666644', 'online': True, 'unknown': '01', 'frequency': 49.9, 'temperature': 55, 'signal': 73, 'model': 'YC600', 'channel_qty': 2, 'power': [303, 298], 'voltage': [231, 231]}, '801006666088': {'uid': '80100077778', 'online': True, 'unknown': '03', 'frequency': 49.9, 'temperature': 61, 'signal': 72, 'model': 'QS1', 'channel_qty': 4, 'power': [290, 292, 300, 298], 'voltage': [232]}}, 'ecu_id': '216077654647', 'today_energy': 6.17, 'lifetime_energy': 121.1, 'current_power': 1781, 'data_from_cache': False, 'querying': True} 2021-06-27 13:02:39 DEBUG (MainThread) [custom_components.apsystems_ecur] Finished fetching apsystems_ecur data in 16.667 seconds 2021-06-27 13:03:40 DEBUG (MainThread) [custom_components.apsystems_ecur] Querying ECU |
OC / CM - Begint eer ge Bezint
Gewoon communicatie dingetje, kan aan van alles liggen. Even in de gaten houden of er vaker unavailable wordt gerapporteerd. Mijn ECU had wat slappe wifi antenne en vertoonde dat gedrag ookScatman_II schreef op zondag 27 juni 2021 @ 13:20:
[...]
Hey, dank voor je feedback. Geen idee of ik de laatste (versie v1.0.1, bedoel je?) gebruik; ik gebruik de files van github onder het linkje in mijn vorige post.
Inmiddels werkt het ineens (?), door middel van dat HA community forum de log uitgelezen, door aan configuration.yaml het volgende toe te voegen:
code:
1 2 3 4 logger: default: warning logs: custom_components.apsystems_ecur: debug
Daarna kreeg ik na de eerste reboot van mijn pi niks te zien in de logs, anders dan dat de 'setup over 10 seconds' nam. Bij de volgende reboot echter, succes!
code:
1 2 3 4 5 6 7 2021-06-27 13:02:29 INFO (MainThread) [custom_components.apsystems_ecur.APSystemsECUR] Connected to 192.168.2.7 8899 2021-06-27 13:02:37 WARNING (MainThread) [homeassistant.setup] Setup of apsystems_ecur is taking over 10 seconds. 2021-06-27 13:02:39 DEBUG (MainThread) [custom_components.apsystems_ecur] Got data from ECU 2021-06-27 13:02:39 DEBUG (MainThread) [custom_components.apsystems_ecur] Returning {'timestamp': '2021-06-27 12:59:28', 'inverter_qty': 2, 'inverters': {'408000166664': {'uid': '408000666644', 'online': True, 'unknown': '01', 'frequency': 49.9, 'temperature': 55, 'signal': 73, 'model': 'YC600', 'channel_qty': 2, 'power': [303, 298], 'voltage': [231, 231]}, '801006666088': {'uid': '80100077778', 'online': True, 'unknown': '03', 'frequency': 49.9, 'temperature': 61, 'signal': 72, 'model': 'QS1', 'channel_qty': 4, 'power': [290, 292, 300, 298], 'voltage': [232]}}, 'ecu_id': '216077654647', 'today_energy': 6.17, 'lifetime_energy': 121.1, 'current_power': 1781, 'data_from_cache': False, 'querying': True} 2021-06-27 13:02:39 DEBUG (MainThread) [custom_components.apsystems_ecur] Finished fetching apsystems_ecur data in 16.667 seconds 2021-06-27 13:03:40 DEBUG (MainThread) [custom_components.apsystems_ecur] Querying ECU
In HA is nu ineens een tweede set sensors zichtbaar, met duplicate namen zoals "sensor.ecu_current_power_2".
Maar deze duplicates worden netjes elke minuut geupdateYess!
Geen idee of dit nou een Wifi, ECU of Raspberry Pi hickup was het eerste uur na inladen, dat zelfs met meerdere reboots niks deed. Maar het lijkt werken, mooi werk hoor!
ehhhh..HOI
Tja.. ECU r pro geeft me vaag een hint van andere software. Wat geeft ECU app aan data terug als je die gebruikt?avanthof schreef op dinsdag 27 juli 2021 @ 15:22:
Allen,
Ik heb ook sinds deze week een APSystems installatie en wilde gebruik maken van de apsystems_ecur integratie in HA. Nu is de ECU-R door een partij geïnstalleerd. Heb via Wifi-Hotspot de WLAN interface gekoppeld. Ik kon deze niet eerst niet bereiken maar inmiddels blijk ik wel connectie te hebben met port 8899.
Als de het test script van Dapdodo gebruik krijg ik de volgende info:
b"APS120112000121620000715601\x00\x00\x00\xbb\x00\x00\x06V\x00\x00\x041 !\x07'\x146\x08\x00\x05\x00\x0510015ECU_R_PRO_2.0.0012Europe/Paris\x80\x97\x1b\x02\xa6I`\xc5\xa8y\xb7\x1000\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00END\n"
{"ECU": {"Answer": "1201120001", "ID": "216200007156", "Lifetime": 18.7, "Today": 10.73, "maxUID": 5, "Version": "ECU_R_PRO_2.", "TimeZone": "012Europe"}, "Error": "No inverters active"}
Er lijken geen inverters gekoppeld te zijn, echter zijn deze wel aanwezig. Alleen het de partij al deze koppeld aan de Online portal. Dien ik deze hiervoor weer factory default te maken om de informatie uit de ECU R te krijgen of zou dit normaliter moeten werken? De ECU lijkt op software 2.0 te draaien terwijl velen 1.2.x draaien las ik. Zit hier nog een verschil in?
script is nooit aangepast en vooral niet getest voor QS1.avanthof schreef op dinsdag 27 juli 2021 @ 17:37:
Daar zijn ze gewoon volledig geregistreerd. Vijf omvormers overdeeld over 18 panelen (4x QS1 en 1x YC600)
[ Voor 98% gewijzigd door avanthof op 30-07-2021 21:38 ]
Dat is de data in de testroutine ook. Die is ook 5 min. het interval waarmee die naar de website logt.avanthof schreef op dinsdag 27 juli 2021 @ 20:36:
Heb het geprobeerd om de apsystem_ecur te gebruiken. Maar dat werkt niet en ook schiet HA CPU tot bijna 100%. Maar heb net gezien dat ik met HTTP er gewoon naar toe kan, middels: http://192.168.1.15/index.php/realtimedata. Alleen is de interval echt niet realtime te noemen. Tussen 5-10 min
[ Voor 30% gewijzigd door Dapdodo op 28-07-2021 08:00 ]
had je trouwens bruikbare log van deze actie? die cpu zou bijna niet van 1 integratie moeten komen en al helemaal niet continueavanthof schreef op dinsdag 27 juli 2021 @ 20:36:
Heb het geprobeerd om de apsystem_ecur te gebruiken. Maar dat werkt niet en ook schiet HA CPU tot bijna 100%. Maar heb net gezien dat ik met HTTP er gewoon naar toe kan, middels: http://192.168.1.15/index.php/realtimedata. Alleen is de interval echt niet realtime te noemen. Tussen 5-10 min
avanthof schreef op woensdag 28 juli 2021 @ 09:17:
Hoe zou ik die mainrecord kunnen zien en aanpassen? Welke print statement bedoel je?
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
| import socket import binascii import json import sys import datetime myIPadress = "" myMACadress = "" #May be search for this if ipadres doesn't react output = {} def APSint(codec,start): return int(binascii.b2a_hex(codec[(start):(start+2)]),16) def APStemp(codec,start): return APSint(codec,start)-100 # check later if sign is bit 7 64 and fahrenheit def APSdouble(codec,start): return int(binascii.b2a_hex(codec[(start):(start+4)]),16) def APSbool(codec,start): return binascii.b2a_hex(codec[(start):(start+1)]) == b'01' def APSuid(codec,start): return str(binascii.b2a_hex(codec[(start):(start+12)]))[2:14] def APSstr(codec,start,amount): return str(codec[start:(start+amount)])[2:(amount+2)] def APStimestamp(codec,start,amount): timestr=str(binascii.b2a_hex(codec[start:(start+amount)]))[2:(amount+2)] return timestr[0:4]+"-"+timestr[4:6]+"-"+timestr[6:8]+" "+timestr[8:10]+":"+timestr[10:12]+":"+timestr[12:14] now = datetime.datetime.now() if now.hour<=3 : sys.exit("Error: Geen zon mogelijk") #initialize socket error=0 try: soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) soc.connect((myIPadress,8899)) except Exception: error=1 if error==1: #Do what yout want or put sys.exit before continue sys.exit("Error: No valid IPadress or connection") #get ECU_RID ECU_R = 'APS1100160001END' ECU_Rsend = ECU_R.encode('utf-8') soc.send(ECU_Rsend) ECU_Rreceive = soc.recv(1024) #print ("\nAsking for ECUID number: ") #print(ECU_Rreceive) #print("\n") #print(binascii.b2a_hex(ECU_Rreceive)) # Decoded explanation # --------------------- # 1- 3 : APS = Mark start of datastream # 4- 5 : 11 = Answer notation # 6- 8 : 0094 = Datalength # 9-12 : 0001 = commandnumber # 13-24 : 216000026497 = ECU_R nummer # 25-26 : 01 = number of inverters online # 27-30 : 42896 = Lifetime energy (kWh)/10 # 31-34 : 00 00 00 00 = LastSystemPower kW/100 # 35-38 : 202 = CurrentDayEnergy (/100) # 39-45 : 7xd0 = LastTimeConnectEMA # 46-47 : 8 = number of inverters registered # 48-49 : 0 = number of inverters online # 50-51 : 10 = EcuChannel # 52-53 : 014 = VersionLEN => VL # 55-55+VL : ECU_R_1.2.13 = Version # 56+VL-57+VL : 009 = TimeZoneLen => TL # 58+VL-57+VL+TL : Etc/GMT-8 = Timezone server op lokatie met -8 uur? # 58+VL+TL-63+VL+TL : 80 97 1b 01 5d 1e = EthernetMAC # 64+VL+TL-69+VL+TL : 00 00 00 00 00 00 = WirelessMAC //Shoud be but there is a bugin firmware # 70+VL+TL-73+VL+TL : END\n = SignatureStop Marks end of datastream # Note ECU_Rreceive start bij 0 dus alles is hieronder 1 lager output["ECU"]={} myECUID = APSstr(ECU_Rreceive,13,12) #216000026497 output["ECU"]["Answer"] = APSstr(ECU_Rreceive,3,2) #11 output["ECU"]["DataLength"] = APSstr(ECU_Rreceive,5,4) #0094 #0095 vanaf versie 1.2.15 output["ECU"]["Command"] = APSstr(ECU_Rreceive,9,4) #0001 sometimes 0002 command output["ECU"]["ID"] = APSstr(ECU_Rreceive,13,12) #ECU_R 216000026497 output["ECU"]["InvertersOnline"] = APSstr(ECU_Rreceive,25,2) #01 output["ECU"]["Lifetime"] = APSdouble(ECU_Rreceive,27)/10 output["ECU"]["CurrentDCPower"] = APSdouble(ECU_Rreceive,31)/100 output["ECU"]["Today"] = APSdouble(ECU_Rreceive,35)/100 #output["ECU"]["LastTimeConnectEMA"] = APSdouble(ECU_Rreceive,39) output["ECU"]["RegisteredUID"] = APSint(ECU_Rreceive,46) output["ECU"]["OnlineUID"] = APSint(ECU_Rreceive,48) #output["ECU"]["EcuChannel"] = APSstr(ECU_Rreceive,50,2) output["ECU"]["VLEN"] = int(APSstr(ECU_Rreceive,52,3)) output["ECU"]["Version"] = APSstr(ECU_Rreceive,55,output["ECU"]["VLEN"]) output["ECU"]["TLEN"] = int(APSstr(ECU_Rreceive,55+output["ECU"]["VLEN"],3)) output["ECU"]["TimeZone"] = APSstr(ECU_Rreceive,58+output["ECU"]["VLEN"],output["ECU"]["TLEN"]) #output["ECU"]["EthernetMAC"] = APSstr(ECU_Rreceive,58+output["ECU"]["VLEN"]+output["ECU"]["TLEN"],21) #output["ECU"]["WirelessMAC"] = APSstr(ECU_Rreceive,64+output["ECU"]["VLEN"]+output["ECU"]["TLEN"],24) #output["ECU"]["END"] = APSstr(ECU_Rreceive,70+output["ECU"]["VLEN"]+output["ECU"]["TLEN"],5) print(output) #get data from UID ECU_R = 'APS1100280002'+myECUID+"END" ECU_Rsend = ECU_R.encode('utf-8') soc.send(ECU_Rsend) ECU_Rreceive = soc.recv(2048) soc.shutdown(socket.SHUT_RDWR) soc.close() print("\nAsking for UID numbers and data: "+str(len(ECU_Rreceive))) print(ECU_Rreceive) print("\n") print(binascii.b2a_hex(ECU_Rreceive)) if (len(ECU_Rreceive)>16) : # Explanation general header # ---------------------------------- # 1- 3 APS # 4- 5 CommandGroup # 6- 8 Datastring Framelength # 9-12 command # 13-14 MatchStatus # 15-16 EcuModel # 17-18 number of inverters # 19-26 timestamp #base data valid for all UID output["ECU"]["AnswerUID"] = APSstr(ECU_Rreceive,3,14) maxcounter = APSint(ECU_Rreceive,17) #number of inverters output["ECU"]["timestamp"] = APStimestamp(ECU_Rreceive,19,14) counter = 1 offset=26 # Records will pass for each inverter on this ECU_R (UID) while counter <= maxcounter: # Record for each type of inverter #------------------------ # 27-32 Inverter ID (UID) # 33 0 or 1 Marks online status of inverter instance # 34 "0" unknown # 35 1=YC600 and 3=QS1. may be 2=YC1000 # 36-37 Frequency /10 # 38-39 Temperature Celsius Bit 7 of second byte is signbit (1=+, 0=-)? # 40-41 Power A Channel A on Inverter # 42-43 Voltage A Channel A on Inverter # 44-45 Power B Channel B on Inverter # 46-47 Voltage B Channel B on Inverter POWER C on QS1 # 48-51 END\n or POWER D on QS1 till END #you can also use UID as index in dictonary #UIDkey = APSuid(ECU_Rreceive,offset)[7:12] UIDkey = "UID"+str(counter) output[UIDkey] = {} output[UIDkey]["UID"] = APSuid(ECU_Rreceive,offset) output[UIDkey]["Online"] = APSbool(ECU_Rreceive,offset+6) #output[UIDkey]["Something"] = APSstr(ECU_Rreceive,offset+7,1) InverterType = APSstr(ECU_Rreceive,offset+8,1) step = 13 if InverterType == "1" : #YC600 if output[UIDkey]["Online"] == True : # when offline no valid data output[UIDkey]["Type"] = "YC600" output[UIDkey]["Frequency"] = APSint(ECU_Rreceive,offset+9)/10.0 output[UIDkey]["Temperature"] = APStemp(ECU_Rreceive,offset+11) output[UIDkey]["PowerA"] = APSint(ECU_Rreceive,offset+step) output[UIDkey]["VoltA"] = APSint(ECU_Rreceive,offset+step+2) output[UIDkey]["PowerB"] = APSint(ECU_Rreceive,offset+step+4) output[UIDkey]["VoltB"] = APSint(ECU_Rreceive,offset+step+6) step += 8 elif InverterType == "2" : #YC1000 if output[UIDkey]["Online"] == True : # when offline no valid data output[UIDkey]["Type"] = "YC1000" output[UIDkey]["Frequency"] = APSint(ECU_Rreceive,offset+9)/10.0 output[UIDkey]["Temperature"] = APStemp(ECU_Rreceive,offset+11) output[UIDkey]["PowerA"] = APSint(ECU_Rreceive,offset+step) output[UIDkey]["Volt1"] = APSint(ECU_Rreceive,offset+step+2) output[UIDkey]["PowerB"] = APSint(ECU_Rreceive,offset+step+4) output[UIDkey]["Volt2"] = APSint(ECU_Rreceive,offset+step+6) output[UIDkey]["PowerC"] = APSint(ECU_Rreceive,offset+step+8) output[UIDkey]["Volt3"] = APSint(ECU_Rreceive,offset+step+10) output[UIDkey]["PowerD"] = APSint(ECU_Rreceive,offset+step+12) step += 14 elif InverterType == "3" : #QS1 if output[UIDkey]["Online"] == True : # when offline no valid data output[UIDkey]["Type"] = "QS1" output[UIDkey]["Frequency"] = APSint(ECU_Rreceive,offset+9)/10.0 output[UIDkey]["Temperature"] = APStemp(ECU_Rreceive,offset+11) output[UIDkey]["PowerA"] = APSint(ECU_Rreceive,offset+step) output[UIDkey]["Volt"] = APSint(ECU_Rreceive,offset+step+2) output[UIDkey]["PowerB"] = APSint(ECU_Rreceive,offset+step+4) output[UIDkey]["PowerC"] = APSint(ECU_Rreceive,offset+step+6) output[UIDkey]["PowerD"] = APSint(ECU_Rreceive,offset+step+8) step += 10 else : # "2" may be YC1000 output[UIDkey]["Type"] = "Unknown" step += 8 # print(output) offset += step #how big is UID block counter += 1 #print(output) #end while UID #print(output) else: output["Error"] = "No inverters active" output["ECU"]["timestamp"] = now.strftime("%Y-%m-%d %H:%M:%S") print(json.dumps(output, indent=2)) #Backup to file: create filename with Log_year_month.txt if(output["ECU"]["OnlineUID"]>0): flnm = sys.path[0] + "/ZLog_" + now.strftime("%Y-%m")+".txt" #print (flnm) #open file and write data fp = open(flnm,"a") fp.write(json.dumps(output)+'\n') fp.close() # not programmed but found in HA automation forum # Explanation general header # command APS1100280030[EDU-ID]END # ---------------------------------- # 1- 3 APS # 4- 5 ID for communication # 6- 9 Datastring length # 10-15 unkown (command/answer) # 16-21 Inverter ID (UID) # 22 Signal strength 0-255 inverter (4 groups) # 23-25 END or continues to next "InverterID*" but always marks end of datastring # Commands to speed up scanning frequency # APS1100320053[ECU-ID]END1END = service mode aan # APS1100320053[ECU-ID]END0END = service mode aan # zie pictures in WORD document for explanation of more. |
[ Voor 29% gewijzigd door Dapdodo op 30-07-2021 15:39 ]
Hey, die regel 115 (print(ECU_Rreceive)) zou toch de hele receive buffer moeten printen in hex?Dapdodo schreef op donderdag 29 juli 2021 @ 21:03:
[...]
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 import socket import binascii import json import sys import datetime myIPadress = "" myMACadress = "" #May be search for this if ipadres doesn't react output = {} def APSint(codec,start): return int(binascii.b2a_hex(codec[(start):(start+2)]),16) def APStemp(codec,start): return APSint(codec,start)-100 # check later if sign is bit 7 64 and fahrenheit def APSdouble(codec,start): return int(binascii.b2a_hex(codec[(start):(start+4)]),16) def APSbool(codec,start): return binascii.b2a_hex(codec[(start):(start+1)]) == b'01' def APSuid(codec,start): return str(binascii.b2a_hex(codec[(start):(start+12)]))[2:14] def APSstr(codec,start,amount): return str(codec[start:(start+amount)])[2:(amount+2)] def APStimestamp(codec,start,amount): timestr=str(binascii.b2a_hex(codec[start:(start+amount)]))[2:(amount+2)] return timestr[0:4]+"-"+timestr[4:6]+"-"+timestr[6:8]+" "+timestr[8:10]+":"+timestr[10:12]+":"+timestr[12:14] now = datetime.datetime.now() if now.hour<=3 : sys.exit("Error: Geen zon mogelijk") #initialize socket error=0 try: soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) soc.connect((myIPadress,8899)) except Exception: error=1 if error==1: #Do what yout want or put sys.exit before continue sys.exit("Error: No valid IPadress or connection") #get ECU_RID ECU_R = 'APS1100160001END' ECU_Rsend = ECU_R.encode('utf-8') soc.send(ECU_Rsend) ECU_Rreceive = soc.recv(1024) #print ("\nAsking for ECUID number: ") #print(ECU_Rreceive) #print("\n") #print(binascii.b2a_hex(ECU_Rreceive)) # Decoded explanation # --------------------- # 1- 3 : APS = Mark start of datastream # 4- 5 : 11 = Answer notation # 6- 8 : 0094 = Datalength # 9-12 : 0001 = commandnumber # 13-24 : 216000026497 = ECU_R nummer # 25-26 : 01 = number of inverters online # 27-30 : 42896 = Lifetime energy (kWh)/10 # 31-34 : 00 00 00 00 = LastSystemPower kW/100 # 35-38 : 202 = CurrentDayEnergy (/100) # 39-45 : 7xd0 = LastTimeConnectEMA # 46-47 : 8 = number of inverters registered # 48-49 : 0 = number of inverters online # 50-51 : 10 = EcuChannel # 52-53 : 014 = VersionLEN => VL # 55-55+VL : ECU_R_1.2.13 = Version # 56+VL-57+VL : 009 = TimeZoneLen => TL # 58+VL-57+VL+TL : Etc/GMT-8 = Timezone server op lokatie met -8 uur? # 58+VL+TL-63+VL+TL : 80 97 1b 01 5d 1e = EthernetMAC # 64+VL+TL-69+VL+TL : 00 00 00 00 00 00 = WirelessMAC //Shoud be but there is a bugin firmware # 70+VL+TL-73+VL+TL : END\n = SignatureStop Marks end of datastream # Note ECU_Rreceive start bij 0 dus alles is hieronder 1 lager output["ECU"]={} myECUID = APSstr(ECU_Rreceive,13,12) #216000026497 output["ECU"]["Answer"] = APSstr(ECU_Rreceive,3,2) #11 output["ECU"]["DataLength"] = APSstr(ECU_Rreceive,5,4) #0094 #0095 vanaf versie 1.2.15 output["ECU"]["Command"] = APSstr(ECU_Rreceive,9,4) #0001 sometimes 0002 command output["ECU"]["ID"] = APSstr(ECU_Rreceive,13,12) #ECU_R 216000026497 output["ECU"]["InvertersOnline"] = APSstr(ECU_Rreceive,25,2) #01 output["ECU"]["Lifetime"] = APSdouble(ECU_Rreceive,27)/10 output["ECU"]["CurrentDCPower"] = APSdouble(ECU_Rreceive,31)/100 output["ECU"]["Today"] = APSdouble(ECU_Rreceive,35)/100 #output["ECU"]["LastTimeConnectEMA"] = APSdouble(ECU_Rreceive,39) output["ECU"]["RegisteredUID"] = APSint(ECU_Rreceive,46) output["ECU"]["OnlineUID"] = APSint(ECU_Rreceive,48) #output["ECU"]["EcuChannel"] = APSstr(ECU_Rreceive,50,2) output["ECU"]["VLEN"] = int(APSstr(ECU_Rreceive,52,3)) output["ECU"]["Version"] = APSstr(ECU_Rreceive,55,output["ECU"]["VLEN"]) output["ECU"]["TLEN"] = int(APSstr(ECU_Rreceive,55+output["ECU"]["VLEN"],3)) output["ECU"]["TimeZone"] = APSstr(ECU_Rreceive,58+output["ECU"]["VLEN"],output["ECU"]["TLEN"]) #output["ECU"]["EthernetMAC"] = APSstr(ECU_Rreceive,58+output["ECU"]["VLEN"]+output["ECU"]["TLEN"],21) #output["ECU"]["WirelessMAC"] = APSstr(ECU_Rreceive,64+output["ECU"]["VLEN"]+output["ECU"]["TLEN"],24) #output["ECU"]["END"] = APSstr(ECU_Rreceive,70+output["ECU"]["VLEN"]+output["ECU"]["TLEN"],5) print(output) #get data from UID ECU_R = 'APS1100280002'+myECUID+"END" ECU_Rsend = ECU_R.encode('utf-8') soc.send(ECU_Rsend) ECU_Rreceive = soc.recv(2048) soc.shutdown(socket.SHUT_RDWR) soc.close() print("\nAsking for UID numbers and data: "+str(len(ECU_Rreceive))) print(ECU_Rreceive) print("\n") print(binascii.b2a_hex(ECU_Rreceive)) if (len(ECU_Rreceive)>16) : # Explanation general header # ---------------------------------- # 1- 3 APS # 4- 5 CommandGroup # 6- 8 Datastring Framelength # 9-12 command # 13-14 MatchStatus # 15-16 EcuModel # 17-18 number of inverters # 19-26 timestamp #base data valid for all UID output["ECU"]["AnswerUID"] = APSstr(ECU_Rreceive,3,14) maxcounter = APSint(ECU_Rreceive,17) #number of inverters output["ECU"]["timestamp"] = APStimestamp(ECU_Rreceive,19,14) counter = 1 offset=26 # Records will pass for each inverter on this ECU_R (UID) while counter <= maxcounter: # Record for each type of inverter #------------------------ # 27-32 Inverter ID (UID) # 33 0 or 1 Marks online status of inverter instance # 34 "0" unknown # 35 1=YC600 and 3=QS1. may be 2=YC1000 # 36-37 Frequency /10 # 38-39 Temperature Celsius Bit 7 of second byte is signbit (1=+, 0=-)? # 40-41 Power A Channel A on Inverter # 42-43 Voltage A Channel A on Inverter # 44-45 Power B Channel B on Inverter # 46-47 Voltage B Channel B on Inverter POWER C on QS1 # 48-51 END\n or POWER D on QS1 till END #you can also use UID as index in dictonary #UIDkey = APSuid(ECU_Rreceive,offset)[7:12] UIDkey = "UID"+str(counter) output[UIDkey] = {} output[UIDkey]["UID"] = APSuid(ECU_Rreceive,offset) output[UIDkey]["Online"] = APSbool(ECU_Rreceive,offset+6) #output[UIDkey]["Something"] = APSstr(ECU_Rreceive,offset+7,1) InverterType = APSstr(ECU_Rreceive,offset+8,1) step = 13 if InverterType == "1" : #YC600 if output[UIDkey]["Online"] == True : # when offline no valid data output[UIDkey]["Type"] = "YC600" output[UIDkey]["Frequency"] = APSint(ECU_Rreceive,offset+9)/10.0 output[UIDkey]["Temperature"] = APStemp(ECU_Rreceive,offset+11) output[UIDkey]["PowerA"] = APSint(ECU_Rreceive,offset+step) output[UIDkey]["VoltA"] = APSint(ECU_Rreceive,offset+step+2) output[UIDkey]["PowerB"] = APSint(ECU_Rreceive,offset+step+4) output[UIDkey]["VoltB"] = APSint(ECU_Rreceive,offset+step+6) step += 8 elif InverterType == "2" : #YC1000 if output[UIDkey]["Online"] == True : # when offline no valid data output[UIDkey]["Type"] = "YC1000" output[UIDkey]["Frequency"] = APSint(ECU_Rreceive,offset+9)/10.0 output[UIDkey]["Temperature"] = APStemp(ECU_Rreceive,offset+11) output[UIDkey]["PowerA"] = APSint(ECU_Rreceive,offset+step) output[UIDkey]["Volt1"] = APSint(ECU_Rreceive,offset+step+2) output[UIDkey]["PowerB"] = APSint(ECU_Rreceive,offset+step+4) output[UIDkey]["Volt2"] = APSint(ECU_Rreceive,offset+step+6) output[UIDkey]["PowerC"] = APSint(ECU_Rreceive,offset+step+8) output[UIDkey]["Volt3"] = APSint(ECU_Rreceive,offset+step+10) output[UIDkey]["PowerD"] = APSint(ECU_Rreceive,offset+step+12) step += 14 elif InverterType == "3" : #QS1 if output[UIDkey]["Online"] == True : # when offline no valid data output[UIDkey]["Type"] = "QS1" output[UIDkey]["Frequency"] = APSint(ECU_Rreceive,offset+9)/10.0 output[UIDkey]["Temperature"] = APStemp(ECU_Rreceive,offset+11) output[UIDkey]["PowerA"] = APSint(ECU_Rreceive,offset+step) output[UIDkey]["Volt"] = APSint(ECU_Rreceive,offset+step+2) output[UIDkey]["PowerB"] = APSint(ECU_Rreceive,offset+step+4) output[UIDkey]["PowerC"] = APSint(ECU_Rreceive,offset+step+6) output[UIDkey]["PowerD"] = APSint(ECU_Rreceive,offset+step+8) step += 10 else : # "2" may be YC1000 output[UIDkey]["Type"] = "Unknown" step += 8 # print(output) offset += step #how big is UID block counter += 1 #print(output) #end while UID #print(output) else: output["Error"] = "No inverters active" output["ECU"]["timestamp"] = now.strftime("%Y-%m-%d %H:%M:%S") print(json.dumps(output, indent=2)) #Backup to file: create filename with Log_year_month.txt if(output["ECU"]["OnlineUID"]>0): flnm = sys.path[0] + "/ZLog_" + now.strftime("%Y-%m")+".txt" #print (flnm) #open file and write data fp = open(flnm,"a") fp.write(json.dumps(output)+'\n') fp.close() # not programmed but found in HA automation forum # Explanation general header # command APS1100280030[EDU-ID]END # ---------------------------------- # 1- 3 APS # 4- 5 ID for communication # 6- 9 Datastring length # 10-15 unkown (command/answer) # 16-21 Inverter ID (UID) # 22 Signal strength 0-255 inverter (4 groups) # 23-25 END or continues to next "InverterID*" but always marks end of datastring # Commands to speed up scanning frequency # APS1100320053[ECU-ID]END1END = service mode aan # APS1100320053[ECU-ID]END0END = service mode aan # zie pictures in WORD document for explanation of more.
Een aangepaste versie. Als je de output hiervan eens terug in het forum plakt, kunnen we puzzelen hoe die data in elkaar steekt. Ging om regel 114 t/m 117 dat is de ruwe data die terugkomt.
Wel doen als er licht is of zonnetje schijnt.
0 /b is behoorlijk leeg, had met avanthof even versimpeld script gedaan en die gaf wel restultavanthof schreef op vrijdag 30 juli 2021 @ 14:24:
Hierbij het resultaat:
Asking for UID numbers and data: 0
b''
[ Voor 100% gewijzigd door dooiedodo op 02-08-2021 18:00 ]
Als dit wel antwoord geeft, kan het zijn dat de commando's te snel achter elkaar komen? of druk bezette wifi. En wat was het antwoord? Want alleen met dat tweede commando heb je ook wat je wilt. Volt, power en temp. De eerste is om ecuid op te vragen. Zodat het iets makkelijker is om te gebruiken. Maar eenmaal dat je dat hebt hoeft dat niet meer. Dan doe je alleen het tweede deel.dooiedodo schreef op maandag 2 augustus 2021 @ 17:58:
[...]
Hey, die regel 115 (print(ECU_Rreceive)) zou toch de hele receive buffer moeten printen in hex?
import socket
import struct
import binascii
import json
import datetime
from struct import unpack
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.168.1.15", 8899 ))
mystring ='APS1100280002216200007156END\n'
datasend = mystring.encode('utf-8')
s.send(datasend)
dataecu = s.recv(1024)
print (dataecu)
-------------
zou het zijn dat ECU paar keer geen response gegeven hebben op dat commando ofzo?
Antwoord was fatsoenlijk, inverter IDs en channel data , timestamp etcDapdodo schreef op maandag 2 augustus 2021 @ 19:44:
[...]
Als dit wel antwoord geeft, kan het zijn dat de commando's te snel achter elkaar komen? of druk bezette wifi. En wat was het antwoord? Want alleen met dat tweede commando heb je ook wat je wilt. Volt, power en temp. De eerste is om ecuid op te vragen. Zodat het iets makkelijker is om te gebruiken. Maar eenmaal dat je dat hebt hoeft dat niet meer. Dan doe je alleen het tweede deel.
[ Voor 12% gewijzigd door Dapdodo op 04-08-2021 13:00 ]
dat zou alleen de eerste response moeten gaan tonen.. was nieuwsgierig of er iets in zat wat een richting van het prbleem zou tonenavanthof schreef op woensdag 4 augustus 2021 @ 12:51:
Uncomment 54-57 -> geen verschil met verschillende instellingen (1024-4096)
Uncomment: 101-103:
"EthernetMAC": "\\x80\\x97\\x1b\\x02\\xa6I",
"WirelessMAC": "`\\xc5\\xa8y\\xb7\\x1000\\x00",
Heb bij regel 57 een soc.shutdown en close erbij gedaan en rond regel 106 een soc.connect gedaan weer en dat werkt wel goed.
https://github.com/ksheum...cur/APSystemsECUR.py#L103Dapdodo schreef op woensdag 4 augustus 2021 @ 12:56:
@avanthof , dan werkt de voorloper van apsystems_ecur nu wel. Nu zou je dat in de code daarin moeten gaan steken. Echter die is object georienteerd geschreven en dat is niet mijn steel. Mogelijk als je het daar vraagt met de code erbij, dat ze je kunnen helpen. Uiteindelijk zijn ze daar ook vertrokken vanuit deze basis.
Zie je ook echt END bij de regel waar het zou moeten staan? of is het bericht langer?
[ Voor 185% gewijzigd door dooiedodo op 04-08-2021 16:52 ]
is echt een code fout in integratie na nieuweHA.. VOLT wordt ELECTRIC_POTENTIAL_VOLT voor import constants. Kyle was quick. Veroorzaakt door nieuwe energy management in HADapdodo schreef op woensdag 4 augustus 2021 @ 18:31:
@dooiedodo teveel gemarteld? Bij mij is de ema site de weg kwijt. Maar zelf krijg ik het binnen. Gisteren was die alle contact kwijt, maar even power cycle gedaan en toen deed die het weer. Ben benieuwd hoe het morgen is.
[ Voor 14% gewijzigd door dooiedodo op 04-08-2021 20:33 ]
bla di bla bla
toch wel raar dat HA crasht. dat een integratie ff niet lekker loopt, zou 'unavailable' state voor entities moeten geven. Dat werkt bij mij prima bijvoorbeeld als ik ECU ff uit doe. Niks crash, gewoon wat entities niet beschikbaar.avanthof schreef op donderdag 5 augustus 2021 @ 11:45:
Ik had het gisteren werkend. Maar HA crashste omdat hij geen contact kon maken met de ECU. Toen ik handmatig de ECU uitvroeg kwam hij terug met een lijst welke honderden entries bevatte:
....
"UID17413": {
"UID": "'",
"Online": false,
"Type": "Unknown"
},
"UID17414": {
"UID": "'",
"Online": false,
"Type": "Unknown"
},
"UID17415": {
"UID": "'",
"Online": false,
"Type": "Unknown"
},
"UID17416": {
"UID": "'",
"Online": false,
"Type": "Unknown"
},
"UID17417": {
"UID": "'",
"Online": false,
"Type": "Unknown"
},
"UID17418": {
"UID": "'",
"Online": false,
"Type": "Unknown"
}
Het leek even dat de ECU even compleet de draad kwijt was. Restart loste her op. Ga het vandaag nog eens proberen.
https://community.home-as...ters-data-pull/260835/353ChristianD schreef op donderdag 5 augustus 2021 @ 10:29:
Eindelijk de plugin werkend gekregen en iedereen die aan de integratie heeft meegewerkt wil ik bedanken![]()
Met de nieuwste HA versie heb ik zelf 2 aanpassingen gemaakt in het bestand sensor.py:
ELECTRIC_POTENTIAL_VOLT was VOLT
Regel 30: ELECTRIC_POTENTIAL_VOLT,
Regel 67: "voltage", label="Voltage", unit=ELECTRIC_POTENTIAL_VOLT,
Ik vroeg me alleen af waarom deze sensoren niet selecteerbaar zijn in het nieuwe energy dashboard.
1
2
3
4
| logger: default: warning logs: custom_components.apsystems_ecur: debug |
[ Voor 22% gewijzigd door dooiedodo op 05-08-2021 15:43 ]
1
| 2021-08-05 16:10:58 DEBUG (MainThread) [custom_components.apsystems_ecur] Querying ECU |
[ Voor 50% gewijzigd door Dapdodo op 05-08-2021 16:28 ]
1
| {"ECU": {"AnswerUID": "11009800020001", "timestamp": "2021-08-05 16:39:12"}, "UID1": {"UID": "806000008089", "Online": true, "Type": "QS1", "Frequency": 50.0, "Temperature": 41, "PowerA": 238, "Volt": 229, "PowerB": 182, "PowerC": 246, "PowerD": 183}} |
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
| { "ECU": { "AnswerUID": "11009800020001", "timestamp": "2021-08-05 16:54:12" }, "UID1": { "UID": "806000008089", "Online": true, "Type": "QS1", "Frequency": 50.0, "Temperature": 41, "PowerA": 197, "Volt": 227, "PowerB": 149, "PowerC": 208, "PowerD": 150 }, "UID2": { "UID": "806000007868", "Online": true, "Type": "QS1", "Frequency": 50.0, "Temperature": 41, "PowerA": 149, "Volt": 226, "PowerB": 176, "PowerC": 183, "PowerD": 183 }, "UID3": { "UID": "806000009642", "Online": true, "Type": "QS1", "Frequency": 50.0, "Temperature": 42, "PowerA": 150, "Volt": 224, "PowerB": 151, "PowerC": 154, "PowerD": 152 } } |
[ Voor 54% gewijzigd door adriaanh91 op 05-08-2021 16:55 ]
Apple iPhone 16e LG OLED evo G5 Google Pixel 10 Samsung Galaxy S25 Star Wars: Outlaws Nintendo Switch 2 Apple AirPods Pro (2e generatie) Sony PlayStation 5 Pro
Tweakers is onderdeel van
DPG Media B.V.
Alle rechten voorbehouden - Auteursrecht © 1998 - 2025
•
Hosting door TrueFullstaq