Inteligentná domácnosť: V aplikácii Home Assistant vytvárame grafy spotreby vody a elektriny

Inteligentná domácnosť: V aplikácii Home Assistant vytvárame grafy spotreby vody a elektriny
Zakaždým, keď dostanem platbu za elektrinu a vodu, som prekvapený - naozaj moja rodina toľko spotrebuje? Áno, v kúpeľni je vyhrievaná podlaha a bojler, ale stále nepália oheň. Zdá sa, že šetríme aj vodu (hoci sa tiež radi čvachtáme v kúpeľni). Už pred niekoľkými rokmi pripojené vodomery и elektrina do inteligentnej domácnosti, ale tam sa veci zasekli. Až teraz sme sa dostali k analýze spotreby, o ktorej je vlastne tento článok.

Nedávno som prešiel na Home Assistant ako môj inteligentný domáci systém. Jedným z dôvodov bola práve možnosť organizovať zber veľkého množstva dát s možnosťou pohodlnej konštrukcie rôznych typov grafov.

Informácie opísané v tomto článku nie sú nové, všetky tieto veci pod rôznymi omáčkami už boli popísané na internete. Ale každý článok zvyčajne popisuje iba jeden prístup alebo aspekt. Všetky tieto prístupy som musel porovnať a sám vybrať ten najvhodnejší. Článok stále neposkytuje komplexné informácie o zbere dát, ale je akýmsi zhrnutím toho, ako som to urobil. Takže konštruktívna kritika a návrhy na zlepšenie sú vítané.

Vyhlásenie o probléme

Takže cieľom dnešného cvičenia je získať krásne grafy spotreby vody a elektriny:

  • Každú hodinu počas 2 dní
  • Denne po dobu 2 týždňov
  • (voliteľné) týždenne a mesačne

Sú s tým určité ťažkosti:

  • Štandardné komponenty grafu sú zvyčajne dosť slabé. V najlepšom prípade môžete vytvoriť čiarový graf bod po bode.

    Ak sa pozriete dostatočne pozorne, môžete nájsť komponenty tretích strán, ktoré rozširujú možnosti štandardného grafu. Pre domáceho asistenta je to v zásade dobrý a krásny komponent minigrafická karta, ale je tiež trochu obmedzený:

    • Je ťažké nastaviť parametre stĺpcového grafu vo veľkých intervaloch (šírka stĺpca sa nastavuje v zlomkoch hodiny, čo znamená, že intervaly dlhšie ako hodina budú nastavené v zlomkových číslach)
    • Do jedného grafu nemôžete pridávať rôzne entity (napríklad teplotu a vlhkosť alebo kombinovať stĺpcový graf s čiarou)
  • Nielenže domáci asistent v predvolenom nastavení používa najprimitívnejšiu databázu SQLite (a ja, domáci majster, som si s inštaláciou MySQL alebo Postgres neporadil), ale údaje sa neukladajú tým najoptimálnejším spôsobom. Takže napríklad vždy, keď zmeníte aj ten najmenší digitálny parameter parametra, do databázy sa zapíše obrovský súbor json s veľkosťou približne kilobajtu.
    {"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}}}

    Mám pomerne veľa senzorov (snímače teploty v každej miestnosti, vodomery a elektromery) a niektoré generujú aj dosť veľa údajov. Napríklad samotný elektromer SDM220 generuje každých 10-15 sekúnd asi tucet hodnôt a ja by som chcel takýchto meračov namontovať asi 8. Je tam aj kopa parametrov, ktoré sa počítajú na základe iných senzorov. To. všetky tieto hodnoty môžu ľahko nafúknuť databázu o 100-200 MB denne. Za týždeň sa systém ledva pohne a o mesiac umrie flash disk (v prípade typickej inštalácie domáceho asistenta na Raspberry PI) a ukladanie dát na celý rok neprichádza do úvahy.

  • Ak budete mať šťastie, váš merač dokáže počítať spotrebu sám. Kedykoľvek sa môžete obrátiť na merač a opýtať sa, kedy je naakumulovaná hodnota spotreby. Túto možnosť poskytujú spravidla všetky elektromery, ktoré majú digitálne rozhranie (RS232/RS485/Modbus/Zigbee).

    Horšie je, ak zariadenie dokáže jednoducho merať nejaký okamžitý parameter (napríklad okamžitý výkon alebo prúd), alebo jednoducho generovať impulzy každých X watthodín alebo litrov. Potom sa treba zamyslieť nad tým, ako a s čím to integrovať a kde akumulovať hodnotu. Existuje riziko zmeškania nasledujúcej správy z akéhokoľvek dôvodu a presnosť systému ako celku vyvoláva otázky. Toto všetko môžete samozrejme zveriť systému inteligentnej domácnosti, akým je domáci asistent, no nikto nezrušil bod o počte záznamov v databáze a nebude možné voliť senzory viac ako raz za sekundu (a obmedzenie architektúry domáceho asistenta).

Prístup 1

Najprv sa pozrime, čo domáci asistent ponúka hneď po vybalení. Meranie spotreby za určité obdobie je veľmi žiadaná funkcia. Samozrejme, že bol implementovaný už dávno vo forme špecializovaného komponentu - utility_meter.

Podstatou komponentu je, že interne vytvára premennú current_accumulated_value a po stanovenom období (hodina/týždeň/mesiac) ju resetuje. Komponent sám monitoruje vstupnú premennú (hodnotu nejakého snímača), prihlasuje sa k zmenám hodnoty - práve dostanete hotový výsledok. Táto vec je popísaná v niekoľkých riadkoch v konfiguračnom súbore

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

Tu sensor.water_meter_cold je aktuálna hodnota v litroch, ktorú dostávam priamo z kusu železa od mqtt. Dizajn vytvára 2 nové senzory water_cold_hour_um a water_cold_day_um, ktoré akumulujú hodinové a denné hodnoty a po uplynutí doby ich vynulujú. Tu je graf hodinovej batérie za pol dňa.

Inteligentná domácnosť: V aplikácii Home Assistant vytvárame grafy spotreby vody a elektriny

Kód pre hodinové a denné grafy pre lovelace-UI vyzerá takto:

      - 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

V skutočnosti problém tohto prístupu spočíva v tomto algoritme. Ako som už spomínal, pre každú vstupnú hodnotu (aktuálny stav merača pre každý ďalší liter) sa v databáze vygeneruje 1kb záznamov. Každý elektromer zároveň generuje novú hodnotu, ktorá sa tiež pripočítava k základu. Ak chcem zbierať hodinové/denné/týždenné/mesačné údaje a pre niekoľko stúpačiek vody a pridať balík elektromerov, bude to veľa údajov. Teda, presnejšie, dát nie je veľa, no keďže domáci asistent zapisuje do databázy kopu nepotrebných informácií, veľkosť databázy narastie míľovými krokmi. Veľkosť základne pre týždenné a mesačné grafy sa bojím čo i len odhadnúť.

Okrem toho samotný elektromer tento problém nerieši. Graf hodnôt generovaných elektromerom je monotónne rastúca funkcia, ktorá sa každú hodinu resetuje na 0. Potrebujeme pre používateľa zrozumiteľnú tabuľku spotreby, ktorá ukazuje, koľko litrov sa za dané obdobie spotrebovalo. Štandardný komponent histórie – graf to nedokáže, ale externý komponent mini grafickej karty nám môže pomôcť.

Toto je kód karty pre 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'

Okrem štandardných nastavení, ako je názov senzora, typ grafu, farba (nepáčila sa mi štandardná oranžová), je dôležité poznamenať 3 nastavenia:

  • group_by:hour — graf sa vygeneruje s pruhmi zarovnanými na začiatok hodiny
  • points_per_hour: 1 – jeden pruh za každú hodinu
  • A čo je najdôležitejšie, agregácia_funkcie: max - získajte maximálnu hodnotu v rámci každej hodiny. Práve tento parameter mení pílový graf na pruhy

Inteligentná domácnosť: V aplikácii Home Assistant vytvárame grafy spotreby vody a elektriny

Nevenujte pozornosť riadku stĺpcov naľavo - toto je štandardné správanie komponentu, ak neexistujú žiadne údaje. Neexistovali však žiadne údaje - len pred pár hodinami som zapol zber údajov z meračov energie len kvôli tomuto článku (súčasný prístup popíšem nižšie).

Na tomto obrázku som chcel ukázať, že niekedy funguje zobrazenie údajov a stĺpce skutočne odrážajú správne hodnoty. To však nie je všetko. Z nejakého dôvodu vybraný stĺpec pre obdobie od 11 do 12 hodín zobrazuje 19 litrov, aj keď na zubatom grafe o niečo vyššie za rovnaké obdobie z rovnakého snímača vidíme spotrebu 62 litrov. Buď je tam chyba, alebo sú ruky krivé. Stále však nerozumiem, prečo sa údaje vpravo odlomili - spotreba tam bola normálna, čo je viditeľné aj zo zubatého grafu.

Vo všeobecnosti som nebol schopný dosiahnuť vierohodnosť tohto prístupu - graf takmer vždy ukazuje nejaký druh herézy.

Podobný kód pre denný snímač.

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

Upozorňujeme, že parameter group_by je nastavený na interval a parameter points_per_hour riadi všetko. A v tom je ďalší problém s týmto komponentom - points_per_hour funguje dobre na grafoch s hodinou alebo menej, ale vo väčších intervaloch je nanič. Aby som teda dostal jeden stĺpec za jeden deň, musel som zadať hodnotu 1/24=0.04166666. O týždenných a mesačných grafoch ani nehovorím.

Prístup 2

Zatiaľ čo som stále pochopil domáceho asistenta, narazil som na toto video:

Prehrať video

Kamarát zbiera údaje o spotrebe z niekoľkých typov zásuviek Xiaomi. Jeho úloha je o niečo jednoduchšia – jednoducho zobraziť hodnotu spotreby za dnes, včera a za mesiac. Nevyžadujú sa žiadne plány.

Nechajme bokom diskusie o manuálnej integrácii hodnôt okamžitého výkonu – o „presnosti“ tohto prístupu som už písal vyššie. Nie je jasné, prečo nepoužil naakumulované hodnoty spotreby, ktoré už inkasuje tá istá predajňa. Podľa mňa bude lepšie fungovať integrácia vo vnútri hardvéru.

Z videa preberieme myšlienku manuálneho počítania spotreby za určité obdobie. Ten chlap počíta iba hodnoty za dnes a včera, ale pôjdeme ďalej a pokúsime sa nakresliť graf. Podstata navrhovanej metódy v mojom prípade je nasledovná.

Vytvorme si premennú value_at_the_beginning_of_hour, do ktorej budeme zaznamenávať aktuálne stavy meračov
Pomocou časovača vypočítame na konci hodiny (alebo na začiatku nasledujúcej) rozdiel medzi aktuálnou hodnotou a hodnotou uloženou na začiatku hodiny. Tento rozdiel bude spotreba za aktuálnu hodinu - hodnotu uložíme do snímača a v budúcnosti na základe tejto hodnoty zostavíme graf.
Musíte tiež „resetovať“ premennú value_at_beginning_of_hour tak, že tam napíšete aktuálnu hodnotu počítadla.

To všetko je možné vykonať prostredníctvom samotného domáceho asistenta.

Budete musieť napísať trochu viac kódu ako v predchádzajúcom prístupe. Najprv vytvorte tie isté „premenné“. Po vybalení nemáme „variabilnú“ entitu, ale môžeme využiť služby brokera mqtt. Budeme tam posielať hodnoty s príznakom keep=true – tým sa uloží hodnota vo vnútri brokera a dá sa odtiaľ kedykoľvek stiahnuť, aj keď sa domáci asistent reštartuje. Robil som hodinové a denné počítadlá naraz.

- 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

Všetky kúzla sa odohrávajú v automatizácii, ktorá beží každú hodinu a každú noc.

- 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

Obe automatizácie vykonávajú 2 akcie:

  • Vypočítajte hodnotu pre interval ako rozdiel medzi počiatočnou a koncovou hodnotou
  • Aktualizujte základnú hodnotu pre nasledujúci interval

Konštrukcia grafov je v tomto prípade riešená obvyklým grafom histórie:

      - 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

Vyzerá to takto:

Inteligentná domácnosť: V aplikácii Home Assistant vytvárame grafy spotreby vody a elektriny

V zásade je to už potrebné. Výhodou tejto metódy je, že údaje sa generujú raz za interval. Tie. iba 24 záznamov za deň pre hodinový graf.

Bohužiaľ to stále nerieši všeobecný problém rastúcej základne. Ak chcem mesačný graf spotreby, budem musieť uchovávať dáta aspoň rok. A keďže domáci asistent poskytuje iba jedno nastavenie dĺžky uloženia pre celú databázu, znamená to, že VŠETKY dáta v systéme budú musieť byť uložené celý rok. Napríklad za rok spotrebujem 200 kubických metrov vody, čo znamená, že to znamená 200000 XNUMX záznamov v databáze. A ak vezmete do úvahy ďalšie senzory, potom sa toto číslo stane všeobecne neslušným.

Prístup 3

Našťastie šikovní ľudia už tento problém vyriešili napísaním databázy InfluxDB. Táto databáza je špeciálne optimalizovaná na ukladanie údajov založených na čase a je ideálna na ukladanie hodnôt rôznych senzorov. Systém tiež poskytuje dotazovací jazyk podobný SQL, ktorý vám umožňuje extrahovať hodnoty z databázy a potom ich rôznymi spôsobmi agregovať. Nakoniec, rôzne údaje môžu byť uložené na rôzne časy. Napríklad často sa meniace namerané hodnoty, ako je teplota alebo vlhkosť, môžu byť uložené len niekoľko týždňov, zatiaľ čo denné údaje o spotrebe vody môžu byť uložené na celý rok.

Okrem InfluxDB vynašli chytrí ľudia aj Grafana, systém na kreslenie grafov na základe údajov z InfluxDB. Grafana dokáže kresliť rôzne typy grafov, detailne ich prispôsobovať, a čo je najdôležitejšie, tieto grafy je možné „zastrčiť“ do domáceho asistenta lovelace-UI.

Dostať inšpiráciu tu и tu. Články podrobne popisujú proces inštalácie a pripojenia InfluxDB a Grafana k domácemu asistentovi. Zameriam sa na riešenie môjho konkrétneho problému.

Takže najprv začnime pridávať hodnotu počítadla v influxDB. Kúsok konfigurácie domáceho asistenta (v tomto príklade sa budem baviť nielen so studenou, ale aj horúcou vodou):

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

Zakážme ukladanie rovnakých údajov do internej databázy domáceho asistenta, aby sme ich znova nenafúkli:

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

Poďme teraz do konzoly InfluxDB a nakonfigurujeme našu databázu. Predovšetkým je potrebné nakonfigurovať, ako dlho budú určité údaje uložené. Toto upravuje tzv. politika uchovávania – je podobná databázam v rámci hlavnej databázy, pričom každá interná databáza má svoje vlastné nastavenia. V predvolenom nastavení sú všetky údaje uložené v zásade uchovávania nazývanej autogén; tieto údaje budú uložené týždeň. Chcel by som, aby sa hodinové údaje uchovávali mesiac, týždenné údaje rok a mesačné údaje sa nikdy nevymazali. Vytvorme vhodnú politiku uchovávania

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

Teraz je v skutočnosti hlavným trikom agregácia údajov pomocou nepretržitého dopytovania. Toto je mechanizmus, ktorý automaticky spúšťa dotaz v určených intervaloch, agreguje údaje pre tento dotaz a pridáva výsledok do novej hodnoty. Pozrime sa na príklad (píšem do stĺpca kvôli čitateľnosti, ale v skutočnosti som musel zadať tento príkaz v jednom riadku)

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

Tento príkaz:

  • V databáze domáceho asistenta vytvorí súvislý dotaz s názvom cq_water_cold_hourly
  • Požiadavka sa vykoná každú hodinu (čas (1h))
  • Požiadavka zoškrabe všetky údaje z merania' homeassistant.autogen.l (litre), vrátane hodnôt studenej a teplej vody
  • Agregované údaje budú zoskupené podľa entity_id, čo nám poskytne samostatné hodnoty pre studenú a teplú vodu
  • Keďže počítadlo litrov je monotónne rastúca sekvencia v rámci každej hodiny, bude potrebné vziať maximálnu hodnotu, takže agregáciu vykoná funkcia max(hodnota)
  • Nová hodnota sa zapíše do homeassistant.month.water_meter_hour, kde mesiac je názov politiky uchovávania s dobou uchovávania jeden mesiac. Údaje o studenej a teplej vode budú navyše rozdelené do samostatných záznamov so zodpovedajúcim identifikátorom entity a hodnotou v poli hodnoty

V noci alebo keď nikto nie je doma, nedochádza k spotrebe vody, a preto nie sú v homeassistant.autogen.l žiadne nové položky. Aby ste sa vyhli chýbajúcim hodnotám v bežných dopytoch, môžete použiť výplň (predchádzajúca). To prinúti InfluxDB použiť hodnotu poslednej hodiny.

Žiaľ, súvislé dopytovanie má jednu zvláštnosť: vyplňovací (predchádzajúci) trik nefunguje a záznamy sa jednoducho nevytvárajú. Navyše ide o nejaký neprekonateľný problém sa diskutuje už niekoľko rokov. Týmto problémom sa budeme zaoberať neskôr, ale nech je fill(previous) v súvislom dotaze - neprekáža.

Pozrime sa, čo sa stalo (samozrejme, musíte počkať niekoľko hodín):

> 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

Všimnite si, že hodnoty v databáze sú uložené v UTC, takže tento zoznam sa líši o 3 hodiny - hodnoty o 7:10 vo výstupe InfluxDB zodpovedajú hodnotám o 2:5 v grafoch vyššie. Všimnite si tiež, že medzi XNUMX. a XNUMX. hodinou ráno jednoducho neexistujú žiadne záznamy – ide o rovnakú funkciu nepretržitého dopytovania.

Ako vidíte, agregovaná hodnota je tiež monotónne rastúca sekvencia, iba záznamy sa vyskytujú menej často - raz za hodinu. Ale to nie je problém - môžeme napísať ďalší dotaz, ktorý načíta správne údaje pre graf.

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)

