Shtëpia e mençur: Ndërtojmë grafikët e konsumit të ujit dhe energjisë elektrike në Home Assistant

Shtëpia e mençur: Ndërtojmë grafikët e konsumit të ujit dhe energjisë elektrike në Home Assistant
Çdo herĂ« qĂ« merr faturĂ«n pĂ«r elektricitetin dhe ujĂ«, çuditem - vallĂ«, familja ime konsumon kaq shumĂ«? Po, nĂ« banjĂ« kemi ngrohje tĂ« dyshemesĂ« dhe njĂ« bojler, por ato nuk punojnĂ« nonstop. Edhe pĂ«r ujĂ« duket se e kursejmĂ« (pavarĂ«sisht se na pĂ«lqen tĂ« bĂ«jmĂ« njĂ« banjĂ«). Para disa vitesh, kam instaluar matĂ«sit e ujit dhe elektricitetit nĂ« shtĂ«pinĂ« time inteligjente, por puna ndaloi atje. Analiza e konsumit arriti vetĂ«m tani, pĂ«r tĂ« cilĂ«n, nĂ« fakt, Ă«shtĂ« kjo artikull.

Së fundmi kam kaluar në Home Assistant si sistemin tim të shtëpisë inteligjente. Një nga arsyet ishte pikërisht mundësia për të organizuar mbledhjen e një sasie të madhe të të dhënave me mundësinë e ndërtimit të grafikeve të ndryshme.

Informacioni i përshkruar në këtë artikull nuk është i ri, të gjitha këto gjëra në forma të ndryshme janë përshkruar tashmë në internet. Por çdo artikull, në përgjithësi, përshkruan vetëm një qasje ose aspekt. Krahasimi i të gjitha këtyre qasjeve dhe zgjedhja e më të përshtatshmes është detyra ime. Artikulli gjithsesi nuk ofron informacion të plotë mbi mbledhjen e të dhënave, por është një lloj përmbledhjeje të asaj që kam bërë. Pra, kritika konstruktive dhe propozime për përmirësim janë të mirëpritura.

Vendosja e detyrës

Prandaj, qëllimi i ushtrimit të sotëm është të merret grafika e bukur e konsumit të ujit dhe energjisë elektrike:

  • PĂ«r çdo orĂ« gjatĂ« 2 ditĂ«ve
  • PĂ«r çdo ditĂ« gjatĂ« 2 javĂ«ve
  • (opsionale) pĂ«r çdo javĂ« dhe pĂ«r çdo muaj

