Electricity, Dynamic and fixed tariffs comparision

Easy to use, 100% Lua-based event scripting framework.

Moderator: leecollings

Post Reply
HvdW
Posts: 504
Joined: Sunday 01 November 2015 22:45
Target OS: Raspberry Pi / ODroid
Domoticz version: 2023.2
Location: Twente
Contact:

Electricity, Dynamic and fixed tariffs comparision

Post by HvdW »

In the Netherlands one can choose between
1 - dynamic tariff (changes every hour)
2 - Fixed tariff with low and normal tariffs
3 - Fixed tariff with flat rate
4 - Variable tariffs - changing every 3 months or every half year

To be able to make a comparision between 1) and 2) I have written this script.

- Install the domoticz Enever plugin and choose your plan
- add your electricity prices in the script, costT1 and costT2
- initiate a textSensor named Prijsverschil or another name you like - as long as you adapt the script
- run the script

Code: Select all

local function round(num, decimals)
    local mult = 10^(decimals or 0)
    return math.floor(num * mult + 0.5) / mult
end

return {
    on = {
        devices = { 'Actual Price' },
        timer = { 'at 23:59' }
    },

    logging = {
        level = domoticz.LOG_ERROR,
        marker = 'Cost Calculation'
    },

    data = {
        costT1 = { initial = 0 },  -- daltarief
        costT2 = { initial = 0 },  -- normaal tarief
        dynamicCost = { initial = 0 },
        lastUsage1 = { initial = 0 },
        lastUsage2 = { initial = 0 },
        lastActualPrice = { initial = 0 },
        stroomOverdag = { initial = 0 },
    },


    execute = function(domoticz, triggeredItem)
        local now = os.time()
        local currentDate = os.date('%d-%m-%Y %H:%M', now)
        local logFile = "/home/pi/electricity-costs.csv"

        -- Haal de actuele verbruiksgegevens op
        local powerDevice = domoticz.devices('Power')
        local usage1 = powerDevice.usage1
        local usage2 = powerDevice.usage2
        local actualPrice = domoticz.devices('Actual Price').sensorValue

        -- Bereken het verschil in verbruik sinds de laatste meting
        local deltaUsage1 = usage1 - domoticz.data.lastUsage1
        local deltaUsage2 = usage2 - domoticz.data.lastUsage2

        -- Update de laatste verbruikswaarden
        domoticz.data.lastUsage1 = usage1
        domoticz.data.lastUsage2 = usage2

        -- Vaste tarieven (in euro per kWh)
        local costT1 = 0.2750 -- Normaal tarief 
        local costT2 = 0.2340 -- Daltarief

        -- Bereken de kosten voor vast tarief
        domoticz.data.costT1 = domoticz.data.costT1 + (deltaUsage1 * costT1)
        domoticz.data.costT2 = domoticz.data.costT2 + (deltaUsage2 * costT2)

        -- Als dit de eerste run is, gebruik dan de huidige prijs
        if domoticz.data.lastActualPrice == 0 then
            domoticz.data.lastActualPrice = actualPrice
            domoticz.log('Eerste run - Gebruikte startprijs: €' .. actualPrice, domoticz.LOG_DEBUG)
        end

        -- Bereken de kosten voor dynamisch tarief met de prijs van de voorgaande periode
        domoticz.data.dynamicCost = domoticz.data.dynamicCost + ((deltaUsage1 + deltaUsage2) * domoticz.data.lastActualPrice)
        domoticz.log('Gebruikte prijs voor berekening: €' .. domoticz.data.lastActualPrice, domoticz.LOG_DEBUG)

        -- Update de laatste dynamische prijs voor de volgende berekening
        domoticz.data.lastActualPrice = actualPrice
        
        -- voor het vergelijken even de hoeveelheid stroom tussen zon op en zon onder
        local sunrise = domoticz.time.sunriseInMinutes 
        local sunset = domoticz.time.sunsetInMinutes
        local currentTime = domoticz.time.minutesSinceMidnight
        if currentTime > sunrise and currentTime < sunset then
            domoticz.data.stroomOverdag = domoticz.devices('Power').counterToday 
        end
        
        -- Bereken de totale kosten en het verschil
        local totalFixedCost = (domoticz.data.costT1 + domoticz.data.costT2) / 1000  -- Deel door 1000 voor euro's
        local totalDynamicCost = domoticz.data.dynamicCost / 1000  -- Deel door 1000 voor euro's
        local priceDifference = totalFixedCost - totalDynamicCost  -- Positief = vast duurder, negatief = dynamisch duurder
        
        -- Log de kosten en het verschil
        domoticz.log('Kosten T1 vandaag: €' ..  domoticz.data.costT1, domoticz.LOG_DEBUG)
        domoticz.log('Kosten T2 vandaag: €' ..  domoticz.data.costT2, domoticz.LOG_DEBUG)
        domoticz.log('Dynamische kosten vandaag: €' .. domoticz.data.dynamicCost, domoticz.LOG_DEBUG)
        domoticz.log('Kosten T1 vandaag: €' ..  round(domoticz.data.costT1/1000, 2), domoticz.LOG_DEBUG)
        domoticz.log('Kosten T2 vandaag: €' ..  round(domoticz.data.costT2/1000, 2), domoticz.LOG_DEBUG)
        domoticz.log('Dynamische kosten vandaag: €' .. round(domoticz.data.dynamicCost/1000, 2), domoticz.LOG_DEBUG)
        domoticz.log('Prijsverschil (+ = vast duurder): €' .. round(priceDifference, 2), domoticz.LOG_DEBUG)
        domoticz.log('Dynamische prijs nu : €' .. actualPrice, domoticz.LOG_DEBUG)
        domoticz.log('stroomOverdag :' .. domoticz.data.stroomOverdag, domoticz.LOG_DEBUG)

        -- Update de tekst met het prijsverschil
        domoticz.devices('Prijsverschil').updateText(
        string.format(
            'Kosten vast tarief : %s € \n' ..
            'Kosten dynamisch tarief: %s € \n' ..
            'Prijsverschil: %s € (%s)\n' ..
            'Dynamische prijs per kWh: %s €',
            round(totalFixedCost, 2),
            round(totalDynamicCost, 2),
            math.abs(round(priceDifference, 2)),
            priceDifference > 0 and "vast duurder" or "dynamisch duurder",
            round(actualPrice, 2)
            )
        )
    
        function removeLastLines(filename, linesToRemove)
            -- Lees de volledige inhoud van het bestand
            local file = io.open(filename, "r")
            if not file then
                print("Fout: Kan bestand niet openen")
                return false
            end
        
            local lines = {}
            for line in file:lines() do
                table.insert(lines, line)
            end
            file:close()
        
            -- Verwijder het gewenste aantal laatste regels
            for i = 1, linesToRemove do
                if #lines > 0 then
                    table.remove(lines)
                else
                    break
                end
            end
        
            -- Schrijf de aangepaste inhoud terug naar het bestand
            local outfile = io.open(filename, "w")
            if not outfile then
                print("Fout: Kan bestand niet herschrijven")
                return false
            end
        
            for _, line in ipairs(lines) do
                outfile:write(line .. "\n")
            end
            outfile:close()
        
            print(string.format("%d regel(s) verwijderd uit %s", linesToRemove, filename))
            return true
        end

        -- Gebruik de functie en verwijder de laatste 2 regels
        removeLastLines(logFile,2)
        -- Schrijf de gegevens naar het CSV-bestand
        local file = io.open(logFile, "a")
        file:write(currentDate, ";", deltaUsage1/1000, ";", deltaUsage2/1000, ";", round(totalDynamicCost, 2), 
            ";", round(totalFixedCost, 2), ";", round(domoticz.data.costT1/1000, 2), 
            ";", round(domoticz.data.costT2/1000, 2), ";", actualPrice, ";", domoticz.data.stroomOverdag, ";", round(priceDifference, 2), "\n",
            "Datum         ;kWh ;kWh; € ; € ; € ; € ; € ;kWh; €", "\n",
            "Datum         ;dDal;dDag;Dynam;T1+T2;T1;T2;ActPrice;Power;Verschil", "\n")
        file:close()

        -- Reset de kosten aan het einde van de dag
        if os.date('%H:%M') == '23:59' then
            domoticz.data.costT1 = 0
            domoticz.data.costT2 = 0
            domoticz.data.dynamicCost = 0
        end
    end
}
The script calculates the electricity prices only.
Things like Terugleverkosten, Netwerkkosten or other kosten are not included.
Bugs bug me.
Post Reply

Who is online

Users browsing this forum: No registered users and 0 guests