rozlúštim:

  • Z databázy homeassistant.month.water_meter_hour vytiahneme údaje pre entity_id='water_meter_cold' za posledný deň (čas >= now() -24h).
  • Ako som už spomenul, niektoré položky môžu chýbať v sekvencii homeassistant.month.water_meter_hour. Tieto údaje vygenerujeme spustením dotazu s časom GROUP BY (1h). Táto časová výplň (predchádzajúca) bude fungovať podľa očakávania a vygeneruje chýbajúce údaje (funkcia bude mať predchádzajúcu hodnotu)
  • Najdôležitejšia vec v tejto požiadavke je rozdielová funkcia, ktorá vypočíta rozdiel medzi hodinovými známkami. Nepracuje sám osebe a vyžaduje agregačnú funkciu. Nech je to max() použitá predtým.

Výsledok vykonania vyzerá takto

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

Od 2. do 5. hodiny rannej (UTC) nebola spotreba. Napriek tomu dotaz vráti rovnakú hodnotu spotreby vďaka fill(previous) a rozdielová funkcia túto hodnotu od seba odpočíta a výstupom bude 0, čo je presne to, čo sa požaduje.

Zostáva len zostaviť graf. Ak to chcete urobiť, otvorte Grafana, otvorte nejaký existujúci (alebo vytvorte nový) informačný panel a vytvorte nový panel. Nastavenia grafu budú takéto.

