Acties:
  • 0 Henk 'm!

  • WackoH
  • Registratie: November 2012
  • Laatst online: 00:34
En zonder ECU-R werken de omvormers gewoon (de opbrengst wordt alleen niet vastgelegd).
Dus je hoeft niet heel erg te stressen

Acties:
  • 0 Henk 'm!

  • Nibblebit
  • Registratie: December 2020
  • Laatst online: 31-05 07:33

Nibblebit

It's a four-bit aggregation

Termy bedoeld of het Zigbee mesh netwerk ook van toepassing is op de inverters. Dus maw maken de inverters onderdeel uit van het Zigbee mesh netwerk. Zou mi wel moeten, in dat geval loopt het e.e.a. inderdaad via de Philips Hue Zigbee netwerk devices. Ik heb zelf geen idee, geen ervaring met Zigbee. Ik weet wel dat ik via HA mijn Z-wave mesh netwerk in kaart kan brengen waardoor inzichtelijk is welke devices als doorgifte punt fungeren. Zelf heb ik met de ECU-R op diverse plaatsen in huis (2 verdiepingen + bg) gemeten hoe de ontvangst is naar de inverter, daarbij viel het mij op dat de signaal sterkte eigenlijk best goed was.

Acties:
  • 0 Henk 'm!

  • dooiedodo
  • Registratie: November 2005
  • Laatst online: 27-05 07:30
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..
nu helemaal mooi:
vanochtend ecu weer niet bereikbaar, local ssid niet eens zichtbaar. 3 keer gereset, pingen zo goed als geen responses.
Ik dacht.. doe es gek, draai die wifi antenne er eens af. POEF.. alles weer beschikbaar, local SSID werkt weer, ping constant vlotte response (alles onder 10ms). zou het nou echt gewoon rotte antenne zijn?

Acties:
  • 0 Henk 'm!

  • WackoH
  • Registratie: November 2012
  • Laatst online: 00:34
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.
Afbeeldingslocatie: https://tweakers.net/i/iRP2OkEd5reXpP2yoorwPE6uRoM=/800x/filters:strip_exif()/f/image/l3YSt2KvGZInnU9P155XHd8D.png?f=fotoalbum_large
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.

Acties:
  • 0 Henk 'm!

  • WackoH
  • Registratie: November 2012
  • Laatst online: 00:34
Het nummer op de Wifi module wijst naar een FCC goedkeuring uit 2015.
Er zijn inmiddels ook 2 nieuwere versies.
Uit 2018:
Afbeeldingslocatie: https://tweakers.net/i/pBd1Vgc9QWV62WrPtm5wh7cNMhU=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/z4i9z0YjK0KR1kICstrEjZB6.png?f=user_large
En uit 2021 (al is the foto wel erg vergelijkbaar...:
Afbeeldingslocatie: https://tweakers.net/i/HUm7rqBaP5ymjX8sHwuOF1ZhyZc=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/HSborju7tUbGvMPuz01AREDX.png?f=user_large
De links bevatten nog veel meer foto's, ook met details welke chips gebruikt worden.

[ Voor 4% gewijzigd door WackoH op 26-04-2021 11:40 ]


Acties:
  • 0 Henk 'm!

  • BjorntobeWild
  • Registratie: Januari 2005
  • Laatst online: 17-03-2023
Proton_ 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.
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 Pi 8)7 ).

Ik ben alleen nog niet uit stap 1. Hoe je met Wireshark erachter bent gekomen welk commando je moet verzenden naar de ECU om de data te extraheren.
Wat ik begrijp uit eerdere berichten is dat je de ECU op Wifi moet aansluiten (gedaan), bekabeld zit hij dichtgetimmerd.
Als ik dan met Wireshark ga luisteren, zie ik alleen verkeer van af mijn computer als ik het python script draai.
Als iemand dit nog wat verder wilt uitleggen zou ik daar heel blij mee zijn om het helemaal te snappen.

Wat betreft de code hieronder, daarvoor zoek ik nog een manier om een soort van bibliotheek te maken waarin de idx-en worden opgeslagen zodat ik een loop kan maken voor de webUrl. De juiste idx dient dan automatisch te worden ingevuld.

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
#!/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)

Acties:
  • 0 Henk 'm!

  • Dapdodo
  • Registratie: Mei 2019
  • Laatst online: 21:41
@BjorntobeWild , Als je met de ECU installatie app, op de wifi gaat (hotspot status) en dan de commando's van de app volgt richting de ECU, zou je ze tegen moeten komen.

Decoderen is de kracht van de groep tweakers. Ieder met zijn eigen kennis.

[ Voor 23% gewijzigd door Dapdodo op 27-04-2021 11:55 ]


Acties:
  • 0 Henk 'm!

  • Nibblebit
  • Registratie: December 2020
  • Laatst online: 31-05 07:33

Nibblebit

It's a four-bit aggregation

