Imah pinter: Urang ngawangun grafik konsumsi cai sareng listrik di Asisten Imah

Imah pinter: Urang ngawangun grafik konsumsi cai sareng listrik di Asisten Imah
Unggal-unggal kuring nampi bayaran listrik sareng cai, kuring reuwas - naha kulawarga kuring leres-leres tuang pisan? Nya, enya, kamar mandi ngagaduhan lantai anu dipanaskeun sareng alat keur ngagolakkeun, tapi aranjeunna henteu ngaduruk seuneu sepanjang waktos. Kami ogé sigana ngahemat cai (sanaos urang ogé resep nyembur di kamar mandi). Sababaraha taun ka tukang kuring geus méter cai disambungkeun и listrik ka imah pinter, tapi éta tempat macet. Kami ngan ayeuna parantos nganalisa konsumsi, anu leres-leres ngeunaan tulisan ieu.

Kuring nembe gentos ka Asisten Imah salaku sistem bumi pinter kuring. Salah sahiji alesan éta persis kasempetan pikeun ngatur kumpulan jumlah badag data kalawan kamampuhan pikeun merenah ngawangun rupa-rupa grafik.

Inpormasi anu dijelaskeun dina tulisan ieu sanés énggal; sadaya hal ieu dina saos anu béda-béda parantos dijelaskeun dina Internét. Tapi unggal artikel biasana ngajelaskeun ngan hiji pendekatan atawa aspék. Kuring kedah ngabandingkeun sadaya pendekatan ieu sareng milih anu paling cocog pikeun kuring sorangan. Artikel masih teu nyadiakeun informasi komprehensif ngeunaan pendataan, tapi mangrupakeun jenis kasimpulan kumaha kuring ngalakukeun eta. Janten kritik sareng saran anu konstruktif pikeun perbaikan ditampi.

Ngarumuskeun masalah

Janten, tujuan latihan dinten ayeuna nyaéta pikeun kéngingkeun grafik konsumsi cai sareng listrik anu saé:

  • Sajam pikeun 2 dinten
  • Saban poé salila 2 minggu
  • (opsional) mingguan jeung bulanan

