Ухаалаг гэр: Бид Home Assistant-д ус, цахилгааны хэрэглээний графикийг бүтээдэг

Ухаалаг гэр: Бид Home Assistant-д ус, цахилгааны хэрэглээний графикийг бүтээдэг
Би цахилгаан, усны төлбөр авах болгондоо гайхдаг - манай гэр бүл үнэхээр их хэрэглэдэг гэж үү? Тийм ээ, угаалгын өрөөнд дулаан шал, уурын зуух байдаг, гэхдээ тэд үргэлж гал сөнөөгчөөр ажилладаггүй. Бид бас ус хэмнэдэг юм шиг санагддаг (хэдийгээр бид угаалгын өрөөнд ус цацах дуртай). Хэдэн жилийн өмнө би аль хэдийн холбогдсон усны тоолуур и цахилгаан ухаалаг гэр рүү, гэхдээ энд л бүх зүйл гацсан. Гарууд хэрэглээний дүн шинжилгээнд одоо л хүрсэн бөгөөд энэ нь үнэндээ энэ нийтлэлийн тухай юм.

Би саяхан гэрийн туслах системээ ухаалаг гэрийн систем болгон сольсон. Үүний нэг шалтгаан нь зүгээр л янз бүрийн төрлийн график байгуулахад тохиромжтой, их хэмжээний мэдээлэл цуглуулах ажлыг зохион байгуулах чадвар байв.

Энэ нийтлэлд тайлбарласан мэдээлэл нь шинэ зүйл биш бөгөөд янз бүрийн соусын дор эдгээр бүх зүйлийг Интернетэд аль хэдийн тайлбарласан болно. Гэхдээ нийтлэл бүр нь дүрмээр бол зөвхөн нэг арга барил эсвэл талыг тодорхойлдог. Би эдгээр бүх аргыг харьцуулж, хамгийн тохиромжтойг нь сонгох хэрэгтэй болсон. Өгүүлэл нь мэдээлэл цуглуулах талаар бүрэн мэдээлэл өгөөгүй ч миний үүнийг хэрхэн хийсэн тухай хураангуй юм. Тиймээс бүтээлч шүүмжлэл, сайжруулах саналыг хүлээн авах боломжтой.

Асуудлын тодорхойлолт

Тиймээс өнөөдрийн дасгалын зорилго бол ус, цахилгааны хэрэглээний сайхан графикийг авах явдал юм.

  • 2 өдрийн турш цаг тутамд
  • 2 долоо хоногийн турш өдөр бүр
  • (заавал биш) долоо хоног, сар бүр