De meest belangrijke gegevens die je in de ECUapp terug ziet hebben we al weten te traceren, je begint dus altijd met het ophalen van je ECU-ID en vervolgens kun je daarmee overige commando's geven. Gebruik geen random commando's want er zijn er ook waarmee je instellingen wijzigt en dan kan je jezelf voor de 8)7 . Voor de toekomst is het leuk als we ook de historische data eens gebruiken. Hieronder de protocol sheets als samenvatting. Inmiddels weet ik dat de commando's ook werken voor de ECU-C. Afbeeldingslocatie: https://tweakers.net/i/C2UWgBC2ZAsCnOO2QQo8PlCdw30=/800x/filters:strip_icc():strip_exif()/f/image/Iv3qMsKxIKvmXcYJCZ5bq5T9.jpg?f=fotoalbum_largeAfbeeldingslocatie: https://tweakers.net/i/RDzNtg_fXsRSw3z9VqLqcFqV3TI=/800x/filters:strip_icc():strip_exif()/f/image/JmX6mg7CRO3hZf86oke6XL62.jpg?f=fotoalbum_large

[ Voor 16% gewijzigd door Nibblebit op 28-04-2021 17:32 ]


Acties:
  • 0 Henk 'm!

  • BjorntobeWild
  • Registratie: Januari 2005
  • Laatst online: 17-03-2023
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?
Afbeeldingslocatie: https://tweakers.net/i/4oV3pTrUTajSImf5R3Ts9xZMNDE=/800x/filters:strip_icc():strip_exif()/f/image/A8bWj4O0h2KYrW3jcbFJy1uP.jpg?f=fotoalbum_large

Acties:
  • 0 Henk 'm!

  • dooiedodo
  • Registratie: November 2005
  • Laatst online: 27-05 07:30
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]
Dit is domoticz? Geen idee hoe die dag/maand tellers beheerd. Zou idd net iets anders moeten zijn dan P1 poort data.

Acties:
  • 0 Henk 'm!

  • dooiedodo
  • Registratie: November 2005
  • Laatst online: 27-05 07:30
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.
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.

Acties:
  • 0 Henk 'm!

  • WackoH
  • Registratie: November 2012
  • Laatst online: 00:34
Het leek me ook niet handig om het kastje open te maken (garantie...). Vandaar dat ik die foto's heb gepost waarop je kunt zien dat de antennen weliswaar op de printplaat is vastgesoldeerd (ik had ze bewaard) . Maar het signaal komt via (coax?) kabeltje er naar toe. Dus de connector met schroefdraad voor de antenne lijkt alleen voor een mechanische bevestiging (tenzij de mantel niet in het stekkertje maar via de antennebevestiging met nul/min verbonden is; maar dat is niet logisch).

Zat de antenne gewoon te los erop geschroefd en maakte slecht contact?

Acties:
  • +1 Henk 'm!

  • dooiedodo
  • Registratie: November 2005
  • Laatst online: 27-05 07:30
heb wel eens eerder beter proberen aan te draaien , dat hielp toen niet. Zal wel slecht contact binnen in zijn, antenne zelf of de aansluiting

Acties:
  • 0 Henk 'm!

  • Nibblebit
  • Registratie: December 2020
  • Laatst online: 31-05 07:33

Nibblebit

It's a four-bit aggregation

Binnenin zit het antenne kabeltje op een uFL connector gedrukt. Zo te zien wordt dat vastgehouden met een klodder thermische lijm maar ik weet niet of dat de-facto standaard is. Misschien dat die toch is losgeschoten en deze kan je er weer eenvoudig op drukken.

Acties:
  • 0 Henk 'm!

  • Nibblebit
  • Registratie: December 2020
  • Laatst online: 31-05 07:33

Nibblebit

It's a four-bit aggregation

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

[ Voor 12% gewijzigd door Nibblebit op 11-05-2021 21:56 . Reden: Hyperlink toegevoegd ]


Acties:
  • +1 Henk 'm!

  • banaliteit
  • Registratie: December 2012
  • Laatst online: 22:34
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
Link? Kan het niet terugvinden.

Acties:
  • 0 Henk 'm!

  • tryingtohack
  • Registratie: September 2018
  • Laatst online: 31-05 11:41
Hoi,

Ik ben op zoek naar meer informatie over mogelijke onderhoudsberichten. Heb al op allerlei forums gezocht en ik heb al wat stukjes van de puzzel kunnen vinden.

Wat ik in ieder geval begrijp:

1. je kan inverters uit/aan zetten (APS??)
2. je kan de ECU in service mode zetten (APS1100320053)
3. je kan configuratie & gegevens (b.v. firmware level) van de inverters uitlezen (APS??)
4. je kan inverters "factory" resetten (APS??)
5 ...

Iemand die hier meer van weet en eventueel bereid zou zijn het bijbehorende zigbee pakketten te sniffen voor verder onderzoek? (sniffen is makkelijk en kan er mee helpen)

Alvast dank voor een reactie op mijn off-topic berichtje >:)

Acties:
  • +2 Henk 'm!

  • DP Kunst
  • Registratie: Juni 2003
  • Laatst online: 29-05 16:20
