-
Notifications
You must be signed in to change notification settings - Fork 95
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
⚠️ Foutieve berekeningen in dagtotalen/Archief #1770
Comments
Bedankt voor je melding en zeer uitgebreide beschrijving. De tijden van het gasverbruik zouden altijd het begin van het uur moeten aangeven.
|
Oude metingen heb ik via de api ingeschoten en laten verwerken. Die tabel miste nog in de omschrijving:
Nu ik nog eens naar de dates kijk, valt me wel iets op. Volgens mij is deze kolom een UTC timestamp. Als ik Anyway, ik ben er weer even klaar mee voor vandaag. Ik hou je op de hoogte van de verdere ontwikkelingen. De nieuwe hardware waar ik dsmr reader op ga runnen is helaas nog niet gereed, dus kan ik nog geen live metingen mee testen. |
Als het goed is slaat Postgres altijd timezone aware datetimes op als UTC. Wat je daarna terugkrijgt bij ophalen hangt af van je sql client en of je een tijdzone opgeeft bij verbinden. Zie de queries in: #1217 (comment)
Verder kan het wel eens een edge-case zijn hoor, want als je de meterstanden uit je screenshot optelt, kom je op
|
Ik converteer het naar een UTC timestamp voor ik het in de api inschiet. Waarbij er rekening gehouden wordt met zomer/wintertijd. Aangezien ik merkte dat consequent alleen het laatste uur van de dag niet werd meegeteld in het totaal dagverbruik, heb ik nog een extra uur van de beeclear tijd afgehaald bij omzetten van de timestamp naar utc Dit lost het probleem op voor dagen met verbruik in het laatste uur (zelfde geldt voor elektra). Echter werden daarna juist de dagen weer met verbruik in het eerste uur incorrect (wat daarvoor nog goed ging). vertalen gaan de dagen goed waarbij er geen gas (zelfde geldt overigens voor elektra) verbruikt is in het eerste uur, dus dat geldt voor bijv 2 december: De uur grafiek komt dan ook overeen met die van beeclear: Nu gaat het dus bijv. weer mis op 4 december: Echter is de 'Meterstand bij eerste meting van de dag' anders dan in beeclear: Voorbeeld van conversie:
Bij deze even een export van de belangrijkste db tabellen: En de beeclear gas csv export wat de bron is voor de migratie: Wellicht valt je iets op? Het voelt voor mij echter niet als een edge case, omdat het consequent ofwel het laatste uur is wat niet meegeteld wordt dan wel het eerste uur 😅 |
Bedankt voor je aanvulling. Ik kan nu niet zo 1-2-3 in de data kijken. Mijn vermoeden is nog steeds dat als er een optelling niet klopt, het een edge-case is qua bounds in DSMR-reader. Voor de duidelijkheid, wat klopt er nunog steeds niet?
Is het mogelijk om zowel DSMR-reader als BeeClear de meter te laten uitlezen voor een paar dagen? Je kunt DSMR-reader immers makkelijk leeggooien totdat de oorzaak boven water is. |
Het gasverbruik per uur gaat goed. Wat er nog niet goed gaat in het vb. van 2 december:
Als je alle waardes van de dataview optelt, kom je ook uit op 3,659. Om beide te monitoren moet ik even een 2e P1 kabel en splitter kopen, maar dat zou een optie kunnen zijn. |
Ik weet niet helemaal zeker of ik onderstaade goed intepreteer, maar als ik je SQL datadump goed lees dan komt de eerste meterstand op 4 december overeen met die Dat lijkt de waarde op 23:00 UTC de dag ervoor, dus middernacht onze tijd/CET. Dat uur Ik denk dat het goed is om dat extra uur er niet af te halen, zodat ze weer in lijn zijn. Anders is het sowieso niet te debuggen. Links CET in beeclear CSV? Rechts is UTC in SQL dump. Heb je ook al eens geprobeerd om de tijden gewoon als CET/CEST in te schieten en niet UTC? Dat maakt het wellicht makkelijker, tenzij de beeclear in UTC is. Als het goed is kun je gewoon |
Bedankt voor je aanvulling. Voor de duidelijkheid, het gaat er mij niet zozeer om wat de database opslaat, want dat is altijd UTC. Het gaat er vooral om dat je dan zelf niet de conversie hoeft te doen, als je brondata niet UTC is. Als dat het makkelijker voor jezelf maakt. Je kunt zelf in postgres aangeven in welke tijdzone je de data terug wilt hebben, dat staat los van de UTC-opslag. Zie hieronder als voorbeeld dezelfde data in andere tijdzones.
Ik geloof je helemaal dat er ergens iets niet klopt, maar voor het debuggen van dit issue zoek ik daarom naar de SQL export van je DSMR-reader-variant waar je ze in hebt geschoten als hoe ze ook in Beeclear staan, zonder verschil in uren. Ik hoef alleen de |
Fair point, had je verkeerd begrepen, maar inderdaad het query'en met Amsterdam timezone maakt het een stuk makkelijker vergelijken. Ik gebruik IntelliJ dus kon idd bij options de timezone configureren 👍. Export: En voor de volledigheid nog een keer de beeclear export: |
De meterstanden in de dagstatistieken-tabel worden niet gebruikt voor berekeningen. Deze zijn later toegevoegd puur ter historie. De dataflow binnen DSMR-reader is:
De twee tussentabellen voeren eventuele groepering uit. Als het ergens mis gaat, zit het vermoedelijk in |
De records voor 10 december in
Dus ergens zit daar iets wat niet meegenomen wordt. |
Wat geeft deze query bij jou?
|
Als die leeg is, kun je deze eens proberen:
En dan de import/verwerking opnieuw doen. |
Het is een ontzettend edge-case die ik zelf nog niet eerder had gezien (of vergeten was). Omdat de telegramversie onbekend is totdat je een echt telegram stuurt, trekt DSMR-reader geen uur af van de data en krijg je dus die verspringing. Ik denk dat de meeste gebruikers eerst DSMR-reader aan de slimme meter aansluiten en daarna pas de import doen. Want dit zit er al een eeuwigheid in en het is niet eerder opgevallen: Omdat het er zolang in zit, ga ik het ook niet aanpassen omdat de kans groot is dat het effect heeft op andere dingen. Desnietemin is het wel een soort van bug of uitzondering die iemand wellicht nog vaker tegen gaat komen. Dus mooi dat het nu een keertje helder is. Dank! |
Gedaan en dat fixed inderdaad 1-12-2022, maar nu gebeurd hetzelfde als toen ik een extra uur van de offset had afgehaald: op 4-12-2022 wordt het eerste uur niet meer meegerekend. Data in dsmr_consumption_gasconsumption table:
PS: hetzelfde lijkt te gebeuren voor elektra. |
Bedankt voor het checken! Ik ben er inmiddels ook achter waar het in zit, en dat is die tussentabel. Alleen heb ik er geen makkelijke fix voor, omdat het e.e.a. raakt. Uiteindelijk had ik al wel plannen om DSMR-reader te versimpelen en alles te baseren op de metingen-tabel, wellicht in combinatie met een timeseries-database, die er iets lekkerder voor werkt. |
Voor de korte termijn zal ik een fix maken die:
Want niet iedereen heeft alle brongegevens meer, vandaar die meterstanden in de dagstatistieken-tabel als last-resort. Daarnaast zal ik het script niet automatisch uitvoeren, maar optioneel maken, zowel met een dry-run modus als "echte" modus zodat gebruikers eerst zien of het ze raakt en wat er verandert. Alle andere zaken neem ik wel mee bij de versimpeling van DSMR-reader later. |
@nickgr6 je zou de v5.10.3 release kunnen proberen om te zien of het inmiddels al beter gaat of nog wat rework nodig heeft. |
Bedankt voor de update! Vanwege vakantie ga ik hier echter pas na 15 maart naar kunnen kijken. Ik hou je op de hoogte nadien. |
Ik realiseer me dat met de “delivered” waarden het allemaal per uur en dag terug te rekenen is dus kan ik het probleem zelf oplossen |
@Roukie686868 |
@Roukie686868 en aanvullend daarop, de data wordt na verloop van tijd (standaard een maand) uitgedund voor performance. De eerste en laatste meting van elk uur worden bewaard, waardoor het altijd terug te rekenen moet zijn. DSMR-reader zal dat ook doen wanneer ik een fix heb voor het huidige issue. |
Perfect dat de data ook in dsmr_datalogger_dsmrreading staat. Dan is het mogelijk om echt alles weer perfect terug te rekenen. |
Dennis nog bedankt voor het wijzen naar de juiste kolom. Ik haal deze data binnen in PowerBI en met de volgende query krijg ik precies wat ik zocht. Ik gebruik wel de set met de gereduceerde regels, Hier krijg ik ook wat er per uur verbruikt is zonder de database onnodig te belasten. SELECT read_at, (delivered - lag(delivered,1) over (order by read_at)) as verbruik |
Ik kwam toevallig deze thread tegen toen ik zocht naar een verklaring voor mijn probleem. Toen ik verder ging kijken zag ik dat het overzicht in Homeassistant en Mindergas.nl wel klopt met het overzicht van Vattenval. Beide krijgen de meterstanden door van DSMR reader. Ik gebruik versie v5.10.3. In de screenshot van het gasverbruik van gisteren zie je het verschill tussen HAS en DSMR. |
Ik heb hetzelfde probleem ervaren. Bij het vergelijken van de jaarstatistieken zoals geregistreerd in DSMR reader, met handmatig bijgehouden meterstanden, bleek dat er een aanzienlijk verschil was in stroom- en gasverbruik (~10% minder gasverbruik in DSMR reader dan op de meterstanden). Volgens mij gaat het mis in het berekenen van de consumptions, en specifiek in de manier waarop een tijdsrange wordt gequery'd in
Hier query't DSMR alles binnen een tijdsrange, waarbij de eerste reading wordt afgetrokken van de laatste reading om te bepalen wat de consumptie was binnen die range. In plaats daarvan werkt het bij mij om de readings binnen Overigens laat ik |
@StevenM1 bedankt voor je uitgebreide aanvulling. Het specifieke stukje code is al meerdere maken aangepast en weer teruggezet (#1385):
De kern van het hele probleem is uberhaupt die tussentabel in DSMR-reader, de consumption. Er is sowieso geen garantie dat er een meting is tussen 23:55 en middernacht, wat de huidige opzet in DSMR-reader per definitie dus kan laten "lekken". Alleen is dat niet te doen qua werkgrootte. Plus dat de huidige situatie onder (unit)tests staat die niet kloppen (want het klopt immers niet), dus die moeten ook over de kop. Het liefste naar een integratietest die meer naar het eindresultaat kijkt, voor DSMR v3, v4 en v5 meters. En hoewel ik wel neig om weer terug te gaan van de situatie van 2019-2021 (dus jouw voorstel), voor nu, weet ik niet wat de gevolgen daarvan zijn. Dus veel keuzes en veel wegen. |
Ik snap je overwegingen, en ben het er helemaal mee eens dat de beste oplossing (maar waarschijnlijk wel veel werk) zou zijn om gewoon direct de readings te query'en en aan de hand daarvan de consumption te berekenen. Wat ik niet helemaal begrijp is wat de reden is geweest om van Zonder direct de tussentabellen eruit te gooien, lijkt het mij dat de meeste accurate benadering is om een range te pakken (zeg, 24 uur), en dan de eerste meting ná die range te gebruiken als eindpunt. Dat is iets complexer dan de Indien er géén reading is op exact het eind van de range, lijkt het me dat de eerstvolgende reading de meest accurate benadering daarvan is. Het kan dan wel zijn dat die reading een tijdje na de gespecificeerde range is (hypothetisch, als je slechts om het uur een meting hebt, kan het zo zijn dat er op dag Maar goed - ik weet niet alles van de structuur van DSMR reader, en weet dat dit soort aanpassingen riskant zijn dus dat ik het begrijp dat je voorzichtig bent in het aanpassen van dit soort dingen. Maar misschien heb je iets aan wat ruggespraak. |
Bedankt voor je aanvulling. Het nadeel is dat ik ook niet meer exact weet welke wijziging waarvoor is, ondanks dat ik redelijk probeer om referenties in de commit messages te zetten. Alleen weet ik niet de echte achterliggende reden. Wat betreft de edge-cases bij missende data, daar kan DSMR-reader sowieso niets in betekenen, dus ik ben het met je eens dat buiten de scope blijft. Inmiddels is wel duidelijk dat de wijziging hoe dan ook ingrijpend gaat worden, dus dat scheelt wat in de voorzichtigheid. Ook omdat er inmiddels ook weer qya Python/Django versies gebumped moeten worden, dus er komt sowieso een nieuwe major DSMR-reader versie uit, die mag afwijken van de vorige 5.x versie (mits data forward compatible, maar dat is zelden een issue). Ik denk dat uiteindelijk het slopen van de tussentabellen een hoop code scheelt, maar ook wel aardig wat kan raken qua API, MQTT, GUI, etc. Als in dat die data er straks niet meer is. Maar dat is dan maar zo. |
Allereest moet ik toegeven dat ik niet de gehele historie van gesprek hier gelezen heb, maar ik stuit ook op verschillen in dagelijks gas verbruik. |
@Rudios81 je kunt er van uitgaan dat de gegevens uit de meter kloppen. De bug zit in de manier van berekenen in DSMR-reader |
Description
Beste,
Ik ben in het proces om mijn beeclear te vervangen door een device waarop ik dsmr reader ga draaien. Ter voorbereiding ben ik nu alle historische data aan het migreren mbv de api. Dit lijkt allemaal goed te zijn gegaan.
Toen ik echter de totalen vergeleek tussen beeclear (en vattenfall die gelijk zijn aan beeclear) en de dsmr interface, zag ik verschillen. Ook zie ik inconsistentie in de 'archive' pagina van totalen.
Het volgende toont in de archive voor 2 december:
De data view voor gasverbruik per uur toont:
Als ik die optel, kom ik uit op 2.798. Maar de interface toont 2.323. Het lijkt er dus op dat de laatste meting niet wordt meegenomen (0.475). Dus mijn aanname was dat dat uur wellicht bij de volgende dag hoort aangezien de data view 2x 0:00 toont. Als ik echter de volgende dag bekijk zie ik:
Hier komt het totaal van 2.607 echter wel overeen met mijn meting in beeclear/vattenfall en wordt 0.475 van de eerste 0:00 meting dus ook niet meegenomen in de optelsom. Het lijkt er dus op dat die meeting in beide dagen niet wordt meegenomen.
De dag rows in de
dsmr_stats_hourstatistics
db:198069,2022-12-02 00:00:00.000000 +00:00,0.000,0.000,0.000,0.000,0.000
198070,2022-12-02 01:00:00.000000 +00:00,0.000,0.000,0.000,0.000,0.000
198071,2022-12-02 02:00:00.000000 +00:00,0.000,0.000,0.000,0.000,0.000
198072,2022-12-02 03:00:00.000000 +00:00,0.000,0.000,0.000,0.000,0.000
198073,2022-12-02 04:00:00.000000 +00:00,0.000,0.000,0.000,0.000,0.000
198074,2022-12-02 05:00:00.000000 +00:00,0.000,0.000,0.000,0.000,0.000
198075,2022-12-02 06:00:00.000000 +00:00,0.000,0.000,0.000,0.000,0.000
198076,2022-12-02 07:00:00.000000 +00:00,0.000,0.000,0.000,0.000,0.019
198077,2022-12-02 08:00:00.000000 +00:00,0.000,0.000,0.000,0.000,0.219
198078,2022-12-02 09:00:00.000000 +00:00,0.000,0.000,0.000,0.000,0.598
198079,2022-12-02 10:00:00.000000 +00:00,0.000,0.000,0.000,0.000,0.485
198080,2022-12-02 11:00:00.000000 +00:00,0.000,0.000,0.000,0.000,0.149
198081,2022-12-02 12:00:00.000000 +00:00,0.000,0.000,0.000,0.000,0.112
198082,2022-12-02 13:00:00.000000 +00:00,0.000,0.000,0.000,0.000,0.279
198083,2022-12-02 14:00:00.000000 +00:00,0.000,0.000,0.000,0.000,0.007
198084,2022-12-02 15:00:00.000000 +00:00,0.000,0.000,0.000,0.000,0.044
198085,2022-12-02 16:00:00.000000 +00:00,0.000,0.000,0.000,0.000,0.076
198086,2022-12-02 17:00:00.000000 +00:00,0.000,0.000,0.000,0.000,0.070
198087,2022-12-02 18:00:00.000000 +00:00,0.000,0.000,0.000,0.000,0.026
198088,2022-12-02 19:00:00.000000 +00:00,0.000,0.000,0.000,0.000,0.020
198089,2022-12-02 20:00:00.000000 +00:00,0.000,0.000,0.000,0.000,0.136
198090,2022-12-02 21:00:00.000000 +00:00,0.000,0.000,0.000,0.000,0.083
198091,2022-12-02 22:00:00.000000 +00:00,0.000,0.000,0.000,0.000,0.000
198092,2022-12-02 23:00:00.000000 +00:00,0.000,0.000,0.000,0.000,0.475
De daystatistics waardes in de database lijken ook correct:
Ook het opnieuw runnen (en stats opschonen en weer runnen) van
/app/manage.py dsmr_stats_reconstruct_missing_day_statistics
blijft hetzelfde resultaat geven.Gezien dsmr reader al zo'n volwassen product is (complimenten voor alle opties :)!), ga ik er vanuit dat er ergens een fout zit in de migratie oid. Echter lijkt de data in de db correct. Vandaar dat ik toch dit ticket heb aangemaakt. Aanvullend: er worden nog geen live metingen gedaan en verwerkt, dus dat kan niet in de weg zitten.
Enig idee waar het misgaat of wat ik zelf nog verder kan controleren om daar achter te komen?
Alvast bedankt!
DSMR-reader version
5.9
DSMR-reader platform
docker-compose (relevante config):
The text was updated successfully, but these errors were encountered: