Kategori: finkman
Vattenmätning med Raspberry Pi och webkamera
finkman förbarmar sig över oss med ännu ett intressant hembygge af rang! 😀
Det är inte mycket som står utan övervakning hemma längre, så för att mätta mätbegäret så fick vattenmätaren ställa upp denna gång!
En kollega pratade på jobbet om denna artikel i Ny Teknik. När jag till slut slaktade det förra projektet (bilspegel…) så hade jag helt plötsligt all nödvändig hårdvara över. Basen till mjukvaran hade Göran Lundquist vänligt nog delat med sig av på mysensors.org, och på Görans Youtube-klipp såg vi ut att ha likadana vattenmätare! Vad väntar jag på? 🙂
Dags att snickra lite hårdvara..
För att kameran ska få lite ljus så behövs dioder. Jag hittade en påse med vita 3mm-dioder hemma, jag tror det var såna här. Jag anslöt dem iallafall efter den specen, 3,3v, 20mA, och de såg ut att må rätt bra. Nu behöver jag ju inte maxa dioderna, och det lyste skapligt trots att jag tog lite högre motstånd och anslöt bägge dioder genom bara ett motstånd.. På bilden använder jag ett 10 Ohm-motstånd. Dioderna är parallellkopplade för att få ut samma spänning till de båda, men båda två är kopplade i serie med motståndet för att begränsa strömen till båda dioderna. Man måste hålla reda på polariteten här också, katoden, det korta benet på lysdioderna, ska anslutas till minus. Här har jag båda korta ben lödda till den vita kabeln.
Så, hur ska jag spänningsmata dioderna i drift då? Visst finns det väl en 3,3v-pinne på Raspberryns GPIO? Jepp! Pinne nummer ett! Max 50mA last får anslutas till 3,3v-pinnen, men mina dioder mätte in på bara 22mA tillsammans.
Snyggast här hade varit att använda typ sånahär kablar med fin-kontakt , en lite mindre GPIO-ribbon eller liknande, men jag hade ingen sån. Jag bröt ur några hylsor ur en lite bredare breadboarding-sladd med fyra parallella sladdar i kontakten, och satte krympslang runt de enskilda metallhylsorna.
Därefter så löd-skarvade jag på de gråa kablarna på den partvinnade brun-vita och kopplade i. Långa benen på dioderna till +3,3v på pinne 1, korta benen på dioderna till jord på pinne 5 på GPIO-pinheadern. Varde ljus!!
Raspberryn är helt i standard-setup. Ni får kolla på mina tidigare blogginlägg eller så om ni vill ha detaljer på hur installera Raspbian, konfigurera WLAN och sånt. Inget annat krävs egentligen, bara en grundinstallation, koppla upp med trådbundet nätverk eller WLAN, och koppla i en webcam i USBn. Jag använder denna, som funkar utmärkt för ändamålet. Det gick till och med att ställa skärpan på kameran genom att vrida på linsen, vilket var mycket bra eftersom kameran kommer sitta bara ett par centimeter från mätartavlan. Ta det dock försiktigt när ni ställer fokus på kameran! Jag tror jag lyckades knäcka min när jag satte i kameran i hållaren, men efter en stund av pillande så verkade den ta gäng igen och jag fick skärpa.
Kamerahållaren.. Det här tog ett par prototyper. Göran i Ny Teknik-artikeln använde sig av avloppsrör och konstruerade en hållare, vilket ser väldigt snyggt ut. Jag hade inget avloppsrör i rätt storlek, så mitt första test blev att såga av en PET-flaska. Det funkade iofs bra, men jag fick inte till passformen helt rätt, vilket gjorde att flaskan kunde röra sig några millimeter mot glaset. Inget större problem kan tyckas, men det blev uppenbart sen när jag började prova mjukvaran att kameran måste stå still. Att flytta kameran någon millimeter gjorde nämligen att mätarnålen som kameran kikar på hamnade på fel ställe i bilden, nog för att stoppa mätningen.. Tillbaka till Ritbordet.
Första prototypen, PET-flaska.
Mycket mer stabilt!
Drömen att ha en 3d-skrivare infann sig här. Man hade kunnat skriva ut en måttanpassad hållare till kameran som styrde upp situationen direkt.
Istället så började jag söka runt i huset efter saker som kunde passa i denna 56mm-mässingscylinder. Efter någon timmes mätande så hittade jag en sprayflaska med startgas från OK, vars lock passade perfekt i mätaren. Jag sågade av locket så den blev c:a 2,5-3cm hög, och borrade sedan ett 16mm hål med en stegborr vid den ena kanten på locket. Stegborr är grymt till sånthär eftersom det blir så fina snitt i plast, hålet hamnar på rätt plats direkt utan att man behöver förborra ett mindre hål, och man kan prova sig fram till vilken storlek på hålet som blir perfekt, ett steg i taget.
I PET-prototypen så hade jag liksom Göran borrat hål i plasten och tryckt igenom dioderna. På det vita locket så tyckte jag att det blev jättebra ljus när jag satte dioderna på utsidan, så jag tog fram limpistolen och limmade fast dem mot kanten, riktade innåt-uppåt. Det visade sig senare vara lite flimmer på dioderna som störde bilden, men det löste sig genom att rikta upp dioderna lite mer så de inte lyste så direkt rakt in genom plasten. En annan tänkbar lösning skulle kunna vara en kondensator parallellt med dioderna, men kan det verkligen vara så mycket rippel på 3,3v-pinnen?
Nåja. På med ljuset och igång med mjukvaran! .
Mjukvaran
För att förklara konceptet så har jag lagt upp en film här: https://www.youtube.com/watch?v=eY8Oq6jhPGk
Dags att borsta av gymnasie-kunskaperna i C-kod.. Bleh, det var ett tag sen. Men det är ändå mycket, mycket lättare att förstå och ändra befintlig kod än att skriva hela från grunden själv, det hade jag nog inte klarat. Åter igen ett stort tack till Göran som la upp sin programvara! Det primära som behövde göras var att ta bort beroendet till Mosqitto-message brokern som Göran använder, eftersom jag inte har en sån själv. Jag slog till med några andra små ändringar också, däribland stöd för att logga den uppmätta liter-siffran till en rrd-databas.
För att få igång programvaran för vattenmätningen så krävs en förberedelse, installera detta paket på Raspberryn:
sudo apt-get install libsdl1.2-dev
Vidare så laddade jag hem och installerade det senaste RRDtool under /opt/rrdtool-1.5.4 , för att kunna använda den nya datatypen DCOUNTER i databasen, som COUNTER, fast man kan använda decimaler. RRDtool-paketet som följer med i Raspbian är ganska gammalt, och mycket nya funktioner finns i senare versioner.
Kort för att ladda hem och installera RRDtool:
sudo apt-get update
sudo apt-get install libpango1.0-dev libxml2-dev
wget http://oss.oetiker.ch/rrdtool/pub/rrdtool-1.5.4.tar.gz
tar -xvzf rrdtool-1.5.4.tar.gz
cd rrdtool-1.5.4
./configure --prefix=/opt/rrdtool-1.5.4
make
sudo make install
Medans vi ändå håller på, passa på att skapa biblioteket “water” i pis hemkatalog:
cd
mkdir water
Ladda sedan hem och kompilera min modifierade avläsningsmjukvara här: water-meter1.1.tar.gz
wget http://blog.m.nu/wp-content/uploads/2015/10/water-meter1.0.tar.gz
tar -xvzf water-meter1.0.tar.gz
cd water-meter
<här finns utrymme att kolla i koden (framförallt water-meter.c),
kolla så att alla sökvägar stämmer osv. För att kompilera, kör sedan:>
make
Om jag inte har glömt något nu, så borde koden kompilera snällt och en binär bör dyka upp, “water-meter”, utan något suffix.
För att kalibrera träffpunkterna och testa mjukvaran så har Göran lagt in ett läge där man kan se bilderna och träffpunkterna från kameran i mjukvaran. Denna når man genom att köra:
./water-meter -di
För att göra detta så behöver du antingen köra i grafiskt läge i Raspberryn, eller göra som jag och använda Putty och VcxSrv för att få upp Raspberryns grafiska appar på min Windows-dator. I grova drag, installera VcxSrv på Windowsdatorn (gärna en laptop, underlättar att kunna vara nära kameran för att göra kalibreringen), starta VccSrv på Windowsdatorn och koppla sedan upp till Raspberryn via ssh med Putty, med dessa iställningar ifyllda:
Därefter bör det gå att få upp det water-meters grafiska läge på Windows-PCn!
Om du inte har någon X-server till förfogande, varken Raspberryns grafiska läge, VcxSrv eller liknande, så gör applikationen en “segmentation fault” och dör direkt när du försöker starta ./water-meter -di.
Iallafall… När du har fått igång det grafiska läget, så bör det se ut ungefär som i början på denna video (texterna “Running..” och “Got camera!” visas inte längre, de tog jag bort efter inital debugging).
Den enda skillnaden på din bild är att de gröna rutorna säkert inte kommer att matcha den röda mätaren på bilden, om du inte har lyckats positionera kameran preciiiis som jag. Att flytta de gröna rutorna åtgärdas genom att editera i REGION-blocket i water-meter.c. Enklast tyckte jag var att göra en printscreen, klistra in bilden i Microsoft Paint, zooma in, flytta bilden så webkamerans bild hamnade precis i det övre vänstra hörnet, sen föra muspekaren över bilden och kolla på pixel-siffrorna nere i vänstra hörnet på Paint. Därefter mata in positionerna i water-meter.c , kompilera om med “make”, starta “./water-meter -di” igen, göra samma sak och finjustera. Justja, för att döda water-meter, tryck ctrl+z för att få tillbaka skalet, kör “ps” i skalet, kör sedan kill -9 <processnumret för water-meter>.
Mätaren vi siktar in oss på är 0,0001-snurran, dvs ett varv motsvarar en liter. Åtta punkter runt den mätaren ger alltså en upplösning på 0,125l, rätt bra tycker jag! Om man är äventyrslysten och lyckas placera kameran riktigt nära mätaren så kanske det går att klämma in fler punkter, vilket det verkar finnas stöd för i koden (ändra konstanten NUM_REGIONS). Om kameran hamnar långt ifrån mätaren och mätaren blir pytteliten i bild så kanske det är läge att minska till fyra punkter.
Hu, nu blev det mycket text. Vi tar en paus till bilden som visar hur jag limmade fast kameran i hållaren när allt började kännas bra. Ett par spritpenna-streck mellan fästet och mätaren också för att kunna få tillbaka locket i rätt position om man vill kolla till mätaren manuellt nån gång ibland:
Sådärja, nu är vi nästan där! Om allt känns bra, och mätaren träffar de röda prickarna i rätt följd när den snurrar, så är det dags att gå vidare med loggningen. Förresten så tyckte jag det var bra att spola vattnet sakta för att prova in träffpunkternas positioner, då var det mycket lättare att se studsar mellan träffpunkter och sånt. Om det strular, prova att flytta isär punkterna ett par pixlar och försök igen.
När allt är intrimmat med kameran, starta “./water-meter” utan “-di” för att skippa det grafiska läget. Då kan man koppla ner från Raspberryn och mätningen fortsätter. Om man vill ha den exakta litersiffran i loggen så kan man starta ./water-meter med argumentet -start_value, “./water-meter -start_value 610595” i mitt fall, baserat på mätarställningen på mätaren längst upp till höger i detta blogginlägg. Startvärdet läggs därefter till totalen i loggfilen, /home/pi/water/water-meter-total.log , som uppdateras och läses in automatiskt vid nästa start, så vid nästa start ska man alltså inte ange -start_value igen.
Som en sista grej på mjukvaran kan nämnas att det ligger lite startscript och grejor med i tar-filen ovan. T.ex. så finns Görans (lätt modifierade) water-meter.sh i mappen, som kör water-meter i en loop utifall den skulle krascha, med en reset av usb-webbkameran inklämd innan den startar water-meter igen. Det har inte hänt så ofta, men ibland när jag startat water-meter så har det bara kommit upp brus på bilden, något som tydligen Göran också hade problem med eftersom han skrev verktyget “usbreset”. Init-scriptet (water-meter.init.d) har jag inte testat, det lär behöva lite handpåläggning för att funka.
Att skapa rrd-filen
cd
cd water
/opt/rrdtool-1.5.4/bin/rrdtool create water.rrd \
-O -s 60 DS:water:DCOUNTER:120:0:U \
RRA:AVERAGE:0.5:1:43200 \
RRA:AVERAGE:0.5:30:175200
Här kan man alltså tänka sig att skippa decimalerna om man inte är så noga, och då byta ut DCOUNTER mot COUNTER, och därigenom slippa installera RRDtool manuellt som beskrivet ovan.
Detta bör ge en water.rrd i /home/pi/water/ , vilket lämpligt nog är sökvägen som står förifylld i konstanten WATER_LOG_RRD_FILE längst upp i water-meter.c
När water-meter sedan kör, så kommer programmet att anropa rrdtool update en gång i minuten med det senaste total-litervärdet. Om du vill verifiera att allt kör, kolla t.ex. med ls -al att timestampen på filen water.rrd uppdateras varje minut, eller gör en rrdtool dump för att kolla att värdena kommer in i databasen.
Graferna då?
Här är det inte lika självklart som annars var man vill ha, det beror nog lite på vad mätningen är tänkt till. Jag var lite nyfiken på att se hur mycket olika saker i hemmet gör av med, och för det mesta så har vi noll vattenflöde. Därför så är min primära graf en halvtimme lång (för att få hög upplösning på förbrukningen) och graderad i liter per minut. Noggrannheten i min setup står ännu oprövad efter bara ett par timmar helt igång, men det lär väl ge sig efter en stund hur bra det blir, hittills så ser det ut att träffa inom ett par procent iaf.
Här ser man tex. på de högra staplarna att jag spolade vatten i tre minuter, första minuten i ~1,5l/minut, andra minuten i ~0.4l/minut och sen ökade jag upp till 2,6l/minut. Totalt 4,5l på den omgången alltså.Den här grafen är skapad såhär:
/opt/rrdtool-1.5.4/bin/rrdtool graph /var/www/water_usage_30min.png \
-E \
--imgformat PNG \
--start -30m \
--end now \
--width 600 \
--height 400 \
--title "Water usage, litres/minute, 30min" \
--vertical-label 'l' \
-X 0 \
-l 0 \
DEF:water_value=/home/pi/water/water.rrd:water:AVERAGE \
CDEF:water=water_value,60,* \
AREA:water#0099FF \
LINE1:water#000000 \
VDEF:sum=water_value,TOTAL \
GPRINT:sum:"Total usage\: %0.2lfl\n"
Graferna lägger jag direkt i webb-roten /var/www/ , så kommer de direkt ut på Raspberryns webserver (sudo apt-get install apache2) Vidare så skulle man kunna tänka sig en graf över ett dygns förbrukning på samma sätt, fast denna gång utan CDEF-räkningen i mitten, så i det här fallet så blir graderingen liter per sekund:
/opt/rrdtool-1.5.4/bin/rrdtool graph /var/www/water_usage_24h.png \
-E \
--imgformat PNG \
--start -24h \
--end now \
--width 600 \
--height 400 \
--title "Water usage, litres/second, 24h" \
--vertical-label 'l' \
-X 0 \
-l 0 \
DEF:water=/home/pi/water/water.rrd:water:AVERAGE \
AREA:water#0099FF \
LINE1:water#000000 \
VDEF:sum=water,TOTAL \
GPRINT:sum:"Total usage\: %0.2lfl\n"
I RRDtool är det bara fantasin och tiden man orkar lägga på manualläsning och Reverse Polish Notation som sätter gränserna. Man kan tänka sig att grafa kubikmeter i timmen eller vad som helst, det är bara köra en uträkning med CDEF och grafa. Min fantasi tog stopp ungefär här, så om någon provar detta och kommer på en bra graf, säg gärna till! Mina (mycket tråkiga, vi använder tydligen jättelite vatten) grafer finns på http://vatten.nykil.net. Jag önskar att jag hade haft denna lösning i somras när jag glömde droppslangen till en nyplanterad buske igång över natten, och spolade ut förmodligen några kubik över grannskapet.. Där är en grej som man skulle kunna spinna vidare på, Göran Lundquist nämnde i artikeln med Ny Teknik, han hade precis det som jag hade behövt då, ett larm som varnade om hög vattenförbrukning hemma.
Men det får bli en annan dag det!
Hälsningar,
Jim
1Wire för övervakning (och viss styrning) av FTX-ventilation med kylbatteri
Användaren “finkman” tar oss med på en resa in i ventilationens värld! 🙂
Att övervaka hemmets alla tänkbara temperaturer, elförbrukning och diverse har länge varit ett av mina intressen. När vi nu installerade FTX-ventilation i huset (värmeväxlande med tilluft och frånluft) samt ett kylbatteri för frikyla som använder bergvärmens borrhål/köldmedium så kändes det självklart att gödsla med sensorer i hopp om att förstå vad ventilationsaggregatet har för sig däruppe på vinden!
Jag använder 1-wire i huset för att mäta temperaturer och logga energiförbrukning. För den som vill hoppa direkt till resultatet så finns graferna på http://temperatur.nykil.net samt http://el.nykil.net.
Styrningen av kylan samt inställning av parametrar i ventilationsaggregatet är ett pågående jobb, så graferna kan variera lite från dag till dag beroende på om något har ändrats.
Energiförbrukningen
Ventilationsaggregatet stod bäst på vinden hos oss, så vi fick dra ny el dit. Då passade jag på att installera en enfas-energimätare med pulsutgång till ventilationens el! Som tur är har jag en förstående elektriker som hjälper till med installationerna 🙂 Jag gillar att ha övervakning på elförbrukningen på grejor man inte ser dagligen. Jag och min fru kollar till el-graferna lite då och då, och det syns direkt när något är fel, t.ex. om bergvärmen startar för ofta, om dräneringspumpen inte kör eller liknande.
På bilden syns från vänster ventilationens enfas-mätare, dräneringspumpens enfas-mätare och bergvärmens nya trefasmätare. Utöver dessa tre så sitter det också en ledpuls-detektor på el-leverantörens elmätare. De fyra pulsutgångarna är kopplade till två stycken 1wire-räknare med två kanaler per räknare. 1wire-nätet går till en Linuxdator via ett ds2490 usb-interface.
I Linux används cron, OWFS och rrdtool för att logga och grafa datat, allt enligt receptet som finns på http://wiki.m.nu
Temperaturer
FTX-ventilationsaggregatet (ett Swegon Casa R5-H) har fyra olika luftkanaler, tilluft utifrån världen, tilluft till huset efter värmeväxlaren, frånluft från huset som går genom värmeväxlaren samt frånluft ut från ventilationsaggregatet. Jag funderade en stund på hur jag skulle få in sensorer i kanalerna, och kom till slut fram till att sätta sensorerna direkt i aggregatet och klämma in kablarna mellan dörren och aggregatet på aggregatets framsida.
Jag fick förslaget att använda en tunn flatkabel för att passera dörren. Det var lite pilligt att kontaktera flatkabel med RJ12, och eftersom flatkabeln var lite kort så blev det en skarv både innanför och utanför dörren på aggregatet. Det hade kanske gått att löda sensorerna direkt på flatkabeln, men då hade nog krympslangen inte tätat ordentligt mellan sensorn och flatkabeln. Jag utgick från sensorer med 0,5m kabel från m.nu (skönt att slippa löda sensorerna!), sedan klippte jag av kablarna till passande längd och kontakterade om. Därefter en RJ12-skarv som fästes med buntband i ett buntbandsfäste med dubbelhäftande tejp på baksidan.
Styckvis funktionstest innan montering 🙂
Första sensorn monterad!
Lite längre kabel till kanalerna längst in.
Flatkabeln tejpades mot utsidan av
aggregatet för att hålla den still och platt.
Alla sensorer monterade! Inga problem med täthet i luckan märks!
Alla sensorer ikopplade! (tre fick skarvas, på en så räckte flatkabeln ända fram)
Patchpanelen kapslad och klar 😉
Utöver de fyra luftkanalerna i aggregatet så installerade vi också ett kylbatteri för att använda frikyla från bergvärmens borrhål. Givetvis måste man ju ha koll på tilluftstemperaturen efter kylbatteriet! 🙂 Till detta användes en lite dyrare sensor kapslad i en rostfri stålpinne. Borrade hål i ventilationskanalen efter kylbatteriet och använde en gummitätning till en utanpåliggande väggströmbrytare som jag hade liggandes för att få det tätt.
Rostfri ds18b20+ liggandes på kylbatteriet
Sensorn inborrad i tilluftskanalen efter kylbatteriet
På samma sätt som med energimätningen så använder jag Linux, OWFS, cron och rrdtool för att samla och grafa datat. Alla givare fick varsin rrd-databas som är skapad såhär:
rrdtool create vent_tilluft_inomhus_temp.rrd --step 60 \
DS:temperature:GAUGE:120:-70:70 \
RRA:AVERAGE:0.5:5:525600 \
RRA:AVERAGE:0.5:60:43600
Därefter så kör jag ett bash-script genom cron som loggar datat:
* * * * * /home/jim/temperatur/log_vent_data.sh
Scriptet ser ut såhär:
#!/bin/bash
tilluft_inne=`cat /mnt/1wire/uncached/28.3F8D6B050000/temperature | tr -d [:space:]`
tilluft_kyld=`cat /mnt/1wire/uncached/28.9774BF030000/temperature | tr -d [:space:]`
franluft_inne=`cat /mnt/1wire/uncached/28.A0348D060000/temperature | tr -d [:space:]`
tilluft_ute=`cat /mnt/1wire/uncached/28.7F5C3D060000/temperature | tr -d [:space:]`
franluft_ute=`cat /mnt/1wire/uncached/28.4D495F060000/temperature | tr -d [:space:]`
rrdtool update /home/jim/temperatur/vent_tilluft_inne_temp.rrd N:$tilluft_inne
rrdtool update /home/jim/temperatur/vent_tilluft_kyld_temp.rrd N:$tilluft_kyld
rrdtool update /home/jim/temperatur/vent_franluft_inne_temp.rrd N:$franluft_inne
rrdtool update /home/jim/temperatur/vent_tilluft_ute_temp.rrd N:$tilluft_ute
rrdtool update /home/jim/temperatur/vent_franluft_ute_temp.rrd N:$franluft_ute
Därefter skapar jag graferna i ett annat script som är schemalagt i cron:
/usr/bin/rrdtool graph /var/www/temperatur.nykil.net/vent_temperatures_in_24h.png \
-E \
--imgformat PNG \
--start -24h \
--end now \
--width 600 \
--height 400 \
--title "Ventilationen inkommande luft" \
--vertical-label '°C' \
-l 0 \
DEF:world=/home/jim/temperatur/vent_tilluft_ute_temp.rrd:temperature:AVERAGE \
DEF:inc=/home/jim/temperatur/vent_tilluft_inne_temp.rrd:temperature:AVERAGE \
DEF:cold=/home/jim/temperatur/vent_tilluft_kyld_temp.rrd:temperature:AVERAGE \
LINE2:world#000000:"Inkommande luft utifrån" \
GPRINT:world:MIN:"Min\: %0.2lf%s°C" \
GPRINT:world:AVERAGE:"Medel\: %0.2lf%s°C" \
GPRINT:world:MAX:"Max\: %0.2lf%s°C" \
GPRINT:world:LAST:"Just nu\: %0.2lf%s°C\n" \
LINE2:inc#1684CA:"Tilluft" \
GPRINT:inc:MIN:"Min\: %0.2lf%s°C" \
GPRINT:inc:AVERAGE:"Medel\: %0.2lf%s°C" \
GPRINT:inc:MAX:"Max\: %0.2lf%s°C" \
GPRINT:inc:LAST:"Just nu\: %0.2lf%s°C\n" \
LINE2:cold#33CC33:"Tilluft efter kylbatteri" \
GPRINT:cold:MIN:"Min\: %0.2lf%s°C" \
GPRINT:cold:AVERAGE:"Medel\: %0.2lf%s°C" \
GPRINT:cold:MAX:"Max\: %0.2lf%s°C" \
GPRINT:cold:LAST:"Just nu\: %0.2lf%s°C\n"
/usr/bin/rrdtool graph /var/www/temperatur.nykil.net/vent_temperatures_out_24h.png \
-E \
--imgformat PNG \
--start -24h \
--end now \
--width 600 \
--height 400 \
--title "Ventilationen utgående luft" \
--vertical-label '°C' \
-l 0 \
DEF:world=/home/jim/temperatur/vent_franluft_ute_temp.rrd:temperature:AVERAGE \
DEF:out=/home/jim/temperatur/vent_franluft_inne_temp.rrd:temperature:AVERAGE \
LINE2:world#FF0066:"Utgående från aggregat" \
GPRINT:world:MIN:"Min\: %0.2lf%s°C" \
GPRINT:world:AVERAGE:"Medel\: %0.2lf%s°C" \
GPRINT:world:MAX:"Max\: %0.2lf%s°C" \
GPRINT:world:LAST:"Just nu\: %0.2lf%s°C\n" \
LINE2:out#9340E6:"Frånluft innan aggregat" \
GPRINT:out:MIN:"Min\: %0.2lf%s°C" \
GPRINT:out:AVERAGE:"Medel\: %0.2lf%s°C" \
GPRINT:out:MAX:"Max\: %0.2lf%s°C" \
GPRINT:out:LAST:"Just nu\: %0.2lf%s°C\n"
/usr/bin/rrdtool graph /var/www/temperatur.nykil.net/vent_temperatures_diff_24h.png \
-E \
--imgformat PNG \
--start -24h \
--end now \
--width 600 \
--height 400 \
--title "Ventilationen återvunnen värme/kyla" \
--vertical-label '°C' \
-l 0 \
DEF:inkommande=/home/jim/temperatur/vent_tilluft_ute_temp.rrd:temperature:AVERAGE \
DEF:tilluft=/home/jim/temperatur/vent_tilluft_inne_temp.rrd:temperature:AVERAGE \
CDEF:skillnad=tilluft,inkommande,- \
AREA:skillnad#FF8080:"Återvunnen värme" \
CDEF:blue=skillnad,0,LT,skillnad,0,IF \
AREA:blue#C2E0FF:"Återvunnen kyla\n" \
LINE1:skillnad#000000 \
GPRINT:skillnad:MIN:"Min\: %0.2lf%s°C" \
GPRINT:skillnad:AVERAGE:"Medel\: %0.2lf%s°C" \
GPRINT:skillnad:MAX:"Max\: %0.2lf%s°C" \
GPRINT:skillnad:LAST:"Just nu\: %0.2lf%s°C\n"
Därefter så är det bara en Apache-webbserver mellan er och graferna! Såhär kan återvinningsgrafen se ut när aggregatet övergår från att återvinna kyla ur frånluften till att återvinna värme:
Styrning av kylbatteriet
Det följde med en bypass-ventil till köldmediet, en shunt-motor och el-anslutning till kylbatteriet så att ventilationsaggregatet skulle kunna styra när kylbatteriet används. Allt det ligger kvar i lådan eftersom det inte går att konfigurera själv när ventilationsaggregatet startar kylan och inte fungerar särskilt väl från fabriken enligt mina ventilationsinstallatörer. Ventilationsaggregatet vet dessutom bara om temperaturerna i tilluften, inte vilken temperatur det faktiskt är i rummen när solinstrålning och andra oönskade värmekällor har gjort sitt.
Det känns bättre att styra kylbatteriet baserat på den faktiska temperaturen i rummen, så istället använder jag en Tellstick Duo och en gammal Nexa-brytare som jag hade liggandes för att styra när cirkulationspumpen för köldmediet kör.
Temperatursensorn är inget konstigt, en helt vanlig ds18b20+ som hänger ner från taket i hallen. Scriptet för att styra allt är schemalagd i cron för att köra varje minut och ser ut såhär:
#!/bin/bash
# hämta temperaturen via owfs
temperature_hall=`cat /mnt/1wire/uncached/28.2E446D020800/temperature | tr -d [:space:]`
# spara till rrd-databasen för grafning (graferna skapas i ett annat script)
rrdtool update /home/jim/temperatur/hall_indoor_temperature.rrd N:$temperature_hall
# Var det längre än 20min sen det senaste till eller frånslaget? Isf dags att kolla läget igen
if test `find "/tmp/cooling" -mmin +20`; then
# Om temperaturen är över 23 grader, slå på cirkulationspumpen.
# Eftersom bash bara kan hantera heltal och owfs returnerar allt mellan noll till
# fyra decimaler så pipar jag temperaturen till awk, jämför temperaturerna i awk
# och returnerar 1 från awk om temperaturen är mindre än 23. bash-if tolkar awks
# returkod 1 som falskt, så 23 grader och allt därutöver returnerar 0, if-satsen
# blir sann och koden för att slå på cirkulationspumpen körs.
if $(echo $temperature_hall|awk '{if($1<23) exit 1}');
then
# slå bara på pumpen om den just nu är avstängd
if grep --quiet off /tmp/cooling; then
# Slå på pumpen via tdtool-Tellstick
/usr/bin/tdtool --on "Cirkulationspump frikyla"
# spara att pumpen nu är "on" i temp-filen
echo "on" > /tmp/cooling;
fi
else
# Om vi hamnar här så är temperaturen lägre än 23 grader
# Om pumpen är på, så är det dags att slå av den
if grep --quiet on /tmp/cooling; then
# Stäng av pumpen via tdtool-Tellstick
/usr/bin/tdtool --off "Cirkulationspump frikyla"
# och spara undan att pumpen nu är avstängd i temp-filen
echo "off" > /tmp/cooling
fi
fi
fi
Många if-satser blir det. Den här koden har jag bara kört i ett par timmar nu när jag skriver detta, så vi får se om det räcker med så pass enkel styrning eller om algoritmen måste göras mer komplex för att få jämn temperatur så långt som möjligt.
Koldioxidmätning
Trots nyinstallerad ventilation så upplevde vi inte att luften i sovrummet blev bra. För att få ett objektivt mått på luftkvaliteten i rummet så köpte jag en koldioxid-mätare. Eftersom jag varken hade 1-wire, trådat nätverk eller annat än el i sovrummet så fick jag förslaget att använda en Raspberry Pi via wlan.
Jag hade en gammal Raspberry Pi 1 liggandes, iom att det inte behövs någon prestanda för en så enkel applikation så blev det en bra användning för den. Raspberryn fick ett i2c-1wire-interface och konfigurerades enligt guiden på wikin. Efter lite strul (hade glömt att köra apt-get update, så fick problem med biblioteksversioner, saknade paket i Raspbian-repot osv, osv) så fick jag igång owfs över Raspberryns i2c-buss och kunde koppla i koldioxidmätaren. En spänningsinjektor gick åt också eftersom koldioxidmätaren är lite törstig på ström.
En rrd-databas skapades enligt följande recept:
rrdtool create air_co2_level.rrd --step 60 \
DS:co2:GAUGE:120:0:5000 \
RRA:AVERAGE:0.5:5:17568 \
RRA:AVERAGE:0.5:60:8760
Grafen skapas såhär:
#!/bin/bash
/usr/bin/rrdtool graph /var/www/co2_graph.png \
-E \
--imgformat PNG \
--start -24h \
--end now \
--width 600 \
--height 400 \
--title "PPM co2 i luften i sovrummet" \
--vertical-label 'ppm' \
-l 0 \
DEF:co2=/home/pi/air_co2_level.rrd:co2:AVERAGE \
LINE2:co2#000000:"PPM co2 i sovrum\:" \
GPRINT:co2:MIN:"Min\: %0.2lf%sppm" \
GPRINT:co2:AVERAGE:"Snitt\: %0.2lf%sppm" \
GPRINT:co2:MAX:"Max\: %0.2lf%sppm" \
GPRINT:co2:LAST:"Just nu\: %0.2lf%sppm\n"
..och hämtning av data, samt grafningen sker såhär i cron:
* * * * * /usr/bin/rrdtool update /home/pi/air_co2_level.rrd N:`/mnt/1wire/20.13FE0D000000/CO2/ppm | tr -d [:space:]`
*/5 * * * * /home/pi/createco2graph.sh
Att sätta upp en webbserver på Raspberryn är lika enkelt som att klistra in kommandot “sudo apt-get install lighttpd” i ett skal. För att släppa igenom grafen från min externa apache-webbserver till Raspberryns webbserver så la jag in en proxypass längst ner i den externa webbserverns /etc/httpd/apache2.conf:
ProxyPass /co2 http://10.0.0.39
På så sätt omdirigeras http://temperatur.nykil.net/co2/ direkt till webbservern på Raspberryn som finns på http://10.0.0.39 på det interna nätverket bakom brandväggen. Co2-grafen ni ser längst ner på http://temperatur.nykil.net kommer alltså via vårat wifi direkt från Raspberryn som bor under sängen 🙂
Det visade sig att koldioxidhalten översteg 1600ppm i sovrummet på natten. Inte undra på att det kändes stuffigt! Det räckte dock att bara ställa sovrumsdörren lite på glänt för att få ner koldioxidhalten till 1000ppm. Sovrummet är helt enkelt lite för tätt och luftflödet funkar inte. Jag har beställt överluftsventiler att installera ovanför sovrumsdörrarna så att det ska kunna bli ett luftflöde mellan tillluften i sovrummen och frånluften i kök och övriga ful-utrymmen utan att dörren ska behöva stå öppen och släppa in ljud och ljus. Med bra flöde ut ifrån sovrummet så kommer jag ner till 1000ppm, där värdet hamnar om nätterna just nu. Jag har också bokat in ett återbesök från ventilationsfirman för att öka flödena något och komma ner väl under 1000ppm co2.
Kvar att göra
När tid ges så kommer jag att sätta ett par sensorer på köldmedierören för att se temperaturen på köldmediumet före respektive efter kylbatteriet. Vidare så behövs det nog ett par grafer till, till exempel för att jämföra den inkommande temperaturen med utomhustemperturen (påverkas den inkommande kanalen nämnvärt av värmen på vinden?) samt en tydligare jämförelse mellan de inkommande lufttemperaturerna och de utgående. Kanske borde jag göra en graf med all data i samma graf. Rörigt, javisst, men kanske lättare att se sambanden. På ett lite mer hårdvarunära plan så går går det att styra hastigheten på frikylans cirkulationspump, om det blir ryckigt med den mycket enkla regleringen som används nu så kanske en lite mjukare reglering som kan öka och minska hastigheten på cirkulationspumpen måste byggas.
Jag tackar för visat intresse om du har orkat läsa ända hit! Om ni ser att jag har gjort något dumt eller har tips på förbättringar så tar jag tacksamt emot feedback!
Hälsningar,
Jim

Kul att du gillar vår blogg!
Skriv upp dig på vår maillista för att få allt det senaste från m.nu - Nya produkter, kampanjer och mycket mer!
Wohoo! Du är nu med på maillistan!