Interessant topic! Ik ben er 2 jaar geleden ook eens mee bezig geweest om te kijken of ik data uit de ECU-R kon trekken. Destijds ben ik naar de hardware kant gaan kijken, er zit een footprint op het bordje voor een 3 pins header, dat is een UART. Die kon ik uitlezen en daar kwamen ook wat dingen overheen die ik liever niet zag (plane text FTP inlog voor een full controll account op de firmware update server 8)7 ). Dit is later helemaal dichtgegooid, dus daar kun je helaas niets meer zien. Duurde even voordat die patch doorkwam, blijkbaar gaat de ECU-R eerst zoeken naar een connectie met de FTP en daarna pas een keer opzoek naar een WiFi verbinding... |:(

Anyways, ik zag dat de datavraag vooral vanuit de ECU-R geinitieerd werd, de panelen antwoorden dan wel (of niet als ze geen prik meer hebben). De data die eruit kwam kon ik echter nog niet zo herlijden naar bruikbare informatie.

Ik kon de ECU-R ook nog via een webinterface benaderen, daar zat nog iets in van serial over wifi, maar helaas is mijn ECU-R het al aan het begeven. Eens in de week een reboot nodig omdat ie dan geen data meer verstuurd. Als het goed is wordt er een vervanger gestuurd. Zal dan eens kijken of ik mee kan sniffen aan het zigbee signaal.

Afbeeldingslocatie: https://tweakers.net/fotoalbum/image/CQuy78DvZkzUzDPQ36LDCNmJ.jpg
Dit is btw hoe mijn ECU-R er van binnen uit ziet. Grappig om te zien dat die toch weer compleet anders is dan foto's die ik hier voorbij zie komen. Zo maakt mijn wifi gebruik van een plakantenne in de behuizing. Het is een V1.0.5 uit begin 2018.

Mijn nieuwe portfolio (Under Construction) | Benieuwd wat Solar Team Twente gaat doen?


Acties:
  • 0 Henk 'm!

  • m_rick
  • Registratie: Juli 2019
  • Laatst online: 26-05 21:24
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?

Acties:
  • 0 Henk 'm!

  • Dapdodo
  • Registratie: Mei 2019
  • Laatst online: 21:41
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?
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.

Acties:
  • 0 Henk 'm!

  • dooiedodo
  • Registratie: November 2005
  • Laatst online: 27-05 07:30
Dapdodo 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.
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 krijgen

Acties:
  • 0 Henk 'm!

  • tryingtohack
  • Registratie: September 2018
  • Laatst online: 31-05 11:41
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).

Acties:
  • 0 Henk 'm!

  • dooiedodo
  • Registratie: November 2005
  • Laatst online: 27-05 07:30
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).
Zie, ff dak op stickertje zoeken makkelijker 😀

Acties:
  • 0 Henk 'm!

  • m_rick
  • Registratie: Juli 2019
  • Laatst online: 26-05 21:24
dooiedodo schreef op zondag 13 juni 2021 @ 19:04:
[...]

Zie, ff dak op stickertje zoeken makkelijker 😀
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 schroeven ;)

Acties:
  • 0 Henk 'm!

  • Scatman_II
  • Registratie: December 2001
  • Laatst online: 23:34

Scatman_II

R9500 Pro >:)

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?

OC / CM - Begint eer ge Bezint


Acties:
  • 0 Henk 'm!

  • Dapdodo
  • Registratie: Mei 2019
  • Laatst online: 21:41
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?
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.

[ Voor 9% gewijzigd door Dapdodo op 27-06-2021 12:15 ]


Acties:
  • 0 Henk 'm!

  • Scatman_II
  • Registratie: December 2001
  • Laatst online: 23:34

Scatman_II

R9500 Pro >:)

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.
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 geupdate :o Yess!

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!

OC / CM - Begint eer ge Bezint


Acties:
  • +1 Henk 'm!

  • dooiedodo
  • Registratie: November 2005
  • Laatst online: 27-05 07:30
Scatman_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 geupdate :o Yess!

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!
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 ook

Acties:
  • 0 Henk 'm!

  • krizzziz
  • Registratie: December 2001
  • Laatst online: 28-05 13:14
Naar eigen zeggen van de developer zou deze HACS Addon voor HA (https://github.com/bgbraga/homeassistant-apsystems)ook het gewenste resultaat moeten opleveren.
Deze Haddon scraped dus data van de apsystemsema.com website.

Add-on geïnstalleerd en configuration.yaml aangepast. Maar volgen mij mis ik wat, want ik zie geen devices of entiteiten opduiken. Misschien iemand anders hier die een poging wil wagen?

ehhhh..HOI


Acties:
  • 0 Henk 'm!

  • dooiedodo
  • Registratie: November 2005
  • Laatst online: 27-05 07:30
In logs ha zou genoeg moeten staan aan errors als het niet werkt.
API Integratie als die , kan elk moment falen btw. Solar edge is niet van plan de Apis gratis te houden. Ben meer dan tevreden over lokale integratie

Acties:
  • +1 Henk 'm!

  • Nibblebit
  • Registratie: December 2020
  • Laatst online: 31-05 07:33

Nibblebit

It's a four-bit aggregation

De lokale versie is bijgewerkt met compatibiliteit voor de QS1A. https://github.com/ksheumaker/homeassistant-apsystems_ecur

Acties:
  • 0 Henk 'm!

  • avanthof
  • Registratie: Juli 2015
  • Laatst online: 09-02 09:50
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"APS12011200012162000xxxxx\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": "2162000xxxxx", "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?

Acties:
  • 0 Henk 'm!

  • dooiedodo
  • Registratie: November 2005
  • Laatst online: 27-05 07:30
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?
Tja.. ECU r pro geeft me vaag een hint van andere software. Wat geeft ECU app aan data terug als je die gebruikt?
Not active wil niet zeggen dat ze niet geregistreerd zijn, maar eigen alleen niet data/power leveren.

Acties:
  • 0 Henk 'm!

  • avanthof
  • Registratie: Juli 2015
  • Laatst online: 09-02 09:50
Daar zijn ze gewoon volledig geregistreerd. Vijf omvormers overdeeld over 18 panelen (4x QS1 en 1x YC600)

Acties:
  • 0 Henk 'm!

  • avanthof
  • Registratie: Juli 2015
  • Laatst online: 09-02 09:50
Ik kan ook met telnet inloggen. Iemand mss ooit het password achterhaald?
Arago Project http://arago-project.org APS-ECU

Arago 2013.05 APS-ECU


APS-ECU login: root
Password:

Acties:
  • 0 Henk 'm!

  • dooiedodo
  • Registratie: November 2005
  • Laatst online: 27-05 07:30
Telnet op welke poort? Das in principe niet 1 die bestaat voor 'normale ' ECU


Kan je screenshot posten van ecu app? Van hoofd scherm en panelen scherm ?

Acties:
  • 0 Henk 'm!

  • Dapdodo
  • Registratie: Mei 2019
  • Laatst online: 21:41
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)
script is nooit aangepast en vooral niet getest voor QS1.
En wanneer heb je het script gedraaid? Als er geen zon is klopt de melding.
En er lijken aan maxUID te zien 5 geregistreerd. En dat klopt met wat je meldt.

