Begin dit jaar kreeg ik het energielabel van mijn huis toegestuurd per post. Een G: het slechts denkbare energielabel. En als ik het er niet mee eens was, kon ik vierhonderd euro lappen voor een “onafhankelijk” advies bij een externe consultant… Tja, wat doe je dan? Dan schiet het je te binnen dat er nog ergens een Raspberry Pi in de meterkast verstopt zit, die al meer dan een jaar data verzameld. Waarom zou je niet kunnen 

Doel

In dit artikel wil ik je laten zien hoe je zicht krijgt op je energiegebruik van elektra en gas door het uitlezen van de slimme meterpoort P1. De data lezen we iedere minuut uit en de gegevens slaan we op in een PostgreSQL database. Ook meten we onder meer temperatuur, windsnelheid en windrichting via een weerstation. Het idee is dat het temperatuurverschil tussen binnen en buiten precies het aantal energie is, dat je in je huis stopt. Via de open source analysetool R kunnen we dit sommetje maken en een website tonen, die het actuele verbruik toont. En dit allemaal op je Raspberry Pi!

P1-poort

In de nieuwe slimme meters, die vanaf begin 2015 worden uitgerold over Nederland, is via de wet vastgelegd dat de eindgebruiker digitaal de beschikking moet hebben over de meetgegevens.

De P1-poort van je nieuwe energiemeter is een seriële poort, die uitgelezen kan worden via een serieel protocol. Toen ik eenmaal besloten had deze data te willen vastleggen, kwam het idee dat ik ook graag gas- en waterverbruik wilde meten. Mijn oude gasmeter bleek niet geschikt voor het uitlezen ervan. Zelfs niet met behulp van ingenieuze trucs, zoals een optocoupler die het spiegeltje uit hele oude meters kan zien ronddraaien en dus bij ieder rondje van de schijf een puls genereert. Dus heb ik in 2013 al een aanvraag gedaan voor een update van de meters bij mijn netwerkbeheerder en blijkbaar als één van de eersten een slimme meter in mijn huis ontvangen eind 2013. Ondertussen heb ik nu al meer dan een jaar data verzameld, dus laten we eens kijken wat je daar allemaal mee zou kunnen.

 

Weerstation

Eenmaal bezig werd het doel uitgebreid met het idee dat je zou moeten kunnen uitrekenen hoe lek je huis is. Als je namelijk beseft dat je eigenlijk door het verwarmen van je huis vooral het temperatuurverschil tussen binnen en buiten in stand houdt en dat de warmte dus continue weglekt uit je huis. Hoe beter geïsoleerd, hoe langzamer de warmte weglekt.

 

Het weerstation dat je kiest, moet wel geschikt zijn om met een PC te benaderen. Er zijn genoeg weerstations, die je via USB kunt koppelen aan je Raspberry Pi. Ik heb de beschikking over een Oregon Scientific WMR88 met een extern meetstation, dat via een radiosignaal de data overzet naar het basisstation. Dat basisstation is gekoppeld aan de RPi via USB. In het weewx-platform kun je na wat gepuzzel onder de map drivers de bibliotheek vinden, die daadwerkelijk via USB verbinding maakt met je weerstation.

 

Python generators

Een handig concept in Python is de notie van een generator. Speciaal voor een weerstation dat via verschillende sensoren op willekeurige tijdstippen nieuwe meetwaarden genereert, is dit de perfecte oplossing. In Python definieer je een functie, die luistert naar je USB-device. Zodra er een nieuw pakketje meetgegevens beschikbaar komt, geneert de functie een resultaat. Daarna is het enige wat je nog moet doen het versturen van dat pakketje naar de database. Hiervoor hebben we een recordProcesor gemaakt, die onderzoekt welk type pakketje het is (temperatuur, vochtigheid of windrichting) en aan de hand daarvan bepaald hij in welke tabel de informatie in dit pakketje moet worden opgeslagen (zie afbeelding 1).

 

 

PostgresSQL database

Op de RPi heb ik een database geïnstalleerd voor opslag van de meetdata. Het weerstation is een beetje eigenwijs en stuurt asynchroon informatiepakketjes van de losse sensoren buiten naar het basisstation in huis en dit genereert ook een pakketje op de USB-connectie. Dus de binnen- en buitentemperatuur, windsnelheden, windrichting en regenval komen op willekeurige tijden en frequenties binnen. Dat is wel iets om rekening mee te houden in de database, dus we slaan de waarnemingstijd als UTC-timestamp op. We maken een aparte tabel voor iedere meetwaarde, dus een tabel voor binnentemperatuur, buitentemperatuur, luchtvochtigheid, windrichting en windsnelheid. Als je een uitdaging zoekt, probeer dan de gegevens eens op te slaan in Big Data databases (bijvoorbeeld JSON) op te slaan. Ik gebruik DBeaver als open source SQL databasemanager voor de PostgreSQL database en deze werkt perfect.    

 

Data-analyse

Voordat de data kan worden geanalyseerd, is het handig dat je de data aggregeert (optelt) over vaste eenheden in de tijd, bijvoorbeeld per uur. Daarna kun je de gegevens uit de verschillende bronnen koppelen, zodat je op enig moment in de tijd weet wat op dat moment de meetwaarden waren van alle sensoren, die je op de Raspberry Pi hebt aangesloten.

 

Webapplicatie

Als je aan de achterkant (backend) de processen voor het verzamelen van de sensordata en het opslaan daarvan voor elkaar hebt gekregen, is het tijd om er leuke dingen mee te doen. Zelf ben ik niet zo heel handig met front-end webapplicaties, maar ik vond het toch nodig om een poging te wagen om iets in elkaar te zetten. Hiervoor wilde ik een lean & mean webapplicatie framework gebruiken en daarbij kwam ik uit op Python flask. Alles bij elkaar was het toch wel een hele uitdaging om alles op te tuigen (zie afbeelding 2).

 

Aan de slag

Voor het uitlezen van de P1-poort op de RPi heb ik sterk geleund op het mooie werk van Ge Jansen (zie links). Hij legt haarfijn uit hoe dat precies moet en het zou zonde zijn om dat hier nog een keer over te doen.

 

Hierbij een korte opsomming van de vereiste stappen:

        Koop een USB naar seriële kabel en sluit deze via de RJ45-stekker aan op je Raspberry Pi.

        Test het Python script voor het uitlezen, zodat je zeker weet dat je de goede waarden uit het bericht op de juiste manier interpreteert. Er blijken verschillende versies van het bericht te bestaan, afhankelijk van de leverancier van de slimme meter.

        Stel het Python script via crontab zo in, zodat deze op vaste tijdstippen aan de slimme meter gaat vragen wat de meterstanden zijn.

        Schrijf de verzamelde gegevens weg in de database.

 

Als je alles goed hebt gedaan, zou je met het commando in afbeelding 3 een bericht van je slimme meter op de command line kunnen laten zien.

 

 

Weerstation uitlezen

Voor het uitlezen van het weerstation staan we wederom op de schouders van reuzen! Er blijken best wel een hoop mensen het leuk te vinden om voor eigen meteoroloog te spelen. Er zijn diverse open source platformen waar je de meteo-data van je eigen weerstation naar toe kunt sturen, zodat je alles online kunt uitlezen en visualiseren. Voor de RPi ben ik op zoek gegaan naar een bibliotheek (in Python uiteraard), die we kunnen gebruiken om via de USB-poort de weergegevens uit te lezen. Na een tijdje zoeken, stuitte ik op weewx: een bibliotheek die mijn weerstation zou kunnen benaderen. Maar ik wilde niet het hele weewx platform implementeren op de RPi om alleen maar de data uit het weerstation uit te lezen.  Daarom heb ik het een en ander losgeweekt en een module gemaakt, die alleen de data uitleest.

 

Je zult dus voordat je een weerstation aanschaft wellicht even willen uitzoeken of het weerstation uit te lezen is met de tools, die je wilt gaan gebruiken. In de links onderaan vind je een link naar een lijst van weerstations, die je met de code uit dit artikel kunt gebruiken.

 

PostgreSQL databases

Voordat we gegevens kunnen opslaan in de database moeten we de tabellen maken, waarin we de gegevens willen bewaren. Bekijk mijn GitHub-pagina voor de details rondom het creëren van de benodigde tabellen.

 

Webapplicatie

Maar je kunt natuurlijk nog een stap verder gaan door een webapplicatie op je Raspberry Pi te installeren en een webpagina te maken, die de data van bijvoorbeeld de laatste vierentwintig uur toont. Ook hiervoor kun je heel goed Python gebruiken. Gebruik dan niet het zware en zeer complete Django, maar een lichtgewicht applicatieserver genaamd Flask. Hiermee creëer je met heel weinig overhead een applicatieserver, die de data uit je database kan serveren in een webpagina.

 

De structuur van een moderne webapplicatie wordt opgezet volgens het Model-View-Control raamwerk. Hiermee splits je de verschillende taken op een nette manier. In het Model-deel definieer je het datamodel, in het View-deel definieer je de lay-out van je pagina’s en de Controller bepaald de mogelijk routes en de structuur van je website.  Voor het visualiseren van de data kun je gebruik maken van d3.js. Dit is in feite de standaard voor het interactief visualiseren van data op websites. De applicatie op mijn GitHub-pagina is zeer rudimentair en serveert eigenlijk alleen de data van de afgelopen 24 uur. Maar als je wilt, is er wat moois van te maken!

 

Analyse

Als je de gegevens eenmaal verzameld hebt in de database kun je natuurlijk helemaal los gaan met het “minen” van je data! Hiervoor gebruik je R (zie mijn artikel hierover van vorig jaar in Linux Magazine). Alle R code kun je wederom vinden op mijn GitHub-account. In eerste instantie wil je het verbruik laten zien van elektra en gas met daarnaast de binnen- en buitentemperatuur. Dan zijn we natuurlijk benieuwd naar het verband tussen al die meetwaarden. Het verschil tussen de binnentemperatuur (rode lijn) en buitentemperatuur (groene lijn) is de delta (blauwe lijn). Dit is het temperatuurverschil dat je moet handhaven door gas te verbranden (onderste staafdiagram).

 

Uit het plaatje kun je ook een schatting maken van de instelling van de thermostaat bij ons thuis. Hint: Bij welke binnentemperatuur begint de ketel gas te verbranden? Is er nu daadwerkelijk een verband tussen de deltatemperatuur en het gasverbruik? Hiervoor zou je bijvoorbeeld naar de correlatie tussen deze twee meetwaarden kunnen kijken (zie het R script op GitHub). Het blijkt nog niet heel eenvoudig om een waterdichte analyse te maken van de isolatiewaarde van je woning. Om te beginnen heb ik niet kunnen ontdekken hoe de energielabels van de overheid (A t/m G) zich verhouden tot de daadwerkelijke isolatiewaarde van je woning. Er worden op diverse websites hierover geen harde meetwaarden gegeven. Het enige dat ik heb kunnen vinden is de EPC (energieprestatiecoëfficiënt) voor nieuwe woningen. Het zou mooi zijn als we die kunnen uitrekenen op basis van de door ons zelf gemeten waarden voor bestaande huizen. Mocht iemand hier meer over weten, dan zou een email naar de redactie (marcel@linuxmag.nl) zeer welkom zijn.

 

Conclusie

In dit artikel heb je kunnen experimenteren met een aantal leuke toepassingen voor je Raspberry Pi. Je kunt je slimme meter uitlezen en de gegevens vastleggen op je RPi. Als je de beschikking hebt over een weerstation, dan kun je deze gegevens ook vastleggen en combineren met je stookgedrag en gasverbruik. Met Flask kun je een webapplicatie opzetten om de gegevens te tonen in de browser, zodat je altijd inzicht hebt in je verbruiksgegevens. Last but not least heb je de verzamelde gegevens kunnen combineren en analyseren met R als een heuse “data scientist”. Zoals aangegeven zou het een mooie vervolgstap zijn om daadwerkelijk te kunnen bepalen wat de EPC voor je eigen bestaande woning is. Dan hoef je in ieder geval niet de natte vinger van een externe expert in te huren.

 

Links

[1] http://gejanssen.com/howto/Slimme-meter-uitlezen/index.html

[2] https://github.com/hugokoopmans/linux-magazine

[3] http://www.weewx.com/

[4] http://dbeaver.jkiss.org/

[5] http://flask.pocoo.org/

[6] http://www.postgresql.org/

[7] http://d3js.org/

[8] http://bit.ly/lmenergie