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! 🙂
Gästbloggare

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, 2015-06-15 21.30.35drä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.

IMG_2155
Styckvis funktionstest innan montering 🙂
IMG_2156
Första sensorn monterad!
IMG_2174
Lite längre kabel till kanalerna längst in.
Flatkabeln tejpades mot utsidan av
aggregatet för att hålla den still och platt.
IMG_2176
Alla sensorer monterade! Inga problem med täthet i luckan märks!
IMG_2182
Alla sensorer ikopplade! (tre fick skarvas, på en så räckte flatkabeln ända fram)
IMG_2184
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.

IMG_2177
Rostfri ds18b20+ liggandes på kylbatteriet
2015-07-03 13.18.34
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 graf1graferna! 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 2015-07-09 15.24.00faktiska 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 🙂

co2_graphDet 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

4 svar till 1Wire för övervakning (och viss styrning) av FTX-ventilation med kylbatteri

  • Hej finkman!

    Kul projekt! intressant och välskrivet. Jag har dock en fråga! Fick precis ett swegon casa r5 smart installerat hos mig, och ifrån styrpanelen kan jag redan utläsa all den temperaturmätdata som du har riggat sensorer för. Har du inte samma möjligheter i ditt aggregat, eller dömde du av ngt skäl ut alternativet att läsa ut denna data? Tar gärna ditt råd här innan jag nördar ner mig i MODBUS/DDC.

    Ha det gott!

    • Hej!

      Tack!

      Smart-modellen med Modbus kom precis efter min casa r5. Smart är den enda i serien som har Modbus vad jag förstår.

      Jag har inte sökt igenom min, min styrpanel pratar också digitalt med aggregatet, så möjligen finns det fler värden att ta fram ur signalen. Min styrpanel visar dock ingen temperatur alls, bara ställbart börvärde och fläkthastighet, samt visning av felkoder.

      Det vore mycket intressant att jämföra dina grafer med mina! Skriv gärna en liten rad här när du får ihop allt! All kod ovan för grafning och så bör gå att använda rakt av om du vill, bara scriptet som i mitt fall hämtar data från 1wire som behöver bytas ut. Säg till om du behöver hjälp med nåt!

      Hälsningar,
      Jim

  • Lämna ett svar