Timeseries adat feldolgozasa Postgresben

Villanyorabol kinyert adataimat szeretnem megjeleniteni Grafanaban.

A cel az, hogy napi, heti illetve havi bontasban lassam a felhasznalast (kWh-ban).

Igy nez ki a mar nagyjabol formazott adathalmazom:
 

ts				val
2022-05-07 17:06:58		004139.17
2022-05-07 17:12:32		004139.19
2022-05-07 17:18:06		004139.20
2022-05-07 17:29:13		004139.21
2022-05-07 17:34:47		004139.22
2022-05-07 17:40:21		004139.23
2022-05-07 17:45:55		004139.24
2022-05-07 17:51:29		004139.25
2022-05-07 17:57:03		004139.28
2022-05-07 18:02:37		004139.31
2022-05-07 18:08:11		004139.33
2022-05-07 18:13:45		004139.35
2022-05-07 18:19:19		004139.38
2022-05-07 18:24:52		004139.44
2022-05-07 18:30:25		004139.60

 

Ha jol gondolkozom, akkor ahhoz hogy egy napi bontast lassak, ki kene szamolni az orankenti fogyasztast (lehetne kisebb interval is, hogy egy oran belul tobb datapointom legyen, de szerintem felesleges).

Es akkor a grafikonon az X tengely az idopont: 0 ora, 1 ora, 2 ora, 23 oraig (vagy masnap 0-ig...?) az Y tengely pedig a max-min deltak az adott oraban.

Ugye a nulladik oraban a delta mindig 0 lenne, viszont 1 oranal mar az elso oraban mert legkisebb es legnagyobb ertek kulonbseget kene megjeleniteni es igy tovabb...

Addig jutottam, hogy le tudtam kerdezni az adott oraban a legkisebb es legnagyobb ertekeket, de az osszeboronalas mar nem ment.

Ez a kovetkezo keppen nez ki:

A tabla DDL-je:

create table ts_string
(
    id    integer not null,
    ts    bigint  not null,
    val   text,
    ack   boolean,
    _from integer,
    q     integer,
    primary key (id, ts)
);

 

A legkisebb ertek az adott oraban:

select distinct on (1) date_trunc('hour',to_timestamp(ts/1000)), val from ts_string where id = 2 order by 1,2 asc;

A legnagyobb ertek az adott oraban:

select distinct on (1) date_trunc('hour',to_timestamp(ts/1000)), val from ts_string where id = 2 order by 1,2 desc;

 

Ugye ezt a ket erteket kene kivonni egymasbol es lekorlatozni az adathalmazt a mai napra, azaz majus 7. 00:00-tol 23:59-ig.

Talan valahogy a date_trunc-os datum alapjan kene GROUP BY-olni es akkor a min_val es max_val aliasu selecteket kivonni egymasbol, de a teljes megoldasig nem jutottam.

 

Ha segit itt egy kis raw data a ts_string tablabol:

id,ts,val,ack,_from,q
2,1651943218419,004139.17,true,1,0
2,1651943552309,004139.19,true,1,0
2,1651943886315,004139.20,true,1,0
2,1651944553927,004139.21,true,1,0
2,1651944887804,004139.22,true,1,0
2,1651945221732,004139.23,true,1,0
2,1651945555690,004139.24,true,1,0
2,1651945889426,004139.25,true,1,0
2,1651946223444,004139.28,true,1,0
2,1651946557211,004139.31,true,1,0
2,1651946891028,004139.33,true,1,0
2,1651947225136,004139.35,true,1,0
2,1651947559034,004139.38,true,1,0
2,1651947892582,004139.44,true,1,0
2,1651948225906,004139.60,true,1,0
2,1651948559496,004139.81,true,1,0
2,1651948892947,004140.03,true,1,0
2,1651949226157,004140.26,true,1,0

Hozzászólások

Szerkesztve: 2022. 05. 07., szo – 22:12

Itt tartok:

 

select u.hour, MAX(u.val) - MIN(u.val) AS diff
from (
         (select date_trunc('hour', to_timestamp(ts / 1000)) as hour, val::numeric
          from ts_string
          where id = 2
          order by 1, 2 asc)
     ) as u
group by u.hour order by u.hour;

 

bar nem tudom, hogy ez mennyire elegans...

Nem teljesen ertem, ha napi meg heti bontasban erdekel az adat, miert orankent group by-olsz es truncate-elsz?

A strange game. The only winning move is not to play. How about a nice game of chess?

Lehet felreertheto voltam, de a napi bontast ugy ertettem, hogy egy nap lebontva orakra:

https://drive.google.com/file/d/1BjacIZqIb7ndz9U2bNYbbARt62L800gU/view?…

 

Ennek amugy kesobb nem lesz jelentosege, mert nem fogom naponta nezegetni a fogyasztast, valoszinuleg a heti es havi fogja atvenni a helyet.

Most mig keves az adat addig meg jatszok vele addig jo.

1. Állíts elő egy másik táblát, ahol nem abszolút értékek hanem delták vannak. Ha jól látom, PGSQL-ben ezt a LAG függvény tudja. De parasztosan a táblát önmagához joinolva is biztos kijön, csak esetleg lassabb lesz.

2. Lekérdezéskor minden idő-delta párhoz állítsd elő, hogy melyik időintervallumhoz akarod hozzávenni (óra/nap/hónap), kerekítsd le az időt, csoportosíts aszerint, és add össze az adott intervallumokba eső több delta értéket.

Csak 1 kérdés:

Time seriers adatokat miért relációs adatbázisban akarsz feltétlen kezelni?

pl egy InlfuxDB helyből nyújtja ezt  funkcionalitást.

GROUP BY time intervals
GROUP BY time() queries group query results by a user-specified time interval.

https://docs.influxdata.com/influxdb/v1.7/query_language/data_exploration/

Ha ez is opció, én lehet ilyen irányba mennék....

Teljesen jogos a kerdes.

Eloszor InfluxDB-be toltam az adatot, mert a legtobb tutorial is ezt hasznalja es azok alapjan indultam.

Viszont amikor kezzel utanaszamoltam a delta szamitasoknak, akkor nekem bugos volt (el voltak csuszva az ertekek az idopontokhoz kepest).

Mikor probaltam megoldast talalni, akkor ezereves hibakat taltalm a forumjaikon amirke meg valasz sem erkezett.

Amugy egy csomo supportos kerdesnel mondtak, hogy ezt meg azt mar nem fixaljak es kb az volt az erzesem hogy ami van problema a free verzioban azt leszarjak es a community helyett inkabb az enterprise productot toljak. Ertheto, abbol van a penz. De ilyen hozzallassal inkabb hagytam a francba.

 

A Postgres-t szerintem egy csomo helyre ahova pl NoSQL-t raknak siman jo lenne, mert egy igazi svajci bicska es nagyon sok feature van.

Szerintem ez a helyzet a timeseries adattal is, nem arra lett kitalalva, viszont annyi kiraly fuggvenye van, hogy siman lehet arra is hasznalni.

Mire nekem performance gondjaim lesznek az szerintem meg soka lesz.

Erdekes cucc, koszonom. Mivel az api-ja InfluxDB compliant, ezert meg hasznalni is tudnam.

Valoszinuleg ez kene nekem: https://docs.victoriametrics.com/MetricsQL.html#delta

 

Most ugy nez ki, hogy meg vannak a szukseges query-k Postgres-ben, de ha elakadok es valamit vegkepp nem sikerul megoldanom, akkor kiprobalom.

Annyi, hogy a sajat query-knek megvan az az elonye, hogy muszaj ertenem mi tortenik, de cserebe biztos is lehetek benne, hogy az ertekekek korrektek.

Az ilyen Timeseries DB-knel kicsit blackbox a dolog es tokre lehet, hogy nem is azt az erteket latom a grafikonon amit kene.

https://iotguru.cloud/field/nwsrddMGJAJX4r2w28ER6g/emeter_2_power

