Gasverbruik per graaddag tonen in Domoticz

De winter staat voor de deur en in de meeste huizen gaat de verwarming weer aan. Indien je een slimme thermostaat hebt kun je het gasverbruik in Domoticz loggen. Je hebt dan inzicht in het gasverbruik per dag, week, maand of jaar. Maar wat zegt dit verbruik? Eigenlijk niet zo heel veel. In een strenge winter zal je meer verbruiken dan in een zachte winter, maar je kunt dit niet met elkaar vergelijken. Daarom gaan we het gasverbruik per graaddag tonen in Domoticz.

 

Benodigdheden

Gasverbruik per graaddagen

Het aantal graaddagen per dag is het verschil tussen de temperatuur in huis en de gemiddelde buitentemperatuur op die dag. Een graaddag wordt gemeten als het gedurende een gehele dag precies één graad onder de stookgrens van 18 °C graden is. Is de gemiddelde buitentemperatuur 18 °C of hoger, dan is het aantal graaddagen nul. Graaddagen zijn dus geen dagen, maar rekeneenheden. Zodra we het aantal graaddagen per dag weten zetten we dit af tegen het gasverbruik per dag.

Een rekenvoorbeeld:

Op een bepaalde dag is de gemiddelde buitentemperatuur 6,4 °C en het gasverbruik op dezelfde dat is 1,2 m3. Het gasverbruik per graaddag is dan 1,2 / (18 – 6,3) = 0,1026 m3/graaddag.

Gemiddelde buitentemperatuur

De buitentemperatuur kun je zelf loggen met een temperatuursensor i.c.m. met een RFXCOM of je kunt gebruikmaken van een script dat wij eerder geplaatst hebben om de buitentemperatuur in Domoticz te krijgen (helaas geeft Weather Underground geen nieuwe API keys meer uit. Momenteel werken wij aan een nieuw weer-script, dat binnenkort online komt). We gaan er even vanuit dat de buitentemperatuur reeds beschikbaar is in jouw Domoticz-omgeving. Om het gasverbruik per graaddag te kunnen berekenen moeten we de gemiddelde buitentemperatuur per dag weten.

We gaan eerst een virtuele temperatuursensor aanmaken. Ga naar Setup -> Hardware en kies bij Type voor Dummy. Je mag zeg een herkenbare naam kiezen:

Zodra de Dummy Hardware toegevoegd is kunnen de virtuele sensoren gaan aanmaken. Klik hiervoor op Create Virtual Sensors (in het donkerblauw).

Klik nu op Create Virtual Sensor (donkerblauw). Geef de temperatuursensor de naam “Gemiddelde buitentemperatuur” en kies bij Sensor Type voor “Temperature”. Nadat je op “OK” hebt geklikt vind je de nieuwe virtuele temperatuursensor terug op het tabblad “Temperature”.

gemiddelde buitentemperatuur

Nu is het tijd om de gemiddelde buitentemperatuur iedere vijf minuten te laten berekenen. Dat doen we door onderstaand script te gebruiken. Ga naar Setup > More Options > Events. Maak een nieuw LUA script aan van het type Time en kopieer onderstaand script. Enkele regels moet je nog even aanpassen:

  • 7: Debugging kun je op “YES” zetten, indien je tegen problemen aanloopt.
  • 15: Indien je de virtuele temperatuursensor een andere naam hebt gegeven kun je dat hier aanpassen.
  • 18: Zet hier de naam neer van de sensor van de buitentemperatuur.
  • 22: Wijzig het IP-adres van Domoticz
local function DeviceUpdate(idx, value1)
    local cmd = string.format("%d|0|%.2f", idx, value1)
  --print(cmd)
    table.insert (commandArray, { ['UpdateDevice'] = cmd } )
end

Debug = "NO" -- Debugging aanzetten ("YES") of uitzetten ("NO")
 
commandArray = {}
 
local m = os.date('%M')
if (m % 5 == 0) then -- script loopt iedere 5 minuten

