Cookies op Tweakers

Tweakers is onderdeel van DPG Media en maakt gebruik van cookies, JavaScript en vergelijkbare technologie om je onder andere een optimale gebruikerservaring te bieden. Ook kan Tweakers hierdoor het gedrag van bezoekers vastleggen en analyseren. Door gebruik te maken van deze website, of door op 'Cookies accepteren' te klikken, geef je toestemming voor het gebruik van cookies. Wil je meer informatie over cookies en hoe ze worden gebruikt? Bekijk dan ons cookiebeleid.

Meer informatie
Toon posts:

GoodWe inverter lokaal uitlezen (USB / WiFi)

Pagina: 1 2 3 4 Laatste
Acties:

Onderwerpen


Acties:
  • 0Henk 'm!

  • msatter
  • Registratie: maart 2021
  • Niet online
wlmpie schreef op woensdag 5 mei 2021 @ 16:35:
Begrijp ik nou goed dat het script van @msatter een goodwe xs omvormer lokaal kan uitlezen via de wifi? Mits je firmware eindigt op 13 of hoger? En dan hoef je dus niet te gaan klooien met RS485 of modbus?

Nou nog uitvinden hoe je die data dan in domoticz krijgt.
Ik denk dat het script op meer omvormers van Goodwe zal werken en het is kwestie van uitproberen. Een goede test is het proberen met de APP SolarGo van Goodwe. Als die werkt dan zal het script ook werken.

Hou er wel rekening mee dat Wifi niet de stabielste verbinding is met de Goodwe en niet altijd krijg je een antwoord.

Het is ook een proof-of-concept dat het kan en zijn vast mooiere oplossing hiervoor nu dit mogelijk is.

Thinkpad leest het via Red Node uit en er zijn vast nog tig andere manieren om dit te doen.

[Voor 12% gewijzigd door msatter op 05-05-2021 16:43]


Acties:
  • 0Henk 'm!

  • Aiolos
  • Registratie: januari 2002
  • Laatst online: 15:11
msatter schreef op woensdag 5 mei 2021 @ 16:28:
Aiolos wil vast wel voor mij testen als ik ook twee of meer omvormers in één keer ga uitlezen en ieders zijn eigen directory krijgen.
Zeker, geen probleem. Mogelijk ga ik ook nog met je script aan de gang om het zonder sfk te doen, omdat dat geen standaard-tool is onder linux.
Wat is het probleem met de SSID?
Ik denk iets met niet kunnen wijzigen van het ssid, of als je dat doet, dat dan 's ochtends het oude ssid weer teruggezet is.

Stuur me een PM voor Wemos D1 shields voor het uitlezen van slimme meters of het aansturen van Itho mechanische ventilatie (of kijk op V&A: https://tweakers.net/aanbod/user/47321/)


Acties:
  • 0Henk 'm!

  • msatter
  • Registratie: maart 2021
  • Niet online
Ja dat klopt en dat heeft ook een reden volgens mij. Het gaat erom om de omvormer eenduidig te kunnen identificeren en het zal wel hard in de firmware staan.

Ik had zonder dat ik wist een korte SSID en dan zonder serienummer en na een herstart van de omvormer was die weer terug. Elke nacht gaat de omvormer uit en in de ochtend overschrijft die dan weer de aangepaste SSID. Als je een accupack had dan zou de omvormer niet uitgaan en ook de aangepaste SSID zou blijven. De XS heeft geen mogelijkheid om en accupack gebruiken of je moet zelf een constructie maken aan de DC kant.

Voor de installateurs is een vaste SSID wenselijk want hier in de straat hangen er een aantal en dan lijst aan SSID om jouw keuze uit te maken.

Zelf wil ik er een netwerkkabel aan hangen i.p.v WiFi en de module kan ik zo bestellen alleen de kabel naar zolder brengen is een grotere uitdaging. Kan natuurlijk netwerk over de stroomkabel gaan doen.

Acties:
  • 0Henk 'm!

  • wlmpie
  • Registratie: oktober 2007
  • Laatst online: 24-06 20:35
msatter schreef op woensdag 5 mei 2021 @ 16:41:
[...]

Ik denk dat het script op meer omvormers van Goodwe zal werken en het is kwestie van uitproberen. Een goede test is het proberen met de APP SolarGo van Goodwe. Als die werkt dan zal het script ook werken.
Tja, dat geeft bij mij het resultaat dat de omvormer deze functie niet ondersteunt. Ik ga maar eens experimenteren met SFK en jouw script, kijken of ik daar wat zinnigs uitkrijg. ik heb firmware 1.13.13 op een goodwe 2500XS


Acties:
  • 0Henk 'm!

  • wlmpie
  • Registratie: oktober 2007
  • Laatst online: 24-06 20:35
Ik krijg helaas een timeout als ik poort 8899 met commando's uit het script van msatter onder windows probeer uit te lezen. De goodwe.info gaat wel goed.
code:
1
2
3
4
5
6
[timeout] 174142
1 errors occurred.
[timeout] 174301
1 errors occurred.
[timeout] 174617
1 errors occurred.


blijkbaar toch andere firmware nodig opdat de omvormer iets teruggeeft op poort 8899. Ik wacht de verdere ontwikkelingen eerst wel even af voordat ik Goodwe om andere firmware ga vragen, want voor de rest functioneert mijn omvormer nu prima.

Acties:
  • 0Henk 'm!

  • Q-bone
  • Registratie: juni 2001
  • Laatst online: 14:55

Q-bone

Dusss...

Aiolos schreef op woensdag 5 mei 2021 @ 16:00:
[...]

Als je bedoelt 2 omvormers uitlezen met dit script, ja. Wel met een kleine aanpassing.
Ik lees ze uit via usb, rechtstreeks in de pi met het "oude" script https://github.com/sircuri/GoodWeUSBLogger

Kun je er dan 2 tegelijk uitlezen? Bij mij is het nu 1, en willekeurig aangezien hij kijkt welke er het eerst is.

bla?


Acties:
  • 0Henk 'm!

  • msatter
  • Registratie: maart 2021
  • Niet online
Er kunnen net zoveel uitgelezen als waar je toegang toe hebt. Dit omdat ieders een eigen IP adres heeft.

Als er meer dan een regel gemaakt wordt met ieders het IP adres van een omvormer dan worden er ook meer regels in het log geschreven. Het dan weer noodzakelijk om uit elkaar te houden welke regel bij welke omvormer hoort.

@wlmpie
Dank voor het proberen en jammer dat 13 niet uit te lezen is op deze wijze. Ik dacht uit materiaal van
Goodwe dat het vanaf 13 zou werken.

[Voor 19% gewijzigd door msatter op 05-05-2021 19:50]


Acties:
  • 0Henk 'm!

  • Pinobigbird
  • Registratie: januari 2002
  • Laatst online: 15:08

Pinobigbird

doesn't share food!

Ik heb een 3-fase GW5K-DT, firmware 808.808.06 (dus ARM 06), en deze werkt ook met SolarGo, en dus ook met dit script van @msatter.

Onder Windows ondervind ik wel wat problemen met de bestandsindeling (UCS-2 LE BOM) en andere bestandslocatie-gerelateerde problemen. Als ik het ip-adres en de bestandslocatie er hard inzet werkt het allemaal wel, bijv
./sfk.exe cudp 192.168.1.11 8899 -listen -noerror -timeout=500 0x7f0375940049d5c2 -pure +xed "/[eol]//" +time " hms" >> ./2021/20210505.log
Ik krijg dan netjes de output in het bestand, dat ik dan met de andere comando's kan uitlezen.

Maar... de waarden kloppen helemaal niet. Ik weet bijna zeker dat dit komt doordat ik een 3-fase-omvormer heb, en het script geschreven is voor een 1-fase-omvormer.
@msatter Als je wil kan ik de output wel delen. Ik kan er zelf geen chocola van maken hoe ik de parameters uit de output kan extraheren.

Joey: Nice try. See the Netherlands is this make believe place where Peter Pan and Tinkerbell come from.
https://kattenoppasleiderdorp.nl
PV: 3080Wp ZO + 3465Wp NW = 6545Wp totaal 13°tilt


Acties:
  • 0Henk 'm!

  • msatter
  • Registratie: maart 2021
  • Niet online
Hieronder een aangepast script en het is een gok waar de fase waardes staan.

Bash:
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
#!/usr/bin/env bash

# scripter: msatter (name in the forum of tweakers.net)

# Version 1.65-20210507
# Only for non-commericial use

# Read the production of a Goodwe inverter and the retrieved data can be stored in a log file. At the end of the stored line time of retrieval.
# The name of the log file is the date in YYMMDD format and is this way unique. Each retrieved hex string has it's own line with a timestamp at the end.
# To retrieve data through IP needs a ARM firmware of 13 or higher. The last part of my firmware is stating for ARM "1.51.14" so 14 number for the ARM.

# This script needs SFK to run (http://www.stahlworks.com/dev/swiss-file-knife.html) 

# to-do: config file for storing the location logfile and cron.

sfk echo ""
sfk echo "Show the last collect data from Goodwe inverter"
sfk echo "" 
sfk echo "Do broadcast to find the Goodwe inverter:"
sfk cudp -broad 255.255.255.255 48899 -listen -noerror -timeout=500 0x574946494b49542d3231343032382d52454144 -flat > goodwe.info
sfk echo -pure "  SSID: " +xfind goodwe.info "/**,**,//"
sfk echo -pure "  MAC no.: " +then +xex goodwe.info "/,**,/[part2]/" +echo ""
sfk echo -pure "  IP addr: " +xfind goodwe.info "/,**//"

# Serialnumber and firmware version of the inverter
sfk xfind goodwe.info "/,**//" +setvar ipa +cudp -var "#(ipa)" 8899 -listen -noerror -timeout=1500 0x7f03753100280409 -pure +xed "/[eol]//" +xex "/[start]AA55**/" +tif "rc<>0" begin xed "/[eol]//" +tofile /opt/goodwe/goodwe.inf +endif
sfk echo "" +echo "" +echo "Firmware version:"
sfk sel ./goodwe.inf +hexfile -offlen -32 4 -flat -nofile   +dec +calc "#text*1."  -dig=0  +setvar tmp +if -var "#(tmp) <> 0.0" tell -var -noline "  DSP1: #(tmp) / "
sfk sel ./goodwe.inf +hexfile -offlen -28 4 -flat -nofile   +dec +calc "#text*1."  -dig=0  +setvar tmp +if -var "#(tmp) <> 0.0" tell -var -noline "DSP2: #(tmp) / "
sfk sel ./goodwe.inf +hexfile -offlen -24 4 -flat -nofile   +dec +calc "#text*1."  -dig=0  +setvar tmp +if -var "#(tmp) <> 0.0" tell -var -noline "ARM: #(tmp) "

sfk sel ./goodwe.inf +hexfile -offlen -32 4 -flat -nofile   +dec +calc "#text*1."  -dig=0  +xex "/[1 char][lend]/[part1]/" +setvar tmp +if -var "#(tmp) <> 0.0" tell -var -noline " (#(tmp)."
sfk sel ./goodwe.inf +hexfile -offlen -28 4 -flat -nofile   +dec +calc "#text*1."  -dig=0  +setvar tmp +if -var "#(tmp) <> 0.0" tell -var -noline "#(tmp)."
sfk sel ./goodwe.inf +hexfile -offlen -24 4 -flat -nofile   +dec +calc "#text*1."  -dig=0  +setvar tmp +if -var "#(tmp) <> 0.0" tell -var "#(tmp))"


#sfk xfind goodwe.info "/,**//" +setvar ipa +cudp -var "#(ipa)" 8899 -listen -noerror -timeout=1500 0x7f03753100280409 -flat > goodwe.serno
sfk xed ./goodwe.serno "/[lstart][11 chars]/[part1]/" +xex "/[start][16 chars]/[all]/" +setvar tmp +if -var "#(tmp) <> "" " echo -var "  Serialnumber:  #(tmp) " 

# Show the last sample stored in the log file
echo ""  
sfk sel -since today ./`date +%Y`/*.log +hexfile -offlen -7 6 -flat -nofile +setvar logtime +echo -var "Sampletime: #(logtime)"

sfk sel -since today ./`date +%Y`/*.log +hexfile -offlen -292 4 -flat -nofile   +dec +calc "#text*0.1"  -dig=1  +setvar tmp +if -var "#(tmp) <> 0.0" echo -var "  Vpv:      #(tmp) V "
sfk sel -since today ./`date +%Y`/*.log +hexfile -offlen -284 4 -flat -nofile   +dec +calc "#text*0.1"  -dig=1  +setvar tmp +if -var "#(tmp) <> 0.0" echo -var "  Vpv1:     #(tmp) V "
sfk sel -since today ./`date +%Y`/*.log +hexfile -offlen -288 4 -flat -nofile   +dec +calc "#text*0.1"  -dig=1  +setvar tmp +if -var "#(tmp) <> 0.0" echo -var "  Ipv:      #(tmp) A "
sfk sel -since today ./`date +%Y`/*.log +hexfile -offlen -280 4 -flat -nofile   +dec +calc "#text*0.1"  -dig=1  +setvar tmp +if -var "#(tmp) <> 0.0" echo -var "  Ipv1:     #(tmp) A "
# value FFFF when not available
sfk sel -since today ./`date +%Y`/*.log +hexfile -offlen -244 4 -flat -nofile   +dec +calc "#text*0.1"  -dig=1  +setvar tmp +if -var "#(tmp) <> 6553.5" echo -var     "  Vac:       #(tmp) V "
sfk sel -since today ./`date +%Y`/*.log +hexfile -offlen -240 4 -flat -nofile   +dec +calc "#text*0.1"  -dig=1  +setvar tmp +if -var "#(tmp) <> 6553.5" echo -var     "  Vac2:      #(tmp) V "
sfk sel -since today ./`date +%Y`/*.log +hexfile -offlen -238 4 -flat -nofile   +dec +calc "#text*0.1"  -dig=1  +setvar tmp +if -var "#(tmp) <> 6553.5" echo -var     "  Vac3:      #(tmp) V "

sfk sel -since today ./`date +%Y`/*.log +hexfile -offlen -232 4 -flat -nofile   +dec +calc "#text*0.1"  -dig=1  +setvar vac +if -var "#(vac) <> 6553.5" echo -var     "  Vac:       #(vac) V "

# value FFFF when not available
sfk sel -since today ./`date +%Y`/*.log +hexfile -offlen -220 4 -flat -nofile   +dec +calc "#text*0.1"  -dig=1  +setvar tmp +if -var "#(tmp) <> 6553.5" echo -var     "  Iac:       #(tmp) A "
sfk sel -since today ./`date +%Y`/*.log +hexfile -offlen -216 4 -flat -nofile   +dec +calc "#text*0.1"  -dig=1  +setvar tmp +if -var "#(tmp) <> 6553.5" echo -var     "  Iac2:      #(tmp) A "
sfk sel -since today ./`date +%Y`/*.log +hexfile -offlen -212 4 -flat -nofile   +dec +calc "#text*0.1"  -dig=1  +setvar tmp +if -var "#(tmp) <> 6553.5" echo -var     "  Iac3:      #(tmp) A "
# value FFFF when not available
sfk sel -since today ./`date +%Y`/*.log +hexfile -offlen -208 4 -flat -nofile   +dec +calc "#text*0.01" -dig=2  +setvar tmp +if -var "#(tmp) <> 655.35" echo -var     "  Fac:       #(tmp) Hz "
sfk sel -since today ./`date +%Y`/*.log +hexfile -offlen -204 4 -flat -nofile   +dec +calc "#text*0.01" -dig=2  +setvar tmp +if -var "#(tmp) <> 655.35" echo -var     "  Fac2:      #(tmp) Hz "
sfk sel -since today ./`date +%Y`/*.log +hexfile -offlen -200 4 -flat -nofile   +dec +calc "#text*0.01" -dig=2  +setvar tmp +if -var "#(tmp) <> 655.35" echo -var     "  Fac3:      #(tmp) Hz "


sfk sel -since today ./`date +%Y`/*.log +hexfile -offlen -292 4 -flat -nofile +dec +setvar vpv +sel -since today ./`date +%Y`/*.log +hexfile -offlen -288 4 -flat -nofile +dec +setvar ipv +echo -var "#(vpv)*#(ipv)/100000" +calc "#text" -dig=2 +setvar power +echo -var    "  Power: #(power) kW "
#sfk sel -since today ./`date +%Y`/*.log +hexfile -offlen -232 4 -flat -nofile +dec +setvar vac +sel -since today ./`date +%Y`/*.log +hexfile -offlen -220 4 -flat -nofile +dec +setvar iac +echo -var "#(vac)*#(iac)/100000" +calc "#text" -dig=2 +setvar power +echo -var    "  PowerAC:  #(power) kW "
sfk sel -since today ./`date +%Y`/*.log +hexfile -offlen -140 4 -flat -nofile   +dec +calc "#text*0.1"  -dig=1  +setvar temp +echo -var    "  Temperature:  #(temp) celcius "
sfk sel -since today ./`date +%Y`/*.log +hexfile -offlen -128 4 -flat -nofile   +dec +calc "#text*0.1"  -dig=1  +setvar eday +echo -var    "  Eday:     #(eday) kWh "
sfk sel -since today ./`date +%Y`/*.log +hexfile -offlen -124 8 -flat -nofile   +dec +calc "#text*0.1"  -dig=1  +setvar etotal +echo -var  "  Etotal:   #(etotal) kWh "
sfk sel -since today ./`date +%Y`/*.log +hexfile -offlen -116 8 -flat -nofile   +dec +calc "#text*1.0"  -dig=0  +setvar work +echo -var    "  Totalruntime: #(work) hours "
sfk sel -since today ./`date +%Y`/*.log +hexfile -offlen -16  4 -flat -nofile   +dec +calc "#text*1.0"  -dig=0  +setvar rssi +echo -var    "  WiFi Signal:  #(rssi) %"


Dit is volgende evolutie. Nu er een log bestand gemaakt wordt kan met dit script de laatste opgehaalde gegevens worden weergegeven. Nu kan ook een eventueel tweede String worden weergeven en nog te bevestigen ook drie fase omvormers.

Het heeft wat hoofdbrekers gekost maar het scripts, log en weergave, zou nu zonder fouten moeten werken en ik heb teveel zitten staren op xed/xex die niet bruikbaar bleken. Nu if-then gebruikt en dat maakt het een stuk éénvoudiger.

Hieronder het log-script die naar de logbestanden schrijft. Nu zijn dat nog platte tekst bestanden en de laatste aanpassing dat ik de tijdweergave heb aangepast. De seconden zijn nu vervallen en de kleinste tijdseenheid is nu een minuut.

Bash:
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
#!/usr/bin/env bash
cd /opt/goodwe/

# scripter: msatter (name in the forum of tweakers.net)

# Version 1.6-20210507
# Only for non-commericial use

# Read the production of a Goodwe inverter and the retrieved data can be stored in a log file. At the end of the stored line time of retrieval.
# The name of the log file is the date in YYMMDD format and is this way unique. Each retrieved hex string has it's own line with a timestamp at the end.
# To retrieve data through IP needs a ARM firmware of 13 or higher. The last part of my firmware is stating for ARM "1.51.14" so 14 number for the ARM.

# This script needs SFK to run (http://www.stahlworks.com/dev/swiss-file-knife.html) 

# to-do: Windows support, cron, multiple inverters.

# Compress yesterdays log and delete the log file if the zip exists.
#sfk select *.log -before today +setvar zipname +select *.log -before today +zipto -var "#(zipname).zip" -yes -quiet
#sfk select *.log -before today +setvar zipname +renfile -var "#(zipname)" "#(zipname).old" -yes -quiet

# Check if LOG directory and file exits and if not create them. `date` is valid in linux
sfk ifnotexist .`date +%Y`/*.log begin mkdir `date +%Y` +endif
sfk ifnotexist ./`date +%Y`/`date +%Y%m%d`.log begin touch -force ./`date +%Y`/`date +%Y%m%d`.log +endif

# Sent a broadcast to find the Goodwe inverter
sfk cudp -broad 255.255.255.255 48899 -listen -noerror -timeout=500 0x574946494b49542d3231343032382d52454144 -flat > goodwe.info

sfk xfind goodwe.info "/,**//" +setvar ipa +cudp -var "#(ipa)" 8899 -listen -noerror -timeout=1500 0x7f0375940049d5c2 -pure +xed "/[eol]//" +xex "/[start]AA55**/" +tif "rc<>0" begin xed "/[eol]//" +xex "/[start][306 chars]/[part2]/" +setvar a +time " h:m " +setvar b +echo -var "#(a)#(b)" +append /opt/goodwe/`date +%Y`/`date +%Y%m%d`.log +endif[s][/s]


Update: store-pv.sh schrijft nu altijd 'niets' als geen communicatie is met je omvormer. (20:19)
Update1: beide scripts bijgewerkt en nu wordt het serienummer en de firmware versie weergegeven. In store-pv.sh het schrijven van het logbestand minder afhankelijk gemaakt van Linux. Voor de naamgeving van de directory moet nog steeds voor Windows een andere code gebruikt worden.
Ik heb twee nieuwe bestanden goodwe.serno en goodwe.inf. De .serno bevat de tekst versie en de .inf bevat HEX van benodigde data om het serienummer en de firmware versie te kunnen tonen.

Update 8 mei.
Ik nu verder met SFK en kan al meer doen wat betreft beter scripten. Ik heb nu het tonen van de waardes in een .fsk (script) gezet waardoor variabelen ene bestanden niet tig keer aangeroepen hoeven te worden maar dat no maar één keer hoeft.
Ook zijn nu mijn posities vand waardes meer in lijn met de tabel. De positie is locatie plus de lengte van het veld.

Parameters kunnen nu meegeven worden, wat alles nog efficienter maakt.
Ik vind het niet zo'n gemakkelijk script taal maar met meer ervaring kan ik het beter naar miin hand zetten.

Ik moet nog wat optimaliseren in de code vandaar dat ik nog niet code plaats. Ook ga ik eens kijken of ik de geven naat een pvout account kan zenden.

[Voor 97% gewijzigd door msatter op 08-05-2021 20:48]


  • No13
  • Registratie: januari 2001
  • Laatst online: 14:00

No13

/me was here

Het ticket bij goodwe is gesloten met de melding dat de update doorgevoerd zou zijn. Volgens mij kan ik dat alleen thuis checken? Ben maandag pas weer thuis ;-)
Met sfk kan ik op poort 48899 wel de goodwe.info vullen maar op 8899 krijg ik nog enkel een timeout.

  • ThinkPad
  • Registratie: juni 2005
  • Laatst online: 14:57

ThinkPad

Moderator Duurzame Energie & Domotica
No13 schreef op donderdag 6 mei 2021 @ 19:04:
[...]
maar op 8899 krijg ik nog enkel een timeout.
Dan moet er nog meer geupgrade worden. Mogelijk zijn ze de ARM firmware vergeten. Versienummer kun je volgens mij niet vanaf afstand uitlezen. in de SolarGo onder het kopje 'Parameters' inzien. Maar die SolarGo app werkt alleen binnen je eigen netwerk natuurlijk.

[Voor 17% gewijzigd door ThinkPad op 07-05-2021 17:13]

Gas besparen door CV-tuning | Elektriciteit besparen
Geen vragen via privébericht die ook via het forum kunnen a.u.b.


Acties:
  • +2Henk 'm!
  • Pinned

  • Pinobigbird
  • Registratie: januari 2002
  • Laatst online: 15:08

Pinobigbird

doesn't share food!

Ik heb de volgende waarde uit de response van m'n 3-fase GW5K-DT:
./sfk.exe cudp 192.168.1.11 8899 -listen -noerror -timeout=500 0x7f0375940049d5c2 -pure +xed "/[eol]//"

AA557F03921505070A02290B0B001E0C79001BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FD20FDE0FE10927091C0935001900190019138813851383000006D600010000000000000000000000000000000000000000FFFF0178FFFFFFFF002600000C08000000A800140000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF001017F50C4000000000000002390095000400000031AAD9

Ik kom dan uit op deze waarden:
poslengtehexdecgrootheidwaardeeenheid
14AA 55170Header43605? - vaste waarde
527F127Response type127?- vaste waarde
720333?- vaste waarde
9292146146?- vaste waarde
1121521jaar2021Y
132055maand05M
152077dag07D
1720A10uur10h
192022minuut02m
2122941seconden41S
2340B 0B2827Vdc1282,7V
27400 1E30Idc13,0A
3140C 793193Vdc2319,3V
35400 1B27Idc22,7A
394FF FF65535
434FF FF65535
474FF FF65535
514FF FF65535
554FF FF65535
594FF FF65535
634FF FF65535
674FF FF65535
7140F D24050Vac1-2405,0V
7540F DE4062Vac2-3406,2V
7940F E14065Vac3-1406,5V
83409 272343Vac1234,3V
87409 1C2332Vac2233,2V
91409 352357Vac3235,7V
95400 1925Iac12,5A
99400 1925Iac22,5A
103400 1925Iac32,5A
107413 885000Fac150,00Hz
111413 854997Fac249,97Hz
115413 834995Fac349,95Hz
119400 000
123406 D61750Power1,750kW
127400 011Work modeNormal0: Wait Mode
1: Normal
2: Error
4: Check Mode
131400 000
135400 000
139400 000
143400 000
147400 000
151400 000
155400 000
159400 000
163400 000
167400 000
1714FF FF65535
175401 78376Temperature37,6°C
1794FF FF65535
1834FF FF65535
187400 2638Today generation3,8kWh
191800 00 0C 083080Total generation308,0kWh
199800 00 00 A8168Total hours168h
207400 1420Country safetyHolland(*)
211400 000
215400 000
219400 000
223400 000
2274FF FF65535
2314FF FF65535
2354FF FF65535
2394FF FF65535
2434FF FF65535
2474FF FF65535
2514FF FF65535
2554FF FF65535
259400 1016FunBit16
263417 F56133BusVolt6133
26740C 403136NBusVolt3136
271400 000
275400 000
279400 000
283402 39569569?- vaste waarde
287400 95149149?- vaste waarde
291400 0444?- vaste waarde
295400 000
299400 3149RSSI49%
3032AA D943737CRC-16 Modbus checksum in omgekeerde volgorde

@msatter Ik zie dus wél Power er tussen staan op positie 123, en de timestamp staat in het begin vanaf positie 11 met 2 hex-karakters per decimaal-karakter.

Positie 71 t/m 83 zijn volgens mij de spanningen tussen de drie fasen (iets meer dan 400V), maar dat is een gok.

Verder zie ik de waarden FunBit, BusVolt en NBusVolt terugkomen, die ik ook terugzie in SolarGo > More > Device maintenance > Debugging information.

edit:
Waarden van Total generation en Total hours van 4 naar 8 karakters. Wellicht ook nodig voor Power.

edit:
Laatste 4 cijfers als checksum

edit:
09-05-2021 22:40 Work mode en Country safety, (*) volgens https://github.com/mleten...we/goodwe_inverter.py#L70.

edit:
11-05-2021 18:05 AA55 als header. Checksum toelichting.

[Voor 4% gewijzigd door Pinobigbird op 11-05-2021 18:05]

Joey: Nice try. See the Netherlands is this make believe place where Peter Pan and Tinkerbell come from.
https://kattenoppasleiderdorp.nl
PV: 3080Wp ZO + 3465Wp NW = 6545Wp totaal 13°tilt


Acties:
  • 0Henk 'm!

  • Q-bone
  • Registratie: juni 2001
  • Laatst online: 14:55

Q-bone

Dusss...

msatter schreef op woensdag 5 mei 2021 @ 19:47:
Er kunnen net zoveel uitgelezen als waar je toegang toe hebt. Dit omdat ieders een eigen IP adres heeft.

Als er meer dan een regel gemaakt wordt met ieders het IP adres van een omvormer dan worden er ook meer regels in het log geschreven. Het dan weer noodzakelijk om uit elkaar te houden welke regel bij welke omvormer hoort.
Als je direct via usb aansluit hebben de omvormers nog steeds geen ip, want de omvormers zijn niet aan internet gekoppeld. Of wel, is het mogelijk met de https://github.com/sircuri/GoodWeUSBLogger meedere omvormers tegelijk uit te lezen? :+

bla?


Acties:
  • 0Henk 'm!

  • msatter
  • Registratie: maart 2021
  • Niet online
De Wifi stick dyick heeft twee zijden. De ene is de AP (Access Point) en is voor lokaal gebruik en gebruikt de IP reeks 10.10.100.1-10.10.100.255

