Arduino PV-monitoring update

Ik heb al enkele tijd de zonnestroominstallatie (en zonneboiler) via een kleine microcontroller gekoppeld aan het internet. Leuk om te zien als je niet rondom huis bent, om te zien wat de zon zoal in Nederland teweeg brengt op je installatie, nietwaar?
Voorheen heb ik de Arduino gekoppeld gehad aan de services van Pachube.com. Leuk om te zien, en eerst een beetje te experimenteren zoals het stabiel krijgen van de software in de microcontroller. Maar goed… het gratis Pachube-account heeft zo zijn beperkingen, zoals een maximale historie van 30 dagen. Dus analyses naderhand is erg lastig, zeker als je van een jaar de seizoenswisselingen wilt raadplegen 🙂

Dus ik ben aan de slag gegaan, met zeer weinig programmeer-ervaring en heel veel ‘trail and error’  (of zoals in mijn vak, exploratory testen) beetje bij beetje vorderingen gemaakt.

Hoe het werkt…

Ik zal beginnen bij het begin, zodat anderen mogelijk een goede aanzet hebben ook hun zonnestroom-installatie op het internet te plaatsen.

Als controller is de Arduino Uno ingezet. Goed verkrijgbaar, en energiezuinig.

Voordelen van mijn nieuwe PV-monitor zijn:

  • data is opgeslagen in een eigen database bij Greenhost.nl, mijn provider en later nog toegankelijk voor analyses;
  • Historie is nagenoeg onbeperkt. Wellicht als het onhoudbaar wordt, zal ik wellicht via selecties e.e.a. uitfilteren of opschonen.
  • de grafieken worden gemaakt via PHP in combinatie met Google Visualization tools. Hier is het flink puzzelen geblazen, maar redelijk vlot onder de knie te krijgen. Ik gebruik bij voorkeur de ‘annotated timeline’, zodat je via de browser zelf kan inzoomen op de getoonde periode.
  • Energiezuinig. De Arduino Uno kan ik amper meten met mijn Cresta-verbruiksmeter, maar ik gok op 1-2 Watt verbruik (naast je internetrouter die verbinding met internet moet hebben, indien je je database bij je provider benut). Greenhost.nl host bij een energie-zuinig computercentrum (Evoswitch), en gebruikt duurzame energie.
  • Grote aanpasbaarheid. Zowel op rapport/selectie niveau, alsmede ook dataverkeer (meer/minder data vanuit Arduino verzenden? geen probleem!)
  • Sample-frequentie vrij te kiezen. Ik verzamel nu elke 10 seconden een ‘sample’ van de zonnestroominstallatie. Voor de zonneboiler ga ik naar een lagere ‘sample-rate’ (bemonsteringsfrequentie), misschien rond 1 meting per minuut.

Momenteel ben ik nog bezig met het opzetten van voldoende data, en dat vergt tijd 🙂 Daarom zal ik na enige dagen wat meer kunnen zien over hoe goed de huidige rapportages werken.

Momenteel zijn er twee beschikbaar op mijn website:

  • PV-vermogen real-time in Watt (W);
  • Opbrengst (yield) in Watt-uur (Wh);

Momenteel heb ik nog enkele andere rapportages op het oog, maar daar begin ik pas aan op moment dat ik ook meer meet-data heb en de kennis van SQL (Structured Query Language) weer opgepoetst heb. Heb je zelf ideeen qua rapporten, voel je vrij om dat in een bijdrage onderaan het artikel toe te voegen.

Communicatie van Arduino naar MySQL-database

Omdat de Arduino niet zo’n zware controller is, moeten er wat aanpassingen gedaan worden om de gemeten data in de database te krijgen. Hiervoor maak ik gebruik van een PHP-script. Dit script wordt elke keer aangeroepen door de Arduino, waarna de PHP-code de aangeleverde meetwaarden (vermogen (Watt), yield (Wh)) afvangt, en met tijd/datum in de database wegschrijft.

De hardware

Het boodschappenlijstje is beperkt tot een aantal onderdelen:

  • Arduino microcontroller (bijvoorbeeld de recente Arduino Uno);
  • voeding voor de Arduino (ik heb een schakelende voeding hiervoor, scheelt weer in (eigen) verbruik);
  • digitale kWh-meter met S0-uitgang (elektrisch, galvanisch gescheiden). Let op de nauwkeurigheid van je kWh-meter: sommige exemplaren zijn onnauwkeurig! Ik heb een exemplaar die in de 1% toleranties valt, geplaatst op de aparte elektrische groep in mijn woning;
  • USB kabel om de Arduino te programmeren (i.s.m. de Arduino ontwikkelomgeving);
  • Arduino shield (Ethershield) voor koppeling van de controller aan Ethernet/internetrouter;

Inrichting MySQL database

De database is vooralsnog redelijk eenvoudig ingericht: er is 1 database aangemaakt, voor 1 tabel. In de tabel zitten een aantal kolommen, zoals:

  • DateTime-kolom (update current timestamp);
  • jaar-notatie;
  • maand-notatie;
  • dag-notatie;
  • uur-notatie;
  • minuut-notatie;
  • seconde-notatie;
  • yield(in Wh);
  • vermogen (in Watt);

De kolommen van de datum/tijd zijn uitgebreid, aangezien ik vooralsnog niet zo’n wonder ben in het ombouwen van waarden middels query’s en PHP. Door de datum ook in aparte kolommen vast te leggen, kan ik daar met het bouwen van grafieken weer profijt van hebben.

Inrichten van de grafieken

Hiervoor komt Google Visualization in beeld! Ik heb diverse tools gezocht, maar deze beviel me eigenlijk al erg goed, zeker voor het doel wat ik beoog!

Met het doorzoeken van een geschikt diagram, is de keuze op de “Annotated timeline’ gevallen. Voordeel hiervan is dat bij het weergeven van data, onderaan het diagram een mogelijkheid is over de tijdslijn heen te schuiven, en in te zoomen op bepaalde delen in het grote geheel.

Met een ander PHP-script, waar tevens de SQL-code zit om de data uit mijn database te slurpen, wordt het Javascript van Google gevoed. Daarna komen de grafieken op beeld.

Tot zover alvast een korte update over het registreren van je zonnestroompanelen. Zodra ik weer wat wijzer ben geworden van de database, queries en andere zaken, dan kom ik hier op terug. Nu eerst… data verzamelen (want die zijn helaas niet exporteerbaar vanuit Pachube).

4 thoughts on “Arduino PV-monitoring update”

  1. Leuk project!
    De microcontroller van de Uno kun je in idle mode zetten. Dan trekt hij nog 0,3mA bij 5V. Blz 403 datasheet. En verbruikt hij nog 0,015W als je elke minuut een meting doet.
    Om een nauwkeurige vermogensmeting te doen moet je even een volt en ampere meter aansluiten op de DC input van de Uno. P=I*V.
    En voor de DC input geen oude adapter gebruiken. Word hij warm dan gaat daar de energie in zitten.
    De ethernet chip op de enternet shield verbruikt 183mA max. Dus daar gaat bij 3,3V 0,4W inzitten. Dat vind ik ook nog wel meevallen.

  2. Interessant stuk Niels. Ik wil ook nog altijd zoiets gaan maken voor onze zonnepanelen, maar weet nog niet hoe ik het beste de afstand naar het huis kan overbruggen…

    Wel nog een tip:
    Volgens mij kun jij je tabel een stuk efficiënter maken. Als ik tenminste goed begrijp wat jij opslaat:
    jaar-notatie; SMALLINT? 2Byte
    maand-notatie; TINYINT? 1Byte
    dag-notatie; TINYINT? 1Byte
    uur-notatie; TINYINT? 1Byte
    minuut-notatie; TINYINT? 1Byte
    seconde-notatie; TINYINT? 1Byte
    Deze kun je met standaard MySQL functies uit de een DateTime-veld halen.

    Bijvoorbeeld:
    SELECT YEAR(‘Datetime-kolom’) as ‘jaar’, MONTH(‘Datetime-kolom’) as ‘maand’, etc… FROM ‘metingen’;

    Kijk hier maar eens:
    http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

    Als je dan de juiste data-types gebruikt heb je heel compacte regels:
    – DateTime, DATETIME, 2 x 4 byte
    – Yield, SMALLINT 2 byte
    – Power, SMALLINT 2 byte
    = 12 byte per regel
    Bij een samplerate van 0,1Hz zijn dat 8640 regels per dag
    8640 x 12byte = 101,25 KB/dag
    x 365 = 36,09MB /jaar

    Je zou overigens kunnen overwegen om de timestamp als UNIX_TIMESTAMP in een unsigned INT (4 Byte) op te slaan. Dat scheelt je nog eens 33% aan data. Met de MySQL functie FROM_UNIXTIME() kun je ‘m dan weer aan andere MySQL datetime functies voeren.

    Succes ermee verder!

  3. Zou je de Arduino code kunnen delen (via pastebin.com bijv?)
    Ik ben namelijk op zoek naar precies zoiets, maar kan nergens een goed voorbeeld vinden van mensen die het ook naar MySQL loggen.

    Aangezien mijn programmeerkennis niet heel geweldig is, zou het een mooi opstapje zijn als ik het van jouw code kon afkijken.

Leave a Reply

Your email address will not be published. Required fields are marked *