Kulisszatitok: én úgy csinálom, hogy egyrészt nem SQL, hanem Cassandra, másrészt van egy tábla, amiben a nyers adatok vannak és van négy tábla, amiben az 5 perces, 60 perces, 3 órás és az egész napos átlagolt adatok vannak és fut id hash alapján adott időpontban 5 percenként olyan job, ami a nyers adatokból átlagolja az 5 perces adatokat, majd az 5 perces adatokból a 60 perces adatokat, a 60 perces adatokból a 3 órás adatokat és a 3 órás adatokból az egész napos adatokat. A megjelenítés pedig ezekből a táblákból megy.

Nincs olyan, hogy nulladik óra, a timeseries egy folyamatos dolog, ha nem csinálsz származtatott segédtáblákat, akkor egy éves range, havi bontás és perces adat esetén fel kell olvasnod mondjuk félmillió adatot, amiből aztán  ki fog jönni 12 hónap adata, ha előre összeraktál egynapos átlagokat, akkor meg csak 365 adatot kell felolvasnod.

Koszi a tippeket.

Gondoltam hogy majd hozzaszolsz, mert mas hasonlo topicokban mar lattam, hogy foglalkozol ezzel... :)

 

Igen a Cassandra, vagy valami hasonlo (mondjuk HBase) DB sokkal jobban illene a problemahoz.

Viszont azokkal annyira nem vagyok kepben es a Postgres mindent is tud, szoval ezzel inditottam.

Szerintem meg messze van az hogy performance gondjaim legyenek, de majd ha odajutok akkor mindenkeppen fontolora veszem hogy az altalad ajanlott mondon a szarmaztatott ertekeket egy view-ba tegyem.

 

A nulladik ora tenyleg ertelmezhetetlen, csak tegnap mar eleg faradt voltam es csak egy adott napban gondolkoztam aminek van kezdete meg vege, de nyilvan ez timeseries adatnal nem ertelmezheto.

 

Most igy nez ki a query ami kiad egy napi felhasznalast orankenti bontasban:

select date_trunc('hour', to_timestamp((ts + (3600 * 1000)) / 1000)) as time,
       MAX(val::numeric) - MIN(val::numeric)                         as value
from ts_string
where id = 2
  and to_timestamp(ts / 1000) > now()::date - interval '1 hour'
  and to_timestamp(ts / 1000) < now()::date + 1 - interval '1 sec'
group by time
order by time;

 

A kovetkezo dolgok tortennek:

- a unix timestampet atkonvertalom Postgres altal is ertelmezheto datumma

- a timestampet eltolom egy oraval. miert? azert mert alapbol a 13:00 es 13:42 min es max deltakat a 13. orahoz lennenek rendelve, de nekem ugy logikus hogy ez mar a 14. ora fogyasztasa (szoljatok ha ez hulyeseg) lasd meg az osszevetest itt: https://drive.google.com/file/d/1xm1xmFC46cxnvmNOURksaP2TieHA7F-5/view?… (ugye a nem eltolt grafikon ertekei eggyel mindig le vannak maradva, de amugy megeggeznek)

- ahogy a where reszben lathato egy adott nap mindig az elozo nap 23:00:00-tol tart a kovetkezo nap 00:00:01-ig

 

A kovetkezo adathalmazra:

2022-05-07 23:06:09.000000 +02:00	4142.35
2022-05-07 23:11:43.000000 +02:00	4142.36
2022-05-07 23:17:16.000000 +02:00	4142.37
2022-05-07 23:22:50.000000 +02:00	4142.38
2022-05-07 23:28:24.000000 +02:00	4142.4
2022-05-07 23:33:58.000000 +02:00	4142.41
2022-05-07 23:39:31.000000 +02:00	4142.42
2022-05-07 23:45:05.000000 +02:00	4142.43
2022-05-07 23:50:39.000000 +02:00	4142.44
2022-05-07 23:56:13.000000 +02:00	4142.45
2022-05-08 00:01:47.000000 +02:00	4142.46
2022-05-08 00:07:21.000000 +02:00	4142.47
2022-05-08 00:12:55.000000 +02:00	4142.52
2022-05-08 00:18:29.000000 +02:00	4142.55
2022-05-08 00:24:02.000000 +02:00	4142.58
2022-05-08 00:29:36.000000 +02:00	4142.6
2022-05-08 00:35:10.000000 +02:00	4142.63
2022-05-08 00:40:44.000000 +02:00	4142.65
2022-05-08 00:46:17.000000 +02:00	4142.69
2022-05-08 00:51:51.000000 +02:00	4142.72
2022-05-08 00:57:25.000000 +02:00	4142.75
2022-05-08 01:02:59.000000 +02:00	4142.82
2022-05-08 01:08:33.000000 +02:00	4142.88
2022-05-08 01:14:07.000000 +02:00	4142.91
2022-05-08 01:19:40.000000 +02:00	4142.93
2022-05-08 01:25:14.000000 +02:00	4142.96
2022-05-08 01:30:48.000000 +02:00	4142.99
2022-05-08 01:36:22.000000 +02:00	4143.02
2022-05-08 01:41:56.000000 +02:00	4143.05
2022-05-08 01:47:30.000000 +02:00	4143.08
2022-05-08 01:53:03.000000 +02:00	4143.11
2022-05-08 01:58:37.000000 +02:00	4143.14
2022-05-08 02:04:11.000000 +02:00	4143.17
2022-05-08 02:09:45.000000 +02:00	4143.2
2022-05-08 02:15:19.000000 +02:00	4143.23
2022-05-08 02:20:53.000000 +02:00	4143.26
2022-05-08 02:26:27.000000 +02:00	4143.28
2022-05-08 02:32:01.000000 +02:00	4143.31
2022-05-08 02:37:34.000000 +02:00	4143.34
2022-05-08 02:43:08.000000 +02:00	4143.37
2022-05-08 02:48:42.000000 +02:00	4143.41
2022-05-08 02:54:16.000000 +02:00	4143.48
2022-05-08 02:59:50.000000 +02:00	4143.51
2022-05-08 03:10:58.000000 +02:00	4143.52
2022-05-08 03:22:05.000000 +02:00	4143.53
2022-05-08 03:27:39.000000 +02:00	4143.54
2022-05-08 03:38:47.000000 +02:00	4143.55
2022-05-08 03:49:55.000000 +02:00	4143.56
2022-05-08 03:55:28.000000 +02:00	4143.57
2022-05-08 04:06:36.000000 +02:00	4143.58
2022-05-08 04:17:44.000000 +02:00	4143.59
2022-05-08 04:23:18.000000 +02:00	4143.6
2022-05-08 04:34:26.000000 +02:00	4143.61
2022-05-08 04:45:34.000000 +02:00	4143.62
2022-05-08 04:51:08.000000 +02:00	4143.63
2022-05-08 05:02:15.000000 +02:00	4143.64
2022-05-08 05:13:23.000000 +02:00	4143.65
2022-05-08 05:24:30.000000 +02:00	4143.66
2022-05-08 05:30:04.000000 +02:00	4143.67
2022-05-08 05:41:12.000000 +02:00	4143.68
2022-05-08 05:52:20.000000 +02:00	4143.69
2022-05-08 05:57:54.000000 +02:00	4143.7
2022-05-08 06:09:01.000000 +02:00	4143.71
2022-05-08 06:20:09.000000 +02:00	4143.72
2022-05-08 06:25:43.000000 +02:00	4143.73
2022-05-08 06:36:50.000000 +02:00	4143.74
2022-05-08 06:47:58.000000 +02:00	4143.75
2022-05-08 06:53:32.000000 +02:00	4143.76
2022-05-08 07:04:40.000000 +02:00	4143.77
2022-05-08 07:15:48.000000 +02:00	4143.78
2022-05-08 07:21:21.000000 +02:00	4143.79
2022-05-08 07:32:29.000000 +02:00	4143.8
2022-05-08 07:38:03.000000 +02:00	4143.82
2022-05-08 07:49:10.000000 +02:00	4143.88
2022-05-08 07:54:44.000000 +02:00	4144.07
2022-05-08 08:00:17.000000 +02:00	4144.26
2022-05-08 08:05:50.000000 +02:00	4144.39
2022-05-08 08:11:24.000000 +02:00	4144.52
2022-05-08 08:16:57.000000 +02:00	4144.64
2022-05-08 08:22:30.000000 +02:00	4144.77
2022-05-08 08:28:04.000000 +02:00	4144.9
2022-05-08 08:33:38.000000 +02:00	4144.91
2022-05-08 08:39:12.000000 +02:00	4144.92
2022-05-08 08:44:46.000000 +02:00	4144.93
2022-05-08 08:50:20.000000 +02:00	4144.94
2022-05-08 08:55:54.000000 +02:00	4144.95
2022-05-08 09:01:28.000000 +02:00	4144.96
2022-05-08 09:07:02.000000 +02:00	4144.97
2022-05-08 09:12:36.000000 +02:00	4144.98
2022-05-08 09:18:10.000000 +02:00	4144.99
2022-05-08 09:23:44.000000 +02:00	4145.01
2022-05-08 09:34:51.000000 +02:00	4145.03
2022-05-08 09:40:25.000000 +02:00	4145.04
2022-05-08 09:45:59.000000 +02:00	4145.05
2022-05-08 09:51:33.000000 +02:00	4145.07
2022-05-08 09:57:07.000000 +02:00	4145.08
2022-05-08 10:02:40.000000 +02:00	4145.1
2022-05-08 10:08:14.000000 +02:00	4145.13
2022-05-08 10:13:48.000000 +02:00	4145.17
2022-05-08 10:19:22.000000 +02:00	4145.2
2022-05-08 10:24:56.000000 +02:00	4145.23
2022-05-08 10:30:30.000000 +02:00	4145.25
2022-05-08 10:36:04.000000 +02:00	4145.28
2022-05-08 10:41:38.000000 +02:00	4145.31
2022-05-08 10:47:11.000000 +02:00	4145.34
2022-05-08 10:52:45.000000 +02:00	4145.37
2022-05-08 10:58:19.000000 +02:00	4145.4
2022-05-08 11:03:52.000000 +02:00	4145.43
2022-05-08 11:09:26.000000 +02:00	4145.45
2022-05-08 11:15:00.000000 +02:00	4145.48
2022-05-08 11:20:34.000000 +02:00	4145.5
2022-05-08 11:26:08.000000 +02:00	4145.53
2022-05-08 11:31:42.000000 +02:00	4145.55
2022-05-08 11:37:15.000000 +02:00	4145.63
2022-05-08 11:42:49.000000 +02:00	4145.82
2022-05-08 11:48:22.000000 +02:00	4146.03
2022-05-08 11:53:56.000000 +02:00	4146.26
2022-05-08 11:59:29.000000 +02:00	4146.35
2022-05-08 12:10:37.000000 +02:00	4146.36
2022-05-08 12:16:11.000000 +02:00	4146.37
2022-05-08 12:21:45.000000 +02:00	4146.38
2022-05-08 12:32:53.000000 +02:00	4146.39
2022-05-08 12:38:27.000000 +02:00	4146.4
2022-05-08 12:49:35.000000 +02:00	4146.41
2022-05-08 13:00:43.000000 +02:00	4146.42
2022-05-08 13:06:17.000000 +02:00	4146.43
2022-05-08 13:17:25.000000 +02:00	4146.44
2022-05-08 13:45:12.000000 +02:00	4146.45

 

Ezeket a deltakat kapom:

2022-05-08 00:00:00.000000 +02:00	0.1
2022-05-08 01:00:00.000000 +02:00	0.29
2022-05-08 02:00:00.000000 +02:00	0.32
2022-05-08 03:00:00.000000 +02:00	0.34
2022-05-08 04:00:00.000000 +02:00	0.05
2022-05-08 05:00:00.000000 +02:00	0.05
2022-05-08 06:00:00.000000 +02:00	0.06
2022-05-08 07:00:00.000000 +02:00	0.05
2022-05-08 08:00:00.000000 +02:00	0.3
2022-05-08 09:00:00.000000 +02:00	0.69
2022-05-08 10:00:00.000000 +02:00	0.12
2022-05-08 11:00:00.000000 +02:00	0.3
2022-05-08 12:00:00.000000 +02:00	0.92
2022-05-08 13:00:00.000000 +02:00	0.05
2022-05-08 14:00:00.000000 +02:00	0.03

 

Ha valaki esetleg levalidalna nekem, hogy ez a logika igy helyes-e azt nagyon megkoszonnem!

Annyit javasolnék, hogy a ts az timestamp legyen, ne bigint, illetve használd a generate_series függvényt, ha dátum és dátum között akarsz interval műveleteket csinálni. Sokat egyszerűsít a dolgodon.

Amúgy jónak tűnik, de azzal is tudnád egyszerűsíteni a dolgod, ha a letárolásnál deltát tárolnál le.

Az adattipust nem en valasztom, hanem egy ioBroker nevu cuccnak a smartmeter pluginja adja ki ezt magabol.

Az egesz mericskeles meg csak most indult, orulok, hogy legalabb a kick off megvan, de majd fontolra veszem a delta tarolast is.

 

Erdekessegkent emiletem meg, hogy egyebkent ket mero van, az egyik a hoszivattyuhoz tartozik, a masik pedig minden mashoz.

Sajnos az altalanos ora az annyira nem tolja az adatot (nincsenek tizedesek), hogy nem is nagyon lehet a napi bontast plotolni.

Ez pl a mai nap termese:

2022-05-08 03:59:44.000000 +02:00	1670
2022-05-08 08:25:37.000000 +02:00	1671
2022-05-08 09:25:49.000000 +02:00	1672
2022-05-08 10:51:07.000000 +02:00	1673
2022-05-08 11:11:11.000000 +02:00	1674
2022-05-08 15:01:57.000000 +02:00	1675
2022-05-08 20:33:03.000000 +02:00	1676

 

Ezert erre azt talaltam ki, hogy 3 orara veszem az idointervallumokat es ugy probalok deltakat szamolni, annak a selectje igy nez ki:

SELECT date_trunc('day', to_timestamp(ts / 1000)) +
       date_part('hour', to_timestamp(ts / 1000))::int / 3 * interval '3 hour' + interval '3 hour' as time,
       MAX(val) - MIN(val)                                                                         as value
from ts_number
where id = 3
  and to_timestamp(ts / 1000) > now()::date - interval '1 hour'
  and to_timestamp(ts / 1000) < now()::date + 1 - interval '1 sec'
GROUP BY time
ORDER BY time

 

es ez az ami kijon belole:

2022-05-08 06:00:00.000000 +02:00	0
2022-05-08 09:00:00.000000 +02:00	0
2022-05-08 12:00:00.000000 +02:00	2
2022-05-08 18:00:00.000000 +02:00	0
2022-05-08 21:00:00.000000 +02:00	0

 

Hat sokkal okosabb nem leszek tole, de hatha majd ha elkezdem tolteni az autot is, akkor gyakrabban kapok adatot (mert ugye csak akkor van uj adat a db-ben ha valtozas tortenik).

Tobbet kell fogyasztanom, hogy szep legyen a grafikon. :D

Ahogy elneztem a te megoldasod, neked ki van irva az atlag fogyasztas egy oraban, tehat az adott ora osszes datapointjanak az atlaga, illetve az adott ora ?legnagyobb es legkisebb mert erteke?.

Miert igy van megcsinalva? Nekem ez igy azert furcsa, mert ez nem mutatja az adott oraban a tenylegesen felvett aram mennyiseget, "csak" azt hogy atlagosan mennyit fogyasztottal.

 

Szerk.: Nem osszegyujteni nehez az adatot hanem ertelmezni. :D

Nekem ez igy azert furcsa, mert ez nem mutatja az adott oraban a tenylegesen felvett aram mennyiseget, "csak" azt hogy atlagosan mennyit fogyasztottal.

Ennek a mondatnak nincs értelme. Ha az adott órában volt egy 1000 wattos fogyasztóm végig bekapcsolva, akkor arra az órára az átlag fogyasztás 1000 watt, 1 kWh. Ha volt egy 2000 wattos fogyasztóm, 30 percig ment és 30 percig nem ment, akkor a minimum fogyasztás 0 watt, a maximum fogyasztás 2000 watt, az átlag fogyasztás pedig 1000 watt, ugyanúgy 1 kWh. Ha óránként átlagolsz, akkor tulajdonképpen megkapod óránként a fogyasztást kWh mértékegységben.

Igen, a peldad utan nyilvanvalova valt szamomra is, hogy hulyeseget beszelek.

Valamiert az en fejemben az volt, hogy ha egy fogyaszto 30 percig 1000 wattot vesz fel es utana megint 30 percig 2000 wattot, akkor az egy ora alatt felvett mennyiseg 3000 watt, azaz 3 kWh lesz.

Ezzel szemben az atlag pedig "csak" (1000 + 2000) / 2 = 1500 watt azaz 1,5 kWh. Megegyszer atgondolva mar vilagos, hogy a 1,5 kWh a helyes es nem pedig a 3 kWh.

 

Valoszinuleg kozepiskolas fizika es annak is valahol az eleje lehet...

Hat szegyen, nem szegyen, de eleg reg volt mar es azota nem is nagyon foglalkoztam a temaval. Szoval beneztem.

De legalabb helyre kerultek a fejemben a dolgok.

 

Egyebkent ez nekem a szamitasnal nem relevans, mert nem az adott idopillanatban atfolyo aramot kapom meg a merotol, hanem az ora allasat.

Ezert kell szimplan a max - min delta, de azert nem art tisztaban lenni azzal, hogy mik is azok a szamok a grafikonon.... :D

A letarolast "nem en vegzem", hanem az ioBroker smartmeter pluginja, max valami stored procedure-t tudnek ra letrehozni, de akkor annyi tortenne, hogy a buveszkedes atvandorolna a selectbol oda.

Esetleg annyi hasznom lenne, hogy az adat szebben/tisztabban nezne ki a szarmaztatott tablaban.

Valamiert az en fejemben az volt, hogy ha egy fogyaszto 30 percig 1000 wattot vesz fel es utana megint 30 percig 2000 wattot, akkor az egy ora alatt felvett mennyiseg 3000 watt, azaz 3 kWh lesz.

Kevered a teljesítmény és az energia mennyiségeit. Ha 1000 watt teljesítménnyel működik valami 30 percig, akkor 500 Wh energiát vesz fel. Ha azt akarod mondani, hogy 1000Wh energiát vett fel 30 perc alatt, akkor a teljesítménye 2000 watt volt. 

Hasonlóan, 30 perc alatt 2000 watt teljesítménnyel 1000 Wh energiát lehet felvenni, de 30 perc alatt 2000 Wh energiát felvenni 4000 watt teljesítménnyel lehet. A 4000 W és 2000 W átlaga valóban 3000 W, de ennek a példádban semmi fizikai jelentése nincs. A watt az időegysége jutó energia (teljesítmény), a Wh az meg energiamennyiség. Olyan nincs, hogy "egy óra alatt felvett mennyiség 3000 W", ez fizikailag értelmetlen.

Tisztázd magadban a teljesítmény és energia fogalmakat, és akkor rendben leszel, tudni fogod, hogy mit hogyan számoljál. Haladsz efelé, hajrá.

Igaz, postgresql-ből nem tud dolgozni, csak saját adatbázisból, de amit te akarsz azt az RRDTOOLS elég jól megcsinálja, mer pontosan erre találták ki.

Én a hasonló motyókat elasticban tárolom. Nem pont erre találták ki de elég jó.

Nem szórakozok a "ritkítással" sem, érdektelen amennyi diszket fogyaszt.

Mivel a sok írásra nagyon kevés olvasás jut ezért nem nagyon éri meg aggregálni se. Az utolsó nap kb. úgyis RAM-ban van, azt meg gyorsan összekapja bármilyen grafikon kell.

Sokat lehetne még optimalizálni az egészen, pár éve gyűlik benne a cucc, egyszer majd jó lesz elszórakozni vele.
 

Gábriel Ákos

Nem kell neked semmit számolnod.

Tedd le a nyers adatokat DB-be, igen, Influx lenne a legjobb, de a Grafana sok data source-t támogat.

A nézeteket, aggregációkat, ilyen-olyan bontásokat meg bízd a Grafanára.