Үүнд зарим хүндрэлүүд байна:

  • Стандарт диаграмын бүрэлдэхүүн хэсэг нь нэлээд муу байх хандлагатай байдаг. Хамгийн сайн нь та цэгээр шугаман график байгуулж болно.

    Хэрэв та сайн хайлт хийвэл стандарт графикийн чадавхийг өргөтгөх гуравдагч талын бүрэлдэхүүн хэсгүүдийг олох боломжтой. Гэрийн туслахын хувьд зарчмын хувьд сайн, үзэсгэлэнтэй бүрэлдэхүүн хэсэг юм мини график карт, гэхдээ энэ нь бас бага зэрэг хязгаарлагдмал:

    • Баганан диаграммын параметрүүдийг том интервалаар тохируулах нь хэцүү байдаг (баданны өргөнийг нэг цагийн бутархайгаар тогтоосон бөгөөд энэ нь нэг цагаас илүү интервалыг бутархай тоогоор тогтооно гэсэн үг юм)
    • Та өөр өөр объектуудыг нэг графикт нэмэх боломжгүй (жишээлбэл, температур, чийгшил, эсвэл зураасан графикийг шугамтай хослуулах)
  • Гэрийн туслах нь анхдагч байдлаар хамгийн энгийн SQLite мэдээллийн санг ашиглаад зогсохгүй (мөн гар урлаач би MySQL эсвэл Postgres суулгаж чадаагүй), өгөгдөл нь хамгийн оновчтой байдлаар хадгалагддаггүй. Жишээлбэл, параметрийн хамгийн бага тоон параметр бүрийг өөрчлөх бүрт ойролцоогоор килобайт хэмжээтэй асар том json мэдээллийн санд бичигддэг.
    {"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}}}

    Надад хэд хэдэн мэдрэгч байдаг (өрөө бүрт температур мэдрэгч, ус, цахилгаан тоолуур), зарим нь маш их мэдээлэл үүсгэдэг. Жишээлбэл, зөвхөн SDM220 цахилгаан тоолуур 10-15 секунд тутамд хэдэн арван утгыг үүсгэдэг бөгөөд би ийм 8 тоолуур суурилуулахыг хүсч байна. Мөн бусад мэдрэгч дээр үндэслэн тооцоолсон олон тооны параметрүүд байдаг. Тэр. Эдгээр бүх утгууд нь мэдээллийн санг өдөрт 100-200 МБ-аар хялбархан өсгөж чаддаг. Долоо хоногийн дараа систем бараг л эргэлдэж, нэг сарын дараа флаш диск нь үхэх болно (бөөрөлзгөнө PI дээр гэрийн туслахыг ердийн суулгасан тохиолдолд), бүтэн жилийн турш өгөгдөл хадгалах талаар ярих боломжгүй болно. .

  • Хэрэв та азтай бол таны тоолуур өөрөө хэрэглээг тоолж чадна. Та хүссэн үедээ тоолууртай холбоо барьж, хуримтлагдсан хэрэглээний үнэ хэдэн цагт байгааг асууж болно. Дүрмээр бол тоон интерфэйстэй (RS232/RS485/Modbus/Zigbee) бүх цахилгаан тоолуур ийм боломжийг олгодог.

    Хэрэв төхөөрөмж нь агшин зуурын параметрийг (жишээлбэл, агшин зуурын хүч эсвэл гүйдэл) хэмжиж чаддаг эсвэл X ватт-цаг эсвэл литр тутамд импульс үүсгэдэг бол илүү муу юм. Дараа нь яаж, юутай нэгтгэж, хаана үнэ цэнийг хуримтлуулах вэ гэдгээ бодох хэрэгтэй. Ямар нэгэн шалтгаанаар дараагийн тайланг орхих эрсдэлтэй бөгөөд системийн үнэн зөв байдал нь бүхэлдээ асуултуудыг үүсгэдэг. Мэдээжийн хэрэг, та энэ бүхнийг гэрийн туслах гэх мэт ухаалаг гэрийн системд даатгаж болно, гэхдээ хэн ч мэдээллийн санд оруулсан бичлэгийн тоог цуцалсангүй, санал хураах мэдрэгч нь секундэд нэгээс олон удаа ажиллахгүй (хязгаарлалт). гэрийн туслах архитектур).

Арга 1

Эхлээд хайрцагнаас ямар гэрийн туслахыг авч үзье. Тодорхой хугацааны хэрэглээг хэмжих нь маш их эрэлт хэрэгцээтэй функц юм. Мэдээжийн хэрэг, энэ нь удаан хугацааны өмнө тусгай бүрэлдэхүүн хэсэг болох utility_meter хэлбэрээр хэрэгжсэн.

Бүрэлдэхүүн хэсгийн мөн чанар нь одоогийн_хуримтлагдсан_утга хувьсагчийг дотор нь эхлүүлж, тодорхой хугацааны дараа (цаг/долоо хоног/сар) дахин тохируулдагт оршино. Бүрэлдэхүүн хэсэг нь ирж буй хувьсагчийг (зарим төрлийн мэдрэгчийн утга) хянадаг, утгын өөрчлөлтийг өөрөө хийдэг - та зөвхөн эцсийн үр дүнг авах болно. Энэ зүйлийг тохиргооны файлын хэдхэн мөрөнд тайлбарласан болно

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

Энд мэдрэгч.усны_метр_хүйтэн гэдэг нь миний авч буй тоолуурын одоогийн утгыг литрээр илэрхийлнэ төмрөөс шууд mqtt. Энэхүү загвар нь усны_хүйтэн_цаг_um ба усны_хүйтэн_өдөр_um гэсэн 2 шинэ мэдрэгчийг бий болгож, цаг болон өдөр тутмын уншилтыг хуримтлуулж, хугацаа дууссаны дараа тэдгээрийг тэг болгож тохируулдаг. Хагас өдрийн батерейны нэг цагийн графикийг энд харуулав.

Ухаалаг гэр: Бид Home Assistant-д ус, цахилгааны хэрэглээний графикийг бүтээдэг

Lovelace-UI-ийн цагийн болон өдөр тутмын графикийн код дараах байдалтай байна.

      - 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