Acties:
  • 0 Henk 'm!

  • avanthof
  • Registratie: Juli 2015
  • Laatst online: 09-02 09:50
--deleted

[ Voor 98% gewijzigd door avanthof op 30-07-2021 21:38 ]


Acties:
  • 0 Henk 'm!

  • avanthof
  • Registratie: Juli 2015
  • Laatst online: 09-02 09:50
Het is een ECU-R-EU volgens de achterkant.

Acties:
  • 0 Henk 'm!

  • dooiedodo
  • Registratie: November 2005
  • Laatst online: 27-05 07:30
Zou gewoon de ha integratie proberen. Communicatie werkt, zou zomaar eens kunnen werken

Acties:
  • 0 Henk 'm!

  • avanthof
  • Registratie: Juli 2015
  • Laatst online: 09-02 09:50
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

Acties:
  • 0 Henk 'm!

  • dooiedodo
  • Registratie: November 2005
  • Laatst online: 27-05 07:30
Das wel meer indicatie dat er andere software op staat. Die webpage was geen feature. Wat staat er op die pagina?

Acties:
  • 0 Henk 'm!

  • avanthof
  • Registratie: Juli 2015
  • Laatst online: 09-02 09:50
Achter op staat ECU-R-EU Article No. 209018 Certificate/Checker/Date: 2021.2.24 Maar de website is niet af en Home button doet het niet. Weet ook niet waar ik eventueel andere firmware vandaan zou kunnen halen.

Acties:
  • 0 Henk 'm!

  • Dapdodo
  • Registratie: Mei 2019
  • Laatst online: 21:41
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
Dat is de data in de testroutine ook. Die is ook 5 min. het interval waarmee die naar de website logt.
Zo te zien is de record lengte van main records anders, daarom zal die het format van de 5 micro inverters wel niet herkennen. Het tweede print statement zou dan aangezet moeten worden en geanalyseerd wat waar staat. Maar als die php heeft dan kan die ook een versie maken zoals de voorganger. ScrapECU3data die gebruikt maakt van bs4 in python.
https://github.com/daanvd...blob/main/ecu2pvoutput.py was mijn voorbeeld.

[ Voor 30% gewijzigd door Dapdodo op 28-07-2021 08:00 ]


Acties:
  • 0 Henk 'm!

  • avanthof
  • Registratie: Juli 2015
  • Laatst online: 09-02 09:50
Hoe zou ik die mainrecord kunnen zien en aanpassen? Welke print statement bedoel je?

Acties:
  • 0 Henk 'm!

  • dooiedodo
  • Registratie: November 2005
  • Laatst online: 27-05 07:30
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
had je trouwens bruikbare log van deze actie? die cpu zou bijna niet van 1 integratie moeten komen en al helemaal niet continue

Acties:
  • 0 Henk 'm!

  • Dapdodo
  • Registratie: Mei 2019
  • Laatst online: 21:41
avanthof schreef op woensdag 28 juli 2021 @ 09:17:
Hoe zou ik die mainrecord kunnen zien en aanpassen? Welke print statement bedoel je?
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.

Acties:
  • 0 Henk 'm!

  • avanthof
  • Registratie: Juli 2015
  • Laatst online: 09-02 09:50
Hierbij het resultaat:

{'ECU': {'Answer': '12', 'DataLength': '0116', 'Command': '0001', 'ID': '2162000xxxxx', 'InvertersOnline': '01', 'Lifetime': 95.6, 'CurrentDCPower': 6.63, 'Today': 12.33, 'RegisteredUID': 5, 'OnlineUID': 5, 'VLEN': 15, 'Version': 'ECU_R_PRO_2.0.0', 'TLEN': 16, 'TimeZone': 'Europe/Amsterdam'}}

Asking for UID numbers and data: 0
b''


b''
{
"ECU": {
"Answer": "12",
"DataLength": "0116",
"Command": "0001",
"ID": "2162000xxxxx",
"InvertersOnline": "01",
"Lifetime": 95.6,
"CurrentDCPower": 6.63,
"Today": 12.33,
"RegisteredUID": 5,
"OnlineUID": 5,
"VLEN": 15,
"Version": "ECU_R_PRO_2.0.0",
"TLEN": 16,
"TimeZone": "Europe/Amsterdam",
"timestamp": "2021-07-30 14:22:49"
},
"Error": "No inverters active"
}

Acties:
  • 0 Henk 'm!

  • Dapdodo
  • Registratie: Mei 2019
  • Laatst online: 21:41
regel 23 moet 1 of 2 langer worden dus 12 wordt 13 of 14.
want de 0 staat niet achter ID, is er 1 tekort.

Anders myECUID op 107 vervangen door het nummer 216200007156
Dan kijken wat die antwoord
Je kunt je nummer ook uit de app halen en in 107 zetten.
Als dat niet klopt moeten de sniffers aan het werk. Want dan zou commando niet kloppen.

[ Voor 29% gewijzigd door Dapdodo op 30-07-2021 15:39 ]


Acties:
  • 0 Henk 'm!

  • avanthof
  • Registratie: Juli 2015
  • Laatst online: 09-02 09:50
Ik denk dat myECUUD is wel goed, die klopt in ieder geval. Denk meer dat de eerste deel het ECU_R, 'APSXXXX' niet goed is op regel 107, of zie ik dat verkeerd? Wat zou dat moeten zijn?

Heb al ECU_R = 'APS1201160002'+myECUID+"END" geprobeerd, zonder resultaat.

Acties:
  • 0 Henk 'm!

  • Dapdodo
  • Registratie: Mei 2019
  • Laatst online: 21:41
12 11 is commando
0028 is stringlengte van commando zonder END, dacht ik. check even met mijn ECU in aantallen.
die 0002 zou misschien zonder die 2 moeten, daar wel al mee lopen sukkelen in begin.
en ook nog geen betekenis kunnen vinden.

Acties:
  • 0 Henk 'm!

  • dooiedodo
  • Registratie: November 2005
  • Laatst online: 27-05 07:30
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.
Hey, die regel 115 (print(ECU_Rreceive)) zou toch de hele receive buffer moeten printen in hex?

avanthof
avanthof schreef op vrijdag 30 juli 2021 @ 14:24:
Hierbij het resultaat:
Asking for UID numbers and data: 0
b''
0 /b is behoorlijk leeg, had met avanthof even versimpeld script gedaan en die gaf wel restult
---------
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?

[ Voor 100% gewijzigd door dooiedodo op 02-08-2021 18:00 ]


Acties:
  • 0 Henk 'm!

  • Dapdodo
  • Registratie: Mei 2019
  • Laatst online: 21:41
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?
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.

Acties:
  • 0 Henk 'm!

  • dooiedodo
  • Registratie: November 2005
  • Laatst online: 27-05 07:30
Dapdodo 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.
Antwoord was fatsoenlijk, inverter IDs en channel data , timestamp etc
Dat script van jouw beetje om te katten naar 1 request? Heb niet helemaal zicht op welke dingen van elkaar afhankelijk zijn in het geheel.

Acties:
  • 0 Henk 'm!

  • avanthof
  • Registratie: Juli 2015
  • Laatst online: 09-02 09:50
Ik heb het net gecontroleerd en lijkt zeker de snelheid te zijn van de uitvraag. De eerste lijkt de tweede verzoek teniet te doen.

Acties:
  • 0 Henk 'm!

  • dooiedodo
  • Registratie: November 2005
  • Laatst online: 27-05 07:30
dus als je een sleep erin tusssen frunnikt, gaat het beter?

time.sleep(5)

ofzo.
Geeft eventueel wel te denken over stabiliteit van de wifi verbinding. in principe zou dit wel werken in normale setup. Ik zelf had wel met wifi antenne veel ellende en uiteindelijk stabiliteit opgelost door veel te spelen met lokatie van ecu tov wifi access point en het eraf halen van de wifi antenne zelf (van de ecu). Zonder die antenne doet ie het bij mij beter.
Heb je een multi point wifi netwerk? Kan met dit device tegen je werken.

Acties:
  • 0 Henk 'm!

  • avanthof
  • Registratie: Juli 2015
  • Laatst online: 09-02 09:50
Nee dat had ik al geprobeerd ;-) Met time.sleep. Maar ga zo even verder kijken

Acties:
  • +1 Henk 'm!

  • Dapdodo
  • Registratie: Mei 2019
  • Laatst online: 21:41
kill 49 t/m 105 en zet myecuid vast

Acties:
  • 0 Henk 'm!

  • avanthof
  • Registratie: Juli 2015
  • Laatst online: 09-02 09:50
Krijg nu wel wat terug, maar script loop nog ergens op vast. Maar zou wel moeten kloppen.
b'415053313130313432303030323030303100052021080319130640800016311601303101f4007f003f00e4003f00e480100005497601303301f40081003300e200320044004380100005521801303301f40084003d00e1003d0041004180100005570001303301f40083003d00e2003a0040003d80100006610401303301f40082004100e2004000420043454e440a'
Traceback (most recent call last):
File "test6.py", line 133, in <module>
output["ECU"]["AnswerUID"] = APSstr(ECU_Rreceive,3,14)
KeyError: 'ECU'

Acties:
  • 0 Henk 'm!

  • Dapdodo
  • Registratie: Mei 2019
  • Laatst online: 21:41
@avanthof Oeps regel 83 moet terug:
output["ECU"] = {}

[ Voor 20% gewijzigd door Dapdodo op 03-08-2021 20:42 ]


Acties:
  • 0 Henk 'm!

  • avanthof
  • Registratie: Juli 2015
  • Laatst online: 09-02 09:50
