Ik ben begonnen met het meten van temperaturen in en rond het huis. Gewoon voor de lol, in de toekomst ga ik dit mogelijk gebruiken voor wat home automation. Ik heb het meeste geleend van deze pagina, en natuurlijk heb ik wat dingen aangepast.

Ik heb een bundel van 10 waterproof DS18B20 sensoren met een 3 meter kabel gekocht. Ik wilde eerst een lineaire topologie maken, maar halverwege heb ik besloten de stubbed topologie te houden. Het werkt foutloos, voorlopig zie ik geen enkele reden om dit te wijzigen. Her totale network bevat 8 sensoren, twee daarvan op een 10 meter lange kabel, een op een 15 meter kabel. Ik heb nog genoeg 100 Ohm weerstanden liggen als er problemen op mochten duiken. De totale lengte is ruim binnen de specificaties.

Setup 

  • De DS18B20 sensors verbonden met de Raspberry Pi. Heb een pull-up weerstand gebruikt van 4700k Ohm.
  • Heb twee sensoren buiten geinstalleerd, een in de kruipruimte, een in de woonkamer, een op zolder, drie op de centrale verwarming (warm water uit, verwarming uit, verwarming return) De sensoren voor de centrale verwarming zijn ge-zip-tied aan de buizen met een klein beetje heatsink compound dat ik nog had liggen.
  • Heb de 1-wire modules (w1-gpio and w1-therm) op de Raspberry Pi 2 model B geïnstalleerd.
  • Heb er voor gezorgd dat het weireless netwerk op de Raspberry Pi automatisch re-connect (tweede antwoord) door een wijziging aan te brengen in /etc/ifplugd/action.d/ifupdown
  • Heb een mysql database and two tables on mijn Linux machine gemaakt.
  • Heb een python-script gemaakt (geleend en verbouwd) dat:
    - scans voor sensoren, geen gebruik maakt van een ingebakken lijst
    - voor iedere sensor, lees de temperatuur 3 keer, controleer de CRC, bereken de gemiddelde waarde
    - rapporteer de berekende waarde voor iedere sensor
  • het script toegevoegd aan cron op de raspberry, om iedere minuut uitgevoerd te worden.

Ik heb twee scripts gemaakt die de Raspberry Pi kan gebruiken, eentje roept een stored procedure aan in Mysql, de andere post de data naar een webpagina dia dan op zijn beurt weer dezelfde stored procedure gebruikt. Ik moet nog steeds kiezen welke van de twee beter is.

 

De centrale Mysql database op mijn Linux machine heeft twee tabellen:

sensors
- Bewaart het sensorid, serialcode, last-temperature, last-seen date-time, last-value date-time en een omschrijving, één rij per sensor.

measurement
- Bewraat het sensorid, date-time en de temperatuur, één rij per meting

De stored procedure genaamd add_measurement:
- controleert het bestaan van de sensor, als die niet bestaat wordt die toegevoegd
- controleert of de temperatuur is gewijzigd, zo niet dan wordt de rij niet toegevoegd
- controleert of 830 seconden verstreken zijn sinds de vorige opgeslagen temperatuur, als dat zo is dan wordt de temperatuur vastgelegd. Dat zorgt voor een datapoint iedere 15 minuten.
- Als de temperatuur is gewijzigd, dan wordt de vorige temperatuur met de vorige timestamp toegevoegd, en de huidige temperatuur met de huidige timestamp. Op deze manier gevend egrafieken een juist beeld van het verloop van de temperatuur over de tijd.

en de stored procedure bewaart de last-seen en last-value datetime en de laatste temperatuur

temperaturen worden afgerond op één decimaal. De nauwkeurigheid van de sensoren gaat niet verder, en op deze manier krijg je minder records omdat de tempertuur vaker achter elkaar hetzelfde zal zijn. 

Opslag besparing:

Als de temperatuur niet wijzigt, wordt er één record per 15 minuten per sensor vastgelegd. Dat zijn 96 records per dag per sensor. Als de temerpatuur iedere minuut wijzigt, levert dat 1440 waardes per dag per sensor. Met de opslag besparing heb ik nu gemiddeld 371 metingen per sensor per dag, bijna een factor 4 bespaard. De tabel met metingen (measurements) bevat nu 104820 rijen in 2,5Mb. Dat is vijf weken data voor 8 sensoren.

Grafieken:

Hierna heb ik een paar grafieken toegevoegd, naar dit voorbeeld. Ik heb een paar dingen gewijzigd, en ik ga daarmee door totdat ik tevreden ben:
- een derde thermometer toegevoegd aan de bovenkant
- heb bijna alles configureerbaar gemaakt
- heb wat gesleuteld aan de logoca voor de tijdzone. Ik heb een PHP deel toegevoegd dat het huidge verschil (server zijde) tussen UTC en de gebruikte tijjdszone uitrekent, end at meegeeft aan de grafieken. De voorbeeld webpagina telt er altijd 2 bij, dat is meestal juist(in dit deel van Europa) maar niet altijd, afhankelijk van de zomertijd of wintertijd.
- een beetje opgeruimd in de JSON output naar het java deel dat de grafieken maakt, om de hoeveelheid data die verstuurd wordt naar de client te beperken. Ik heb vooral een vracht spaties verwijderd.
- toegevoegd een opvulling (fillAlphas) in de grafiek voor het verschil tussen de centrale verwarming output en de centrale verwarming retour. het toont de hoeveelheid energie die de centrale verwarming in het huis stopt.
- een paar stored procedures gemaakt die de data leveren voor de grafieken. Omdat er op opslag is bespaard, is er geen datapoint voor iedere minuut. De stored procedure maakt die datapoints, eentje voor iedere minuut. Seconden worden afgerond op nul.
- toegevoegd een parameter aan de stored procedures zodat je een ander interval kunt kiezen dan 24 uur.
- toegevoegd een parameter aan de stored procedures zodat je een ander eindpunt kunt kiezen dan nu.
   

De performance van de grafieken is nog zorgwekkend. Als je een week data selecteert voor vijf sensoren, duurt het 2.1 seconden om de 43200 datapoints in the stored procedure te berekenen. Voor 24 uren duurt dit 0.4 seconden .

5 sensors     Central heating

5 sensors (woonkamer, buiten hoog, buiten laag, zolder, kruipruimte)
Centrale verwarming (woonkamer, buiten hoog, buiten laag, verwarming uit, verwarmng return, warm water)

RaspberryPi and DS16B20    DS18B20 on pipes

Raspberry Pi testen van de sensor DS18B20
Sensor DS18B20 op buizen