
I am always surprised every time I receive the bill for electricity and water â does my family really consume that much? Well, yes, there is a heated floor and a boiler in the bathroom, but they don't run constantly. We also seem to save water (although we do enjoy splashing around in the bath). A few years ago, I already ja to the smart home system, but thatâs where the progress stopped. I only got around to analyzing consumption now, which is what this article is about.
Recently, I switched to Home Assistant as my smart home system. One of the reasons was precisely the opportunity to collect a large amount of data with the ability to conveniently create various types of graphs.
The information described in this article is not new; all these things have already been discussed on the Internet under different guises. However, each article usually focuses on just one approach or aspect. It was up to me to compare all these approaches and choose the most suitable one. The article still doesnât provide exhaustive information on data collection, but serves as a kind of summary of how I did it. So constructive criticism and suggestions for improvement are welcome.
Ălesande seadmine
So, the purpose of todayâs exercise is to get nice graphs of water and electricity consumption:
- Hourly for 2 days
- Daily for 2 weeks
- (optionally) weekly and monthly
We face some difficulties in this:
- The standard graph components are usually quite poor. At best, you can create a line graph from points.
If you search well, you can find third-party components that extend the capabilities of the standard graph. For Home Assistant, the component is relatively good and attractive, but it is also somewhat limited:
- It's challenging to set parameters for a bar graph over large intervals (the width of the bars is set in fractions of an hour, meaning intervals longer than an hour will be set in decimal numbers)
- You cannot add different entities to one graph (for example, temperature and humidity, or combine a bar graph with a line)
- Lisaks sellele, et home assistant kasutab vaikimisi kÔige primitiivsemat andmebaasi SQLite (ja mina, oskamatu, ei suutnud MySQL vÔi Postgresit installida), on andmed salvestatud ka mitte kÔige optimaalsemalt. NÀiteks iga vÀikese digitaalse parameetri muutmise korral salvestatakse andmebaasi hiiglaslik json, mille suurus on umbes kilobait.
{"entity_id": "sensor.water_cold_hourly", "old_state": {"entity_id": "sensor.water_cold_hourly", "state": "3", "attributes": {"source": "sensor.water_meter_cold", "status": "collecting", "last_period": "29", "last_reset": "2020-02-23T21:00:00.022246+02:00", "meter_period": "hourly", "unit_of_measurement": "l", "friendly_name": "water_cold_hourly", "icon": "mdi:counter"}, "last_changed": "2020-02-23T19:05:06.897604+00:00", "last_updated": "2020-02-23T19:05:06.897604+00:00", "context": {"id": "aafc8ca305ba4e49ad4c97f0eddd8893", "parent_id": null, "user_id": null}}, "new_state": {"entity_id": "sensor.water_cold_hourly", "state": "4", "attributes": {"source": "sensor.water_meter_cold", "status": "collecting", "last_period": "29", "last_reset": "2020-02-23T21:00:00.022246+02:00", "meter_period": "hourly", "unit_of_measurement": "l", "friendly_name": "water_cold_hourly", "icon": "mdi:counter"}, "last_changed": "2020-02-23T19:11:11.251545+00:00", "last_updated": "2020-02-23T19:11:11.251545+00:00", "context": {"id": "0de64b8af6f14bb9a419dcf3b200ef56", "parent_id": null, "user_id": null}}}Mul on ĂŒsna palju andureid (temperatuuriandurid igas toas, vee- ja elektri arvestid), ning mĂ”ned neist genereerivad ka piisavalt palju andmeid. NĂ€iteks vaid elektriarvesti SDM220 genereerib umbes kĂŒmme vÀÀrtust iga 10-15 sekundi tagant, ja ma soovin paigaldada selliseid arvesti umbes 8. Lisaks on terve partii parameetreid, mis arvutatakse teiste andurite pĂ”hjal. Seega vĂ”ivad kĂ”ik need vÀÀrtused kergesti muuta andmebaasi 100-200 MB vĂ”rra iga pĂ€ev. NĂ€dala pĂ€rast hakkab sĂŒsteem vaevalt töötama ja kuu aja pĂ€rast sureb mĂ€lupulk (tĂŒĂŒpilise home assistant paigaldamise korral Raspberry PI-l), rÀÀkimata andmete sĂ€ilitamisest aasta jooksul.
- Kui sul on vedanud, siis su arvesti oskab ise seda tarbimist lugeda. Sa saad igal hetkel pöörduda arvesti poole ja kĂŒsida, mis kell on akumuleeritud tarbimise vÀÀrtus. Ăldjuhul pakuvad kĂ”ik elektriarvestid, millel on digitaalne liidese (RS232/RS485/Modbus/Zigbee), sellist vĂ”imalust.
Halvem, kui seade suudab lihtsalt mÔÔta mĂ”ningast kohest parameetrit (nĂ€iteks kohest vĂ”imsust vĂ”i voolu) vĂ”i lihtsalt genereerida impulsse iga X vatundi vĂ”i liitri jĂ€rel. Siis tuleb mĂ”elda, kuidas ja millega seda integreerida ning kus vÀÀrtust koguda. On oht, et mĂ”ni aruanne jÀÀb ikka vahele mingil pĂ”hjusel ja sĂŒsteemi tĂ€psuse ĂŒle on kĂŒsimusi. Muidugi vĂ”ib kogu selle ĂŒlesande usaldada nutika kodu sĂŒsteemile nagu home assistant, kuid andmebaasi salvestuste hulk on ĂŒks asi, mis kedagi ei vabasta, ja andurite kĂŒsitlemine sagedamini kui kord sekundis ei Ă”nnestu (home assistanti arhitektuurist tingitud piirang).
LĂ€henemine 1
KĂ€ivitusel vaatame, mida home assistant pakub. Tarbimise mÔÔtmine perioodil on ĂŒsna nĂ”utud funktsionaalsus. Kindlasti on see juba ammu realiseeritud spetsialiseeritud komponendina - utility_meter.
Komponendi pÔhimÔte on selles, et see loob sees tekundi muutuja tekkinud_akkumuleeritud_vÀÀrtus, ja nullib selle mÀÀratud perioodi (tund/nÀdal/kuu) lÔppedes. Komponent jÀlgib ise sisenevat muutujat (mÔne anduri vÀÀrtust), kirjutab end ise vÀÀrtuse muutustele alla - te saate lihtsalt valmis tulemuse. Selle kirjeldamine nÔuab vaid mÔnda rida konfiguratsioonifailis.
utility_meter:
water_cold_hour_um:
source: sensor.water_meter_cold
cycle: hourly
water_cold_day_um:
source: sensor.water_meter_cold
cycle: daily
Siin on sensor.water_meter_cold praegune vÀÀrtus mÔÔturis liitrites, mille ma olen saanud mqtt kaudu. Konstruktsioon loob 2 uut andurit water_cold_hour_um ja water_cold_day_um, mis koguvad tunni- ja pÀevaseid nÀitajaid, nullides need perioodi lÔppedes. Siin on graafik tunni akumulaatori poolest pÀevast.

