DIY: Zonnepanelenmonitor - Stecapower opbrengst uitlezen met de Raspberry Pi

Zo'n vijf jaar geleden besloten we zonnepanelen op ons dak te leggen en omdat ik het leuk vind om te knutselen, wilde ik ze zelf installeren. Omdat er precies ruimte was voor negen panelen had ik er voor het gemak alvast negen besteld. Waar ik toen nog niet over nagedacht had, was de minimale afstand tussen de panelen in verband met de slagschaduw. Dit komt in Nederland al snel neer op anderhalf keer de breedte van het paneel, zodat ook in de wintermaanden de opbrengst van de achterste panelen niet al teveel achterblijft. En daar zit je dan, met negen panelen voor een dak waar er eigenlijk maar zes op passen. Of toch niet?

Na wat wikken en wegen besloot ik de gok te wagen en de overige drie in tegengestelde richting te leggen. Omdat ons dak zuidoost gericht is, was dit geen heel gek idee. Omdat de opbrengst van ongelijk belichtte panelen sterkt vermindert bij gebruik van een enkele inverter (het apparaat dat van de gelijkstroom uit je panelen 230V wisselstroom maakt) wilde ik er dus een kleine inverter naast plaatsen.

Deze kleine inverter had alleen geen interface voor het al dan niet geautomatiseerd uitlezen van de (dag)opbrengst en dus moest ik aan de slag.

Oplossing

De steca500 kan maximaal 500W leveren en dit mag in Nederland rechtstreeks op een stopcontact aangesloten worden. Mijn eerste ingeving was om een goedkope commerciële powermeter van een doe-het-zelfketen te kopen, zodat ik in elk geval iets af kon lezen. Deze meters maakt het niet uit hoe de stroom loopt en meten dus ook terug geleverd vermogen aan het stopcontact. Ideaal als low-budget panelen monitor. Toch kriebelde de behoefte te automatiseren. De opbrengst van de overige zes panelen werd namelijk al een tijdje netjes bijgehouden door een Raspberry Pi met bluetooth interface.

In deze meters wordt vaak een simpel powermeter IC gebruikt, zoals de ADE7755. Analog Devices noemt dit in de datasheet een Energy Metering IC with Pulse Output.

Deze ADE7755 heeft volgens dezelfde datasheet drie uitgangen waar het gemeten vermogen van afgelezen kan worden: F1, F2 en FC. F1 en F2 zijn laagfrequent en bedoeld om een mechanisch telmechanisme mee aan te sturen op bijvoorbeeld 100 pulsen per kilowattuur. FC is een hoogfrequent(er) signaal dat bedoeld is voor kalibratiedoeleinden en directe metingen via een microcontroller of iets dergelijks. Dit is de uitgang die ik heb gebruikt. Als je goed kijkt naar de PCB (de printplaat), zie je dat F1 en F2 in deze meter helemaal niet gebruikt worden. De makers van de meter zijn dus zelf ook uitgegaan van FC en dat is te merken, want het signaal op FC blijkt na wat testen keurig gekalibreerd te zijn naar 0.1Hz per W. Dus als we 1Hz op FC meten (t tussen twee pulsen is 1 seconde) meten we 10W.

 

Lastig

Aan SMD-pinnetjes solderen is een lastig karwei, maar ik vond een geschikter punt iets verderop de PCB dat duidelijk via een spoortje met FC verbonden was (rode draad). Zo vond ik ook een geschikt punt voor de signaal aarde (DGND) bij de zwarte draad (waarschijnlijk de emitter van de transistor). Als je een hot-glue pistool hebt, is het slim om even een druppel lijm op de gemaakte verbinding te laten vallen, zodat de draden niet ineens los door de meter kunnen gaan slingeren. Om de verbinding tussen de Raspberry en de meter gemakkelijk los te kunnen maken, heb ik aan beide kanten een 3,5mm jack verbinding en een bijbehorend kabeltje gemaakt.

 

Opto coupler

Om de (tijd tussen de) pulsen te kunnen meten, sluiten we het FC-signaal van het meet IC via een opto-coupler op de Raspberry Pi aan. Dit is altijd een goed idee. De opto-coupler scheidt namelijk het elektrische circuit van de energiemeter van dat van de Raspberry en voorkomt zo doorbranden of anderszins schade aan de Raspberry. In dit geval is het ook een handige level-shifter, die ervoor zorgt dat we probleemloos en veilig van het 5V domein in de meter overschakelen op 3.3V van de Raspberry.

Een opto-coupler bestaat uit een LED en een fotogevoelige transistor in een compacte DIL6 behuizing. 

Aan de LED kant heb ik via een 470Ω weerstand het FC signaal aangesloten en aan de transistorkant gaat de collector aan +3.3V(onderste rij, 1e pin van links van de Raspberry) en de emitter aan GPIO17 (onderste rij, 6e pin van links). 

De 10kΩ weerstand sluiten we niet zelf aan. Hiervoor gebruiken we de interne pulldown weerstand die de Raspberry zelf biedt, mits de GPIO-pin daarvoor softwarematig geconfigureerd wordt (zie GPIO-initialisatie code in de source). Vergeet vooral de krimpkous niet om kortsluiting te voorkomen.

Als alles aangesloten is, kunnen de Raspberry en de Powermeter weer dichtgemaakt worden en de software geïnstalleerd worden. Daarvoor maken we gebruik van Github en een compiler. Log in op de Raspberry en installeer de benodigde packages:

$ sudo apt-get install build-essential git wiringpi

 

Haal de benodigde software op van mijn Git repository:

$ git clone https://github.com/mrvanes/stecapower.git

Navigeer naar de stecapower/src directory:

$ cd stecapower/src

 

en start de compilatie:

$ make

 

Als alles goed gegaan is, heeft de compiler nu een uitvoerbaar bestand met de naam stecapower gemaakt. Kopieer dit bestand naar /usr/local/sbin op de volgende manier:

$ cp stecapower /usr/local/sbin

 

Kopieer het init.d script uit de utils directory naar /etc/init.d en maak een symbolic link aan naar de runlevel2 directory:

$ cd ../utils

$ sudo cp stecapower /etc/init.d

$ ln -s /etc/init.d/stecapower /etc/rc2.d/S99stecapower

 

Hierdoor zal stecapower na een reboot automatisch starten. Voor nu starten we stecapower met de hand:

$ sudo /etc/init.d/stecapower start

 

In /tmp/stecapower.log verschijnt wat debug informatie tijdens het opstarten van de daemon. Het uitlezen van de opgeleverde energie doe je met een simpele connectie naar localhost poort 54321. Hiervoor installeren we eerst het handige tooltje netcat:

$ sudo apt-get install netcat-traditional

$ nc localhost 54321

109 677 243722

 

Het eerste getal geeft het huidige opgeleverde vermogen (P) in Watts. Het tweede getal is de opgeleverde energie (E) in Watt-uren en het laatste getal is het totaal aantal gemeten FC pulsen. Dit is vooral toegevoegd als controlemiddel om snel te kunnen zien of de Raspberry ook daadwerkelijk iets meet op GPIO17. Deze getallen kunnen in een bash script als volgt geïsoleerd worden in verschillende variabelen:

P=`nc localhost 54321 | cut -d" " -f1`

E=`nc localhost 54321 | cut -d" " -f2`

 

$P en $E zijn hierna beschikbaar om bijvoorbeeld met een curl commando naar een server te sturen. Om elke dag met een schone lei te kunnen beginnen, reageert de daemon op het SIGHUP signaal door alle tellers te resetten:

$ sudo pkill -HUP stecapower

 

Dit commando kan als volgt één keer per dag in een cron job uitgevoerd worden door onderste regel in een bestandje onder de directory /etc/cron.d op te nemen:

1   3    * * * root pkill -hup stecapower

 

Het commando zal dan elke nacht om 1 minuut over 3 uitgevoerd worden. Ik heb stecapower meetcode zo leesbaar mogelijk gemaakt door veel commentaar tussen de code toe te voegen.

 

timer_handler()

Bereken de huidige pulsfrequentie en daarme het vermogen en opgeleverde energie op basis van de door MyInterrupt gemeten tijd tussen de laatste twee FC pulsen.

 

MyInterrupt()

Meet huidge de verstreken tijd sinds de laatste FC puls.

 

daemonize()

Sluit programma af en start achtergrond proces (fork)

Initialiseer een timer die elke 5 seconden timer_handler() aanroept

 

main() {

Dit is het hoofdprogramma met initialisatie

 

Initialiseer GPIO pins en registreer interrupt op GPIO pin17 die naar MyInterrupt wijst (systemboard pin 0)

 

while(1) {

Oneindige loop die wacht op verbinding met poort 54321 en dan

de geleverde energie print

}

}

 

NEDLINUX FORUM

Het nederlandse linuxforum
Voor beginners en pro’s

 

 

 

 

E-mailadres



 

 

Nieuwste editie:

Linuxmag op Facebook

@linuxmagnl op Twitter

linuxmagNL Niemand kent alle opties van alle commandline tools uit het hoofd. Het is belangrijker om te weten waar je de juist… https://t.co/4DwEhHOKBX
16hreplyretweetfavorite
linuxmagNL Package management is één van de sterke punten van Linux in vergelijking met Windows en macOS. Linux Mint bevat eig… https://t.co/pLxEVxktdp
linuxmagNL Mailto-links voor webmail, Heimwee naar Unity, rc.local activeren in systemd & Schakel zwakke encryptie in OpenSSH… https://t.co/VL6XwCiP8O