Zal het morgenochtend proberen als je online zijn want krijg nu:
Traceback (most recent call last):
File "test6.py", line 217, in <module>
if(output["ECU"]["OnlineUID"]>0):
KeyError: 'OnlineUID'

Acties:
  • 0 Henk 'm!

  • Dapdodo
  • Registratie: Mei 2019
  • Laatst online: 21:41
@avanthof maak er maar if(maxcounter>0):
van.
Dit is nog een restje van verwijderen regels ervoor.

Acties:
  • 0 Henk 'm!

  • avanthof
  • Registratie: Juli 2015
  • Laatst online: 09-02 09:50
Dan krijg ik netjes een output te zien. Dus het werkt wel. Wat gaat er dan fout in HA met apsystemens_ecur?

Acties:
  • +1 Henk 'm!

  • dooiedodo
  • Registratie: November 2005
  • Laatst online: 27-05 07:30
die doet ook altijd 2 requests volgens mij. dus we moeten uitvogelen waarom je ecu geen response geeft bij 2e request.
als je dit werkende script aantal keer achter elkaar draait, blijft hij dan antwoord geven of is er uitval?

Acties:
  • 0 Henk 'm!

  • avanthof
  • Registratie: Juli 2015
  • Laatst online: 09-02 09:50
Ik kan hem gewoon herhaalde uitvoeren zonder problemen. Lijkt dus mss in het eerste verzoek te zitten.

Acties:
  • 0 Henk 'm!

  • Dapdodo
  • Registratie: Mei 2019
  • Laatst online: 21:41
@avanthof Zou je de originele nog eens willen draaien met regel 53: 2048 of 4096. De vraag is wat die nog extra uitstuurd.
Je hebt versie 2.0 en mogelijk is het bericht langer. Als er dan een restje in de buffer blijft zitten, komt dat bij de 2e lees actie eruit. Terwijl wij iets anders verwachten, na een tijdje wachten ziet die wel het commando.

Acties:
  • 0 Henk 'm!

  • avanthof
  • Registratie: Juli 2015
  • Laatst online: 09-02 09:50
Heb het geprobeerd met 1024, 2048 en 4096, allen dezelfde resultaat.

{'ECU': {'Answer': '12', 'DataLength': '0116', 'Command': '0001', 'ID': 'xxxxxxxxxx', 'InvertersOnline': '01', 'Lifetime': 239.9, 'CurrentDCPower': 23.41, 'Today': 16.72, 'RegisteredUID': 5, 'OnlineUID': 5, 'VLEN': 15, 'Version': 'ECU_R_PRO_2.0.0', 'TLEN': 16, 'TimeZone': 'Europe/Amsterdam'}}

Asking for UID numbers and data: 0
b''


b''
{
"ECU": {
"Answer": "12",
"DataLength": "0116",
"Command": "0001",
"ID": "xxxxxxxxxxxxx",
"InvertersOnline": "01",
"Lifetime": 239.9,
"CurrentDCPower": 23.41,
"Today": 16.72,
"RegisteredUID": 5,
"OnlineUID": 5,
"VLEN": 15,
"Version": "ECU_R_PRO_2.0.0",
"TLEN": 16,
"TimeZone": "Europe/Amsterdam",
"timestamp": "2021-08-04 12:35:50"
},
"Error": "No inverters active"

Acties:
  • 0 Henk 'm!

  • dooiedodo
  • Registratie: November 2005
  • Laatst online: 27-05 07:30
wtf.. zou een force close connection misschien helpen

en regel 54-57 uncommenten... kijken wat er aan raw inzit, misschien geeft dat een hint.

Acties:
  • 0 Henk 'm!

  • Dapdodo
  • Registratie: Mei 2019
  • Laatst online: 21:41
@avanthof en uncommenten 101 t/m 103

[ Voor 18% gewijzigd door Dapdodo op 04-08-2021 12:47 ]


Acties:
  • 0 Henk 'm!

  • avanthof
  • Registratie: Juli 2015
  • Laatst online: 09-02 09:50
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.

Acties:
  • 0 Henk 'm!

  • Dapdodo
  • Registratie: Mei 2019
  • Laatst online: 21:41
@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 12% gewijzigd door Dapdodo op 04-08-2021 13:00 ]


Acties:
  • 0 Henk 'm!

  • dooiedodo
  • Registratie: November 2005
  • Laatst online: 27-05 07:30
avanthof 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.
dat zou alleen de eerste response moeten gaan tonen.. was nieuwsgierig of er iets in zat wat een richting van het prbleem zou tonen

Acties:
  • 0 Henk 'm!

  • dooiedodo
  • Registratie: November 2005
  • Laatst online: 27-05 07:30
Dapdodo 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?
https://github.com/ksheum...cur/APSystemsECUR.py#L103

daar ergens.
connectie open.. dan verschilende queries.. zou dus na elke query de close moeten maken lijkt me

Acties:
  • 0 Henk 'm!

  • avanthof
  • Registratie: Juli 2015
  • Laatst online: 09-02 09:50
