Growatt Wifi Module (via Raspberry Pi) automatische upload naar PVoutput

Het is me uiteindelijk gelukt om de data van mijn Growatt 3600MTL omvormer automatisch te uploaden naar PVOutput. Hiervoor gebruik ik een Growatt Wifi Module en een Raspberry Pi. Zie hier:

http://pvoutput.org/intraday.jsp?sid=19577

De volledige procedure hoe dit op te zetten op de Raspberry Pi staat hieronder stap voor stap uitgelegd:

Growatt Wifi Module via Raspberry Pi to PVOutput v2.3.pdf

De bijbehorende scripts kun je hier downloaden:

growattwifi_to_pvoutput_v2.3.2.tar

Graag hoor ik eventuele feedback, verbeteringen en suggesties van jullie.

edit 20150709/22:45: Versie 2.3.x van het pdf document en de scripting toegevoegd.

Vorige versie v2.1 - 20150709/22:45:

Growatt Wifi Module via Raspberry Pi to PVOutput v2.1.pdf 
growattwifi_to_pvoutput_v2.1.tar

Vorige versie v2.0 - 20140614/13:30:
Growatt Wifi Module via Raspberry Pi to PVOutput v2.0.pdf
growattwifi_to_pvoutput_v2.0.tar

Note: Er zijn nu vier firmware versies van de Growatt Wifi Module bekend. Versie 4.0.0.0 en 3.0.0.0 werken met dezelfde instellingen als voor versie 2.0.0.0

Weergaven: 24412

Opmerking

Je moet lid zijn van Energie Community om reacties te kunnen toevoegen!

Word lid van de community van Energie Community

Reactie van Joris op 3 September 2018 op 20.31

Ok, laatste bericht hierover: het werkt. Ik was vergeten process_growatt_pvoutput.sh executable te maken met sudo chmod +x process_growatt_pvoutput.sh

Eerst kon cron het script niet runnen, nu wel. Tenminste logfiles zien er hoopgevend uit, het runt nu, en hoop dus vanaf morgen mijn output naar pvoutput.org te streamen!

Reactie van Joris op 3 September 2018 op 19.58

Sorry de cron lines hieronder zijn trouwens uit de sudo crontab -e file. Anders had de username (root) er nog tussen gemoeten

Reactie van Joris op 3 September 2018 op 19.35

Thanks Menno. Volgens mij gaat er iets niet goed in de instructies die ik aan cron geef, maar ik snap nog niet helemaal wat er mis gaat:

  • sudo bash process_growatt_pvoutput.sh werkt prima en data komt in mijn pvoutput.org terecht
  • nano /var/log/syslog laat zien dat cron elke 5 minuten runt. Voorbeeld van logline: Sep 3 19:25:01 raspberrypi CRON[20023]: (root) CMD (/home/pvoutput/scripts/process_growatt_pvoutput.sh >/dev/null 2>&1)
  • nano ../logs/growatt_process.log laat echter alleen log entries zien van de process_growatt_pvoutput.sh die ik vanaf de command line aangeroepen heb, en dus niet van de cron job elke 5 minuten
  • conclusie: mijn cron job runt wel, maar kan de instructie niet uitvoeren, en er gebeurt dus niks
    • dit klopt conceptueel ook met dat ik eerder ook geen output op server.growatt.com had. Het process_growatt_pvoutput.sh script ververst elke keer de iptables en na de eerste keer handmatig runnen had mijn growatt server weer data, maar daarvoor was mijn iptables config leeg omdat ik mijn pi gisteravond had gereboot (en blijkbaar werkt dat terugzetten van settings toch niet helemaal goed). Maar dat had natuurlijk elke keer moeten gebeuren dat het script via de cron job aangeroepen werd. Oftewel: de cron job werkt niet

Kan iemand me helpen te debuggen wat er mis gaat in mijn cronjob? Ik heb de instructies al vanaf /etc/cron.d/growatt_pvoutput naar de standaard sudo crontab -e gebracht omdat ik dacht dat het daar misschien beter zou gaan, maar no luck. Hieronder mijn cron instructies:

  • # Run the main processing script every 5 minutes
  • */5 * * * * /home/pvoutput/scripts/process_growatt_pvoutput.sh >/dev/null 2>&1
  • # Remove - correctly processed files - older then 7 days
  • 30 0 * * * find /home/pvoutput/processed -name "growatt*ok" -type f -mtime +7 -exec rm {} \;
  • # Remove - original capture files, which split into new files - older then 30 days
  • 30 0 * * * find /home/pvoutput/processed -name "growatt*split" -type f -mtime +30 -exec rm {} \;
  • # Remove - files not correctly uploaded - older then 30 days
  • 30 0 * * * find /home/pvoutput/processed -name "growatt*badupload" -type f -mtime +30 -exec rm {} \;
  • # Remove - original capture files that were to small - older then 30 days
  • 30 0 * * * find /home/pvoutput/processed -name "growatt*size" -type f -mtime +30 -exec rm {} \;

