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
- Raspberry Pi
- Raspbian software
- Domoticz software
- Eneco’s Toon thermostaat (of een andere slimme thermostaat)
- Script met de buiten-temperatuur of een temperatuursensor i.c.m. een RFXCOM
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”.
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
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”.
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
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!
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.
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…
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
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.
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?
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/
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)
note self: haakje op regel 27 ontbreekt.
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?
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.
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
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.
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 ?
De short log history van de short log sensors op 1 dag zetten in Domoticz, dan werkt het perfect!
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
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
Hier zit volgens mij een klein denkfoutje in … “for i = (elements-288), elements do” neemt namelijk 289 elementen mee. Dat komt door de werking van een “for-loop”. Bedenk maar wat er gebeurt als je de volgende for-loop neemt: “for i = (10-2), 10 do” .. deze zal voor i de waardes 8, 9 en 10 doorlopen en dat zijn er 3 en niet 2.
Volgens mij moet het als volgt zijn:
for i = (elements-287), elements do
sum = sum + jsonData.result[i].te
end
ave = sum / 288
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?
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!
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?
Sander??? Hoi Joost bedoel ik.
Ik was vergeten om LUA te activeren onder >> Settings >> Overig
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
even een vraagje tussendoorâŠ
Bereken je graaddagen ĂŒberhaupt wel met een gemiddelde buiten temp over 24 uur?
De graaddagen is toch live..?
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 ?
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?
Setup > Settings > tabblad Other > Sensor timeout
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?
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?
Ik heb daar geen last van. Je kunt het script op ieder willekeurig moment laten draaien, maar het beste is uiteraard zo laat mogelijk.
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 đ
Joost,
Leuk om hiermee te stoeien!
MBT tot item “gasverbruik per graaddag”: de sensor bleef bij mij op 0 staan. In de instructie wordt de sensor aangemaakt met “gasverbruik per graaddag”, terwijl het dzVentz script een andere naam hanteert: “gas per graaddag”. Heb de naam van de sensor renamed naar “gas per graaddag”, nu werkt de functie. Kwam hierop door de logging te bekijken van het moment van draaien script. Zou je hier naar kunnen kijken?
Goedemorgen,
Mooi scriptje! Inmiddels de gemiddelde temperatuur per dag prima op orde.
De graaddagen blijft ook na gisteren op 0 staan.
Ook geen vermelding in de logs om 23:58.
Ik ga eens op zoek naar een manier om dit script handmatig te starten ter verificatie.
Joost,
De gemiddelde buitentemperatuur wordt goed berekent.
Echter het DzVents script voor de berekening van het gasverbruik per graaddag heeft in mijn webbrowser maar 12 regels terwijl jij in de beschrijving verwijs naar regel 13 en 24.
Ook in ander browsers mis ik deze regels.
Is dit een probleem op de website?
Waar kan ik het complete script vinden?
Het script werd inderdaad niet goed weergegeven, is nu opgelost!
Hoi,
Sinds de nieuwe domoticz 2020.1 versie, krijg ik bijgaande foutmelding:
2020-04-20 13:55:00.219 Error: EventSystem: in Gemiddelde buitentemperatuur berekenen: [string “local function DeviceUpdate(idx, value1) …”]:34: attempt to get length of a nil value (field ‘result’)
Enig idee wat hier niet goed gaat? En wat er verbetert moet worden?
Waar haal jij de temperatuur vandaan? Een van de grote gratis APIâs van Dark Sky is offline getrokken door de nieuwe eigenaar.
Wel zit er een rechtstreekse koppeling naar Buienradar in de nieuwe Domoticz. Even de coördinaten van je adres invoeren en de rest wijst voor zich.
Ik heb deze melding ook nog steeds, heb jij al een oplossing?
Joost, superleuk om allemaal te proberen, echter loop ik tegen 2 issues aan op mijn Synology met Domoticz: bij script 1 gemiddelde temparetauutr geeft hij aan:
“Error: EventSystem: in Script #1: [string “local function DeviceUpdate(idx, value1) …”]:32: attempt to index a nil value (local ‘jsonData’)”
Wat zegt dit?
En bij het splitsen van de temperatuur en luchtvochtigheid krijg ik de volgende melding:
“Error: EventSystem: in Script #3: [string “commandArray = {} …”]:14: ‘)’ expected near ‘”
Wat zegt dit? Of veroorzaakt dit ook de fout bij script 1 omdat dit nog een temp/hum meter is en niet goed gesplits?
Volgens mij kan het berekenen van het gemiddelde wel eenvoudiger. Ik heb onderstaand script hiervoor gemaakt. Kun je zelf opgeven hoeveel uren data hij moet berekenen:
return {
active = true,
on = {
devices = {‘Buiten’} — netatmo buiten temp sensor
},
data = {
temperatures = { history = true, maxHours = 24 }
},
execute = function(domoticz, sensor)
— haal de data uit de sensor van de netatmo
domoticz.data.temperatures.add(sensor.temperature)
— custom sensor die we willen updaten
local BuitenGemTemp = domoticz.devices(‘Gemiddelde Temp Buiten’)
— bereken het gemiddelde
local tempAverage = domoticz.data.temperatures.avg()
— update de customsensor met de gemiddelde temp
BuitenGemTemp.updateTemperature(tempAverage)
end
}
Joost, een top script loopt lekker door.
Echter zie ik bij mij dat het script een uur lang dezelfde waarde opslaat in het device. Terwijl ik echter maar Ă©Ă©n run moment heb staan.
Hiermee gaat natuurlijk de cijfers wat in de war.
Heeft iemand een idee wat heb ik fout heb staan?
Je geeft aan dat het script maar 1x per dag draait, dan wordt ook maar 1x per dag de waarde in de Domoticz database opgeslagen (en dat is ook goed). De grafiek toont ieder uur (tot 23.58 uur) dezelfde waarde, maar dat is verder niet interessant.
Dag,
ik loop tegen hetzelfde aan. Ik krijg keurig om 23:58 een berichtje met de m3 per graaddag. In de database zie ik vanaf 24.00 uur iedere vijf minuten een waarde staan. Het script heb ik letterlijk overgenomen.
Als enig idee wat de oorzaak is?
Ik krijg de eerste sensor niet werkend (Gemiddelde Temp buiten).
Mijn error log geeft de volgende output:
2020-09-24 19:30:00.643 Error: EventSystem: in Gemiddelde Temp buiten: /home/pi/domoticz/scripts/lua/JSON.lua:808: HTML passed to JSON:decode(): Unauthorized401 Unauthorized
2020-09-24 19:31:00.627 Error: dzVents: local netWork not open for dzVents openURL call !
2020-09-24 19:31:00.627 Error: dzVents: check dzVents wiki (look for ‘Using dzVents with Domoticz’)
2020-09-24 19:32:00.637 Error: dzVents: local netWork not open for dzVents openURL call !
2020-09-24 19:32:00.638 Error: dzVents: check dzVents wiki (look for ‘Using dzVents with Domoticz’)
2020-09-24 19:32:01.041 Error: dzVents: Error: (3.0.2) WUS: [0003] Lokatie nil/0; Probleem bij het ophalen van de locatie gegevens van domoticz
2020-09-24 19:33:00.676 Error: dzVents: local netWork not open for dzVents openURL call !
2020-09-24 19:33:00.676 Error: dzVents: check dzVents wiki (look for ‘Using dzVents with Domoticz’)
Het lijkt een rechten probleem te zijn, maar hoe kan ik dat fixen?
Setup > Settings > Local Networks (no username/password)
Hier moet je even de juiste ip-adres(sen) invullen.
Bedankt! De eerste error is daarmee opgelost. Nu krijg ik alleen deze nog:
Error: EventSystem: in Gemiddelde Temp buiten: /home/pi/domoticz/scripts/lua/JSON.lua:808: HTML passed to JSON:decode(): Unauthorized401 Unauthorized
Enig idee hoe ik dit kan oplossen? Alvast veel dank đ
Hallo,
Ik heb inmiddels dit script zonder enig probleem toegepast! waarvoor dank!
Maar ik heb een vraag: het Gasverbruik in mijn huis bestaat naast verwarmen van de CV ook uit een deel verwarmen warmwater.
In de huidige berekening word dit deel van het gas ook meegenomen in de graaddag berekening.
Is er een methode om bijv 0,5 kuub gas minder te rekenen?
Hallo allemaal, ik ben een absolute newby met dit.
Ik krijg dezelfde melding als Kramer:
“Error: EventSystem: in Scr_gem_buiten_temp: [string “local function DeviceUpdate(idx, value1) …”]:42: attempt to index a nil value (local ‘jsonData’)”
Mijn script ziet er zo uit:
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 = ‘Gem_buiten_temp’
local temperature_idx = otherdevices_idx[temperature_name]
local uitlees_name = ‘Grond_temp’
local uitlees_idx = otherdevices_idx[uitlees_name]
–Temperaturen van afgelopen 24 uur opvragen
local sQuery = ‘curl “http://http://192.168.178.206:8084//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’)()
json = assert(loadfile ‘/volume1/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
Alvast bedankt voor jullie hulp in deze!
Hallo,
Ik ben een absolute beginner. Ik heb Domoticz op mijn NAS geinstalleerd en maak gebruik van de Buienradar API. Ik heb het eerste script gekopieerd en aangepast naar mijn eigen locatie en namen. Ik krijg een foutmelding, Error: EventSystem: in Scr_gem_buiten_temp: [string “local function DeviceUpdate(idx) …”]:2: bad argument #2 to ‘format’ (number expected, got nil)
Mijn script staat hieronder. Iemand enig idee?
local function DeviceUpdate(idx)
local cmd = string.format(“%d|0|%.2f”, idx)
–print(cmd)
table.insert (commandArray, { [‘UpdateDevice’] = cmd } )
end
Debug = “YES” — Debugging aanzetten (“YES”) of uitzetten (“NO”)
commandArray = {}
local m = os.date(‘%M’)
if (m % 1 == 0) then — script loopt iedere 5 minuten
— Variabelen instellen
local temperature_name = ‘Gem_buiten_temp’
local temperature_idx = otherdevices_idx[temperature_name]
local uitlees_name = ‘Grond_temp’
local uitlees_idx = otherdevices_idx[uitlees_name]
–Temperaturen van afgelopen 24 uur opvragen
local sQuery = ‘curl “http://192.168.178.206:8084/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/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
En ook dit script heb ik met enige aanpassing gebruikt om de gemiddelde temperatuur van de sensor op mijn eigen dak en de daarbij horende graaddag(en) automatisch te laten berekenen in Domoticz
Ook hiervoor bedankt đ
Anne.
Hallo allemaal,
Sinds een update van docker domoticz image (linuxserver/domoticz) loopt bij mij het scrip voor het berekenen van de gemiddelde temperatuur vast.
De foutboodschap is: Error: EventSystem: in Average temperature: [string âlocal function DeviceUpdate(idx, value1)âŠâ]:28: cannot open /home/superuser/data/docker/domoticz/config/scripts/lua/JSON.lua: No such file or directory
Ik zie de file JSON.lua staan, heb eigenlijk het vermoeden dat de oorsprong van de fout in de query ligt: local sQuery = âcurl âhttp://10.0.0.34:8082/json.htm?type=graph&sensor=temp&idx=â..tostring(uitlees_idx)..â&range=dayââ
Als ik de variabele âdayâ opvraag, dan heeft die de waarde nil.
Als ik zelf het curl statement uitvoer in Chrome lukt het me niet om een juiste waarde voor âdayâ te vinden. curl antwoordt met error status.
â Voor debugging, weten jullie wat voor format âdayâ heeft? Met bijv. â0421â of â20210421â lukt het niet.
â Weten jullie waar de lua global âdayâ gedefinieerd wordt?
Jelger
Hallo allemaal,
Kan toch een verkeerde “day” parameter uitsluiten, als ik een print doe van de variabele “raw” zie ik de waarnemingen voorbij komen.
Dan weer naar het fileload commando: Het absolute pad naar JSON.lua is goed, een cat /home/…/JSON.lua laat de inhoud zien. Heb verder van alles geprobeerd met andere eigenaren en met andere lees/schrijf rechten, geen resultaat.
Iemand nog een idee, niet zo simpel dit.
Jelger
Goedenavond allemaal,
Probleem opgelost. Domoticz draait bij mij in een container. Nu had ik het absolute pad op de host genomen, maar het moet dus het pad in de container zijn: /config/scripts/lua/JSON.lua.
Ben wel blij zeg!
Jelger
Dank voor het idee. Ik zag in de comments dat veel mensen problemen krijgen doordat de gemiddelde temperatuur uit domoticzâ shortlog van de buiten temperatuur sensor wordt gelezen. Hier is een dzvents scriptje om de gemiddelde temperatuur over de laatste 24 uur bij te houden, zonder die short log te lezen. En ik heb het interval een beetje langer gemaakt: 15 minuten, om het aantal waarden een beetje binnen de perken te houden. Mijns inziens heeft het niet zo veel nut om elke 5 minuten waarden te gebruiken.
local TIMER_EVENT_NAME = âevery 15 minutesâ
local OUTSIDE_TEMPERATURE_NAME = âBuiten: TempHumâ
local AVERAGE_TEMPERATURE_NAME = âBuiten: Gemiddelde temperatuurâ
return {
on = {
timer = {
TIMER_EVENT_NAME
}
},
logging = {
â level = domoticz.LOG_INFO,
marker = âaverage outside tempâ,
},
data = {
temperatures = { history = true, maxHours = 24 }
},
execute = function(domoticz, item)
if item.isTimer and TIMER_EVENT_NAME == item.trigger then
local outside_temperature_device = domoticz.devices(OUTSIDE_TEMPERATURE_NAME)
local average_temperature_device = domoticz.devices(AVERAGE_TEMPERATURE_NAME)
if nil == outside_temperature_device then
domoticz.log( âDevice â .. OUTSIDE_TEMPERATURE_NAME .. â not found.â, domoticz.LOG_ERROR)
elseif nil == average_temperature_device then
domoticz.log( âDevice â .. AVERAGE_TEMPERATURE_NAME .. â not found.â, domoticz.LOG_ERROR)
else
domoticz.data.temperatures.add(outside_temperature_device.temperature)
average_temperature_device.updateTemperature(domoticz.data.temperatures.avg())
end
end
end
}
Hallo,
Ik heb het script omgebouwd voor mijn (Windows) situatie. Aangezien ik nog geen fysieke temp sensor heb, probeer ik het werkend te krijgen met het Buienradar script. Maar krijg geen data te zien. In de log staat daarom ook de volgende foutmelding:
string âlocal function DeviceUpdate(idx, value1)âŠâ]:41: attempt to index a nil value (local âjsonDataâ)
Als ik een print doe van de Raw zegt hij ook dat hij leeg is. [string âlocal function DeviceUpdate(idx, value1)âŠâ]:25: global âPrintâ is not callable (a nil value)
ik heb het idee dat vanwege de Buienradar data deze curl opdracht niet goed uitgelezen wordt.
local sQuery = âcurl âhttp://192.168.178.120:8080/json.htm?type=graph&sensor=temp&idx=â..tostring(uitlees_idx)..â&range=dayââ
Wie kan mij hierin helpen?
Hoi Jan,
Wat gebeurt er als je het commando op de command prompt uitvoert, en dan dus de juiste idx invult?
Bijvoorbeeld voor idx 20211129:
curl âhttp://192.168.178.120:8080/json.htm?type=graph&sensor=temp&idx=20211129&range=dayâ
Kan het een rechten ding zijn dat je de URL niet kunt benaderen?
Anne.
Hallo Anne,
Dan is de melding hetzelfde. En wanneer ik met Json de waardes ophaal kan ik veel data ophalen (ook remote), maar Graph&Sensor kent hij niet. Heeft dit te maken omdat dit niet op een RPi is maar onder Windows 7?
ik hoor je graag,
Jan
sorry ik had t verkeerd gelezen. ik had het in de webbrowser gedaan, puur met http.
in de command prompt gaf hij aan, dat hij dit commando niet kende. Ik heb toen Curl geĂŻnstalleerd. En idd zoals je al vermoedde, geeft hij aan dat ik geen rechten heb.
Unauthorized401 Unauthorized
Nadat ik de beveiliging er af gehaald heb, kreeg ik dit antwoord.
{
âActTimeâ : 1638703917,
âAstrTwilightEndâ : â18:33â,
âAstrTwilightStartâ : â06:25â,
âCivTwilightEndâ : â17:09â,
âCivTwilightStartâ : â07:49â,
âDayLengthâ : â08:01â,
âNautTwilightEndâ : â17:52â,
âNautTwilightStartâ : â07:06â,
âServerTimeâ : â2021-12-05 12:31:57â,
âSunAtSouthâ : â12:29â,
âSunriseâ : â08:29â,
âSunsetâ : â16:29â,
âapp_versionâ : â2021.1â,
âstatusâ : âOKâ,
âtitleâ : âDevicesâ
}
Dus daar gaat het goed (denk ik) maar in de log blijft de fout staan. Het volgende probleem zal dan wel zijn dat hij het JSON.lua niet goed kan runnen. Ik denk dat onder windows de regel moet zijn: json = assert(loadfile âC:\\Program Files\\Domoticz\\scripts\\lua\\JSON.luaâ)()
toch?
Nog een foutje gevonden. Ik had de verkeerde IDX laten staan met allerlei testen. vandaar dat ik de verkeerde output kreeg. de curl:
curl “http://192.168.178.120:8080/json.htm?type=graph&sensor=temp&idx=82&range=day”
geeft dit antwoord: volgens mij klopt dat beter.
{
“d” : “2021-12-04 07:10”,
“te” : 4.2999999999999998
},
{
“d” : “2021-12-04 07:15”,
“te” : 4.5
},
{
“d” : “2021-12-04 07:20”,
“te” : 4.5
},
{
“d” : “2021-12-04 07:25”,
“te” : 4.5
},
Maar error komt nog steeds. 47: attempt to index a nil value (local ‘jsonData’)
Mooi script en het werk, alleen geeft Domticz een error dat lua script te lang duurt. Is dat op te lossen?
Error: EventSystem: Warning!, lua script Gemiddelde buiten Temperatuur has been running for more than 10 seconds
Ook hier ‘ineens’ de vaker voorkomende foutmelding:
2022-06-25 00:45:00.740 Error: EventSystem: in Gemiddelde temperatuur: [string “local function DeviceUpdate(idx, value1) …”]:32: attempt to index a nil value (local ‘jsonData’)
Heeft tijden goed gewerkt, maar ineens niet meer. Heb nog niet direct oplossingen langs zien komen hier?
Werkt dit script nog goed voor iemand?
Ik krijg geregeld foutmeldingen, en gemiddeld aantal graaddagen staat op 2000+
de deviceupdate functie zou voor problemen zorgen.
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 = âGemiddelde Buitentempâ
local temperature_idx = 64 âotherdevices_idx[temperature_name]
âlocal uitlees_name = âGround Temperature (10 cm)â
local uitlees_idx = 50 âotherdevices_idx[uitlees_name]
âTemperaturen van afgelopen 24 uur opvragen
local sQuery = âcurl âhttp://10.0.0.30: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)
commandArray[âGemiddelde Buitentempâ]=tostring(ave)
end
return commandArray
Ik probeer van alles maar krijg de gemiddelde temperatuur sensor niet werkend.
Zou iemand voor mij een werkend script kunnen plaatsen?
Alvast bedankt. (hieronder de foutmelding)
2022-10-14 08:34:00.551 Error: EventSystem: in Gemiddelde Temp buiten: /home/avdstreek/domoticz/scripts/lua/JSON.lua:808: HTML passed to JSON:decode(): HTTP Status 400 â Bad Requestbody {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}HTTP Status 400 â Bad Request
Ik gebruik een virtuele sensor “Temperatuur buiten” die ik heb aangemaakt dmv splitsen buienradar sensor TempHumBaro (type Temp + Humidity + Baro) als input voor onderstaande:
— start script
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.1.5: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
— end script
Is het niet veel handiger om de gemiddelde temp te lezen uit de TempHumBaro data? Die wordt door Domoticz sowieso al weergegeven!
Hoe kan dat worden gedaan?
Sinds de upgrade naar 2023.1 werken de scripts niet meer krijg een melding unauthorized en kan nog geen oplossing vinden.
Heb de oorzaak gevonden.
Bij instellingen -> beveiliging moet je je locale netwerk ip invullen (mag * als wildcard gebruiken)
bijv: 192.xxx.xxx.* waardoord de curl weer werkt.