-- Variabelen instellen
local temperature_name	= 'Gemiddelde Temp buiten'
local temperature_idx	= otherdevices_idx[temperature_name]

local uitlees_name	= 'Temperatuur buiten'
local uitlees_idx	= otherdevices_idx[uitlees_name]

--Temperaturen van afgelopen 24 uur opvragen
local sQuery			= 'curl "http://192.168.3.53:8080/json.htm?type=graph&sensor=temp&idx='..tostring(uitlees_idx)..'&range=day"'
local handle=assert(io.popen(sQuery))
local raw = handle:read('*all')
handle:close()

--Ontvangen waarden verwerken
json = assert(loadfile '/home/pi/domoticz/scripts/lua/JSON.lua')()
local jsonData = json:decode(raw)

if Debug=='YES' then
  print (jsonData.title)
  print (jsonData.status)
  print (jsonData.result[1].d)
  print (jsonData.result[1].te)
end

--Gemiddelde temperatuur van afgelopen 24 uur bepalen
local sum = 0
local ave = 0
local elements = #jsonData.result
     
for i = 1, elements do
    sum = sum + jsonData.result[i].te
end
     
ave = sum / elements

if Debug=='YES' then
  print('Gemiddeld: '..tostring(ave))
end

--Gemiddelde temperatuur opslaan in virtuele temperatuur sensor
DeviceUpdate(temperature_idx,ave)

end
return commandArray

Na maximaal vijf minuten moet je de eerste gemiddelde buitentemperatuur in de virtuele sensor kunnen zien. Let op! Dit is niet de gemiddelde buitentemperatuur van vandaag, maar van de laatste 24 uur.

Gasverbruik per graaddag sensor

We gaan nu een virtuele sensor aanmaken waar het gasverbruik per graaddag in bijgehouden wordt. Ga naar Setup > Hardware en klik weer op Create Virtual Sensors (donkerblauw). Geef de sensor de naam “Gasverbruik per graaddag”, selecteer “Custom Sensor” bij Sensor Type en type bij Axis Label “m3/gd”.

gasverbruik per graaddag in domoticz

Ga naar Setup > More Options > Events. Maak een nieuw dzVents script aan van het type Timer en kopieer onderstaand script. Indien je de namen van de sensoren niet gewijzigd hebt dan hoef je aan het script niets te wijzigen (namen staan op regel 6, 13 en 24). Het script draait iedere dam om 23.58 uur, zodat we de gemiddelde temperatuur van deze dag kunnen gebruiken (en niet de gemiddelde temperatuur van de afgelopen 24 uur). Daarnaast houdt het script rekening met de winter d.m.v. een factor. Ook wordt er rekening gehouden met het feit dat graaddagen nooit negatief kunnen zijn.

return {
          on   = { timer    = { "at 23:58"}},

  execute = function(domoticz)
        local Date = domoticz.time.year..domoticz.time.month..domoticz.time.day
        local meantempOutside = domoticz.devices('Gemiddelde Temp buiten').temperature
        local baseTemp = 18
        local factor = 1
        local degreesday = baseTemp - meantempOutside
        if (domoticz.time.month >= 4 and domoticz.time.month <= 9) then factor = 0.8 end
        if (domoticz.time.month >= 11 or domoticz.time.month <= 2) then factor = 1.1 end
        degreesdays = degreesday * factor
        local GasUsage = domoticz.devices('Gas').counterToday
        local GasUsageperDegreesday = domoticz.utils.round((GasUsage / degreesdays),3)
        if (degreesday <= 0) then 
            degreesdays = 0 
            GasUsageperDegreesday = 0
        end
        domoticz.log('Gemiddelde temperatuur buiten (laatste 24u): '..meantempOutside)
        domoticz.log('Gasverbruik vandaag: '..GasUsage..' m3')
        domoticz.log('Aantal graaddagen: '..degreesdays)
        domoticz.log('Gasverbruik: '..GasUsageperDegreesday..' m3 per graaddag')
        
        domoticz.devices('Gas per graaddag').updateCustomSensor(GasUsageperDegreesday)

  end
}

 

