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
Acties:

Onderwerpen


  • Sircuri
  • Registratie: oktober 2001
  • Niet online

Sircuri

Volledig Appelig

Topicstarter
Deze moet in de GoodWe omvormer:



samen met:



Deze past in de Raspberry Zero W

Signature van nature


  • LJed
  • Registratie: juli 2010
  • Laatst online: 09-06 14:12
Hmm, dan heeft jouw goodwe een andere interface denk ik.
Achter mijn wifi-dongle zit de volgende print.
http://www.onkytroller.com/goodwe.jpg

  • zonoskar
  • Registratie: januari 2000
  • Laatst online: 17:52

zonoskar

<-- Mika R.I.P!

De USB zit bij mij achter een aparte dop, niet bij de Wifi interface erbij. Zoiets:

Powermac G5 casemod. Mijn PV live output.


  • zonoskar
  • Registratie: januari 2000
  • Laatst online: 17:52

zonoskar

<-- Mika R.I.P!

Nog iets doms, zo zit de USB kabel aangesloten op het moederbordje.


Zou die domme constructie de reden zijn waarom die USB niet lekker opstart bij mij? Van connector naar de volgende op deze manier lijkt me foutgevoelig.

Powermac G5 casemod. Mijn PV live output.


  • PeeVv
  • Registratie: oktober 2008
  • Nu online
Ik gebruik al enige tijd een ESP8266 om mijn 4200D-NS uit te lezen over RS485, met de GoodWeLogger. Echter kan de ESP regelmatig niet meer communiceren. Vervolgens duurt het erg lang voordat de omvormer weer reageert op commando's van de ESP. De power-knop op de omvormer brandt continu oranje bij als de communicatie niet werkt, nadat de ESP weer kan communiceren knippert deze oranje.


Klikbaar

Hier is te zien dat de ESP iedere 5 seconden een discovery commando stuurt naar de omvormer, dit duurt +- 10 minuten.
code:
1
2
Sending discovery
Sending data to inverter(s): 0xAA 0x55 0xAB 0x7F 0x0 0x0 0x0 CRC high/low: 0x2 0x29 .

Dan werkt de communicatie en krijg ik netjes alle data binnen, maar na enige tijd stopt dit en probeert hij weer +- 10 minuten verbinding te krijgen.

In mijn PVOutput zie je duidelijk de dipjes in data.

@ThinkPad ik zie dat jij dezelfde library gebruikt, heb jij hier ook last van?

Is dit een bug van de software of klopt het dat het lang kan duren voordat de omvormer verbindt?

[Voor 4% gewijzigd door PeeVv op 11-08-2019 14:01]


  • PeeVv
  • Registratie: oktober 2008
  • Nu online
ESP hangt vlak bij een Unifi access point, dus wifi zou meer dan voldoende moeten zijn. De debug info laat verder ook geen problemen met wifi zien, het is puur de initiële verbinding met de omvormer die erg lang duurt + de ESP die soms herstart waardoor het dus weer 10 minuten duurt voordat er data ontvangen wordt.

Ik heb al gereageerd op een issue, hier is helaas nog geen reactie op gekomen:

https://github.com/jantenhove/GoodWeLogger/issues/16

Ik zal die reactie zo even aanvullen met wat logdata, dat had ik vorige keer nog niet.

-edit-

@ThinkPad wat doet de power knop bij jou? Bij mij is het het volgende patroon indien alles werkt:

[Voor 15% gewijzigd door PeeVv op 11-08-2019 16:16]


  • NetXtreme
  • Registratie: mei 2003
  • Laatst online: 19-07 00:16
Iemand ook een idee waar op deze GoodWe 3600D-NS een USB/RS485 poort verstopt zou moeten zitten?

https://tweakers.net/ext/f/IbQygjk7J9S9l3pdA1e6XVPz/thumb.jpg

  • DRuw
  • Registratie: november 2009
  • Laatst online: 20-07 13:52

DRuw

Bacardi Bat on Ice:)

Weet iemand of er een verschil is tussen het signaal dat via de RS485 wordt verstuurd of via de USB (B) poort?
Ik had alles voorbereid om mijn goodwe 4200DS uit te lezen maar na alles in huis te hebben blijkt die poort er bij mijn niet te zijn... alleen USB(B) en wifi (ingebouwd).
Nu zou ik graag mijn nodemcu aan de usb hangen om hem direct naar pvoutput te sturen maar kan dat?

Volgens mij is de RS485 een direct doorlus van de bordaansluiting en zit er verder geen hardware tussen (volgens mij is de usb ook een doorlus van de RS485 als ik het op de fotos van anderen zo zie.... klopt dat?)
Mijn onderkant:

Deze signature is om volstrekt onduidelijke redenen verwijderd. PVOutput


Acties:
  • 0Henk 'm!

  • FrankJ91
  • Registratie: september 2010
  • Nu online
Hallo,

A.s. donderdag worden de zonnepanelen bij mij geïnstalleerd tezamen met een Goodwe XS omvormer.

Zo te zien lijkt deze omvormer een USB aansluiting te hebben achter het zwarte dopje en wil dus graag de tool van @Sircuri uitproberen. Om het een en ander mooi weer te kunnen geven in Grafana ben ik nu met wat voorbereidingen bezig. Ik benieuwd of het attribuut "eday" waarin de omvormer het dagverbruik laat zien automatisch wordt gereset om 12 uur snachts en deze gedurende de dag continu optelt en recent is? Of dat er slechts 1 waarde uit komt aan het einde van de dag waarin het dagverbruik staat en verder statisch is? Anders moet ik de pac gebruiken...

Ik ben benieuwd of deze ook werkt op de XS omvormers en of er überhaupt een USB achter zit (kan misschien ook een loos dekseltje zijn, of niet doorgelust).

  • FrankJ91
  • Registratie: september 2010
  • Nu online
Sircuri schreef op zondag 3 mei 2020 @ 17:21:
Het veld EDAY loopt gedurende de dag op en wordt inderdaad de volgende dag gereset als de omvormer weer opstart bij de eerste zonnestralen. Met PAC alleen ga je geen totale opbrengst kunnen vinden. PAC is enkel de huidige wattage die je panelen opwekken.
Naast EDAY heb je ook nog de ETOT waarde. Dit is de totale opbrengst van je omvormen tot nu toe. Deze wordt ook niet gereset. Ik zelf gebruik de waarde uit ETOT om de dag standen te berekenen. Hiermee los je het probleem op dat je geen dagstand hebt als onverhoopt een keer je geen meterstanden op een dag hebt. (regelmatig gehad, omdat mijn Raspberry zichzelf had opgehangen en geen nieuwe standen meer uitlas)
Dank voor je reactie!

Mijn zonnepanelen en omvormer zijn geïnstalleerd vandaag. Maar helaas, blijkbaar is niet elke Goodwe XS serie hetzelfde (per land anders?). Die van mij kan je waarschijnlijk niet uitlezen. Ik heb geen aparte USB poort naast de Wifi module zitten.





De wifi module kan ik eruit halen. Daarachter is een USB-A poort gemarkeerd met COMM (communication?). Ik heb een Windows tablet gepakt waarop een Micro-USB op zit en daarop EzExplorer geïnstalleerd. Bij het aansluiten op de omvormer gebeurt er niks er vindt EzExplorer niks. Daarna op een Pi Zero jouw programma geïnstalleerd, ingesteld en werkend gemaakt. Deze aangesloten (Power poort op stroom en USB poort op de omvormer), de omvormer maakt een sis/pieptoon en de Pi valt uit.

Ik schrok, dacht heb ik een kortsluiting gemaakt? De handleiding erbij gepakt en hierin staat dat je geen PC of ander apparatuur op mag aansluiten. Deze poort is waarschijnlijk geen standaard USB poort?

Gelukkig werkt de Pi nog na het ontkoppelen en de Wifi module/omvormer gelukkig ook nog steeds.