Në këtë na presin disa vështirësi:

  • KomponentĂ«t standardĂ« tĂ« grafikĂ«ve, nĂ« pĂ«rgjithĂ«si, janĂ« mjaft tĂ« varfĂ«r. NĂ« rastin mĂ« tĂ« mirĂ«, mund tĂ« ndĂ«rtohet njĂ« grafik linear mbi pika.

    Nëse kërkoni mirë, mund të gjeni komponentë të jashtëm që zgjasin mundësitë e grafikëve standardë. Për home assistant, në thelb, është një komponent i mirë dhe i bukur mini-graph-card, por edhe ai është disi i kufizuar:

    • ËshtĂ« e vĂ«shtirĂ« tĂ« vendosĂ«sh parametrat e grafikĂ«ve me kolona nĂ« intervale tĂ« mĂ«dha (gjerĂ«sia e kolonave vendoset nĂ« pjesĂ« orĂ«sh, qĂ« do tĂ« thotĂ« se intervalet mĂ« tĂ« gjata se njĂ« orĂ« do tĂ« vendosen si numra decimalĂ«)
    • Nuk mund tĂ« shtosh entitete tĂ« ndryshme nĂ« njĂ« grafik (p.sh. temperaturĂ«n dhe lagĂ«shtinĂ«, ose tĂ« kombinosh grafikun me kolona me njĂ« vijĂ«)
  • Jo vetĂ«m qĂ« Home Assistant pĂ«r default pĂ«rdor bazĂ«n e tĂ« dhĂ«nave mĂ« primitive SQLite (dhe unĂ«, i pafuqishĂ«m, nuk arrita tĂ« instaloja MySQL ose Postgres), por edhe tĂ« dhĂ«nat ruhen nĂ« njĂ« mĂ«nyrĂ« qĂ« nuk Ă«shtĂ« optimale. PĂ«r shembull, me çdo ndryshim tĂ« çdo parametri edhe mĂ« tĂ« vogĂ«l nĂ« numra, nĂ« bazĂ« shkruhet njĂ« JSON i madh me njĂ« madhĂ«si prej rreth kilobajtĂ«sh.
    {"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}}}

    Kam kam shumë sensorë (sensorë temperaturës në çdo dhomë, matës uji dhe elektriciteti), dhe disa madje gjenerojnë shumë të dhëna. Për shembull, vetëm matësi i elektricitetit SDM220 gjeneron rreth një duzinë vlerash çdo 10-15 sekonda, dhe unë do të doja të instaloj rreth 8 prej këtyre matësve. Gjithashtu ka një grup të madh parametrash që llogariten në bazë të sensorëve të tjerë. Të gjitha këto vlera lehtësisht mund ta fryjnë bazën e të dhënave me 100-200 MB çdo ditë. Pas një jave, sistemi do të ketë vështirësi të funksionojë, dhe pas një muaji, plaka USB do të dështojë (në rastin e instalimit tipik të home assistant në raspberry PI), dhe nuk bëhet fjalë për ruajtjen e të dhënave për një vit të tërë.

  • NĂ«se keni fat, matĂ«si juaj mund tĂ« llogarisĂ« vetĂ« konsumimin. NĂ« çdo moment mund tĂ« drejtoheni te matĂ«si dhe tĂ« pyesni se cila Ă«shtĂ« vlera akumuluese e konsumit. NĂ« pĂ«rgjithĂ«si, tĂ« gjithĂ« matĂ«sit e energjisĂ« elektrike qĂ« kanĂ« njĂ« ndĂ«rfaqe digjitale (RS232/RS485/Modbus/Zigbee) ofrojnĂ« njĂ« mundĂ«si tĂ« tillĂ«.

    ËshtĂ« mĂ« keq nĂ«se pajisja mund thjesht tĂ« masĂ« njĂ« parametĂ«r tĂ« menjĂ«hershĂ«m (p.sh., fuqinĂ« ose rrymĂ«n e menjĂ«hershme), ose thjesht tĂ« gjenerojĂ« impulset çdo X vat-orĂ« ose litra. AtĂ«herĂ« duhet tĂ« mendojmĂ« se si dhe me çfarĂ« ta integrojmĂ« dhe ku ta ruajmĂ« vlerĂ«n. Ka rrezik tĂ« humbasim raportin e radhĂ«s pĂ«r ndonjĂ« arsye, madje dhe saktesia e sistemit nĂ« tĂ«rĂ«si ngre pyetje. Sigurisht, mund ta ngarkojmĂ« tĂ«rĂ« kĂ«tĂ« sistemit tĂ« shtĂ«pisĂ« inteligjente si home assistant, por pika mbi numrin e regjistrimeve nĂ« bazĂ« nuk Ă«shtĂ« anuluar, dhe as nuk do tĂ« arrijmĂ« tĂ« anketojmĂ« sensorĂ«t mĂ« shpesh se njĂ« herĂ« nĂ« sekondĂ« (kufizimi i arkitekturĂ«s sĂ« home assistant).

Qasja 1

SĂ« pari, le tĂ« shohim se çfarĂ« ofron home assistant direkt. Matja e konsumit pĂ«r njĂ« periudhĂ« — Ă«shtĂ« njĂ« funksionalitet shumĂ« i kĂ«rkuar. Sigurisht, kjo Ă«shtĂ« realizuar prej kohĂ«sh nĂ« formĂ«n e njĂ« komponente tĂ« specializuar — utility_meter.

The essence of the component is that it internally initializes a variable called current_accumulated_value, and resets it after a specified period (hour/week/month). The component independently monitors the input variable (value from some sensor), subscribes to changes in the value itself — you simply receive the final result. This is described in just a few lines in the configuration file.

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

Here, sensor.water_meter_cold is the current value of the meter in liters, which I receive. directly from the device. via mqtt. The structure creates two new sensors water_cold_hour_um and water_cold_day_um, which accumulate hourly and daily readings, resetting them at the end of the period. Here’s the hourly accumulator graph for half a day.

Shtëpia e mençur: Ndërtojmë grafikët e konsumit të ujit dhe energjisë elektrike në Home Assistant

The code for the hourly and daily graphs for the lovelace-UI looks like this:

      - 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

NĂ« kĂ«tĂ« algoritĂ«m qĂ«ndron problemi i kĂ«tij qasje. Siç e pĂ«rmenda, pĂ«r çdo vlerĂ« hyrĂ«se (leximi aktual i matĂ«sit pĂ«r çdo litĂ«r tĂ« ardhshĂ«m) gjenerohet 1 kB regjistrimi nĂ« bazĂ«. Çdo matĂ«s gjithashtu gjeneron njĂ« vlerĂ« tĂ« re qĂ« gjithashtu regjistrohet nĂ« bazĂ«. NĂ«se dua tĂ« mbledh lexime orĂ«she / ditorĂ« / javore / mujore, po pĂ«r disa matĂ«s pĂ«r ujin, dhe gjithashtu tĂ« shtoj njĂ« paketĂ« matĂ«sish tĂ« energjisĂ« elektrike - do tĂ« jetĂ« shumĂ« tĂ« dhĂ«na. NĂ« tĂ« vĂ«rtetĂ«, tĂ« dhĂ«nat nuk janĂ« shumĂ«, por pasi home assistant shkruan nĂ« bazĂ« shumĂ« informacion tĂ« panevojshĂ«m, madhĂ«sia e bazĂ«s do tĂ« rritet si maja e drogĂ«s. Frikohem tĂ« bĂ«j llogaritjet pĂ«r madhĂ«sinĂ« e bazĂ«s pĂ«r grafikĂ«t javore dhe mujore.

Përveç kësaj, utility meter vetë nuk zgjidh problemin e caktuar. Grafiku i vlerave që jep utility meter është një funksion monotonik në rritje, i cili reset gabimin në 0 çdo orë. Na nevojitet një grafik i qartë për përdoruesin se sa litra janë konsumuar gjatë një periudhe. Komponenti standard history-graph nuk e bën këtë, por një komponent i jashtëm mini-graph-card mund të na ndihmojë.

Ky është kodi i kartës për lovelace-UI:

      - aggregate_func: max
        entities:
          - color: var(--primary-color)
            entity: sensor.water_cold_hour_um
        group_by: hour
        hours_to_show: 48
        name: "Konsumimi orar i ujit i agreguar nga matësi i utilitetit"
        points_per_hour: 1
        show:
          graph: bar
        type: 'custom:mini-graph-card'

Përveç cilësimeve standarde si emri i sensorit, lloji i grafikut, ngjyra (portokalli standard nuk më pëlqeu), është e rëndësishme të theksohen 3 cilësime:

  • group_by:hour — grafiku do tĂ« gjenerohet me rreshtimin e kolonave nĂ« fillim tĂ« orĂ«s
  • points_per_hour: 1 — njĂ« kolone pĂ«r çdo orĂ«
  • Dhe mĂ« e rĂ«ndĂ«sishmja, aggregate_func: max — tĂ« merret vlera maksimale brenda çdo ore. Ky parametĂ«r e kthen grafikun zigzag nĂ« kolona.

Shtëpia e mençur: Ndërtojmë grafikët e konsumit të ujit dhe energjisë elektrike në Home Assistant

Mos u shqetĂ«soni pĂ«r disa kolona nĂ« tĂ« majtĂ« — kjo Ă«shtĂ« sjellja standarde e komponentit nĂ«se nuk ka tĂ« dhĂ«na. Dhe nuk kishte tĂ« dhĂ«na — aktivizova mbledhjen e tĂ« dhĂ«nave pĂ«r matĂ«sin e utilitetit vetĂ«m pĂ«r kĂ«tĂ« artikull (qasja ime aktuale do ta diskutoj pak mĂ« poshtĂ«).

NĂ« kĂ«tĂ« imazh doja tĂ« tregoja se ndonjĂ«herĂ« shfaqja e tĂ« dhĂ«nave funksionon, dhe kolonat vĂ«rtet reflektojnĂ« vlera tĂ« sakta. Por jo tĂ« gjitha. Kolona e veçantĂ« pĂ«r intervalin nga 11 deri nĂ« 12 tĂ« mĂ«ngjesit pĂ«r çfarĂ«do arsye tregon 19 litra, ndĂ«rsa nĂ« grafikun me dhĂ«mbĂ« pak mĂ« lart pĂ«r kĂ«tĂ« periudhĂ« nga i njĂ«jti sensor shohim konsumimin prej 62 litrave. Ose Ă«shtĂ« njĂ« gabim, ose ka diçka tĂ« keqe me konfigurimin. Sa i pĂ«rket pse tĂ« dhĂ«nat nĂ« anĂ«n e djathtĂ« mungojnĂ«, nuk e kam kuptuar ende — konsumimi atje ishte normal, gjĂ« qĂ« Ă«shtĂ« e dukshme edhe nga grafiku me dhĂ«mbĂ«.

NĂ« pĂ«rgjithĂ«si, nuk arrita tĂ« arrij besueshmĂ«rinĂ« e kĂ«tij qasje — grafiku pothuajse gjithmonĂ« tregon ndonjĂ« gjĂ« tĂ« çuditshme.

Kodi i ngjashëm për sensorin ditor.

      - aggregate_func: max
        entities:
          - color: var(--primary-color)
            entity: sensor.water_cold_day_um
        group_by: interval
        hours_to_show: 360
        name: "Konsumi ditor i ujit i agreguar nga një matës utilitar"
        points_per_hour: 0.0416666666
        show:
          graph: bar
        type: 'custom:mini-graph-card'

VĂ«reni se qĂ« parameteri group_by Ă«shtĂ« vendosur nĂ« vlerĂ«n interval, dhe rregullon tĂ« gjithĂ« parametrin points_per_hour. Kjo Ă«shtĂ« njĂ« tjetĂ«r problem i kĂ«tij komponenti — points_per_hour funksionon mirĂ« nĂ« grafikĂ«t pĂ«r njĂ« orĂ« ose mĂ« pak, por keq pĂ«r periudha mĂ« tĂ« gjata. PĂ«r tĂ« marrĂ« njĂ« kolonĂ« pĂ«r njĂ« ditĂ«, duhej tĂ« shkruaja vlerĂ«n 1/24=0.04166666. Nuk po flas pĂ«r grafikĂ«t javore dhe mujore.

Qasja 2

Duke u njohur me home assistant, kam hasur këtë video:

Luaj videon

Shoku mbledh tĂ« dhĂ«nat e konsumit nga disa lloje prizash Xiaomi. Detyra e tij Ă«shtĂ« pak mĂ« e thjeshtĂ« — thjesht tĂ« tregojĂ« vlerĂ«n e konsumit pĂ«r sot, dje dhe pĂ«r muajin. Nuk kĂ«rkohen grafikĂ«.

Do ta lĂ«mĂ« mĂ«njanĂ« diskutimin mbi integimin manual tĂ« vlerave momentale tĂ« fuqisĂ« — mbi 'saktĂ«sinĂ«' e kĂ«tij qasjeje kam shkruar mĂ« sipĂ«r. Nuk Ă«shtĂ« e qartĂ« pse ai nuk pĂ«rdori vlerat akumuluese tĂ« konsumit, tĂ« cilat tashmĂ« mblidhen nga e njĂ«jta prizĂ«. NĂ« opinonin tim, integimi brenda pajisjes do tĂ« punojĂ« mĂ« mirĂ«.

Nga video do të marrim idenë e numërimit manual të konsumit për një periudhë. Fakti që llogariten vetëm vlerat për sot dhe dje është një fillim, por ne do të shkojmë më tej dhe do të përpiqemi të vizatojmë një grafik. Thelbi i metodës së propozuar në rastin tim përfshin këtë.

Do të krijojmë një variabël vlera_në_fillim_të_orës, në të cilin do të regjistrojmë leximet aktuale të matësit.
NĂ« fund tĂ« orĂ«s (ose nĂ« fillim tĂ« ardhshme), do tĂ« llogarisim diferencĂ«n midis leximit aktual dhe atij tĂ« regjistruar nĂ« fillim tĂ« orĂ«s. Kjo diferencĂ« do tĂ« jetĂ« konsumimi pĂ«r orĂ«n aktuale — do ta ruajmĂ« kĂ«tĂ« vlerĂ« nĂ« sensor dhe nĂ« tĂ« ardhmen do tĂ« ndĂ«rtojmĂ« grafikun pĂ«r kĂ«tĂ« vlerĂ«.
Gjithashtu, nevojitet që të "zerojmë" variablin vlera_në_fillim_të_orës duke regjistruar aty vlerën aktuale të matësit.

E gjithë kjo mund të bëhet përmes mjeteve të vetë home assistant.

Do t'nahet mĂ« shumĂ« kod se nĂ« qasjen e mĂ«parshme. Fillimisht do tĂ« krijojmĂ« kĂ«to “variabla”. Nga kutia nuk kemi njĂ« entitet “variabĂ«l”, por mund tĂ« shfrytĂ«zojmĂ« shĂ«rbimet e brokerit mqtt. Do tĂ« dĂ«rgojmĂ« atje vlera me flagun retain=true — kjo do ta ruajĂ« vlerĂ«n brenda brokerit, dhe mund ta nxjerrim nĂ« çdo moment, edhe pas rinisjes sĂ« home assistant. Kam bĂ«rĂ« menjĂ«herĂ« numĂ«ruesit orarĂ« dhe ditorĂ«.

- 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

E gjithë magia ndodh në automatizimin, i cili aktivizohet çdo orë dhe çdo natë përkatësisht.

- 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

Të dy automatikat kryejnë 2 veprime:

  • Llogarisin vlerĂ«n pĂ«r intervalin si diferencĂ« midis vlerĂ«s fillestare dhe asaj pĂ«rfundimtare
  • PĂ«rditĂ«sojnĂ« vlerĂ«n bazĂ« pĂ«r intervalin tjetĂ«r

Ndërtimi i grafikëve në këtë rast zgjidhet me një history-graph të zakonshëm:

      - 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

Duket kështu:

Shtëpia e mençur: Ndërtojmë grafikët e konsumit të ujit dhe energjisë elektrike në Home Assistant

Në princip, kjo është ajo që nevojitet. Avantazhi i këtij metode është se të dhënat gjenerohen një herë për intervalin. Pra, gjithsej 24 regjistrime për ditë për grafikun orar.

Fatkeqësisht, kjo nuk zgjidh problemin e përgjithshëm të rritjes së bazës. Nëse dua një grafik të konsumit mujor, do të duhet të ruaj të dhënat për të paktën një vit. Dhe pasi që home assistant ofron vetëm një cilësim të kohëzgjatjes së ruajtjes për të gjithë bazën, kjo do të thotë që të DHENAT e GJITHA në sistem do të duhet të ruhen për një vit. Për shembull, për një vit konsumoj 200 metra kub ujë, kjo do të thotë 200000 regjistrime në bazë. E nëse marrim parasysh edhe sensorët e tjerë, numri bëhet vërtet i papëlqyeshëm.

Qasja 3

Fatmirësisht, njerëzit e mençur kanë zgjidhur këtë problem duke shkruar bazën e të dhënave InfluxDB. Kjo bazë është optimizuar posaçërisht për ruajtjen e të dhënave të bazuara në kohë dhe është ideale për ruajtjen e vlerave të sensorëve të ndryshëm. Sistemi gjithashtu ofron një gjuhë kërkimesh të ngjashme me SQL, e cila lejon nxjerrjen e vlerave nga baza dhe më pas agregimin e tyre në mënyra të ndryshme. Së fundi, të dhënat e ndryshme mund të ruhen për kohë të ndryshme. Për shembull, leximet që ndihen shpesh si temperatura apo lagështira mund të ruhen për vetëm disa javë, ndërsa leximet ditore të konsumit të ujit mund të ruhen për një vit tërë.

PĂ«rveç InfluxDB, njerĂ«z tĂ« mençur gjithashtu shpikĂ«n Grafana — njĂ« sistem pĂ«r vizatimin e grafikĂ«ve nga tĂ« dhĂ«nat e InfluxDB. Grafana mund tĂ« vizatojĂ« lloje tĂ« ndryshme grafikĂ«sh, t’i personalizojĂ« ato nĂ« detaje dhe, mĂ« e rĂ«ndĂ«sishmja, kĂ«ta grafikĂ« mund tĂ« “integrohen” nĂ« lovelace-UI tĂ« asistentit tĂ« shtĂ«pisĂ«.

Të frymëzohesh këtu dhe këtu. Artikujt përshkruajnë në detaje procesin e instalimit dhe lidhjes së InfluxDB dhe Grafana me asistentin e shtëpisë. Unë do të përqendrohem në zgjidhjen e detyrës sime specifike.

Pra, gjëja e parë është të fillojmë me ruajtjen e vlerës së numëruesit në influxDB. Një pjesë e konfigurimit të asistentit të shtëpisë (në këtë shembull do të argëtohem jo vetëm me ujë të ftohtë, por edhe me ujë të ngrohtë):

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

Do të çaktivizojmë ruajtjen e këtyre të dhënave në bazën e të dhënave të brendshme të asistentit të shtëpisë, për të mos e fryrë atë pa nevojë:

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

Tani tani kalojmĂ« nĂ« konsolĂ«n InfluxDB dhe konfigurojmĂ« bazĂ«n tonĂ«. NĂ« veçanti, duhet tĂ« pĂ«rcaktojmĂ« sa kohĂ« do tĂ« ruhen tĂ« dhĂ«nat e ndryshme. Kjo rregullohet nga politika e ruajtjes e njohur si retention policy — kjo Ă«shtĂ« si bazat e tĂ« dhĂ«nave brenda njĂ« baze tĂ« dhĂ«nash kryesore, ku çdo bazĂ« e brendshme ka parametrat e saj tĂ« konfiguruar. NĂ« mĂ«nyrĂ« tĂ« paracaktuar, tĂ« gjitha tĂ« dhĂ«nat vendosen nĂ« retention policy me emrin autogen, kĂ«to tĂ« dhĂ«na do tĂ« ruhen pĂ«r njĂ« javĂ«. Do tĂ« doja qĂ« tĂ« dhĂ«nat pĂ«r orĂ«t tĂ« ruhen pĂ«r njĂ« muaj, ato javore pĂ«r njĂ« vit dhe ato mujore tĂ« mos fshihen kurrĂ«. TĂ« krijojmĂ« politikat pĂ«rkatĂ«se tĂ« ruajtjes.

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

Tani, truku kryesor — agregimi i tĂ« dhĂ«nave pĂ«rmes kĂ«rkesĂ«s continue. Ky Ă«shtĂ« njĂ« mekanizĂ«m qĂ« aktivizon automatikisht njĂ« kĂ«rkesĂ« nĂ« intervale tĂ« caktuara, agregon tĂ« dhĂ«nat sipas kĂ«saj kĂ«rkese, dhe rezultati ruhet si njĂ« vlerĂ« e re. Le tĂ« shohim me njĂ« shembull (po e shkruaj nĂ« kolonĂ« pĂ«r lehtĂ«si leximi, por nĂ« tĂ« vĂ«rtetĂ« do tĂ« duhet ta futja kĂ«tĂ« komandĂ« nĂ« njĂ« rresht)

KRIJO KËRKESËN E CONTINUAR cq_water_hourly NË homeassistant 
BEGIN 
  ZGJIDH max(value) SI vlera 
  NË homeassistant.month.water_meter_hour 
  NGA homeassistant.autogen.l 
  GRUPO NË kohĂ«(1h), entity_id mbush(para) 
END

Kjo komandë:

  • Krijon njĂ« kĂ«rkesĂ« tĂ« vazhdueshme me emrin cq_water_cold_hourly nĂ« databazĂ«n homeassistant
  • KĂ«rkesa do tĂ« ekzekutohet çdo orĂ« (kohĂ«(1h))
  • KĂ«rkesa do tĂ« nxjerrĂ« tĂ« gjitha tĂ« dhĂ«nat nga matja homeassistant.autogen.l (litra), duke pĂ«rfshirĂ« leximet e ujit tĂ« ftohtĂ« dhe tĂ« nxehtĂ«
  • TĂ« dhĂ«nat e agreguara do tĂ« grupohen sipas entity_id, qĂ« do tĂ« krijojĂ« vlera tĂ« veçanta pĂ«r ujin e ftohtĂ« dhe tĂ« nxehtĂ«
  • Duke qenĂ« se matĂ«si i litrit Ă«shtĂ« njĂ« sekuencĂ« qĂ« rritet monotone brenda çdo ore, do tĂ« merret vlera maksimale, prandaj agregimi do tĂ« kryhet nga funksioni max(value)
  • Vlera e re do tĂ« shkruhet nĂ« homeassistant.month.water_meter_hour, ku month Ă«shtĂ« emri i politikĂ«s sĂ« mbajtjes me njĂ« afat ruajtjeje prej njĂ« muaji. TĂ« dhĂ«nat pĂ«r ujin e ftohtĂ« dhe tĂ« nxehtĂ« do tĂ« shpĂ«rndahen nĂ« regjistrime tĂ« veçanta me entity_id pĂ«rkatĂ«s dhe vlera nĂ« fushĂ«n value

Në natë ose kur nuk ka askënd në shtëpi, konsumi i ujit nuk është, dhe për pasojë nuk ka regjistrime të reja në homeassistant.autogen.l. Për të shmangur boshllëqe në vlerat e kërkesave të zakonshme mund të përdorni fill(previous). Kjo do ta detyrojë InfluxDB të përdorë vlerën e orës së kaluar.

FatkeqĂ«sisht, ka njĂ« veçori pĂ«r pyetjen e vazhdueshme: truku fill(previous) nuk funksionon dhe regjistrimet thjesht nuk krijohen. Kjo Ă«shtĂ« njĂ« problem qĂ« duket se Ă«shtĂ« i pakalueshĂ«m, dhe po diskutohet tashmĂ« pĂ«r njĂ« kohĂ« tĂ« gjatĂ«.Me kĂ«tĂ« problem do tĂ« merremi mĂ« vonĂ«, ndĂ«rsa fill(previous) nĂ« pyetjen e vazhdueshme le tĂ« qendrojĂ« — nuk dĂ«mton.

Le të shohim se çfarë kemi arritur (sigurisht, duhet të presim disa orë):

> 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

Ju kujdes, se vlerat nĂ« bazĂ« ruajten nĂ« UTC, prandaj nĂ« kĂ«tĂ« listĂ« ndryshojnĂ« me 3 orĂ« — vlerat pĂ«r nĂ«ntĂ« mĂ«ngjesi nĂ« daljen InfluxDB pĂ«rputhen me vlerat pĂ«r dymbĂ«dhjetĂ« nĂ« grafikĂ«t mĂ« sipĂ«r. Gjithashtu, ju lutemi vini re se nga ora dy deri nĂ« pesĂ« mĂ«ngjesi thjesht nuk ka shenja — kjo Ă«shtĂ« veçoria e kĂ«rkesĂ«s continue.

Siç e shihni, vlera e grumbulluar gjithashtu Ă«shtĂ« njĂ« sekuencĂ« monotone nĂ« rritje, vetĂ«m se shĂ«nimet ndryshojnĂ« mĂ« rrallĂ« — çdo orĂ«. Por kjo nuk Ă«shtĂ« problem — ne mund tĂ« shkruajmĂ« njĂ« kĂ«rkesĂ« tjetĂ«r qĂ« do tĂ« nxjerrĂ« tĂ« dhĂ«nat e sakta pĂ«r grafikun.

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)

