Smart Home: Charting Water and Electricity Consumption in Home Assistant

Smart Home: Charting Water and Electricity Consumption in Home Assistant
Ogni volta chì riceve un pagamentu per l'electricità è l'acqua, mi dumandu - a mo famiglia cunsumeghja veramente tantu? Ebbè, iè, ci hè un pavimentu cale è una caldaia in u bagnu, ma ùn sò micca travagliatu cum'è pompieri tuttu u tempu. Parimu ancu di salvà l'acqua (ancu se ci piace ancu splashing in u bagnu). Qualchi anni fà aghju digià metri d'acqua cunnessi и elettricità à una casa intelligente, ma hè quì chì e cose si sò bloccate. E mani anu righjuntu l'analisi di u cunsumu solu avà, chì, in fattu, hè ciò chì questu articulu hè.

Recentemente aghju cambiatu à Home Assistant cum'è u mo sistema di casa intelligente. Unu di i mutivi era solu l'abilità di urganizà a cullizzioni di una grande quantità di dati cù a pussibilità di custruzzione còmuda di varii tipi di grafici.

L'infurmazione descritta in questu articulu ùn hè micca nova, tutte queste cose sottu diverse salsi sò digià descritte in Internet. Ma ogni articulu, in regula, descrive solu un approcciu o aspettu. Aviu avutu à paragunà tutti questi approcci è sceglie u più adattatu. L'articulu ùn furnisce micca infurmazione exhaustiva nantu à a cullizzioni di dati, ma hè un tipu di riassuntu di cumu l'aghju fattu. Dunque, a critica constructiva è i suggerimenti per migliurà sò benvenuti.

Formulazione di u prublema

Dunque, l'obiettivu di l'eserciziu d'oghje hè di ottene belli grafici di u cunsumu d'acqua è d'electricità:

  • Ogni ora per 2 ghjorni
  • Ogni ghjornu per 2 settimane
  • (opcional) settimanale è mensuale

