Smart Home: Tunaunda grafu za matumizi ya maji na umeme katika Mratibu wa Nyumbani

Smart Home: Tunaunda grafu za matumizi ya maji na umeme katika Mratibu wa Nyumbani
Kila ninapopokea malipo ya umeme na maji, huwa nashangaa - je, kweli familia yangu hutumia kiasi hicho? Naam, ndiyo, bafuni ina sakafu ya joto na boiler, lakini hawana moto kila wakati. Tunaonekana pia kuokoa maji (ingawa tunapenda pia kunyunyiza bafuni). Miaka kadhaa iliyopita mimi tayari mita za maji zilizounganishwa ΠΈ umeme kwa nyumba nzuri, lakini hapo ndipo mambo yalikwama. Tumefikia tu kuchambua matumizi, ambayo ndio makala hii inahusu.

Hivi majuzi nilibadilisha hadi Mratibu wa Nyumbani kama mfumo wangu mahiri wa nyumbani. Moja ya sababu ilikuwa ni fursa ya kupanga mkusanyiko wa idadi kubwa ya data na uwezo wa kuunda kwa urahisi aina anuwai za grafu.

Habari iliyoelezewa katika nakala hii sio mpya; vitu hivi vyote chini ya michuzi tofauti tayari vimeelezewa kwenye mtandao. Lakini kila makala kwa kawaida hueleza mbinu au kipengele kimoja tu. Ilinibidi kulinganisha njia hizi zote na kuchagua moja inayofaa zaidi mwenyewe. Nakala bado haitoi habari kamili juu ya ukusanyaji wa data, lakini ni aina ya muhtasari wa jinsi nilivyofanya. Kwa hivyo ukosoaji wenye kujenga na mapendekezo ya kuboresha yanakaribishwa.

Taarifa ya tatizo

Kwa hivyo, lengo la mazoezi ya leo ni kupata grafu nzuri za matumizi ya maji na umeme:

  • Kila saa kwa siku 2
  • Kila siku kwa wiki 2
  • (hiari) kila wiki na kila mwezi

Kuna ugumu fulani na hii:

  • Vipengee vya kawaida vya chati kawaida huwa duni. Kwa bora zaidi, unaweza kuunda grafu ya mstari kwa pointi.

    Ikiwa unatazama kwa bidii, unaweza kupata vipengele vya tatu vinavyopanua uwezo wa chati ya kawaida. Kwa msaidizi wa nyumbani, kwa kanuni, hii ni sehemu nzuri na nzuri kadi ya mini-graph, lakini pia ni mdogo:

    • Ni ngumu kuweka vigezo vya chati ya mwambaa kwa vipindi vikubwa (upana wa upau umewekwa katika sehemu za saa, ambayo inamaanisha kuwa vipindi virefu zaidi ya saa vitawekwa kwa nambari za sehemu)
    • Huwezi kuongeza huluki tofauti kwenye grafu moja (kwa mfano, halijoto na unyevunyevu, au kuchanganya grafu ya upau na mstari)
  • Sio tu kwamba msaidizi wa nyumbani kwa chaguo-msingi hutumia hifadhidata ya awali zaidi ya SQLite (na mimi, mfanyakazi, sikuweza kushughulikia kusakinisha MySQL au Postgres), lakini data haihifadhiwi kwa njia bora zaidi. Kwa hivyo, kwa mfano, kila wakati unapobadilisha hata parameta ndogo ya dijiti ya parameta, json kubwa ya ukubwa wa kilobyte imeandikwa kwenye hifadhidata.
    {"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}}}

    Nina sensorer nyingi (sensorer za joto katika kila chumba, mita za maji na umeme), na zingine pia hutoa data nyingi. Kwa mfano, mita ya umeme ya SDM220 pekee huzalisha maadili kadhaa kila sekunde 10-15, na ningependa kufunga kama mita 8. Pia kuna kundi zima la vigezo vinavyohesabiwa kulingana na sensorer nyingine. Hiyo. maadili haya yote yanaweza kuongeza hifadhidata kwa urahisi kwa MB 100-200 kila siku. Katika wiki mfumo hautasonga, na kwa mwezi gari la flash litakufa (katika kesi ya ufungaji wa kawaida wa msaidizi wa nyumbani kwenye Raspberry PI), na kuhifadhi data kwa mwaka mzima ni nje ya swali.

  • Ikiwa una bahati, mita yako inaweza kuhesabu matumizi yenyewe. Unaweza kurejea mita wakati wowote na kuuliza ni wakati gani thamani ya matumizi ya kusanyiko ni. Kama sheria, mita zote za umeme zilizo na kiolesura cha dijiti (RS232/RS485/Modbus/Zigbee) hutoa fursa hii.

    Ni mbaya zaidi ikiwa kifaa kinaweza kupima kigezo cha papo hapo (kwa mfano, nguvu ya papo hapo au mkondo), au kutoa mipigo kila saa X wati au lita. Kisha unahitaji kufikiri juu ya jinsi na nini cha kuunganisha na wapi kukusanya thamani. Kuna hatari ya kukosa ripoti inayofuata kwa sababu yoyote, na usahihi wa mfumo kwa ujumla huibua maswali. Unaweza, kwa kweli, kukabidhi haya yote kwa mfumo mzuri wa nyumbani kama msaidizi wa nyumbani, lakini hakuna mtu aliyeghairi uhakika kuhusu idadi ya rekodi kwenye hifadhidata, na haitawezekana kupigia kura zaidi ya mara moja kwa sekunde (a. kizuizi cha usanifu wa msaidizi wa nyumbani).

Mbinu 1

Kwanza, hebu tuone ni nini msaidizi wa nyumbani hutoa nje ya boksi. Kupima matumizi kwa muda ni utendaji unaotafutwa sana. Bila shaka, ilitekelezwa muda mrefu uliopita kwa namna ya sehemu maalumu - utility_meter.

Kiini cha kijenzi ni kwamba ndani huunda thamani ya sasa_iliyokusanywa_kubadilika na kuiweka upya baada ya muda maalum (saa/wiki/mwezi). Sehemu yenyewe inafuatilia utofauti wa pembejeo (thamani ya sensor fulani), inajiandikisha kwa mabadiliko katika thamani - unapata tu matokeo ya kumaliza. Jambo hili linaelezewa katika mistari michache tu kwenye faili ya usanidi

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

Hapa sensor.water_meter_cold ni thamani ya mita ya sasa katika lita ninazopokea moja kwa moja kutoka kwa kipande cha chuma kwa mqtt. Muundo huu huunda vitambuzi 2 vipya water_cold_hour_um na water_cold_day_um, ambazo hukusanya usomaji wa kila saa na kila siku, na kuziweka upya hadi sufuri baada ya muda kuisha. Hapa kuna grafu ya betri ya saa kwa nusu ya siku.

Smart Home: Tunaunda grafu za matumizi ya maji na umeme katika Mratibu wa Nyumbani

Nambari ya chati za kila saa na kila siku za lovelace-UI inaonekana kama hii:

      - 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

Kwa kweli, shida na mbinu hii iko katika algorithm hii. Kama nilivyosema tayari, kwa kila thamani ya pembejeo (usomaji wa mita ya sasa kwa kila lita inayofuata) 1kb ya rekodi hutolewa kwenye hifadhidata. Kila mita ya matumizi pia hutoa thamani mpya, ambayo pia huongezwa kwa msingi. Ikiwa ninataka kukusanya usomaji wa saa / kila siku / kila wiki / kila mwezi, na kwa kuongezeka kwa maji kadhaa, na kuongeza pakiti ya mita za umeme, hiyo itakuwa data nyingi. Kweli, kwa usahihi, hakuna data nyingi, lakini kwa kuwa msaidizi wa nyumbani anaandika rundo la habari zisizohitajika kwenye hifadhidata, saizi ya hifadhidata itakua kwa kiwango kikubwa na mipaka. Ninaogopa hata kukadiria saizi ya msingi kwa chati za kila wiki na kila mwezi.

Kwa kuongeza, mita ya matumizi yenyewe haina kutatua tatizo. Grafu ya thamani zinazotolewa na mita ya matumizi ni chaguo la kukokotoa linaloongezeka mara moja ambalo huwekwa upya hadi 0 kila saa. Tunahitaji chati ya matumizi ambayo inaeleweka kwa mtumiaji, inayoonyesha ni lita ngapi zilitumiwa katika kipindi hicho. Kipengele cha kawaida cha grafu ya historia hakiwezi kufanya hivi, lakini kijenzi cha nje cha kadi ya mini-grafu kinaweza kutusaidia.

Huu ndio msimbo wa kadi ya 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'

Kwa kuongezea mipangilio ya kawaida kama vile jina la kihisi, aina ya grafu, rangi (sikupenda rangi ya chungwa), ni muhimu kuzingatia mipangilio 3:

  • group_by:saa - grafu itatolewa kwa pau zilizopangiliwa mwanzoni mwa saa
  • pointi_kwa_saa: 1 - bar moja kwa kila saa
  • Na muhimu zaidi, aggregate_func: max - chukua thamani ya juu ndani ya kila saa. Ni parameta hii inayogeuza grafu ya sawtooth kuwa baa

Smart Home: Tunaunda grafu za matumizi ya maji na umeme katika Mratibu wa Nyumbani

Usizingatie safu ya safu upande wa kushoto - hii ni tabia ya kawaida ya sehemu ikiwa hakuna data. Lakini hakukuwa na data - niliwasha tu ukusanyaji wa data ya mita ya matumizi masaa kadhaa iliyopita kwa ajili ya nakala hii (Nitaelezea mbinu yangu ya sasa hapa chini).

Katika picha hii nilitaka kuonyesha kwamba wakati mwingine onyesho la data hata hufanya kazi na baa zinaonyesha maadili sahihi. Lakini si hivyo tu. Kwa sababu fulani, safu iliyochaguliwa kwa kipindi cha 11 hadi 12 asubuhi inaonyesha lita 19, ingawa kwenye grafu ya toothy juu kidogo kwa kipindi hicho kutoka kwa sensor sawa tunaona matumizi ya lita 62. Ama kuna mdudu au mikono imepinda. Lakini bado sielewi kwa nini data iliyo upande wa kulia ilivunjika - matumizi yalikuwa ya kawaida, ambayo pia yanaonekana kutoka kwa grafu ya meno.

Kwa ujumla, sikuweza kufikia uwezekano wa njia hii - grafu karibu kila mara inaonyesha aina fulani ya uzushi.

Msimbo sawa wa kihisi cha mchana.

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

Tafadhali kumbuka kuwa parameta ya group_by imewekwa kwa muda, na kigezo cha pointi_kwa_saa kinatawala kila kitu. Na hapo kuna tatizo lingine la kipengele hiki - pointi_per_saa hufanya kazi vizuri kwenye chati za saa moja au chini, lakini huvuta kwa vipindi vikubwa zaidi. Kwa hivyo ili kupata safu wima moja kwa siku moja, ilibidi niweke thamani 1/24=0.04166666. Sizungumzii hata chati za kila wiki na mwezi.

Mbinu 2

Nikiwa bado ninaelewa msaidizi wa nyumbani, nilikutana na video hii:


Rafiki hukusanya data ya matumizi kutoka kwa aina kadhaa za soketi za Xiaomi. Kazi yake ni rahisi zaidi - onyesha tu thamani ya matumizi ya leo, jana na kwa mwezi. Hakuna ratiba zinazohitajika.

Wacha tuache kando majadiliano juu ya ujumuishaji wa mwongozo wa maadili ya nguvu ya papo hapo - tayari niliandika hapo juu juu ya "usahihi" wa njia hii. Haijulikani kwa nini hakutumia maadili ya matumizi yaliyokusanywa, ambayo tayari yamekusanywa na plagi moja. Kwa maoni yangu, ushirikiano ndani ya vifaa utafanya kazi vizuri zaidi.

Kutoka kwa video tutachukua wazo la kuhesabu matumizi kwa muda. Mwanadada huyo anahesabu tu maadili ya leo na jana, lakini tutaenda mbali zaidi na kujaribu kuchora grafu. Kiini cha njia iliyopendekezwa katika kesi yangu ni kama ifuatavyo.

Wacha tuunde thamani_ya_mwanzo_ya_saa, ambayo tutarekodi usomaji wa mita wa sasa.
Kutumia timer, mwishoni mwa saa (au mwanzoni mwa ijayo) tunahesabu tofauti kati ya usomaji wa sasa na ule uliohifadhiwa mwanzoni mwa saa. Tofauti hii itakuwa matumizi kwa saa ya sasa - tutahifadhi thamani ndani ya sensor, na katika siku zijazo tutajenga grafu kulingana na thamani hii.
Pia unahitaji "kuweka upya" thamani_at_beginning_of_hour kwa kuandika thamani ya sasa ya kaunta hapo.

Yote hii inaweza kufanywa kupitia msaidizi wa nyumbani yenyewe.

Utalazimika kuandika nambari zaidi kidogo kuliko katika mbinu ya hapo awali. Kwanza, hebu tuunde "vigezo" sawa. Nje ya kisanduku hatuna huluki ya "kigeu", lakini tunaweza kutumia huduma za wakala wa mqtt. Tutatuma thamani hapo na retain=bendera ya kweli - hii itahifadhi thamani ndani ya wakala, na inaweza kutolewa hapo wakati wowote, hata wakati kiratibu cha nyumbani kimewashwa upya. Nilifanya vihesabio vya saa na kila siku mara moja.

- 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

Uchawi wote hutokea katika automatisering, ambayo inaendesha kila saa na kila usiku kwa mtiririko huo.

- 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

Otomatiki zote mbili hufanya vitendo 2:

  • Kokotoa thamani ya muda kama tofauti kati ya thamani za mwanzo na mwisho
  • Sasisha thamani ya msingi kwa muda unaofuata

Ubunifu wa grafu katika kesi hii hutatuliwa na girafu ya kawaida ya historia:

      - 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

Inaonekana kama hii:

Smart Home: Tunaunda grafu za matumizi ya maji na umeme katika Mratibu wa Nyumbani

Kimsingi, hii tayari ndio inahitajika. Faida ya njia hii ni kwamba data hutolewa mara moja kwa muda. Wale. rekodi 24 pekee kwa siku kwa chati ya kila saa.

Kwa bahati mbaya, hii bado haisuluhishi shida ya jumla ya msingi unaokua. Ikiwa ninataka grafu ya matumizi ya kila mwezi, nitalazimika kuhifadhi data kwa angalau mwaka. Na kwa kuwa msaidizi wa nyumbani hutoa mpangilio mmoja tu wa muda wa kuhifadhi kwa hifadhidata nzima, hii inamaanisha kuwa data ZOTE kwenye mfumo italazimika kuhifadhiwa kwa mwaka mzima. Kwa mfano, kwa mwaka mimi hutumia mita za ujazo 200 za maji, ambayo ina maana kwamba hii ina maana entries 200000 kwenye database. Na ikiwa utazingatia sensorer zingine, basi takwimu inakuwa isiyofaa.

Mbinu 3

Kwa bahati nzuri, watu wenye akili tayari wametatua tatizo hili kwa kuandika hifadhidata ya InfluxDB. Hifadhidata hii imeboreshwa haswa kwa kuhifadhi data inayotegemea wakati na ni bora kwa kuhifadhi maadili ya sensorer tofauti. Mfumo pia hutoa lugha ya swali inayofanana na SQL ambayo hukuruhusu kutoa thamani kutoka kwa hifadhidata na kisha kuzijumlisha kwa njia mbalimbali. Hatimaye, data tofauti inaweza kuhifadhiwa kwa nyakati tofauti. Kwa mfano, usomaji unaobadilika mara kwa mara kama vile halijoto au unyevunyevu unaweza kuhifadhiwa kwa wiki chache tu, ilhali usomaji wa matumizi ya maji ya kila siku unaweza kuhifadhiwa kwa mwaka mzima.

Kando na InfluxDB, watu werevu pia walivumbua Grafana, mfumo wa kuchora grafu kulingana na data kutoka InfluxDB. Grafana inaweza kuchora aina tofauti za grafu, kubinafsisha kwa undani, na, muhimu zaidi, grafu hizi zinaweza "kuchomekwa" kwenye msaidizi wa nyumbani wa lovelace-UI.

Pata msukumo hapa ΠΈ hapa. Makala yanaelezea kwa kina mchakato wa kusakinisha na kuunganisha InfluxDB na Grafana kwa msaidizi wa nyumbani. Nitazingatia kutatua shida yangu maalum.

Kwa hivyo, kwanza kabisa, wacha tuanze kuongeza thamani ya kaunta katika influxDB. Sehemu ya usanidi wa msaidizi wa nyumbani (katika mfano huu nitafurahiya sio baridi tu, bali pia maji ya moto):

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

Wacha tuzime kuhifadhi data hii kwenye hifadhidata ya msaidizi wa nyumbani ili tusiifunge tena:

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

Hebu sasa twende kwenye koni ya InfluxDB na tusanidi hifadhidata yetu. Hasa, unahitaji kusanidi muda gani data fulani itahifadhiwa. Hii inadhibitiwa na kinachojulikana. sera ya uhifadhi - hii ni sawa na hifadhidata ndani ya hifadhidata kuu, na kila hifadhidata ya ndani ikiwa na mipangilio yake. Kwa chaguomsingi, data yote huhifadhiwa katika sera ya kuhifadhi inayoitwa autogen; data hii itahifadhiwa kwa wiki. Ningependa data ya kila saa ihifadhiwe kwa mwezi, data ya kila wiki itunzwe kwa mwaka mmoja, na data ya kila mwezi isiwahi kufutwa. Hebu tuunde sera inayofaa ya kuhifadhi

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

Sasa, kwa kweli, hila kuu ni ujumuishaji wa data kwa kutumia hoja inayoendelea. Huu ni utaratibu ambao huendesha swali kiotomatiki katika vipindi maalum, hujumlisha data ya swali hili, na kuongeza matokeo katika thamani mpya. Wacha tuangalie mfano (ninaandika kwenye safu kwa kusomeka, lakini kwa ukweli ilibidi niingize amri hii kwa safu moja)

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

Amri hii:

  • Huunda swali endelevu linaloitwa cq_water_cold_hourly katika hifadhidata ya msaidizi wa nyumbani
  • Ombi litatekelezwa kila saa (saa(saa 1))
  • Ombi litafuta data yote kutoka kwa kipimo cha homeassistant.autogen.l (lita), ikijumuisha usomaji wa maji baridi na moto.
  • Data iliyojumlishwa itawekwa kulingana na entity_id, ambayo itatupa thamani tofauti za maji baridi na moto.
  • Kwa kuwa kihesabu cha lita ni mlolongo wa kuongezeka kwa monotonically ndani ya kila saa, itakuwa muhimu kuchukua thamani ya juu, kwa hivyo ujumlishaji utafanywa na max(thamani)
  • Thamani mpya itaandikwa kwa homeassistant.month.water_meter_hour, ambapo mwezi ni jina la sera ya kubaki na muda wa kubaki kwa mwezi mmoja. Zaidi ya hayo, data kuhusu maji baridi na moto itatawanywa katika rekodi tofauti na huluki_id inayolingana na thamani katika sehemu ya thamani.

Usiku au wakati hakuna mtu nyumbani, hakuna matumizi ya maji, na kwa hiyo hakuna maingizo mapya katika homeassistant.autogen.l. Ili kuzuia kukosa maadili katika maswali ya kawaida, unaweza kutumia kujaza (iliyotangulia). Hii italazimisha InfluxDB kutumia thamani ya saa iliyopita.

Kwa bahati mbaya, hoja inayoendelea ina upekee: hila ya kujaza(iliyotangulia) haifanyi kazi na rekodi hazijaundwa. Aidha, hii ni aina fulani ya tatizo lisiloweza kushindwa ambalo imejadiliwa kwa miaka kadhaa sasa. Tutashughulika na tatizo hili baadaye, lakini acha kujaza(iliyotangulia) iwe kwenye swala endelevu - haiingilii.

Wacha tuangalie kilichotokea (kwa kweli, unahitaji kungojea masaa kadhaa):

> 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

Kumbuka kwamba thamani katika hifadhidata zimehifadhiwa katika UTC, kwa hivyo orodha hii inatofautiana kwa saa 3 - maadili ya 7am katika matokeo ya InfluxDB yanalingana na maadili ya 10am katika grafu hapo juu. Pia kumbuka kuwa kati ya 2 na 5 asubuhi hakuna rekodi - hii ni kipengele sawa cha hoja inayoendelea.

Kama unavyoona, thamani iliyojumlishwa pia ni mlolongo wa kuongezeka kwa monotonically, maingizo pekee hutokea mara kwa mara - mara moja kwa saa. Lakini hili sio tatizo - tunaweza kuandika swali lingine ambalo litapata data sahihi ya grafu.

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)

Nitafafanua:

  • Kutoka kwa hifadhidata ya homeassistant.month.water_meter_hour tutatoa data ya entity_id='water_meter_cold' kwa siku ya mwisho (muda >= now() -24h).
  • Kama nilivyotaja tayari, baadhi ya maingizo yanaweza kukosa katika mfuatano wa homeassistant.month.water_meter_hour. Tutaunda upya data hii kwa kuendesha hoja na GROUP BY time(1h). Wakati huu wa kujaza(uliotangulia) utafanya kazi kama inavyotarajiwa, ikitoa data iliyokosekana (kitendakazi kitachukua thamani iliyotangulia)
  • Jambo muhimu zaidi katika ombi hili ni kazi ya tofauti, ambayo itahesabu tofauti kati ya alama za saa. Haifanyi kazi yenyewe na inahitaji kazi ya kujumlisha. Acha hii iwe max() iliyotumika hapo awali.

Matokeo ya utekelezaji yanaonekana kama hii

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

Kuanzia saa 2 hadi 5 asubuhi (UTC) hapakuwa na matumizi. Walakini, hoja itarudisha thamani sawa ya matumizi kwa kujaza (iliyotangulia), na chaguo la kukokotoa litatoa thamani hii kutoka yenyewe na matokeo yatakuwa 0, ambayo ndiyo hasa inahitajika.

Kinachobaki ni kutengeneza grafu. Ili kufanya hivyo, fungua Grafana, fungua dashibodi iliyopo (au unda mpya), na uunde paneli mpya. Mipangilio ya chati itakuwa kama hii.

Smart Home: Tunaunda grafu za matumizi ya maji na umeme katika Mratibu wa Nyumbani

Nitaonyesha data ya maji baridi na moto kwenye grafu sawa. Ombi ni sawa kabisa na nilivyoeleza hapo juu.

Vigezo vya kuonyesha vimewekwa kama ifuatavyo. Kwa mimi itakuwa grafu na mistari, ambayo huenda kwa hatua (ngazi). Nitaelezea paramu ya Stack hapa chini. Kuna chaguzi kadhaa zaidi za kuonyesha hapa chini, lakini hazifurahishi hivyo.

Smart Home: Tunaunda grafu za matumizi ya maji na umeme katika Mratibu wa Nyumbani

Ili kuongeza chati inayotokana na msaidizi wa nyumbani unahitaji:

  • ondoka kwenye modi ya kuhariri chati. Kwa sababu fulani, mipangilio sahihi ya kushiriki chati inatolewa tu kutoka kwa ukurasa wa dashibodi
  • Bofya kwenye pembetatu karibu na jina la chati na uchague kushiriki kutoka kwenye menyu
  • Katika dirisha linalofungua, nenda kwenye kichupo cha kupachika
  • Batilisha uteuzi wa kipindi cha sasa - tutaweka kipindi kupitia URL
  • Chagua mada inayohitajika. Kwa upande wangu ni nyepesi
  • Nakili URL inayotokana na kadi ya mipangilio ya 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"

Tafadhali kumbuka kuwa kipindi (siku 2 zilizopita) kimewekwa hapa, na si katika mipangilio ya dashibodi.

Grafu inaonekana kama hii. Sijatumia maji ya moto katika siku 2 zilizopita, kwa hiyo ni grafu ya maji baridi tu inayotolewa.

Smart Home: Tunaunda grafu za matumizi ya maji na umeme katika Mratibu wa Nyumbani

Bado sijajiamulia ni grafu ipi ninayopenda zaidi, hatua ya mstari, au baa halisi. Kwa hivyo, nitatoa tu mfano wa chati ya matumizi ya kila siku, wakati huu tu kwenye baa. Maswali yanaundwa sawa na yale yaliyoelezwa hapo juu. Chaguzi za maonyesho ni:

Smart Home: Tunaunda grafu za matumizi ya maji na umeme katika Mratibu wa Nyumbani

Grafu hii inaonekana kama hii:

Smart Home: Tunaunda grafu za matumizi ya maji na umeme katika Mratibu wa Nyumbani

Kwa hivyo kuhusu paramu ya Stack. Katika grafu hii, safu ya maji baridi hutolewa juu ya safu ya maji ya moto. Urefu wa jumla unafanana na matumizi ya jumla ya maji baridi na ya moto kwa kipindi hicho.

Grafu zote zilizoonyeshwa ni zenye nguvu. Unaweza kuelea kipanya chako juu ya sehemu inayokuvutia na kuona maelezo na thamani katika sehemu maalum.

Kwa bahati mbaya, kulikuwa na nzi kadhaa kwenye marashi. Kwenye chati ya bar (tofauti na chati iliyo na mistari ya hatua), katikati ya bar sio katikati ya siku, lakini saa 00:00. Wale. nusu ya kushoto ya safu imechorwa mahali pa siku iliyopita. Kwa hivyo grafu za Jumamosi na Jumapili zimechorwa kidogo upande wa kushoto wa ukanda wa samawati. Mpaka nikafikiria jinsi ya kumshinda.

Tatizo jingine ni kutokuwa na uwezo wa kufanya kazi vizuri kwa vipindi vya kila mwezi. Ukweli ni kwamba urefu wa saa / siku / wiki umewekwa, lakini urefu wa mwezi ni tofauti kila wakati. InfluxDB inaweza tu kufanya kazi kwa vipindi sawa. Kufikia sasa akili zangu zimetosha kuweka muda maalum wa siku 30. Ndio, grafu itaelea kidogo mwaka mzima na baa hazitalingana kabisa na miezi. Lakini kwa kuwa ninavutiwa na jambo hili kama mita ya kuonyesha, niko sawa nayo.

Ninaona angalau suluhisho mbili:

  • Achana na chati za kila mwezi na ujizuie kwa za kila wiki. Baa 52 za ​​kila wiki kwa mwaka zinaonekana vizuri
  • Fikiria matumizi ya kila mwezi yenyewe kama njia ya 2, na utumie grafana kwa grafu nzuri pekee. Itakuwa suluhisho sahihi kabisa. Unaweza hata kufunika grafu kwa mwaka uliopita kwa kulinganisha - grafana inaweza kufanya hivyo pia.

Hitimisho

Sijui ni kwanini, lakini ninavutiwa na aina hizi za michoro. Wanaonyesha kuwa maisha yanaenda kasi na kila kitu kinabadilika. Jana kulikuwa na mengi, leo kuna kidogo, kesho itakuwa kitu kingine. Yote iliyobaki ni kufanya kazi na wanakaya juu ya mada ya matumizi. Lakini hata kwa matumbo ya sasa, takwimu kubwa tu na isiyoeleweka kwenye karatasi ya malipo tayari inageuka kuwa picha inayoeleweka ya matumizi.

Licha ya kazi yangu ya karibu miaka 20 kama programu, sikuwa na mawasiliano na hifadhidata. Kwa hivyo, kusanikisha hifadhidata ya nje ilionekana kama kitu kisichoeleweka na kisichoeleweka. Ilibadilisha kila kitu makala hapo juu - ikawa kwamba kuunganisha chombo kinachofaa kinafanywa kwa kubofya kadhaa, na kwa chombo maalum, kazi ya kupanga chati inakuwa rahisi kidogo.

Katika kichwa nilitaja matumizi ya umeme. Kwa bahati mbaya, kwa sasa siwezi kutoa grafu yoyote. Mita moja ya SDM120 ilikufa kwa ajili yangu, na nyingine ni glitchy wakati kufikiwa kupitia Modbus. Hata hivyo, hii haiathiri mada ya makala hii kwa njia yoyote - grafu zitajengwa kwa njia sawa na kwa maji.

Katika nakala hii niliwasilisha njia ambazo nilijaribu mwenyewe. Hakika kuna njia zingine za kupanga ukusanyaji wa data na taswira ambayo sijui kuihusu. Niambie kuhusu hilo katika maoni, nitapendezwa sana. Nitafurahi kwa ukosoaji wa kujenga na maoni mapya. Natumaini nyenzo iliyotolewa pia itasaidia mtu.

Chanzo: mapenzi.com

Kuongeza maoni