On a high note: het lijkt er dus wel op dat mijn python script en aanpassingen aan process_growatt_pvoutput.sh werken, omdat handmatig runnen dus wel werkt!

Reactie van Menno Regts op 3 September 2018 op 15.31

Edit laatste bericht,Joris het lijkt er meer op dat je Pi van je router een ander ip adres heeft gekregen. Het beste kan je het goede ip adres reserveren in de instellingen van je router.

Reactie van Menno Regts op 3 September 2018 op 12.12

Joris, zou het kunnen dat de port forward-ingen in de Pi na een reboot weer terug gezet zijn? Het koste mij het nodige zoekwerk in Google om dat goed te krijgen.

Reactie van Joris op 3 September 2018 op 9.32

Update: ok, misschien is het omdat het erg bewolkt is vandaag, maar ik heb nu zowel geen output meer op de growatt server als op pvoutput.org. Dus misschien nog even wachten met die scriptjes van mij implementeren :-|

Reactie van Joris op 2 September 2018 op 20.41

LET OP: doe het onderstaande alleen als de standaard methode van Sander Plug niet werkt, en je in je TCPdump output vaak het woord "Growatt" ziet. Je hebt dan een versie van de Growatt module die de verstuurde data een beetje versleutelt. Als je dit toepast op een onversleutelde versie van de data dan versleutel je het juist en wordt het onbruikbaar.

OK, dit is hoe het nu bij mij werkt. Garanties tot de deur. Laat weten als het niet werkt, misschien kan ik helpen.

Hoe je kan testen of het werkt:

  • Optie 1: run op command line gewoon sudo bash -x process_growatt_pvoutput.sh
  • Optie 2: test het script op een bestaande .cap.split file die je tot nu toe niet hebt kunnen lezen
    • Run op command line (in map /pvoutput/scripts) sudo python3 remove_growatt_mask.py ../processed/<filename>.cap.split <serial_number van je inverter>
    • Run op command line (in map /pvoutput/scripts) sudo bash view_growatt_data.sh ../processed/<filename>.cap.split

Zoals je hierboven ziet moet je het serial number van de inverter meegeven naar het python script. Dit is omdat het script nooit helemaal zeker weet wanneer het goed gedecode is, tot hij het serial number kan lezen. Stel je voor dat je tcpdump 10 bytes zou zijn, dan zou je het growatt mask kunnen toepassen als xxxgrowatt, of als xxgrowattx, of als xgrowattxx, of als growatxxx. Het script doet dus een aantal iteraties om te bepalen wanneer hij het mask goed over de message heengelegd heeft, en gebruikt het serial number om dit te bepalen. 

Een mogelijke toekomstige verbetering van het script zou zijn om vooraf te kunnen bepalen waar het bitmask zou moeten beginnen, zodat deze iteraties niet meer nodig zijn.

Daarnaast: de '.cap.split' files die weggeschreven worden in het process_growatt_pvoutput.sh script, worden nu nog niet gedecode. Mocht je dat willen dan moet je het script dus even aanpassen dat de decodering op een andere plek gebeurt. Of gewoon handmatig decoderen door vanaf de commandline het python script aan te roepen natuurlijk.

Hoop dat dit helpt, ben benieuwd of dit de zaken ook voor andere mensen oplost of dat ik iets in elkaar gespaghetti'd heb wat alleen bij mij werkt!

Reactie van Kees Rozenberg op 31 Augustus 2018 op 21.47

Petje af Joris! Ook ik ben niet zo'n programmeer crack, maar wat je kunt doen is een shellscript maken waarin je je python script aanroept. Of dat kan je ook doen vanuit het shellscript van Sander. Heb even lopen zoeken, in een shellscript op bitniveau gaan XOR'ren gaat hem niet gelijk worden denk ik, je vervalt al snel naar iets in Perl, PHP of Python. En hoe luidt die uitspraak ook alweer? "If it looks stupid but it works, it aint stupid"'. Om na een dergelijk Python script jezelf nog af te durven schilderen als Linux nono doe mij in angst afvragen waar ik dan ergens zit op diezelfde schaal :) Ik zeg: Top gedaan!!!

Reactie van Menno Regts op 31 Augustus 2018 op 21.29

Goed om te horen dat Joris verder is gekomen dan ik had durven dromen. Ik had alle hoop al opgegeven en ben overgestapt op een Shine Lan. Wat het programmeren ben ik minder ver dan de leerlingen die nu op school zitten. Het enige waar ik ooit wel eens aan gesnuffeld heb was basic (if or and en goto) en het aanpassen van de config.sys en autoexec.bat. Dus Linux etc is voor mij helemaal nieuw. Maar ik blijf dit zeker volgen. En ook gebruiken als het helemaal werkt (ik kom Lan poorten te kort op de router).

Reactie van Joris op 29 Augustus 2018 op 22.12

Hallo allemaal,

New to the party. Recent 3kW Growatt omvormer met Growatt ShineWifi-S Wifi Module geinstalleerd. Ook aan de gang met deze scripts. Super werk Sander e.a., geweldig gedocumenteerd, en goed te volgen voor een totale linux nono als ik. 

Had qua decoden van de .cap file wel exact hetzelfde probleem als Menno. Gelukkig is oplossing vrij eenvoudig. Growatt heeft databericht wel "encrypted" maar met een bijzonder simpele sleutel. Ze hebben het woord "Growatt" als bitmask gebruikt om de data te versleutelen. Daarom zie je ook zo vaak "Growatt" terug komen in screenshot van Kees. Om originele data terug te krijgen heb ik het volgende gedaan:

  1. Zoals te zien in screenshot onder is het "data" stuk van het bericht 225 bytes lang. Dit is 1 startbyte 0x00 en daarna het bericht (224 bytes) met daar overheen 224/7 = 32x het woord Growatt
  2. Ik ben geen bijster goede programmeur dus ik heb (ongetwijfeld vrij omslachtig) een python script geschreven wat (1) "Growatt" omzet in een 8-bits binary representatie (7 bytes dus), (2) de .cap message ook omzet in 8-bits binary representatie (224 bytes dus), (3) per byte een bit-wise XOR uitvoert, (4) bytes weer terug aan elkaar geplakt en omgezet in hex data (en dit dus 32 keer om door de hele message heen te loopen)
  3. Vervolgens de originele hex data in de .cap file overschreven met de nieuwe data, en dit door view_growatt_data.sh getrokken en.... het werkt! Met OFFSETCORRECT=6, dus GROWATTMODULEVER 2.0.0.0 bijvoorbeeld. Verder is het volledige format van de file hetzelfde en staan bijv. de registers op dezelfde plekken, en kan het volledige sh script dus gebruikt worden

Ik zal mijn script, voorbeeldfile, etc. wel hier posten een dezer dagen. Nadat ik het een beetje opgeschoond heb.

1 vraag waar ik ontzettend mee geholpen zou zijn: ik had tot eergisteren nog nooit van .sh scripts gehoord, en kan daar dus ook werkelijk helemaal niks in. Is er iemand die het een leuke uitdaging zou vinden om deze bitmask operatie in het process_growatt_pvoutput.sh script te verwerken? Dat zou veel praktischer zijn dan een apart python script te runnen om specifiek dit te doen (plus dat ik geen idee zou hebben hoe ik dat aan zou moeten roepen :-)).

Zie uit om dit nog wat verder te brengen!

Vriendelijke groet, Joris

Recente activiteiten

Pjotter hmeer heeft gereageerd op blogbijdrage Binnenkort gaat onze nieuwe community live! van Vereniging Eigen Huis
"Vraag; informatie en blogs uit het verleden worden deze meegenomen naar het nieuwe platform? vindt er migratie plaats oud naar nieuw? Bedankt"
3 uur geleden
Vereniging Eigen Huis posted a blog post

Binnenkort gaat onze nieuwe community live!

Beste allemaal,Wij van Vereniging Eigen Huis waarderen de bijdrage die u op deze community levert enorm. Dank hiervoor!Wegens technische veroudering is dit platform echter aan vernieuwing toe. Daarom hebben we de afgelopen tijd hard gewerkt aan het opzetten van een nieuwe community over alles wat er komt kijken bij het verduurzamen van uw woning. U kunt hier vragen stellen, een discussie starten of anderen inspireren met uw ervaringen op het gebied van verduurzaming.Natuurlijk hopen wij dat u…See More
8 uur geleden
Henk Puister is nu lid van Energie Community
Zondag
Johan Vromans heeft gereageerd op blogbijdrage Nieuwe Growatt Shine WiFi S module - ander protocol van Johan Vromans
"Toppie! Ik bewaar het bij mijn aantekeningen voor het geval ik het nog eens nodig ga hebben."
Zaterdag

© 2019   Gemaakt door Vereniging Eigen Huis.   Verzorgd door

Banners  |  Een probleem rapporteren?  |  Algemene voorwaarden