Үнэндээ энэ алгоритмд энэ аргын асуудал оршдог. Өмнө дурьдсанчлан, ирж буй утга бүрийн хувьд (дараагийн литр бүрийн одоогийн тоолуурын заалт) мэдээллийн санд 1кб бичлэг үүсдэг. Хэрэглээний тоолуур бүр шинэ утгыг бий болгодог бөгөөд энэ нь мөн суурь дээр нэмэгддэг. Хэрэв би цаг бүр / өдөр бүр / долоо хоног / сар бүр, тийм ээ, хэд хэдэн ус өргөх төхөөрөмж, тэр ч байтугай нэг багц цахилгаан тоолуур нэмэхийг хүсвэл энэ нь маш их мэдээлэл байх болно. Бүр тодруулбал, тийм ч их мэдээлэл байхгүй, гэхдээ гэрийн туслах нь мэдээллийн санд шаардлагагүй мэдээллийг бичдэг тул мэдээллийн сангийн хэмжээ огцом өсөх болно. Долоо хоног, сар бүрийн графикуудын суурийн хэмжээг тооцоолохоос ч айж байна.

Үүнээс гадна, хэрэглээний тоолуур нь өөрөө асуудлыг шийдэж чадахгүй. Хэрэглээний тоолуурын гаргасан утгын график нь цаг тутамд 0 болж өөрчлөгддөг нэг хэвийн өсөлттэй функц юм. Хэрэглэгчдэд ойлгомжтой, тухайн хугацаанд хэдэн литр зарцуулсныг харуулсан хэрэглээний график хэрэгтэй байна. Стандарт түүх-график бүрэлдэхүүн хэсэг үүнийг хийж чадахгүй, харин мини график картын гадаад бүрэлдэхүүн хэсэг нь бидэнд тусалж чадна.

Энэ бол 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'

Мэдрэгчийн нэр, графикийн төрөл, өнгө (би стандарт улбар шар өнгө таалагдаагүй) зэрэг стандарт тохиргооноос гадна 3 тохиргоог анхаарах нь чухал.

  • group_by:hour - графикийг цагийн эхэнд зэрэгцүүлсэн баганаар үүсгэнэ
  • цагийн_цэг: 1 - цагт нэг бар
  • Хамгийн гол нь aggregate_func: max нь цаг тутамд хамгийн их утгыг авах явдал юм. Энэ параметр нь хөрөөний диаграммыг баар болгон хувиргадаг.

Ухаалаг гэр: Бид Home Assistant-д ус, цахилгааны хэрэглээний графикийг бүтээдэг

Зүүн талд байгаа баганын эгнээнд бүү анхаарал хандуулаарай - хэрэв өгөгдөл байхгүй бол энэ нь бүрэлдэхүүн хэсгийн стандарт үйлдэл юм. Гэхдээ өгөгдөл байхгүй байсан - би зөвхөн энэ нийтлэлд зориулж хэрэглээний тоолуурын мэдээлэл цуглуулах ажлыг хэдхэн цагийн өмнө асаасан (би одоо байгаа арга барилаа доор тайлбарлах болно).

Энэ зурган дээр би заримдаа өгөгдлийн дэлгэц ажилладаг, баарнууд үнэхээр зөв утгыг тусгадаг гэдгийг харуулахыг хүссэн. Гэхдээ энэ нь бүгд биш юм. Зарим шалтгааны улмаас өглөөний 11 цагаас өглөөний 12 цаг хүртэлх хугацаанд тодруулсан баганад 19 литрийг харуулсан боловч шүдтэй график дээр ижил мэдрэгчээс бага зэрэг өндөр, 62 литр зарцуулалтыг харж байна. Алдаа эсвэл гар муруй байна. Гэхдээ баруун талын өгөгдөл яагаад тасарсныг би одоо хүртэл ойлгохгүй байна - хэрэглээ хэвийн байсан нь шүдний графикаас харагдаж байна.

Ерөнхийдөө би энэ аргын үнэмшилтэй байдалд хүрч чадаагүй - график нь бараг үргэлж ямар нэг гаж урсгалыг харуулдаг.

Өдрийн мэдрэгчийн ижил төстэй код.

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