Tunni- ja pÀevagraafiku kood lovelace-UI jaoks nÀeb vÀlja selline:
- type: history-graph
title: 'Tunni veetarbimine varside kasutamisega'
hours_to_show: 48
entities:
- sensor.water_hour
- type: history-graph
title: 'PĂ€evane veetarbimine varside kasutamisega'
hours_to_show: 360
entities:
- sensor.water_day
Tegelikult on selle algoritmi probleem just selles. Nagu ma juba mainisin, genereeritakse iga sisendi vÀÀrtuse (praegune arvesti nĂ€it kwh kohta) jaoks andmebaasi 1 kB kirje. Iga utiliidi arvesti genereerib samuti uue vÀÀrtuse, mis ka salvestatakse andmebaasi. Kui ma tahan koguda tunniseid/pĂ€evaste/nĂ€dalaste/kuuliste nĂ€ite, ja lisaks veel mitmeid veesĂŒsteeme ning hunniku elektriarvestit, siis andmeid tuleb vĂ€ga palju. TĂ”enĂ€oliselt ei ole need andmed nii tĂ”sised, aga kuna kodu assistent salvestab andmebaasi palju ĂŒleliigset teavet, siis andmebaasi suurus kasvab nagu pĂ€rmitaigen. Kardan isegi nende nĂ€dalaste ja kuiste graafikute andmebaasi suurust hinnata.
Lisaks ei lahenda utiliidi arvesti iseenesest seatud ĂŒlesannet. Arvesti, mille vÀÀrtused genereerib utiliidi arvesti, on monotoonselt kasvav funktsioon, mis nullitakse igal tunnil. Meile on vajalik kasutajale arusaadav tarbimise graafik, nĂ€idates, kui palju liitreid on perioodi jooksul tarbitud. Standardne koostisosa ajaloograaf ei oska seda teha, kuid abi saab vĂ€lisest komponendist mini-graph-card.
See on lovelace-UI kaartide kood:
- aggregate_func: max
entities:
- color: var(--primary-color)
entity: sensor.water_cold_hour_um
group_by: hour
hours_to_show: 48
name: "Tunnine veetarbimise kokkuvÔte utiliidi arvesti jÀrgi"
points_per_hour: 1
show:
graph: bar
type: 'custom:mini-graph-card'Lisaks standardsetele seadistustele, nagu sensori nimi, graafiku tĂŒĂŒp, vĂ€rv (tavaline oranĆŸ ei meeldinud), on oluline mĂ€rkida kolm seadistust:
- group_by: hour â graafik genereeritakse, ritta seades tĂŒkid tunni alguse jĂ€rgi
- points_per_hour: 1 â ĂŒks tĂŒkike igal tunnil
- Ja kĂ”ige olulisem, aggregate_func: max â vĂ”tta iga tunni jooksul maksimaalne vÀÀrtus. Just see parameeter muudab saagide graafiku tĂŒkikesteks.