Ci sò qualchi difficultà in questu:

  • I cumpunenti di u graficu standard tendenu à esse abbastanza poveri. In u megliu, pudete custruisce un graficu di linea per punti.

    Se cercate bè, pudete truvà cumpunenti di terzu chì allarganu e capacità di u graficu standard. Per l'assistente di casa, in principiu, un cumpunente bonu è bellu mini carta grafica, ma hè ancu un pocu limitatu:

    • Hè difficiuli di stabilisce i paràmetri di u bar chart à intervalli grandi (a larghezza di a barra hè stabilita in frazzioni di una ora, chì significa chì intervalli più longu di una ora seranu stabiliti in numeri fraccionari)
    • Ùn pudete micca aghjunghje diverse entità à un graficu (per esempiu, a temperatura è l'umidità, o combina un graficu à barre cù una linea)
  • Ùn solu l'assistente di casa usa a basa di dati SQLite più primitiva per difettu (è eiu, u manufattu, ùn hà micca maestru di a stallazione di MySQL o Postgres), i dati ùn sò micca guardati in u modu più ottimali. Cusì, per esempiu, cù ogni cambiamentu di ognuna ancu u più chjucu paràmetru digitale di un paràmetru, un json enormu circa un kilobyte in grandezza hè scrittu à a basa di dati.
    {"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}}}

    Aghju uni pochi di sensori (sensori di temperatura in ogni stanza, metri d'acqua è di l'electricità), è parechji generanu ancu assai dati. Per esempiu, solu u metru di l'electricità SDM220 genera una decina di valori ogni 10-15 seconde, è vogliu stallà tali metri 8. È ci hè ancu una mansa di parametri chì sò calculati basatu annantu à altri sensori. Chì. tutti questi valori ponu facilmente inflate a basa di dati da 100-200 MB ogni ghjornu. In una settimana, u sistema à pocu pressu, è in un mesi u flash drive mori (in u casu di una stallazione tipica di l'assistente di casa nantu à raspberry PI), è ùn pò esse micca quistione di almacenamiento di dati per un annu sanu.

  • Sè vo site furtunatu, u vostru metru stessu pò cuntà u cunsumu. Pudete cuntattà u metru in ogni mumentu è dumandà à quale ora hè u valore di cunsumu accumulatu. In regula, tutti i metri di l'electricità chì anu una interfaccia digitale (RS232/RS485/Modbus/Zigbee) furnisce una tale opportunità.

    Peor, se u dispusitivu pò misurà simpricimenti qualchi paràmetru istantaneu (per esempiu, putenza istantanea o currente), o simpricimenti generà impulsi ogni X watt-ora o litri. Allora avete bisognu di pensà à cumu è cù ciò chì integrà è induve accumulà valore. Ci hè un risicu di missing u prossimu rapportu per ogni mutivu, è l'accuratezza di u sistema in generale suscite dumande. Pudete, sicuru, affidate tuttu questu à un sistema di casa intelligente cum'è l'assistente di casa, ma nimu hà annullatu u puntu nantu à u numeru di entrate in a basa di dati, è i sensori di polling più di una volta per seconda ùn anu micca travagliatu (una limitazione di u architettura assistente di casa).

Approcciu 1

Prima, vedemu quale assistente di casa hè furnitu fora di a scatula. A misurazione di u cunsumu annantu à un periodu hè una funziunalità assai dumandata. Di sicuru, hè statu implementatu assai tempu fà cum'è un cumpunente specializatu - utility_meter.

L'essenza di u cumpunente hè chì principia a variabile current_accumulated_value in l'internu è resetta dopu un periudu specificu (ora / settimana / mese). U cumpunente stessu monitoreghja a variabile entrante (u valore di qualchì tipu di sensore), abbonate à i cambiamenti in u valore stessu - avete ghjustu u risultatu finitu. Questa cosa hè descritta in uni pochi di linii in u schedariu di cunfigurazione

utility_meter:
  water_cold_hour_um:
    source: sensor.water_meter_cold
    cycle: hourly
  water_cold_day_um:
    source: sensor.water_meter_cold
    cycle: daily

Quì sensor.water_meter_cold hè u valore attuale di u metru in litri chì aghju direttamente da u ferru da mqtt. U disignu crea 2 sensori novi water_cold_hour_um è water_cold_day_um, chì accumulanu letture orarie è di ogni ghjornu, resettanu à zero dopu un periodu. Eccu un graficu di a bateria per ora per a mità di ghjornu.

Smart Home: Charting Water and Electricity Consumption in Home Assistant

U codice graficu di l'ora è ogni ghjornu per lovelace-UI s'assumiglia cusì:

      - type: history-graph
        title: 'Hourly water consumption using vars'
        hours_to_show: 48
        entities:
          - sensor.water_hour

      - type: history-graph
        title: 'Daily water consumption using vars'
        hours_to_show: 360
        entities:
          - sensor.water_day

In verità, in questu algoritmu si trova u prublema di stu approcciu. Cumu l'aghju digià dettu, per ogni valore entrante (a lettura di u metru attuale per ogni litru prossimu), 1kb di un record hè generatu in a basa di dati. Ogni metru di utilità genera ancu un novu valore, chì hè ancu aghjuntu à a basa. Se vogliu cullà letture per ora / ogni ghjornu / settimanale / mensili, iè, per parechji risers d'acqua, è ancu aghjunghje un pacchettu di metri elettrici, questu serà assai dati. Eppo, più precisamente, ùn ci hè micca assai dati, ma postu chì l'assistente di casa scrive una mansa d'infurmazioni innecessarii à a basa di dati, a dimensione di a basa di dati crescerà à salti è limiti. Aghju ancu paura di stimà a dimensione di a basa per i grafici settimanali è mensili.

Inoltre, u metru di utilità stessu ùn risolve micca u prublema. A trama di u metru di utilità hè una funzione monotonicamente crescente chì resetta à 0 ogni ora. Avemu ancu bisognu di un schedariu di cunsumu user-friendly, quantu litri sò stati manghjati durante u periodu. U cumpunente standard di a storia di u graficu ùn face micca questu, ma u cumpunente di mini-carta grafica esterna pò aiutà.

Questu hè u codice di a carta per lovelace-UI:

      - aggregate_func: max
        entities:
          - color: var(--primary-color)
            entity: sensor.water_cold_hour_um
        group_by: hour
        hours_to_show: 48
        name: "Hourly water consumption aggregated by utility meter"
        points_per_hour: 1
        show:
          graph: bar
        type: 'custom:mini-graph-card'

In più di i paràmetri standard cum'è u nome di u sensoru, u tipu di graficu, u culore (ùn mi piace micca l'aranciu standard), hè impurtante nutà 3 paràmetri quì:

  • group_by:hour - u graficu serà generatu cù colonne allineate à u principiu di l'ora
  • points_per_hour: 1 - una barra per ora
  • È più impurtante, aggregate_func: max hè di piglià u valore massimu in ogni ora. Hè stu paràmetru chì trasforma a carta sawtooth in bars.