Iedere dag om 23.58 uur kun je nu het gasverbruik per graaddag bekijken!

30 gedachten over “Gasverbruik per graaddag tonen in Domoticz

  • 29 oktober 2018 om 09:11
    Permalink

    de mensen die hier mee bezig zijn (logging red.) uploaden waarschijnlijk hun data al naar mindergas.nl. Is er niet een manier om de data van mindergas.nl terug in te lezen in Domoticz? dan ben je er ook.

    Beantwoorden
  • 29 oktober 2018 om 18:02
    Permalink

    Voor zover ik weet kun je alleen naar mindergas.nl uploaden en geen gegevens naar Domoticz downloaden. Daarnaast ben ik het liefst zo min mogelijk afhankelijk van derden…

    Beantwoorden
  • 20 november 2018 om 09:54
    Permalink

    Joost,

    Op een of andere manier wil het niet lukken met de gemiddelde dagtemperatuur.
    Het script haalt bij mij 2016 ‘elements’ uit de database, dat zijn gegevens over 7 dagen. Het klopt ook wel dat er langer teruggekeken wordt dan 24 uur, want toen ik laatst een week op vakantie was, is mijn Wemos getript en kreeg ik geen verse metingen terug. Toch bleef de berekende gemiddelde temperatuur meer dan een dag veranderen, terwijl je na 24 uur een constante waarde of foutmelding zou verwachten. Ook wijkt de door het script berekende waarde af met wat ik zelf over 24 uur bereken.
    Nu staat mijn ‘short log sensors’ op 7 dagen.
    Ik heb wat debug-regels aan het script toegevoegd, zie hier de output:

    2018-11-20 09:40:01.050 Status: LUA: Graph temp day
    2018-11-20 09:40:01.050 Status: LUA: OK
    2018-11-20 09:40:01.050 Status: LUA: 2018-11-13 09:35
    2018-11-20 09:40:01.050 Status: LUA: 9.8
    2018-11-20 09:40:01.051 Status: LUA: Sum: 12654.8
    2018-11-20 09:40:01.051 Status: LUA: Elements: 2016
    2018-11-20 09:40:01.051 Status: LUA: Gemiddeld: 6.2771825396826

    Beantwoorden
    • 25 november 2018 om 10:49
      Permalink

      Geert,

      Om de gegevens naar 24 uur te zetten ga je naar Setup > Settings > Log history en dan vul je 1 dag (i.p.v. 7 dagen) in.

      Beantwoorden
  • 24 november 2018 om 21:37
    Permalink

    mijn berekening blijft op nul graden staan. Ik denk dat dit komt doordat het device dat wordt uitgelezen meer informatie dan alleen temperatuur bevat (namelijk ook luchtvochtigheid en luchtdrul). Moet ik dan iets aanpassen aan het script?

    Klopt het verder dat de sensornaam volgens de bovenstaande screenshots ‘Gemiddelde buitentemperatuur’ is, en niet ‘Gemiddelde Temp buiten’ zoals in het script staat?

    Beantwoorden
    • 25 november 2018 om 10:46
      Permalink

      Hoi Sander, de sensornaam had ik tussendoor gewijzigd, waardoor de screenshot inderdaad niet juist was. Ik heb nu een juiste screenshot in het artikel gezet (mogelijk zie je de oude screenshot nog door cache).

      Indien je een device gebruikt met temperatuur en luchtvochtigheid, dan moet je die eerst splitsen, zie dit artikel: https://ehoco.nl/gecombineerde-sensor-in-domoticz-splitsen/

      Beantwoorden
      • 25 november 2018 om 13:45
        Permalink

        dankje Joost! Ook zonder splitsing werkt mn gemiddelde buitentemp sensor nu. Kennelijk herkent het script het temperatuur gedeelte dus gewoon. Mn gasverbruik per graaddag wil nog niet helemaal lukken helaas. De uitkomst blijft op nul steken en log geeft volgende: ” 2018-11-25 13:43:00.585 Status: dzVents: Error (2.4.6): error loading module ‘m2 per graaddag berekenen’ from file ‘/home/pi/domoticz/scripts/dzVents/generated_scripts/m2 per graaddag berekenen.lua’:
        2018-11-25 13:43:00.585 …/dzVents/generated_scripts/m2 per graaddag berekenen.lua:23: ‘}’ expected (to close ‘{‘ at line 1) near ”

        (toffe site dit trouwens, heel mooi startpunt voor iemand die dit speelgoed net leert kennen)

        Beantwoorden
          • 25 november 2018 om 13:57
            Permalink

            doet het nu. Valt me wel op dat het script qua type steeds terugspringt naar ‘device’ ipv ‘timer’. Maakt dit uit of wat veroorzaakt dit?

          • 25 november 2018 om 14:06
            Permalink

            Geen idee waarom het script bij jou terugsprint naar device i.p.v. timer. Pas op regel 2 eens een paar keer de tijd aan om te testen of het script wel iedere keer draait.

            Uiteindelijk hoeft het script maar één keer per dag te draaien, zo laat mogelijk.

        • 20 februari 2019 om 19:44
          Permalink

          Hoi Sander
          ik heb deze melding ook steeds :dzVents:

          Error (2.4.6): error loading module ‘m2 per graaddag berekenen’ from file ‘/home/pi/domoticz/scripts/dzVents/generated_scripts/m2 per graaddag berekenen.lua’:
          2018-11-25 13:43:00.585 …/dzVents/generated_scripts/m2 per graaddag berekenen.lua:23: ‘}’ expected (to close ‘{‘ at line 1) near ”

          Wat heb jij er aan gedaan om het te verhelpen ????

          Alvast bedankt
          Rene

          Beantwoorden
  • 11 december 2018 om 21:13
    Permalink

    Beste….

    Is het niet mogelijk om de graaddagen apart ook in een dummy weer te geven?
    Zou mooi zijn om dit ook onafhankelijk te zien.

    Zou daarnaast dit ook kunnen met de verbruikte KWh voor mijn warmtepomp?
    Zou apart zijn als ik KWh om kan reken [ 2kWh voor 1M³ ] zodat ik mooi vergelijk kan zien, voor mijn verbruik van de Warmtepomp TOV van graaddagen..

    GAS is zo oldscool.

    Beantwoorden
  • 5 januari 2019 om 21:12
    Permalink

    Bedankt voor de uitgebreide beschrijving. Was hier naar op zoek en nu was het gewoon knippen en plakken.

    Ik kwam er vandaag alleen wel achter dat de gemiddelde temperatuur niet klopte. Na wat zoek werk blijkt bij het ophalen van de json data hij niet een dag aan data ophaalt maar 5 dagen aan data.
    Mogelijk komt dit door een instelling die ik zelf ergens gedaan heb ivm dataretentie maar uiteindelijk klopt het dus niet.

    Ik heb het nu opgelost door in de for loop in regel 43 te starten op positie 1153 ipv 1 (for i = 1153, elements do)

    Nu klopt de waarde wel.
    Mogelijk dat dit bij meer domiticz installaties mis gaat 😉

    Beantwoorden
    • 5 januari 2019 om 21:18
      Permalink

      De short log history van de short log sensors op 1 dag zetten in Domoticz, dan werkt het perfect!

      Beantwoorden
    • 6 januari 2019 om 15:34
      Permalink

      Zie mijn bericht van 20 november. Je heb je instelling ‘short log sensors’ waarschijnlijk op 4 dagen staat.
      Ik heb het ook zo opgelost. Geen fraaie oplossing; je haalt nu 5 keer zoveel data op dan je nodig hebt, maar het werkt wel.
      Geert

      Beantwoorden
      • 16 januari 2019 om 21:15
        Permalink

        Zelf heb ik er voor gekozen om de laatste (24*60/5)=288 elementen mee te nemen … dan kan iedereen de short-log gewoon lekker laten staan:

        for i = (elements-288), elements do
        sum = sum + jsonData.result[i].te
        end

        ave = sum / 288 — number of elements

        Beantwoorden
  • 21 januari 2019 om 19:46
    Permalink

    Top site dit! Echter gaat er bij mij wat mis:

    2019-01-21 19:40:00.858 Error: EventSystem: in Gemiddelde temp buiten: [string “local function DeviceUpdate(idx, value1)
    …”]:41: attempt to get length of field ‘result’ (a nil value)

    Zie ik in de logging staan. Iemand een idee?

    Beantwoorden
  • 21 januari 2019 om 19:54
    Permalink

    Goedenavond, toffe site! Ik krijg de volgende fout:

    2019-01-21 19:40:00.858 Error: EventSystem: in Gemiddelde temp buiten: [string “local function DeviceUpdate(idx, value1)
    …”]:41: attempt to get length of field ‘result’ (a nil value)

    Dit is mijn ingestelde script:

    local function DeviceUpdate(idx, value1)
    local cmd = string.format(“%d|0|%.2f”, idx, value1)
    –print(cmd)
    table.insert (commandArray, { [‘UpdateDevice’] = cmd } )
    end

    Debug = “YES” — Debugging aanzetten (“YES”) of uitzetten (“NO”)

    commandArray = {}

    local m = os.date(‘%M’)
    if (m % 5 == 0) then — script loopt iedere 5 minuten

    — Variabelen instellen
    local temperature_name = ‘Gem Temp Buiten’
    local temperature_idx = otherdevices_idx[temperature_name]

    local uitlees_name = ‘Temp/Hum Buiten’
    local uitlees_idx = otherdevices_idx[uitlees_name]

    –Temperaturen van afgelopen 24 uur opvragen
    local sQuery = ‘curl “http://192.168.2.100:8082/json.htm?type=graph&sensor=temp&idx=’..tostring(uitlees_idx)..’&range=day”‘
    local handle=assert(io.popen(sQuery))
    local raw = handle:read(‘*all’)
    handle:close()

    –Ontvangen waarden verwerken
    json = assert(loadfile ‘/volume1/@appstore/domoticz/var/scripts/lua/JSON.lua’)()
    local jsonData = json:decode(raw)

    if Debug==’YES’ then
    print (jsonData.title)
    print (jsonData.status)
    print (jsonData.result[1].d)
    print (jsonData.result[1].te)
    end

    –Gemiddelde temperatuur van afgelopen 24 uur bepalen
    local sum = 0
    local ave = 0
    local elements = #jsonData.result

    for i = 1, elements do
    sum = sum + jsonData.result[i].te
    end

    ave = sum / elements

    if Debug==’YES’ then
    print(‘Gemiddeld: ‘..tostring(ave))
    end

    –Gemiddelde temperatuur opslaan in virtuele temperatuur sensor
    DeviceUpdate(temperature_idx,ave)

    end
    return commandArray

    Ik heb zelf mijn twijfels bij het opgeslagen path voor het script. Hier stond een URL voor PI, maar ik werk met Synology NAS. Wat moet ik dan invullen?

    Thanks!

    Beantwoorden
  • 21 januari 2019 om 21:39
    Permalink

    Hoi Sander,
    In het script voor de “gemiddelde buiten temperatuur” wordt het volgende script gebruikt:
    {code}json = assert(loadfile ‘/home/admin/domoticz/scripts/lua/JSON.lua’)(){code}
    Deze verwijzing heb ik aangepast, omdat mijn domoticz anders is geconfigureerd.
    Moet ik het JSON.lua aanpassen om het “gemiddelde buiten temperatuur” te laten functioneren?
    Het “Graaddag” script zie ik wel opgeslagen worden onder:
    “/home/admin/domoticz/scripts/dzVents/generated_scripts/”
    Zou het “gemiddelde buiten temperatuur” script ook ergens opgeslagen moeten worden?
    Het JSON.lua script is sinds de installatie van Domoticz niet gewijzigd.

    Heb jij een idee, wat er bij mijn configuratie fout gaat?

    Beantwoorden
  • 11 februari 2019 om 16:27
    Permalink

    Bij mij wordt de gemiddelde dag temperatuur mooi berekend, maar graaddagen blijft op 0 staan. Heb geen fout meldingen in mijn log. Als ik het lua script opsta als timer, springt hij bij mij ook steeds terug op device.

    kan iemand mij helpen, alvast bedankt.

    groet Rene

    Beantwoorden
    • 11 februari 2019 om 18:08
      Permalink

      even een vraagje tussendoor…
      Bereken je graaddagen überhaupt wel met een gemiddelde buiten temp over 24 uur?
      De graaddagen is toch live..?

      Beantwoorden
  • 2 mei 2019 om 08:13
    Permalink

    Bij Overige staat bij mij netjes de m3/gd waarde, maar deze is rood gekleurd.
    Deze rode kleur zie ik bij alle andere temperaturen en schakelaars niet, dus waarom bij deze wel denken jullie ?

    Beantwoorden
    • 9 oktober 2019 om 22:27
      Permalink

      Deze m3/gd waarde is rood omdat deze waarde maar 1 x per dag wordt geupdate door het script. Ik zoek nog naar een manier om dit op te lossen. Iemand een idee?

      Beantwoorden
      • 10 oktober 2019 om 07:11
        Permalink

        Setup > Settings > tabblad Other > Sensor timeout

        Beantwoorden
  • 2 mei 2019 om 22:47
    Permalink

    zou iemand dit script ook zo kunnen maken dat je in domoticz een graaddagen teller hebt.
    Dus dat het makkelijk om te zien is hoeveel graaddagen er zijn geweest?

    Beantwoorden
  • 18 oktober 2019 om 16:38
    Permalink

    Geweldig artikel!

    Ik heb een vraag, gezeur in de marge meer. Bij de calculatie om 2358 wordt het verbruik per graaddag een dag later geboekt. Ik zag dat de waardes over gisteren op vandaag geboekt werden.

    Is de oplossing door de calculatie om 2353 uur te laten plaatsvinden?

    Hoe ga jij hier mee om?

    Beantwoorden
    • 19 oktober 2019 om 19:46
      Permalink

      Ik heb daar geen last van. Je kunt het script op ieder willekeurig moment laten draaien, maar het beste is uiteraard zo laat mogelijk.

      Beantwoorden
  • 2 november 2019 om 11:26
    Permalink

    Bedankt Joost, ik wilde al zoiets als dit maken en dit heeft me nogal wat tijd bespaard 🙂 Bedankt!

    Opmerkingen ter verbetering:
    – in regel 28 van je 1e script moet je ook nog je eigen directory zetten (mijn installatie staat niet onder ‘pi’ maar onder een andere gebruikersnaam). MIsschien dat bij de instructie zetten>
    – In je 2e script staat ook een (inmiddels) verouderde functie blijkbaar in regel 14 want ik krijg deze ‘info’ in de log: “domoticz.round deprecated. Please use domoticz.utils.round.”

    Vreemd zij effect: in je originele script zie ik output ‘Gemiddelde temperatuur buiten (laatste 24u): 14.010000228882’ in de logs, met domoticz.utils.round wordt dat ‘Gemiddelde temperatuur buiten (laatste 24u): 14’, maar dat zou eigenlijk helemaal geen effect moeten hebben want die ‘round’ zit daar niet… Mysterie 🙂

    Beantwoorden

Geef een reactie

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