Inteligentná domácnosť: V aplikácii Home Assistant vytvárame grafy spotreby vody a elektriny

Údaje o studenej a teplej vode zobrazím na rovnakom grafe. Požiadavka je presne taká, ako som opísal vyššie.

Parametre zobrazenia sa nastavujú nasledovne. Pre mňa to bude graf s čiarami, ktorý ide v krokoch (schodoch). Parameter Stack vysvetlím nižšie. Nižšie je niekoľko ďalších možností zobrazenia, ale nie sú také zaujímavé.

Inteligentná domácnosť: V aplikácii Home Assistant vytvárame grafy spotreby vody a elektriny

Ak chcete pridať výsledný graf do domáceho asistenta, musíte:

  • ukončiť režim úpravy grafu. Z nejakého dôvodu sú správne nastavenia zdieľania grafu ponúkané iba zo stránky dashboardu
  • Kliknite na trojuholník vedľa názvu grafu a z ponuky vyberte možnosť zdieľať
  • V okne, ktoré sa otvorí, prejdite na kartu vložiť
  • Odškrtnite aktuálny časový rozsah – časový rozsah nastavíme cez URL
  • Vyberte požadovanú tému. V mojom prípade je to svetlo
  • Skopírujte výslednú adresu URL na kartu nastavení 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"

Upozorňujeme, že časový rozsah (posledné 2 dni) sa nastavuje tu a nie v nastaveniach hlavného panela.

Graf vyzerá takto. Posledné 2 dni som nepoužil horúcu vodu, takže je nakreslený iba graf studenej vody.

Inteligentná domácnosť: V aplikácii Home Assistant vytvárame grafy spotreby vody a elektriny

Stále som sa sám nerozhodol, ktorý graf sa mi páči viac, čiarový krok alebo skutočné pruhy. Preto uvediem jednoducho príklad grafu dennej spotreby, len tentoraz v pruhoch. Dotazy sú zostavené podobne ako tie, ktoré sú opísané vyššie. Možnosti zobrazenia sú:

Inteligentná domácnosť: V aplikácii Home Assistant vytvárame grafy spotreby vody a elektriny

Tento graf vyzerá takto:

Inteligentná domácnosť: V aplikácii Home Assistant vytvárame grafy spotreby vody a elektriny

Takže o parametri Stack. V tomto grafe je stĺpec studenej vody nakreslený nad stĺpcom horúcej vody. Celková výška zodpovedá celkovej spotrebe studenej a teplej vody za dané obdobie.

Všetky zobrazené grafy sú dynamické. Môžete umiestniť kurzor myši na bod záujmu a zobraziť podrobnosti a hodnotu v konkrétnom bode.

Žiaľ, pár mušiek tam bolo. Na stĺpcovom grafe (na rozdiel od grafu s krokovými čiarami) nie je stred stĺpca uprostred dňa, ale o 00:00. Tie. ľavá polovica stĺpca je nakreslená namiesto predchádzajúceho dňa. Takže grafy pre sobotu a nedeľu sú nakreslené mierne naľavo od modrastej zóny. Kým som neprišiel na to, ako to poraziť.

Ďalším problémom je neschopnosť správne pracovať v mesačných intervaloch. Faktom je, že dĺžka hodiny/dňa/týždňa je pevná, no dĺžka mesiaca je zakaždým iná. InfluxDB môže pracovať iba v rovnakých intervaloch. Doteraz môj mozog stačil na to, aby som si nastavil pevný interval 30 dní. Áno, graf bude počas roka trochu plávať a stĺpce nebudú presne zodpovedať mesiacom. Ale keďže ma táto vec zaujíma jednoducho ako merač displeja, som s tým v poriadku.

Vidím minimálne dve riešenia:

  • Vzdajte sa mesačných grafov a obmedzte sa na týždenné. 52 týždenných barov za rok vyzerá celkom dobre
  • Samotnú mesačnú spotrebu považujte za metódu č.2 a grafana používajte len na krásne grafy. Bude to celkom presné riešenie. Pre porovnanie si môžete dokonca prekryť grafy za uplynulý rok – to dokáže aj grafana.

Záver

Neviem prečo, ale som posadnutý týmito druhmi grafov. Ukazujú, že život je v plnom prúde a všetko sa mení. Včera toho bolo veľa, dnes málo, zajtra to bude niečo iné. Ostáva už len pracovať s členmi domácnosti na téme spotreby. Ale aj pri súčasných chúťkach sa už len veľká a nepochopiteľná cifra na výplatnom lístku mení na celkom zrozumiteľný obraz spotreby.

Napriek takmer 20-ročnej kariére programátora som nemal prakticky žiadny kontakt s databázami. Inštalácia externej databázy sa preto javila ako niečo také nezrozumiteľné a nepochopiteľné. Všetko zmenil vyššie uvedený článok — Ukázalo sa, že pripojenie vhodného nástroja sa vykonáva niekoľkými kliknutiami a so špecializovaným nástrojom je úloha vykresľovania grafov o niečo jednoduchšia.

V nadpise som spomenul spotrebu el. Bohužiaľ, momentálne nemôžem poskytnúť žiadne grafy. Jeden merač SDM120 mi zomrel a druhý je chybný pri prístupe cez Modbus. To však nijako neovplyvňuje tému tohto článku – grafy budú konštruované rovnako ako pre vodu.

V tomto článku som predstavil prístupy, ktoré som sám vyskúšal. Určite existujú nejaké iné spôsoby, ako organizovať zber údajov a vizualizáciu, o ktorých neviem. Povedzte mi o tom v komentároch, veľmi ma to zaujíma. Budem rád za konštruktívnu kritiku a nové nápady. Dúfam, že aj prezentovaný materiál niekomu pomôže.

Zdroj: hab.com

Kúpte si spoľahlivý hosting pre stránky s DDoS ochranou, VPS VDS servery 🔥 Kúpte si spoľahlivý webhosting s ochranou DDoS, VPS VDS servery | ProHoster