Smart Home: Charting Water and Electricity Consumption in Home Assistant

Ùn fate micca attente à a fila di culonni à a manca - questu hè u cumpurtamentu standard di u cumpunente s'ellu ùn ci hè micca dati. Ma ùn ci era micca dati - aghju attivatu solu a cullizzioni di dati cù u metru di utilità un paru d'ore fà solu per questu articulu (descriveraghju u mo approcciu attuale un pocu più bassu).

In questa stampa, aghju vulsutu dimustrà chì qualchì volta a visualizazione di dati funziona ancu, è i bars riflettenu veramente i valori curretti. Ma ùn hè micca tuttu. Per una certa ragione, a colonna evidenziata per u periodu da 11 am à 12 am mostra 19 litri, anche se nantu à u graficu di denti un pocu più altu per u stessu periodu da u stessu sensore vedemu u cunsumu di 62 litri. O un bug, o e mani sò crooked. Ma ùn aghju micca capitu perchè i dati nantu à a diritta si rompenu - u cunsumu ci era normale, chì hè ancu visibile da u graficu di denti.

In generale, aghju fiascatu à ottene a plausibilità di stu approcciu - u graficu quasi sempre mostra un tipu d'eresia.

Codice simile per u sensoru di ghjornu.

      - aggregate_func: max
        entities:
          - color: var(--primary-color)
            entity: sensor.water_cold_day_um
        group_by: interval
        hours_to_show: 360
        name: "Daily water consumption aggregated by utility meter"
        points_per_hour: 0.0416666666
        show:
          graph: bar
        type: 'custom:mini-graph-card'

Per piacè nutate chì u paràmetru group_by hè stabilitu à intervallu, è u paràmetru points_per_hour regula tuttu. È questu hè un altru prublema cù questu cumpunente - points_per_hour funziona bè nantu à i grafici di una ora o menu, ma disgustingly in intervalli più grande. Allora per avè una colonna in un ghjornu, aghju avutu à entre u valore 1/24 = 0.04166666. Ùn parlu micca di grafici settimanali è mensili.

Approcciu 2

Mentre era sempre à capisce l'assistente di casa, aghju trovu stu video:


U cumpagnu raccoglie dati di cunsumu da parechji tippi di socket Xiaomi. U so compitu hè un pocu più simplice - solu mostra u valore di u cunsumu per oghje, ieri è per u mese. Nisun graficu necessariu.

Lasciemu da parte l'argumenti nantu à l'integrazione manuale di i valori di putenza istantanea - aghju digià scrittu annantu à a "accuratezza" di questu approcciu sopra. Ùn hè micca chjaru perchè ùn hà micca utilizatu i valori di cunsumu accumulatu, chì sò digià cullati da u stessu outlet. In u mo parè, l'integrazione in u pezzu di ferru hà da travaglià megliu.

Da u video, piglià l'idea di cuntà manualmente u cunsumu per un periodu. Per un omu, solu i valori per l'oghje è per eri sò cunsiderati, ma andemu più in là è pruvate di disegnà un graficu. L'essenza di u metudu prupostu in u mo casu hè a siguenti.

Creeremu una variabile value_at_the_beginning_of_hour, in quale scriveremu e letture attuali di u contatore
Sicondu u timer à a fine di l'ora (o à l'iniziu di l'ora dopu), calculemu a diffarenza trà a lettura attuale è quella guardata à u principiu di l'ora. Sta diferenza serà u cunsumu per l'ora attuale - salveremu u valore à u sensoru, è in u futuru custruiremu un graficu basatu annantu à questu valore.
Avete ancu bisognu di "resettà" a variabile value_at_beginning_of_hour scrivendu u valore attuale di u contatore quì.

Tuttu chistu pò esse fattu bè ... per mezu di l'assistente di casa stessu.

Avete da scrive un pocu di più codice chì in l'approcciu precedente. Cuminciamu cù sti "variabili". Fora di a scatula, ùn avemu micca l'entità "variable", ma pudete aduprà i servizii di un broker mqtt. Manderemu i valori quì cù a bandiera retain=true - questu salvarà u valore in u broker, è pò esse tiratu fora in ogni mumentu, ancu quandu l'assistente di casa hè riavviatu. Aghju fattu i contatori di l'ora è di ogni ghjornu in una volta.

- 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: l

Tutta a magia passa in l'automatizazione, chì corre ogni ora è ogni notte, rispettivamente.

- 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: true

E duie automatizazione facenu 2 cose:

  • Calcule u valore per intervallu cum'è a diffarenza trà u valore iniziale è finali
  • Aghjurnate u valore di basa per u prossimu intervallu

A custruzzione di gràfiche in questu casu hè risolta da u solitu gràficu di storia:

      - type: history-graph
        title: 'Hourly water consumption using vars'
        hours_to_show: 48
        entities:
          - sensor.water_hour

      - type: history-graph
        title: 'Daily water consumption using vars'
        hours_to_show: 360
        entities:
          - sensor.water_day

Sembra cusì:

Smart Home: Charting Water and Electricity Consumption in Home Assistant

In principiu, questu hè digià ciò chì avete bisognu. U vantaghju di stu metudu hè chì i dati sò generati una volta per intervallu. Quelli. un totale di 24 entrate per ghjornu per u graficu di l'ora.

Sfurtunatamente, questu ùn solu micca solu u prublema generale di una basa crescente. Se vogliu un gràficu di cunsumu mensili, aghju da guardà dati per almenu un annu. E postu chì l'assistente di casa furnisce una sola paràmetra di durata di almacenamento per tutta a basa di dati, questu significa chì TUTTI i dati in u sistema duverà esse guardatu per un annu sanu. Per esempiu, in un annu cunsumu 200 metri cubi d'acqua, chì significa 200000 XNUMX entrate in a basa di dati. È se tenete in contu altri sensori, a figura diventa in generale indecente.

Approcciu 3

Fortunatamente, e persone intelligenti anu digià risoltu stu prublema scrivendu a basa di dati InfluxDB. Questa basa di dati hè ottimizzata apposta per almacenà dati basati in u tempu è hè ideale per almacenà i valori di diversi sensori. U sistema furnisce ancu una lingua di quistione simile à SQL chì vi permette di estrarre i valori da a basa di dati è poi aggregali in diversi modi. Infine, diverse dati ponu esse guardatu per i tempi diffirenti. Per esempiu, letture chì cambianu spessu, cum'è a temperatura o l'umidità, ponu esse guardatu per solu un paru di settimane, mentre chì e letture di u cunsumu d'acqua di ogni ghjornu pò esse guardatu per un annu sanu.

In più di InfluxDB, e persone intelligenti anu ancu inventatu Grafana, un sistema per disegnu grafici da dati da InfluxDB. Grafana pò disegnà diversi tipi di grafici, persunalizà in dettagliu, è, più impurtante, questi grafici ponu esse "collegati" in l'assistente di casa lovelace-UI.