group_by параметрийг интервалаар тохируулсан бөгөөд цаг_цагт_цэг параметр нь бүх зүйлийг зохицуулдаг гэдгийг анхаарна уу. Мөн энэ бүрэлдэхүүн хэсэгтэй холбоотой өөр нэг асуудал юм - цаг тутамд оноо нь нэг цаг ба түүнээс бага график дээр сайн ажилладаг, гэхдээ илүү том интервал дээр жигшмээр. Тиймээс нэг өдрийн дотор нэг багана авахын тулд би 1/24=0.04166666 гэсэн утгыг оруулах шаардлагатай болсон. Би долоо хоног, сарын графикийн талаар яриагүй байна.

Арга 2

Гэрийн туслахыг олох гэж байтал би энэ видеог олж харлаа:


Найз нь хэд хэдэн төрлийн Xiaomi залгуураас хэрэглээний мэдээллийг цуглуулдаг. Түүний даалгавар арай хялбар - өнөөдрийн, өчигдөр, сарын хэрэглээний үнэ цэнийг харуулахад л хангалттай. Хуваарь шаардлагагүй.

Агшин зуурын эрчим хүчний утгыг гараар нэгтгэх тухай яриагаа орхиё - би энэ аргын "нарийвчлал" -ын талаар дээр бичсэн. Нэг цэгээр нэгэнт цуглуулсан хуримтлагдсан хэрэглээний үнэ цэнээ яагаад ашиглаагүй нь тодорхойгүй байна. Миний бодлоор техник хангамж доторх интеграци нь илүү сайн ажиллах болно.

Видеоноос бид хэрэглээг тодорхой хугацаанд гараар тоолох санааг авах болно. Эрэгтэй хүний ​​хувьд зөвхөн өнөөдрийн болон өчигдрийн үнэ цэнийг тооцдог, гэхдээ бид цаашаа явж, график зурахыг хичээх болно. Миний хувьд санал болгож буй аргын мөн чанар нь дараах байдалтай байна.

Бид тухайн цагийн_эхлэлд хувьсагчийн утгыг үүсгэх бөгөөд үүнд одоогийн тоолуурын заалтыг бичих болно.
Цагийн төгсгөлд (эсвэл дараагийнх нь эхэнд) таймерын дагуу бид одоогийн уншилт болон цагийн эхэнд хадгалагдсан хоорондох зөрүүг тооцоолно. Энэ ялгаа нь тухайн цагийн хэрэглээ байх болно - бид мэдрэгч дээрх утгыг хадгалах бөгөөд ирээдүйд бид энэ утга дээр үндэслэн график байгуулах болно.
Мөн та тоолуурын одоогийн утгыг бичиж цагийн_эхлэх_утга хувьсагчийг "дахин тохируулах" хэрэгтэй.

Энэ бүхнийг гэрийн туслахын тусламжтайгаар ... өөрөө хийж болно.

Та өмнөх аргынхаас арай илүү код бичих хэрэгтэй болно. Эдгээр "хувьсагчдаас" эхэлцгээе. Бидэнд "хувьсах" байгууллага байхгүй, гэхдээ та mqtt брокерын үйлчилгээг ашиглаж болно. Бид тэнд утгуудыг retain=true гэсэн тэмдэгтэйгээр илгээх бөгөөд энэ нь брокер доторх утгыг хадгалах бөгөөд гэрийн туслахыг дахин асаасан ч гэсэн хүссэн үедээ гаргаж авах боломжтой. Би нэг дор цагийн болон өдөр тутмын тоолуур хийсэн.

- 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

Бүх ид шид нь цаг тутамд, шөнө бүр ажилладаг автоматжуулалтад тохиолддог.

- 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

Хоёр автоматжуулалт нь 2 зүйлийг гүйцэтгэдэг:

  • Интервал бүрийн утгыг эхлэл ба төгсгөлийн утгын зөрүүгээр тооцоол
  • Дараагийн интервалын үндсэн утгыг шинэчилнэ үү

Энэ тохиолдолд график байгуулах ажлыг ердийн түүхийн графикаар шийддэг.

      - 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

Энэ нь иймэрхүү харагдаж байна:

Ухаалаг гэр: Бид Home Assistant-д ус, цахилгааны хэрэглээний графикийг бүтээдэг

Зарчмын хувьд энэ нь танд хэрэгтэй зүйл юм. Энэ аргын давуу тал нь өгөгдлийг интервалд нэг удаа үүсгэдэг. Тэдгээр. нэг цагийн графикийн хувьд өдөрт нийт 24 бичлэг.