Zelf even APsystemsECUR.oy aangepast zonder resultaat in HA (na elke connect een close:
async def async_query_ecu(self):
self.reader, self.writer = await asyncio.open_connection(self.ipaddr, self.port)
_LOGGER.info(f"Connected to {self.ipaddr} {self.port}")

cmd = self.ecu_query
self.ecu_raw_data = await self.async_send_read_from_socket(cmd)

self.process_ecu_data()

self.writer.close()
self.reader, self.writer = await asyncio.open_connection(self.ipaddr, self.port)
_LOGGER.info(f"Connected to {self.ipaddr} {self.port}")

cmd = self.inverter_query_prefix + self.ecu_id + self.inverter_query_suffix
self.inverter_raw_data = await self.async_send_read_from_socket(cmd)


self.writer.close()
self.reader, self.writer = await asyncio.open_connection(self.ipaddr, self.port)
_LOGGER.info(f"Connected to {self.ipaddr} {self.port}")

cmd = self.inverter_signal_prefix + self.ecu_id + self.inverter_signal_suffix
self.inverter_raw_signal = await self.async_send_read_from_socket(cmd)

self.writer.close()

data = self.process_inverter_data()
data["ecu_id"] = self.ecu_id
data["today_energy"] = self.today_energy
data["lifetime_energy"] = self.lifetime_energy
data["current_power"] = self.current_power

return(data)

def query_ecu(self):

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((self.ipaddr,self.port))

sock.sendall(self.ecu_query.encode('utf-8'))
self.ecu_raw_data = sock.recv(self.recv_size)

self.process_ecu_data()

sock.shutdown(socket.SHUT_RDWR)
sock.close()
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((self.ipaddr,self.port))

cmd = self.inverter_query_prefix + self.ecu_id + self.inverter_query_suffix
sock.sendall(cmd.encode('utf-8'))
self.inverter_raw_data = sock.recv(self.recv_size)

sock.shutdown(socket.SHUT_RDWR)
sock.close()
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((self.ipaddr,self.port))

cmd = self.inverter_signal_prefix + self.ecu_id + self.inverter_signal_suffix
sock.sendall(cmd.encode('utf-8'))
self.inverter_raw_signal = sock.recv(self.recv_size)

sock.shutdown(socket.SHUT_RDWR)
sock.close()

data = self.process_inverter_data()

data["ecu_id"] = self.ecu_id
data["today_energy"] = self.today_energy
data["lifetime_energy"] = self.lifetime_energy
data["current_power"] = self.current_power


return(data)

Acties:
  • +1 Henk 'm!

  • avanthof
  • Registratie: Juli 2015
  • Laatst online: 09-02 09:50
En wat denken jullie? Heb het werken! Ligt zeker aan verschillende sendcalls. Nu werkt het wel. De code hierboven did the trick.

Acties:
  • 0 Henk 'm!

  • dooiedodo
  • Registratie: November 2005
  • Laatst online: 27-05 07:30
mooi zeg.. las eerst alleen je post dat het niet hielp, 2e post op nieuwe pagina niet gezien. We kunnen dit wel laten reveiwen en mergen door Kyle denk ik.

[ Voor 185% gewijzigd door dooiedodo op 04-08-2021 16:52 ]


Acties:
  • 0 Henk 'm!

  • avanthof
  • Registratie: Juli 2015
  • Laatst online: 09-02 09:50
zou wel top zijn, dan gaat ie wel mee in de eerst volgende HACS update.

Acties:
  • 0 Henk 'm!

  • dooiedodo
  • Registratie: November 2005
  • Laatst online: 27-05 07:30
ik update ha net naar augustus release en de ecu-r gaat stuk :-(
iets met constants VOLT die niet wil

Acties:
  • 0 Henk 'm!

  • Dapdodo
  • Registratie: Mei 2019
  • Laatst online: 21:41
@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.

Acties:
  • 0 Henk 'm!

  • dooiedodo
  • Registratie: November 2005
  • Laatst online: 27-05 07:30
Dapdodo 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.
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 HA

[ Voor 14% gewijzigd door dooiedodo op 04-08-2021 20:33 ]


Acties:
  • 0 Henk 'm!

  • ChristianD
  • Registratie: Oktober 2002
  • Laatst online: 00:11
Eindelijk de plugin werkend gekregen en iedereen die aan de integratie heeft meegewerkt wil ik bedanken _/-\o_

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.

bla di bla bla


Acties:
  • 0 Henk 'm!

  • avanthof
  • Registratie: Juli 2015
  • Laatst online: 09-02 09:50
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.

Acties:
  • 0 Henk 'm!

  • dooiedodo
  • Registratie: November 2005
  • Laatst online: 27-05 07:30
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.
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.

Acties:
  • 0 Henk 'm!

  • dooiedodo
  • Registratie: November 2005
  • Laatst online: 27-05 07:30
ChristianD schreef op donderdag 5 augustus 2021 @ 10:29:
Eindelijk de plugin werkend gekregen en iedereen die aan de integratie heeft meegewerkt wil ik bedanken _/-\o_

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.
https://community.home-as...ters-data-pull/260835/353 8)

Acties:
  • 0 Henk 'm!

  • avanthof
  • Registratie: Juli 2015
  • Laatst online: 09-02 09:50
Lijkt er op dat HA problemen heeft als jij andere info terug krijgt, dat was eerder ook het geval toen de ECU met meerdere queries achter elkaar ook niet de info gaf die HA verwachte. De plugin is nog niet echt robuust opgebouwd en error proof. Wellicht kunnen we de creator hiernaar vragen?

Acties:
  • 0 Henk 'm!

  • dooiedodo
  • Registratie: November 2005
  • Laatst online: 27-05 07:30
dan zal je debug logs moeten brengen. We hebben dit gedrag zelf niet gezien laaste half jaar. dus er is iets ander bij jouw setup wat wij niet hebben. Als je wat heb, post maar op HA topic.

Acties:
  • 0 Henk 'm!

  • adriaanh91
  • Registratie: December 2013
  • Laatst online: 30-05 09:10
Ik heb dezelfde problemen als @avanthof, ook bij een clean install van HA. Welk script kan ik runnen om de output te krijgen die avanthot ook heeft gekregen?

In de debuglogs van Home Assistant staat overigens niets over het falen van de integratie.

Acties:
  • 0 Henk 'm!

  • dooiedodo
  • Registratie: November 2005
  • Laatst online: 27-05 07:30
had je specifiek debug aan gezet in je logger config?

code:
1
2
3
4
logger:
    default: warning
    logs:
        custom_components.apsystems_ecur: debug


anders komt er geen debug info natuurlijk :)


begin langzamerhand het gevoel te krijgen dat APS de integratie tegenwerkt... of zie ik spoken?

[ Voor 22% gewijzigd door dooiedodo op 05-08-2021 15:43 ]


Acties:
  • 0 Henk 'm!

  • adriaanh91
  • Registratie: December 2013
  • Laatst online: 30-05 09:10
Ik heb de logger even tijdelijk op default: debug gezet, dus er was genoeg loginformatie. Maar omdat het zoveel was misschien ook wel teveel. Ik zie nu de volgende regel nog staan, daarna geen informatie van deze component. De front-end reageert overigens verder niet.

code:
1
2021-08-05 16:10:58 DEBUG (MainThread) [custom_components.apsystems_ecur] Querying ECU


Ik zie ook dat de memory van mijn virtuele machine helemaal opblaast, dus ik denk dat die in bovenstaande blijft hangen. Enig idee hoe ik de output van de ECU kan bekijken, zoals anderen in deze thread ook hebben gedaan?

Acties:
  • 0 Henk 'm!

  • avanthof
  • Registratie: Juli 2015
  • Laatst online: 09-02 09:50
Adriaan,

Probeer eens:
import socket
import binascii
import json
import sys
import datetime

myIPadress = "192.168.1.15"
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_R = 'APS1100280002XXXXXXXXXXXEND'
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):
if(maxcounter>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.

Je moet dan even in regel 108 even je eigen ECU ID opvoeren ipv XXXXXXXX.

Acties:
  • 0 Henk 'm!

  • adriaanh91
  • Registratie: December 2013
  • Laatst online: 30-05 09:10
In een lokale python omgeving?

Acties:
  • 0 Henk 'm!

  • Dapdodo
  • Registratie: Mei 2019
  • Laatst online: 21:41
en eigen ip bovenaan
Dat kan inderdaad met thonny op pi of pc.

[ Voor 50% gewijzigd door Dapdodo op 05-08-2021 16:28 ]


Acties:
  • +1 Henk 'm!

  • adriaanh91
  • Registratie: December 2013
  • Laatst online: 30-05 09:10
Ok, ik krijg heel veel output, maar het is allemaal hetzelfde. Lijkt er ook op dat die maar 1 van de omvormers pakt (ik heb er 3). Ook blijft het oneindig doorgaan. Misschien zit daar ook gelijk het probleem?

code:
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}}