Ik vermoed dat ik hem moet uitlezen van de Chinese Portal ;(

Acties:
  • 0Henk 'm!

  • zonoskar
  • Registratie: januari 2000
  • Laatst online: 17:52

zonoskar

<-- Mika R.I.P!

Sircuri schreef op dinsdag 12 mei 2020 @ 10:13:
Werkt bij jullie die GoodWe Explorer (ezexplorer geloof ik) tool wel als je die op een windows pc installeert en koppelt aan de usb poort van de omvormer?

Misschien is het USB protocol iets anders in die omvormers, waardoor het niet werkt met USB? We zouden met een USB sniffer dan kunnen proberen het wel werkend te krijgen. Het is duidelijk dat niet alle omvormers op eenzelfde manier werken helaas.
EzExplorer werkt bij mij, totdat de omvormer uit gegaan is en weer opstart met de USB kabel er in. Daarna werkt het niet meer, EzExplorer krijgt dan geen contact meer met de omvormer. Ik heb dit een uur ofzo laten draaien, no deal, totdat ik de kabel uit de omvormer haal (dus het is niet genoeg om de kabel uit de PC te halen) en hem uit/aan zet.

Dit is mijn oplossing:

Als het script geen contact krijgt, schakelt hij dit relais uit en wacht 10 minuten en dit wordt herhaalt totdat hij contact krijgt. Zo krijgt de omvormer kans om op te starten zonder USB kabel te detecteren en kan mijn script toch de omvormer uitlezen via USB. Er is een kleine kans dat het script contact probeert te krijgen en de omvormer net aan het opstarten is (het contact zoeken duurt ca 10 sec), maar dit is tot nu toe nog niet voorgekomen. En het draait al 2 jaar onafgebroken.

[Voor 29% gewijzigd door zonoskar op 12-05-2020 12:14]

Powermac G5 casemod. Mijn PV live output.


  • dirksenrdh
  • Registratie: oktober 2017
  • Laatst online: 21-06 11:05
Hoekiee schreef op woensdag 2 september 2020 @ 16:31:
Hi allemaal,

Ik heb een GoodWe GW8K-DT en ben zelf een script in elkaar aan het zetten om de inverter (nu nog via python op mn laptop) uit te lezen via rs-485. Hiervoor bekijk ik ook vaak boven genoemde scripts en het communicatie protocol om inspiratie op te doen.

Via pyserial is het gelukt om de off-line query te doen, een nieuw register adres toe te kennen aan de inverter, running info op te vragen en vervolgens het register adres weer te verwijderen.
Wat mij opvalt/verwondert/verbaast is het enorme aantal verschillende types/series inverters dat Goodwe over ons uitstort. met daarbij ook nog verschillen per land/regio voor hetzelfde type.

dit is de onderzijde van mijn inverter een GW8K-DT net als @Hoekiee .
In de USB poort kun je feitelijk alleen de WiFi of Ethernet module van Hi-Flying steken.
Dan de 2 polige M25 connector aan met de brug is voor remote shutdown. daarmee kan ik deze omvormer op afstand aan en uitzetten.
De andere 2 polige M25 connector staat in de manual vermeld als "meter of RS485". Weet iemand overigens welk fabrikaat deze connector is. Ik heb een kabeldeel nodig en kan hem op het net niet vinden.

@Hoekiee heb jij dezelfde connector als ik? heb je daar een RS485 naar ??? ethernet/usb op aangesloten en dan met een virtuele compoort de ruwe data uitgelezen?
zou je dat script willen delen, want dit is de route die ik ook zou willen bewandelen.
Als je RS485 gebruikt dan heb je waarschijnlijk geen SEMS verbinding meer via de usb=>wifi verbinding omdat iedereen hier schrijft dat je of RS485 hebt of dat de Wifi poort actief is.

plans without actions are dreams


  • Robindd
  • Registratie: december 2012
  • Laatst online: 28-06 08:54
No13 schreef op vrijdag 5 februari 2021 @ 10:19:
Ik ben met mijn XS inverter (nog) niet verder gekomen. De binaire blob heb ik niet kunnen correleren aan de hex waarden van mijn omvormer helaas.
@Robindd Voor welk type inverter was die registermap?
@ThinkPad Bedankt voor de ping! Helaas ging het blog artikel waar je op Github naar verwees niet om dezelfde omvormer.
Geen idee.. Alle?

PVOutput Youless - 9600Wp OZO+WNW | 38° | Goodwe GW6K-DT | Sleeuwijk | Mitsubishi PUHZ-SW75YAA + ERSD-VM2D


  • geerttttt
  • Registratie: oktober 2006
  • Laatst online: 11:25

geerttttt

Manisch positief

linksonderin zit de spi memory chip.. jij woont zeker niet in de regio Twente? Ik heb wel tools om dit uit te lezen...

Oost west, 127.0.0.1 best!


  • ThinkPad
  • Registratie: juni 2005
  • Laatst online: 17:55

ThinkPad

Moderator Duurzame Energie & Domotica
Dat over de poort was voor mij een trigger om even te zoeken, ik vond in een presentatie het volgende:


Ben wel benieuwd wat voor omvormer (en hoe oud) @geerttttt dan heeft en of dat bij hem over poort 80 het internet op gaat. Mogelijk is het verkeer bij onze XS inderdaad anders, al beginnende bij die poort 20001.

Wat je zegt over data niet gelijk lijkt inderdaad wel te kloppen ja... balen.

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


  • msatter
  • Registratie: maart 2021
  • Niet online
Ik heb firmware versie 1.15.14 (DSP-51.51 ARM-14) en hij is nog niet aangesloten op het stroomnet en dat is halverwege deze week dat ik ook ga terugleveren.

Hij is dus in de opstart stand dus nog niets te zien anders dan dat ik mijn land moet invoeren. Ik ga dat ook niet zelf doen en zal vragen aan de monteur of ik dan mijn SolarGo ga verliezen als dat wel gaat gebeuren.

Ik wil SolarGo graag houden omdat ik daar de waardes ook kan zien, naar boven sjouwen en op een bloedhete zolder in de zomer om de waardes uitlezen....zie ik mijzelf niet doen.

Weet je soms hoe je je omvormer kunt resetten om zo weer in de opstart stand te komen waar hij nu is?

Ps. als je in jouw router eens verbiedt dat Sems bereikbaar is voor de omvormer. Het kan zijn dat dan SolarGo wel mag verbinden.

Hieronder een screendump van WireShark



Wat traces en de laatste is SolarGo die vraagt aan de omvormer wat de wachtwoorden zijn.

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
Vraag op UDP 48899:

0000   ff ff ff ff ff ff 20 ee 28 01 45 00 08 00 45 00   ...... .(.E...E.
0010   00 2f ac 99 00 00 40 11 f0 72 0a 0a 64 9f 0a 0a   ./....@..r..d...
0020   64 ff c9 92 bf 03 00 1b 0d 39 57 49 46 49 4b 49   d........9WIFIKI
0030   54 2d 32 31 34 30 32 38 2d 52 45 41 44            T-214028-READ

Antwoord:

0000   20 ee 28 01 45 00 30 ea e7 3d 8b 60 08 00 45 00    .(.E.0..=.`..E.
0010   00 49 35 1e 00 00 ff 11 a8 d5 0a 0a 64 fd 0a 0a   .I5.........d...
0020   64 9f bf 03 e6 3a 00 35 dc 3a 31 30 2e 31 30 2e   d....:.5.:10.10.
0030   31 30 30 2e 32 35 33 2c 33 34 45 41 45 37 YY YY   100.253,34EAE7YY
0040   YY YY YY YY 2c 53 6f 6c 61 72 2d 57 69 46 69 32   YYYY,Solar-WiFi2
0050   XX XX XX XX XX XX XX                                     XXXXXXX

XXXXX is mijn serienummer
YY/Y is de MAC van de omvormer


Vraag op UDP 8899:

0000   30 ea e7 3d 8b 60 20 ee 28 01 45 00 08 00 45 00   0..=.` .(.E...E.
0010   00 24 ff 77 00 00 40 11 9d a1 0a 0a 64 9f 0a 0a   .$.w..@.....d...
0020   64 fd 22 c3 22 c3 00 10 d2 87 7f 03 75 34 00 08   d.".".......u4..
0030   15 d0                                             ..

Antwoord

0000   20 ee 28 01 45 00 30 ea e7 3d 8b 60 08 00 45 00    .(.E.0..=.`..E.
0010   00 33 35 44 00 00 ff 11 a8 c5 0a 0a 64 fd 0a 0a   .35D........d...
0020   64 9f 22 c3 22 c3 00 1f bc 89 aa 55 7f 03 10 35   d."."......U...5
0030   32 30 30 30 53 53 58 XX XX XX XX XX XX XX XX XX   2000SSXXXXXXXXX.
0040   ea                                                .

Vraag

0000   30 ea e7 3d 8b 60 20 ee 28 01 45 00 08 00 45 00   0..=.` .(.E...E.
0010   00 24 52 d9 00 00 40 11 4a 40 0a 0a 64 9f 0a 0a   .$R...@.J@..d...
0020   64 fd 22 c3 22 c3 00 10 e4 31 7f 03 75 31 00 28   d."."....1..u1.(
0030   04 09                                             ..

Antwoord

0000   20 ee 28 01 45 00 30 ea e7 3d 8b 60 08 00 45 00    .(.E.0..=.`..E.
0010   00 73 35 47 00 00 ff 11 a8 82 0a 0a 64 fd 0a 0a   .s5G........d...
0020   64 9f 22 c3 22 c3 00 5f 5e 07 aa 55 7f 03 50 00   d.".".._^..U..P.
0030   02 ff ff ff ff 35 32 30 30 30 53 53 58 XX XX XX   .....XXXXXXXXXXX
0040   XX XX XX XX XX 47 57 32 30 30 30 2d 58 53 20 4f   XXXXXGW2000-XS O
0050   44 4d 20 43 6c 69 65 6e 74 20 53 4e 00 00 00 00   DM Client SN....
0060   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
0070   00 00 33 00 33 00 0e ff ff 01 0f 00 01 00 00 86   ..3.3...........
0080   54                                                T

Vraag wat zijn de wachtwoorden om te verbinden via SolorGo:
0000   30 ea e7 3d 8b 60 20 ee 28 01 45 00 08 00 45 00   0..=.` .(.E...E.
0010   00 24 51 4d 00 00 40 11 4b cc 0a 0a 64 9f 0a 0a   .$QM..@.K...d...
0020   64 fd 22 c3 22 c3 00 10 5f a7 7f 03 9c 40 00 10   d."."..._....@..
0030   61 9c                                             a.

Antwoord

0000   20 ee 28 01 45 00 30 ea e7 3d 8b 60 08 00 45 00    .(.E.0..=.`..E.
0010   00 43 35 49 00 00 ff 11 a8 b0 0a 0a 64 fd 0a 0a   .C5I........d...
0020   64 9f 22 c3 22 c3 00 2f fd a7 aa 55 7f 03 20 31   d."."../...U.. 1
0030   32 33 34 00 00 00 00 00 00 00 00 00 00 00 00 31   234............1
0040   32 33 34 35 36 37 38 00 00 00 00 00 00 00 00 1e   2345678.........
0050   58                                                X

etc.

[Voor 84% gewijzigd door msatter op 26-04-2021 13:42. Reden: Sems en screendump WireShark erbij gezet]


Acties:
  • +6Henk 'm!
  • Pinned

  • ThinkPad
  • Registratie: juni 2005
  • Laatst online: 17:55

ThinkPad

Moderator Duurzame Energie & Domotica
Nadat ik de firmware heb laten bijwerken door Goodwe en ik de omvormer kon uitlezen met de SolarGo app, heb ik met bovenstaande code als basis het aan de praat gekregen om de omvormer (3000XS) via Node-RED uit te lezen:


Ik stuur een hex string naar de omvormer, waarop hij reageert en de data terugstuurt. In Node-RED haal ik uit de ontvangen hexstring de waardes en zet deze om naar variabelen:


De flow in Node-RED:
code:
1
[{"id":"1114148f.9e4e3b","type":"tab","label":"Flow 1","disabled":false,"info":""},{"id":"901d892e.0b27e","type":"function","z":"1114148f.9e4e3b","name":"","func":"var inverter_reply = msg.payload;\n\nvar year = \"20\" + inverter_reply.readInt8(5); // \nvar month = inverter_reply.readInt8(6); // \nvar day = inverter_reply.readInt8(7); // \nvar hour = inverter_reply.readInt8(8); // \nvar minutes = inverter_reply.readInt8(9); // \nvar seconds = inverter_reply.readInt8(10); // \n\nvar timestamp = hour+\":\"+minutes+\":\"+seconds+\" \"+day+\"-\"+month+\"-\"+year;\n\n\nvar vpv = parseFloat((inverter_reply.readInt16BE(11)*0.1).toFixed(1)); // Vpv\nvar ipv = parseFloat((inverter_reply.readInt16BE(13)*0.1).toFixed(1)); // Ipv\nvar vac = parseFloat((inverter_reply.readInt16BE(41)*0.1).toFixed(1)); // Vac\nvar iac = parseFloat((inverter_reply.readInt16BE(47)*0.1).toFixed(1)); // Iac\nvar fac = parseFloat((inverter_reply.readInt16BE(53)*0.01).toFixed(2)); // Fac\nvar dc_power = parseFloat(((vpv*ipv)).toFixed(0)); \nvar ac_power = parseFloat(((vac*iac)).toFixed(0));\nvar eday = parseFloat((inverter_reply.readInt16BE(93)*0.1).toFixed(1)); // Eday\nvar etotal = parseFloat((inverter_reply.readInt16BE(97)*0.1).toFixed(2)); // Etotal\nvar rssi = inverter_reply.readInt16BE(149); // wifi signal strength?\nvar workhours = inverter_reply.readInt16BE(101); // work hours inverter\nvar temperature = parseFloat((inverter_reply.readInt16BE(87)*0.1).toFixed(1)); // Inverter temperature\nvar power = inverter_reply.readInt16BE(61); // power\nvar status = inverter_reply.readInt16BE(63); // \n\n\nvar workmode;\nswitch (status) {\n    case 0:\n        workmode = \"Wait Mode\"\n        break;\n    case 1:\n        workmode = \"Normal\"\n        break;\n    case 2:\n        workmode = \"Error\"\n        break;\n    case 4:\n        workmode = \"Check Mode\"\n        break;\n}\n\nmsg.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    timestamp\n    \n}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":480,"y":320,"wires":[["3a0e034d.bce714"]]},{"id":"3a0e034d.bce714","type":"debug","z":"1114148f.9e4e3b","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":710,"y":320,"wires":[]},{"id":"1ea4603b.d6454","type":"udp in","z":"1114148f.9e4e3b","name":"","iface":"192.168.8.21","port":"8899","ipv":"udp4","multicast":"false","group":"192.168.8.21","datatype":"buffer","x":260,"y":320,"wires":[["901d892e.0b27e"]]},{"id":"80cdaee9.19bce8","type":"udp out","z":"1114148f.9e4e3b","name":"","addr":"192.168.6.15","iface":"","port":"8899","ipv":"udp4","outport":"8899","base64":false,"multicast":"false","x":750,"y":140,"wires":[]},{"id":"46c68558.f9e15c","type":"inject","z":"1114148f.9e4e3b","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":280,"y":140,"wires":[["4a16c267.f83f14"]]},{"id":"4a16c267.f83f14","type":"function","z":"1114148f.9e4e3b","name":"","func":"var inverter_ask = Buffer.from(\"7F0375940049D5C2\",\"hex\");\n\nmsg.payload = inverter_ask;\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":480,"y":140,"wires":[["80cdaee9.19bce8"]]},{"id":"dae4530a.7c94c","type":"comment","z":"1114148f.9e4e3b","name":"Request inverter data","info":"","x":300,"y":100,"wires":[]},{"id":"cea711ef.0e5a68","type":"comment","z":"1114148f.9e4e3b","name":"Parse received data","info":"","x":290,"y":280,"wires":[]}]


De function node heb ik intussen al weer bijgewerkt, ik bereken nu de CRC en verwerk het bericht pas als deze klopt. Merkte namelijk dat ik heel soms een incompleet bericht binnenkreeg. Hierbij de meest recente inhoud van de function node:
JavaScript:
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
var inverter_reply = msg.payload;

var message = inverter_reply.slice(2); // Remove 'AA55' from start of message
var message = message.slice(0, -2); //Remove two CRC bytes from end of message

function crc16(buffer) {
    var crc = 0xFFFF;
    var odd;

    for (var i = 0; i < buffer.length; i++) {
        crc = crc ^ buffer[i];

        for (var j = 0; j < 8; j++) {
            odd = crc & 0x0001;
            crc = crc >> 1;
            if (odd) {
                crc = crc ^ 0xA001;
            }
        }
    }
    return crc.toString(16);
}

//Calculate CRC ourselves
var calculated_crc = crc16(message);

//Get CRC from inverter reply and un-reverse it
var reply_crc = inverter_reply.slice(-2).toString('hex');
var crc1 = reply_crc.slice(0, 2);
var crc2 = reply_crc.slice(-2);
var new_crc = crc2 + crc1;

if (new_crc == calculated_crc) {
    //var year = "20" + inverter_reply.readUInt8(5);
    var year = 2000 + inverter_reply.readUInt8(5); 
    var month = inverter_reply.readUInt8(6);
    var day = inverter_reply.readUInt8(7); 
    var hour = inverter_reply.readUInt8(8); 
    var minutes = inverter_reply.readUInt8(9); 
    var seconds = inverter_reply.readUInt8(10); 
    
    var minutes = (minutes < 10 ? '0' : '') + minutes;
    var seconds = (seconds < 10 ? '0' : '') + seconds;
    var timestamp = hour + ":" + minutes + ":" + seconds + "  " + day + "-" + month + "-" + year;

    //Putting '+' in front to make it a number instead of a string
    var vpv = +(inverter_reply.readUInt16BE(11) * 0.1).toFixed(1);
    var ipv = +(inverter_reply.readUInt16BE(13) * 0.1).toFixed(1);
    var vac = +(inverter_reply.readUInt16BE(41) * 0.1).toFixed(1);
    var iac = +(inverter_reply.readUInt16BE(47) * 0.1).toFixed(1);
    var fac = +(inverter_reply.readUInt16BE(53) * 0.01).toFixed(2);
    var eday = +(inverter_reply.readUInt16BE(93) * 0.1).toFixed(1);
    var etotal = +(inverter_reply.readUInt32BE(95) * 0.1).toFixed(1);
    var rssi = inverter_reply.readUInt16BE(149);
    var workhours = inverter_reply.readUInt32BE(99);
    var temperature = +(inverter_reply.readUInt16BE(87) * 0.1).toFixed(1);
    var power = inverter_reply.readUInt32BE(59);
    var status = inverter_reply.readUInt16BE(63);
    var workmode;

    switch (status) {
        case 0:
            workmode = "Waiting"
            break;
        case 1:
            workmode = "Normal"
            break;
        case 2:
            workmode = "Error"
            break;
        case 4:
            workmode = "Checking"
            break;
    }

    msg.payload = {
        vpv,
        ipv,
        vac,
        iac,
        fac,
        power,
        eday,
        etotal,
        rssi,
        workhours,
        temperature,
        status,
        workmode,
        timestamp
    }

    var nodestate = {
        text: workmode + ' - Power: ' + power + 'W - ' + timestamp,
    };
    node.status(nodestate);

    return msg;
}

[Voor 255% gewijzigd door ThinkPad op 06-07-2021 21:43]

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


Acties:
  • 0Henk 'm!

  • wlmpie
  • Registratie: oktober 2007
  • Laatst online: 17:48
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


  • 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: 17:55

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:
  • +2Henk 'm!

  • ThinkPad
  • Registratie: juni 2005
  • Laatst online: 17:55

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!

  • 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]


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]


  • 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:
  • 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:
  • +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.]


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: 19:04
Even een bevestiging vanuit mijn kant dat het lokaal uitlezen van een 5000D-NS ook lukt na een firmware update door GoodWe.

Acties:
  • +1Henk 'm!

  • Maasluip
  • Registratie: april 2002
  • Laatst online: 12:49

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


  • msatter
  • Registratie: maart 2021
  • Niet online
Zo ziet nu mijn 'PV-dashboard' eruit en hier zie je rechts dat waardes gemiddeld worden om zo een betere/mooiere grafiek te krijgen op PVOutput.org. Ook zie je dat ik nu ook in de meterkast de geïmporteerde stroom kan lezen en die gaat dag en nacht naar PVOutput. Ik kan precies zien wanneer de koelkast werkt of ik de magnetron of waterkoker gebruik.

Omdat in het blauwe deel de niet goed het onderscheid kon worden gemaakt of het nu een middeling of een nacht uitlezing was ben ik uitgeweken naar een tweede UDP poort van 9988 in de router weer naar poort 8899 wordt omgezet en weer antwoord op 9988.

De twee triggers in het donkerblauwe deel zijn nu gescheiden en de bovenste doet nu alleen op het opvragen van de waardes uit de omvormer en de tweede zorgt voor de ondersteunende parameters voor het verzenden, temperatuur etc.

Ik zend geen voltage meer naar PVOutput omdat de lijn niet veel toegevoegde waarde heeft en nogal zigzagde wat de grafiek ook minder overzichtelijk maakte.


Acties:
  • +1Henk 'm!

  • wlmpie
  • Registratie: oktober 2007
  • Laatst online: 17:48
Ik heb inmiddels alles werkend en ook het sturen van de data naar domoticz.
Ik heb de flow van @ThinkPad als basis gebruikt en ik maak vervolgens in aparte functies mqtt berichtjes aan voor domoticz (met mosquito als broker)
Hieronder wat screenshots ter inspiratie.
Een echte programmeur zou dit waarschijnlijk veel slimmer doen, maar het werkt.

Acties:
  • 0Henk 'm!

  • ThinkPad
  • Registratie: juni 2005
  • Laatst online: 17:55

ThinkPad

Moderator Duurzame Energie & Domotica
Ik krijg dat niet voor elkaar.

Voorbeeldje met de netspanning (Vac), even een hele reply van de omvormer in https://hexed.it/ geplakt:
positie 0x29, daar staat hij als 16-bit:



Twee posities naar voren (0x27) en dan kijken naar 32-bit waardes. Ik zie niks herkenbaars.

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 heb hier wat interessante gegevens na het overschakelen naar de AC voor de logging van het wattage.

In de uitsnede van de grafiek is de paarse lijn het voltage en in de nacht log ik die van stroomnet en overdag die van de DC zijde van de omvormer. De rode lijn is het interne verbruik van stroom en hier trek ik het wattage van de kWh meter van de opbrengst af. De groene lijn is het wattage opgewekt door de omvormer.
Het wattage van de kWh meter is positief als er stroom geïmporteerd wordt en negatief als de stroom geëxporteerd wordt.

Zichtbaar is dat de omvormer zelf stroom trekt bij het opstarten en de piek (gemiddeld) is 99 Watt extra.

Links onder het legenda label zie je de 'rust' wattage van 43 Watt en de koelkast die staat en dat is de blok golf. Het start wattage van de blokgolf is 188 Watt en het einde 156 Watt.

Meet ik weer de koelkast als hij aanslaat nadat ook de omvormer werkt dan de start 278 en eind 239 Watt.

Nu gaat de wattage lijn kronkelen en de 'rust' waarde was 43 Watt en nu is die rond de 100 Watt.

Kan betekenen dat de omvormer ook stroom gebruikt als die werkt of dat ergens een verlies van stroom is of dat er meet onnauwkeurigheden zijn. Of ik doe het gewoon verkeerd en moet mijn berekeningen aanpassen. ;)

Of...de kWh meter heeft last van frequenties vanuit de omvormer net als hij één van mijn LED lampen weergeeft als 40 Watt i.p.v. de 6 Watt wat die werkelijk gebruikt.



code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
11/07/21    7:10AM  0.100kWh    0.045kWh/kW 129W    0W  0.000kW/kW  29.0C   253.6V  0.705kWh    136W
11/07/21    7:05AM  0.100kWh    0.045kWh/kW 119W    0W  0.000kW/kW  28.8C   259.9V  0.705kWh    239W
11/07/21    7:00AM  0.100kWh    0.045kWh/kW 116W    0W  0.000kW/kW  28.6C   262.4V  0.700kWh    247W
11/07/21    6:55AM  0.100kWh    0.045kWh/kW 105W    0W  0.000kW/kW  28.5C   266.3V  0.694kWh    253W
11/07/21    6:50AM  0.100kWh    0.045kWh/kW 100W    0W  0.000kW/kW  28.2C   258.7V  0.686kWh    246W
11/07/21    6:45AM  0.100kWh    0.045kWh/kW 93W -   -   28.0C   254.9V  0.678kWh    248W
11/07/21    6:40AM  0.000kWh    0.000kWh/kW 89W -   -   27.7C   257.9V  0.668kWh    247W
11/07/21    6:35AM  0.000kWh    0.000kWh/kW 88W -   -   27.3C   244.5V  0.658kWh    254W
11/07/21    6:30AM  0.000kWh    0.000kWh/kW 86W -   -   27.0C   265.7V  0.647kWh    258W
11/07/21    6:25AM  0.000kWh    0.000kWh/kW 78W -   -   26.4C   252.2V  0.635kWh    278W
11/07/21    6:20AM  0.000kWh    0.000kWh/kW 67W -   -   25.7C   244.8V  0.621kWh    251W
11/07/21    6:15AM  0.000kWh    0.000kWh/kW 0W  -   -   25.1C   277.8V  0.608kWh    48W
11/07/21    6:10AM  0.000kWh    0.000kWh/kW 0W  -   -   25.0C   275.0V  0.604kWh    48W
11/07/21    6:05AM  0.000kWh    0.000kWh/kW 0W  -   -   24.9C   272.8V  0.600kWh    48W
11/07/21    6:00AM  0.000kWh    0.000kWh/kW 0W  -   -   24.8C   271.4V  0.596kWh    44W
11/07/21    5:55AM  0.000kWh    0.000kWh/kW 0W  -   -   24.7C   270.0V  0.592kWh    43W
11/07/21    5:50AM  0.000kWh    0.000kWh/kW 0W  -   -   24.6C   264.0V  0.589kWh    43W
11/07/21    5:45AM  0.000kWh    0.000kWh/kW 0W  -   -   24.4C   253.3V  0.585kWh    43W
11/07/21    5:40AM  0.000kWh    0.000kWh/kW 0W  -   -   24.3C   246.1V  0.582kWh    43W
11/07/21    5:35AM  0.000kWh    0.000kWh/kW 0W  -   -   24.0C   246.3V  0.578kWh    142W

[Voor 2% gewijzigd door msatter op 11-07-2021 10:43. Reden: Ledlamp deel.]


  • msatter
  • Registratie: maart 2021
  • Niet online
Ik heb de "apparent power" van de kWh meter gebruikt en in het Nederlands heet dit schijn vermogen.

Ik zie hier een piek van 860 VA en daar gaat zo'n 200 VA af voor het basis gebruikt en de koelkast die op dat moment draaide. Meer dan 600 VA schijnverbruikt en dat is een gemiddelde waarde over vijf minuten en dan een meting om de 25 seconden.

Wat ik eigenlijk wil berekenen is het vermogen verbruikt tussen de PV en wat wordt afgenomen of teruggeleverd aan het net.



code:
1
2
3
4
5
6
7
8
9
10
11
12
13
13/07/21    6:05AM  0.000kWh    0.000kWh/kW 83W 0W  0.000kW/kW  27.5C   251.8V  0.446kWh    109V
13/07/21    6:00AM  0.000kWh    0.000kWh/kW 80W 0W  0.000kW/kW  26.9C   250.9V  0.442kWh    115VA
13/07/21    5:55AM  0.000kWh    0.000kWh/kW 77W 0W  0.000kW/kW  26.2C   246.0V  0.433kWh    122VA
13/07/21    5:50AM  0.000kWh    0.000kWh/kW 18W 0W  0.000kW/kW  25.4C   229.4V  0.423kWh    166VA
13/07/21    5:45AM  0.000kWh    0.000kWh/kW 0W  0W  0.000kW/kW  25.2C   273.9V  0.411kWh    181VA
13/07/21    5:40AM  0.000kWh    0.000kWh/kW 0W  0W  0.000kW/kW  25.0C   269.8V  0.399kWh    184VA
13/07/21    5:35AM  0.000kWh    0.000kWh/kW 0W  0W  0.000kW/kW  24.8C   262.4V  0.386kWh    188VA
13/07/21    5:30AM  0.000kWh    0.000kWh/kW 0W  -   -   24.4C   243.8V  0.373kWh    860VA
13/07/21    5:25AM  -   -   -   -   -   25.5C   228.8V  0.362kWh    204VA
13/07/21    5:20AM  -   -   -   -   -   25.5C   229.2V  0.347kWh    214VA
13/07/21    5:15AM  -   -   -   -   -   25.5C   226.7V  0.332kWh    89VA
13/07/21    5:10AM  -   -   -   -   -   26.0C   227.8V  0.329kWh    64VA
13/07/21    5:05AM  -   -   -   -   -   25.5C   228.1V  0.326kWh    65VA


Update: de Watt waardes veranderd in VA naar aanleiding van de posting van Proton hieronder.

De kWh meter heeft nog meer waardes beschikbaar: Power Factor, Active Watt, Reactive VAr.

[Voor 6% gewijzigd door msatter op 13-07-2021 12:17. Reden: Watt vervangen door VA. Dank Proton.]


  • Me Albert
  • Registratie: november 2018
  • Laatst online: 22-07 22:42
Ik heb een ticket aangevraagd bij GoodWe en die is vandaag gesloten. Versie is nu 1.10.15.
Met de SolarGo app krijg ik netjes gegevens terug.
Ik heb de node-red code van @ThinkPad gekopieerd en in node-red gezet. Het IP adres 192.168.8.15 aangepast naar het IP adres van mijn omvormer.
En dan gebeurd er niks. Wat moet ik nog meer aanpassen?
Krijg nog wel de error geen response from server

[Voor 36% gewijzigd door Me Albert op 21-07-2021 21:14]

Gasloos sinds 10-03-2019. Panasonic 5Kw monoblok. panelen:2760 Wp ZZO en 2650 Wp zuid.

Pagina: 1


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