Vasakpoolsete tĂŒkikeste rida Ă€rge tĂ€helepanu pöörake â see on komponendi standardne kĂ€itumine, kui andmeid ei ole. Ja andmeid tĂ”epoolest ei olnud â lĂŒlitasin andmete kogumise utiliidi arvesti jĂ€rgi sisse vaid paar tundi tagasi ainult selle artikli jaoks (oma praegusest lĂ€henemisest rÀÀgin veidi hiljem).
Selle pildil tahtsin nĂ€idata, et mĂ”nikord andmete kuvamine isegi töötab ja veergud peegeldavad tĂ”epoolest Ă”igeid vÀÀrtusi. Ainult et need ei ole kaugeltki kĂ”ik Ă”iged. Toodud veerg ajavahemiku 11 kuni 12 hommikul nĂ€itab mingil pĂ”hjusel 19 liitrit, kuigi hambuline graafik veidi kĂ”rgemal nĂ€itab sama perioodi jooksul sama sensoriga tarbimist 62 liitrit. Kas tegemist on veaga vĂ”i on tegu halva töötlusega. Ja miks andmed paremal pool kadusid, ei ole ma veel aru saanud â seal oli tarbimine normaalne, mis on samuti nĂ€htav hambulisel graafikul.
ĂhesĂ”naga, selle lĂ€henemise usutavust mulle saavutada ei Ă”nnestunud â graafik nĂ€itab peaaegu alati mingit jama.
Sarnane kood pÀevaksensorile.
- aggregate_func: max
entities:
- color: var(--primary-color)
entity: sensor.water_cold_day_um
group_by: interval
hours_to_show: 360
name: "PÀevane veetarbimine utiliidimÔÔtjate kaupa"
points_per_hour: 0.0416666666
show:
graph: bar
type: 'custom:mini-graph-card'
Pange tĂ€hele, et parameeter group_by on seadistatud vÀÀrtusele interval ja kĂ”ik punktid per tund sĂ”ltuvad sellest. Ja selles peitub veel ĂŒks selle komponendi probleem â points_per_hour töötab hĂ€sti graafikute puhul, mis on ĂŒhe tunni vĂ”i vĂ€hem, kuid on kohutav pikemate ajavahemike korral. Nii tuli ĂŒhe pĂ€eva jaoks saada ĂŒks veerg, peab sisestama vÀÀrtuse 1/24=0.04166666. Ma ei rÀÀgi isegi nĂ€dalaste ja igakuiste graafikute kohta.
LĂ€htekoht 2
Veel olles kodu assistendi kallal uurimas, sattusin sellele videole:

SĂ”ber kogub andmeid tarbimise kohta mitmest erinevast Xiaomi pistikust. Tema ĂŒlesanne on veidi lihtsam â lihtsalt kuvada tarbimise vÀÀrtus tĂ€na, eile ja kuu jooksul. Graafikuid pole vaja.
JĂ€tame kĂ”rvale arutlused kĂ€sitsi integreerimise kohta hetketegevuse vÀÀrtustest â olen juba eespool kirjutanud sellise lĂ€henemise "tĂ€psusest". Pole selge, miks ta ei kasutanud akumuleeritud tarbimisandmeid, mis juba samalt pistikult kogutakse. Minu arvates töötab integreerimine seadmest paremini.
Videost vÔtame idee kÀsitsi tarbimise arvestamise perioodi jooksul. Mehe puhul arvestatakse ainult tÀna ja eile, kuid meie lÀheme kaugemale ja proovime joonistada graafiku. Esitatud meetodi olemus minu juhul on jÀrgmine.
Loome muutuja vÀÀrtus_alguses_tunnis, kuhu salvestame praegused arvesti nÀidud.
Iga tunni lĂ”pus (vĂ”i jĂ€rgmise tunni alguses) arvutame praeguse nĂ€idu ja tunni alguses salvestatud nĂ€idu vahelise erinevuse. See erinevus on praeguse tunni tarbimine â salvestame vÀÀrtuse sensorisse ja tulevikus kasutame seda vÀÀrtust graafiku koostamiseks.
Samuti tuleb "nullida" muutuja vÀÀrtus_alguses_tundi, kirjutades sinna praeguse arvesti vÀÀrtuse.
KÔike seda saab teha lÀbi home assistant'i enda vahendite.
Koodi tuleb kirjutada natuke rohkem kui eelmises lĂ€henemises. Alustuseks loome need "muutujad". Meil ei ole vaikimisi olemas "muutuja" olemasolu, kuid saame kasutada mqtt vahendajat. Saame sinna saata vÀÀrtuseid retain=true lipuga â see salvestab vÀÀrtuse vahendajas ja selle saab igal ajal sealt kĂ€tte, isegi home assistant'i taaskĂ€ivitamisel. Tehtud on kohe tunni ja pĂ€evased arvestid.
- platform: mqtt
state_topic: "test/water/hour"
name: water_hour
unit_of_measurement: l
- platform: mqtt
state_topic: "test/water/hour_begin"
name: water_hour_begin
unit_of_measurement: l
- platform: mqtt
state_topic: "test/water/day"
name: water_day
unit_of_measurement: l
- platform: mqtt
state_topic: "test/water/day_begin"
name: water_day_begin
unit_of_measurement: lKogu maagia toimub automaatikas, mis kÀivitub iga tunni ja iga öö jooksul vastavalt.
- id: water_new_hour
alias: water_new_hour
initial_state: true
trigger:
- platform: time_pattern
minutes: 0
action:
- service: mqtt.publish
data:
topic: "test/water/hour"
payload_template: >
{{ (states.sensor.water_meter_cold.state|int) - (states.sensor.water_hour_begin.state|int) }}
retain: true
- service: mqtt.publish
data:
topic: "test/water/hour_begin"
payload_template: >
{{ states.sensor.water_meter_cold.state }}
retain: true
- id: water_new_day
alias: water_new_day
initial_state: true
trigger:
- platform: time
at: "00:00:00"
action:
- service: mqtt.publish
data:
topic: "test/water/day"
payload_template: >
{{ (states.sensor.water_meter_cold.state|int) - (states.sensor.water_day_begin.state|int) }}
retain: true
- service: mqtt.publish
data:
topic: "test/water/day_begin"
payload_template: >
{{ states.sensor.water_meter_cold.state }}
retain: trueMÔlemad automaatikad tÀidavad 2 toimingut:
- Arvutavad intervalli vÀÀrtuse alg- ja lÔppvÀÀrtuse vahe.
- Uuendavad baasvÀÀrtuse jÀrgmiseks intervalliks.
Graafikute koostamine lahendatakse antud juhul tavalise history-graphiga:
- type: history-graph
title: 'Tunni veetarbimine varside kasutamisega'
hours_to_show: 48
entities:
- sensor.water_hour
- type: history-graph
title: 'PĂ€evane veetarbimine varside kasutamisega'
hours_to_show: 360
entities:
- sensor.water_daySee nÀeb vÀlja nii:

PĂ”himĂ”tteliselt on see juba see, mida on vaja. Selle meetodi plussiks on see, et andmeid genereeritakse ĂŒks kord intervalli jooksul. St, pĂ€eva jooksul ainult 24 salvestust tunnigraafiku jaoks.
Kahjuks ei lahenda see liikvele paisuva baasi ĂŒldprobleemi. Kui ma soovin kuupĂ”hist tarbimist, tuleb mul andmeid hoida vĂ€hemalt aasta. Ja kuna home assistant pakub ainult ĂŒhte salvestusaja seadet kogu andmebaasi jaoks, tĂ€hendab see, et KĂIK andmed sĂŒsteemis tuleb hoida terve aasta. NĂ€iteks tarbin ma aastas 200 kuupmeetrit vett, mis tĂ€hendab 200000 kirjet andmebaasis. Ja kui arvestada ka muid sensoreid, muutub number ÀÀrmiselt suureks.
LĂ€henemine 3
Ănneks on nutikad inimesed selle probleemi juba lahendanud, kirjutades andmebaasi InfluxDB. See andmebaas on spetsiaalselt optimeeritud ajapĂ”histe andmete salvestamiseks ja sobib ideaalselt erinevate sensorite vÀÀrtuste hoidmiseks. SĂŒsteem pakub ka SQL-sarnast pĂ€ringukeelt, mis vĂ”imaldab andmebaasist vÀÀrtusi vĂ€lja kaevata ja seejĂ€rel neid erinevatel viisidel kokku koondada. LĂ”puks on erinevaid andmeid vĂ”imalik hoida erinevat aega. NĂ€iteks kiiresti muutuvaid nĂ€itajaid, nagu temperatuur vĂ”i niiskus, vĂ”ib hoida vaid paar nĂ€dalat, samas kui pĂ€evaseid veetarbimise nĂ€itajaid vĂ”ib hoida terve aasta.
Peale InfluxDB on nutikad inimesed leiutanud ka Grafana â sĂŒsteemi, mis joonistab graafikuid InfluxDB andmete pĂ”hjal. Grafana oskab joonistada erinevat tĂŒĂŒpi graafikuid, neid detailselt kohandada ja, mis kĂ”ige tĂ€htsam, neid graafikuid saab "paigaldada" home assistant'i lovelace-UI-le.
Inspireerib ja . Artiklites on detailselt kirjeldatud InfluxDB ja Grafana paigaldamise ja ĂŒhendamise protsessi home assistant'iga. Ma keskendun enda konkreetse ĂŒlesande lahendamisele.
Nii et alustame kohe, hoides arvesti vÀÀrtust influxDB-s. Home assistant'i konfiguratsiooni lĂ”ik (selles nĂ€ites ka mĂ€ngin mitte ainult kĂŒlma vaid ka sooja veega):
influxdb:
host: localhost
max_retries: 3
default_measurement: state
database: homeassistant
include:
entities:
- sensor.water_meter_hot
- sensor.water_meter_coldKĂ€tkeme nende samade andmete salvestamist home assistant'i sisemisse andmebaasi, et mitte seda liigse koormuse alla suruda:
recorder:
purge_keep_days: 10
purge_interval: 1
exclude:
entities:
- sensor.water_meter_hot
- sensor.water_meter_coldLĂ€hme nĂŒĂŒd InfluxDB konsooli ja seadistame meie andmebaasi. Eriti tuleb seadistada, kui kaua hoitakse erinevaid andmeid. Seda reguleerib nn retention policy â see on sarnane andmebaasidele pĂ”hjaandmebaasis, kus igal sisseehitatud andmebaasil on oma seadistused. Vaikimisi salvestatakse kĂ”ik andmed retention policy all nimega autogen, need andmed hoitakse nĂ€dala. Tahaksin, et tunnipĂ”hised andmed hoitaks kuu aega, nĂ€dalased â aasta, ja kuupĂ”hised andmed ei eemaldataks kunagi. Loome vastavad retention policy.
CREATE RETENTION POLICY "month" ON "homeassistant" DURATION 30d REPLICATION 1
CREATE RETENTION POLICY "year" ON "homeassistant" DURATION 52w REPLICATION 1
CREATE RETENTION POLICY "infinite" ON "homeassistant" DURATION INF REPLICATION 1NĂŒĂŒd, tegelikult, peamine trikk â andmete agregatsioon continuous query kaudu. See on mehhanism, mis automaatselt kĂ€ivitab pĂ€ringu teatud ajavahemike jĂ€rel, agregatsiooni tulemuse salvestab uutesse vÀÀrtustesse. Vaatame nĂ€idet (kirjutan vertikaalselt, et oleks lihtsam lugeda, kuid tegelikult pidin selle kĂ€su sisestama ĂŒhel real).
CREATE CONTINUOUS QUERY cq_water_hourly ON homeassistant
BEGIN
SELECT max(value) AS value
INTO homeassistant.month.water_meter_hour
FROM homeassistant.autogen.l
GROUP BY time(1h), entity_id fill(previous)
ENDSee kÀsk:
- Loob continuous query nimega cq_water_cold_hourly andmebaasis homeassistant.
- PÀringut teostatakse iga tunni jÀrel (time(1h)).
- PĂ€ring kogub kĂ”ik andmed mÔÔtmisest homeassistant.autogen.l (liitrid), sealhulgas kĂŒlma ja sooja vee nĂ€idud.
- Agregatsiooni tulemused grupeeritakse entity_id jĂ€rgi, mis loob meile eraldi vÀÀrtused kĂŒlma ja sooja vee jaoks.
- Kuna liitrite arvesti on monotoonselt kasvav jÀrjestus, tuleb igas tunnis vÔtta maksimaalne vÀÀrtus, seetÔttu teostatakse agregatsioon max(value) funktsiooni abil.
- Uus vÀÀrtus salvestatakse homeassistant.month.water_meter_hour, kus month on retention policy nimi, mille sĂ€ilitamise aeg on kuu. KĂŒlma ja sooja vee andmed jaotatakse eraldi kirjetesse koos vastava entity_id ja vÀÀrtusega vĂ€ljades.
Ăösel vĂ”i kui kedagi kodus ei ole, pole veetarbimist ja seetĂ”ttu pole uusi kirjeid homeassistant.autogen.l-is samuti. Olgugi, et tavalistes pĂ€ringutes pole vÀÀrtuste puudumise vĂ€ltimiseks soovitatav kasutada fill(previous). See paneb InfluxDB kasutama eelneva tunni vÀÀrtust.
Kahjuks on continuous query'l ĂŒks omadus: trick fill(previous) ei toimi ja kirjed lihtsalt ei genereerita. See on mingi ĂŒletamatu probleem, mida . Selle probleemiga tegeleme hiljem, seesama fill(previous) continuous query's vĂ”ib jÀÀda, see ei sega.
Kontrollime, mis vÀlja tuli (loomulikult tuleb oodata paar tundi):
> select * from homeassistant.month.water_meter_hour group by entity_id
...
name: water_meter_hour
tags: entity_id=water_meter_cold
time value
---- -----
...
2020-03-08T01:00:00Z 370511
2020-03-08T02:00:00Z 370513
2020-03-08T05:00:00Z 370527
2020-03-08T06:00:00Z 370605
2020-03-08T07:00:00Z 370635
2020-03-08T08:00:00Z 370699
2020-03-08T09:00:00Z 370761
2020-03-08T10:00:00Z 370767
2020-03-08T11:00:00Z 370810
2020-03-08T12:00:00Z 370818
2020-03-08T13:00:00Z 370827
2020-03-08T14:00:00Z 370849
2020-03-08T15:00:00Z 370921
Pange tĂ€hele, et andmed salvestatakse andmebaasis UTC ajas, seega erinevad need selles nimekirjas 3 tunni vĂ”rra â kell 7 hommikul InfluxDB vĂ€ljundis vastavad vÀÀrtused 10 hommikul ĂŒlaltoodud graafikutes. Samuti pange tĂ€hele, et kell 2 ja 5 hommikul pole kirjeid â see on see sama omadus continuous query's.
Nagu nĂ€ete, on agrgeeritud vÀÀrtus samuti monotoonselt kasvav jada, ainult et kirjed tulevad harvem â kord tunnis. Kuid see ei ole probleem â saame kirjutada veel ĂŒhe pĂ€ringu, mis toob graafiku jaoks Ă”iged andmed.
SELECT difference(max(value))
FROM homeassistant.month.water_meter_hour
WHERE entity_id='water_meter_cold' and time >= now() -24h
GROUP BY time(1h), entity_id
fill(previous)Selgitan:
- Andmebaasist homeassistant.month.water_meter_hour tÔmbame vÀlja andmed entity_id='water_meter_cold' kohta viimase 24 tunni jooksul (time >= now() -24h).
- Nagu varem mainisin, vÔivad homeassistant.month.water_meter_hour jadas puududa mÔned kirjed. Need andmed genereerime uuesti, kÀivitades pÀringu GROUP BY time(1h). Seekord töötab fill(previous) nagu peab, genereerides puuduvad andmed (funktsioon vÔtab eelneva vÀÀrtuse)
- Selle pÀringu kÔige olulisem osa on funktsioon difference, mis arvutab erinevuse tunni mÀrkmete vahel. Ise ei tööta ta ja vajab agregatsiooni funktsiooni. Olgu selleks max(), mida oleme varem kasutanud.
TÀidise tulemus nÀeb vÀlja selline
name: water_meter_hour
tags: entity_id=water_meter_cold
time difference
---- ----------
...
2020-03-08T02:00:00Z 2
2020-03-08T03:00:00Z 0
2020-03-08T04:00:00Z 0
2020-03-08T05:00:00Z 14
2020-03-08T06:00:00Z 78
2020-03-08T07:00:00Z 30
2020-03-08T08:00:00Z 64
2020-03-08T09:00:00Z 62
2020-03-08T10:00:00Z 6
2020-03-08T11:00:00Z 43
2020-03-08T12:00:00Z 8
2020-03-08T13:00:00Z 9
2020-03-08T14:00:00Z 22
2020-03-08T15:00:00Z 72Kell 2 kuni 5 hommikul (UTC) tarbimist ei olnud. Siiski tagastab pÀring sama tarbimise vÀÀrtuse tÀnu fill(previous) funktsiooni kasutamisele, ja funktsioon difference lahutab selle vÀÀrtuse iseendast, saades lÔpuks 0, mis ongi vajalik.
JÀÀnud on vaid vĂ€ike asi â ehitada graafik. Selleks avame Grafana, avame mĂ”ne olemasoleva (vĂ”i loome uue) armatuurlauad, loome uue paneeli. Graafiku seadistused on jĂ€rgmised.

Kannan esitlema andmeid kĂŒlma ja kuuma vee kohta ĂŒhel graafikul. PĂ€ring on tĂ€pselt selline nagu ma ĂŒlal kirjeldasin.
Kuva seadistused mÀÀratakse nii. Mul on see graafik joontega (lines), mis lÀheb astmetena (stairs). Parameetrit Stack selgitan veidi allpool. Seal on veel mÔned kuvamise parameetrid, kuid need pole nii huvitavad.

Et lisada saadud graafik home assistentisse, tuleb:
- vĂ€lja minna graafiku redigeerimisreĆŸiimist. Mikski pĂ€rast pakutakse graafikute jagamise Ă”igeid seadistusi ainult armatuurlaua lehelt.
- KlĂ”psake kolmnurgal graafiku nime kĂ”rval, menĂŒĂŒs valige share.
- Avanenud aknas minema vahekaardile embed.
- Eemaldage mĂ€rkeruut current time range â ajavahemiku mÀÀrame URL-i kaudu.
- Valige vajalik teema. Minu puhul on see light.
- Kopeerige saadud URL lovelace-UI seadistuste kaardile.
- type: iframe
id: graf_water_hourly
url: "http://192.168.10.200:3000/d-solo/rZARemQWk/water?orgId=1&panelId=2&from=now-2d&to=now&theme=light"
Pange tÀhele, et ajavahemik (viimased 2 pÀeva) mÀÀratakse siinkohal, mitte armatuurlaua seadistustes.
Graafik nĂ€eb vĂ€lja selline. Kuuma vett ei ole ma viimase kahe pĂ€eva jooksul kasutanud, seega joonistatakse ainult kĂŒlma vee graafik.

Ma pole endiselt otsustanud, milline graafik mulle rohkem meeldib, astmejoon vĂ”i reaalsete sambad. Seega toon lihtsalt nĂ€ite pĂ€evagraafikust, ainult sellel korral sambadega. PĂ€ringud koostatakse sarnaselt ĂŒlaltoodud kirjeldatule. Kuvamise parameetrid on jĂ€rgmised:

See graafik nÀeb vÀlja selline:

Nii et nĂŒĂŒd parameetrist Stack. Sellel graafikul joonistatakse kĂŒlma vee sammas kuuma vee samba peale. KokkuvĂ”ttes kĂ”rgus vastab ĂŒhe perioodi kokkuvĂ”tlikule tarbimisele kĂŒlma ja kuuma vee osas.
KĂ”ik nĂ€idatud graafikud on dĂŒnaamilised. Sobrav sĂŒsteemile huvitava punkti kohale ja vaadake detaile ja vÀÀrtust konkreetses punktis.
Kahjuks ei saanud paar tilka tĂ”rva vĂ€ltida. Veergude graafikul (erinevalt astmeliselt joonistatud graafikust) asub veeru keskmine mitte keset ööd, vaid kell 00:00. St. vasak pool veerust on joonistatud eelmine pĂ€ev. Nii on laupĂ€eva ja pĂŒhapĂ€eva graafikud joonistatud veidi vasakule sinakas tsoonist. Praegu ei ole ma leidnud viisi, kuidas seda lahendada.
Teine probleem on seostatav kuude intervallide korrektse töötlemisega. Asi on selles, et tunni/pĂ€eva/nĂ€dala pikkus on fikseeritud, kuid kuu pikkus on iga kord erinev. InfluxDB suudab töötada ainult ĂŒhtsete intervallidega. Praegu suudab mu aju seadistada fikseeritud intervalli 30 pĂ€eva. Jah, graafik aasta jooksul muutub veidi ebatĂ€pseks ja veerud ei vasta tĂ€pselt kuudele. Kuid kuna see teema huvitab mind lihtsalt nĂ€idikuna, siis olen sellega rahul.
NÀen vÀhemalt kahte lahendust:
- JÀtta kuu graafikud tÀhelepanuta ja piirduda nÀdalastega. 52 nÀdalast veergu aastas nÀeb pÀris hÀsti vÀlja.
- NĂ€dalase tarbimise arvestamine teise viisina ning Grafanat kasutada ainult ilusti graafikute jaoks. Tulemuseks saab olema ĂŒsna tĂ€pne lahendus. VĂ”ib isegi panna eelmisel aastal graafikud kokku, et vĂ”rrelda â Grafana suudab ka seda.
KokkuvÔte
Ma ei tea, miks, aga mulle meeldivad sellised graafikud. Need nĂ€itavad, et elu pulbitseb ja kĂ”ik muutub. Eile oli palju, tĂ€na vĂ€he, homme tuleb midagi muud. On jÀÀnud rÀÀkida pereliikmetega nende tarbimise teemast. Kuid isegi praeguste harrastuste juures muutub lihtsalt suur ja arusaamatu number arvel juba ĂŒsna arusaadavaks tarbimispildiks.
Hoolimata peaaegu 20-aastasest programmeerija karjÀÀrist ei olnud ma andmebaasidega praktiliselt kokku puutunud. SeetĂ”ttu tundus vĂ€lise andmebaasi seadistamine midagi vĂ€ga keerulist ja arusaamatut. â selgus, et sobiva tööriista kĂŒlge keeramine toimub paari klĂ”psuga ning spetsialiseeritud tööriista abil muutub graafikute loomise ĂŒlesanne veidi lihtsamaks.
Pealkirjas mainisin elektritarbimist. Kahjuks ei saa ma hetkel tuua ĂŒhtegi graafikut. Ăks SDM120 arvesti on mu jaoks katkenud ja teine kĂ€itub Modbus'i kutsumise korral ebatavaliselt. Siiski ei mĂ”juta see artikkel teemat â graafikuid saab koostada samamoodi kui vee puhul.
Selles artiklis olen vÀlja toonud lÀhenemisviisid, mida olen ise proovinud. Kindlasti on olemas veel mÔni andmete kogumise ja visualiseerimise meetod, millest ma ei tea. Jagage minuga kommentaarides, mul oleks vÀga huvitav kuulda. Olen avatud konstruktiivsele kriitikale ja uutele ideedele. Loodan, et antud materjal aitab kedagi.
Allikas: habr.com