Aya sababaraha kasusah sareng ieu:

  • Komponén bagan standar biasana rada goréng. Di pangalusna, anjeun tiasa ngawangun hiji grafik garis titik ku titik.

    Lamun kasampak cukup teuas, anjeun tiasa manggihan komponén pihak-katilu nu dilegakeun kamampuhan tina bagan baku. Pikeun asistén bumi, prinsipna mah, ieu mangrupikeun komponén anu saé sareng éndah kartu grafik mini, tapi ogé rada kawates:

    • Hésé nyetél parameter bagan bar dina interval anu ageung (lebar bar disetél dina fraksi sajam, anu hartosna interval langkung ti sajam bakal disetél dina angka pecahan)
    • Anjeun teu tiasa nambihan éntitas anu béda kana hiji grafik (contona, suhu sareng kalembaban, atanapi ngagabungkeun grafik bar sareng garis)
  • Henteu ngan ukur asistén bumi sacara standar nganggo pangkalan data SQLite anu paling primitif (sareng kuring, tukang, henteu tiasa masang MySQL atanapi Postgres), tapi datana henteu disimpen dina cara anu paling optimal. Janten, contona, unggal waktos anjeun ngarobih parameter digital pangleutikna tina parameter, json ageung sakitar kilobyte ukuranana diserat kana pangkalan data.
    {"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}}}

    Kuring boga rada loba sensor (sensor suhu di unggal rohangan, cai jeung listrik méter), jeung sababaraha ogé ngahasilkeun cukup loba data. Salaku conto, méteran listrik SDM220 nyalira ngahasilkeun kira-kira belasan nilai unggal 10-15 detik, sareng abdi hoyong masang méter sapertos kitu 8. Aya ogé sakumpulan parameter anu diitung dumasar kana sénsor anu sanés. Anu. sadaya nilai ieu tiasa gampang inflate database ku 100-200 MB sapopoé. Dina saminggu sistem bieu bakal mindahkeun, sarta dina sabulan flash drive bakal maot (dina kasus instalasi asisten imah has dina buah prambus pi), sarta nyimpen data pikeun sataun sakabeh geus kaluar tina patarosan.

  • Upami anjeun untung, meter anjeun tiasa ngitung konsumsi sorangan. Anjeun tiasa ngaktipkeun méteran iraha waé sareng naroskeun jam sabaraha nilai konsumsi akumulasi. Sakumaha aturan, sadaya méter listrik anu gaduh antarmuka digital (RS232 / RS485 / Modbus / Zigbee) nyayogikeun kasempetan ieu.

    Langkung parah upami alat ngan ukur tiasa ngukur sababaraha parameter sakedapan (contona, kakuatan sakedapan atanapi arus), atanapi ngan ukur ngahasilkeun pulsa unggal X watt-jam atanapi liter. Teras anjeun kedah mikirkeun kumaha sareng naon anu kedah dihijikeun sareng dimana ngumpulkeun nilai. Aya résiko leungit laporan salajengna pikeun alesan naon, sarta akurasi sistem sakabéhna raises patarosan. Anjeun tiasa, tangtosna, mercayakeun sadayana ieu ka sistem bumi pinter sapertos asisten bumi, tapi teu aya anu ngabatalkeun titik ngeunaan jumlah rékaman dina pangkalan data, sareng éta moal mungkin pikeun polling sensor langkung ti sakali sadetik (a watesan arsitéktur asisten imah).

Pendekatan 1

Kahiji, hayu urang tingali naon asisten imah nyadiakeun out of the box. Ngukur konsumsi salami hiji période mangrupikeun fungsi anu ditéang pisan. Tangtosna, éta dilaksanakeun lami pisan dina bentuk komponén khusus - utility_meter.

Hakekat komponén éta sacara internal nyiptakeun variabel current_accumulated_value sareng ngareset deui saatos periode anu ditangtukeun (jam / minggu / bulan). Komponén sorangan ngawas variabel input (nilai sababaraha sensor), ngalanggan sorangan kana parobahan nilai - anjeun ngan meunang hasil rengse. Hal ieu dijelaskeun dina ngan sababaraha baris dina file konfigurasi

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

Di dieu sensor.water_meter_cold nyaeta nilai méteran ayeuna dina liter nu kuring narima langsung tina potongan beusi ku mqtt. Desain nyiptakeun 2 sensor anyar water_cold_hour_um na water_cold_day_um, nu ngumpulkeun bacaan hourly na poean, ngareset aranjeunna ka enol sanggeus periode geus kadaluwarsa. Ieu mangrupikeun grafik batré per jam satengah dinten.

Imah pinter: Urang ngawangun grafik konsumsi cai sareng listrik di Asisten Imah

Kodeu grafik per jam sareng poean pikeun lovelace-UI sapertos kieu:

      - 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

Sabenerna, masalah sareng pendekatan ieu aya dina algoritma ieu. Sakumaha anu geus kuring disebutkeun, pikeun tiap nilai input (maca méteran ayeuna keur unggal liter salajengna) 1kb rékaman dihasilkeun dina database. Unggal méteran utiliti ogé ngahasilkeun nilai anyar, nu ogé ditambahkeun kana dasarna. Lamun kuring hayang ngumpulkeun jam / poean / mingguan / bacaan bulanan, sarta pikeun sababaraha risers cai, sarta nambahan hiji pak méteran listrik, éta bakal loba data. Nya, langkung tepatna, henteu seueur data, tapi ti saprak asistén bumi nyerat seueur inpormasi anu teu dipikabutuh kana pangkalan data, ukuran pangkalan data bakal ningkat sacara kabisat. Kuring sieun malah estimasi ukuran dasar pikeun grafik mingguan jeung bulanan.

Sajaba ti éta, méteran utiliti sorangan teu ngajawab masalah. Grafik tina nilai anu dihasilkeun ku méteran utiliti mangrupikeun fungsi ningkat sacara monoton anu direset ka 0 unggal jam. Urang peryogi bagan konsumsi anu kaharti ku pangguna, nunjukkeun sabaraha liter anu dikonsumsi salami periode éta. Komponén grafik sajarah baku teu bisa ngalakukeun ieu, tapi komponén éksternal mini grafik-kartu bisa mantuan kami.

Ieu kodeu kartu pikeun 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'

Salian setélan standar sapertos nami sensor, jinis grafik, warna (kuring henteu resep jeruk standar), penting pikeun dicatet 3 setélan:

  • group_by:hour - grafik bakal dihasilkeun ku bar Blok ka awal jam
  • points_per_hour: 1 - hiji bar keur unggal jam
  • Sareng anu paling penting, aggregate_func: max - nyandak nilai maksimal dina unggal jam. Parameter ieu anu ngarobah grafik sawtooth kana bar

Imah pinter: Urang ngawangun grafik konsumsi cai sareng listrik di Asisten Imah

Entong nengetan barisan kolom di kénca - ieu mangrupikeun kabiasaan standar komponén upami henteu aya data. Tapi teu aya data - Kuring ngan ukur ngaktipkeun pangumpulan data meter utilitas sababaraha jam ka pengker kanggo tulisan ieu (kuring bakal ngajelaskeun pendekatan kuring ayeuna di handap).

Dina gambar ieu kuring hayang némbongkeun yén kadang tampilan data malah jalan na bar sabenerna ngagambarkeun nilai bener. Tapi éta henteu sadayana. Kanggo sababaraha alesan, kolom dipilih pikeun periode ti 11 nepi ka 12 am mintonkeun 19 liter, sanajan dina grafik toothy saeutik leuwih luhur pikeun période sarua ti sensor sarua urang ningali konsumsi 62 liter. Boh aya kutu atawa leungeun bengkok. Tapi kuring masih henteu ngartos naha data di beulah katuhu peupeus - konsumsi aya normal, anu ogé katingali tina grafik huntu.

Sacara umum, kuring teu bisa ngahontal plausibility tina pendekatan ieu - grafik ampir sok nembongkeun sababaraha jenis bid'ah.

Kodeu sarupa pikeun sensor daytime.

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

Perhatikeun yén group_by parameter disetel ka interval, sarta points_per_hour parameter aturan sagalana. Sarta therein perenahna masalah sejen kalawan komponén ieu - points_per_hour jalan ogé dina grafik sajam atawa kirang, tapi nyedot dina interval nu leuwih gede. Janten pikeun kéngingkeun hiji kolom dina sadinten, kuring kedah ngalebetkeun nilai 1/24=0.04166666. Kuring malah teu ngawangkong ngeunaan grafik mingguan jeung bulanan.

Pendekatan 2

Nalika masih ngartos asistén bumi, kuring mendakan pidéo ieu:


Babaturan ngumpulkeun data konsumsi tina sababaraha jinis sockets Xiaomi. Tugasna rada saderhana - ngan ukur nunjukkeun nilai konsumsi pikeun dinten ayeuna, kamari sareng sasih. Taya jadwal diperlukeun.

Hayu urang nyingkirkeun diskusi ngeunaan integrasi manual nilai kakuatan sakedapan - Kuring parantos nyerat di luhur ngeunaan "akurasi" pendekatan ieu. Henteu jelas naha anjeunna henteu nganggo akumulasi nilai konsumsi, anu parantos dikumpulkeun ku toko anu sami. Dina pamanggih kuring, integrasi jero hardware bakal dianggo hadé.

Tina pidéo kami bakal nyandak ideu ngitung konsumsi sacara manual salami hiji periode. Lalaki ngan ukur ngitung nilai ayeuna sareng kamari, tapi urang bakal langkung jauh sareng nyobian ngagambar grafik. Intina metode anu diusulkeun dina hal kuring nyaéta kieu.

Hayu urang jieun nilai variabel_at_the_beginning_of_hour, dimana urang bakal ngarékam bacaan méter ayeuna
Ngagunakeun timer, dina ahir jam (atawa dina awal hareup) urang ngitung bédana antara bacaan ayeuna jeung nu disimpen dina awal jam. Beda ieu bakal konsumsi pikeun jam ayeuna - urang bakal ngahemat nilai kana sensor, sarta dina mangsa nu bakal datang urang bakal ngawangun grafik dumasar kana nilai ieu.
Anjeun oge kudu "ngareset" variabel value_at_beginning_of_hour ku nulis nilai counter ayeuna aya.

Sadaya ieu tiasa dilakukeun ku asistén bumi nyalira.

Anjeun kedah nyerat langkung seueur kode tibatan dina pendekatan sateuacana. Kahiji, hayu urang nyieun ieu sarua "variabel". Out of the box kami henteu ngagaduhan éntitas "variabel", tapi urang tiasa nganggo jasa calo mqtt. Kami bakal ngirim nilai-nilai di dinya kalayan nahan = bandéra leres - ieu bakal ngahémat nilai di jero calo, sareng éta tiasa ditarik kaluar iraha waé, sanaos asistén bumi di-reboot. Kuring nyieun counters hourly sarta poean sakaligus.

- 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

Sadayana sihir lumangsung dina otomatisasi, anu ngajalankeun unggal jam sareng unggal wengi masing-masing.

- 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

Kadua automation ngalaksanakeun 2 tindakan:

  • Itung nilai interval salaku bédana antara nilai mimiti jeung tungtung
  • Apdet nilai dasar pikeun interval salajengna

Pangwangunan grafik dina hal ieu direngsekeun ku grafik sajarah biasa:

      - 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

Sigana mah kieu:

Imah pinter: Urang ngawangun grafik konsumsi cai sareng listrik di Asisten Imah

Sacara prinsip, ieu geus naon diperlukeun. Kauntungannana metoda ieu nyaeta data dihasilkeun sakali per interval. Jelema. ngan 24 rékaman per poé pikeun grafik hourly.

Hanjakal, ieu masih teu ngajawab masalah umum tina basa tumuwuh. Upami kuring hoyong grafik konsumsi bulanan, kuring kedah nyimpen data sahenteuna sahenteuna sataun. Sareng saprak asistén bumi ngan ukur nyayogikeun hiji setélan durasi panyimpen pikeun sadaya databés, ieu hartosna ALL data dina sistem kedah disimpen salami sataun. Contona, dina sataun kuring meakeun 200 méter kubik cai, nu hartina ieu hartina 200000 entri dina database. Tur upami Anjeun salah tumut kana akun sensor sejen, inohong janten umumna teu sopan.

Pendekatan 3

Kabeneran, jalma pinter parantos ngarengsekeun masalah ieu ku nyerat database InfluxDB. Database ieu dioptimalkeun khusus pikeun nyimpen data dumasar kana waktos sareng idéal pikeun nyimpen nilai-nilai sénsor anu béda. Sistem ieu ogé nyayogikeun basa query sapertos SQL anu ngamungkinkeun anjeun nimba nilai tina pangkalan data teras agrégat ku sababaraha cara. Tungtungna, data anu béda tiasa disimpen pikeun waktos anu béda. Salaku conto, bacaan anu sering robih sapertos suhu atanapi kalembaban tiasa disimpen ngan ukur sababaraha minggu, sedengkeun bacaan konsumsi cai sapopoé tiasa disimpen salami sataun.

Salian ti InfluxDB, jalma pinter ogé nimukeun Grafana, sistem pikeun ngagambar grafik dumasar kana data ti InfluxDB. Grafana tiasa ngagambar jinis grafik anu béda-béda, ngarobih sacara rinci, sareng, anu paling penting, grafik ieu tiasa "dipasang" kana asisten bumi lovelace-UI.

Meunang inspirasi di dieu и di dieu. Tulisan ngajelaskeun sacara rinci prosés masang sareng nyambungkeun InfluxDB sareng Grafana ka asistén bumi. Kuring baris difokuskeun ngarengsekeun masalah husus kuring.

Janten, mimitina, hayu urang mimitian nambihan nilai counter dina influxDB. Sapotong konfigurasi asistén bumi (dina conto ieu kuring bakal resep henteu ngan ukur tiis, tapi ogé cai panas):

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

Hayu urang nganonaktipkeun nyimpen data anu sami ieu kana database asistén bumi internal supados henteu kembung deui:

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

Hayu urang ayeuna angkat ka konsol InfluxDB sareng ngonpigurasikeun database urang. Khususna, anjeun kedah ngonpigurasikeun sabaraha lami data anu tangtu bakal disimpen. Ieu diatur ku nu disebut. kawijakan ingetan - ieu sarupa jeung database dina database utama, kalawan unggal database internal gaduh setelan sorangan. Sacara standar, sadaya data disimpen dina kawijakan ingetan anu disebut autogen; data ieu bakal disimpen salami saminggu. Abdi hoyong data per jam disimpen salami sabulan, data mingguan disimpen salami sataun, sareng data bulanan teu pernah dihapus. Hayu urang nyieun kawijakan ingetan luyu

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

Ayeuna, kanyataanna, trik utama nyaéta aggregation data ngagunakeun query kontinyu. Ieu mékanisme nu otomatis ngajalankeun query dina interval nu tangtu, aggregates data pikeun query ieu, tur nambahkeun hasilna kana nilai anyar. Hayu urang tingali conto (kuring nyerat dina kolom pikeun dibaca, tapi kanyataanana kuring kedah ngalebetkeun paréntah ieu dina hiji baris)

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

paréntah ieu:

  • Nyiptakeun pamundut kontinyu anu dingaranan cq_water_cold_hourly dina database homeassistant
  • Paménta bakal dieksekusi unggal jam (waktos(1h))
  • Paménta bakal ngikis sadaya data tina pangukuran 'homeassistant.autogen.l (liter), kalebet bacaan cai tiis sareng panas.
  • Data agrégat bakal dikelompokkeun ku entity_id, anu bakal masihan kami nilai anu misah pikeun cai tiis sareng panas.
  • Kusabab counter liter mangrupakeun runtuyan monotonically ngaronjatna dina unggal jam, éta bakal diperlukeun pikeun nyokot nilai maksimum, jadi aggregation bakal dilumangsungkeun ku fungsi max (nilai)
  • Nilai anyar bakal diserat ka homeassistant.month.water_meter_hour, dimana bulan nyaéta nami kawijakan ingetan kalayan periode ingetan sabulan. Sumawona, data ngeunaan cai tiis sareng panas bakal sumebar kana rékaman anu misah sareng entity_id sareng nilai anu aya dina widang nilai.

Peuting atawa lamun euweuh imah, euweuh konsumsi cai, sarta ku kituna euweuh éntri anyar dina homeassistant.autogen.l. Pikeun ngahindarkeun nilai anu leungit dina patarosan biasa, anjeun tiasa nganggo eusian (saméméhna). Ieu bakal maksa InfluxDB ngagunakeun nilai jam panungtungan.

Hanjakal, query kontinyu boga peculiarity: eusian (saméméhna) trik teu jalan jeung rékaman saukur teu dijieun. Leuwih ti éta, ieu téh sababaraha jenis masalah insurmountable éta geus dibahas pikeun sababaraha taun ayeuna. Urang bakal nungkulan masalah ieu engké, tapi hayu eusian (saméméhna) dina query kontinyu - teu ngaganggu.

Hayu urang parios naon anu kajantenan (tangtosna, anjeun kedah ngantosan sababaraha jam):

> 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

Catet yén nilai dina pangkalan data disimpen dina UTC, janten daptar ieu béda ku 3 jam - nilai 7 énjing dina kaluaran InfluxDB pakait sareng nilai 10 énjing dina grafik di luhur. Catet ogé yén antara jam 2 sareng 5 énjing ngan ukur aya rékaman - ieu mangrupikeun fitur anu sami dina pamundut kontinyu.

Sakumaha anjeun tiasa tingali, nilai aggregated ogé runtuyan monotonically ngaronjatna, ngan éntri lumangsung kirang sering - sakali per jam. Tapi ieu teu masalah - urang bisa nulis query sejen anu bakal nimba data bener keur grafik.

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)

Kuring gé decipher:

  • Tina database homeassistant.month.water_meter_hour kami bakal nimba data pikeun entity_id='water_meter_cold' kanggo dinten terakhir (waktos > = ayeuna () -24h).
  • Sakumaha anu kuring parantos nyarios, sababaraha éntri tiasa leungit dina urutan homeassistant.month.water_meter_hour. Urang bakal regenerasi data ieu ku ngajalankeun query kalawan GROUP BY time(1h). Waktos ieu eusian (saméméhna) bakal tiasa dianggo sapertos anu diharapkeun, ngahasilkeun data anu leungit (fungsina bakal nyandak nilai sateuacana)
  • Hal pangpentingna dina pamundut ieu fungsi bédana, nu bakal ngitung bédana antara tanda jam. Teu jalan sorangan sarta merlukeun fungsi aggregation. Hayu ieu jadi max () dipaké saméméhna.

Hasil palaksanaan sapertos kieu

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

Ti 2 nepi ka 5 am (UTC) euweuh konsumsi. Sanajan kitu, query bakal balik nilai konsumsi sarua berkat eusian (saméméhna), sarta fungsi bédana bakal ngurangan nilai ieu ti dirina jeung kaluaran bakal 0, nu kahayang diperlukeun.

Sadaya anu tetep nyaéta ngawangun grafik. Jang ngalampahkeun ieu, buka Grafana, buka sababaraha aya (atawa jieun anyar) dasbor, sarta nyieun panel anyar. Setélan bagan bakal sapertos kieu.

Imah pinter: Urang ngawangun grafik konsumsi cai sareng listrik di Asisten Imah

Kuring bakal mintonkeun data cai tiis jeung panas dina grafik sarua. Paménta persis sami sareng anu dijelaskeun di luhur.

Parameter tampilan diatur kieu. Pikeun kuring eta bakal grafik kalawan garis, nu mana dina hambalan (tangga). Kuring bakal ngajelaskeun parameter Stack di handap. Aya sababaraha pilihan tampilan di handap, tapi aranjeunna henteu pikaresepeun.

Imah pinter: Urang ngawangun grafik konsumsi cai sareng listrik di Asisten Imah

Pikeun nambihan bagan anu hasilna ka asisten bumi anjeun kedah:

  • kaluar tina mode ngedit bagan. Kanggo sababaraha alesan, setélan babagi bagan anu leres ditawarkeun ngan tina halaman dasbor
  • Pencét segitiga gigireun nami bagan sareng pilih bagikeun tina ménu
  • Dina jandela nu muka, buka tab embed
  • Pupus centang rentang waktu ayeuna - urang bakal nyetel rentang waktu via URL
  • Pilih topik anu diperyogikeun. Dina hal kuring éta hampang
  • Salin URL hasilna kana kartu setelan 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"

Punten dicatet yén rentang waktos (2 dinten terakhir) disetel di dieu, sareng henteu dina setélan dasbor.