Харамсалтай нь энэ нь өсөн нэмэгдэж буй баазын ерөнхий асуудлыг шийдэж чадахгүй хэвээр байна. Хэрэв би сарын хэрэглээний графикийг хүсч байвал дор хаяж нэг жилийн хугацаанд өгөгдөл хадгалах шаардлагатай болно. Гэрийн туслах нь бүх мэдээллийн санд зөвхөн нэг хадгалах хугацааг зааж өгдөг тул энэ нь систем дэх БҮХ өгөгдлийг бүтэн жилийн турш хадгалах шаардлагатай гэсэн үг юм. Жишээлбэл, би жилд 200 шоо метр ус хэрэглэдэг бөгөөд энэ нь мэдээллийн санд 200000 бичилт хийсэн гэсэн үг юм. Хэрэв та бусад мэдрэгчийг анхаарч үзвэл энэ зураг ерөнхийдөө зохисгүй болно.

Арга 3

Аз болоход ухаалаг хүмүүс InfluxDB мэдээллийн санг бичиж энэ асуудлыг аль хэдийн шийдсэн. Энэхүү мэдээллийн сан нь цаг хугацааны өгөгдлийг хадгалахад тусгайлан тохируулагдсан бөгөөд өөр өөр мэдрэгчийн утгыг хадгалахад тохиромжтой. Энэхүү систем нь SQL-тэй төстэй асуулгын хэлээр хангадаг бөгөөд энэ нь өгөгдлийн сангаас утгыг гаргаж аваад тэдгээрийг янз бүрийн аргаар нэгтгэх боломжийг олгодог. Эцэст нь өөр өөр өгөгдлийг өөр өөр хугацаанд хадгалах боломжтой. Жишээлбэл, температур, чийгшил зэрэг байнга өөрчлөгддөг хэмжигдэхүүнийг хэдхэн долоо хоногийн турш хадгалах боломжтой бол өдөр тутмын усны хэрэглээний заалтыг бүтэн жилийн турш хадгалах боломжтой.

InfluxDB-ээс гадна ухаалаг хүмүүс InfluxDB-ийн өгөгдөл дээр үндэслэн график зурах Grafana системийг зохион бүтээжээ. Графана нь янз бүрийн төрлийн график зурж, тэдгээрийг нарийвчлан тохируулах боломжтой бөгөөд хамгийн чухал нь эдгээр графикуудыг lovelace-UI гэрийн туслах төхөөрөмж дээр "залгах" боломжтой.

урам зориг авах энд и энд. Нийтлэлд InfluxDB болон Grafana-г гэрийн туслахтай суулгах, холбох үйл явцыг дэлгэрэнгүй тайлбарласан болно. Би өөрийн тодорхой асуудлыг шийдвэрлэхэд анхаарлаа хандуулах болно.

Тиймээс эхлээд influxDB дээр тоолуурын утгыг нэмж эхэлцгээе. Гэрийн туслахын тохиргооны хэсэг (энэ жишээнд би зөвхөн хүйтэн төдийгүй халуун усаар зугаацах болно):

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

Дахин дүүрэхгүйн тулд гэрийн туслахын дотоод мэдээллийн санд ижил өгөгдлийг хадгалахыг идэвхгүй болгоё:

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

Одоо InfluxDB консол руу очиж мэдээллийн сангаа тохируулцгаая. Ялангуяа та тодорхой өгөгдөл хэр удаан хадгалагдахыг тохируулах хэрэгтэй. Үүнийг гэж нэрлэгддэг зүйлээр зохицуулдаг. хадгалах бодлого - энэ нь үндсэн мэдээллийн сан доторх мэдээллийн сантай төстэй бөгөөд дотоод мэдээллийн сан бүр өөрийн гэсэн тохиргоотой. Анхдагч байдлаар, бүх өгөгдлийг autogen гэж нэрлэдэг хадгалах бодлогод нэмдэг бөгөөд энэ өгөгдөл нь долоо хоногийн турш хадгалагдах болно. Цагийн өгөгдлийг нэг сар, долоо хоног тутмын мэдээллийг нэг жил, сарын өгөгдлийг огт устгаагүй байхыг хүсч байна. Бид хадгалах зохих бодлогыг бий болгоно

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