De STA (Station) kant kan een eigen IP instellen of die via DHCP verkrijgen. De STA kant is voor verbindingen naar het internet.

De broadcast die ik doe, verwacht één antwoord en vraagt alleen die omvormer uit.

Natuurlijk kan een tweede script een brstand vullen met alle gevonden omvormers en dan kan het scrip ook die extra gevonden omvormers uitvragen.

Acties:
  • 0Henk 'm!

  • msatter
  • Registratie: maart 2021
  • Niet online
Pinobigbird schreef op vrijdag 7 mei 2021 @ 12:42:
Ik heb de volgende waarde uit de response van m'n 3-fase GW5K-DT:
knip
@msatter Ik zie dus wél Power er tussen staan op positie 123, en de timestamp staat in het begin vanaf positie 11 met 2 hex-karakters per decimaal-karakter.

Positie 71 t/m 83 zijn volgens mij de spanningen tussen de drie fasen (iets meer dan 400V), maar dat is een gok.

Verder zie ik de waarden FunBit, BusVolt en NBusVolt terugkomen, die ik ook terugzie in SolarGo > More > Device maintenance > Debugging information.

edit:
Waarden van Total generation en Total hours van 4 naar 8 karakters. Wellicht ook nodig voor Power.
Ik heb het script aangepast aan de hand van jouw tabel en ik ga nog kijken naar de datum en tijd, total generation en hours. Aangepast en zit in het script. Dank hiervoor en ook voor de tabel.

Ik hoor graag of het werkt.


En dan moet ik natuurlijk wel de link plakken... :+

https://gathering.tweakers.net/forum/view_message/67193260

Ik zit nog te denken of de VAC nu 220+ of 380+ volt is. Wie kan mij hier helpen?

[Voor 12% gewijzigd door msatter op 07-05-2021 14:29]


Acties:
  • 0Henk 'm!

  • ThinkPad
  • Registratie: juni 2005
  • Laatst online: 14:57

ThinkPad

Moderator Duurzame Energie & Domotica
@Pinobigbird nice find! Ik zoek zelf eigenlijk nog de 'work mode' (normal/waiting etc). Enig idee waar die in zit?
P.S. Welke tool gebruik jij om te ontcijferen? De laatste 4 tekens is de checksum trouwens. CRC-16 Modbus.

[Voor 15% gewijzigd door ThinkPad op 07-05-2021 16:03]

Gas besparen door CV-tuning | Elektriciteit besparen
Geen vragen via privébericht die ook via het forum kunnen a.u.b.


Acties:
  • +1Henk 'm!

  • jfinkers
  • Registratie: februari 2012
  • Laatst online: 10:48
Hi,

Ik lees dit forum nu met veel interesse mee.
Voor zover ik zie werken de exports nu vooral op de XS en 5K versies.
Ook al iemand die een D-NS versie werkend heeft?
(Zelf heb ik een GW4200D-NS V1.14.13 waar SolarGo helaas (nog) niet mee compatible is.)

Acties:
  • +1Henk 'm!

  • Pinobigbird
  • Registratie: januari 2002
  • Laatst online: 15:08

Pinobigbird

doesn't share food!

ThinkPad schreef op vrijdag 7 mei 2021 @ 15:32:
@Pinobigbird nice find! Ik zoek zelf eigenlijk nog de 'work mode' (normal/waiting etc). Enig idee waar die in zit?
P.S. Welke tool gebruik jij om te ontcijferen? De laatste 4 tekens is de checksum trouwens. CRC-16 Modbus.
Ik heb Excel gebruikt. Zie hier m'n spreadsheet.

Ik vermoed dat positie 207 de work mode is, waarbij waarde 20 dan 'Normal' zou kunnen zijn. Geen idee hoe je die modus zou kunnen switchen om dit te testen. Dan zou ik vóór 06:55u de output moeten capturen om de 'Wait'-status te vinden.

Joey: Nice try. See the Netherlands is this make believe place where Peter Pan and Tinkerbell come from.
https://kattenoppasleiderdorp.nl
PV: 3080Wp ZO + 3465Wp NW = 6545Wp totaal 13°tilt


Acties:
  • 0Henk 'm!

  • ThinkPad
  • Registratie: juni 2005
  • Laatst online: 14:57

ThinkPad

Moderator Duurzame Energie & Domotica
Pinobigbird schreef op vrijdag 7 mei 2021 @ 19:38:
[...]

Ik heb Excel gebruikt. Zie hier m'n spreadsheet.

Ik vermoed dat positie 207 de work mode is, waarbij waarde 20 dan 'Normal' zou kunnen zijn. Geen idee hoe je die modus zou kunnen switchen om dit te testen. Dan zou ik vóór 06:55u de output moeten capturen om de 'Wait'-status te vinden.
Voor zonsopgang capturen kan, óf je kunt de DC-schakelaar even uitzetten. Hij gaat dan bij mij op 'Waiting' (duurt iets van 20 sec, daarna floept hij uit omdat hij geen voeding meer heeft). Als je binnen die 20 sec. de DC weer aanzet dan gaat hij naar 'Checking' en dan schakelt hij weer in en is het weer 'Normal'. Heb geprobeerd om in dat korte window die twee statussen eruit te vissen, maar #207 blijft 20 lijkt het. Nog ff verder zoeken.

Edit: Heb deze sourcecode gevonden waarmee ze hem in Home Assistant uitlezen. Op regel 1277-1404 staan de verschillende sensoren. De cijfers die je daar ziet zijn de offsets. Om het te vertalen naar jouw Excel is het: waardes uit die source +5, x2 en dan +1. Dus in jouw Excel zou het op positie 127 moeten zitten. Hier staan nog de definities vertaald.. Jij hebt '1' in je sheet, wat staat voor 'Normal'. Veld #207 in jouw sheet blijkt de landinstelling te zijn. Niet zo boeiend om uit te lezen.

CC @msatter

[Voor 46% gewijzigd door ThinkPad op 07-05-2021 22:31]

Gas besparen door CV-tuning | Elektriciteit besparen
Geen vragen via privébericht die ook via het forum kunnen a.u.b.


Acties:
  • 0Henk 'm!

  • msatter
  • Registratie: maart 2021
  • Niet online
Van het weekeinde nog weer bezig geweest met het script. Je kunt aangeven je wil zien of wat je wil verbergen en de twee opties zijn, verberg de gelogde gegevens en zo blijft alleen de informatie over de omvormer over. Ook kun vragen om de firmware versie van de omvormer en die wordt niet standaard getoond.

Verder is er nu config file waar je de benodigde informatie in kan zetten en als er een config file aanwezig is dan wordt er geen broadcast gedaan. Dit biedt de mogelijkheid om meer dan één omvormer in de config te zetten en dit moet nog worden gedaan en ik ben nog aan het denken hoe de 'loop' in SFK gaat en er is een "for-next" en "while-end" heb ik nog niet gezien.

Verder zijn FSK scripts naar een eigen bestand verplaatst en zo hou ik een compact start en stuur script over wat het compatible maken naar andere besturingssystemen gemakkelijker maakt.

Als meer omvormers ondersteuning, er is zal ik het script hier plaatsen. Ik zit er ook te denken om te kunnen browsen in het log en bijvoorbeeld pijltje omhoog/omlaag is een minuut. Pijltjes links en rechts is dan uren en page-up en page-down een dag. Handmatig een datum en tijd ingeven mag natuurlijk ook niet ontbreken.

Het loggen is nu stabiel en ik laat hem nu dag en nacht lopen en zodra de omvormer niet meer aan is dan komt er ook niets in het log. Elke dag is rond de 250 KB aan log en na zoveel dagen zippen spaart ruimte.
Ik schrijf op het moment elke minuut naar het log maar dat kan grover en dan is het bestand meteen ook kleiner elke keer.

Update: na veel vastbijten in FSK eindelijk een goede oplossing gevonden om meer dan één inverter uit te lezen en ik kreeg zelf segementation errors.....

Maar goed, nu werkt het en ook netjes. FSK is niet zo gemakkelijk achteraf omdat de juiste syntax niet altijd duidelijk is. Ik heb nu dat er 8 aanwezige inverters uitgelezen kunnen worden met ieders hun eigen IP adres. In het configuratie bestand moet aan het einde het serienummer van de inverter staan en de laatste zes tekens daarvan komt in de directory naam of bestandsnaam te staan. Ik neig momenteel naar in de directory naam.

Nog even netjes afwerken, dan kan ik het hier plaatsen.

Update 2: dat netjes afwerken had meer voeten in de aarde dan ik dacht omdat een verdwaalde " een fout veroorzaakte 20 regels eerder. Nu nog de firmware versie geschikt maken voor meer dan één inverter.
Het test zonder config via een broadcast moet nog gecontroleerd worden of dat nog werkt. Helaas is het grote licht in lucht weg en is de omvormer uit. Morgen kan ik verder met dat.
Het moet voor een gebruiker meteen werken en ook zonder dat eerste een config bestand aangemaakt is.

[Voor 31% gewijzigd door msatter op 12-05-2021 22:36]


Acties:
  • 0Henk 'm!

  • No13
  • Registratie: januari 2001
  • Laatst online: 14:00

No13

/me was here

ThinkPad schreef op donderdag 6 mei 2021 @ 19:29:
[...]

Dan moet er nog meer geupgrade worden. Mogelijk zijn ze de ARM firmware vergeten. Versienummer kun je volgens mij niet vanaf afstand uitlezen. in de SolarGo onder het kopje 'Parameters' inzien. Maar die SolarGo app werkt alleen binnen je eigen netwerk natuurlijk.
Nieuw ticket is gemaakt, ik trof 1.52.09 aan :)

Acties:
  • +1Henk 'm!
  • Pinned

  • Pinobigbird
  • Registratie: januari 2002
  • Laatst online: 15:08

Pinobigbird

doesn't share food!

Ik heb via Wireshark de strings voor Shadow Scan on/off gevonden. Zo zou je de shadow scan alleen aan kunnen zetten op bepaalde tijdstippen waarop je het denkt nodig te hebben.

Shadow scan on:
7f069d8600018c51
Antwoord:
aa557f069d8600018c51

Shadow scan off:
7f069d8600004d91
Antwoord:
aa557f069d8600004d91


Waarbij
blauw = shadow scan adres
rood = waarde aan (1) of uit (0)
groen = omgekeerde CRC-16/MODBUS-checksum. Als ik de checksum bereken op https://www.lammertbies.nl/comm/info/crc-calculation van 7f069d860001 dan is dat [51 8c] i.p.v. [8c 51], en [91 4d] i.p.v. [4d 91]
aa55 is de antwoordheader, telt niet mee voor de checksum


Voorbeeld via sfk Shadow Scan aanzetten:
./sfk.exe cudp 192.168.1.11 8899 -listen -noerror -timeout=1000 0x7f069d8600018c51 -pure

Joey: Nice try. See the Netherlands is this make believe place where Peter Pan and Tinkerbell come from.
https://kattenoppasleiderdorp.nl
PV: 3080Wp ZO + 3465Wp NW = 6545Wp totaal 13°tilt


Acties:
  • 0Henk 'm!

  • msatter
  • Registratie: maart 2021
  • Niet online
No13 schreef op dinsdag 11 mei 2021 @ 14:35:
[...]
Nieuw ticket is gemaakt, ik trof 1.52.09 aan :)
Werkt het nu, of moet je nog naar 1.52.14 bijgewerkt worden?

Update:
Zou niet moeten werken zie ik nu. Je zou nog een keer een ticket zullen moeten aanmaken voor het ARM deel.

[Voor 21% gewijzigd door msatter op 11-05-2021 19:24]


Acties:
  • +1Henk 'm!

  • No13
  • Registratie: januari 2001
  • Laatst online: 14:00

No13

/me was here

msatter schreef op dinsdag 11 mei 2021 @ 19:21:
[...]


Werkt het nu, of moet je nog naar 1.52.14 bijgewerkt worden?

Update:
Zou niet moeten werken zie ik nu. Je zou nog een keer een ticket zullen moeten aanmaken voor het ARM deel.
De 1e update was naar 1.52.09, daar had ik dus nu een ticket voor gemaakt om naar .14 te komen... Ticket gisteren gemaakt dus hoop voor donderdag nog eens te kunnen testen.

  • msatter
  • Registratie: maart 2021
  • Niet online
Bij het gebruik van shadow scan is het verstandig met scan frequentie rekening te houden en als je het seletief gaat gebruiken.



Een XS scant elk uur en zou je het in de ochtend willen gebruiken dan zou je het voor zonsondergang moeten instellen opdat je bij de herstart direct gebruik van kunt maken.

Bron (PDF): https://www.goodwe.com/Pu...20Function%2020191011.pdf

[Voor 8% gewijzigd door msatter op 12-05-2021 22:49]


Acties:
  • +1Henk 'm!

  • ThinkPad
  • Registratie: juni 2005
  • Laatst online: 14:57

ThinkPad

Moderator Duurzame Energie & Domotica
Ik heb mijn Node-RED code ook bijgewerkt. Lees de omvormer elke 10s uit. Merkte dat ik af en toe een incomplete reply kreeg, dus heb gelijk maar een functie ingebouwd die het bericht alleen verwerkt als de berekende CRC overeen komt met de meegestuurde CRC :9 Was nog even puzzelen om de juiste berekenmethode te vinden voor de CRC die Goodwe gebruikt, plus dat de CRC in het bericht is omgedraaid :?

In Node-RED heb ik dit dashboard

Ik haal de timestamp ook uit de reply van de Goodwe en toon deze, zo kan ik zien of ik wel naar recente data zit te kijken.

[Voor 19% gewijzigd door ThinkPad op 13-05-2021 16:40]

Gas besparen door CV-tuning | Elektriciteit besparen
Geen vragen via privébericht die ook via het forum kunnen a.u.b.


Acties:
  • 0Henk 'm!

  • msatter
  • Registratie: maart 2021
  • Niet online
Ik zit op het moment vast....nee, niet in het gevang.

De standaard logging werkt al dagen, maar de zuiver in SFK script werkt niet autonoom via CRON. Ik kan wel handmatig de cron aanroepen uit WebMin maar zelf schrijft hij niet het bestand.

Goed nu heb ik mijn logs maar kan er nog niet doorheen browsen en ik zie hierboven het mooie schermpje van TinkPad en wil vragen of het interessant is omdat uit te breiden met een browse functie.

De directory structuur voor de logbestanden is: /opt/goodwe/CW0451_2021/ en de bestandsnaam is: CW0451_20210514.log

CW0451 is dan de laatste 6 tekens van mijn SSID naam en dus best uniek. Dit maakt het mogelijk om verschillende omvormers uit elkaar te houden als je er meer dan één uitleest. De bestandsnaam heb ik ook voorzien van de 'prefix' opdat bij fouten door de gebruiker bij kopiëren of verplaatsen niet andere bestanden van andere omvormers overschreven worden.

In de directory staat voor elke log dag een eigen bestand met als inhoud op elke regel de complete HEX string uitgelezen van de omvormer plus de het uur en minuten in het formaat " 08:14 " (8 tekens incl spatie).
Het totale aantal tekens op een regel is 314 en een linefeed naar de volgende regel.

code:
1
AA557F039215050E0A2.....8FA85 11:02


Waarom de hele HEX string. Dit omdat ik flexibel wil zijn als er meer strings in de omvormer aanwezig is of dat het een drie fase omvormer is dan is alle informatie aanwezig.

De locatie van de logbestanden kan natuurlijk ook ergens anders zijn zoals op in /var/log/ die ik in een tmpfs omgeving draai i.v.m. slijtage van de SD-kaart.

Update: zo ik ben weer los! Wat het was is nog een raadsel wat mij twee dagen bezig heeft gehouden. In die tijd wel veel andere dingen gedaan aan het script want blijven staren op een probleem gaat het niet doen oplossen. Zoveel scenario's doorlopen, ligt het aan Linux, heb ik wel schrijfrechten, heb ik ergens nog een spatie of een verloren " staan. Noem het op en ik heb nagegaan.

Maar goed het loggen gaat ook voor meer dan één inverter en dan met een prefix voor directory en bestandsnaam. :9B

De scripts nog een keer langslopen met de kennis van nu en debuggen door middel van het script direct aanroepen via SFK ipv via een Linux script.

[Voor 16% gewijzigd door msatter op 14-05-2021 16:55. Reden: aanvulling]


Acties:
  • +1Henk 'm!

  • msatter
  • Registratie: maart 2021
  • Niet online
De scripts in bash en fsk:

Bash script om via de prompt de laatste regel van het log(s) weer te geven, firmware versie of help (-help)

bestandsnaam: show-pv.sh

Bash:
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
#!/usr/bin/env bash

# scripter: msatter (name in the forum of tweakers.net)

# Version 1.68-20210514
# Only for non-commericial use

# exit 1

# Read the production of a Goodwe inverter and the retrieved data can be stored in a log file. At the end of the stored line time of retrieval.
# The name of the log file is the date in YYMMDD format and is this way unique. Each retrieved hex string has it's own line with a timestamp at the end.
# To retrieve data through IP needs a ARM firmware of 14 or higher. The last part of my firmware is stating for ARM "1.51.14" so 14 number for the ARM.

# This script needs SFK to run (http://www.stahlworks.com/dev/swiss-file-knife.html) 

# to-do: cleaning up

values_pv=0
firm_w=0
pvhelp=0
[code][/code]
case $1 in
    "showfirm" )
        firm_w=1 ;;
    "novalues" )
        values_pv=1  ;;
    "-help" )
        pvhelp=1  ;;
esac

case $2 in
    "showfirm" )
        firm_w=1 ;;
    "novalues" )
        values_pv=1  ;;
    "-help" )
        pvhelp=1  ;;
esac

clear 

# Call SFK script to display firmware version of the Inverter 
if [ $pvhelp -eq 1 ]; then sfk script -from=_help pv_scripts.sfk $pvhelp; exit 1; fi


# Call SFK script to display the last status of the Inverter
sfk script -from=pvinfo pv_scripts.sfk 2021 $values_pv $firm_w