Le të shpjegoj:

  • Nga baza homeassistant.month.water_meter_hour do tĂ« nxjerrim tĂ« dhĂ«na pĂ«r entity_id=’water_meter_cold’ pĂ«r 24 orĂ«t e fundit (time >= now() -24h).
  • Siç e pĂ«rmenda mĂ« parĂ«, nĂ« sekvencĂ«n homeassistant.month.water_meter_hour mund tĂ« mungojnĂ« disa shĂ«nime. Ne do t'i gjenerojmĂ« kĂ«to tĂ« dhĂ«na pĂ«rsĂ«ri, duke ekzekutuar njĂ« kĂ«rkesĂ« me GROUP BY time(1h). KĂ«tĂ« herĂ« fill(previous) do tĂ« funksionojĂ« siç duhet, duke gjeneruar tĂ« dhĂ«nat mungesĂ« (funksioni do tĂ« marrĂ« vlerĂ«n e mĂ«parshme).
  • E rĂ«ndĂ«sishme nĂ« kĂ«tĂ« kĂ«rkesĂ« Ă«shtĂ« funksioni difference, i cili do tĂ« llogarisĂ« ndryshimin midis shĂ«nimeve tĂ« orĂ«s. Ai vetĂ« nuk funksionon dhe kĂ«rkon njĂ« funksion agregues. Le tĂ« jetĂ« max() qĂ« Ă«shtĂ« pĂ«rdorur mĂ« parĂ«.

Rezultati i ekzekutimit duket kështu

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

Nga ora 2 deri në 5 të mëngjesit (UTC) nuk pati konsum. Megjithatë, kërkesa do të kthejë të njëjtin vlerë të konsumit falë fill(previous), ndërsa funksioni difference do ta heqë këtë vlerë nga vetvetja dhe në dalje do të kemi 0, që është në fakt ajo që ne kërkojmë.

Tani mbetet vetëm të ndërtosh grafikun. Për këtë, do të hapim Grafana, do të hapim një tabela ekzistuese (ose do të krijojmë një të re), do të krijojmë një panel të ri. Cilësimet e grafikëve do të jenë të tilla.

Shtëpia e mençur: Ndërtojmë grafikët e konsumit të ujit dhe energjisë elektrike në Home Assistant

Unë do të tregoj të dhënat për ujë të ftohtë dhe të ngrohtë në një grafik. Kërkesa është pikërisht ajo që e përshkrova më sipër.

Parametrat e shfaqjes caktohen kështu. Në rastin tim do të kem një grafik me linja (lines), i cili do të jetë me hapa (stairs). Parametri Stack do ta shpjegoj pak më poshtë. Ka disa parametra të tjerë shfaqjeje më poshtë, por ato nuk janë aq interesante.

Shtëpia e mençur: Ndërtojmë grafikët e konsumit të ujit dhe energjisë elektrike në Home Assistant

Për të shtuar grafikun e marrë në home assistant duhet:

  • tĂ« dalĂ«sh nga moda e redaktimit tĂ« grafikĂ«ve. pĂ«r njĂ« arsye tĂ« panjohur, caktimet e sakta tĂ« ndarjes sĂ« grafikĂ«ve ofrohen vetĂ«m nga faqja e panelit.
  • TĂ« klikosh nĂ« trekĂ«ndĂ«shin pranĂ« emrit tĂ« grafikĂ«t, nĂ« menu tĂ« zgjedhĂ«sh share.
  • NĂ« dritaren e hapur tĂ« kalosh nĂ« tab-in embed.
  • TĂ« hiqni shenjĂ«n aktuale tĂ« gamĂ«s sĂ« kohĂ«s — gamĂ«n e kohĂ«s do ta caktojmĂ« pĂ«rmes URL-sĂ«.
  • TĂ« zgjedhĂ«sh temĂ«n e nevojshme. NĂ« rastin tim kjo Ă«shtĂ« light.
  • TĂ« kopjosh URL-nĂ« e atĂ«hershme nĂ« kartelĂ«n e cilĂ«simeve 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"

Vini re se gamë e kohës (dy ditët e fundit) caktohet pikërisht këtu, e jo në cilësimet e panelit.