esse inspiratu ccà и ccà. L'articuli descrizanu in dettagliu u prucessu di installà è cunnette InfluxDB è Grafana à l'assistente di casa. Mi concentreraghju nantu à risolve u mo prublema specificu.

Allora, prima di tuttu, cuminciamu à aghjunghje u valore di u contatore in influxDB. Un pezzu di a cunfigurazione di l'assistente di casa (in questu esempiu, mi divertiraghju micca solu cù u friddu, ma ancu cù l'acqua calda):

influxdb:
  host: localhost
  max_retries: 3
  default_measurement: state
  database: homeassistant
  include:
    entities:
      - sensor.water_meter_hot
      - sensor.water_meter_cold

Disattivemu a salvezza di e stesse dati in a basa di dati interna di l'assistente di casa per ùn gonfià più una volta:

recorder:
  purge_keep_days: 10
  purge_interval: 1
  exclude:
    entities:
      - sensor.water_meter_hot
      - sensor.water_meter_cold

Andemu avà à a cunsola InfluxDB è cunfigurà a nostra basa di dati. In particulare, avete bisognu di cunfigurà quantu tempu certe dati seranu guardati. Questu hè regulatu da u cusì chjamatu. pulitica di retenzioni - questu hè simile à e basa di dati in a basa di dati principale, cù ogni basa di dati interna chì hà i so paràmetri. Per automaticamente, tutti i dati sò aghjuntu à a pulitica di retenzioni chjamata autogen, sta dati serà guardatu per una settimana. Vogliu chì i dati orari sò stati guardati per un mese, i dati settimanali per un annu, è i dati mensili per ùn esse mai sguassati. Creeremu pulitiche di retenzioni adatte

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 1

Avà, in fattu, u truccu principale hè l'agregazione di dati utilizendu una dumanda cuntinuu. Questu hè un mecanismu chì lancia automaticamente una dumanda à intervalli specificati, aggregate e dati per sta dumanda, è aghjunghje u risultatu à un novu valore. Fighjemu un esempiu (scrivu in una colonna per a leggibilità, ma in realtà aghju avutu à entre in stu cumandamentu in una linea)

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) 
END

Questu cumandamentu:

  • Crea una dumanda cuntinua chjamata cq_water_cold_hourly in a basa di dati di l'assistente in casa
  • A dumanda serà eseguita ogni ora (tempu (1h))
  • A quistione tirà tutte e dati da a misurazione di homeassistant.autogen.l (litri), cumprese letture di acqua fredda è calda.
  • I dati aggregati seranu raggruppati per entity_id, chì creanu valori separati per l'acqua fredda è calda.
  • Siccomu u contatore di litri hè una sequenza monotonicamente crescente in ogni ora, avete bisognu di piglià u valore massimu, cusì l'agregazione serà realizata da a funzione max (valore)
  • U novu valore serà scrittu à homeassistant.month.water_meter_hour induve mese hè u nome di a pulitica di retenzioni cù un periodu di retenzioni di un mesi. Inoltre, e dati nantu à l'acqua fredda è calda seranu spargugliati in registri separati cù l'entity_id currispundenti è u valore in u campu di valore.

A notte o quandu nimu hè in casa, ùn ci hè micca cunsumu d'acqua, è per quessa ùn ci sò micca novi registri in homeassistant.autogen.l. Per evità i valori mancanti in e dumande normali, pudete aduprà riempimentu (precedente). Questu furzà InfluxDB à utilizà u valore di l'ora passata.

Sfurtunatamente, a dumanda cuntinuu hà una peculiarità: u truccu di riempimentu (precedente) ùn funziona micca è i registri sò simpliciamente micca creati. Inoltre, questu hè un tipu di prublema insurmountable, chì hè statu discutitu per più di un annu. Tratteremu di stu prublema più tardi, è lasciaremu riempie (precedente) in una dumanda cuntinuu - ùn interferisce micca.

