Grote domotica update

Zoals ook al is te zien in het vorige artikel over de domotica draaien er een aantal processen op het servertje voor het loggen van een aantal zaken. Wat ik daarbij niet vermeldde is dat er ook software draait op een aantal Raspberry PI’s die de temperatuursensoren uitlezen. Ik heb daarvoor een aantal jaar terug snel een proof of concept in elkaar gezet waarmee ik met Java snel de sensoren kon uitlezen en door middel van een http call deze data in mijn database kon krijgen.

Nadat die POC werkte heb ik die code ook nog op twee andere PI’s gezet en daarna er eigenlijk nooit meer echt diepgaand naar gekeken. Echter; Mijn oplossing heeft nooit 100% stabiel gewerkt. De PI’s zitten/zaten op plekken waar ik geen netwerkkabel voor handen had en dus had ik ze via WIFI aangesloten op mijn netwerk. Dat is leuk en aardig maar wat als het WIFI signaal weg valt? Het resultaat daarvan was dat de PI’s simpelweg vast liepen en niet meer reageerden. Dat is niet heel handig als de Pi’s overal en nergens zijn weg gewerkt.

Daarnaast liepen de PI’s ook om willekeurige redenen soms vast, de PI was dan via SSH nog wel benaderbaar maar het proces voor het verwerken van de data was vastgelopen en deed niets meer. Ik heb daarom uiteindelijk allerlei debugcode moeten toevoegen om alles weer vlot te trekken. Zo controleert mijn programma nu of hij alle sensoren kan bereiken en alle data kan afleveren aan de database. Is dit niet het geval dan stopt mijn software en wordt de PI automatisch herstart.

En dan veranderd het IP adres van de database. De PI kan daardoor de database niet meer benaderen en reboot dus na zoveel seconden. Voelt u hem aan komen? Een race tegen de klok om via SSH de PI te benaderen, het proces te vinden en deze op tijd te stoppen voordat de PI reboot!

Het werkt nu min of meer stabiel maar zo nu en dan moet ik nog steeds aan de bak. Daardoor kijk ik in mijn database of bepaalde sensoren voor het laatst succesvol zijn bevraagd. Daar aan kan ik dus zien of er iets is vast gelopen. In dit deel van mijn domotica pagina kan ik dat zien.

De Iungo doet het wel maar aangezien de ELGA uit staat levert de Iungo verder geen data op dan 0 en dus wordt er maar 1 waarde over de hele dag opgeslagen.

Wakker worden

Nu ik met de upgrade van de server bezig ben zit ik ook weer na te denken over hoe ik zaken qua software efficienter en zuiniger kan doen. Een van de dingen die ik wil bereiken is dat de processor van de server zo min als mogelijk wakker moet worden gemaakt om werk te doen. Op dit moment komen er vanaf 6 verschillende kanalen 2 tot 3 keer per minuut data binnen. Elke minuut moet de processor dus minimaal 6 en maximaal 18 keer wakker worden om data te verwerken.

Om die data te verwerken moet eerst het netwerk, dan een webserver ( Apache ) en als laatste de database informatie verwerken. Daarnaast draaien een aantal loggers als aparte java applicatie op de server wat zorgt voor nog een langer verwerkingspad.

Toen realiseerde ik mij ineens dat ik mijn logging vele malen simpeler en stabieler kan maken! In plaats van data naar de server te pushen ga ik vanaf de server de data ophalen bij de nodes.

PI’s

Dit wordt een standaard Raspbian installatie met webserver + PHP. Door middel van een simpel PHP script wordt alle data van alle aangesloten sensoren getoond. De software op elke PI wordt identiek. Dus komt er een PI bij is het een kwestie van dezelfde image te installeren en de PI is klaar. Het ipadres veranderd eigenlijk niet met DHCP is mijn ervaring, dus ik moet 1x met een netwerkscan het ipadres zien te vinden en daarna kan ik met http://<ipadres van de pi>/index.php de temperaturen zien.

Er draait dan dus geen eigen software meer op de PI’s. De webserver is met 1 commando te installeren en de combinatie is ontzettend stabiel.

Daarnaast ga ik door middel van een prototype HAT ook de bekabeling van de sensoren een stuk netter maken. Ik heb nu een prototype bordje liggen met daarop los een weerstand gefreubeld met daarin weer de draadjes in gepield om zo het juiste circuit te maken. Ik ga met de HAT een RJ11 aansluiting maken zodat ik met een simpele stekker zo de sensoren kan aansluiten. Op het bordje komt dan het weerstandje tussen de beide pins die nodig zijn.

Daarmee wordt ook dat weer een stukje netter.

Database

Vanuit de database laat ik elke 20 of 30 seconden een job lopen die een http request doet bij alle PI’s, de Iungo plug en de VFS40 flowsensor om de data op te halen en te verwerken. Dat houdt dus in dat de processor nog maar 2 of 3 keer per minuut wakker wordt door de database om alle informatie op te halen en te verwerken. Daarmee wordt de processor dus een stuk minder belast.

Mocht mijn code een bepaalde PI niet kunnen benaderen dan weet ik dat meteen in mijn code en kan ik eventueel een alarm naar mij zelf toe sturen dat een PI niet te benaderen is.

Alleen kan ik helaas nog niet de zonneboiler op deze manier benaderen. De zonneboiler zit op een RS232 poort, COM poort, aangesloten en die kan ik alleen serieel benaderen. Dat lukt helaas niet vanuit mijn database.

datamodel

Nu wordt het echt technisch; Ik ga mijn datamodel ook aanpassen. Ik heb nu twee belangrijke tabellen met data. DTS_SENSORS en DTS_SENSORDATA. De eerste tabel bevat elke sensor die ik heb in huis. De tweede tabel bevat per sensor vanaf datumtijdbegin tot datumtijdeind een waarde voor die sensor. Is het van 20:00:00 tot 21:00:20 precies 20.0 graden in de woonkamer dan is die sensor zo’n 180 keer benaderd maar staat er maar 1 waarde in de database.

Dat zorgt er wel voor dat er in die tabel nu ruim 20 miljoen rijen met data zitten en dat bevragen van de meest recente waarde best wat rekenkracht kost. En dan heb ik het nog niet over de opslag van die tabel. De tabel zelf is nu enkele honderden megabytes groot. De indexen om de data snel te vinden zijn nog veel groter.

Deze tabel blijft wel bestaan voor de informatie van de afgelopen twee a drie dagen. Daarna gaat de data naar een tabel met daarin per sensor een kolom. Dat ziet er ongeveer zo uit:

id datum tijd ZB_T1 ZB_T2 ZB_T4 ELGA_WATT
1 06-11-2018 00:00:00 20 18 18   18
2 06-11-2018 00:00:30 20 18 18   18
3 06-11-2018 00:01:00 19 18 18   500
4 06-11-2018 00:01:30 19 18 18   900
5              
6              

 

Met elke 30 seconden een rij zijn er dus nog 2880 rijen per dag nodig om alle data op te slaan. Per jaar zijn dit 1.051.200 rijen, ongeacht of ik nu 1, 10, 20 of 100 sensoren in huis heb draaien. Het aantal rijen zakt hierdoor enorm terwijl ik nauwelijks informatie verlies. Het enige nadeel is wel dat zodra ik sensoren ga toevoegen ik dus kolommen moet gaan toevoegen waar dan geen data in staat ( NULL waarden ).

Nog veel belangrijker is dat deze methode ervoor zorgt dat ik nog maar twee indexen nodig ga hebben, namelijk op de tabel ID ( de primaire sleutel ) en op het veld datum.

Website

Mijn domotica website hoef ik nauwelijks aan te passen. Er komt al JSON uit de database. Ik moet alleen die code gaan herschrijven dat hij eerst kijkt in de tabel DTS_SENSORDATA. Staat daar niets meer in dan wordt de bovengenoemde tabel geraadpleegd voor data.

Uitbreidingen

En ik zit alweer na te denken over nog meer sensoren. Nu ik het warmteverlies van de woning ook kan berekenen in de database wordt het hoog tijd om nog meer sensoren toe te voegen dat die formules betrouwbaarder worden. Waar ik aan zit te denken is:

  • Sensor in de slaapkamer van mijn zoon
  • Sensor in de inloopkast
  • Sensor op de vliering

Met deze twee is de hele zolder en vliering gedekt.

  • Sensor in de waskamer achter op de 1e verdieping.

Met deze waarde heb ik in principe de temperatuur van alle slaapkamers op de eerste verdieping. Alle 4 de sensoren kan ik bijprikken bij de Raspberry PI die de zolder meet. De badkamer heb ik hier ook indirect mee, alle deuren op de 1e verdieping staan in principe altijd open.

  • Sensor in de hal beneden

Deze kan ik toevoegen aan de PI waar ook de doucheWTW op zit.

En dan verder nog meer sensoren bij de vloerverdeler  en bij de aanvoer/retour van de CV ketel.

Ik heb weer wat te doen van de winter 🙂

 

1 Reactie

  1. Paul Meindersma

    Wel eens InfluxDB met Grafana overwogen in combinatie met MQTT? Low power sensoren kan op basis van ESP8266/ESP32 met aparte firmware (bv. ESPEasy of Tasmota).

Laat een reactie achter

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Deze website gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie-gegevens worden verwerkt.