Grafiku duket kështu. Unë nuk kam përdorur ujë të nxehtë për dy ditët e fundit, prandaj çizmet vetëm grafikun e ujit të ftohtë.

Shtëpia e mençur: Ndërtojmë grafikët e konsumit të ujit dhe energjisë elektrike në Home Assistant

Nuk e kam vendosur ende se cilin grafik e preferoj më shumë, atë me vijë të shkallëzuar ose me shtylla reale. Prandaj, thjesht do të sjell një shembull grafik të përditshëm të konsumit, këtë herë me shtylla. Kërkesat ndërtohen njësoj siç përshkruheshin më sipër. Parametrat e shfaqjes janë të tillë:

Shtëpia e mençur: Ndërtojmë grafikët e konsumit të ujit dhe energjisë elektrike në Home Assistant

Ky grafik duket kështu:

Shtëpia e mençur: Ndërtojmë grafikët e konsumit të ujit dhe energjisë elektrike në Home Assistant

Ky është parametri Stack. Në këtë grafik, shtylla e ujit të ftohtë vizatohet mbi shtyllën e ujit të ngrohtë. Në total, lartësia përfaqëson konsum total të ujit të ftohtë dhe të ngrohtë për periudhën.

Të gjithë grafiket e paraqitur janë dinamikë. Mund të kaloni me miun mbi pikën e interesit dhe të shihni detajet dhe vlerën në pikën specifike.