Cuntrollamu ciò chì hè accadutu (di sicuru, duvete aspittà un paru d'ore):

> 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

Nota chì i valori in a basa di dati sò almacenati in UTC, cusì sta lista differisce da 3 ore - i valori di 7am in l'output InfluxDB currispondenu à i valori di 10am in i grafici sopra. Innota ancu chì trà 2 è 5 di a matina ùn ci sò simpricimenti micca registri - questu hè a caratteristica di a dumanda cuntinua.

Comu pudete vede, u valore aggregatu hè ancu una sequenza monotonicamente crescente, solu l'entrata sò menu frequenti - una volta à l'ora. Ma questu ùn hè micca un prublema - pudemu scrive una altra dumanda chì estrarà i dati curretti per u graficu.

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)

Decifraraghju:

  • Da a basa di dati homeassistant.month.water_meter_hour, tiraremu dati per entity_id = 'water_meter_cold' per l'ultimu ghjornu (tempu>= now() -24h).
  • Cumu l'aghju dettu, alcune voci pò esse mancanti da a sequenza homeassistant.month.water_meter_hour. Rigeneraremu questi dati eseguendu a dumanda cù GROUP BY time (1h). Questa volta, u riempimentu (precedente) hà da travaglià bè, generendu i dati mancanti (a funzione pigliarà u valore precedente)
  • A cosa più impurtante in questa dumanda hè a funzione di differenza, chì calculerà a diffarenza trà l'ora. Per ellu stessu, ùn funziona micca è esige una funzione di aggregazione. Chì questu sia u max () utilizatu prima.

U risultatu di l'esekzione pare cusì

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 72

Da 2 ore à 5 ore (UTC) ùn ci era micca cunsumu. Tuttavia, a dumanda restituverà u listessu valore di cunsumu grazia à riempimentu (previous), è a funzione di differenza sottrarà stu valore da ellu stessu è uttene 0 à l'output, chì hè veramente necessariu.

L'unica cosa chì resta da fà hè di custruisce un graficu. Per fà questu, apre Grafana, apre alcuni esistenti (o creanu un novu) dashboard, creanu un novu pannellu. I paràmetri di u graficu seranu i seguenti.

Smart Home: Charting Water and Electricity Consumption in Home Assistant

Puderaghju vede e dati d'acqua fredda è calda nantu à u listessu graficu. A dumanda hè esattamente listessa chì aghju descrittu sopra.

I paràmetri di visualizazione sò stabiliti cum'è seguita. Per mè, serà un graficu cù linee (line), chì và in passi (scala). U paràmetru Stack serà spiegatu quì sottu. Ci sò parechje opzioni di visualizazione più sottu, ma ùn sò micca cusì interessanti.

Smart Home: Charting Water and Electricity Consumption in Home Assistant

Per aghjunghje u graficu risultatu à l'assistente di casa, avete bisognu di:

  • esce da u modu di edizione di carta. Per una certa ragione, i paràmetri curretti di spartera di carta sò offerti solu da a pagina di u dashboard
  • Cliccate nantu à u triangulu accantu à u nome di u graficu, selezziunate sparte da u menù
  • In a finestra chì si apre, andate à a tabulazione incrusta
  • Uncheck time range current - stabiliremu u time range via URL
  • Sceglite u tema necessariu. In u mo casu, hè luce
  • Copia l'URL resultanti à a carta di paràmetri lovelace-UI

      - 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"

Per piacè nutate chì u intervalu di tempu (ultimi 2 ghjorni) hè stabilitu quì, è micca in i paràmetri di u dashboard.

U graficu pare cusì. Ùn aghju micca utilizatu l'acqua calda in l'ultimi ghjorni 2, cusì solu un graficu di l'acqua fridda hè tracciata.

Smart Home: Charting Water and Electricity Consumption in Home Assistant

Ùn aghju micca decisu per mè quale graficu mi piace più, una linea di passu, o veri bars. Dunque, daraghju solu un esempiu di un schedariu di cunsumu di ogni ghjornu, solu sta volta in bars. E dumande sò custruite in u listessu modu cum'è descrittu sopra. L'opzioni di visualizazione sò:

Smart Home: Charting Water and Electricity Consumption in Home Assistant

Stu graficu pare cusì:

Smart Home: Charting Water and Electricity Consumption in Home Assistant

Allora, circa u paràmetru Stack. In questu graficu, una barra d'acqua fridda hè tracciata nantu à una barra calda. L'altezza tutale currisponde à u cunsumu tutale di acqua fridda è calda per u periodu.

Tutti i grafici mostrati sò dinamichi. Pudete spustà u mouse nantu à u puntu di interessu è vede i dettagli è u valore in un puntu particulari.

Sfurtunatamente, ùn era micca senza un coppiu di mosca in l'unguentu. Nantu à un graficu di barre (cuntrariu di u gràficu cù linee di passi), a mità di a barra ùn hè micca in u mità di u ghjornu, ma à 00:00. Quelli. a mità manca di a barra hè disegnata in u locu di u ghjornu precedente. Allora i charts per u sabbatu è u dumenica sò disegnati un pocu à a manca di a zona bluish. Finu à avè capitu cumu per vince.

Un altru prublema hè l'incapacità di travaglià currettamente cù intervalli mensili. U fattu hè chì a durata di l'ora / ghjornu / settimana hè fissa, ma a durata di u mese hè diversa ogni volta. InfluxDB pò travaglià solu cù intervalli uguali. Finu a ora, u mo cervellu hè statu abbastanza per stabilisce un intervallu fissu di 30 ghjorni. Iè, u graficu flutterà un pocu durante l'annu è i bars ùn currispondenu micca esattamente à i mesi. Ma postu chì sta cosa hè interessante per mè cum'è un metru di visualizazione, sò bè ​​cù questu.

Aghju vistu almenu duie suluzioni:

  • Per puntuà nantu à i grafici mensili è limità à quelli settimanali. 52 bars settimanali in un annu sò abbastanza bè
  • Cunsiderate u cunsumu mensuale stessu cum'è u metudu N ° 2, è utilizate a grafana solu per belli grafici. Hè una suluzione abbastanza precisa. Pudete ancu overlay charts per l'annu passatu per paragunà - grafana pò fà questu.

cunchiusioni

Ùn sò micca perchè, ma mi piace stu tipu di grafici. Mostranu chì a vita hè in piena è tuttu cambia. Eri c'era assai, oghje ci hè pocu, dumane ci sarà un altru. Resta à travaglià cù e famiglie nantu à u tema di u cunsumu. Ma ancu cù l'appetite attuale, solu una figura grande è incomprensibile in u prugettu hè digià diventatu in una stampa abbastanza comprensibile di u cunsumu.

Malgradu a mo carriera di quasi 20 anni cum'è programatore, ùn aghju praticamente micca intersecu cù e basa di dati. Dunque, a stallazione di una basa di dati esterna pareva qualcosa di cusì astrusa è incomprensibile. Tuttu hè cambiatu l'articulu sopra - hè risultatu chì l'avvitamentu di un strumentu adattatu hè fattu in un paru di clicchi, è cù un strumentu specializatu, u compitu di plotting diventa un pocu più faciule.

In u titulu, aghju mintuatu u cunsumu di l'electricità. Sfurtunatamente, in u mumentu ùn possu micca furnisce alcun graficu. Un metru SDM120 hè mortu, è l'altru hè buggy quandu accede via Modbus. Tuttavia, questu ùn affetta micca u tema di questu articulu in ogni modu - i grafici seranu custruiti in u listessu modu per l'acqua.

In questu articulu, aghju datu quelli approcci chì aghju pruvatu à mè stessu. Di sicuru, ci sò altre manere di urganizà a cullizzioni è a visualizazione di dati chì ùn cunnosci micca. Parlami in i cumenti, seraghju assai interessatu. Seraghju cuntentu di critiche constructive è idee novi. Spergu chì u materiale sopra ancu aiutà à qualchissia.

Source: www.habr.com

Add a comment