Одоо үнэн хэрэгтээ гол заль мэх бол тасралтгүй асуулга ашиглан өгөгдлийг нэгтгэх явдал юм. Энэ нь автоматаар асуулгыг заасан интервалаар эхлүүлж, энэ асуулгын өгөгдлийг нэгтгэж, үр дүнг шинэ утгад нэмдэг механизм юм. Нэг жишээг харцгаая (би уншигдахын тулд баганад бичдэг, гэхдээ бодит байдал дээр би энэ командыг нэг мөрөнд оруулах шаардлагатай болсон)

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

Энэ тушаал:

  • Homeasistant мэдээллийн санд cq_water_cold_hourly нэртэй тасралтгүй асуулга үүсгэдэг
  • Асуулга нь цаг тутамд хийгдэх болно (цаг (1 цаг))
  • Асуулга нь homeassistant.autogen.l (литр)-ээс хүйтэн, халуун усны уншилт зэрэг бүх өгөгдлийг гаргаж авах болно.
  • Нэгтгэсэн өгөгдлийг entity_id-ээр бүлэглэх бөгөөд энэ нь хүйтэн, халуун усны тусдаа утгыг бий болгоно.
  • Литрийн тоолуур нь цаг тутамд нэг хэвийн өсөн нэмэгдэж буй дараалал тул та хамгийн их утгыг авах шаардлагатай тул нэгтгэлийг max(утга) функцээр гүйцэтгэнэ.
  • Шинэ утгыг homeassistant.month.water_meter_hour руу бичих бөгөөд сар нь нэг сарын хадгалах хугацаатай хадгалах бодлогын нэр юм. Түүнчлэн, хүйтэн, халуун усны талаархи өгөгдлийг харгалзах entity_id болон утгын талбар дахь утга бүхий тусдаа бүртгэлд тараана.

Шөнийн цагаар эсвэл гэртээ хэн ч байхгүй үед усны хэрэглээ байхгүй тул homeassistant.autogen.l сайтад шинэ бүртгэл байдаггүй. Ердийн асуулгад утгыг алдахаас зайлсхийхийн тулд бөглөх (өмнөх) ашиглаж болно. Энэ нь InfluxDB-г өнгөрсөн цагийн утгыг ашиглахад хүргэх болно.

Харамсалтай нь, тасралтгүй асуулга нь нэг онцлог шинж чанартай: бөглөх (өмнөх) трик ажиллахгүй бөгөөд бичлэгүүд зүгээр л үүсгэгддэггүй. Түүгээр ч барахгүй энэ бол ямар нэгэн даван туулах боломжгүй асуудал юм жил гаруй хугацаанд хэлэлцсэн. Бид энэ асуудлыг дараа нь шийдвэрлэх бөгөөд тасралтгүй асуулгад (өмнөх) бөглөх болно - энэ нь саад болохгүй.

Юу болсныг шалгацгаая (мэдээжийн хэрэг та хэдэн цаг хүлээх хэрэгтэй):

> 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

Өгөгдлийн сан дахь утгууд нь UTC-д хадгалагддаг тул энэ жагсаалт нь 3 цагаар ялгаатай болохыг анхаарна уу - InfluxDB гаралтын өглөөний 7 цагийн утгууд нь дээрх график дээрх өглөөний 10 цагийн утгатай тохирч байна. Мөн өглөөний 2-5 цагийн хооронд ямар ч бүртгэл байхгүй гэдгийг анхаарна уу - энэ бол тасралтгүй асуулгын онцлог шинж юм.

Таны харж байгаагаар нэгтгэсэн утга нь мөн адил нэмэгдэж буй дараалал бөгөөд зөвхөн оруулгууд бага давтамжтай байдаг - цагт нэг удаа. Гэхдээ энэ нь асуудал биш юм - бид диаграмын зөв өгөгдлийг гаргаж авах өөр асуулга бичиж болно.

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)

Би тайлах болно:

  • homeassistant.month.water_meter_hour мэдээллийн сангаас бид сүүлийн өдрийн entity_id='water_meter_cold'-ын өгөгдлийг татах болно (цаг >= одоо() -24 цаг).
  • Миний хэлсэнчлэн гэрийн туслах.сар.усны_тоолуурын_цагийн дараалалд зарим оруулгууд дутуу байж магадгүй. Бид GROUP BY цаг(1цаг)-тай асуулга ажиллуулснаар энэ өгөгдлийг дахин үүсгэх болно. Энэ удаад бөглөх(өмнөх) зөв ажиллаж, дутуу өгөгдлийг үүсгэнэ (функц өмнөх утгыг авна)
  • Энэ асуулгын хамгийн чухал зүйл бол цагийн тэмдэг хоорондын зөрүүг тооцоолох ялгаа функц юм. Энэ нь өөрөө ажиллахгүй бөгөөд нэгтгэх функцийг шаарддаг. Үүнийг өмнө нь ашигласан max() гэж үзье.

Гүйцэтгэлийн үр дүн иймэрхүү харагдаж байна

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

Өглөөний 2 цагаас өглөөний 5 цаг хүртэл (UTC) ямар ч хэрэглээ байгаагүй. Гэсэн хэдий ч, асуулга бөглөх(өмнөх)-ийн ачаар ижил хэрэглээний утгыг буцаана, ялгаа функц нь энэ утгыг өөрөөсөө хасаад гаралт дээр 0-ийг авна, энэ нь үнэхээр шаардлагатай.

Гагцхүү график бүтээх л үлдлээ. Үүнийг хийхийн тулд Grafana-г нээж, байгаа (эсвэл шинэ) хяналтын самбарыг нээж, шинэ самбар үүсгэ. Графикийн тохиргоо дараах байдалтай байна.

Ухаалаг гэр: Бид Home Assistant-д ус, цахилгааны хэрэглээний графикийг бүтээдэг

Би хүйтэн, халуун усны өгөгдлийг ижил график дээр харуулах болно. Хүсэлт нь дээр дурдсантай яг ижил байна.

Дэлгэцийн параметрүүдийг дараах байдлаар тохируулна. Миний хувьд энэ нь шатаар (шат) явдаг шугам (шугам) бүхий график байх болно. Stack параметрийг доор тайлбарлах болно. Доорх хэд хэдэн дэлгэцийн сонголт байгаа боловч тэдгээр нь тийм ч сонирхолтой биш юм.

Ухаалаг гэр: Бид Home Assistant-д ус, цахилгааны хэрэглээний графикийг бүтээдэг

Үүссэн графикийг гэрийн туслахад нэмэхийн тулд та дараахь зүйлийг хийх хэрэгтэй.

  • график засварлах горимоос гарах. Зарим шалтгааны улмаас график хуваалцах зөв тохиргоог зөвхөн хяналтын самбарын хуудаснаас санал болгодог
  • Графикийн нэрний хажууд байгаа гурвалжин дээр дарж, цэснээс хуваалцахыг сонгоно уу
  • Нээгдсэн цонхонд оруулах таб руу очно уу
  • Одоогийн цагийн хязгаарыг тэмдэглээгүй - бид URL-ээр дамжуулан цагийн хязгаарыг тохируулах болно
  • Шаардлагатай сэдвийг сонгоно уу. Миний хувьд энэ нь хөнгөн
  • Үүссэн URL-г 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"

Цагийн хязгаарыг (сүүлийн 2 өдөр) хяналтын самбарын тохиргоонд биш харин энд тохируулсан болохыг анхаарна уу.

График иймэрхүү харагдаж байна. Сүүлийн 2 хоног халуун ус хэрэглээгүй тул зөвхөн хүйтэн усны график зурсан.

Ухаалаг гэр: Бид Home Assistant-д ус, цахилгааны хэрэглээний графикийг бүтээдэг

Би аль график, алхам шугам эсвэл бодит баарны аль нь илүү таалагдахыг өөрөө шийдээгүй байна. Тиймээс, би зүгээр л өдөр тутмын хэрэглээний хуваарийн жишээг өгөх болно, зөвхөн энэ удаад бааранд. Асуултууд нь дээр дурдсантай ижил аргаар бүтээгдсэн. Дэлгэцийн сонголтууд нь:

Ухаалаг гэр: Бид Home Assistant-д ус, цахилгааны хэрэглээний графикийг бүтээдэг

Энэ диаграм иймэрхүү харагдаж байна:

Ухаалаг гэр: Бид Home Assistant-д ус, цахилгааны хэрэглээний графикийг бүтээдэг

Тэгэхээр, Stack параметрийн тухай. Энэ график дээр халуун баарны орой дээр хүйтэн усны бар зурсан байна. Нийт өндөр нь тухайн үеийн хүйтэн, халуун усны нийт хэрэглээтэй тохирч байна.

