
I am always surprised when I receive the bill for electricity and water â does my family really use that much? Sure, the bathroom has underfloor heating and a boiler, but they're not working all the time. We seem to save water too (though we do enjoy splashing around in the bath). A few years ago, I already ja to the smart home system, but I just got stuck on that. Iâve only now gotten around to analyzing consumption, which is basically what this article is about.
Recently, I switched to Home Assistant as my smart home system. One reason was the ability to collect a lot of data with a convenient way to create various graphs.
The information described in this article is not new; all these things have already been discussed online in various forms. However, each article usually covers only one approach or aspect. I had to compare all these methods and choose the most suitable one myself. The article still doesnât provide exhaustive information on data collection but serves as a summary of how I did it. Therefore, constructive criticism and suggestions for improvement are welcome.
Ălesande seadmine
So, the goal 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
In this process, we face some challenges:
- Standard graph components are usually rather limited. At best, you can create a line graph based on points.
If you search well, you can find third-party components that expand the capabilities of the standard graph. For Home Assistant, the component is quite decent and visually appealing, but it also has some limitations:
- Itâs difficult to set parameters for bar graphs over large intervals (the bar width is set in fractions of an hour, which means intervals longer than an hour need fractional numbers)
- You cannot add different entities to one graph (for example, combining temperature and humidity, or merging a bar graph with a line graph)
- Not to mention that Home Assistant, by default, uses the most primitive SQLite database (and I, unfortunately, didnât manage to install MySQL or Postgres), so the data is not stored in the most optimal way. For instance, every time even the smallest digital parameter changes, a large JSON payload of about a kilobyte is recorded in the database.
{"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}}}I have quite a few sensors (temperature sensors in each room, water and electricity meters), and some even generate a lot of data. For instance, the SDM220 electricity meter generates about a dozen values every 10-15 seconds, and I would like to install about 8 of these meters. Moreover, thereâs a whole bunch of parameters calculated based on other sensors. Thus, all these values could easily inflate the database by 100-200 MB daily. After a week, the system will be sluggish, and after a month, the flash drive will die (in a typical Home Assistant installation on a Raspberry Pi), and storing data for an entire year is out of the question.
- If youâre lucky, your meter can count consumption by itself. You can inquire at any time and ask the meter for the accumulated consumption value. Generally, all electricity meters that have a digital interface (RS232/RS485/Modbus/Zigbee) offer this capability.
Halvem, kui seade suudab lihtsalt mÔÔta mingit hetkeparameetrit (nĂ€iteks hetke vĂ”imsust vĂ”i voolu), vĂ”i lihtsalt genereerida impulsse iga X vat-tunni vĂ”i liitri kohta. Siis tuleb mĂ”elda, kuidas ja millega seda integreerida ning kus vÀÀrtust koguda. On oht, et jÀÀb jĂ€rgmine aruanne mingil pĂ”hjusel saamata, ja kogu sĂŒsteemi tĂ€psus tekitab kĂŒsimusi. Muidugi vĂ”ib selle kĂ”ik usaldada nutika kodu sĂŒsteemile, nagu home assistant, kuid andmebaasi salvestuste arvu punkt ei ole kehtetuks muutunud, ja andurite kĂŒsitlemine tihedamini kui kord sekundis pole vĂ”imalik (home assistant'i arhitektuuri piirang).
LĂ€henemine 1
Alustame vaatamisest, mida home assistant vÀidetavalt pakub. Tarbimise mÔÔtmine ajavahemiku jooksul on vÀga nÔutud funktsionaalsus. Loomulikult on see juba ammu rakendatud spetsialiseeritud komponendina - utility_meter.
Komponendi olemus seisneb selles, et see loob muutuja current_accumulated_value, ja nulleb seda mÀÀratud ajaperioodi (tund/nÀdal/kuu) lÔppedes. Komponent jÀlgib sissetulevat muutujat (nÀiteks mingi anduri vÀÀrtus) ja registreerib muutused - te lihtsalt saate valmis tulemuse. Selle seadistamine vajab vaid mÔningaid ridasid 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, mis on hetke vÀÀrtus, mida ma saan kaudul mqtt. Konstruktsioon loob 2 uut andurit water_cold_hour_um ja water_cold_day_um, mis koguvad tunni ja pÀevas nÀitajaid, nulledes need ajaperioodi lÔppedes. Siin on tunni akumulaatori graafik poole pÀeva jooksul.

Tunni ja pÀevagraafikute kood lovelace-UI jaoks on jÀrgmine:
- type: history-graph
title: 'Tunni veetarbimine muutuja pÔhjal'
hours_to_show: 48
entities:
- sensor.water_hour
- type: history-graph
title: 'PÀeva veetarbimine muutuja pÔhjal'
hours_to_show: 360
entities:
- sensor.water_day
Tegelikult peitub probleem sellises lÀhenemises selle algoritmi sees. Nagu ma juba mainisin, genereeritakse iga sissetuleva vÀÀrtuse (hetke nÀitaja iga jÀrgmise liitri jaoks) puhul 1 kB andmebaasi kirjeid. Iga utility meter genereerib samuti uue vÀÀrtuse, mis minnes andmebaasi. Kui ma tahan koguda tunni/pÀeva/nÀdala/kuu nÀitajaid, ja samaaegselt mitmest veepunktist, pluss veel hulga elektriarvestite lisada - siis on see vÀga palju andmeid. No, tÀpsemalt öeldes pole andmeid palju, kuid kuna home assistant kirjutab andmebaasi hunniku liigset teavet, siis andmebaasi suurus kasvab nagu pÀrmitaigen. Pelgalt nÀdalate ja kuude graafikute suuruse arvutamine on jube.
Lisaks sellele ei lahenda utility meter ise seatud ĂŒlesannet. Utility meter'i vĂ€lja andev graafik on monotoniliselt kasvava funktsiooni graafik, mis nulledakse iga tunni lĂ”pus. Me vajame kasutajale arusaadavat tarbimise graafikut, et nĂ€ha, kui palju liitreid on ajavahemiku jooksul tarbitud. Tavaline history-graph komponent seda teha ei oska, kuid me saame kasutada vĂ€list komponenti mini-graph-card.
See on kood tehiskaardile lovelace-UI jaoks:
- aggregate_func: max
entities:
- color: var(--primary-color)
entity: sensor.water_cold_hour_um
group_by: hour
hours_to_show: 48
name: "Tunni veetarbimine, koondatud utility meter'i jÀrgi"
points_per_hour: 1
show:
graph: bar
type: 'custom:mini-graph-card'Lisaks tavalistele seadistustele, nagu anduri nimi, graafiku tĂŒĂŒp, vĂ€rv (tavaline oranĆŸ ei meeldinud), on oluline mĂ€rkida 3 seadistust:
- group_by:hour â graafik genereeritakse tundide alguse jĂ€rgi
- points_per_hour: 1 â ĂŒks graafik iga tunni kohta
- Ja kĂ”ige olulisem, aggregate_func: max â vĂ”tke maksimaalne vÀÀrtus igas tunnis. Just see parameeter muudab hammasratta graafiku tulpadeks.

Vasaku ÀÀre rida tulpade puhul Ă€rge pöörake tĂ€helepanu - see on komponendi standardne kĂ€itumine, kui andmeid pole. Ja andmeid polnudki - ma lĂŒlitasin utility meter andmete kogumise sisse alles paar tundi tagasi ainult selle artikli jaoks (oma praeguse lĂ€henemise tutvustan allpool).
Sellel pildil soovisin nÀidata, et mÔnikord toimib andmete kuvamine, ja tulbad peegeldavad tÔesti Ôigeid vÀÀrtusi. Ainult et mitte kÔik. MÀrgitud tulbi ajavahemikus 11-12 hommikul nÀitab kahjuks 19 liitrit, kuigi hammastega graafikul nÀeme, et sellelt samalt andurilt on sel perioodil tarbimine 62 liitrit. Olgu see siis bug vÔi vale. Ja miks andmed paremal poole katkestusid, pole ma veel aru saanud - seal oli tarbimine normaalne, nagu samuti on nÀha hammastega graafikust.
Ăldiselt ei saanud ma selle lĂ€henemise usaldusvÀÀrsuse saavutada - graafik nĂ€itab peaaegu alati mingit jama.
Sarnane kood pÀevase anduri jaoks.
- 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 kogutud utiliidi jÀrgi"
points_per_hour: 0.0416666666
show:
graph: bar
type: 'custom:mini-graph-card'
Pange tĂ€hele, et rippmenĂŒĂŒ parameeter group_by on seatud vÀÀrtuseks interval, ja kĂ”ik sĂ”ltub parameetrist points_per_hour. See on ka teine probleem, millega see komponent silmitsi seisab â points_per_hour töötab hĂ€sti tunnigraafikute korral, kuid kehvasti pikemate ajavahemike puhul. SeetĂ”ttu, et saada ĂŒks veerg ĂŒhe pĂ€eva kohta, pidin kirjutama vÀÀrtuse 1/24=0.04166666. Ma rÀÀgin juba nĂ€dalaste ja kuiste graafikute kohta.
LĂ€henemine 2
Veel uurides home assistanti, sattusin sellele videole:

SĂ”ber kogub andmeid mitmesuguste Xiaomi pistikute tarbimise kohta. Tema ĂŒlesanne on lihtsam â lihtsalt kuvada tarbimise vÀÀrtused tĂ€na, eile ja kuu jooksul. Graafikuid ei nĂ”uta.
JĂ€tame kĂ”rvale arutlused, mis puudutavad hetkevĂ”imsuse kĂ€sitsi integreerimist â selle lĂ€henemise âtĂ€psusestâ olen juba eespool kirjutanud. Pole selge, miks ta ei kasuta kogunenud tarbimise vÀÀrtusi, mis on juba sama pistiku poolt kogutud. Minu arvates töötaks integreerimine seadme sees paremini.
Videost vÔtame idee tarbimise kÀsitsi arvestamisest ajavahemiku jooksul. Mees arvutab ainult tÀna ja eile saadud vÀÀrtusi, kuid me liigume edasi ja proovime joonistada graafiku. Pakutud meetodi sisu minu puhul seisneb jÀrgnevates etappides.
Loome muutuja vÀÀrtus_alguses_tunnis, kuhu salvestame arvesti praegused nÀidud.
Kellaaegade jooksul (vĂ”i jĂ€rgmise tunni alguses) arvutame erinevuse praeguste nĂ€itude ja alguses salvestatud nĂ€itude vahel. See erinevus on hetketarbimine â salvestame selle vÀÀrtuse sensorisse ja tulevikus kasutame selle abil graafiku koostamiseks.
Peame ka ânullimaâ muutuja vÀÀrtus_alguses_tunnis, salvestades sinna arvesti praeguse vÀÀrtuse.
KÔike seda saab teha home assistandi enda tööriistade kaudu.
Koodi tuleb kirjutada veidi rohkem, kui eelnevas lĂ€henemises. Esiteks, loome need âmuutujadâ. Vaikimisi meil ei ole âmuutujaâ olemust, kuid vĂ”ime kasutada mqtt brokki teenuseid. Saame sinna saata vÀÀrtusi, kinnitades retain=true â see hoiab vÀÀrtuse brokkis ning saame seda igal ajal sealt kĂ€tte, isegi home assistanti taaskĂ€ivitamisel. Tehtud on kohe tunnised 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: lKÔik maagia toimub automatiseerimises, mis kÀivitatakse iga tunni ja iga öö.
- 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 automatiseerimised teevad 2 toimingut:
- Arvutavad vahemaa vÀÀrtuse intervalli alguse ja lÔppvÀÀrtuse vahel
- Uuendavad pÔhivÀÀrtuse jÀrgmise intervalli jaoks
Graafikute koostamine toimub tavaliselt history-graph: i kaudu:
- type: history-graph
title: 'Tunni veetarbimine muutuja pÔhjal'
hours_to_show: 48
entities:
- sensor.water_hour
- type: history-graph
title: 'PÀeva veetarbimine muutuja pÔhjal'
hours_to_show: 360
entities:
- sensor.water_dayNÀeb vÀlja nii:

PĂ”himĂ”tteliselt on see juba see, mis on vajalik. Selle meetodi eelis on see, et andmed genereeritakse ainult ĂŒhe korra intervalli jooksul. T. e. kokku 24 kirjet ööpĂ€evas tunnigraafiku jaoks.
Kahjuks ei lahenda see siiski probleemi kasvava andmebaasi osas. Kui soovin kuu tarbimise graafikut, pean andmeid salvestama vĂ€hemalt aasta. Ja kuna home assistant pakub ainult ĂŒhte sĂ€ilitamise seadistust kogu andmebaasi jaoks, tĂ€hendab see, et KĂIK andmed sĂŒsteemis tuleb hoida terve aasta. NĂ€iteks, kui aastas tarbin 200 kuupsentimeetrit vett, tĂ€hendab see 200000 kirjet andmebaasis. Ja kui arvestada ka teisi sensoreid, muutub number ĂŒldiselt tĂ€iesti sobimatuks.
LĂ€henemine 3
Ănneks on nutikad inimesed juba selle probleemi lahendanud, luues InfluxDB andmebaasi. See andmebaas on spetsiaalselt optimeeritud ajapĂ”histe andmete salvestamiseks ja sobib ideaalselt erinevate sensorite vÀÀrtuste hoidmiseks. SĂŒsteem pakub ka SQL-laadset pĂ€ringukeelt, mis vĂ”imaldab andmebaasist vÀÀrtusi vĂ€lja noppida ja seejĂ€rel neid mitmel viisil agregatsioonida. LĂ”puks on erinevad andmed vĂ”imalik salvestada erineva aja jooksul. NĂ€iteks kiiresti muutuvad nĂ€idud, nagu temperatuur vĂ”i niiskus, saab hoida ainult paar nĂ€dalat, samas kui pĂ€evased vee tarbimise nĂ€idud saavad pĂŒsida aasta.
Lisaks InfluxDB-le on nutikad inimesed vĂ€lja loonud ka Grafana - sĂŒsteemi, mis vĂ”imaldab graafikute joonistamist InfluxDB-st pĂ€rit andmetest. Grafana suudab joonistada erinevaid graafikute tĂŒĂŒpe, neid detailideni kohandada ning mis kĂ”ige tĂ€htsam, neid graafikuid saab "paigaldada" lovelace-UI home assistantâisse.
Inspireerima ja . Artiklites on detailselt kirjeldatud InfluxDB ja Grafana installimise ja ĂŒhendamise protsessi home assistantâiga. Mina keskendun oma konkreetse ĂŒlesande lahendamisele.
Nii et esmalt hakkame salvestama arvesti vÀÀrtust InfluxDB-sse. Juhend home assistandi konfiguratsiooni (selles nĂ€ites lĂ€hen ma mĂ€ngima 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Ă€ivitame sama andmete salvestamise home assistandi sisemisesse andmebaasi, et mitte seda tarbetult paisutada:
recorder:
purge_keep_days: 10
purge_interval: 1
exclude:
entities:
- sensor.water_meter_hot
- sensor.water_meter_coldLiigume nĂŒĂŒd InfluxDB konsooli ja seadistame oma andmebaasi. EelkĂ”ige tuleb mÀÀrata, kui kaua teatud andmeid hoitakse. Seda reguleerib nn retention policy - see on sarnane andmebaasidele pĂ”hjaandmebaasi sees, kus igal sisemisel andmebaasil on oma seaded. Vaikimisi salvestatakse kĂ”ik andmed retention policy alla nimega autogen, mis hoiustatakse nĂ€dal. Soovin, et tunnised andmed sĂ€ilitaksid kuu, nĂ€dalased - aasta, ja kuuandmed ei kustutataks 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, pĂ”himĂ”tteliselt, peamine nipp - andmete agregatsioon continuous query abil. See on mehhanism, mis kĂ€ivitab pĂ€ringu automaatselt teatud ajavahemike jĂ€rel, agregatsioonandmed selle pĂ€ringu pĂ”hjal ja salvestab tulemuse uue vÀÀrtusena. Vaatame nĂ€idet (kirjutan veeru kaupa parema loetavuse nimel, kuid tegelikult pidi ma selle kĂ€su sisestama ĂŒhes reas).
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 toob kĂ”ik andmed homeassistant.autogen.l (liitrid) mÔÔtmisest, sealhulgas kĂŒlma ja sooja vee nĂ€idud.
- Agregeeritud andmed rĂŒhmitatakse entity_id jĂ€rgi, luues meile eraldi vÀÀrtused kĂŒlma ja sooja vee jaoks.
- Kuna liitri arvesti on monotoonselt kasvav jÀrjestus, tuleb iga tunni jooksul vÔtta maksimaalne vÀÀrtus, mistÔttu aggregatsioon viiakse lÀbi funktsiooni max(value) abil.
- Uus vÀÀrtus salvestatakse homeassistant.month.water_meter_hour, kus month on retention policy nimi kuu pikkuse sĂ€ilitamise tasuta. KĂŒlma ja sooja vee andmed jagunevad erinevatesse kirjetesse vastava entity_id ja vÀÀrtusega vĂ€ljal value.
Ăösel vĂ”i kui kedagi kodus ei ole, ei ole vee tarbimist, seega ei teki uusi kirjeid homeassistant.autogen.l. Et vĂ€ltida vÀÀrtuste kadumist tavapĂ€rastes pĂ€ringutes, vĂ”ib kasutada fill(previous). See sunnib InfluxDB-d kasutama eelmise tunni vÀÀrtust.
Kahjuks on continuous query-l ĂŒks eripĂ€ra: fill(previous) nipp ei tööta ja kirjed ei luge. See on mingi ĂŒletamatu probleem, mis . Selle probleemiga tegeleme hiljem, kuid fill(previous) continuous query-s jĂ€tku jÀÀb â see ei hĂ€iri.
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 vÀÀrtused andmebaasis salvestatakse UTC-s, seega erinevad need nimekirjas kolme tunni vĂ”rra â kell 7 hommikul InfluxDB-s kuvatud vÀÀrtused vastavad kell 10 hommikul ĂŒlaltoodud graafikutele. Samuti pange tĂ€hele, et kella 2 ja 5 vahel pole kirjeid â see on see, mis iseloomustab continuous query'd.
Nagu nĂ€ete, on koondatud vÀÀrtus samuti monotoniliselt kasvav jĂ€rjestus, kuid kirjed on harvem â korra tunni kohta. Kuid see pole probleem â saame kirjutada veel ĂŒhe kĂŒsimuse, mis toob Ă”iged andmed graafikule.
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:
- KÀime andmebaasist homeassistant.month.water_meter_hour vÀlja andmed entity_id='water_meter_cold' jaoks viimase 24 tunni jooksul (time >= now() -24h).
- Kuna olen juba maininud, et homeassistant.month.water_meter_hour jÀrjestuses vÔivad mÔned kirjed puududa. Need andmed genereerime uuesti, kÀivitades pÀringu GROUP BY time(1h). Seekord fill(previous) töötab nii nagu peab, genereerides puuduvad andmed (funktsioon vÔtab eelmise vÀÀrtuse).
- Selle pĂ€ringu kĂ”ige olulisem osa on funktsioon difference, mis arvutab tunni markide vahelise erinevuse. Ăksinda ei toimi see ja vajab agregatsioonifunktsiooni. Olgu selleks max(), mida oleme varem kasutanud.
Tulemuse tÀitmine 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 72Kella 2 ja 5 vahel (UTC) ei olnud tarbimist. Siiski tagastab pÀring sama tarbimise vÀÀrtuse tÀnu fill(previous), ja funktsioon difference lahutab selle iseendast, mille tulemusena saame 0, mis tegelikult on vajalik.
JĂ”uame viimase sammuni â graafiku joonistamine. Selleks avame Grafana, avame mĂ”ne olemasoleva (vĂ”i loome uue) armatuurlaua, loome uue paneeli. Graafiku seaded on jĂ€rgmised.

Kavatsen kuvada andmeid kĂŒlma ja sooja vee kohta ĂŒhel graafikul. PĂ€ring on tĂ€pselt selline, nagu ma eespool kirjeldasin.
Kuvamise parameetrid on seadistatud nii. Mul on see joon graafikuna (lines), mis kulgeb astmeliselt (stairs). Parameeter Stack, selgitan natuke hiljem. Seal on veel mÔni kuvamise parameeter, kuid need pole nii huvitavad.

Kuidas lisada saadud graafik home assistant'i:
- vĂ€lja minna graafiku redigeerimisreĆŸiimist. Mikski pĂ€rast pakutakse Ă”iged graafikute jagamise seaded ainult armatuurlaua lehelt.
- KlĂ”psake kolmnurgale graafiku nime kĂ”rval, valige menĂŒĂŒst jagada.
- Avalt avanevas aknas minge sakkile embed.
- TĂŒhjendage ruut current time range â ajavahemiku mÀÀrame URL-i kaudu.
- Valige vajalik teema. Minu puhul on see light.
- Kopeerige saadud URL lovelace-UI seadete 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 just siin, mitte armatuurlauda seadetes.
Graafik nĂ€eb vĂ€lja nii. Sooja vett ma viimase kahe pĂ€eva jooksul ei kasutanud, seetĂ”ttu joonistatakse ainult kĂŒlma vee graafik.

Nii et ei suutnud ma otsustada, milline graafik mulle rohkem meeldib, astmelise joonega vÔi pÀris tulpadega. SeetÔttu toome lihtsalt nÀite pÀevagraafikust, seekord ainult tulpadega. PÀringud tehakse sarnasel viisil nagu eespool kirjeldatud. Kuvamise parameetrid on sellised:

See graafik nÀeb vÀlja nii:

Nii et rÀÀkides parameetrist Stack. Sellel graafikul joonistatakse kĂŒlma vee tulp sooja vee tulba peale. Ăldine kĂ”rgus vastab kĂŒlma ja sooja vee tarbimise kogusummale ajavahemikul.
KĂ”ik nĂ€idatud graafikud on dĂŒnaamilised. Saate hiirega huvipakkuva punkti peale liikuda ja vaadata ĂŒksikasju ja vÀÀrtust konkreetses punktis.
Kahjuks ei ole ilma paarikese tĂ”rva. Tulpade graafikul (erinevalt astmelisest joonegraafikust) on tulba keskmine punkt mitte keskpĂ€eval, vaid kell 00:00. St tulba vasak pool joonistatakse eelmise pĂ€eva kohale. Nii et laupĂ€eva ja pĂŒhapĂ€eva graafikud on joonistatud veidi vasakule sinise ala suhtes. Praeguseks ei ole mul veel lahendust.
Teine probleem seisneb selles, et kuu intervallidega on keeruline Ă”igesti töötada. Asi on selles, et tunni/pĂ€eva/nĂ€dala pikkus on fikseeritud, kuid kuu pikkus on iga kord erinev. InfluxDB saab töötada ainult ĂŒhtsete intervallidega. Seni on mu mĂ”tlemine piirdunud fikseeritud 30-pĂ€evase intervalliga. Jah, graafik aastate lĂ”ikes veidi moonutab ja baarid ei ĂŒhti tĂ€iesti tĂ€pselt kuudega. Kuid kuna see asi huvitab mind lihtsalt nĂ€itajana, siis ma lepin sellega.
NÀen vÀhemalt kahte lahendust:
- JÀtta kuu graafikud kÔrvale ja piirduda nÀdalastega. 52 nÀdalast baari aastas nÀeb tÀiesti hea vÀlja.
- Kuu tarbimist arvestada teise meetodina ja Grafanat kasutada vaid ilusate graafikute jaoks. See osutub tĂ€iesti tĂ€pseks lahenduseks. VĂ”ib isegi eelmisel aastal graafikud katsetada â Grafana oskab ka seda.
KokkuvÔte
Ei tea, miks, aga ma naudin sellist tĂŒĂŒpi graafikuid. Need nĂ€itavad, et elu pulbitseb ja kĂ”ik muutub. Eile oli palju, tĂ€na vĂ€he, homme on kuidagi veel. Peab veel pereliikmetega tarbimise teemal rÀÀkima. Kuid isegi praeguste isudega muutub lihtsalt suur ja arusaamatu number arvel piisavalt arusaadavaks tarbimise pildiks.
Hoolimata pea 20-aastasest programmeerimise karjÀÀrist ei ole ma andmebaasidega praktiliselt kokku puutunud. SeetĂ”ttu tundus vĂ€lise andmebaasi seadistamine millegi sellise, mis on keeruline ja arusaamatu. KĂ”ik muutis â selgus, et sobiva tööriista ĂŒhendamine toimub paaris klĂ”psus, ja spetsialiseeritud tööriistaga muutub graafikute loomise ĂŒlesanne veidi lihtsamaks.
Pealkirjas mainisin elektritarbimist. Kahjuks ei saa ma hetkel esitada ĂŒhtegi graafikut. Ăks SDM120 mÔÔtur on mul lĂ€bi kukkunud, ja teine jamab Modbusi kaudu ĂŒhenduse vĂ”ttes. Kuid see ei mĂ”juta kuidagi selle artikli sisu â graafikud ehitatakse samamoodi, nagu veega.
Selles artiklis olen lÀbi viinud need lÀhenemisviisid, mida olen ise proovinud. Kindlasti on veel mingeid andmete kogumise ja visualiseerimise organiseerimise viise, millest ma ei tea. RÀÀkige mulle sellest kommentaarides, see oleks mulle vÀga huvitav. Olen avatud konstruktiivsele kriitikale ja uutele ideedele. Loodan, et esitatud materjal aitab ka kedagi.
Allikas: habr.com