FSK script [ http://stahlworks.com/dev/swiss-file-knife.html ]

bestandsnaam: pv_scripts.fsk

Bash:
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
// Free to use when it is for non-commericial use.
// Scripted by msatter (username in the tweakers.net forum)
//
// Different SFK scripts needed to display and log data from Goodwe Inverters
//
// Each +label can been seen as a subroutine and pvinfo calls other subs
// not all is working correctly but I think the current status is good enough
// for release.
// Bug status: does not display invertername for two or more inverters so that line is blank
// pvinfo: does show base information and calls other subs to display more information
// showvalues: shows the latest line written in the log(s)
// pvfirmware: shows the firmware version(s) of the inverters (parameter: showfirm)
// storepv: write the values retrieved from the inverter(s) in the log files
//

+label pvinfo  // last edit: 20210513 supporting one or more inverters

// +echo %1 +setvar year +echo %2 +setvar values_pv +echo %3 +setvar firm_w 
+setvar nr=
// if there is a config file with the name inverter.con the use that instead of the result of a broadcast
+ifexist inverter.conf begin copy inverter.conf goodwe.info -mirror -yes 
+echo "Warning: using config file "inverter.conf" instead of a broadcast on the local network" +echo "" +endif

+for i from 1 to 8

 // retrieve config directly from goodwe.info and if there is nodata then broadcast myself.  
 +filter -var -line=#(i) goodwe.info +xed "/[eol]//" +setvar showline
  +if -var "#(showline) = [timeout]" begin
   +cudp -broad 255.255.255.255 48899 -listen -noerror -timeout=5000 0x574946494b49542d3231343032382d52454144 -flat +xed "/[eol]//" +tofile goodwe.info
   +filter -var -line=#(i) goodwe.info +xed "/[eol]//" +setvar showline
  +endif
  +if -var "#(showline) = [timeout]" echo -var "Warning: the inverter did not answer to the broadcast within 5 seconds. Got a #(showline). Retry at a later time." +endif
 
 +setvar ipa=
 +echo -var "#(showline)" +xex "/**,**,**/[part1]/" "/[eol]//" +setvar ipa // store the IP address in the variable ipa
  
 +if -var "#(ipa) = " end +endif // emergency escape because the if still leaves an extra loop of the for..endfor
 +if -var "#(i) > 1" pause // show only one inverter info at a time
 +if -var "#(i) > 1" setvar -var nr=" #(i)" // generate a sequence number when there is more than one inverter being logged
  // only show info for inverters that exist.
  // +if -var "#(ipa) = " +begin
 
  +echo -var "Showing info from inverter#(nr):"
  // +echo -var "IP:#(ipa)adress Round: #(i)"
  
  +then +setvar tmp= +cudp -var "#(ipa)" 8899 -listen -noerror -timeout=1500 0x7f03753100280409 -flat 
  +xed "/[eol]//" +tif "rc<>0" begin xed "/[eol]//" +xex "/[start][52 chars]/[all]/"    
  +xex "/[9 chars][lend]/[all]/" +setvar tmp
  +if -var "#(tmp) <> " echo -var -pure "  Invertername:    #(tmp) " +endif  
  
  // show the info retrieved from goodwe.info  
  +echo "" +echo -pure "  SSID:   "   +echo -var "#(showline)" +xex "/**,**,**/[part5]/"       
  +echo -pure "  IP address: "        +echo -var "#(ipa)" // IP address already in variable "ipa"
  +echo -pure "  Indentifier/prefix: "    +echo -var "#(showline)" +xex "/[6 chars][eol]/[all]/"
  
  // generate the prefix of the last six characters from the serialno.
  +echo -var "#(showline)" +xex "/[6 chars][eol]/[all]/" +xed "/[eol]//" +setvar id
  +echo -var -noline "#(id)_" +setvar id // adding also an underscore to the prefix
  
  +call -var pvfirmware %3 #(ipa)
  // handing values over to showvalues to display the information from the log
  // +echo -var call "showvalues with: %1 %2 #(id)"
  +call -var showvalues %1 %2 #(id)
  // +setvar ipa= // reset variable ipa
  +echo ""
 // +endif
+endfor
+end

+label showvalues +then 

// Optimized fsk script. Closer match to table by using the start byte +4 or +8
// fill the variables. %1 %2 is given by the line that called this SFK script (parameter)
+echo %1 +setvar log_year +echo %2 +setvar values_pv +echo %3 +setvar id
// set variable log_year with the year and in front the id/prefix if present
+echo -var -noline #(id)#(log_year) +setvar log_year
// if parameter novalues is set then return and don't show any values
+if -var "#(values_pv) = 1" end +endif
// Retrieve the last log complete line from todays log
+sel -var -since today -dir #(log_year) -file #(id)*.log +hexfile -offlen -314 314 -flat -nofile +xed "/[eol]//" +setvar logstring
// Show date and time of show values
+then +list -var -today -dir #(log_year) -file #(id)*.log +xex "/[12 chars][lend]/[part1]/" +xex "/[start][8 chars]/[part2]/" +xed "/[eol]//" +setvar logday
// +sel -var -since today -dir #(log_year) -file *log +hexfile -offlen -7 5 -flat -nofile +setvar logtime
+sel -var -since today -dir #(log_year) -file #(id)*.log +hexfile -offlen -7 5 -flat -nofile +setvar logtime
+echo "" +echo -var "Values from on #(logday) at #(logtime)"

+echo -var #(logstring) +xex "/[start][26 chars]/[all]/" +xex "/[4 chars][lend]/[all]/" +dec +calc "#text*0.1"  -dig=1  +setvar tmp +if -var "#(tmp) <> 0.0" echo -var "  Vpv:      #(tmp) V "
+echo -var #(logstring) +xex "/[start][34 chars]/[all]/" +xex "/[4 chars][lend]/[all]/" +dec +calc "#text*0.1"  -dig=1  +setvar tmp +if -var "#(tmp) <> 0.0" echo -var "  Vpv1:     #(tmp) V "
+echo -var #(logstring) +xex "/[start][30 chars]/[all]/" +xex "/[4 chars][lend]/[all]/" +dec +calc "#text*0.1"  -dig=1  +setvar tmp +if -var "#(tmp) <> 0.0" echo -var "  Ipv:      #(tmp) A "
+echo -var #(logstring) +xex "/[start][38 chars]/[all]/" +xex "/[4 chars][lend]/[all]/" +dec +calc "#text*0.1"  -dig=1  +setvar tmp +if -var "#(tmp) <> 0.0" echo -var "  Ipv1:     #(tmp) A "

// value FFFF when not available
+echo -var #(logstring) +xex "/[start][74 chars]/[all]/" +xex "/[4 chars][lend]/[all]/" +dec +calc "#text*0.1"  -dig=1  +setvar tmp +if -var "#(tmp) <> 6553.5" echo -var "  Vac:       #(tmp) V "
+echo -var #(logstring) +xex "/[start][78 chars]/[all]/" +xex "/[4 chars][lend]/[all]/" +dec +calc "#text*0.1"  -dig=1  +setvar tmp +if -var "#(tmp) <> 6553.5" echo -var "  Vac2:      #(tmp) V "
+echo -var #(logstring) +xex "/[start][82 chars]/[all]/" +xex "/[4 chars][lend]/[all]/" +dec +calc "#text*0.1"  -dig=1  +setvar tmp +if -var "#(tmp) <> 6553.5" echo -var "  Vac3:      #(tmp) V "

+echo -var #(logstring) +xex "/[start][86 chars]/[all]/" +xex "/[4 chars][lend]/[all]/" +dec +calc "#text*0.1"  -dig=1   +setvar vac +if -var "#(vac) <> 6553.5" echo -var "  Vac:      #(vac) V "

// value FFFF when not available
+echo -var #(logstring) +xex "/[start][98 chars]/[all]/" +xex "/[4 chars][lend]/[all]/"  +dec +calc "#text*0.1" -dig=1  +setvar tmp +if -var "#(tmp) <> 6553.5" echo -var "  Iac:       #(tmp) A "
+echo -var #(logstring) +xex "/[start][102 chars]/[all]/" +xex "/[4 chars][lend]/[all]/" +dec +calc "#text*0.1" -dig=1  +setvar tmp +if -var "#(tmp) <> 6553.5" echo -var "  Iac2:      #(tmp) A "
+echo -var #(logstring) +xex "/[start][106 chars]/[all]/" +xex "/[4 chars][lend]/[all]/" +dec +calc "#text*0.1" -dig=1  +setvar tmp +if -var "#(tmp) <> 6553.5" echo -var "  Iac3:      #(tmp) A "

// value FFFF when not available
+echo -var #(logstring) +xex "/[start][110 chars]/[all]/" +xex "/[4 chars][lend]/[all]/" +dec +calc "#text*0.01" -dig=2  +setvar tmp +if -var "#(tmp) <> 655.35" echo -var     "  Fac:      #(tmp) Hz "
+echo -var #(logstring) +xex "/[start][114 chars]/[all]/" +xex "/[4 chars][lend]/[all]/" +dec +calc "#text*0.01" -dig=2  +setvar tmp +if -var "#(tmp) <> 655.35" echo -var     "  Fac2:      #(tmp) Hz "
+echo -var #(logstring) +xex "/[start][118 chars]/[all]/" +xex "/[4 chars][lend]/[all]/" +dec +calc "#text*0.01" -dig=2  +setvar tmp +if -var "#(tmp) <> 655.35" echo -var     "  Fac3:      #(tmp) Hz "

+sel -var -since today -dir #(log_year) -file *log +hexfile -offlen -292 4 -flat -nofile +dec +setvar vpv +sel -var -since today -dir #(log_year) -file *log +hexfile -offlen -288 4 -flat -nofile +dec +setvar ipv +echo -var "#(vpv)*#(ipv)/100000" +calc "#text" -dig=2 +setvar power +echo -var    "  Power:    #(power) kW "
// +sel -var -since today -dir #(log_year) -file *log +hexfile -offlen -232 4 -flat -nofile +dec +setvar vac +sel -var -since today -dir #(log_year) -file *log +hexfile -offlen -220 4 -flat -nofile +dec +setvar iac +echo -var "#(vac)*#(iac)/100000" +calc "#text" -dig=2 +setvar power +echo -var    "  PowerAC:   #(power) kW "
+echo -var #(logstring) +xex "/[start][178 chars]/[all]/" +xex "/[4 chars][lend]/[all]/" +dec +calc "#text*0.1" -dig=1  +setvar temp    +echo -var    "  Temperature:   #(temp) celcius "
+echo -var #(logstring) +xex "/[start][190 chars]/[all]/" +xex "/[4 chars][lend]/[all]/" +dec +calc "#text*0.1" -dig=1  +setvar eday    +echo -var    "  Eday:      #(eday) kWh "
+echo -var #(logstring) +xex "/[start][198 chars]/[all]/" +xex "/[8 chars][lend]/[all]/" +dec +calc "#text*0.1" -dig=1  +setvar etotal  +echo -var    "  Etotal:    #(etotal) kWh "
+echo -var #(logstring) +xex "/[start][206 chars]/[all]/" +xex "/[8 chars][lend]/[all]/" +dec +calc "#text*1.0" -dig=0  +setvar work    +echo -var    "  Totalruntime:  #(work) hours "
+echo -var #(logstring) +xex "/[start][302 chars]/[all]/" +xex "/[4 chars][lend]/[all]/" +dec +calc "#text*1.0" -dig=0  +setvar rssi    +echo -var    "  WiFi Signal:   #(rssi) % " 
// and return
// +pause
// +loop
+end

+label pvfirmware
 // fill the variables. %1 is given by the line that called this SFK script (parameter)
 +echo %1 +setvar firmware
 +echo %2 +setvar ipa
 // only show firmware if requested. 
 +if -var "#(firmware) <> 1" end
 // retrieve live the active firmware from the inverter(s) and store it in a variable
 +cudp -var "#(ipa)" 8899 -listen -noerror -timeout=1500 0x7f03753100280409 -pure +xed "/[eol]//" +xex "/[start]AA55**/[all]/" +tif "rc<>0" begin xed "/[eol]//" +setvar firmhex +endif
 +echo ""
 +echo "Firmware version(s):"
 +echo -var #(firmhex) +xex "/[start][146 chars]/[all]/" +xex "/[4 chars][lend]/[all]/" +dec +calc "#text*1."  -dig=0  +setvar dsp1 +tell -var -noline "DSP1:#(dsp1)/"
 +echo -var #(firmhex) +xex "/[start][150 chars]/[all]/" +xex "/[4 chars][lend]/[all]/" +dec +calc "#text*1."  -dig=0  +setvar dsp2 +tell -var -noline "DSP2:#(dsp2)/"
 +echo -var #(firmhex) +xex "/[start][154 chars]/[all]/" +xex "/[4 chars][lend]/[all]/" +dec +calc "#text*1."  -dig=0  +setvar arm +tell -var -noline "ARM:#(arm)"
 +echo -var #(dsp1) +xex "/[1 char][lend]/[part1]/" +setvar dsp1
 +echo -var " (V#(dsp1).#(dsp2).#(arm))"
+end

+label _help
// fill the variables. %1 is given by the line that called this SFK script (parameter)
+echo %1 +setvar pvhelp
+if -var "#(pvhelp) <> 1" end

+tell "Welcome to the help of script to display information from your inverter(s)."
+tell ""
+tell "You can use the following parameters behind the name of the script"
+tell "[Green]showfirm[def] - shows (also) the version of the current firmware."
+tell "[Green]novalues[def] - don't show the last values entry from the inverter-log file"
+tell "[Green]-help[def] - that is what you just typed."
+end



+label storepv +then // last edit: 202105014 Cleaned script by running sfk script test-pv.sfk

+setvar basedir=%1 // setting path being used to store and also to run script from
+setvar useconfigfile=inverter.conf
+ifnotexist -var #(basedir)/inverter.conf setvar useconfigfile=goodwe.info +endif
 
// compare files and overwrite goodwe.info if they are not the same
+ifexist -var #(basedir)/inverter.conf begin
  +md5 -var -quiet #(basedir)/inverter.conf #(basedir)/goodwe.info
  +if "rc<>0" copy -var #(basedir)/inverter.conf #(basedir)/goodwe.info -mirror -yes +endif 
+endif

+for i from 1 to 8
  +then +filter -var #(basedir)/#(useconfigfile) -line=#(i)
  +xex "/[6 chars][lend]/[all]/" +setvar id  // set id/prefix 
  +if -var "#(id) = " end +endif        // exit if all known inverters have been logged or if there is an error
  +if -var "#(id) = meout]" end +endif  // if there is no valid data in goodwe.info or inverter.conf

  // Check if the LOG directory and file exits and if not create it
  +date Y +setvar year
  +echo -var -noline "#(id)_#(year)" +setvar year
  +ifnotexist -var #(basedir)/#(year)/*.log mkdir -var #(basedir)/#(year) +endif

  // Add the id-part in front of the filename for the log to address more than one installed inverter.
  +date "YMD" +setvar ymd +echo -var -noline "#(id)_#(ymd)" +setvar ymd // add "id" when available
  +ifnotexist -var #(basedir)/#(year)/#(ymd).log touch -var -force #(basedir)/#(year)/#(ymd).log +endif
  
  // Retrieve the values from the inverter as an HEX string and store that in a log file
  +if -var "#(id) <> " begin
    +time " h:m " +setvar timestamp // time to be added to each log line
    +xfind -var #(basedir)/#(useconfigfile) /,**// +setvar ipa 
    +cudp -var #(ipa) 8899 -listen -noerror -timeout=1500 0x7f0375940049d5c2 -pure +xed /[eol]// 
    +xex /[start]AA55**/ +tif "rc<>0" begin +xex -var "/[lstart][306 chars]/[part2]#(timestamp)/"
                           +append -var #(basedir)/#(year)/#(ymd).log 
                         +endif 
  +endif
endfor
+end


Jouw eigen config bestand wanneer je meer dan één omvormer hebt of als je niet constant wil broadcasten. De informatie wordt naar het werkbestand goodwe.info geschreven, zowel in broadcast mode als met het config bestand.
Een eigen config bestand is niet noodzakelijk voor de werking van de scripts.

bestandsnaam: inverter.conf

code:
1
192.168.0.32,34EAE73D8B60,Solar-WiFi20DW6450


De logbestanden worden geschreven in voor elke omvormer in een eigen directory en zowel de directory als de log bestandsnaam krijgen een prefix met de laatste zes tekens van hun SSID/Serno. En dat is hier DW6450 en de daarachter komt een "_". Bestandsnaam is dan DW6450_202100514.log en directory naam is DW6450 _2021

Het schrijven naar het log doe ik direct vanuit de cron en dan elke minuut. Dit kan natuurlijk ook een langer tussentijd zijn.

De cron opdrachtregel:

code:
1
PATH="$PATH:/opt/goodwe" sfk script -from=storepv pv_scripts.sfk /opt/goodwe


Ik roep direct het FSK script "pv_scripts.sfk" aan en in dat script wordt vanaf label "storepv" de opdrachten uitgevoerd. De basis directory is "/opt/goodwe" (zonder trailing "/") en hier staan de scripts en worden de logbestanden geschreven.

Heeft veel tijd gekost vanwege het geschikt maken voor meer dan één omvormer en vanwege dat ik FSK totaal nieuw was voor mij. De syntax is af en toe vaag en je hoeft maar een " verkeerd hebben staan dan kun je gaan zoeken waar die dan is. Je krijgt er vanzelf handigheid in en het is toch een best fijne tool om dingen te doen. ;-)

Als er verbeterpunten zijn of inzichten dan hoor ik dat graag want ik zal vast wel fout gedaan hebben of niet zo efficient als het zou kunnen. Het werkt nu en ik hoop dat er geen bugs in zitten die ik gemist heb.

Update: ik had vanochtend het probleem dat het het nieuwe logbestand niet aangemaakt was en dat er daarna niet in geschreven werd. Ik heb een werkende code over de niet werkende heengezet en het werkt nu weer. Eigenlijk zit er geen verschill tussen die stukken code dus morgenvroeg weer kijken of het dan wel goed gaat.

Verder zat ik te danken hoe ik opgeslagen log regels korter kan maken zonder data te verliezen. Mijn eerste geachte was om herhalende tekens te beschrijven. Dus FFFFFFFF omschrijf ik als Fx08 --> herhaal teken F 8 maal...etc. Dit is pas efficient vanaf 5 herhalende tekens.

Een logregel gaat dan in mijn geval van 314 tekens terug naar 185 tekens.

[Voor 107% gewijzigd door msatter op 15-05-2021 10:11. Reden: Toelichting config bestand]


  • msatter
  • Registratie: maart 2021
  • Niet online
@ThinkPad Ik heb nu Node Red op mijn test Rapi geïnstalleerd en ik zag nog data maar de omvormer is al uit.

Ik heb nog vragen naar aanleiding van de code. Heb je de flow ook bijgewerkt in die eerdere posting? Ik kreeg melding dat dingen dubbel gedefinieerd waren nadat ik de Java in de functie geplakt had.

Verder zie ik twee vaste IP adressen en ik neem aan dat 192.168.8.21 jouw omvormer is en dat 192.168.6.15 de ontvanger van de antwoorden van de omvormer.

Ik kan alleen informatie zien in het debug venster en dat is momenteel niet veel nu er geen zon is.

Acties:
  • +2Henk 'm!

  • ThinkPad
  • Registratie: juni 2005
  • Laatst online: 14:57

ThinkPad

Moderator Duurzame Energie & Domotica
192.168.8.21 is het systeem waar mijn Node-RED op draait. De Goodwe zit bij mij op 192.168.6.15

Je kunt de flow pakken en daaronder heb ik de code van de onderste function node nog apart gezet. Die heb ik naderhand nog weer vaker bijgewerkt namelijk. Dubbel gedefinieerd klopt, ik maak de timestamp wat beter leesbaar.

In screenshot van mijn laatste post zie je het Node-RED dashboard. Die kun je apart installeren (via palette in NR even 'node-red-dashboard' installeren). Vervolgens aan de function node een paar dashboard output nodes hangen:

De 'value format' is dan {{msg.payload.power}} en {{msg.payload.eday}} etc.

In principe wijst het zichzelf, maar zie ook tutorial: https://randomnerdtutoria...-with-node-red-dashboard/

[Voor 5% gewijzigd door ThinkPad op 15-05-2021 10:42]

Gas besparen door CV-tuning | Elektriciteit besparen
Geen vragen via privébericht die ook via het forum kunnen a.u.b.


Acties:
  • +1Henk 'm!

  • Proton_
  • Registratie: november 2011
  • Laatst online: 13:39

Proton_

Team Welles

msatter schreef op vrijdag 14 mei 2021 @ 20:53:
Verder zat ik te danken hoe ik opgeslagen log regels korter kan maken zonder data te verliezen.
Waarom wil je dat?
Het kan natuurlijk wel:
Sla de data binair ipv als ASCII op.
Dus alleen de ruwe bytes van de omvormer opslaan en pas parsen als het verwerkt wordt.

Alternatief: pipe het resultaat door gzip.
Of... Sla het op in een timeseries database, dat is er voor gemaakt :)
Pvoutput is daar een voorbeeld van.

Sfk (en node-red in mindere mate ook) is naar mijn mening een voorbeeld van een Wikipedia: Inner-platform effect . Dingen die in een gewone programmeertaal gefaciliteerd worden (interfacen met externe systemen, redeneren over invariants, testen, diffbare code) zijn opeens lastig, doordat je beperkt wordt door het gekozen platform :)

Wel heel gaaf wat je voor elkaar krijgt natuurlijk :)

'19 Kona na '15 Zoe, douchen met wtw en Auer Edel Eau


Acties:
  • +1Henk 'm!

  • msatter
  • Registratie: maart 2021
  • Niet online
@ThinkPad Ik heb de oude versie aangepast opdat er geen IP adressen meer ingevoerd hoeven te worden. Wel wennen aan de werkwijze en stapje voor stapje gaat het wel. Een probleem was dat hij zijn eigen broadcast ziet en dan maar de twee antwoorden samenvoegen tot één. Daarna kon ik uitzoeken hoe ik variabelen overdraag.



https://tweakers.net/i/XKZVfIuKCS_PWUbg_0dcwtoN-_s=/full-fit-in/4920x3264/filters:max_bytes(3145728):no_upscale():strip_icc():fill(white):strip_exif()/f/image/Vm6PoPKm7jYczFykbGJjmSsH.jpg?f=user_large

Code ziet er niet uit hier en daarom niet geplaatst. Code box werkt niet.

Update: Hierboven een versie die zowel via broadcast en via een vast IP adres de waardes ophaalt. Ook worden de waardes naar een bestand geschreven ( /opt/goodwe/nodered/just.log ) met daarachter een epoch timestamp.

Dat laatste kan mooier en de bestandsnamen met prefix en datum zoals in het FSK script maar dat is iets voor later en ik ben erg content met mijzelf dat ik zo snel voor elkaar kreeg. [/i].Terugvechten deed Node Red wel maar hier is veel meer gebruikers ervaringen te vinden dus ik hoef niet elke keer zelf het wiel uit te vinden. :X

Update de zoveelste: in een dag met Node Red de basis functionalitiet van het FSK script verkegen. Prefix, datum in directory en bestands naam een eenvoudig leesbare timestamp aan het einde van logregel.

De bovenstaande code staat toe om via broadcast de omvormer te vinden, met een vast doel IP om de zoveel tijd een logregel te schrijven. Daarnaast kan het ook worden verbonden met een grafische display @ThinkPad om de actuele waardes weer te geven.

Open staat hier ondersteuning voor meer dan één string en meer dan één omvormer. Daarnaast natuurlijk ook een browse functie om via het log waardes te bekijken in het verleden.
Dan is het mischien handig om het ook in database te gooien.

Kijk, geen cloud nodig om je eigen gegevens ook jouw eigen te houden. _/-\o_

Update: de prefix destabiliseerde alles en het injecteren van de prefix ging niet goed. Waarom weet ik niet.

Prefix probleem herkent en opgelost. Tjonge nog veel te leren en er kwamen nog payloads mee uit eerdere delen van de stream. Verwijderen en isoleren en het werkt nu als een klok. Ik heb nu ook virtuele links toegepast en zo ziet het een stuk netter en begrijpelijker uit....zie plaatje.
De code wilde ik ook plaatsen maar de code-box verslikt zich erin dus een andere manier bedenken voor dat.

[Voor 242% gewijzigd door msatter op 17-05-2021 16:13. Reden: Meer Node Red]


  • msatter
  • Registratie: maart 2021
  • Niet online
@wlmpie De ingelezen data met de RS485/modbus is het zelfde alleen de manier waarop het opgehaald wordt is anders. Test het eerste met de APP SolarGo van Goodwe en als dat werkt dan gaat het uitlezen via Wifi ook.

Anders heb je een firmware update nodig in twee slagen zoals eerder beschreven in deze tread.

De logbestanding die schrijf zijn de kale HEX strings met alles erin (RAW) met daarachter het uur en de minuut van inlezen.

Acties:
  • +1Henk 'm!

  • wlmpie
  • Registratie: oktober 2007
  • Laatst online: 24-06 20:35
msatter schreef op zaterdag 15 mei 2021 @ 21:32:
@wlmpie Test het eerste met de APP SolarGo van Goodwe en als dat werkt dan gaat het uitlezen via Wifi
Die werkt idd niet dus ik heb eerst een ARM firmware update nodig, maar ik wil ook niet dat mijn omvormer op 2500 watt gaat aftoppen, want nu topt hij af op ca 2760 watt. Ik las van iemand met firmware 1.52.11 dat deze aftopte op 2500 en dat wil ik niet.
Iemand met een 3000xs heeft wel goede resultaten met firmware 1.51.14 https://gathering.tweakers.net/forum/view_message/67309210
Als dat ook bij een 2500xs werkt kan ik dat evt. aan Goodwe support vragen, maar firmware 1.52.14 zou ik dus niet willen vanwege het eerder aftoppen. Edit: @ThinkPad ik lees dat jij 1.52.14 hebt en dat deze niet aftopt op het nominale vermogen? Nou snap ik het niet meer.

Ik heb nu 1.13.13 als ze daar 1.13.14 van kunnen maken zou ik dat ook al prima vinden, maar ik heb geen idee of een support aanvraag bij Goodwe mij niet van de wal in de sloot helpt dus ik ben nog een beetje huiverig.

[Voor 5% gewijzigd door wlmpie op 15-05-2021 23:13]


Acties:
  • 0Henk 'm!

  • No13
  • Registratie: januari 2001
  • Laatst online: 14:00

No13

/me was here

Het ticket staat inmiddels ruim een week open, de 1e keer stuurde ik een mail en toen waren ze aanzienlijk sneller. Echter gaven ze toen aan dat je beter een ticket kon maken :P

Net maar even gevraagd om een update; als die er niet komt toch maar weer eens mailen.

Iemand van jullie ervaring met de response op tickets van GoodWe die je niet via mail hebt aangemaakt?

Acties:
  • 0Henk 'm!

  • Proton_
  • Registratie: november 2011
  • Laatst online: 13:39

Proton_

Team Welles

Ja, bij mij was het vrij vlot opgelost. Eerste keer alleen het eerste versienummer, net als jij, daarna na twee dagen de ARM update ook. Beide met een ticket.
Dit weekend even klussen aan een pvoutput-uploader.

[Voor 5% gewijzigd door Proton_ op 17-05-2021 19:47]

'19 Kona na '15 Zoe, douchen met wtw en Auer Edel Eau


Acties:
  • 0Henk 'm!

  • msatter
  • Registratie: maart 2021
  • Niet online
Voor Node Red heb ik al een uploadert gevonden en is wel uit 2017 maar de basis is er. Node red heb ik aan de praat en het werkt nu betrouwbaar. Helaas nog verschillende strings maar wel meer dan één omvormer als je handig bent.

Vanavond de omvormer van de STA gehaald en via de AP kan ik hem nu benaderen en loggen. Ik gebruik een AVM repeater om de Wifi in een kabel te krijgen waarna mijn router de begeleiding doet via NAT tussen mijn interne netwerk en de Wifi/omvormer deel.

Update over STA en AP: het werkt nu en ik had mijn router info eruit gehaald. Nu geeft de aanvraag voor het wachtwoord/info van/over mijn router en verdere info terug:

code:
1
5A5A0182 000100F9 D7<                ZZ.......        00000000
niets nuttigs meer ;)

Geen leesbaar wachtwoord meer en zo minder kans dat er anderen hier toegang toe krijgen. De enige begrenzing is het standaard wachtwoord (12345678) voor de AP. Haast niemand past deze aan en browse zo de omvormers van mijn buren binnen en zou hun WiFi wachtwoord zo kunnen lezen.
Het zou een CVE moeten zijn, maar niemand verwonderd over dit, als het om China meuk gaat.

Belangrijk is om een sterker wachtwoord aan de AP zijde te zetten.

Mooier was als je jouw omvormer een werkende STA heeft de AP gedeactiveerd zou worden. Bij een 'mogelijke ' reset via langer houden van de knop op de WiFi stick word de AP weer actief met het standaard wachtwoord. Zo kom je niet vast te zitten als jouw router niet meer werkt en die moet vervangen.

Hier gaat de tekst voor de update weer verder:

Test moest weer vroegtijdig stoppen omdat wederom het grote licht uit ging.

FSK heb ik nu nog lopen ik denk morgen helemaal over te gaan op Node Red en FSK blijft dan nog schaduw draaien.

Ik kan helaas geen zinnige code hier plakken en de code box maakt er een zooitje van de Node Red code.

[Voor 40% gewijzigd door msatter op 18-05-2021 12:05]


  • ThinkPad
  • Registratie: juni 2005
  • Laatst online: 14:57

ThinkPad

Moderator Duurzame Energie & Domotica
msatter schreef op dinsdag 18 mei 2021 @ 00:33:
[...]
Ik kan helaas geen zinnige code hier plakken en de code box maakt er een zooitje van de Node Red code.
offtopic:
Rechtsbovenin op het menu klikken > export > current flow > copy to clipboard
En dat dan even tussen [code] [/code] tags zetten.

Gas besparen door CV-tuning | Elektriciteit besparen
Geen vragen via privébericht die ook via het forum kunnen a.u.b.


Acties:
  • +1Henk 'm!

  • msatter
  • Registratie: maart 2021
  • Niet online
Werkt weer.