Үзүүлсэн бүх графикууд динамик байна. Та хулганыг сонирхож буй цэг дээр хөдөлгөж, тодорхой цэг дээр дэлгэрэнгүй мэдээлэл, үнэ цэнийг харах боломжтой.

Харамсалтай нь, энэ нь тосонд хоёр ялаа байсангүй. Баганан график дээр (алхам шугамтай графикаас ялгаатай нь) баарны дунд хэсэг нь өдрийн дундуур биш, харин 00:00 цагт байна. Тэдгээр. баарны зүүн хагасыг өмнөх өдрийн оронд зурсан. Тиймээс бямба, ням гарагийн графикуудыг хөхөвтөр бүсийн зүүн талд бага зэрэг зурсан болно. Яаж ялахаа мэдэх хүртэл.

Өөр нэг асуудал бол сар бүрийн интервалтай зөв ажиллах боломжгүй юм. Баримт нь цаг / өдөр / долоо хоногийн урт нь тогтмол байдаг боловч сарын урт нь цаг бүрт өөр өөр байдаг. InfluxDB нь зөвхөн ижил интервалтай ажиллах боломжтой. Одоогоор миний тархи 30 хоногийн тогтмол интервал тогтооход хангалттай байсан. Тийм ээ, график нь жилийн туршид бага зэрэг хөвөх бөгөөд баар нь саруудтай яг таарахгүй байх болно. Гэхдээ энэ зүйл надад дэлгэцийн тоолуурын хувьд сонирхолтой байгаа тул би үүнд зүгээр байна.

Би дор хаяж хоёр шийдлийг харж байна:

  • Сар бүрийн график дээр оноо авч, долоо хоног бүрээр өөрийгөө хязгаарлах. Жилд долоо хоногт 52 баар маш сайхан харагдаж байна
  • Сарын хэрэглээг өөрөө 2-р арга гэж үзээд графанаг зөвхөн гоё графикт ашигла. Энэ нь нэлээд үнэн зөв шийдэл байх болно. Та харьцуулахын тулд өнгөрсөн жилийн графикуудыг давхарлаж болно - grafana үүнийг бас хийж чадна.

дүгнэлт

Яагаад гэдгийг нь мэдэхгүй ч ийм төрлийн графикт дуртай. Тэд амьдрал ид өрнөж, бүх зүйл өөрчлөгдөж байгааг харуулж байна. Өчигдөр их байсан, өнөөдөр бага, маргааш өөр зүйл байх болно. Хэрэглээний сэдвээр айл өрхүүдтэй ажиллах л үлдлээ. Гэсэн хэдий ч одоогийн хоолны дуршилтай байсан ч хуулийн төсөлд ердөө л том бөгөөд ойлгомжгүй тоо нь хэрэглээний нэлээд ойлгомжтой дүр зураг болж хувирч байна.

Би програмистаар бараг 20 жил ажилласан ч мэдээллийн сантай бараг огтлолцдоггүй байсан. Тиймээс гадаад мэдээллийн санг суулгах нь маш бүдүүлэг, ойлгомжгүй зүйл мэт санагдсан. Бүх зүйл өөрчлөгдсөн дээрх нийтлэл - Тохиромжтой хэрэгслийг шураг нь хэд хэдэн товшилтоор хийдэг бөгөөд тусгай багажийн тусламжтайгаар зураг зурах ажил арай хялбар болдог.

Гарчиг дээр би цахилгааны хэрэглээг дурдсан. Харамсалтай нь одоогоор би ямар ч график өгч чадахгүй байна. Нэг SDM120 тоолуур дуусчихсан, нөгөө нь Modbus-аар холбогдоход алдаатай байна. Гэсэн хэдий ч энэ нь энэ өгүүллийн сэдэвт ямар ч байдлаар нөлөөлөхгүй - графикууд нь устай ижил аргаар баригдах болно.

Энэ нийтлэлд би өөрөө туршиж үзсэн аргуудыг өгсөн. Мэдээллийг цуглуулах, дүрслэх ажлыг зохион байгуулах өөр аргууд миний мэдэхгүй байгаа нь гарцаагүй. Сэтгэгдэл дээр надад хэлээрэй, би маш их сонирхох болно. Бүтээлч шүүмжлэл, шинэ санаа гаргахад би баяртай байх болно. Дээрх материал бас хэн нэгэнд тусална гэж найдаж байна.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх