Gå til innhold
  • Bli medlem
Støtt hjemmeautomasjon.no!

Varmtvannstankstyring med intelligens


Anbefalte innlegg

Med utgangspunkt i at jeg fikk på plass temperaturovervåking av varmtvannstanken min nylig, så har ting ballet på seg. Først litt bilder fra temperaturloggingsprosjektet

1535313153_2018-09-2522_12_50.jpg.0eeb565ef12958271f4d8aaddd2ae79e.jpg109968594_2018-09-2522_12_22.thumb.jpg.7d967db471bf744810cf31116e31cb65.jpg1416374346_2018-09-2618_26_04.jpg.8a111173314a9f59c4ace88dc6fb1630.jpg

 

Strips er klippet av etter bildet ble tatt og så har jeg isolert det inne.

 

Koden på ESP8266 er laget med Arduino IDE, og med eksempelkode for D18B20. Temperaturene leses av flere ganger i sekundet, men data sendes kun over MQTT hvis det skjer en stor nok endring, og uansett hvert minutt.

  • Like 1
Lenke til kommentar
Del på andre sider

Temperaturdataene visualiserer jeg i Grafana (lagret i InfluxDB), og jeg har også programmert en snutt i OpenHAB for å detektere om det tappes vann. Dette er indikert med rødt bakgrunn i plottet under. Trigger for å tro at det tappes er at både varmtvannsutløpet øker i temperatur og kaldtvannet minker i temperatur. Det var en prøvelse å få programmert disse derivert-funksjonene i OpenHAB sin Xtend.  Grønt er temperaturmåler på varmtvannet som tappes fra tank. Gult er temperaturmåler nedstrøms på varmtvannet og er etter blandeventilen. Blått er kaldtvann inn (det ligger også lilla bakgrunn i tidsperioden der varmeelementet er på)

1147346670_Screenshotfrom2018-09-2621-29-33.png.8c3db2c83b440a3b9bf29a839889302c.png

rule "Varmtvannstapping"
when
    Item Varmtvannsbereder_ut_diff changed or
    Item Vartmvannsbereder_kaldtinn_diff changed
then
    if (Varmtvannsbereder_tapper.state == NULL) {
        Varmtvannsbereder_tapper.postUpdate(OFF) 
    }
    
    if (Varmtvannsbereder_ut_diff.state > 0.015 &&
        Varmtvannsbereder_kaldtinn_diff.state < -0.015) {
        if (Varmtvannsbereder_tapper.state == OFF) {
            logInfo("Varmtvann", "det tappes")
            Varmtvannsbereder_tapper.postUpdate(ON)
        }
    }
    if (Varmtvannsbereder_ut_diff.state < -0.05 && Varmtvannsbereder_kaldtinn_diff.state > 0)  {
        if (Varmtvannsbereder_tapper.state == ON) {
            logInfo("Varmtvann", "stillstand")
            Varmtvannsbereder_tapper.postUpdate(OFF)
        }
    } 
end
rule "Varmtvannsderiverte varmt ut"
when
    Item Varmtvannsbereder_ut changed
then
    var foo =  Varmtvannsbereder_ut.lastUpdate().getMillis()
    var deltatid = (now.getMillis() - foo)/1000.0
    var deltatemp = ((Varmtvannsbereder_ut.state as DecimalType) - (Varmtvannsbereder_ut.previousState.state as DecimalType))
    var diff = deltatemp / deltatid 
    if (deltatid > 1) {
        Varmtvannsbereder_ut_diff.postUpdate(diff)
    }
end 

 

  • Like 1
Lenke til kommentar
Del på andre sider

Så ble det noen lange kvelder med å tenke på hvordan jeg kan styre dette mot pris, samtidig som at man skal ha varmt nok vann i springen (og unngå legionella).

 

Diverse lesing på nettet gjør at jeg finner ut hvordan jeg sjekker og justerer temperaturinnstillingen på tanken ved å finne skruen som holdt plastdekselet i bunn fast.873965149_2018-10-0319_11_44.thumb.jpg.1e5e6532ad13424ef52879ba8e236c58.jpg

 

Termostatinnstillingen er en liten skrue nede til venstre i bildet. Det er selvsagt også irriterende hvor lett det hadde vært å stikke en temperatursensor inni her, så hadde jeg også fått måling av temperatur som var uavhengig av tapping.

 

Men, det viktige her er at jeg finner at tanken var innstilt på 60 grader (nedre grense i forhold til legionella). Jeg setter den opp til 75 (den går ikke høyere) dette gir meg umiddelbart 15 grader mer å spille på i forhold til å utsette oppvarming av vann.

  • Like 2
Lenke til kommentar
Del på andre sider

Intelligens som i maskinlæring innebærer som regel bare noe statistikk. Jeg har noen måneders logg fra en Aeotec Smart Switch og dernest en Aeotec Heavy Duty Switch som har stått på tanken. Utifra kumulativt-forbruk gjennom hvert døgn, kan jeg beregne type-profiler for når varmtvannstanken står på:

varmtvannsprofil.png.3f69dbfd06ad12ff7f367286056dd367.png

 

Dataene kategoriserte jeg etter om huset er i feriemodus, hverdag eller helg. Ferie-linja (blå) burde vært flat, men jeg har ikke samlet nok data til det, så derfor bruker jeg den røde linja i praksis for ferie-modus. Enheten på y-aksen er kWh, og angir da hvor mye strøm varmtvannstanken vanligvis bruker i gitte time. Utifra dataene leser jeg at vi står opp tidligere på hverdager enn i helger, men det skjer mer dusjing på kvelden i helgene enn på hverdager. Oscillasjonen på dagtid i helg er kanskje ikke reell, men bare symptom på lite data. 

 

Ferie-tallet (på 0.148 kWh) betyr også at varmtvannstanken i snitt taper 148 W til rommet kontinuerlig når den ligger på 60 grader.  Etter at jeg setter igang med styring av tank, så kan jeg ikke lenger bruke strømmåleren for å forbedre bruksprofilen, siden den blir styrt av pris og ikke bruk. Det kan hende det er mulig å forbedre profilen med bruk av deteksjon av vamrtvannstappingen senere, men det er heller ikke sikkert at det trengs. Profilen kan selvsagt også håndtegnes etter behov.

 

Tanken videre er å bruke dette for å predikere hvor mye varmtvann som brukes de neste timene, og dermed predikere hva som er temperatur på tanken om X antall timer. 

  • Like 1
Lenke til kommentar
Del på andre sider

# Varmekapasitet for vann
Cv = 4187 #J/kg oC (I tabeller oftest oppgitt med grader Kelvin; gjerne kJ/kg K - der 1K = 1oC)	
# Regn om til watt-timer:
# * 1J = 1 Ws; 
# * 3600J = 3600 Ws = 1W * 3600s = 1Wh
# * 4189J = (4189/3600)Wh = 1,163Wh
# * 1liter vann veier ca. 1,0 kg
Cv = 1.163055556 #Wh/kg oC
liter = 194
effekt = 2700
grader = 75 - 5 # antar 5 grader inntak..
oppvarmingstid = Cv * liter / effekt * grader
print("Oppvarmingstid {:.2f}".format(oppvarmingstid,"%d") + " timer")
print("Energimengde i varm tank {:.2f} KWh".format(Cv * liter * grader/1000))

Jeg bruker "energimengde" i tanken (relativt kaldtinntaket) som begrep i styringen/optimaliseringen.  Med tallene over får jeg at oppvarmingstid blir 5.85 timer hos meg, og energimengde på varm tank er 15.79 kWh.

 

"Energimengde" på tanken kan regnes tilbake til temperatur, som kan sammenlignes med temperaturen jeg måler. Dette klarer jeg verifisere at stemmer (ved å se på hvor mange grader målt temperatur har steget etter at elementet har vært innekoblet f.eks. 40 minutter). Så å sette en nedre grense på energimengde jeg tillatter i tanken, så betyr det en nedre temperaturgrense. Akkurat hva jeg skal bruke som energigrense har jeg noe tilfeldig satt til 11 kWH for øyeblikket - jeg skal se an noen dager om dette er for høyt eller for lavt, det tilsvarer ca 55 grader på tanken.

 

Hvis tanken er påskrudd i to sammenhengende timer, så vet jeg da at den ca vil nå makstemperatur (2.7 kW * 2 timer + 11 = 15.4 kWh), men jeg er uansett langt over legionellagrensa.

  • Like 2
Lenke til kommentar
Del på andre sider

Algoritmen som gjør selve jobben er ikke lengre enn dette:

daymode = 'Hverdag'
data['onoff'] = 0
data['energycontent'] = 0
data['consumption'] = 0
lowerlimit = 11
effect = 2.7
insulationloss = data['Ferie_midlet'].mean()
data.loc[data.index.values[0], 'energycontent'] = 16.08
while data.energycontent.min() < lowerlimit:
    onhours = data.onoff.astype(int).sum() + 1
    data.loc[data.nsmallest(onhours, 'NOK/KWh').index.values,'onoff'] = '1'
    for row in data.index.values[:-1]:
        newenergycontent = data.loc[row, 'energycontent'] - data.loc[row, daymode]
        newenergycontent = int(data.loc[row, 'onoff']) * (effect - insulationloss) + newenergycontent
        data.loc[row+1, 'energycontent'] = min(newenergycontent, 15.79)
for row in data.index.values[:-1]:
    data.loc[row, 'consumption'] = int(data.loc[row, 'onoff']) * \
        round(data.loc[row+1, 'energycontent'] - data.loc[row, 'energycontent'] + data.loc[row, daymode],3)

Dette er Python-kode med bruk av pandas-biblioteket, der jeg jobber på en tabell kalt 'data' som inneholder en rad for hver time 24 timer fram i tid. Tabellen inneholder prisinformasjon, og bruksprofilen er limt inn. Øyeblikkets energiinnhold er estimert fra temperaturmåling, og blir startpunkt for algoritmen.

 

Jeg starter med å kun sette tanken på den billigste timen, og estimerer energiinnhold for hver time framover. Hvis denne en gang kommer under 11, så starter jeg forfra med å ha den på de to billigste timene, helt fram til at jeg er over 11 kWh i alle timer framover.  Når dette er ferdig, så skrur jeg av eller på berederen utifra om 'onoff' er 0 eller 1 i første rad.

 

I tillegg trengs det litt kode for å hente prisdata fra Tibber (pyTibber på github, installeres med pip)

Lenke til kommentar
Del på andre sider

Satt opp mot optimalisering av husoppvarming, så er dette ganske motsatt. Matematisk sett er det ingen grunn til å forholde seg til forskjell på dyreste og billigste time, så til og med med disse grisekjedelige dagene med bare høy pris kontinuerlig gjennom døgnet, så vil berederen min være mer avskrudd enn på. Et tilleggselement til algoritmen kunne selvsagt være å legge til mer komfort (øke minimumstallet fra 11) hvis det er lite å hente, men det er ikke sikkert at det vil være noen merkbar økning i komfort. 

 

Det gjenstår å finne ut hvordan jeg kan beregne "hvor mye jeg sparer".  Heavy-duty-switchen og elektrikerbesøk er sunk cost, så å sette i verk styring som dette er nå en enkel beslutning. Men hvordan beregne besparelse? Jeg beregner forventet kostnad i hver time framover, og kan summere det og sette det opp mot hva typeprofilen hadde brukt framover i tid. Men siden siste rad i tabellen min ikke ender på maksimalt energiinnhold, kan jeg ikke sammenligne. Hvilken times pris skal jeg bruke for å korrigere det?  Bakover i tid er det kanskje enklere, så om noen måneder er det nok mulig å beregne hva jeg hadde brukt uten smart-styring, og sammenligne med det som faktisk er brukt.