code:
1
[{"id":"801b0f90.623ea8","type":"tab","label":"Control and display live values inverter","disabled":false,"info":"Adoptation of the work by ThinkPad"},{"id":"57d7a5ee.293c24","type":"function","z":"801b0f90.623ea8","name":"Gen. values","func":"var IP_address = msg.ip\nvar inverter_reply = msg.payload;\nvar message1 = inverter_reply.slice(2); // Remove 'AA55' from start of message\n//var message = message.slice(0, -2); //Remove two CRC bytes from end of message\nvar message = message1.slice(0, -2); //Remove two CRC bytes from end of message\n\nfunction crc16(buffer) {\n    var crc = 0xFFFF;\n    var odd;\n\n    for (var i = 0; i < buffer.length; i++) {\n        crc = crc ^ buffer[i];\n\n        for (var j = 0; j < 8; j++) {\n            odd = crc & 0x0001;\n            crc = crc >> 1;\n            if (odd) {\n                crc = crc ^ 0xA001;\n            }\n        }\n    }\n    return crc.toString(16);\n}\n\n//Calculate CRC ourselves\nvar calculated_crc = crc16(message);\n\n//Get CRC from inverter reply and un-reverse it\nvar reply_crc = inverter_reply.slice(-2).toString('hex');\nvar crc1 = reply_crc.slice(0, 2);\nvar crc2 = reply_crc.slice(-2);\nvar new_crc = crc2 + crc1;\n\nif (new_crc == calculated_crc) {\n    var year = \"20\" + inverter_reply.readInt8(5); // \n    var month = inverter_reply.readInt8(6); // \n    var day = inverter_reply.readInt8(7); // \n    var hour = inverter_reply.readInt8(8); // \n    var minutes1 = inverter_reply.readInt8(9); // \n    var seconds1 = inverter_reply.readInt8(10); // \n    \n    var minutes = (minutes1 < 10 ? '0' : '') + minutes1;\n    var seconds = (seconds1 < 10 ? '0' : '') + seconds1;\n    var timestamp = hour + \":\" + minutes + \":\" + seconds + \"  \" + day + \"-\" + month + \"-\" + year;\n\n    var vpv = parseFloat((inverter_reply.readInt16BE(11) * 0.1).toFixed(1));\n    var ipv = parseFloat((inverter_reply.readInt16BE(13) * 0.1).toFixed(1));\n    var vac = parseFloat((inverter_reply.readInt16BE(41) * 0.1).toFixed(1));\n    var iac = parseFloat((inverter_reply.readInt16BE(47) * 0.1).toFixed(1));\n    var fac = parseFloat((inverter_reply.readInt16BE(53) * 0.01).toFixed(2));\n    var eday = parseFloat((inverter_reply.readInt16BE(93) * 0.1).toFixed(1));\n    var etotal = parseFloat((inverter_reply.readInt16BE(97) * 0.1).toFixed(2));\n    var rssi = inverter_reply.readInt16BE(149);\n    var workhours = inverter_reply.readInt16BE(101);\n    var temperature = parseFloat((inverter_reply.readInt16BE(87) * 0.1).toFixed(1));\n    var power = inverter_reply.readInt16BE(61);\n    var status = inverter_reply.readInt16BE(63);\n    var workmode;\n\n    switch (status) {\n        case 0:\n            workmode = \"Waiting\"\n            break;\n        case 1:\n            workmode = 'Normal'\n            break;\n        case 2:\n            workmode = \"Error\"\n            break;\n        case 4:\n            workmode = \"Checking\"\n            break;\n    }\n\n    msg.payload = {\n        vpv,\n        ipv,\n        vac,\n        iac,\n        fac,\n        power,\n        eday,\n        etotal,\n        rssi,\n        workhours,\n        temperature,\n        workmode,\n        IP_address,\n        timestamp\n    }\n\n    var nodestate = {\n        text: workmode + ' - Power: ' + power + 'W - ' + timestamp,\n                    };\n    node.status(nodestate);\n\n    return msg;\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":850,"y":220,"wires":[["9dc4ea82.154658"]],"icon":"font-awesome/fa-th-list"},{"id":"9dc4ea82.154658","type":"debug","z":"801b0f90.623ea8","name":"Show values","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1070,"y":220,"wires":[]},{"id":"516a7514.fae094","type":"udp out","z":"801b0f90.623ea8","name":"","addr":"","iface":"","port":"8899","ipv":"udp4","outport":"","base64":false,"multicast":"false","x":330,"y":220,"wires":[],"icon":"node-red/bridge.svg"},{"id":"f06e70e4.9be698","type":"function","z":"801b0f90.623ea8","name":"Req. values","func":"var inverter_ask = Buffer.from(\"7F0375940049D5C2\",\"hex\");\nvar ipaddress = msg.payload.ipa;\n\nmsg.ip = ipaddress;\nmsg.payload = inverter_ask;\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":170,"y":220,"wires":[["516a7514.fae094"]],"icon":"font-awesome/fa-sticky-note"},{"id":"b7a3a1b4.793988","type":"function","z":"801b0f90.623ea8","name":"Req. values","func":"var inverter_ask = Buffer.from(\"574946494b49542d3231343032382d52454144\",\"hex\");\n\nmsg.payload = inverter_ask;\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":170,"y":100,"wires":[["b03ef4a7.ce18c"]],"icon":"font-awesome/fa-sticky-note"},{"id":"b03ef4a7.ce18c","type":"udp out","z":"801b0f90.623ea8","name":"","addr":"10.10.100.253","iface":"","port":"48899","ipv":"udp4","outport":"","base64":false,"multicast":"broad","x":380,"y":100,"wires":[]},{"id":"d625fa25.026a1","type":"udp in","z":"801b0f90.623ea8","name":"Parse broadcast","iface":"","port":"48899","ipv":"udp4","multicast":"false","group":"","datatype":"utf8","x":600,"y":100,"wires":[["1e827cf5.e75863"]]},{"id":"c188a436.fa08e","type":"debug","z":"801b0f90.623ea8","name":"Msg. broadcast","active":false,"tosidebar":true,"console":true,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":990,"y":100,"wires":[]},{"id":"5a0ad7a8.bfe99","type":"csv","z":"801b0f90.623ea8","name":"CVS","sep":",","hdrin":false,"hdrout":"none","multi":"one","ret":"\\n","temp":"ipa,mac,ssid","skip":"0","strings":true,"include_empty_strings":true,"include_null_values":true,"x":730,"y":140,"wires":[["2bbcda70.e9e99e"]]},{"id":"d05deb79.7f147","type":"join","z":"801b0f90.623ea8","name":"Join hex+time","mode":"custom","build":"string","property":"payload","propertyType":"msg","key":"logline","joiner":"[32]","joinerType":"bin","accumulate":false,"timeout":"","count":"2","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"str","reduceFixup":"","x":1060,"y":340,"wires":[["f35ba234.b2a0c"]],"icon":"font-awesome/fa-indent"},{"id":"8277276e.aa4838","type":"udp in","z":"801b0f90.623ea8","name":"","iface":"","port":"8899","ipv":"udp4","multicast":"false","group":"","datatype":"buffer","x":480,"y":220,"wires":[["c3f1b711.3b982"]],"icon":"node-red/bridge.svg"},{"id":"f35ba234.b2a0c","type":"file","z":"801b0f90.623ea8","name":"Save to log","filename":"","appendNewline":true,"createDir":true,"overwriteFile":"false","encoding":"ascii","x":1070,"y":280,"wires":[[]],"icon":"font-awesome/fa-floppy-o"},{"id":"b7d1e792.f544b","type":"inject","z":"801b0f90.623ea8","name":"Timer & config","props":[{"p":"payload.ipa","v":"10.10.100.253","vt":"str"},{"p":"payload.ssid","v":"goodwe","vt":"str"}],"repeat":"300","crontab":"","once":true,"onceDelay":0.1,"topic":"","x":420,"y":380,"wires":[["7326dc17.928594"]],"icon":"font-awesome/fa-pencil-square","info":"Prefix max. 6 charactes/numbers"},{"id":"1b903bf1.27fd9c","type":"switch","z":"801b0f90.623ea8","name":"Ignore own outward broadcast","property":"payload","propertyType":"msg","rules":[{"t":"cont","v":"214028","vt":"str"},{"t":"eq","v":"payload","vt":"msg"}],"checkall":"false","repair":false,"outputs":2,"x":530,"y":140,"wires":[[],["5a0ad7a8.bfe99"]]},{"id":"9c808dd6.aae978","type":"function","z":"801b0f90.623ea8","name":"Hex2String","func":"// replace the payload buffer with the string value\nmsg.payload = msg.payload.toString('hex');\n// return the original msg with the new string payload\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":850,"y":280,"wires":[["d05deb79.7f147"]],"icon":"font-awesome/fa-forward"},{"id":"8a067e8c.712a18","type":"function","z":"801b0f90.623ea8","name":"timestamp","func":"var d=new Date();\nvar hours=('00' + d.getHours()).slice(-2);\nvar minutes=('00' + (d.getMinutes()+1)).slice(-2);\n// adding a space behind the time so that the lenght of the line is 314 characters in the log\nmsg.payload = hours+\":\"+minutes+\" \"\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":850,"y":320,"wires":[["d05deb79.7f147"]],"icon":"font-awesome/fa-clock-o","info":"Create timestamp in hour:minute format that will added to the end of the HEX string "},{"id":"f28cf758.5b613","type":"function","z":"801b0f90.623ea8","name":"Set Prefix","func":"var ssid = msg.payload.ssid\nvar prefix = (ssid.slice(-6))\nmsg.payload = prefix;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":180,"y":300,"wires":[["1561d519.143313"]],"icon":"font-awesome/fa-sign-in"},{"id":"420eea8b.694c34","type":"function","z":"801b0f90.623ea8","name":"prefix+dir/file","func":"var d=new Date()\nvar day=('00' + d.getDate()).slice(-2)\nvar month=('00' + (d.getMonth()+1)).slice(-2)\nvar year=d.getFullYear()\n//var prefix = msg.prefix\n\nbasedir =\"/opt/goodwe/\";\ndirdate = year+\"/\";\nfiledate = year+\"\"+month+\"\"+day;\npre = msg.prefix+\"_\";\n//pre = \"\";\n\nmsg.filename = basedir+pre+dirdate+pre+filedate;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":690,"y":340,"wires":[["d05deb79.7f147"]],"icon":"font-awesome/fa-forward"},{"id":"2562ae04.bb24e2","type":"delay","z":"801b0f90.623ea8","name":"","pauseType":"delay","timeout":"50","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":650,"y":260,"wires":[["8a067e8c.712a18"]],"info":"Timestamp has to at the end of the log line so it has to be delayed a bit so that the sequencing is working."},{"id":"98370845.3723d","type":"debug","z":"801b0f90.623ea8","name":"Complete message","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"true","targetType":"full","statusVal":"payload","statusType":"auto","x":910,"y":420,"wires":[]},{"id":"74ffb5a1.3432a4","type":"switch","z":"801b0f90.623ea8","name":"has content?","property":"payload","propertyType":"msg","rules":[{"t":"empty"},{"t":"nempty"}],"checkall":"false","repair":false,"outputs":2,"x":890,"y":380,"wires":[[],[]]},{"id":"bd1163f9.78035","type":"link out","z":"801b0f90.623ea8","name":"Request Broadcast","links":["ebb5ecf5.167578","ae94db63.376f1","b57093f2.7367f"],"x":255,"y":380,"wires":[]},{"id":"f81b7c8d.7669a8","type":"inject","z":"801b0f90.623ea8","name":"Do broadcast","props":[],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payloadType":"str","x":150,"y":380,"wires":[["bd1163f9.78035"]]},{"id":"301762de.e10bbe","type":"link in","z":"801b0f90.623ea8","name":"Receive prefix","links":["2bbcda70.e9e99e","7326dc17.928594"],"x":75,"y":300,"wires":[["f28cf758.5b613"]]},{"id":"7326dc17.928594","type":"link out","z":"801b0f90.623ea8","name":"TimerConfig","links":["301762de.e10bbe","ef310d19.938f58","4fac93fd.ba7f54"],"x":555,"y":420,"wires":[]},{"id":"ef310d19.938f58","type":"link in","z":"801b0f90.623ea8","name":"Req. values","links":["13a9767d.afa3aa","2bbcda70.e9e99e","7326dc17.928594"],"x":75,"y":220,"wires":[["f06e70e4.9be698"]]},{"id":"1561d519.143313","type":"change","z":"801b0f90.623ea8","name":"Clean payload + move","rules":[{"t":"delete","p":"parts","pt":"msg"},{"t":"delete","p":"fromip","pt":"msg"},{"t":"delete","p":"ip","pt":"msg"},{"t":"delete","p":"port","pt":"msg"},{"t":"delete","p":"columns","pt":"msg"},{"t":"delete","p":"ipa","pt":"msg"},{"t":"move","p":"payload","pt":"msg","to":"prefix","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":440,"y":300,"wires":[["420eea8b.694c34"]],"icon":"font-awesome/fa-filter"},{"id":"e8c56e20.38afd","type":"change","z":"801b0f90.623ea8","name":"Clean payload","rules":[{"t":"delete","p":"fromip","pt":"msg"},{"t":"delete","p":"ip","pt":"msg"},{"t":"delete","p":"port","pt":"msg"},{"t":"delete","p":"payload","pt":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":460,"y":260,"wires":[["2562ae04.bb24e2"]],"icon":"font-awesome/fa-filter"},{"id":"2bbcda70.e9e99e","type":"link out","z":"801b0f90.623ea8","name":"","links":["301762de.e10bbe","ef310d19.938f58"],"x":815,"y":140,"wires":[]},{"id":"ae94db63.376f1","type":"link in","z":"801b0f90.623ea8","name":"Req. Broadcast","links":["a86bf67d.7b4578","bd1163f9.78035"],"x":75,"y":100,"wires":[["b7a3a1b4.793988"]]},{"id":"c3f1b711.3b982","type":"delay","z":"801b0f90.623ea8","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"3","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":640,"y":220,"wires":[["9c808dd6.aae978","e8c56e20.38afd","57d7a5ee.293c24","c84a78f7.b8b6c8"]],"icon":"font-awesome/fa-hand-stop-o"},{"id":"1e827cf5.e75863","type":"delay","z":"801b0f90.623ea8","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"3","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":780,"y":100,"wires":[["c188a436.fa08e","1b903bf1.27fd9c","babc3f74.4a59f"]],"icon":"font-awesome/fa-hand-stop-o"},{"id":"63d631b.40e4ed","type":"comment","z":"801b0f90.623ea8","name":"Use broadcast to find a inverter with time-out detect","info":"","x":250,"y":60,"wires":[]},{"id":"1a9c32f4.0a6195","type":"comment","z":"801b0f90.623ea8","name":"Request and process values provided by the inverter with time-out detect","info":"","x":320,"y":180,"wires":[]},{"id":"ab4a8de3.ff053","type":"comment","z":"801b0f90.623ea8","name":"Find inverter (broadcast)","info":"","x":170,"y":340,"wires":[]},{"id":"9a620fa4.5a0e4","type":"comment","z":"801b0f90.623ea8","name":"Prepare for writing to log.","info":"","x":170,"y":260,"wires":[]},{"id":"d400b5d7.d2cad","type":"comment","z":"801b0f90.623ea8","name":"Scheduler, set IP address and prefix","info":"","x":450,"y":340,"wires":[]},{"id":"b3ee5a06.7b3c6","type":"comment","z":"801b0f90.623ea8","name":"Spare","info":"","x":750,"y":380,"wires":[]},{"id":"576863d4.d2162c","type":"inject","z":"801b0f90.623ea8","d":true,"name":"Timer & config No2","props":[{"p":"payload.ipa","v":"10.10.100.253","vt":"str"},{"p":"payload.ssid","v":"no2","vt":"str"}],"repeat":"","crontab":"*/5 4-22 * * *","once":true,"onceDelay":"5","topic":"","x":400,"y":420,"wires":[["7326dc17.928594"]]},{"id":"69f5a1ee.df6a48","type":"inject","z":"801b0f90.623ea8","d":true,"name":"Timer & config No3","props":[{"p":"payload.ipa","v":"10.10.100.253","vt":"str"},{"p":"payload.ssid","v":"no3","vt":"str"}],"repeat":"","crontab":"*/5 4-22 * * *","once":true,"onceDelay":"10","topic":"","x":400,"y":460,"wires":[["7326dc17.928594"]]},{"id":"b57093f2.7367f","type":"link in","z":"801b0f90.623ea8","name":"time-out broadcast","links":["bd1163f9.78035"],"x":635,"y":60,"wires":[["babc3f74.4a59f"]]},{"id":"a31bf69f.04fc7","type":"switch","z":"801b0f90.623ea8","name":"check for time-out","property":"payload","propertyType":"msg","rules":[{"t":"nempty"},{"t":"empty"}],"checkall":"true","repair":false,"outputs":2,"x":930,"y":60,"wires":[[],["a86bf67d.7b4578"]]},{"id":"a86bf67d.7b4578","type":"link out","z":"801b0f90.623ea8","name":"broadcast time-out detected","links":["ae94db63.376f1"],"x":1055,"y":60,"wires":[]},{"id":"babc3f74.4a59f","type":"trigger","z":"801b0f90.623ea8","name":"5 sec. wait","op1":"","op2":"","op1type":"nul","op2type":"payl","duration":"5","extend":true,"overrideDelay":false,"units":"s","reset":"","bytopic":"topic","topic":"payload","outputs":2,"x":730,"y":60,"wires":[[],["a31bf69f.04fc7"]]},{"id":"c84a78f7.b8b6c8","type":"trigger","z":"801b0f90.623ea8","name":"5 sec. wait","op1":"","op2":"","op1type":"nul","op2type":"payl","duration":"5","extend":true,"overrideDelay":false,"units":"s","reset":"","bytopic":"all","topic":"topic","outputs":2,"x":750,"y":180,"wires":[[],["8e3a64a5.067ae8"]]},{"id":"8e3a64a5.067ae8","type":"switch","z":"801b0f90.623ea8","name":"check for time-out","property":"payload","propertyType":"msg","rules":[{"t":"nempty"},{"t":"empty"}],"checkall":"true","repair":false,"outputs":2,"x":930,"y":180,"wires":[[],["13a9767d.afa3aa"]]},{"id":"4fac93fd.ba7f54","type":"link in","z":"801b0f90.623ea8","name":"time-out request","links":["7326dc17.928594"],"x":635,"y":180,"wires":[["c84a78f7.b8b6c8"]]},{"id":"13a9767d.afa3aa","type":"link out","z":"801b0f90.623ea8","name":"time-out detected","links":["ef310d19.938f58"],"x":1055,"y":180,"wires":[]}]



Het broadcast addres is tijdelijk 10.10.100.253 (AP) i.pv. 255.255.255.255 omdat er tijdelijk een router tussen zit om de de DHCP broadcasts van de Goodwe AP te killen met behulp van DHCP snooping + optie 82.

Ik heb een Mikrotik cAP lite onderweg. Die ga ik pal naast de Goodwe hangen en in de WiFi stick haal de antenne kabel van connector opdat die gaat fluisteren i.p.v. bazuinen.

Update: twee rate limiters geplaatst elk na iedere packet ontvangers en commentaar velden geplaatst ter verduidelijking.

Update 20 mei: De ratelimiter aangepast naar 3 seconden, just to be sure, en icons aangepast opdat de functie van de velden gemakkelijker te bepalen is.
Ook een voorbeeld erin gezet van meer dan één omvormer uitlezen en let hier op de opstart vertraging en dat de uitlees interval verder gelijke is voor alle omvormers. Zo blijft de juiste sequency goed en kan er geen overlappingen komen tussen de omvormers in de verschillende logs.

Meer dan één string en drie fase zit als standaard in het log dus daar is geen omkijken naar. Het omzetten naar waarden en is nog een uitdaging omdat ik hier een soort if-then-else voor moet verzinnen. Ik denk dat ik wel wat met Switch kan doen binnen Node-Red.

Update 21 mei: enkele dingen aangepast en nu ook een time-out op de ontvangst. Als er binnen vijf seconden geen gegevens binnenkomen dan gaat er een nieuwe aanvraag uit. Er is nog geen beperking hoevaak maar zodra er een antwoord komt dan is er geen time-out meer.

@ThinkPad

[Voor 36% gewijzigd door msatter op 21-05-2021 14:20. Reden: Flow bijgewerkt, verschillende omvormers + timers]


  • No13
  • Registratie: januari 2001
  • Laatst online: 14:00

No13

/me was here

No13 schreef op maandag 17 mei 2021 @ 19:42:
Het ticket staat inmiddels ruim een week open [..]
Inmiddels een mail gestuurd met de vraag waarom mijn ticket bijna 2 weken zonder feedback open staat.

Krijg ik een automatische mail dat ze een ticket hebben gemaakt :P

Acties:
  • +3Henk 'm!

  • Proton_
  • Registratie: november 2011
  • Laatst online: 13:39

Proton_

Team Welles

Het is intussen [GoodWe] Uitlezen inverters via UDP geworden ;)

Een tooltje om vanuit je eigen netwerk van de omvormer naar PVOutput te pushen heb ik hier op github gezet:
https://github.com/koen-lee/GoodweUDPToPvOutput
De release is self-contained linux-arm, dus draait na uitpakken direct op een Pi.

Resultaat is https://pvoutput.org/intraday.jsp?id=20978&sid=18868

'19 Kona na '15 Zoe, douchen met wtw en Auer Edel Eau


  • ThinkPad
  • Registratie: juni 2005
  • Laatst online: 14:57

ThinkPad

Moderator Duurzame Energie & Domotica
Code ziet er bekend uit ;) Je mist nog de temperatuur bij je PVOutput trouwens. Ik stuur de temperatuur van de omvormer er heen.

Gas besparen door CV-tuning | Elektriciteit besparen
Geen vragen via privébericht die ook via het forum kunnen a.u.b.


  • Proton_
  • Registratie: november 2011
  • Laatst online: 13:39

Proton_

Team Welles

@ThinkPad ik heb jou ook bij de acknowledgements gezet :)
Van javascript naar C# is goed te doen, inderdaad.

De temperatuur stuur ik mee op https://github.com/koen-l...eUdpPoller/Program.cs#L68 , ik weet niet waarom PvOutput dat niet slikt...

'19 Kona na '15 Zoe, douchen met wtw en Auer Edel Eau


  • msatter
  • Registratie: maart 2021
  • Niet online
Vandaag de WiFi device binnen gekregen en aangezien ik al RouterOS gebruik was de leercurve voor WiFi niet zo hoog. Ook de eerste keer dat ik een WiFi device heb van Mikrotik en het werk erg netjes en best gemakkelijk via Winbox.

Hij is supper klein en ik kan hem aan de wand schroeven en een kabel trekken naar de switch een verdieping lager. Er zitten twee WiFi Chains in net als in de WiFi stick van Goodwe en ik heb de tweede uitgezet omdat ik die niet ga gebruiken.



Blockschema: https://i.mt.lv/cdn/product_files/cAP_lite_180634.png
https://tweakers.net/pric...-cap-lite-rbcapl-2nd.html

Voeding kan via een USB adapter of je maakt gebruik van de bijgeleverde PoE met voeding adapter.

Ik zag dat er anderen ook aan programmeren zijn geslagen en ook een PVoutput zit erbij. :)

Acties:
  • +1Henk 'm!

  • msatter
  • Registratie: maart 2021
  • Niet online
Ik dacht dat mijn wachtwoord voor mijn WiFi uit de settings van de Goodwe was verdwenen omdat ik die niet meer zag als ik die via Modbus uitlas. Mijn wachtwoord was er nog en ik zag dat toen ik een uitgebreidere versie van de webinterface geinstalleerd had.

Ik had weer net te weinig tijd om alles te controleren maar hier kon ik mijn wachtwoord verwijderen door andere AP te kiezen in de buurt en er een dummy wachtwoord in te voeren. Dit zou ook kunnen de standaard versie van de web interface via Wizard.

Ik wilde STA uitzetten maar dat bleef ook niet plakken en morgen maar eens uitgebreider daarna kijken.

Werkt nu en er staat nu Burn-in als router en password. Ik heb de reload knop gebruikt op de WiFi stick.

Ik kan het IP adres van de AP veranderen maar dan verlies ik toegang via SolarGo omdat die alleen werkt op IP 10.10.100.253.

Nu ook via NodeRed PVOutput voeden met de waardes die @ThinkPad uitgesplitst had. Het was even puzzelen met welke waarden ik kon doorzenden en wat het gevonden flow had. Gelukkig ging verderop in de flow dezelfde PVOutput namen gebruiken. Mooi dan kan ik daar aansluiten.

Als morgen alles nog goed werkt dan kan ik dat hier posten opdat anderen het ook kunnen gebruiken.

[Voor 33% gewijzigd door msatter op 22-05-2021 21:52. Reden: PVOtput.org en iWeb]


Acties:
  • 0Henk 'm!

  • msatter
  • Registratie: maart 2021
  • Niet online
Verder bezig geweest en PVOutput werkt en de duur test loopt nu. Ik had nog wat glitches en die moet ik nog nog nader bekijken.

Nu kunnen ook meer dan één omvormer naar PVOutput verzonden worden ieders met hun eigen system-id, de API-key is immers hetzelfde. De system-id wordt in de timer gezet en dat is helemaal aan het begin van flow en dat maakt het mogelijk om voor iedere omvormer, sequentie (tijd), wel of niet naar PVOutput en naam apart in te stellen.

Tjonge dit is een boel werk zo en ik leer ook veel hiervan. Nu zit ik te denken om een stroom meter op de DIN-rail te plaatsen om ook het verschil tussen afgenomen en teruggeleverde stroom mee te kunnen zenden naar PVOutput. Dit gaat dan via MTTQ en ik heb al twee meters op het oog die de gegevens kunnen leveren.

Ik denk dat ik hem achter de hoofdschakelaar moet zetten om zowel teruglever en afname te kunnen zien. Voor de hoofdschakelaar (kant stroomleverancier) mag ik niets doen.

Acties:
  • 0Henk 'm!

  • msatter
  • Registratie: maart 2021
  • Niet online
PVOutput API-key ook verplaatst naar de timer&config en zo is de PV)output flow nu neutraal en bevat geen gegevens van de gebruiker.

Soms krijg ik geen waardes binnen van de omvormer en dat geeft gaten bij PVOutput. Bij het niet kunnen verbinden met PVOutput dan worden de gegevens gebufferd en om de minuut wordt dan geprobeerd om deze alsnog te verzenden. Deze mooie werking heb ik niet bedacht maar een flow genomen die in het forum van PVOutput beschikbaar was gemaakt.

Dit is de kale (lean) versie en doet alleen het lezen en het verzenden naar PVOutput.org en in de timers kun je noodzakelijke API-key en System-id uit jouw PVOutput account zetten.

Ik hoor graag over het beter kan en ik heb hier nog geen time-out voor het uitlezen van de Goodwe omvormer. Hier zit ook een sub-flow voor de PVOutput in die de verzending van de gegevens doet.

code:
1
[{"id":"801b0f90.623ea8","type":"tab","label":"Control and display live values inverter","disabled":false,"info":"Adoptation of the work by ThinkPad"},{"id":"ff01618d.60809","type":"subflow","name":"PVOutput upload","info":"Provided by **Vster Lee**\n[https://community.openenergymonitor.org/t/pvoutput-org-nodered/779/3]()\n\nAdapted for Goodwe UDP over WiFi by **msatter** [https://tweakers.net/gallery/1582350/]()","category":"","in":[{"x":40,"y":80,"wires":[{"id":"1a1e9c44.bce1f4"}]}],"out":[],"env":[],"meta":{},"color":"#DDAA99"},{"id":"516a7514.fae094","type":"udp out","z":"801b0f90.623ea8","name":"","addr":"","iface":"","port":"8899","ipv":"udp4","outport":"","base64":false,"multicast":"false","x":310,"y":80,"wires":[],"icon":"node-red/bridge.svg"},{"id":"f06e70e4.9be698","type":"function","z":"801b0f90.623ea8","name":"Req. values","func":"var inverter_ask = Buffer.from(\"7F0375940049D5C2\",\"hex\");\nvar ipaddress = msg.payload.ipa;\n\nmsg.ip = ipaddress;\nmsg.payload = inverter_ask;\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":150,"y":80,"wires":[["516a7514.fae094"]],"icon":"font-awesome/fa-sticky-note"},{"id":"8277276e.aa4838","type":"udp in","z":"801b0f90.623ea8","name":"","iface":"","port":"8899","ipv":"udp4","multicast":"false","group":"","datatype":"buffer","x":460,"y":80,"wires":[["c3f1b711.3b982"]],"icon":"node-red/bridge.svg"},{"id":"b7d1e792.f544b","type":"inject","z":"801b0f90.623ea8","name":"PVOutput, timer - config","props":[{"p":"payload.ipa","v":"10.10.100.253","vt":"str"},{"p":"payload.PVOid","v":"nnnnn","vt":"str"},{"p":"payload.APIkey","v":"nnnnn...","vt":"str"}],"repeat":"","crontab":"*/5 5-22 * * *","once":false,"onceDelay":0.1,"topic":"","x":170,"y":160,"wires":[["7326dc17.928594"]],"icon":"font-awesome/fa-pencil-square","info":"Prefix max. 6 charactes/numbers\nWhen sending also to PVOoutput.org then add the\nfollowing string (a-z)\n\npayload.PVOid = your PVO system-id (five numbers)"},{"id":"7326dc17.928594","type":"link out","z":"801b0f90.623ea8","name":"TimerConfig","links":["301762de.e10bbe","6e0fb1a2.416948","ef310d19.938f58"],"x":335,"y":220,"wires":[]},{"id":"ef310d19.938f58","type":"link in","z":"801b0f90.623ea8","name":"Req. values","links":["13a9767d.afa3aa","2bbcda70.e9e99e","7326dc17.928594"],"x":55,"y":80,"wires":[["f06e70e4.9be698"]]},{"id":"c3f1b711.3b982","type":"delay","z":"801b0f90.623ea8","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"3","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":620,"y":80,"wires":[["4e1640a7.b10de8"]],"icon":"font-awesome/fa-hand-stop-o"},{"id":"1a9c32f4.0a6195","type":"comment","z":"801b0f90.623ea8","name":"Request and process values provided by the inverter","info":"","x":240,"y":40,"wires":[]},{"id":"576863d4.d2162c","type":"inject","z":"801b0f90.623ea8","name":"Timer & config No2","props":[{"p":"payload.ipa","v":"10.10.100.253","vt":"str"},{"p":"payload.ssid","v":"no2","vt":"str"},{"p":"payload.APIkey","v":"nnnnnn......","vt":"str"},{"p":"payload.PVOid","v":"nnnnn","vt":"str"}],"repeat":"","crontab":"00 12 * * *","once":false,"onceDelay":"5","topic":"","x":160,"y":200,"wires":[["7326dc17.928594"]]},{"id":"69f5a1ee.df6a48","type":"inject","z":"801b0f90.623ea8","d":true,"name":"Timer & config No3","props":[{"p":"payload.ipa","v":"10.10.100.253","vt":"str"},{"p":"payload.ssid","v":"no3","vt":"str"}],"repeat":"","crontab":"*/5 4-22 * * *","once":true,"onceDelay":"10","topic":"","x":160,"y":240,"wires":[["7326dc17.928594"]]},{"id":"d68b8d43.29747","type":"http request","z":"ff01618d.60809","name":"Post","method":"POST","ret":"txt","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","authType":"","x":490,"y":60,"wires":[["d7346137.28cba"]]},{"id":"71cd2d97.8e32d4","type":"function","z":"ff01618d.60809","name":"Prepare Post","func":"msg.action = msg.payload;\nPVOsystemid = msg.payload.PVOsystemid;\nPVOAPIkey = msg.payload.PVOAPIkey;\n\nmsg.headers = {};\n//msg.headers['X-Pvoutput-Apikey'] = 'b9ebfcaa419189c2a8595617ad6bd8250ed8a2d9';\nmsg.headers['X-Pvoutput-Apikey'] = PVOAPIkey;\nmsg.headers['X-Pvoutput-SystemId'] = PVOsystemid;\nmsg.headers['Content-Type'] = 'application/x-www-form-urlencoded';\n\n////////////////////////////////////////////\nmsg.url = \"http://pvoutput.org/service/r2/addstatus.jsp\";\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":330,"y":80,"wires":[["ac542fdb.fa626","d68b8d43.29747"]],"icon":"font-awesome/fa-align-left"},{"id":"d7346137.28cba","type":"function","z":"ff01618d.60809","name":"Check Status 1","func":"if (msg.statusCode == 200) { \n   var stat = \"\";\n   flow.set('pvostat','200');  // this clears the outstanding PVO data, so it won't be uploaded again\n   var msg1 = null;\n   var msg2 = null;\n} else {\n   var time = new Date().toString();\n   flow.set('pvostat', msg.statusCode);\n   var stat = \"FAILED: Time:\" + time + \"  StatusCode:\" + msg.statusCode + \"  StatusMsg:\" + msg.payload;\n   var msg1 = null;\n   var msg2 = null;\n//   msg1.payload = stat;\n//   msg2.payload = stat;\n   var msg1 =  { payload: stat };\n   var msg2 =  { payload: stat };\n}\nreturn (msg1, msg2);","outputs":"2","noerr":0,"initialize":"","finalize":"","libs":[],"x":640,"y":60,"wires":[["8d14e679.b29678"],["fe3a3389.3b9b2"]],"icon":"font-awesome/fa-search"},{"id":"fe3a3389.3b9b2","type":"file","z":"ff01618d.60809","name":"PVO error log1","filename":"/opt/goodwe/pvoutput/pvo_errors.log","appendNewline":true,"createDir":true,"overwriteFile":"false","x":840,"y":100,"wires":[[]]},{"id":"ac542fdb.fa626","type":"function","z":"ff01618d.60809","name":"Store PVO data","func":"//store the PVO data in case it doesn't upload correctly\nflow.set ('pvodata',msg.payload)\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":640,"y":100,"wires":[[]],"icon":"node-red/redis.png"},{"id":"ba0c10e4.0b273","type":"http request","z":"ff01618d.60809","name":"Post2","method":"POST","ret":"txt","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","authType":"","x":650,"y":160,"wires":[["82678181.eee75"]]},{"id":"9f08c692.4c46a8","type":"function","z":"ff01618d.60809","name":"Retry Post","func":"msg.action = msg.payload;\nPVOsystemid = msg.payload.PVOsystemid;\nPVOAPIkey = msg.payload.PVOAPIkey;\n\nmsg.headers = {};\nmsg.headers['X-Pvoutput-Apikey'] = PVOAPIkey;\nmsg.headers['X-Pvoutput-SystemId'] = PVOsystemid;\nmsg.headers['Content-Type'] = 'application/x-www-form-urlencoded';\n\n////////////////////////////////////////////\nmsg.url = \"http://pvoutput.org/service/r2/addstatus.jsp\";\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":510,"y":160,"wires":[["ba0c10e4.0b273"]],"icon":"node-red/white-globe.svg"},{"id":"b22c7668.760e98","type":"inject","z":"ff01618d.60809","name":"Check every 1 min","props":[],"repeat":"60","crontab":"","once":false,"onceDelay":"","topic":"","x":140,"y":160,"wires":[["b638e83a.a1c888"]]},{"id":"82678181.eee75","type":"function","z":"ff01618d.60809","name":"Check Status 2 ","func":"if (msg.statusCode == 200) { \n   var time = new Date().toString();\n   var stat =\"\";\n   flow.set('pvostat', 200);  // this clears the outstanding PVO status, so it won't be uploaded again\n   var stat = \"SENTOK: Time:\" + time + \"  StatusCode:\" + msg.statusCode + \"  StatusMsg:\" + msg.payload;\n//   var msg1 = null;\n//   var msg2 = null;\n   var msg1 =  { payload: stat };\n   var msg2 =  { payload: stat };\n} else {\n   var time = new Date().toString();\n   flow.set('pvostat', msg.statusCode);\n   var stat = \"ReFAIL: Time:\" + time + \"  StatusCode:\" + msg.statusCode + \"  StatusMsg:\" + msg.payload;\n//   var msg1 = null;\n//   var msg2 = null;\n   var msg1 =  { payload: stat };\n   var msg2 =  { payload: stat };\n}\nreturn (msg1, msg2);","outputs":"2","noerr":0,"initialize":"","finalize":"","libs":[],"x":800,"y":160,"wires":[[],["30cf215d.ab8d0e"]],"icon":"font-awesome/fa-search"},{"id":"30cf215d.ab8d0e","type":"file","z":"ff01618d.60809","name":"PVO Error log2","filename":"/opt/goodwe/pvoutput/pvo_errors.log","appendNewline":true,"createDir":true,"overwriteFile":"false","x":840,"y":200,"wires":[[]]},{"id":"b638e83a.a1c888","type":"function","z":"ff01618d.60809","name":"Fetch PVO data","func":"//store the PVO data in case it doesn't upload correctly\nvar pvostat = flow.get('pvostat')||200;\nif (pvostat == 200) {\n    msg = null;\n} else {\n   var pvodata = flow.get('pvodata')||\"\";\n    msg.payload = pvodata;\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":340,"y":160,"wires":[["9f08c692.4c46a8"]],"icon":"node-red/redis.png"},{"id":"8d14e679.b29678","type":"file","z":"ff01618d.60809","name":"PVO Data","filename":"/opt/goodwe/pvoutput/PVO_data.log","appendNewline":true,"createDir":true,"overwriteFile":"false","x":820,"y":60,"wires":[[]]},{"id":"2696b14a.d9694e","type":"comment","z":"ff01618d.60809","name":"Check data sent OK and if not try to send it again","info":"The PVO website is busy and sometimes can't respond quickly enough and we get timeouts.\nThe next bit of code catches any errors and resubm its the code until it's sent OK.\n\nThat said, if it can't resend the data before the next data packet has to be sent (5 mins) then\nthe current packet will be lost. This is pretty rare though and won't be noticable on the graphs.\n","x":210,"y":120,"wires":[]},{"id":"5f830eb6.38a358","type":"comment","z":"ff01618d.60809","name":"Prepare values and then transfer those to PVOuput.org","info":"","x":220,"y":40,"wires":[]},{"id":"4e1640a7.b10de8","type":"change","z":"801b0f90.623ea8","name":"Not needed val.","rules":[{"t":"delete","p":"payload.ipa","pt":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":500,"y":160,"wires":[["fdd4f465.f60b3"]],"icon":"font-awesome/fa-filter"},{"id":"3921663d.c36b9a","type":"inject","z":"801b0f90.623ea8","name":"To PVoutput at midnight ","props":[{"p":"payload.ipa","v":"10.10.100.253","vt":"str"},{"p":"payload.ssid","v":"goodwe","vt":"str"},{"p":"payload.PVOid","v":"83914","vt":"str"},{"p":"payload.APIkey","v":"b9ebfcaa419189c2a8595617ad6bd8250ed8a2d9","vt":"str"}],"repeat":"","crontab":"59 23 * * *","once":false,"onceDelay":0.1,"topic":"","x":170,"y":280,"wires":[["7326dc17.928594"]]},{"id":"1a1e9c44.bce1f4","type":"function","z":"ff01618d.60809","name":"Prepare values","func":"var PVOsystemid = msg.payload[0].PVOid;\nvar PVOAPIkey = msg.payload[0].APIkey\nvar inverter_reply = msg.payload[1];\n\nvar message1 = inverter_reply.slice(2); // Remove 'AA55' from start of message\n//var message = message.slice(0, -2); //Remove two CRC bytes from end of message\nvar message = message1.slice(0, -2); //Remove two CRC bytes from end of message\n\nfunction crc16(buffer) {\n    var crc = 0xFFFF;\n    var odd;\n\n    for (var i = 0; i < buffer.length; i++) {\n        crc = crc ^ buffer[i];\n\n        for (var j = 0; j < 8; j++) {\n            odd = crc & 0x0001;\n            crc = crc >> 1;\n            if (odd) {\n                crc = crc ^ 0xA001;\n            }\n        }\n    }\n    return crc.toString(16);\n}\n\n//Calculate CRC ourselves\nvar calculated_crc = crc16(message);\n\n//Get CRC from inverter reply and un-reverse it\nvar reply_crc = inverter_reply.slice(-2).toString('hex');\nvar crc1 = reply_crc.slice(0, 2);\nvar crc2 = reply_crc.slice(-2);\nvar new_crc = crc2 + crc1;\n\nif (new_crc == calculated_crc) {\n    var year = \"20\" + inverter_reply.readInt8(5); // \n    var month = inverter_reply.readInt8(6); // \n    var day = inverter_reply.readInt8(7); // \n    var hour = inverter_reply.readInt8(8); // \n    var minutes1 = inverter_reply.readInt8(9); // \n\n    if(month.toString().length == 1)  { var month = '0'+month; }\n    if(day.toString().length == 1)    { var day = '0'+day;}\n    if(hour.toString().length == 1)   { var hour = '0'+hour; }\n    //if(minutes1.toString().length == 1) { var minutes1 = '0'+minutes1; }\n    var minutes = (minutes1 < 5 ? '0' : '') + minutes1;\n\nvar d = year + month + day;\nvar t = hour + \":\" + minutes;\nvar v1 = parseFloat((inverter_reply.readInt16BE(93) * 100).toFixed(1)); // eDay\nvar v2 = inverter_reply.readInt16BE(61);                                // production in Watt\nvar v5 = parseFloat((inverter_reply.readInt16BE(87) * 0.1).toFixed(1)); // v5 temperature\nvar v6 = parseFloat((inverter_reply.readInt16BE(41) * 0.1).toFixed(1)); // AC zijde\n\n    msg.payload = {\n        d,\n        t,\n        v1,\n        v2,\n        v5,\n        v6,\n        PVOsystemid,\n        PVOAPIkey\n    }\n\n    return msg;\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":160,"y":80,"wires":[["71cd2d97.8e32d4"]],"icon":"node-red/batch.svg"},{"id":"27513329.84761c","type":"comment","z":"801b0f90.623ea8","name":"PVOutput System-id merge with inverter values","info":"","x":600,"y":120,"wires":[]},{"id":"fdd4f465.f60b3","type":"join","z":"801b0f90.623ea8","name":"PVO-id + values","mode":"custom","build":"array","property":"payload","propertyType":"msg","key":"topic","joiner":"[32]","joinerType":"bin","accumulate":false,"timeout":"","count":"2","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":500,"y":200,"wires":[["5d4f4af.bba8234"]]},{"id":"6e0fb1a2.416948","type":"link in","z":"801b0f90.623ea8","name":"Prepare PVO+system-id","links":["8c7b70bd.db11a8","7326dc17.928594"],"x":355,"y":160,"wires":[["4e1640a7.b10de8"]]},{"id":"d35c5ab2.90aaa","type":"comment","z":"801b0f90.623ea8","name":"Transmit to PVOutput (subflow)","info":"","x":750,"y":240,"wires":[]},{"id":"e883ef0a.9d7f5","type":"switch","z":"801b0f90.623ea8","name":"Output to PVO?","property":"payload[0].PVOid","propertyType":"msg","rules":[{"t":"empty"},{"t":"nempty"}],"checkall":"true","repair":false,"outputs":2,"x":500,"y":280,"wires":[[],["407e80c8.75639"]],"icon":"node-red/white-globe.svg"},{"id":"5d4f4af.bba8234","type":"switch","z":"801b0f90.623ea8","name":"Values present?","property":"payload[1]","propertyType":"msg","rules":[{"t":"empty"},{"t":"nempty"}],"checkall":"true","repair":false,"outputs":2,"x":500,"y":240,"wires":[[],["e883ef0a.9d7f5"]]},{"id":"407e80c8.75639","type":"subflow:ff01618d.60809","z":"801b0f90.623ea8","name":"Feed PVOutput.org","env":[],"x":710,"y":280,"wires":[]},{"id":"acb5eb66.112ad8","type":"comment","z":"801b0f90.623ea8","name":"Req. values and transfer API-key and System-id","info":"","x":220,"y":120,"wires":[]}]


Deze versie is nog niet getest maar hier zit een time-out detectie in. Om de 20 seconden gaat er een nieuwe aanvraag naar de omvormer totdat er een antwoord komt van de omvormer.
Verder nu Groups gebruikt en aan het inkleuren geweest. Dit is nog niet live getest maar zou moeten werken.

code:
1
[{"id":"801b0f90.623ea8","type":"tab","label":"Control and display live values inverter","disabled":false,"info":"Adoptation of the work by ThinkPad"},{"id":"25c26ce6.9d762c","type":"subflow","name":"Prepare for PVOutput.org","info":"","category":"","in":[{"x":40,"y":40,"wires":[{"id":"4e1640a7.b10de8"}]}],"out":[{"x":360,"y":160,"wires":[{"id":"e883ef0a.9d7f5","port":1}]}],"env":[],"meta":{},"color":"#AAAA66","icon":"font-awesome/fa-filter"},{"id":"ff01618d.60809","type":"subflow","name":"PVOutput upload","info":"Provided by **Vster Lee**\n[https://community.openenergymonitor.org/t/pvoutput-org-nodered/779/3]()\n\nAdapted for Goodwe UDP over WiFi by **msatter** [https://tweakers.net/gallery/1582350/]()","category":"","in":[{"x":40,"y":80,"wires":[{"id":"1a1e9c44.bce1f4"}]}],"out":[],"env":[],"meta":{},"color":"#87A980","icon":"font-awesome/fa-line-chart","status":{"x":800,"y":60,"wires":[{"id":"d68b8d43.29747","port":0},{"id":"ba0c10e4.0b273","port":0}]}},{"id":"4b48967c.fcfc3","type":"group","z":"801b0f90.623ea8","name":"Handing over to subflow nodes","style":{"stroke":"none","fill":"#addb7b","label":true,"label-position":"se","color":"#ffffff"},"nodes":["6e0fb1a2.416948","407e80c8.75639","930318c6.0ba1a"],"x":414,"y":199,"w":332,"h":130},{"id":"8ae4ca85.96da48","type":"group","z":"801b0f90.623ea8","name":"Request values from the inverter, with time-out detection / CRC check with retry.","style":{"stroke-opacity":"0","fill":"#7fb7df","label":true,"label-position":"se","color":"#ffffff"},"nodes":["516a7514.fae094","f06e70e4.9be698","8277276e.aa4838","c3f1b711.3b982","2d33f88c.5b3218","39c47589.21ca4a","163864be.8bd53b","97508752.1cd3a8","11627800.6500a","57ba3d31.c82a94","61584504.656bb4"],"x":34,"y":39,"w":742,"h":130},{"id":"d6e3f503.b6b34","type":"group","z":"801b0f90.623ea8","name":"Request values, transfer API-key and System-id","style":{"stroke":"none","fill":"#3f5787","label":true,"label-position":"se","color":"#ffffff"},"nodes":["b7d1e792.f544b","7326dc17.928594","576863d4.d2162c","69f5a1ee.df6a48","3921663d.c36b9a"],"x":34,"y":179,"w":362,"h":210},{"id":"4e1640a7.b10de8","type":"change","z":"25c26ce6.9d762c","name":"Not needed val.","rules":[{"t":"delete","p":"payload.ipa","pt":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":200,"y":40,"wires":[["fdd4f465.f60b3"]],"icon":"font-awesome/fa-filter"},{"id":"fdd4f465.f60b3","type":"join","z":"25c26ce6.9d762c","name":"PVO-id + values","mode":"custom","build":"array","property":"payload","propertyType":"msg","key":"topic","joiner":"[32]","joinerType":"bin","accumulate":false,"timeout":"297","count":"2","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":200,"y":80,"wires":[["5d4f4af.bba8234"]],"info":"A time-out of 297 seconds after the first message so that all is cleaned up for the next update. "},{"id":"e883ef0a.9d7f5","type":"switch","z":"25c26ce6.9d762c","name":"Output to PVO?","property":"payload[0].PVOid","propertyType":"msg","rules":[{"t":"empty"},{"t":"nempty"}],"checkall":"true","repair":false,"outputs":2,"x":200,"y":160,"wires":[[],[]],"icon":"node-red/white-globe.svg"},{"id":"5d4f4af.bba8234","type":"switch","z":"25c26ce6.9d762c","name":"Values present?","property":"payload[1]","propertyType":"msg","rules":[{"t":"empty"},{"t":"nempty"}],"checkall":"true","repair":false,"outputs":2,"x":200,"y":120,"wires":[[],["e883ef0a.9d7f5"]]},{"id":"6e0fb1a2.416948","type":"link in","z":"801b0f90.623ea8","g":"4b48967c.fcfc3","name":"Prepare PVO+system-id","links":["8c7b70bd.db11a8","7326dc17.928594","2d33f88c.5b3218"],"x":455,"y":240,"wires":[["930318c6.0ba1a"]]},{"id":"407e80c8.75639","type":"subflow:ff01618d.60809","z":"801b0f90.623ea8","g":"4b48967c.fcfc3","name":"Transmit values to PVOutput","env":[],"x":600,"y":280,"wires":[]},{"id":"930318c6.0ba1a","type":"subflow:25c26ce6.9d762c","z":"801b0f90.623ea8","g":"4b48967c.fcfc3","name":"Prepare values for PVOutput","env":[],"x":600,"y":240,"wires":[["407e80c8.75639"]]},{"id":"516a7514.fae094","type":"udp out","z":"801b0f90.623ea8","g":"8ae4ca85.96da48","name":"","addr":"","iface":"","port":"8899","ipv":"udp4","outport":"","base64":false,"multicast":"false","x":290,"y":80,"wires":[],"icon":"node-red/bridge.svg"},{"id":"f06e70e4.9be698","type":"function","z":"801b0f90.623ea8","g":"8ae4ca85.96da48","name":"Req. values","func":"var inverter_ask = Buffer.from(\"7F0375940049D5C2\",\"hex\");\nvar ipaddress = msg.payload.ipa;\n\nmsg.ip = ipaddress;\nmsg.payload = inverter_ask;\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":130,"y":80,"wires":[["516a7514.fae094"]],"icon":"font-awesome/fa-sticky-note"},{"id":"8277276e.aa4838","type":"udp in","z":"801b0f90.623ea8","g":"8ae4ca85.96da48","name":"","iface":"","port":"8899","ipv":"udp4","multicast":"false","group":"","datatype":"buffer","x":440,"y":80,"wires":[["61584504.656bb4"]],"icon":"node-red/bridge.svg"},{"id":"c3f1b711.3b982","type":"delay","z":"801b0f90.623ea8","g":"8ae4ca85.96da48","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"6","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":480,"y":120,"wires":[["39c47589.21ca4a"]],"icon":"font-awesome/fa-hand-stop-o"},{"id":"2d33f88c.5b3218","type":"link out","z":"801b0f90.623ea8","g":"8ae4ca85.96da48","name":"Recieved UDP/8899","links":["6e0fb1a2.416948"],"x":735,"y":80,"wires":[]},{"id":"39c47589.21ca4a","type":"switch","z":"801b0f90.623ea8","g":"8ae4ca85.96da48","name":"Time-out?","property":"payload.ipa","propertyType":"msg","rules":[{"t":"null"},{"t":"nnull"}],"checkall":"true","repair":false,"outputs":2,"x":640,"y":120,"wires":[["2d33f88c.5b3218"],["163864be.8bd53b"]]},{"id":"163864be.8bd53b","type":"link out","z":"801b0f90.623ea8","g":"8ae4ca85.96da48","name":"Repeat request","links":["11627800.6500a"],"x":735,"y":120,"wires":[]},{"id":"97508752.1cd3a8","type":"delay","z":"801b0f90.623ea8","g":"8ae4ca85.96da48","name":"","pauseType":"delay","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":320,"y":120,"wires":[["c3f1b711.3b982"]]},{"id":"11627800.6500a","type":"link in","z":"801b0f90.623ea8","g":"8ae4ca85.96da48","name":"Request values","links":["163864be.8bd53b","7326dc17.928594"],"x":75,"y":120,"wires":[["57ba3d31.c82a94"]]},{"id":"57ba3d31.c82a94","type":"delay","z":"801b0f90.623ea8","g":"8ae4ca85.96da48","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"minutes","rate":"3","nbRateUnits":"1","rateUnits":"minute","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":170,"y":120,"wires":[["f06e70e4.9be698","97508752.1cd3a8"]],"icon":"font-awesome/fa-hand-stop-o"},{"id":"61584504.656bb4","type":"function","z":"801b0f90.623ea8","g":"8ae4ca85.96da48","name":"CRC-check","func":"var inverter_reply = msg.payload;\n\nvar message1 = inverter_reply.slice(2); // Remove 'AA55' from start of message\n//var message = message.slice(0, -2); //Remove two CRC bytes from end of message\nvar message = message1.slice(0, -2); //Remove two CRC bytes from end of message\n\nfunction crc16(buffer) {\n    var crc = 0xFFFF;\n    var odd;\n\n    for (var i = 0; i < buffer.length; i++) {\n        crc = crc ^ buffer[i];\n\n        for (var j = 0; j < 8; j++) {\n            odd = crc & 0x0001;\n            crc = crc >> 1;\n            if (odd) {\n                crc = crc ^ 0xA001;\n            }\n        }\n    }\n    return crc.toString(16);\n}\n\n//Calculate CRC ourselves\nvar calculated_crc = crc16(message);\n\n//Get CRC from inverter reply and un-reverse it\nvar reply_crc = inverter_reply.slice(-2).toString('hex');\nvar crc1 = reply_crc.slice(0, 2);\nvar crc2 = reply_crc.slice(-2);\nvar new_crc = crc2 + crc1;\n\nif (new_crc == calculated_crc) {\n// If the checksum is not correct retry to get a good string.\n\n    return msg;\n// Also the wait for power delevery to the net could here be checked.\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":590,"y":80,"wires":[["c3f1b711.3b982"]],"icon":"font-awesome/fa-arrows-h"},{"id":"b7d1e792.f544b","type":"inject","z":"801b0f90.623ea8","g":"d6e3f503.b6b34","name":"PVOutput, timer - config","props":[{"p":"payload.ipa","v":"10.10.100.253","vt":"str"},{"p":"payload.PVOid","v":"nnnnn","vt":"str"},{"p":"payload.APIkey","v":"nnnnnnn......","vt":"str"}],"repeat":"","crontab":"*/5 5-22 * * *","once":false,"onceDelay":0.1,"topic":"","x":190,"y":220,"wires":[["7326dc17.928594"]],"icon":"font-awesome/fa-pencil-square","info":"Prefix max. 6 charactes/numbers\nWhen sending also to PVOoutput.org then add the\nfollowing string (a-z)\n\npayload.PVOid = your PVO system-id (five numbers)"},{"id":"7326dc17.928594","type":"link out","z":"801b0f90.623ea8","g":"d6e3f503.b6b34","name":"TimerConfig","links":["11627800.6500a","6e0fb1a2.416948"],"x":355,"y":280,"wires":[]},{"id":"576863d4.d2162c","type":"inject","z":"801b0f90.623ea8","d":true,"g":"d6e3f503.b6b34","name":"Timer & config No2","props":[],"repeat":"","crontab":"*/5 5-22 * * *","once":false,"onceDelay":"5","topic":"","x":180,"y":260,"wires":[["7326dc17.928594"]]},{"id":"69f5a1ee.df6a48","type":"inject","z":"801b0f90.623ea8","d":true,"g":"d6e3f503.b6b34","name":"Timer & config No3","props":[{"p":"payload.ipa","v":"10.10.100.253","vt":"str"},{"p":"payload.ssid","v":"no3","vt":"str"}],"repeat":"","crontab":"*/5 4-22 * * *","once":true,"onceDelay":"10","topic":"","x":180,"y":300,"wires":[["7326dc17.928594"]]},{"id":"3921663d.c36b9a","type":"inject","z":"801b0f90.623ea8","d":true,"g":"d6e3f503.b6b34","name":"To PVoutput at midnight ","props":[{"p":"payload.ipa","v":"10.10.100.253","vt":"str"},{"p":"payload.ssid","v":"goodwe","vt":"str"},{"p":"payload.PVOid","v":"nnnnn","vt":"str"},{"p":"payload.APIkey","v":"nnnnnn...,,","vt":"str"}],"repeat":"","crontab":"59 23 * * *","once":false,"onceDelay":0.1,"topic":"","x":190,"y":340,"wires":[["7326dc17.928594"]],"info":"This needed when also sending not only generated power but also consumed power."},{"id":"d68b8d43.29747","type":"http request","z":"ff01618d.60809","name":"Post","method":"POST","ret":"txt","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","authType":"","x":490,"y":60,"wires":[["d7346137.28cba","b638e83a.a1c888"]]},{"id":"71cd2d97.8e32d4","type":"function","z":"ff01618d.60809","name":"Prepare Post","func":"msg.action = msg.payload;\nPVOsystemid = msg.payload.PVOsystemid;\nPVOAPIkey = msg.payload.PVOAPIkey;\n\nmsg.headers = {};\n//msg.headers['X-Pvoutput-Apikey'] = 'b9ebfcaa419189c2a8595617ad6bd8250ed8a2d9';\nmsg.headers['X-Pvoutput-Apikey'] = PVOAPIkey;\nmsg.headers['X-Pvoutput-SystemId'] = PVOsystemid;\nmsg.headers['Content-Type'] = 'application/x-www-form-urlencoded';\n\n////////////////////////////////////////////\nmsg.url = \"http://pvoutput.org/service/r2/addstatus.jsp\";\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":330,"y":80,"wires":[["d68b8d43.29747","ac542fdb.fa626"]],"icon":"font-awesome/fa-align-left"},{"id":"d7346137.28cba","type":"function","z":"ff01618d.60809","name":"Check Status 1st","func":"var d=new Date();\nvar hours=('00' + d.getHours()).slice(-2);\nvar minutes=('00' + (d.getMinutes()+1)).slice(-2);\n// adding a space behind the time so that the lenght of the line is 314 characters in the log\nTime = hours+\":\"+minutes+\" \"\n\nif (msg.statusCode == 200) { \n   var stat = \"\";\n   flow.set('pvostat','200');  // this clears the outstanding PVO data, so it won't be uploaded again\n   var msg1 = null;\n   var msg2 = null;\n   // new status message\n   //msg.status.text =Time + \" \" + msg.status;\n} else {\n   var time = new Date().toString();\n   flow.set('pvostat', msg.statusCode);\n   stat = \"FAILED: Time:\" + time + \"  StatusCode:\" + msg.statusCode + \"  StatusMsg:\" + msg.payload;\n   //var msg1 = null;\n   //var msg2 = null;\n   msg1.payload = stat;\n   msg2.payload = stat;\n   var msg1 =  { payload: stat };\n   var msg2 =  { payload: stat };\n   //msg.status.text = Time + \" \" + msg.status;\n}\nreturn msg;\nreturn (msg1, msg2);","outputs":2,"noerr":0,"initialize":"","finalize":"","libs":[],"x":730,"y":100,"wires":[[],["fe3a3389.3b9b2"]],"icon":"font-awesome/fa-search"},{"id":"fe3a3389.3b9b2","type":"file","z":"ff01618d.60809","name":"PVO error log","filename":"/opt/goodwe/pvoutput/pvo_errors.log","appendNewline":true,"createDir":true,"overwriteFile":"false","x":920,"y":120,"wires":[[]]},{"id":"ac542fdb.fa626","type":"function","z":"ff01618d.60809","name":"Store PVO data","func":"//store the PVO data in case it doesn't upload correctly\nflow.set ('pvodata',msg.payload)\nreturn msg;","outputs":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":500,"y":100,"wires":[],"icon":"node-red/redis.png"},{"id":"ba0c10e4.0b273","type":"http request","z":"ff01618d.60809","name":"Re-Post","method":"POST","ret":"txt","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","authType":"","x":520,"y":200,"wires":[["82678181.eee75"]]},{"id":"9f08c692.4c46a8","type":"function","z":"ff01618d.60809","name":"Prepare retransmit","func":"msg.action = msg.payload;\nPVOsystemid = msg.payload.PVOsystemid;\nPVOAPIkey = msg.payload.PVOAPIkey;\n\nmsg.headers = {};\nmsg.headers['X-Pvoutput-Apikey'] = PVOAPIkey;\nmsg.headers['X-Pvoutput-SystemId'] = PVOsystemid;\nmsg.headers['Content-Type'] = 'application/x-www-form-urlencoded';\n\n////////////////////////////////////////////\nmsg.url = \"http://pvoutput.org/service/r2/addstatus.jsp\";\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":350,"y":200,"wires":[["ba0c10e4.0b273"]],"icon":"node-red/white-globe.svg"},{"id":"82678181.eee75","type":"function","z":"ff01618d.60809","name":"Check Status 2nd","func":"if (msg.statusCode == 200) { \n   var time = new Date().toString();\n   var stat =\"\";\n   flow.set('pvostat', 200);  // this clears the outstanding PVO status, so it won't be uploaded again\n   var stat = \"RetransmitOK: Time:\" + time + \"  StatusCode:\" + msg.statusCode + \"  StatusMsg:\" + msg.payload;\n//   var msg1 = null;\n//   var msg2 = null;\n   var msg1 =  { payload: stat };\n   var msg2 =  { payload: stat };\n} else {\n   var time = new Date().toString();\n   flow.set('pvostat', msg.statusCode);\n   var stat = \"RetransmitFAIL: Time:\" + time + \"  StatusCode:\" + msg.statusCode + \"  StatusMsg:\" + msg.payload;\n//   var msg1 = null;\n//   var msg2 = null;\n   var msg1 =  { payload: stat };\n   var msg2 =  { payload: stat };\n}\nreturn (msg1, msg2);","outputs":"2","noerr":0,"initialize":"","finalize":"","libs":[],"x":730,"y":200,"wires":[["bc2c0f21.a7735"],["30cf215d.ab8d0e"]],"icon":"font-awesome/fa-search"},{"id":"30cf215d.ab8d0e","type":"file","z":"ff01618d.60809","name":"Retransmit fail","filename":"/opt/goodwe/pvoutput/pvo_errors.log","appendNewline":true,"createDir":true,"overwriteFile":"false","x":920,"y":220,"wires":[[]]},{"id":"b638e83a.a1c888","type":"function","z":"ff01618d.60809","name":"Fetch PVO data","func":"// Retransmit the PVO data in case it doesn't upload correctly the first time\n\nif (msg.statusCode != 200) { \n    \n// retrieve local stored data\n   var pvodata = flow.get('pvodata')||\"\";\n    msg.payload = pvodata;\n\nreturn msg;\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":160,"y":200,"wires":[["9f08c692.4c46a8"]],"icon":"node-red/redis.png"},{"id":"8d14e679.b29678","type":"file","z":"ff01618d.60809","name":"PVO Data","filename":"/opt/goodwe/pvoutput/PVO_data.log","appendNewline":true,"createDir":true,"overwriteFile":"false","x":900,"y":80,"wires":[[]]},{"id":"2696b14a.d9694e","type":"comment","z":"ff01618d.60809","name":"Check data sent OK and if not retransmit once","info":"The PVO website is busy and sometimes can't respond quickly enough and we get timeouts.\nThe next bit of code catches any errors and resubm its the code until it's sent OK.\n\nThat said, if it can't resend the data before the next data packet has to be sent (5 mins) then\nthe current packet will be lost. This is pretty rare though and won't be noticable on the graphs.\n","x":200,"y":160,"wires":[]},{"id":"5f830eb6.38a358","type":"comment","z":"ff01618d.60809","name":"Prepare values and then transfer those to PVOuput.org","info":"","x":220,"y":40,"wires":[]},{"id":"1a1e9c44.bce1f4","type":"function","z":"ff01618d.60809","name":"Prepare values","func":"var PVOsystemid = msg.payload[0].PVOid;\nvar PVOAPIkey = msg.payload[0].APIkey\nvar inverter_reply = msg.payload[1];\n\nvar message1 = inverter_reply.slice(2); // Remove 'AA55' from start of message\n//var message = message.slice(0, -2); //Remove two CRC bytes from end of message\nvar message = message1.slice(0, -2); //Remove two CRC bytes from end of message\n\nfunction crc16(buffer) {\n    var crc = 0xFFFF;\n    var odd;\n\n    for (var i = 0; i < buffer.length; i++) {\n        crc = crc ^ buffer[i];\n\n        for (var j = 0; j < 8; j++) {\n            odd = crc & 0x0001;\n            crc = crc >> 1;\n            if (odd) {\n                crc = crc ^ 0xA001;\n            }\n        }\n    }\n    return crc.toString(16);\n}\n\n//Calculate CRC ourselves\nvar calculated_crc = crc16(message);\n\n//Get CRC from inverter reply and un-reverse it\nvar reply_crc = inverter_reply.slice(-2).toString('hex');\nvar crc1 = reply_crc.slice(0, 2);\nvar crc2 = reply_crc.slice(-2);\nvar new_crc = crc2 + crc1;\n\nif (new_crc == calculated_crc) {\n    var year = \"20\" + inverter_reply.readInt8(5); // \n    var month = inverter_reply.readInt8(6); // \n    var day = inverter_reply.readInt8(7); // \n    var hour = inverter_reply.readInt8(8); // \n    var minutes1 = inverter_reply.readInt8(9); // \n\n    if(month.toString().length == 1)  { var month = '0'+month; }\n    if(day.toString().length == 1)    { var day = '0'+day;}\n    if(hour.toString().length == 1)   { var hour = '0'+hour; }\n    //if(minutes1.toString().length == 1) { var minutes1 = '0'+minutes1; }\n    var minutes = (minutes1 < 5 ? '0' : '') + minutes1;\n\nvar d = year + month + day;\nvar t = hour + \":\" + minutes;\nvar v1 = parseFloat((inverter_reply.readInt16BE(93) * 100).toFixed(1)); // eDay\nvar v2 = inverter_reply.readInt16BE(61);                                // production in Watt\nvar v5 = parseFloat((inverter_reply.readInt16BE(87) * 0.1).toFixed(1)); // v5 temperature\nvar v6 = parseFloat((inverter_reply.readInt16BE(41) * 0.1).toFixed(1)); // AC zijde\n\n    msg.payload = {\n        d,\n        t,\n        v1,\n        v2,\n        v5,\n        v6,\n        PVOsystemid,\n        PVOAPIkey\n    }\n\n    return msg;\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":160,"y":80,"wires":[["71cd2d97.8e32d4","106f84dd.f8d73b"]],"icon":"node-red/batch.svg"},{"id":"106f84dd.f8d73b","type":"file","z":"ff01618d.60809","name":"save-values","filename":"/opt/goodwe/nodered/saved-values.txt","appendNewline":true,"createDir":true,"overwriteFile":"false","encoding":"ascii","x":530,"y":20,"wires":[[]]},{"id":"bc2c0f21.a7735","type":"file","z":"ff01618d.60809","name":"Retransmit OK","filename":"/opt/goodwe/pvoutput/PVO_data.log","appendNewline":true,"createDir":true,"overwriteFile":"false","encoding":"none","x":920,"y":180,"wires":[[]]}]




Update:
Nieuwe versie met CRC check (glitch 3). Als de CRC ( @ThinkPad ) niet juist is dan loopt nog steeds in time-out de teller en die doet dan een nieuwe uitlees poging bij de omvormer......net zolang totdat het goed is. ;)

Ik was dus vroeger wakker dan de omvormer en zat te wachten totdat die ging leveren maar er was nog te weinig licht daarvoor. Na 35 minuten hoorde ik het relais klikken in de omvormer en ging die leveren en in die 35 minuten zag ik dat de omvormer in de "Wait" stand stond. Er worden wel temperatuur en voltage gezonden maar nog geen opgewekte stroom waardes. Ik laat dit zo en ik kan zo ook de wachttijd zien bij PVOutput.

Update:
Glitch 4 is ook gevonden. Bij het niet kunnen verbinden met PVOutput werd later de gegevens alsnog verzonden. Helaas werkte dat niet meer sinds het PVOutput deel naar een sub-flow was verplaatst. In een sub-flow bestaat er geen tijd en timers and delays werken daar niet. Nu direct na de eerste poging een tweede poging en als die slaagt dan staat het ook in het log-bestand als RetransmitOK.

Update:
De volgende versie en hier mogelijke probleem ondervangen met het samenvoegen van de waardes. Erg mooi is dat het herzenden naar PVOutput goed werkt en ik zie dat in het log. Het log logt alleen herzendingen en problemen met de verzending.
Ik heb nog niet getest hoelang het locaal opslaan werkt als de internet verbinding eruit ligt.

Update: het belang van de herzendingen en je ziet op de laatste regel ook een update voor PVOutput die niet verzonden kon worden. Deze ontbreekt ook by PVOutput


code:
1
2
3
4
5
RetransmitOK: Time:Tue May 25 2021 07:47:00 GMT+0200 (Central European Summer Time)  StatusCode:200  StatusMsg:OK 200: Added Status
RetransmitOK: Time:Tue May 25 2021 07:57:00 GMT+0200 (Central European Summer Time)  StatusCode:200  StatusMsg:OK 200: Added Status
RetransmitOK: Time:Tue May 25 2021 08:07:00 GMT+0200 (Central European Summer Time)  StatusCode:200  StatusMsg:OK 200: Added Status
RetransmitOK: Time:Tue May 25 2021 09:17:00 GMT+0200 (Central European Summer Time)  StatusCode:200  StatusMsg:OK 200: Added Status
RetransmitFAIL: Time:Tue May 25 2021 10:09:00 GMT+0200 (Central European Summer Time)  StatusCode:ETIMEDOUT  StatusMsg:Error: ETIMEDOUT : http://pvoutput.org/service/r2/addstatus.jsp

[Voor 159% gewijzigd door msatter op 25-05-2021 11:10. Reden: Node Red: PVOutput.org en later een versie met time-out en groups]


Acties:
  • +3Henk 'm!

  • Aiolos
  • Registratie: januari 2002
  • Laatst online: 15:11
Vanuit dit topic ben ik vandaag ook eens bezig gegaan met het uitlezen via UDP. Uiteraard in nog een andere taal dan hier al gedaan, en wel PHP.
Het resultaat is hier te bekijken: https://github.com/aiolos/GoodweUdpReader

De broadcast heb ik overgeslagen, in de configuratie moet je gewoon een ip-adres invullen (of meerdere als je meerdere omvormers hebt). Als je ook een PVOutput apikey en system id invult, worden de gegevens naar PVOutput gepushed.

Ik heb het vandaag in elkaar geklust, nog maar weinig getest en vooral de 'happy-path'.

Stuur me een PM voor Wemos D1 shields voor het uitlezen van slimme meters of het aansturen van Itho mechanische ventilatie (of kijk op V&A: https://tweakers.net/aanbod/user/47321/)


Acties:
  • +1Henk 'm!

  • msatter
  • Registratie: maart 2021
  • Niet online
Ik heb het gevoel dat ik niets meer kan toevoegen aan de PVOutput flow voor Node Red. Nieuw sinds de vorige versie is dat nu het opnieuw proberen om de omvormer uit te lezen is beperkt (timestamp) en zo geen overlap meer. De status van upload naar PVOutput is zichtbaar en daarbij is gekomen de het tijdstip van de laatste geslaagde uitlezing van de omvormer.

Verder is het correct zijn van de gegevens beter en zo is mogelijk om altijd geldige gegevens naar PVOutput te uploaden.



code:
1
[{"id":"801b0f90.623ea8","type":"tab","label":"Inverter2PVOutput","disabled":false,"info":"Scripted by msatter\nversion: 20210526-1.10\nOnly for non-comercial usage"},{"id":"25c26ce6.9d762c","type":"subflow","name":"Prepare for PVOutput.org","info":"Version:20210526-1.10","category":"","in":[{"x":40,"y":40,"wires":[{"id":"4e1640a7.b10de8"}]}],"out":[{"x":380,"y":160,"wires":[{"id":"e883ef0a.9d7f5","port":1}]}],"env":[],"meta":{},"color":"#AAAA66","icon":"font-awesome/fa-filter","status":{"x":540,"y":200,"wires":[{"id":"a0cff14b.2baee8","port":0}]}},{"id":"ff01618d.60809","type":"subflow","name":"PVOutput upload","info":"Provided by **Vster Lee**\n[https://community.openenergymonitor.org/t/pvoutput-org-nodered/779/3]()\n\nAdapted for Goodwe UDP over WiFi by **msatter** [https://tweakers.net/gallery/1582350/]()\n\nVersio 20210526-1.15","category":"","in":[{"x":40,"y":80,"wires":[{"id":"1a1e9c44.bce1f4"}]}],"out":[],"env":[],"meta":{},"color":"#87A980","icon":"font-awesome/fa-line-chart","status":{"x":800,"y":60,"wires":[{"id":"d68b8d43.29747","port":0},{"id":"ba0c10e4.0b273","port":0}]}},{"id":"4b48967c.fcfc3","type":"group","z":"801b0f90.623ea8","name":"Handing over to subflow nodes, status diplayed","style":{"stroke":"none","fill":"#addb7b","label":true,"label-position":"se","color":"#ffffff"},"nodes":["6e0fb1a2.416948","407e80c8.75639","930318c6.0ba1a"],"x":534,"y":199,"w":332,"h":150},{"id":"8ae4ca85.96da48","type":"group","z":"801b0f90.623ea8","name":"Retrieve values from the inverter, with time-out detection / CRC check with retry till TTL has become invalid.","style":{"stroke-opacity":"0","fill":"#7fb7df","label":true,"color":"#ffffff"},"nodes":["516a7514.fae094","f06e70e4.9be698","8277276e.aa4838","c3f1b711.3b982","2d33f88c.5b3218","39c47589.21ca4a","97508752.1cd3a8","11627800.6500a","57ba3d31.c82a94","61584504.656bb4","c48649f.4f33938","ca20bfa3.9a4018","97d4ca32.f3eab","8d4b9241.9ebfb"],"x":54,"y":19,"w":812,"h":162},{"id":"d6e3f503.b6b34","type":"group","z":"801b0f90.623ea8","name":"Request values, transfer API-key and System-id","style":{"stroke":"none","fill":"#3f5787","label":true,"label-position":"se","color":"#ffffff"},"nodes":["b7d1e792.f544b","7326dc17.928594","576863d4.d2162c","69f5a1ee.df6a48","3921663d.c36b9a"],"x":54,"y":199,"w":432,"h":210},{"id":"4e1640a7.b10de8","type":"change","z":"25c26ce6.9d762c","name":"Not needed values","rules":[{"t":"delete","p":"payload.ipa","pt":"msg"},{"t":"delete","p":"payload.TTL","pt":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":210,"y":40,"wires":[["fdd4f465.f60b3"]],"icon":"font-awesome/fa-filter"},{"id":"fdd4f465.f60b3","type":"join","z":"25c26ce6.9d762c","name":"Put values in a array","mode":"custom","build":"array","property":"payload","propertyType":"msg","key":"topic","joiner":"[32]","joinerType":"bin","accumulate":false,"timeout":"290","count":"","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":220,"y":80,"wires":[["5edda9f.62c3158"]],"info":"A time-out of 297 seconds after the first message so that all is cleaned up for the next update. "},{"id":"e883ef0a.9d7f5","type":"switch","z":"25c26ce6.9d762c","name":"Array [0] well formed","property":"payload[0].PVOid","propertyType":"msg","rules":[{"t":"empty"},{"t":"nempty"}],"checkall":"true","repair":false,"outputs":2,"x":220,"y":160,"wires":[[],["a0cff14b.2baee8"]],"icon":"node-red/white-globe.svg"},{"id":"6e0fb1a2.416948","type":"link in","z":"801b0f90.623ea8","g":"4b48967c.fcfc3","name":"Prepare PVO+system-id","links":["2d33f88c.5b3218","7326dc17.928594"],"x":575,"y":240,"wires":[["930318c6.0ba1a"]],"icon":"font-awesome/fa-arrow-right"},{"id":"407e80c8.75639","type":"subflow:ff01618d.60809","z":"801b0f90.623ea8","g":"4b48967c.fcfc3","name":"Transmit values to PVOutput","env":[],"x":720,"y":300,"wires":[]},{"id":"930318c6.0ba1a","type":"subflow:25c26ce6.9d762c","z":"801b0f90.623ea8","g":"4b48967c.fcfc3","name":"Prepare values for PVOutput","env":[],"x":720,"y":240,"wires":[["407e80c8.75639"]]},{"id":"516a7514.fae094","type":"udp out","z":"801b0f90.623ea8","g":"8ae4ca85.96da48","name":"","addr":"","iface":"","port":"8899","ipv":"udp4","outport":"","base64":false,"multicast":"false","x":310,"y":60,"wires":[],"icon":"node-red/bridge.svg"},{"id":"f06e70e4.9be698","type":"function","z":"801b0f90.623ea8","g":"8ae4ca85.96da48","name":"Req. values","func":"var inverter_ask = Buffer.from(\"7F0375940049D5C2\",\"hex\");\nvar ipaddress = msg.payload.ipa;\n\nmsg.ip = ipaddress;\nmsg.payload = inverter_ask;\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":150,"y":60,"wires":[["516a7514.fae094"]],"icon":"font-awesome/fa-sticky-note"},{"id":"8277276e.aa4838","type":"udp in","z":"801b0f90.623ea8","g":"8ae4ca85.96da48","name":"","iface":"","port":"8899","ipv":"udp4","multicast":"false","group":"","datatype":"buffer","x":460,"y":60,"wires":[["61584504.656bb4"]],"icon":"node-red/bridge.svg"},{"id":"c3f1b711.3b982","type":"delay","z":"801b0f90.623ea8","g":"8ae4ca85.96da48","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"6","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":500,"y":100,"wires":[["39c47589.21ca4a"]],"icon":"font-awesome/fa-hand-stop-o"},{"id":"2d33f88c.5b3218","type":"link out","z":"801b0f90.623ea8","g":"8ae4ca85.96da48","name":"Publish","links":["6e0fb1a2.416948"],"x":780,"y":60,"wires":[],"icon":"font-awesome/fa-arrow-down","l":true},{"id":"39c47589.21ca4a","type":"switch","z":"801b0f90.623ea8","g":"8ae4ca85.96da48","name":"Values","property":"payload.ipa","propertyType":"msg","rules":[{"t":"null"},{"t":"nnull"}],"checkall":"true","repair":false,"outputs":2,"x":650,"y":100,"wires":[["2d33f88c.5b3218"],["c48649f.4f33938"]],"inputLabels":["Valid"],"outputLabels":["YES","NO"],"icon":"font-awesome/fa-check-square"},{"id":"97508752.1cd3a8","type":"delay","z":"801b0f90.623ea8","g":"8ae4ca85.96da48","name":"","pauseType":"delay","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":320,"y":100,"wires":[["c3f1b711.3b982"]]},{"id":"11627800.6500a","type":"link in","z":"801b0f90.623ea8","g":"8ae4ca85.96da48","name":"Retrieve values","links":["7326dc17.928594","97d4ca32.f3eab"],"x":160,"y":140,"wires":[["57ba3d31.c82a94"]],"icon":"font-awesome/fa-arrow-right","l":true},{"id":"57ba3d31.c82a94","type":"delay","z":"801b0f90.623ea8","g":"8ae4ca85.96da48","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"minutes","rate":"3","nbRateUnits":"1","rateUnits":"minute","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":150,"y":100,"wires":[["97508752.1cd3a8","f06e70e4.9be698"]],"icon":"font-awesome/fa-hand-stop-o"},{"id":"61584504.656bb4","type":"function","z":"801b0f90.623ea8","g":"8ae4ca85.96da48","name":"CRC-check","func":"var inverter_reply = msg.payload;\n\nvar message1 = inverter_reply.slice(2); // Remove 'AA55' from start of message\n//var message = message.slice(0, -2); //Remove two CRC bytes from end of message\nvar message = message1.slice(0, -2); //Remove two CRC bytes from end of message\n\nfunction crc16(buffer) {\n    var crc = 0xFFFF;\n    var odd;\n\n    for (var i = 0; i < buffer.length; i++) {\n        crc = crc ^ buffer[i];\n\n        for (var j = 0; j < 8; j++) {\n            odd = crc & 0x0001;\n            crc = crc >> 1;\n            if (odd) {\n                crc = crc ^ 0xA001;\n            }\n        }\n    }\n    return crc.toString(16);\n}\n\n//Calculate CRC ourselves\nvar calculated_crc = crc16(message);\n\n//Get CRC from inverter reply and un-reverse it\nvar reply_crc = inverter_reply.slice(-2).toString('hex');\nvar crc1 = reply_crc.slice(0, 2);\nvar crc2 = reply_crc.slice(-2);\nvar new_crc = crc2 + crc1;\n\nif (new_crc == calculated_crc) {\n// If the checksum is not correct retry to get a good string.\n    msg.complete=true\n    return msg;\n// Also the wait for power delevery to the net could here be checked.\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":610,"y":60,"wires":[["c3f1b711.3b982"]],"icon":"font-awesome/fa-arrows-h"},{"id":"b7d1e792.f544b","type":"inject","z":"801b0f90.623ea8","g":"d6e3f503.b6b34","name":"PVOutput config & timer","props":[{"p":"payload.ipa","v":"10.10.100.253","vt":"str"},{"p":"payload.PVOid","v":"nnnnn","vt":"str"},{"p":"payload.APIkey","v":"nnnnnnnnnnnnn.......","vt":"str"},{"p":"payload.TTL","v":"","vt":"date"}],"repeat":"","crontab":"*/5 5-22 * * *","once":false,"onceDelay":0.1,"topic":"","payloadType":"str","x":210,"y":240,"wires":[["7326dc17.928594"]],"icon":"font-awesome/fa-pencil-square","info":"Prefix max. 6 charactes/numbers\nWhen sending also to PVOoutput.org then add the\nfollowing string (a-z)\n\npayload.PVOid = your PVO system-id (five numbers)"},{"id":"576863d4.d2162c","type":"inject","z":"801b0f90.623ea8","d":true,"g":"d6e3f503.b6b34","name":"Timer & config No2","props":[],"repeat":"","crontab":"*/5 5-22 * * *","once":false,"onceDelay":"5","topic":"","payloadType":"str","x":200,"y":280,"wires":[["7326dc17.928594"]]},{"id":"69f5a1ee.df6a48","type":"inject","z":"801b0f90.623ea8","d":true,"g":"d6e3f503.b6b34","name":"Timer & config No3","props":[{"p":"payload.ipa","v":"10.10.100.253","vt":"str"},{"p":"payload.ssid","v":"no3","vt":"str"}],"repeat":"","crontab":"*/5 4-22 * * *","once":true,"onceDelay":"10","topic":"","x":200,"y":320,"wires":[["7326dc17.928594"]]},{"id":"3921663d.c36b9a","type":"inject","z":"801b0f90.623ea8","d":true,"g":"d6e3f503.b6b34","name":"To PVoutput at midnight ","props":[{"p":"payload.ipa","v":"10.10.100.253","vt":"str"},{"p":"payload.ssid","v":"goodwe","vt":"str"},{"p":"payload.PVOid","v":"nnnnn","vt":"str"},{"p":"payload.APIkey","v":"nnnnnnnnnnnnnnn......","vt":"str"}],"repeat":"","crontab":"59 23 * * *","once":false,"onceDelay":0.1,"topic":"","x":210,"y":360,"wires":[["7326dc17.928594"]],"info":"This needed when also sending not only generated power but also consumed power."},{"id":"d68b8d43.29747","type":"http request","z":"ff01618d.60809","name":"Post","method":"POST","ret":"txt","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","authType":"","x":490,"y":60,"wires":[["d7346137.28cba","b638e83a.a1c888"]]},{"id":"71cd2d97.8e32d4","type":"function","z":"ff01618d.60809","name":"Prepare Post","func":"msg.action = msg.payload;\nPVOsystemid = msg.payload.PVOsystemid;\nPVOAPIkey = msg.payload.PVOAPIkey;\n\nmsg.headers = {};\n//msg.headers['X-Pvoutput-Apikey'] = 'b9ebfcaa419189c2a8595617ad6bd8250ed8a2d9';\nmsg.headers['X-Pvoutput-Apikey'] = PVOAPIkey;\nmsg.headers['X-Pvoutput-SystemId'] = PVOsystemid;\nmsg.headers['Content-Type'] = 'application/x-www-form-urlencoded';\n\n////////////////////////////////////////////\nmsg.url = \"http://pvoutput.org/service/r2/addstatus.jsp\";\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":330,"y":80,"wires":[["d68b8d43.29747","ac542fdb.fa626"]],"icon":"font-awesome/fa-align-left"},{"id":"d7346137.28cba","type":"function","z":"ff01618d.60809","name":"Check Status 1st","func":"var d=new Date();\nvar hours=('00' + d.getHours()).slice(-2);\nvar minutes=('00' + (d.getMinutes()+1)).slice(-2);\n// adding a space behind the time so that the lenght of the line is 314 characters in the log\nTime = hours+\":\"+minutes+\" \"\n\nif (msg.statusCode == 200) { \n   var stat = \"\";\n   flow.set('pvostat','200');  // this clears the outstanding PVO data, so it won't be uploaded again\n   var msg1 = null;\n   var msg2 = null;\n   // new status message\n   //msg.status.text =Time + \" \" + msg.status;\n} else {\n   var time = new Date().toString();\n   flow.set('pvostat', msg.statusCode);\n   stat = \"FAILED: Time:\" + time + \"  StatusCode:\" + msg.statusCode + \"  StatusMsg:\" + msg.payload;\n   //var msg1 = null;\n   //var msg2 = null;\n   msg1.payload = stat;\n   msg2.payload = stat;\n   var msg1 =  { payload: stat };\n   var msg2 =  { payload: stat };\n   //msg.status.text = Time + \" \" + msg.status;\n}\nreturn msg;\nreturn (msg1, msg2);","outputs":2,"noerr":0,"initialize":"","finalize":"","libs":[],"x":730,"y":100,"wires":[[],["fe3a3389.3b9b2"]],"icon":"font-awesome/fa-search"},{"id":"fe3a3389.3b9b2","type":"file","z":"ff01618d.60809","name":"PVO error log","filename":"/opt/goodwe/pvoutput/pvo_errors.log","appendNewline":true,"createDir":true,"overwriteFile":"false","x":920,"y":120,"wires":[[]]},{"id":"ac542fdb.fa626","type":"function","z":"ff01618d.60809","name":"Store PVO data","func":"//store the PVO data in case it doesn't upload correctly\nflow.set ('pvodata',msg.payload)\nreturn msg;","outputs":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":500,"y":100,"wires":[],"icon":"node-red/redis.png"},{"id":"ba0c10e4.0b273","type":"http request","z":"ff01618d.60809","name":"Re-Post","method":"POST","ret":"txt","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","authType":"","x":520,"y":200,"wires":[["82678181.eee75"]]},{"id":"9f08c692.4c46a8","type":"function","z":"ff01618d.60809","name":"Prepare retransmit","func":"msg.action = msg.payload;\nPVOsystemid = msg.payload.PVOsystemid;\nPVOAPIkey = msg.payload.PVOAPIkey;\n\nmsg.headers = {};\nmsg.headers['X-Pvoutput-Apikey'] = PVOAPIkey;\nmsg.headers['X-Pvoutput-SystemId'] = PVOsystemid;\nmsg.headers['Content-Type'] = 'application/x-www-form-urlencoded';\n\n////////////////////////////////////////////\nmsg.url = \"http://pvoutput.org/service/r2/addstatus.jsp\";\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":350,"y":200,"wires":[["ba0c10e4.0b273"]],"icon":"node-red/white-globe.svg"},{"id":"82678181.eee75","type":"function","z":"ff01618d.60809","name":"Check Status 2nd","func":"if (msg.statusCode == 200) { \n   var time = new Date().toString();\n   var stat =\"\";\n   flow.set('pvostat', 200);  // this clears the outstanding PVO status, so it won't be uploaded again\n   var stat = \"RetransmitOK: Time:\" + time + \"  StatusCode:\" + msg.statusCode + \"  StatusMsg:\" + msg.payload;\n//   var msg1 = null;\n//   var msg2 = null;\n   var msg1 =  { payload: stat };\n   var msg2 =  { payload: stat };\n} else {\n   var time = new Date().toString();\n   flow.set('pvostat', msg.statusCode);\n   var stat = \"RetransmitFAIL: Time:\" + time + \"  StatusCode:\" + msg.statusCode + \"  StatusMsg:\" + msg.payload;\n//   var msg1 = null;\n//   var msg2 = null;\n   var msg1 =  { payload: stat };\n   var msg2 =  { payload: stat };\n}\nreturn (msg1, msg2);","outputs":"2","noerr":0,"initialize":"","finalize":"","libs":[],"x":730,"y":200,"wires":[["bc2c0f21.a7735"],["30cf215d.ab8d0e"]],"icon":"font-awesome/fa-search"},{"id":"30cf215d.ab8d0e","type":"file","z":"ff01618d.60809","name":"Retransmit fail","filename":"/opt/goodwe/pvoutput/pvo_errors.log","appendNewline":true,"createDir":true,"overwriteFile":"false","x":920,"y":220,"wires":[[]]},{"id":"b638e83a.a1c888","type":"function","z":"ff01618d.60809","name":"Fetch PVO data","func":"// Retransmit the PVO data in case it doesn't upload correctly the first time\n\nif (msg.statusCode != 200) { \n    \n// retrieve local stored data\n   var pvodata = flow.get('pvodata')||\"\";\n    msg.payload = pvodata;\n\nreturn msg;\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":160,"y":200,"wires":[["9f08c692.4c46a8"]],"icon":"node-red/redis.png"},{"id":"8d14e679.b29678","type":"file","z":"ff01618d.60809","name":"PVO Data","filename":"/opt/goodwe/pvoutput/PVO_data.log","appendNewline":true,"createDir":true,"overwriteFile":"false","x":900,"y":80,"wires":[[]]},{"id":"2696b14a.d9694e","type":"comment","z":"ff01618d.60809","name":"Check data sent OK and if not retransmit once","info":"The PVO website is busy and sometimes can't respond quickly enough and we get timeouts.\nThe next bit of code catches any errors and resubm its the code until it's sent OK.\n\nThat said, if it can't resend the data before the next data packet has to be sent (5 mins) then\nthe current packet will be lost. This is pretty rare though and won't be noticable on the graphs.\n","x":200,"y":160,"wires":[]},{"id":"5f830eb6.38a358","type":"comment","z":"ff01618d.60809","name":"Prepare values and then transfer those to PVOuput.org","info":"","x":220,"y":40,"wires":[]},{"id":"1a1e9c44.bce1f4","type":"function","z":"ff01618d.60809","name":"Prepare values","func":"var PVOsystemid = msg.payload[0].PVOid;\nvar PVOAPIkey = msg.payload[0].APIkey\nvar inverter_reply = msg.payload[1];\n\nvar message1 = inverter_reply.slice(2); // Remove 'AA55' from start of message\n//var message = message.slice(0, -2); //Remove two CRC bytes from end of message\nvar message = message1.slice(0, -2); //Remove two CRC bytes from end of message\n\nfunction crc16(buffer) {\n    var crc = 0xFFFF;\n    var odd;\n\n    for (var i = 0; i < buffer.length; i++) {\n        crc = crc ^ buffer[i];\n\n        for (var j = 0; j < 8; j++) {\n            odd = crc & 0x0001;\n            crc = crc >> 1;\n            if (odd) {\n                crc = crc ^ 0xA001;\n            }\n        }\n    }\n    return crc.toString(16);\n}\n\n//Calculate CRC ourselves\nvar calculated_crc = crc16(message);\n\n//Get CRC from inverter reply and un-reverse it\nvar reply_crc = inverter_reply.slice(-2).toString('hex');\nvar crc1 = reply_crc.slice(0, 2);\nvar crc2 = reply_crc.slice(-2);\nvar new_crc = crc2 + crc1;\n\nif (new_crc == calculated_crc) {\n    var year = \"20\" + inverter_reply.readInt8(5); // \n    var month = inverter_reply.readInt8(6); // \n    var day = inverter_reply.readInt8(7); // \n    var hour = inverter_reply.readInt8(8); // \n    var minutes1 = inverter_reply.readInt8(9); // \n\n    if(month.toString().length == 1)  { var month = '0'+month; }\n    if(day.toString().length == 1)    { var day = '0'+day;}\n    if(hour.toString().length == 1)   { var hour = '0'+hour; }\n    //if(minutes1.toString().length == 1) { var minutes1 = '0'+minutes1; }\n    var minutes = (minutes1 < 5 ? '0' : '') + minutes1;\n\nvar d = year + month + day;\nvar t = hour + \":\" + minutes;\nvar v1 = parseFloat((inverter_reply.readInt16BE(93) * 100).toFixed(1)); // eDay\nvar v2 = inverter_reply.readInt16BE(61);                                // production in Watt\nvar v5 = parseFloat((inverter_reply.readInt16BE(87) * 0.1).toFixed(1)); // v5 temperature\nvar v6 = parseFloat((inverter_reply.readInt16BE(41) * 0.1).toFixed(1)); // AC zijde\n\n    msg.payload = {\n        d,\n        t,\n        v1,\n        v2,\n        v5,\n        v6,\n        PVOsystemid,\n        PVOAPIkey\n    }\n\n    return msg;\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":160,"y":80,"wires":[["71cd2d97.8e32d4","106f84dd.f8d73b"]],"icon":"node-red/batch.svg"},{"id":"106f84dd.f8d73b","type":"file","z":"ff01618d.60809","name":"save-values","filename":"/opt/goodwe/nodered/saved-values.txt","appendNewline":true,"createDir":true,"overwriteFile":"false","encoding":"ascii","x":530,"y":20,"wires":[[]]},{"id":"bc2c0f21.a7735","type":"file","z":"ff01618d.60809","name":"Retransmit OK","filename":"/opt/goodwe/pvoutput/PVO_data.log","appendNewline":true,"createDir":true,"overwriteFile":"false","encoding":"none","x":920,"y":180,"wires":[[]]},{"id":"5edda9f.62c3158","type":"switch","z":"25c26ce6.9d762c","name":"Array [1] well formed?","property":"payload[1]","propertyType":"msg","rules":[{"t":"istype","v":"buffer","vt":"buffer"},{"t":"istype","v":"object","vt":"object"}],"checkall":"false","repair":false,"outputs":2,"x":220,"y":120,"wires":[["e883ef0a.9d7f5"],[]],"info":"When the inverter is offline the PVOutput credentials are still being injected.\n\nThis will check if the payload in the second array field is of the type buffer (contain the inverter values) and not a later injected PVOuput credentials."},{"id":"c48649f.4f33938","type":"function","z":"801b0f90.623ea8","g":"8ae4ca85.96da48","name":"TTL","func":"var timediff = 0\ntimediff = (Date.now() / 1000 ) - (msg.payload.TTL / 1000 );\nif (timediff > 124){\n    delete msg.payload\n    return msg\n}\n //msg.payload.diff = timediff;\nreturn msg","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":530,"y":140,"wires":[["ca20bfa3.9a4018"]],"icon":"font-awesome/fa-calculator"},{"id":"ca20bfa3.9a4018","type":"switch","z":"801b0f90.623ea8","g":"8ae4ca85.96da48","name":"TTL","property":"payload","propertyType":"msg","rules":[{"t":"nnull"},{"t":"null"}],"checkall":"true","repair":false,"outputs":2,"x":650,"y":140,"wires":[["97d4ca32.f3eab"],["8d4b9241.9ebfb"]],"outputLabels":["TTL valid","TTL invalid"],"icon":"font-awesome/fa-question-circle-o"},{"id":"97d4ca32.f3eab","type":"link out","z":"801b0f90.623ea8","g":"8ae4ca85.96da48","name":"Retry","links":["11627800.6500a"],"x":790,"y":100,"wires":[],"icon":"font-awesome/fa-refresh","l":true},{"id":"8d4b9241.9ebfb","type":"link out","z":"801b0f90.623ea8","g":"8ae4ca85.96da48","name":"Stop","links":[],"x":790,"y":140,"wires":[],"icon":"font-awesome/fa-chain-broken","l":true},{"id":"7326dc17.928594","type":"link out","z":"801b0f90.623ea8","g":"d6e3f503.b6b34","name":"Begin","links":["11627800.6500a","6e0fb1a2.416948"],"x":410,"y":300,"wires":[],"icon":"font-awesome/fa-arrow-up","l":true},{"id":"a0cff14b.2baee8","type":"function","z":"25c26ce6.9d762c","name":"Timestamp","func":"var inverter_reply = msg.payload[1];\n\nvar message1 = inverter_reply.slice(2); // Remove 'AA55' from start of message\nvar message = message1.slice(0, -2); //Remove two CRC bytes from end of message\n\n\nvar hour = inverter_reply.readInt8(8); // \nvar minute = inverter_reply.readInt8(9); // \n\nif(hour.toString().length == 1)   { var hour = '0'+hour; }\n// var minutes = (minutes1 < 5 ? '0' : '') + minutes1;\nif(minute.toString().length == 1)   { var minute = '0'+minute; }\n\nmsg.payload = \"Last-time values: \" + hour + \":\" + minute;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":430,"y":200,"wires":[[]],"icon":"node-red/status.svg"}]


Het project om de WiFi van de omvormer minder sterk te maken is gedaan en de Cap lite (STA) hangt dicht bij de omvormer en wordt gevoed vanaf de switch met een PoE adaptor. Het eerste PoE device alhier.

Het volgende project is een KWh meter in de meterkast te plaatsen tussen de hoofdschakelaar en de aardlekschakelaars (huis+PV) en zo te kunnen zien wat het verbruik is en de teruglevering.
Dit gaat later ook naar PVOutput met behulp van RS485.

Het was een een interessante tijd en veel nieuwe dingen erbij geleerd en ik hoop dat ik met hetgeen ik hier heb geschreven en NodeRed flows anderen te hebben geholpen.

Verder is het super dat Goodwe de MODBUS RTU toegankelijk heeft gemaakt via WiFi en zo het uitlezen zoveel gemakkelijker heeft gemaakt en het scapen van Sems overbodig heeft gemaakt.

[Voor 1% gewijzigd door msatter op 27-05-2021 16:11. Reden: Afbeelding NOdeRed interface toegevoegd.]


  • wlmpie
  • Registratie: oktober 2007
  • Laatst online: 24-06 20:35
No13 schreef op donderdag 20 mei 2021 @ 15:02:
[...]

Inmiddels een mail gestuurd met de vraag waarom mijn ticket bijna 2 weken zonder feedback open staat.

Krijg ik een automatische mail dat ze een ticket hebben gemaakt :P
@No13 Heeft Goodwe inmiddels jouw firmware geüpdatet? en zo ja, welke omvormer heb je en wat is nu jouw aftopping?

Als dat allemaal goed is gegaan, durf ik misschien ook een firmware update voor mijn 2500XS aan te vragen.

  • No13
  • Registratie: januari 2001
  • Laatst online: 14:00

No13

/me was here

wlmpie schreef op donderdag 27 mei 2021 @ 19:10:
[...]


@No13 Heeft Goodwe inmiddels jouw firmware geüpdatet? en zo ja, welke omvormer heb je en wat is nu jouw aftopping?

Als dat allemaal goed is gegaan, durf ik misschien ook een firmware update voor mijn 2500XS aan te vragen.
Ik heb vorige week een bericht gehad dat ze een update geïnstalleerd zouden hebben maar mijn versie bleef op 1.52.09. Ik heb maandag een reply gestuurd dat de ARM versie is blijven steken op 9 en of ze nog eens willen kijken waarom deze niet is geüpdate naar 14... Nog geen reacties gekregen.

Acties:
  • 0Henk 'm!

  • wlmpie
  • Registratie: oktober 2007
  • Laatst online: 24-06 20:35
Interessant. Kun je al wel zien op welk vermogen jouw omvormer nu aftopt? is dat met deze firmware (voor de XS omvormers) nog steeds op 10% boven het nominale vermogen. Of topt hij af op het nominale vermogen. Ik weet eigenlijk niet welke omvormer jij hebt @No13

Acties:
  • 0Henk 'm!

  • No13
  • Registratie: januari 2001
  • Laatst online: 14:00

No13

/me was here

1675 watt haal ik op de 1500xs, dat is niet veranderd bij de upgrades tot 1.52.09

Acties:
  • 0Henk 'm!

  • msatter
  • Registratie: maart 2021
  • Niet online
Oef zeg, ik had al geschreven dat ik een KWh meter op de DIN rail wilde plaatsen en vandaag de meterkast opgemaakt ter voorbereiding. Foto genomen van hoe en wat en waar zit en daarna bezig gegaan met bestellen.

Kijkende naar de foto viel mij echter iets op. Stroom komt van af meter de kast binnen zit op hoofdschakelaar. Nu gingen de draden uit de hoofdschakelaar fase verkeerd eruit en dus alles was nu fase verkeerd. De Goodwe past zich kennelijk aan en draait zelf de fases als het niet goed zit aangesloten.

Gelukkig was net die monteur bij de buren bezig om een kastje te plaatsen want op één paneel zit een schaduw. Hij zat nog op het dak en ik vroeg hem om als die klaar was nog even bij mij langs te komen want ik had nog een vraag over de meterkast die hij geplaatst heeft.

Ondertussen de meterkast weer open gemaakt opdat hij direct bij binnenkomst een blik kon werpen.

Toen hij er was vertelde ik wat ik gezien had en vroeg hem of dat zo hoorde. Hij keek peinzend en zei dat is inderdaad niet goed.

Hij vroeg om een kruiskop schroevendraaier en ik gaf aan dat ik nog eerst even de Raspberries uit wilde zetten. Die vinden het niet leuk als de stroom er ineens afgaat om de log-bestanden in ram geheugen staan.

Hij verwisselde de twee draden bovenop hoofdschakelaar en in huis had ik weer fase correcte stroom. De Goodwe zag dat het goed was en ging weer terugleveren maar dan via juiste kleuren vanaf nu. Had ik geen foto gemaakt, dan had het over 20 jaar nog precies zo gezeten.

SolarGo heeft hier nooit geen melding van gegeven en kennelijk komt het vaker voor. ;)

Echt toeval dat hij ook net diegene was die vanmiddag bij de buren moest zijn en dat ik bus zag staan van de zonnepaneel plaatsers.

Kan gebeuren en ik ben blij dat het nu correct is aangesloten. Ik weet niet of de aardlek wel goed werken als de fases verkeerd om zitten.

[Voor 9% gewijzigd door msatter op 28-05-2021 15:33]


Acties:
  • 0Henk 'm!

  • Pinobigbird
  • Registratie: januari 2002
  • Laatst online: 15:08

Pinobigbird

doesn't share food!

@msatter Omdat de 3 fasen onderling 120° verschillen maakt het technisch niet uit als je L1/2/3 verwisseld. Zo is de volgorde 123 hetzelfde als 231 en 312, en is 321 gelijk aan 213 en 132. Enige verschil is links- of rechtsdraaiende faserotatie, maar ook dat maakt niet eens uit voor een omvormer. Dus tenzij de nul ook verwisseld was, was er niets gevaarlijk.
Alleen niet zoals het hoort nee, en dat kan bij toekomstige werkzaamheden tot verkeerde aannames leiden wat dan wel weer gevaarlijk zou kunnen zijn.

Joey: Nice try. See the Netherlands is this make believe place where Peter Pan and Tinkerbell come from.
https://kattenoppasleiderdorp.nl
PV: 3080Wp ZO + 3465Wp NW = 6545Wp totaal 13°tilt


Acties:
  • 0Henk 'm!

  • msatter
  • Registratie: maart 2021
  • Niet online
Pinobigbird schreef op vrijdag 28 mei 2021 @ 15:46:
@msatterknip....
Alleen niet zoals het hoort nee, en dat kan bij toekomstige werkzaamheden tot verkeerde aannames leiden wat dan wel weer gevaarlijk zou kunnen zijn.
Alles is bij mij één fase. De blauwe en bruine draad waren omgewisseld.

De schijf in de meter draait nog steeds dezelfde kant uit....vooral linksom. ;-)

Acties:
  • 0Henk 'm!

  • wlmpie
  • Registratie: oktober 2007
  • Laatst online: 24-06 20:35
@msatter Wanneer zijn die draden dan omgewisseld? Recent of zit het al jaren zo? Als je een stopcontact openschroeft staat er dan nu idd 230volt op de bruine draad of zijn er meer verwisselingen in het systeem. Ik vind het tamelijk nalatig van een elektricien om 230volt op een blauwe nuldraad te zetten. Ik heb ook geen idee of je aardlekschakelaar het dan nog doet in geval van nood. Post die foto eens in Het grote topic voor Elektra huisinstallaties https://gathering.tweaker...ist_messages/1749001/last

  • msatter
  • Registratie: maart 2021
  • Niet online
Ik kan mij de slordigheid mij wel indenken. Nadat de 35Amp hoofdzekering eruit is sluit je nieuwe hoofdschakelaar aan. De hoofdschakelaar staat zo geen L en N op.

Nu sluit je aardleks en de aardlek van de PV en in de hele kast de volgorde overal zwart/bruin links en blauw rechts. Die volgorde zet je voort, maar als de onderkant van de hoofdschakelaar blauw bruin is dan zit het verkeerd om voor alles wat achter hoofdschakelaar zit. Effe door de knieën, om de onderkant te checken had kunnen voorkomen.

Het is nu boven de hoofdschakelaar omgedraait want zou je onderaan willen werken moet weer de hoofdzekering eruit en opnieuw de verzegeling aanbrengen.

Overigens wat gebruiken ze tegenwoordig lompe verzegelingen. De lood verzegelingen zijn een stuk kleiner.

De PV zit achter een aardlekautomaat en die zit samen met de twee aardlekschakelaars op de hoofdschakelaar.

Het heeft sind 28 april verkeerd omgezeten omdat mijn meterkast eerst naar nen1010 moest om de PV in gebruik te mogen nemen.

Als ik de DIN KWh meter plaats dan moet ik rekening houden met die omwisseling zodat ik het niet alsnog weer omdraai als ik de overheersende kleuren volgorde in de kast volg. Dubbel checken en even door de knieën en de meter heeft boven de twee L's en onderaan de twee N's. Ook weer afwijkend.

  • Maasluip
  • Registratie: april 2002
  • Laatst online: 13:05

Maasluip

Frontpage Admin

Kabbelend watertje

msatter schreef op maandag 3 mei 2021 @ 18:14:
Hierbij het script welke SFK nodig heeft om te kunnen werken.
Ik heb dit script op mijn GW3600D-NS geprobeerd en ik krijg waardes er uit maar het lijkt erop dat hij de power van één string laat zien.
Ik gok dat de volgende 4 karakters na de eerste Vpv en Ipv die voor de tweede string zijn.
Dus
code:
1
2
3
4
5
6
7
8
sfk sel -since today ./$(date +"%Y")/*.log +hexfile -offlen -292 4 -flat -nofile   +dec +calc "#text*0.1"  -dig=1  +setvar vpv1 +echo -var     "  Vpv s1:   #(vpv1) V"
sfk sel -since today ./$(date +"%Y")/*.log +hexfile -offlen -288 4 -flat -nofile   +dec +calc "#text*0.1"  -dig=1  +setvar ipv1 +echo -var     "  Ipv s1:   #(ipv1) A "
sfk sel -since today ./$(date +"%Y")/*.log +hexfile -offlen -284 4 -flat -nofile   +dec +calc "#text*0.1"  -dig=1  +setvar vpv2 +echo -var     "  Vpv s2:   #(vpv2) V"
sfk sel -since today ./$(date +"%Y")/*.log +hexfile -offlen -280 4 -flat -nofile   +dec +calc "#text*0.1"  -dig=1  +setvar ipv2 +echo -var     "  Ipv s2:   #(ipv2) A "
sfk sel -since today ./$(date +"%Y")/*.log +hexfile -offlen -232 4 -flat -nofile   +dec +calc "#text*0.1"  -dig=1  +setvar vac +echo -var     "  Vac:      #(vac) V "
sfk sel -since today ./$(date +"%Y")/*.log +hexfile -offlen -208 4 -flat -nofile   +dec +calc "#text*0.01" -dig=2  +setvar fac +echo -var     "  Fac:      #(fac) Hz "
sfk sel -since today ./$(date +"%Y")/*.log +hexfile -offlen -292 4 -flat -nofile +dec +setvar vpv1 +sel -since today ./$(date +"%Y")/*.log +hexfile -offlen -288 4 -flat -nofile +dec +setvar ipv1 +echo -var "#(vpv1)*#(ipv1)/100000" +calc "#text" -dig=2 +setvar power1 +echo -var    "  Power s1: #(power1) kW "
sfk sel -since today ./$(date +"%Y")/*.log +hexfile -offlen -284 4 -flat -nofile +dec +setvar vpv2 +sel -since today ./$(date +"%Y")/*.log +hexfile -offlen -280 4 -flat -nofile +dec +setvar ipv2 +echo -var "#(vpv2)*#(ipv2)/100000" +calc "#text" -dig=2 +setvar power2 +echo -var    "  Power s2: #(power2) kW "

[Voor 73% gewijzigd door Maasluip op 29-05-2021 16:25]

Dat slof sigaretten met de pak melk - D/T-regels
Open Source landkaart


  • msatter
  • Registratie: maart 2021
  • Niet online
Maasluip schreef op zaterdag 29 mei 2021 @ 11:54:
[...]

Ik heb dit script op mijn GW3600D-NS geprobeerd en ik krijg waardes er uit maar het lijkt erop dat hij de power van één string laat zien.
Ik gok dat de volgende 4 karakters na de eerste Vpv en Ipv die voor de tweede string zijn.

knip....
Wat van waardes worden weergegeven? Onmogelijke waardes, of in 220-240 volt of in de 380-400 reeks?

Ik heb deze tabel aangehouden. Heb jij met de cod hierboven de juiste waarden dankan ik het overnemen.

Dank voor het testen.

  • Maasluip
  • Registratie: april 2002
  • Laatst online: 13:05

Maasluip

Frontpage Admin

Kabbelend watertje

@msatter
Zelfde soort waardes als de bestaande Vpv en Ipv. Ik krijg nu
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Current value at 17:16:41:
  Vpv s1:   195.8 V
  Ipv s1:   4.7 A
  Vpv s2:   208.1 V
  Ipv s2:   3.9 A
  Vac:      232.2 V
  Fac:      49.97 Hz
  Power s1: 0.92 kW
  Power s2: 0.81 kW
  Temperature:  34.7 celcius
  Eday:     23.4 kWh
  Etotal:   175.5 kWh
  Totalruntime: 178 hours
  WiFi Signal:  74 %

en de omvormer geeft ook zoiets aan.

Dat slof sigaretten met de pak melk - D/T-regels
Open Source landkaart


  • msatter
  • Registratie: maart 2021
  • Niet online
@Maasluip

Ik kijk naar de laatste vesie van dat script en dat was 5 mei en ik zie zo direct een verschil anders dan ik de verschillende waardes groepeer. https://gathering.tweaker...message/67193260#67193260

Ik heb een nieuwe versie voor SFK gemaakt die het positioneren van de strings laat overeenkomen met de tabel waar ik vergeten (vermoeidheid) ben de link te plakken in mijn vorige post.

Link naar de nieuw versie en via Cron wordt het log/store script direct aangeroepen. https://gathering.tweaker...message/67307464#67307464

Link naar de tabel: https://gathering.tweaker...message/67213716#67213716

Ondertussen ben ik van SFK naar Node.Red overgegaan maar daar zit nog geen meer dan één string in en ik heb eerst PVOuput.org gedaan en nu een betrouwbaar opvraag en verzend geheel gemaakt.

Dit kan weer gebruikt worden voor opslaan en weergeven alleen dat zal niet vandaag of morgen klaar zijn.
De PVOutput.org flow maakt geen onderscheid op strings of meer fases.
Dan kan ook de grafische weergave gemaakt door @ThinkPad gebruikt worden die dan ook meer dan é'n string zou kunnen weergeven als de Node.Red flow klaar is.

[Voor 7% gewijzigd door msatter op 29-05-2021 18:11]


Acties:
  • 0Henk 'm!

  • msatter
  • Registratie: maart 2021
  • Niet online
Het is al lekker warm op zolder waar de omvormer hangt en ik heb nog een staande ventilator staan en die op de omvormer gericht en Dect 200 van AVM ertussen gezet zodat ik de ventilator van afstand kon aanzetten en weer uit. Daarna kon ik hem ook automatisch aan en uit zetten na bij voorbeeld 8 uur na zonsopkomst en dan om 18 uur weer uit.

Dat scheelt meer dan 10 graden in de omvormer en ik kwam van 46 graden.



Nu de stoute schoenen aangetrokken en gezocht of er een Frtiz node is voor Node Red en waarachtig zelfs een aantal. De aanbevolen node gekozen en binnen 10 minuten kon ik de ventilator aan en uit zetten vanuit Node-Red.

Nooit specifiek een fan geweest van home-automation maar dit begint nu wel leuk te worden. Als de omvormer warmer dan 40 graden dan kan ik de fan aanzetten en is die weer wat koeler dan kan de ventilator weer uit. En dat met spullen die al in huis had liggen en staan.

De volgende aankoop is dus zon vloer ventilator met zo'n sta-beugel en die schroef ik aan de muur onder de omvormer en dan kan hij lekker van onderen de omvormer voorzien van een luchtstroom als die een warm hoofd krijgt.

:-)

Update: Ondertussen ook een vloer-ventilator gevonden. Hij is zeker 10 jaar oud en amper gebruikt vandaar dat ik mij pas veel later er aan herinnerde. Het blad is 30 cm en het een kleine ventilator in zijn soort. Precies de afmeting die ik zocht.
Het is wel goedkope Chinese kwaliteit en ik zag elastiek om de spoelen zitten van de motor. Ik heb het blad en de kooi schoon gemaakt en morgen maar eens kijken hoe ik hem vastzet aan de muur. Ik zit te denken aan twee metalen buizen vastzetters met eventueel vier blokjes eronder om de afstand te verhogen met de muur.

Als dat allemaal doet dan nog een stopcontact plaatsen en dan is het meteen ook helemaal netjes,

In Node-Red kan ik hem dan automatische laten schakelen als de temperatuur hoog is en als het weer koeler is weer uitzetten. De meting kan meelopen met het verzenden naar PVOutput of het kan een eigen trigger krijgen. Ik denk dat 5 minuten van PVOutput wel voldoende is.

Update: weer een stuk verder en waarden kunnen nu bij de configuratie/timer van omvormer gedefinieerd worden. Wel verschillende omvormers maar nog geen verschillende ventilators en het hoeft niet zo moeilijk te implementeren te zijn omdat ieder omvormer een ID kan krijgen.

Huidige waarden: boven de 45 graden staat de ventilator aan, onder de 36 graden staat hij uit en daartussen staat hij ook aan. Vandaag volgen op PVOutput of hij de temperatuur kan regelen.

Nu werk ik met absolute temperaturen maar als het straks warmer wordt op zolder moet ik het bijregelen want dan kan ik die 45 graden nooit houden.

Nu heeft de Dect200 een temperatuur sensor en ik heb zo ook de ambient temperatuur en en ik kan zo een verschil berekenen. Als de temperatuur in de omvormer meer dan 25 graden is dan de omgevingstemperatuur dan koelen totdat hij nog maar 5 graden hoger is omgevingstemperatuur.

Ik heb de ventilator opgehangen en hij blaast schuin tegen de onderzijde van omvormer en zo richting de punt van het dak. Op de foto's zie je ook de WiFi die vlakbij is geplaatst nu ik de antenne kabel in de WiFi stick los heb gemaakt.

Hij geeft nog wel trillingen door aan de muur en helaas is deze dubbele rubberen ophanging nog niet genoeg dus hier nog verder over nadenken.



Met de staande ventilator werkte het koelen erg goed. Ik kon mooi de temperatuur onder de 40 graden houden. Nu deze ventilator toch trillingen veroorzaakt heb ik de bovengrens op 55 graden gezet en hij gaat nu pas koelen als het erg warm wordt. De omvormer kan prima werken tot 75 graden eigen temperatuur maar wat koeling op een hete zomer op zolder is dan zeker welkom.

De ventilator gaat vanzelf aan en uit naargelang de temperatuur van de omvormer. Ik heb het meenemen van de ambient temperatuur nog niet gereed. De waardes heb ik maar ik krijg ze niet verwerkt in Node Red.

Nieuwe PVOutput grafiek hierboven geplaatst en de grote haaienvin dat was toen ik de ventilator aan het plaatsen was. Tijdens het boren is ventilator in rug niet erg praktisch en dan waait zo weer al het stof uit het op de muur geplakte koffiefilter zakje. Dus toen stond die uit. ;)

Update: Vandag bij de ijzerwaren winkel nog een paar handen aan rubbers, ringen, slotbouten, moeren en twee deurststoppers op gehaald. Twee lagen rubber toegevoegd. De slotbout maakt geen contact meer met de beugel en aan de buitenzijde zitten nu twee schijven met daartussen een soort dubbel o-ring die gebruikt word om draden door metalen panelen te voeren.

Ik kon hem vanavond niet horen en mogen nog maar eens luisten of ik hem beneden nog horen. De deurstoppers zitten naast bevestiging aan de muur en dan tussen de beugel en de muur en ontlasten zo de bevestiging. Vandaag ging de omvormer over de 50 graden en de ventilator houdt hem dan ook rond de vijftig graden. Het is nu sneller warmer aan het worden op zolder dus dat gaat nog leuk worden als de omvormer gas....juice geeft.
Nu ook uit de ambient temperatuur probleem gekomen en morgen dat maar ook actief maken.

Naschrift: de nieuwe zelf bedachte demping maatregelen werken goed en ik hoor alleen nog de ventilator zelf als ik in de zelfde ruimte ben.
Nu verbruikt een DECT 200 ook constant stroom en ik zou die kunnen vervangen door een bi-metaal schakelaar die de ventilator aan en uit zet. Die klem ik tussen de koelribben aan de achterkant van de omvormer.

De ambient temperatuur is nog steeds beschikbaar omdat er ook nog een ander DECT 210 in de buurt zit.

Update: de ambient en delta temperatuur is geïmplementeerd en nu nog meer testen wat de beste werkwijze is. Zolang de ambient en delta tezamen lager is dan de normale temperatuur is de normale temperatuur leidend. Zodra het erg warm wordt dan komt de som van ambient en delta boven de normale temperatuur uit en dan neemt ambient/delta de functie van de normale temperatuur over. Zo wordt er niet eindeloos gekoeld terwijl de normale temperatuur niet haalbaar is.
Verder bij temperaturen boven de 70 graden in de omvormer gaat de ventilator altijd aan om een soort nood koeling te doen.

En zo ziet dat eruit in het Node Red 'panee'l:

[Voor 91% gewijzigd door msatter op 02-06-2021 20:41. Reden: Ventilator gevonden en inregelen temperatuur]


Acties:
  • +2Henk 'm!
  • Pinned

  • hpmkruit
  • Registratie: november 2009
  • Laatst online: 12:44
Even een bevestiging vanuit mijn kant dat het lokaal uitlezen van een 5000D-NS ook lukt na een firmware update door GoodWe.

Acties:
  • 0Henk 'm!

  • The Fatal
  • Registratie: maart 2009
  • Laatst online: 09:06
interessant topic.
Laatst bezig geweest om mijn 2000XS en 2500XS uit te lezen. Maar toen lokaal niet gelukt.
Begrijp dat het met nieuwere firmware wel mogelijk is om deze lokaal uit te lezen dmv iets van NodeRed?
Is er ergens een korte beschrijving? Ik heb de posts van @ThinkPad door gelezen en zijn flows geïmporteerd, maar krijg geen resultaten er uit.

Ik heb ondertussen al een paar maanden dit python script succesvol draaien, dus hoop dat het hier ook mag aangezien de meeste posts meer gaan over de omvormer over UDP uit te lezen. Dit script leest hem wel uit de sems portal. Kan wel eens handig zijn, en krijg zo de juiste data binnen. Ik kon toentertijd niks vinden voor 2 omvormers, dus zelf wat aan het knutselen geweest.Deze haalt de laatste gegevens op en zet het om naar een MQTT bericht
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
PV_West
type = GW2500-XS
status = Online
pgrid_w = 2292.0
temperature = 59.1
eday_kwh = 6.6
etotal_kwh = 873.7
emonth_kwh = 276.4
grid_voltage = 246.8
grid_current = 9.3
grid_frequency = 50.02
dc_voltage_str_1 = 263.4
dc_current_str_1 = 9.1
dc_voltage_str_2 = 0.0
dc_current_str_2 = 0.0
battery_soc = 100.0
battery_soh = -0.100000000000364


python code,
Er worden 2 omvormers opgehaald, in mijn geval Oost / West
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
import requests
import json
import paho.mqtt.client as mqtt

#mqtt connection details
mqtt_ip = 'IP_adress of broker'
mqtt_port = 1883

#Goodwe / SEMS account and powerStationId 
account = 'login_emaill'
pwd = 'password'
powerStationId ='PowerStationID'

client = mqtt.Client()
client.connect(mqtt_ip,mqtt_port,60)

loginPayload = { 'account': account, 'pwd': pwd }
token = '{"version":"","client":"web","language":"en"}'
global_url = 'https://eu.semsportal.com/api/'
headers = { 'Token': token }  #update token

c = requests.post(global_url + 'v2/Common/CrossLogin', headers=headers, data=loginPayload, timeout=30)
c.raise_for_status()
#print(c) 

data = c.json()
token = json.dumps(data['data'])
#print("Data is: ", data)
#print("Token is: ", token)

payload = { 'powerStationId' : powerStationId }
headers = { 'token': token } 

try:    
       r = requests.post(global_url + 'v2/PowerStation/GetMonitorDetailByPowerstationId', headers=headers, data=payload, timeout=10)
       r.raise_for_status()
       #print("r = " , r)
except requests.exceptions.RequestException as e:    
       print("Exception_2:  ")
       print(e)
data = r.json()
if data['msg'] =='success' :
    print("success")
    print(" data:  ")   #overview all data
    data =data['data']
   ##print("print D2 ",d2)
   #d3= d2['inverter']
   #d4=d3[0]
   #d5=d3[1]
   ##print("Print D4 ", d4)           #overview important data
    print("###########################")
    #print("Print D5 ", d5) 
    
    status = { -1 : 'Offline', 0 : 'Waiting', 1 : 'Online' }
    inverterData_Oost = data['inverter'][0]['invert_full']
    result_Oost = {
                'type': inverterData_Oost.get('model_type'),
                'status': status.get(inverterData_Oost.get('status'),'Unknown'),
                'pgrid_w': str(inverterData_Oost.get('pac')),
                'temperature': str(inverterData_Oost.get('tempperature')),
                'eday_kwh': str(inverterData_Oost.get('eday')),
                'etotal_kwh': str(inverterData_Oost.get('etotal')),
                'emonth_kwh': str(
                    round(
                        float(
                            inverterData_Oost.get('thismonthetotle')
                            + inverterData_Oost.get('eday')
                        ), 1)
                ),
                'grid_voltage' : str(inverterData_Oost.get('vac1')),
                'grid_current' : str(inverterData_Oost['iac1']),
                'grid_frequency' : str(inverterData_Oost.get('fac1')),
                'dc_voltage_str_1' : str(inverterData_Oost.get('vpv1')),
                'dc_current_str_1' : str(inverterData_Oost.get('ipv1')),
                'dc_voltage_str_2' : str(inverterData_Oost.get('vpv2')),
                'dc_current_str_2' : str(inverterData_Oost.get('ipv2')),
                'battery_soc' : str(inverterData_Oost.get('soc')),
                'battery_soh' : str(inverterData_Oost.get('soh'))
             }
    print("Result = " , result_Oost)
    inverterData_West = data['inverter'][1]['invert_full']
    result_West = {
                'type': inverterData_West.get('model_type'),
                'status': status.get(inverterData_West.get('status'),'Unknown'),
                'pgrid_w': str(inverterData_West.get('pac')),
                'temperature': str(inverterData_West.get('tempperature')),
                'eday_kwh': str(inverterData_West.get('eday')),
                'etotal_kwh': str(inverterData_West.get('etotal')),
                'emonth_kwh': str(
                    round(
                        float(
                            inverterData_West.get('thismonthetotle')
                            + inverterData_West.get('eday')
                        ), 1)
                ),
                'grid_voltage' : str(inverterData_West.get('vac1')),
                'grid_current' : str(inverterData_West['iac1']),
                'grid_frequency' : str(inverterData_West.get('fac1')),
                'dc_voltage_str_1' : str(inverterData_West.get('vpv1')),
                'dc_current_str_1' : str(inverterData_West.get('ipv1')),
                'dc_voltage_str_2' : str(inverterData_West.get('vpv2')),
                'dc_current_str_2' : str(inverterData_West.get('ipv2')),
                'battery_soc' : str(inverterData_West.get('soc')),
                'battery_soh' : str(inverterData_West.get('soh'))
             }
    print("Result = " , result_West)
    
    
    
    try:
        client.connect(mqtt_ip,mqtt_port,60) 
        r.raise_for_status()
    except requests.exceptions.RequestException as e:    
       print("Exception_3:  ")
       print(e)
    try:
        for key,value in result_Oost.items():
                    if(key is not None and value is not None):
                        parameter = key
                        payload = str(parameter)
                        #print("Payload = ", payload)
                        payload_value = value
                        #print("payload_value = " , value)
                        #payload = locals()[payload]
                        #payload = json.dumps(payload)
                        
                        client.publish("PV_Oost/"+payload, payload_value)
                        r.raise_for_status()
        for key,value in result_West.items():
                    if(key is not None and value is not None):
                        parameter = key
                        payload = str(parameter)
                        #print("Payload = ", payload)
                        payload_value = value
                        #print("payload_value = " , value)
                        #payload = locals()[payload]
                        #payload = json.dumps(payload)
                        
                        client.publish("PV_West/"+payload, payload_value)
                        r.raise_for_status()

    except requests.exceptions.RequestException as e:    
        print("Exception_4:  ")
        print(e)
        client.disconnect();
        r.raise_for_status()
    except requests.exceptions.RequestException as e:    
        print("Exception_5:  ")
        print(e)


als iemand tips en tricks om lokaal uit te lezen, heeft dat zeker mijn voorkeur.

Acties:
  • 0Henk 'm!

  • No13
  • Registratie: januari 2001
  • Laatst online: 14:00

No13

/me was here

hpmkruit schreef op maandag 31 mei 2021 @ 14:01:
Even een bevestiging vanuit mijn kant dat het lokaal uitlezen van een 5000D-NS ook lukt na een firmware update door GoodWe.
[..]
Bij mij komen ze niet echt in beweging, ticket blijft open en reacties blijven uit...

Acties:
  • 0Henk 'm!

  • hpmkruit
  • Registratie: november 2009
  • Laatst online: 12:44
No13 schreef op maandag 31 mei 2021 @ 16:11:
[...]

Bij mij komen ze niet echt in beweging, ticket blijft open en reacties blijven uit...
Vreemd, bij mij in 3 werkdagen geregeld.

Acties:
  • 0Henk 'm!

  • ThinkPad
  • Registratie: juni 2005
  • Laatst online: 14:57

ThinkPad

Moderator Duurzame Energie & Domotica
@The Fatal Kijk even in het menu van je omvormer welke firmware hij heeft. Laatste twee cijfers moet 14 of hoger zijn.

@No13 Even met het NL-talige nummer bellen?

[Voor 16% gewijzigd door ThinkPad op 31-05-2021 17:00]

Gas besparen door CV-tuning | Elektriciteit besparen
Geen vragen via privébericht die ook via het forum kunnen a.u.b.


Acties:
  • +1Henk 'm!

  • The Fatal
  • Registratie: maart 2009
  • Laatst online: 09:06
ThinkPad schreef op maandag 31 mei 2021 @ 17:00:
@The Fatal Kijk even in het menu van je omvormer welke firmware hij heeft. Laatste twee cijfers moet 14 of hoger zijn.

@No13 Even met het NL-talige nummer bellen?
2500xs is v1.13.13
2000xs is v1.02.08

Zal wel een mailtje sturen naar de support afdeling voor nieuwe firmware.

Acties:
  • 0Henk 'm!

  • No13
  • Registratie: januari 2001
  • Laatst online: 14:00

No13

/me was here

ThinkPad schreef op maandag 31 mei 2021 @ 17:00:
@No13 Even met het NL-talige nummer bellen?
Ik had net het Engelstalige +31 voor eindgebruikers proberen te bellen maar de lijn werd steeds verbroken (16:30)

Update: net wel iemand aan de lijn gekregen, mn ticket was inmiddels overdue en ze gaan informeren wat er mis gaat.

[Voor 18% gewijzigd door No13 op 01-06-2021 15:43]


Acties:
  • 0Henk 'm!

  • hpmkruit
  • Registratie: november 2009
  • Laatst online: 12:44
Nog wel een vraag mbt de work mode codes. Ik krijg nu de codes 0 (Wait mode) en 1 (Normal) door. Volgens mij was er ook een code voor een foutstand. Ik dacht dat dit 2 was, maar heb dit per ongeluk verwijderd toen ik de Node-Red flows van de SEMS portal scraper heb omgezet naar de lokale methode.

Ik zou dit graag weer herstellen, want dit heeft mij al een paar keer middels een notificatie gewezen op een PV automaat die was omgeslagen. Dit is inmiddels hersteld door de installateur, maar ik hou er graag toch een oogje op.

Acties:
  • +2Henk 'm!

  • Pinobigbird
  • Registratie: januari 2002
  • Laatst online: 15:08

Pinobigbird

doesn't share food!

@hpmkruit Zie Pinobigbird in "[GoodWe] Uitlezen inverters via USB"
0: Wait Mode
1: Normal
2: Error
4: Check Mode

Joey: Nice try. See the Netherlands is this make believe place where Peter Pan and Tinkerbell come from.
https://kattenoppasleiderdorp.nl
PV: 3080Wp ZO + 3465Wp NW = 6545Wp totaal 13°tilt


Acties:
  • 0Henk 'm!

  • hpmkruit
  • Registratie: november 2009
  • Laatst online: 12:44
@Pinobigbird Hartelijk bedankt! was inderdaad code 2 dus

Acties:
  • +1Henk 'm!

  • No13
  • Registratie: januari 2001
  • Laatst online: 14:00

No13

/me was here

No13 schreef op maandag 31 mei 2021 @ 17:46:
[...]

Update: net wel iemand aan de lijn gekregen, mn ticket was inmiddels overdue en ze gaan informeren wat er mis gaat.
Great succes! 1.52.15 is nu de actuele versie, vanavond eens met python spelen 8)

  • The Fatal
  • Registratie: maart 2009
  • Laatst online: 09:06
Dan heb je geluk. Had ook een ticket aangemaakt en ene omvormer draait nu op 1.52.08 en de andere op 1.52.13
Schiet nog niet op.
Nog maar een ticket maken denk ik

  • No13
  • Registratie: januari 2001
  • Laatst online: 14:00

No13

/me was here

Het heeft totaal een maand geduurd met 4 tickets in mijn geval. De ervaringen wisselen tussen enkele dagen en... wat langer ;)

  • The Fatal
  • Registratie: maart 2009
  • Laatst online: 09:06
No13 schreef op woensdag 2 juni 2021 @ 18:33:
[...]

Het heeft totaal een maand geduurd met 4 tickets in mijn geval. De ervaringen wisselen tussen enkele dagen en... wat langer ;)
Snel ging het wel. Maar heb er nog niks aan :-)
Vind het trouwens wel erg creepy dat ze van uit afstand die firmware update doen…….

  • msatter
  • Registratie: maart 2021
  • Niet online
The Fatal schreef op woensdag 2 juni 2021 @ 18:36:
[...]

Snel ging het wel. Maar heb er nog niks aan :-)
Vind het trouwens wel erg creepy dat ze van uit afstand die firmware update doen…….
Als je ziet hoe je dat zelf kunt doen dan is het wel fijn dat zij het doen kunnen omdat je gebruik maakt van Sems. Als het fout gaat dan is het herstellen een flinke klus.
De werkwijze is eerst de DSP's opdaten en dan een tijd laten draaien....ik denk minimaal 1 dag opdat de omvormer opnieuw gestart is en daarna de update van ARM processor versie.
Het zou wel leuk zijn als er een soort changelog zou wezen want ik ging er lang vanuit dat versie 13 als toegang gaf om de omvormer via UDP uit te kunnen lezen.

Acties:
  • +1Henk 'm!

  • No13
  • Registratie: januari 2001
  • Laatst online: 14:00

No13

/me was here

Op basis van de scripts die jullie allemaal al gemaakt hebben ben ik bezig geweest met een 'kale' python functie die zonder extra tools de communicatie met de omvormer voor zn rekening kan nemen. Deze komt dan in een docker containertje te draaien om iedere xx sec influx te voorzien van de data :)

Uiteindelijk is dit het verhaal geworden:
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
import socket, time

def crc16(data: bytes):
    '''
    CRC-16-ModBus Algorithm
    '''
    data = bytearray(data)
    poly = 0xA001
    crc = 0xFFFF
    for b in data:
        crc ^= (0xFF & b)
        for _ in range(0, 8):
            if (crc & 0x0001):
                crc = ((crc >> 1) & 0xFFFF) ^ poly
            else:
                crc = ((crc >> 1) & 0xFFFF)
    return crc

def get_int(in_bytes):
    if type(in_bytes) is int:
        return in_bytes
    else:
        return int.from_bytes(in_bytes[:len(in_bytes)],'big')

def get_inverter_data(hostname,timeout=0.5):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
    s.settimeout(timeout)
    try:
        s.sendto(bytes.fromhex('7f0375940049d5c2'),(hostname,8899))
        data,address = s.recvfrom(4096)
        # do CRC check
        crc_data = data[-1:].hex()+data[-2:-1].hex() 
        crc_calc = hex(crc16(data[2:-2]))[2:]
        if(crc_data == crc_calc):
            inverter_data = {
                'error': 'no error',
                'vpv1': round(get_int(data[11:13])*0.1,2),
                'ipv1': round(get_int(data[13:15])*0.1,2),
                'vpv2': round(get_int(data[15:17])*0.1,2),
                'ipv2': round(get_int(data[17:19])*0.1,2),
                'vac': round(get_int(data[41:43])*0.1,2),
                'iac': round(get_int(data[47:49])*0.1,2),
                'fac': round(get_int(data[53:55])*0.01,2),
                'eday': round(get_int(data[93:95])*0.1,2),
                'etot': round(get_int(data[97:99])*0.1,2),
                'rssi': get_int(data[149:151]),
                'hours': get_int(data[101:103]),
                'temp': round(get_int(data[87:89])*0.1,2),
                'power': get_int(data[61:63]),
                'status': get_int(data[63:65]),
                'timestamp': time.mktime((2000+get_int(data[5]),get_int(data[6]),get_int(data[7]), get_int(data[8]), get_int(data[9]), get_int(data[10]),-1,-1,-1))
            }
            return(inverter_data)
        return {"error": "crc error"}
    except socket.timeout:
        return {"error": "timeout"}
    except Exception as e:
        return {"error":str(e)}


Dan nu nog een timer maken die met enige interval de output van get_inverter_data('ip van inverter') naar influx duwt (mits data['error'] == 'no error') :)

  • The Fatal
  • Registratie: maart 2009
  • Laatst online: 09:06
Kan je dat niet om naar mqtt zetten en dan met node red oid verder sturen.
Als er dan een nieuw bericht komt op het topic wordt het vanzelf n influx geduwd.

Volgens mij moet dit ook bij jou werken
'Vac' : str(data.get('vac1')),
Dan zoekt tie zelf het veld op mocht er iets shiften.

  • No13
  • Registratie: januari 2001
  • Laatst online: 14:00

No13

/me was here

The Fatal schreef op woensdag 2 juni 2021 @ 21:47:
Kan je dat niet om naar mqtt zetten en dan met node red oid verder sturen.
Als er dan een nieuw bericht komt op het topic wordt het vanzelf n influx geduwd.
Zeker mogelijk, ik heb echter nog niets op mqtt en/of node red. Voor mij is het nu handiger direct weg te schrijven naar influx.
Volgens mij moet dit ook bij jou werken
'Vac' : str(data.get('vac1')),
Dan zoekt tie zelf het veld op mocht er iets shiften.
Deze volg ik even niet; waar vindt dan de vertaling plaats tussen de string 'vac1' en de bytes 41 en 42?
Of bedoel je juist dat je die definitie los maakt van de code zodat je bij veranderingen niet je hele code na hoeft te lopen en enkel je definitie?

Update: Met wat bewolking vandaag "piekt" de opwek wat meer; daarmee zie ik dat het aftoppen met deze fw niet anders verloopt dan voorheen; op een 1500w omvormer zie ik nog steeds 1675 als max waarde

[Voor 11% gewijzigd door No13 op 03-06-2021 13:12]


Acties:
  • +1Henk 'm!

  • theredone51
  • Registratie: januari 2004
  • Laatst online: 11:02
Proton_ schreef op donderdag 20 mei 2021 @ 15:53:
Het is intussen [GoodWe] Uitlezen inverters via UDP geworden ;)

Een tooltje om vanuit je eigen netwerk van de omvormer naar PVOutput te pushen heb ik hier op github gezet:
https://github.com/koen-lee/GoodweUDPToPvOutput
De release is self-contained linux-arm, dus draait na uitpakken direct op een Pi.

Resultaat is https://pvoutput.org/intraday.jsp?id=20978&sid=18868
Vandaag om 9u het topic gevonden + ticket aangemaakt, om 12u al de laatste firmware op de omvormer en zojuist de logging op kunnen zetten op basis jouw code / van lokale data. Bedankt _/-\o_

  • Pinobigbird
  • Registratie: januari 2002
  • Laatst online: 15:08

Pinobigbird

doesn't share food!

@No13 Ik heb jouw Python-script gebruikt (en voor mezelf uitgebreid voor 3-fase), waarvoor dank.

Ik zie een enkele keer dat de ontvangen waarden van de eday en de etot niet goed gevuld worden (edit: én hours); deze komen namelijk als FF FF (65535) binnen:
Python:
1
{'error': 'no error', 'vpv1': 248.1, 'ipv1': 0.3, 'vpv2': 302.3, 'ipv2': 0.5, 'vac1': 236.6, 'vac2': 235.7, 'vac3': 238.3, 'iac1': 0.6, 'iac2': 0.6, 'iac3': 0.6, 'fac': 50.0, 'eday': 6553.5, 'etot': 6553.5, 'rssi': 100, 'hours': 65535, 'temp': 44.3, 'power': 304, 'status': 1, 'timestamp': 1622747660.0}

Dat is dus een foutje van de omvormer, niet van jouw script. Maar je zou er nog wel een extra check op kunnen doen. De CRC lijkt wél te kloppen, dus het veld 'error' wordt gewoon 'no error'. Je zou deze waarden niet in je database willen hebben, dus je zal dit ook als error willen afvangen.

Ik weet niet of het alleen bij deze 2 3 velden voorkomt, of misschien wel bij allemaal. In dat laatste geval zou je alle velden langs moeten gaan om ze te checken op de foute waarden. Hoe zou jij dat aanpakken? Mijn Python-skills zijn nog erg beperkt.

[Voor 1% gewijzigd door Pinobigbird op 03-06-2021 22:18. Reden: Ook hours]

Joey: Nice try. See the Netherlands is this make believe place where Peter Pan and Tinkerbell come from.
https://kattenoppasleiderdorp.nl
PV: 3080Wp ZO + 3465Wp NW = 6545Wp totaal 13°tilt


Acties:
  • 0Henk 'm!

  • wlmpie
  • Registratie: oktober 2007
  • Laatst online: 24-06 20:35
No13 schreef op donderdag 3 juni 2021 @ 10:04:

Update: Met wat bewolking vandaag "piekt" de opwek wat meer; daarmee zie ik dat het aftoppen met deze fw niet anders verloopt dan voorheen; op een 1500w omvormer zie ik nog steeds 1675 als max waarde
YES, nu durf ik ook een firmware update aan te vragen.

Acties:
  • 0Henk 'm!

  • wlmpie
  • Registratie: oktober 2007
  • Laatst online: 24-06 20:35
Sooo, dat ging snel. Vandaag om 14:30 een ticket aangemaakt met verzoek om ARM firmware update. Een uur later bericht dat de omvormer was geüpdatet. en idd hij was 1.13.13 en is nu 1.13.15.
De solargo app doet nu ook iets, dus ik kan met de scriptjes hier gaan experimenteren.

Acties:
  • 0Henk 'm!

  • The Fatal
  • Registratie: maart 2009
  • Laatst online: 09:06
Hier al 3 tickets verder en nog steeds op .08 en .13:-(

  • wlmpie
  • Registratie: oktober 2007
  • Laatst online: 24-06 20:35
Met de scriptjes van msatter is het gelukt om lokaal uit te lezen. Wel een hoop gedoe want ik kreeg vaker een timeout dan een waarde. Vraag mij af of dat normaal is of dat er iets mis is met mijn accespoint of mijn raspberry pi. uploaden naar pvoutput vanaf die raspberry faalt ook best vaak namelijk.

code:
1
2
3
4
5
6
7
8
9
10
11
Values from on 20210605 at 20:25
  Vpv:      281.6 V
  Vac:      235.9 V
  Iac:       0.0 A
  Fac:      50.00 Hz
  Power:    0.00 kW
  Temperature:   46.7 celcius
  Eday:      5.6 kWh
  Etotal:    1353.9 kWh
  Totalruntime:  2202 hours
  WiFi Signal:   66 %


Volgende item is hoe krijg ik domoticz nou zover dat hij deze data importeert en opneemt in de database. Domotics verzamelt nu nog vanaf de semsportal. Ik heb vroeger wat gespeelt met basic en turbopascal en heb wat aangeklloit met dzvents scripts in domoticz, maar zelf een script schrijven dat goodwe omvormer data via udp in domoticz trekt is nog een brug te ver.

Ik lees dat mensen hier influx, mqqt en node-red gebruiken. Is er een reden waarom ik dat ook zou moeten doen? is het veel handiger dan domoticz o.i.d

Acties:
  • 0Henk 'm!

  • ThinkPad
  • Registratie: juni 2005
  • Laatst online: 14:57

ThinkPad

Moderator Duurzame Energie & Domotica
The Fatal schreef op woensdag 2 juni 2021 @ 18:36:
[...]

Snel ging het wel. Maar heb er nog niks aan :-)
Vind het trouwens wel erg creepy dat ze van uit afstand die firmware update doen…….
Je zou de internettoegang van de Goodwe kunnen blokkeren in je router. Heb ik ook gedaan zodra lokaal uitlezen werkte. Oranje lampje op de omvormer blijft dan wel knipperen (“wifi-storing”) i.p.v. continu branden.

Gas besparen door CV-tuning | Elektriciteit besparen
Geen vragen via privébericht die ook via het forum kunnen a.u.b.


Acties:
  • 0Henk 'm!

  • The Fatal
  • Registratie: maart 2009
  • Laatst online: 09:06
ThinkPad schreef op zondag 6 juni 2021 @ 08:37:
[...]

Je zou de internettoegang van de Goodwe kunnen blokkeren in je router. Heb ik ook gedaan zodra lokaal uitlezen werkte. Oranje lampje op de omvormer blijft dan wel knipperen (“wifi-storing”) i.p.v. continu branden.
Dat is een goede mogelijkheid.
Zinkers zal wel gaan gebeuren als ik het lokaal werkend heb.
Die Sems portal is toch bagger.

Acties:
  • 0Henk 'm!

  • wlmpie
  • Registratie: oktober 2007
  • Laatst online: 24-06 20:35
The Fatal schreef op woensdag 2 juni 2021 @ 18:36:
[...]
Vind het trouwens wel erg creepy dat ze van uit afstand die firmware update doen…….
Dat betekent potentieel dat de chinezen vanuit China de NL stroomvoorziening plat kunnen leggen, door gelijktijdig alle omvormers af te schakelen.

Acties:
  • 0Henk 'm!

  • JeroenE
  • Registratie: januari 2001
  • Niet online
@wlmpie Wij zijn in Nederland natuurlijk niet afhankelijk van zonnepanelen op daken; bovendien doet een beetje grote wolk voor de zon dat bijna net zo effectief.

Acties:
  • +2Henk 'm!

  • wimpie
  • Registratie: september 1999
  • Niet online
JeroenE schreef op zondag 6 juni 2021 @ 18:13:
@wimpie Wij zijn in Nederland natuurlijk niet afhankelijk van zonnepanelen op daken; bovendien doet een beetje grote wolk voor de zon dat bijna net zo effectief.
Verkeerde tag, andere "wimpie" was paar jaar te laat :)

Divide and conquer.


Acties:
  • +4Henk 'm!

  • ThinkPad
  • Registratie: juni 2005
  • Laatst online: 14:57

ThinkPad

Moderator Duurzame Energie & Domotica
Toch de topictitel maar even wat gewijzigd ;)

Gas besparen door CV-tuning | Elektriciteit besparen
Geen vragen via privébericht die ook via het forum kunnen a.u.b.


Acties:
  • 0Henk 'm!

  • Noshi
  • Registratie: januari 2007
  • Laatst online: 14:57
JeroenE schreef op zondag 6 juni 2021 @ 18:13:
@wlmpie Wij zijn in Nederland natuurlijk niet afhankelijk van zonnepanelen op daken; bovendien doet een beetje grote wolk voor de zon dat bijna net zo effectief.
offtopic:
Een wolk is lokaal, niet instantaan over heel NL of Europa. Ik denk wel dat het een risico is of kan zijn in de toekomst.

Acties:
  • +1Henk 'm!

  • Maasluip
  • Registratie: april 2002
  • Laatst online: 13:05

Maasluip

Frontpage Admin

Kabbelend watertje

In Nederland is ruim meer dan 7 GWp geïnstalleerd, als je dat op een zonnige dag in een keer af zou schakelen dan heb je wel een probleem. Misschien nog niet een blackout maar wel heel dicht in de buurt.

Als voorbeeld, dit is 3,9 GW die in een keer van het net gaat. Dat is zoals je ziet nog te verhapstukken

Áls de frequentie onder de 49 Hz komt moet volgens de richtlijnen de eerste stap worden genomen om belasting per direkt van het net te verwijderen.

In Duitsland kun je op een beetje zonnige dag op de piek wel 30 GW verwachten. Als dat in een keer van het net gaat is dat niet meer op te vangen. Dus ja, dit is een risico.

[Voor 11% gewijzigd door Maasluip op 07-06-2021 10:43]

Dat slof sigaretten met de pak melk - D/T-regels
Open Source landkaart


Acties:
  • +1Henk 'm!

  • No13
  • Registratie: januari 2001
  • Laatst online: 14:00

No13

/me was here

Maar in dat scenario zou je aannemen dat 1 'fabrikant' of 'actor' controle heeft over alle installaties (diverse merken).

De impact is niet te verwaarlozen maar het is ook niet waarschijnlijk dat 1 'partij' op de knop kan drukken om dit te veroorzaken.

Edit: Neemt niet weg dat ik voorstander ben van een lokale oplossing waar externe partijen alleen op uitnodiging toegang krijgen.

[Voor 20% gewijzigd door No13 op 07-06-2021 10:49]


Acties:
  • 0Henk 'm!

  • borft
  • Registratie: januari 2002
  • Laatst online: 24-06 16:54
Sircuri schreef op maandag 4 september 2017 @ 16:08:
Voor de mensen die geïnteresseerd zijn in het kunnen uitlezen van een GoodWe inverter via de USB aansluiting aan de onderkant, heb ik op GitHub een eerste versie gezet van een python script dat dit mogelijk maakt.

Met hulp van het programma EZExplorer (GoodWe) en een USB sniffer, heb ik de communicatie kunnen ontrafelen.

https://github.com/sircuri/GoodWeUSBLogger
Met dank aan deze, een python implementatie: https://github.com/borft/py-goodwe

nog geen auto discover van inverter, en als je naar pvoutput wilt syncen, moet je nog wel even aan de back, maar met een paar regels python kan je wel data uit je omvormer krijgen ;)

Python:
1
2
3
4
5
6
7
8
9
10
11
12
from goodwe import Goodwe,GoodweStatus

ip = your_ip_here
gw = Goodwe(ip=ip)

try:
    data = gw.getData()
except Exception as e:
    print(f"failed: {e}")
    exit(0)

print(data)

Acties:
  • 0Henk 'm!

  • The Fatal
  • Registratie: maart 2009
  • Laatst online: 09:06
jeej, hier ook geüpgraded, via node-red uit lezen lukt al :)

dus eventjes met scriptjes aan de gang.


@borft net jou script even getest, werkt out of the box om het uit te lezen. Ga nog wat MQTT er bij frutselen.

[Voor 36% gewijzigd door The Fatal op 07-06-2021 18:13]


Acties:
  • 0Henk 'm!

  • wlmpie
  • Registratie: oktober 2007
  • Laatst online: 24-06 20:35
Ik gebruik nu de plugin "GoodWe inverter (via SEMS portal)" in domoticz. Die zou ik graag vervangen door de plugin "GoodWe inverter (local readout via UDP over wifi)" alleen moet iemand die laatste plugin nog schrijven ;-)
Of zou ik dat zelf in elkaar kunnen fabrieken? Wie helpt mij op weg?

Acties:
  • +1Henk 'm!

  • No13
  • Registratie: januari 2001
  • Laatst online: 14:00

No13

/me was here

wlmpie schreef op maandag 7 juni 2021 @ 20:16:
Ik gebruik nu de plugin "GoodWe inverter (via SEMS portal)" in domoticz. Die zou ik graag vervangen door de plugin "GoodWe inverter (local readout via UDP over wifi)" alleen moet iemand die laatste plugin nog schrijven ;-)
Of zou ik dat zelf in elkaar kunnen fabrieken? Wie helpt mij op weg?
Staat op mn todo 8)
Pagina: 1 2 3 4 Laatste


Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Microsoft Xbox Series X LG CX Google Pixel 5a 5G Sony XH90 / XH92 Samsung Galaxy S21 5G Sony PlayStation 5 Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2021 Hosting door True