Grafikna siga kieu. Kuring henteu nganggo cai panas dina 2 dinten ka pengker, janten ngan ukur grafik cai tiis anu digambar.

Imah pinter: Urang ngawangun grafik konsumsi cai sareng listrik di Asisten Imah

Kuring masih teu mutuskeun pikeun sorangan grafik kuring resep hadé, a garis-hambalan, atawa bar nyata. Ku alatan éta, kuring ngan saukur bakal masihan conto bagan konsumsi sapopoé, ngan waktos ieu dina bar. Patarosan diwangun sami sareng anu dijelaskeun di luhur. Pilihan tampilan nyaéta:

Imah pinter: Urang ngawangun grafik konsumsi cai sareng listrik di Asisten Imah

grafik ieu kasampak kawas kieu:

Imah pinter: Urang ngawangun grafik konsumsi cai sareng listrik di Asisten Imah

Jadi ngeunaan parameter tumpukan. Dina grafik ieu, kolom cai tiis digambar dina luhureun kolom cai panas. Jangkungna total pakait sareng total konsumsi cai tiis sareng panas pikeun période éta.

Sadaya grafik anu dipidangkeun dinamis. Anjeun tiasa hover mouse anjeun dina titik anu dipikaresep sareng ningali detil sareng nilai dina titik anu khusus.