Edit: In minder dan 1 seconde schrijft die ~150k regels weg met dezelfde tekst (ook hetzelfde answerID)

Edit2: Foutje in de indent van het script (was ook lastig ;-)). Na wat zaken goed te zetten krijg ik de volgende output:

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
{
  "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 ]


Acties:
  • 0 Henk 'm!

  • adriaanh91
  • Registratie: December 2013
  • Laatst online: 30-05 09:10
For future reference, the Python script: https://pastebin.com/bHw0pGcb

Acties:
  • 0 Henk 'm!

  • Dapdodo
  • Registratie: Mei 2019
  • Laatst online: 21:41
Dit is wat ik verwacht, nu nog het HA spul weer goed krijgen. Maar dat is meer @dooiedodo zijn ding.

Acties:
  • 0 Henk 'm!

  • adriaanh91
  • Registratie: December 2013
  • Laatst online: 30-05 09:10
Ik heb wel een idee. Zie mijn reactie om 20:05 op https://github.com/ksheum...-apsystems_ecur/issues/16

Acties:
  • 0 Henk 'm!

  • adriaanh91
  • Registratie: December 2013
  • Laatst online: 30-05 09:10
E.e.a. gefixt en een pull request voor aangemaakt

Acties:
  • 0 Henk 'm!

  • dooiedodo
  • Registratie: November 2005
  • Laatst online: 27-05 07:30
Lekker bezig man.. keep it up

Acties:
  • 0 Henk 'm!

  • avanthof
  • Registratie: Juli 2015
  • Laatst online: 09-02 09:50
Juig niet te hard. Want het werkte even voor mij en vandaag worstel wederom om HA met de integratie werkend te krijgen. Laatste en enige melding na start found a custom integration melding:
2021-08-05 22:45:40 INFO (MainThread) [custom_components.apsystems_ecur.APSystemsECUR] Connected to 192.168.1.15 8899
En dan systeem hassio 100% belast.

Aanpassingen gedaan (VOLT naar ELECTRIC_POTENTIAL_VOLT) zonder resultaat
Pagina: 1 ... 4 ... 12 Laatste