Fatkeqësisht, pa disa pika të hidhura nuk do të ndodhte. Në grafikun me shtylla (ndryshe nga ai me vijë të shkallëzuar), mesi i shtyllës nuk qëndron në mes të ditës, por në orën 00:00. Pra, gjysma e majtë e shtyllës është vizatuar në vendin e ditës së kaluar. Pra, grafiket për të shtunën dhe të dielën janë vizatuar pak majtas nga zona bluese. Deri tani nuk kam gjetur një mënyrë si ta zgjidh këtë problem.

NjĂ« problem tjetĂ«r Ă«shtĂ« pamundĂ«sia pĂ«r tĂ« punuar siç duhet me intervalet mujore. Çështja Ă«shtĂ« se gjatĂ«si e orĂ«s/ditĂ«s/java Ă«shtĂ« fiks, ndĂ«rsa gjatĂ«si e muajit Ă«shtĂ« çdo herĂ« e ndryshme. InfluxDB Ă«shtĂ« nĂ« gjendje tĂ« punojĂ« vetĂ«m me intervale tĂ« njĂ«jta. Aktualisht kam arritur tĂ« caktoj njĂ« interval tĂ« fikst 30 ditĂ«sh. Po, grafiku gjatĂ« vitit do tĂ« ketĂ« disa shpĂ«rqendrime dhe kolonat nuk do tĂ« pĂ«rputhen saktĂ«sisht me muajt. Por, pasi qĂ« kjo Ă«shtĂ« interesante pĂ«r mua si njĂ« matĂ«s, do ta pranoj kĂ«tĂ«.

Shikoj të paktën dy zgjidhje:

  • TĂ« nĂ«nvleftĂ«soj grafiku mujore dhe tĂ« kufizohem me ato javore. 52 kolona javore nĂ« vit duken mjaft mirĂ«.
  • TĂ« llogaris konsumimin mujor si metodĂ« e dytĂ« dhe tĂ« pĂ«rdor grafana vetĂ«m pĂ«r grafika tĂ« bukura. Do tĂ« rezultojĂ« njĂ« zgjidhje mjaft e saktĂ«. Mund tĂ« mbivendos grafikat nga viti i kaluar pĂ«r krahasim — grafana e bĂ«n kĂ«tĂ« gjithashtu.

Përfundimi

Nuk e di pse, por më pëlqen shumë ky lloj grafiku. Ato tregojnë se jeta është dinamike dhe gjithçka po ndryshon. Dje kishte shumë, sot ka pak, nesër do të jetë ndryshe. Mbetet të punoj me anëtarët e familjes mbi temën e konsumit. Por përderisa kërkesat aktuale janë kështu, thjesht një numër i madh dhe i paqartë në faturë tashmë shndërrohet në një pamje mjaft të qartë të konsumit.

PavarĂ«sisht njĂ« karriere gati 20-vjeçare si programues, kam pasur pak pĂ«rvojĂ« me bazat e tĂ« dhĂ«nave. Prandaj, instalimi i njĂ« baze tĂ« dhĂ«nash tĂ« jashtme mĂ« dukej si diçka shumĂ« komplekse dhe e paqartĂ«. Gjithçka ndryshoi artikulli i pĂ«rmendur mĂ« sipĂ«r – duke u treguar se lidhja e njĂ« instrumenti tĂ« pĂ«rshtatshĂ«m bĂ«het me disa klikime, dhe me njĂ« instrument tĂ« specializuar, detyra e ndĂ«rtimit tĂ« grafikĂ«ve bĂ«het pak mĂ« e lehtĂ«.

NĂ« titullin kam pĂ«rmendur konsumimin e energjisĂ« elektrike. FatkeqĂ«sisht, nĂ« kĂ«tĂ« moment nuk mund tĂ« sjell asnjĂ« grafik. NjĂ« matĂ«s SDM120 mĂ« ka ndalur, ndĂ«rsa tjetri ka probleme kur i qaset nĂ«pĂ«rmjet Modbus. MegjithatĂ«, kjo nuk ndikon aspak nĂ« temĂ«n e kĂ«tij artikulli – grafikĂ«t do tĂ« ndĂ«rtohen nĂ« tĂ« njĂ«jtĂ«n mĂ«nyrĂ« si pĂ«r ujin.

Në këtë artikull kam sjellë qasjet që kam provuar vetë. Sigurisht, ka edhe metoda të tjera për organizimin e mbledhjes dhe vizualizimit të të dhënave, për të cilat nuk kam dijeni. Më tregoni për to në komentet, do të më interesonte shumë. Do të isha i lumtur për kritikat konstruktive dhe idetë e reja. Shpresoj se materiali i shpjeguar do t'i ndihmojë gjithashtu dikujt.

Burimi: habr.com

Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« đŸ”„ Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« | ProHoster