Hanjakal, aya sababaraha laleur dina salep. Dina bagan bar (teu kawas bagan kalayan garis hambalan), tengah bar henteu di tengah poé, tapi di 00:00. Jelema. satengah kénca kolom digambar dina tempat poé saméméhna. Janten grafik pikeun Saptu sareng Minggu rada digambar ka kénca zona bluish. Dugi ka kuring terang kumaha carana ngelehkeunana.

Masalah anu sanés nyaéta henteu mampuh damel leres dina interval bulanan. Kanyataanana lilana jam/poé/minggu geus maneuh, tapi lilana bulan béda-béda unggal waktu. InfluxDB ngan ukur tiasa dianggo dina interval anu sami. Sajauh ieu otak kuring parantos cekap pikeun nyetél interval tetep 30 dinten. Leres, grafik bakal ngambang sakedik sapanjang taun sareng bar moal persis saluyu sareng bulan. Tapi saprak kuring kabetot dina hal ieu saukur salaku méteran tampilan, Abdi ok jeung eta.

Kuring ningali sahenteuna dua solusi:

  • Nyerah kana bagan bulanan sareng ngawatesan diri ka mingguan. 52 bar mingguan pikeun sataun kasampak geulis alus
  • Pertimbangkeun konsumsi bulanan sorangan salaku métode No. Éta bakal janten solusi anu akurat. Anjeun malah tiasa overlay grafik pikeun taun katukang pikeun babandingan - grafana can do that too.

kacindekan

Kuring henteu weruh naha, tapi Abdi obsessed jeung jenis ieu grafik. Aranjeunna nunjukkeun yén kahirupan aya dina ayunan pinuh sareng sadayana robih. Kamari loba, ayeuna aya saeutik, isukan bakal aya deui. Sadaya anu tetep nyaéta damel sareng anggota rumah tangga dina topik konsumsi. Tapi sanajan ku napsu ayeuna, ngan hiji angka badag tur teu kaharti dina slip pamayaran geus robah jadi gambaran konsumsi cukup kaharti.

Sanaos karir kuring ampir 20 taun salaku programer, kuring ampir teu aya hubungan sareng pangkalan data. Ku alatan éta, masang database éksternal seemed kawas hal jadi abstruse tur teu kaharti. Ngarobah sagalana artikel di luhur - Tétéla ngalampirkeun alat anu cocog dilakukeun dina sababaraha klik, sareng ku alat khusus, tugas ngarencanakeun grafik janten langkung gampang.

Dina judul kuring disebutkeun konsumsi listrik. Hanjakal, ayeuna kuring teu bisa nyadiakeun grafik nanaon. Hiji méteran SDM120 maot pikeun kuring, sareng anu sanésna glitchy nalika diaksés via Modbus. Nanging, ieu henteu mangaruhan topik tulisan ieu ku cara naon waé - grafik bakal diwangun dina cara anu sami sareng cai.

Dina artikel ieu kuring dibere pendekatan anu kuring diusahakeun sorangan. Pasti aya sababaraha cara séjén pikeun ngatur pendataan sareng visualisasi anu kuring henteu terang. Nyaritakeun ka kuring ngeunaan éta dina koméntar, kuring bakal resep pisan. Kuring bakal bungah kritik konstruktif jeung gagasan anyar. Kuring miharep bahan dibere ogé bakal nulungan batur.

sumber: www.habr.com

Tambahkeun komentar