Lenke til kommentar
Del på andre sider

Flott prosjekt! Venter på elektriker selv for å montere en Heavy duty switch. Har kjøpt inn deler for temperaturovervåking, venter bare på overskudd... [emoji846]

Tanken min står i et kjellerrom der tempen varierer, 18 grader på sommeren og kanskje 8-12 grader vinterstid. Vet dette er waste av energi på vinteren, men tanken holder vel i alle fall rommet frostfritt.

Finnes det en funksjon av overflateareal og delta av temperatur inne i tanken/romtemp jeg kan bruke for å beregne energitap?

Sent fra min BLA-L29 via Tapatalk

Lenke til kommentar
Del på andre sider

Varmetapet (i watt) vil være lineært i temperaturforskjell. Man kan løse varmeledningsligningen for en sylinder for å finne ut hvordan formen påvirker, men siden dette ikke er noe du får gjort noe med, er det enklere å estimere det fra målinger. Jeg har lite forskjell mellom vinter og sommertemperatur i vaskerommet, så jeg vil kanskje ikke klare se dette utifra temperaturlogg og forbrukslogg, du vil kunne se denne lineære sammenhengen. 

 

Hos meg har jeg 22 grader i vaskerommet i snitt siste halvår, og tanken har holdt 60 grader - forskjell på 38 grader. Jeg beregner 148 W når huset er forlatt, og da mister tanken 148W/38grader = 3.9W/grad.

 

Hvis det var 10 grader om vinteren, ville jeg da tapt 3.9*50 = 194 W gjennom isolasjonen. Siden jeg vet temperatur inni tank og utenfor kunne jeg forsåvidt enkelt korrigert for dette i koden over, men hos meg vil det nok ha lite å si.

  • Like 1
Lenke til kommentar
Del på andre sider

Et forsøk på estimat av besparelse: Ta typeprofilen, finn ut hvor mye den koster med kommende priser. Flytt så samme antall kWh over til de timene som er valgt til å være på, og beregn hva samme antall kWh koster i de timene, skaler til 24 timer (antall tilgjengelige timer med priser varierer mellom 12 og 36) og sammenlign tallene. Dette blir en prediksjon av besparelse som jeg kan beregne løpende. For øyeblikket estimerer jeg da til å spare hele 7 øre de neste 24 timene (!) Men så er prisforskjellen bare 5-6 øre fra billigste til dyreste så dette er uansett en bortkastet dag..

  • Like 1
Lenke til kommentar
Del på andre sider

  • 1 måned senere...
1 time siden, berland skrev:

Etter drøye 2 måneder, så har jeg gjennomsnittlig estimert døgnbesparelse på 51 øre (!) 

Altså rundt 15 kr i løpet av en måned! :)

En pakke tyggi er jo utmerket det og...

 

 

... men det er rart, jeg ville tro besparelsen er vesentlig høyere enn det hvis man unngår de 8 dyreste timene i døgnet, f.eks.

 

Men det kan også være et mål om at strømprisen denne høsten egentlig har vært ganske flat, med lite variasjon mellom snitt og peak-tid.

Lenke til kommentar
Del på andre sider

Følger.

 

 

Off topic:

 

Usikker på besparinger på varmtvannsberedere, tror nesten det er mer å spare på å slå av smarthusprodukter ;) 

 

Da jeg reiser endel prøvde jeg tidligere å måle hvor lenge jeg måtte være borte, før det lønte seg å slå av varmtvannstanken.

Det ble da kun tatt hensyn til kWh forbruk, og prøvde å redusere det totale strømforbruket så mye som mulig.

 

Kom frem til at jeg måtte være borte i ca. 2,5 døgn, før jeg begynte å spare på at tanken var avslått.

Det går med mye energi for å varme opp en tank med kaldt vann.

 

Da må man også huske å slå på tanken endel timer før man kommer hjem, så man slipper å måtte dusje i kaldt vann.

 

 

Lenke til kommentar
Del på andre sider

38 minutter siden, Teza skrev:

Usikker på besparinger på varmtvannsberedere

Jeg tror sparingen med normale strømpriser er stor, på grensen til enorm. Men denne høsten har vi hatt nærmest flate priser, så det er jo ikke så interessant når man bruker strøm på varmtvann...

Lenke til kommentar
Del på andre sider

3 timer siden, Moskus skrev:

Men det kan også være et mål om at strømprisen denne høsten egentlig har vært ganske flat, med lite variasjon mellom snitt og peak-tid.

 

Det har de, derfor er de tatt med i plottet over. Maksbesparelse pr. døgn er på 2 kr og 50 øre for noen få dager med stor variasjon (nedi 20 øre om natta), og det er ikke utenkelig at en slik variasjon kan bli normalt, hjulpet av en eller annen form for effekttariff. Da snakker vi ihvertfall rundt tusenlappen i året. 

 

Bruker man mer varmtvann er det selvsagt mer å spare. 

Lenke til kommentar
Del på andre sider

10 timer siden, berland skrev:

Maksbesparelse pr. døgn er på 2 kr og 50 øre for noen få dager med stor variasjon (nedi 20 øre om natta), og det er ikke utenkelig at en slik variasjon kan bli normalt, hjulpet av en eller annen form for effekttariff. Da snakker vi ihvertfall rundt tusenlappen i året. 

Det ser iallfall mer fornuftig ut for meg. :) 

 

 

Lenke til kommentar
Del på andre sider

Fikk endelig stappet inn en temperatursensor på fornuftig sted i tanken. Som nevnt i post nr 3 i tråden, så går det jo an å få noe på innsida av isolasjonen.

 

Jeg tok derfor en innkapslet D18B20 ferdigmontert på 3 meters kabel (125 grader står det skrevet på kabelen, så da tror jeg den tåler det), og ved hjelp av en pinne dyttet den 30-40 cm oppover på innsiden av isolasjonen. 

 

Tanken sin termostat er stilt på 75 grader, den sensoren regner jeg med sitter i bunn sammen med termostaten, for dette nye termometeret har målt opp til 81 grader.

 

Temperaturmålingen (rødt under) fra tanken er veldig brukandes! Dette kan man gjøre analyser på om man vil, og jeg kan gjøre litt marginale forbedringer på algoritmen som optimaliserer. WAF synker litt når det blir synlig hvem som hadde billigst dusj av klokkeslettene 07:00 og 17:00

1071100402_Screenshotfrom2018-12-0621-08-48.png.5c1b853caafc66e51a0097eb6fcd8e80.png

Endret av berland
  • Like 2
Lenke til kommentar
Del på andre sider

5 timer siden, Morten B skrev:

Kan jeg skylde på at det er tidlig på morgenen i tillegg til at det er mandag? :D:D

Den er god! :)

 

Sensorene på rørene er forsåvidt ikke godt for annet enn deteksjon av tapping som smaker mer av overvåkning enn nytte. Nå som jeg fikk en sensor plassert på fornuftig plass er de overflødige i forhold til nytteverdi. Det er nå den nye sensoren sine data som brukes i koden som kjører hver time for å planlegge når tanken skal varme vann.

 

  • Like 1
Lenke til kommentar
Del på andre sider

  • 1 måned senere...

Bli med i samtalen

Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.

Gjest
Skriv svar til emnet...

×   Du har limt inn tekst med formatering.   Lim inn uten formatering i stedet

  Du kan kun bruke opp til 75 smilefjes.

×   Lenken din har blitt bygget inn på siden automatisk.   Vis som en ordinær lenke i stedet

×   Tidligere tekst har blitt gjenopprettet.   Tøm tekstverktøy

×   Du kan ikke lime inn bilder direkte. Last opp eller legg inn bilder fra URL.

×
×
  • Opprett ny...

Viktig informasjon

Vi har plassert informasjonskapsler/cookies på din enhet for å gjøre denne siden bedre. Du kan justere dine innstillinger for informasjonskapsler, ellers vil vi anta at dette er ok for deg.