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
}
Things like Terugleverkosten, Netwerkkosten or other kosten are not included.